Pony.fm/resources/assets/scripts/app/controllers/application.coffee
2016-08-04 20:32:01 +01:00

152 lines
5.6 KiB
CoffeeScript

# Pony.fm - A community for pony fan music.
# Copyright (C) 2015 Peter Deltchev
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
module.exports = angular.module('ponyfm').controller "application", [
'$scope', 'auth', '$location', 'upload', '$state', '$stateParams', '$injector', '$rootScope', 'playlists', 'notifications', '$timeout'
($scope, auth, $location, upload, $state, $stateParams, $injector, $rootScope, playlists, notifications, $timeout) ->
$scope.auth = auth.data
$scope.$state = $state
$scope.$stateParams = $stateParams
$scope.isPinnedPlaylistSelected = false
$scope.notifActive = false
$scope.nCount = 0
$scope.nCountFormatted = '0'
$scope.isPlaying = false
$scope.hideLoading = false
$scope.loading = true
$loadingElement = null
loadingStateName = null
if 'serviceWorker' of navigator
console.log 'Service Worker is supported'
navigator.serviceWorker.register('service-worker.js').then((reg) ->
console.log 'SW registered', reg
).catch (err) ->
console.log 'SW register failed', err
notifications.serviceWorkerSupported = false
$scope.menuToggle = () ->
$rootScope.$broadcast('sidebarToggled')
if $scope.notifActive
notifications.markAllAsRead()
$scope.notifActive = false
$scope.notifPulloutToggle = () ->
$scope.notifActive = !$scope.notifActive
if !$scope.notifActive
notifications.markAllAsRead()
$rootScope.$on 'player-starting-track', () ->
$scope.isPlaying = true
window.isPlaying = true
window.handleResize()
$rootScope.$on 'player-stopping', () ->
$scope.isPlaying = false
$rootScope.$on 'notificationsUpdated', () ->
$scope.nCount = notifications.getUnreadCount()
if $scope.nCount > 99
$scope.nCountFormatted = '99+'
else
$scope.nCountFormatted = $scope.nCount
if window.pfm.error
$state.transitionTo 'errors-' + window.pfm.error
$rootScope.safeApply = (fn) ->
phase = $rootScope.$$phase
if (phase == '$apply' || phase == 'digest')
fn()
return
$rootScope.$apply fn
$scope.logout = () ->
auth.logout().done -> location.reload()
$scope.isActive = (loc) -> $location.path() == loc
$scope.$on '$viewContentLoaded', () ->
window.setTimeout (-> window.handleResize()), 0
$scope.loading = false
$scope.hideLoading = true
$scope.stateIncludes = (state) ->
if $loadingElement
newParts = state.split '.'
oldParts = loadingStateName.split '.'
for i in [0..newParts.length]
continue if !newParts[i]
return false if newParts[i] != oldParts[i]
return true
else
$state.includes(state)
statesPreloaded = {}
$scope.$on '$stateChangeStart', (e, newState, newParams, oldState, oldParams) ->
$rootScope.$broadcast('sidebarHide')
if $scope.notifActive
notifications.markAllAsRead()
$scope.notifActive = false
$scope.isPinnedPlaylistSelected = false
if oldState.name.indexOf('content.artist.') != -1 && newState.name.indexOf('content.artist.') == -1
$('.top-bar').css('background': '')
if newState.name == 'content.playlist'
$scope.isPinnedPlaylistSelected = playlists.isPlaylistPinned newParams.id
return if !oldState || !newState.controller
preloader = window.pfm.preloaders[newState.controller]
return if !preloader
if statesPreloaded[newState]
delete statesPreloaded[newState]
return
e.preventDefault()
loadingStateName = newState.name
selector = ''
newParts = newState.name.split '.'
oldParts = oldState.name.split '.'
zipped = _.zip(newParts, oldParts)
$scope.loading = true
# Don't show the loading bar until 400ms has passed
# Avoids flickering on fast connections while still
# providing feedback to users on slow connections
$timeout(() ->
if $scope.loading
$scope.hideLoading = false
, 400)
stateToInject = angular.copy newState
stateToInject.params = newParams
try
$injector.invoke(preloader, null, {$state: stateToInject}).then ->
statesPreloaded[newState] = true
$state.transitionTo newState, newParams, {location: 'replace'}
catch error
$state.transitionTo newState, newParams
]