Files
website/src/client/site/site_controller.coffee
T

173 lines
6.2 KiB
CoffeeScript

#
# Crafting Guide - site_controller.coffee
#
# Copyright © 2014-2016 by Redwood Labs
# All rights reserved.
#
AdsenseController = require './common/adsense/adsense_controller'
BaseController = require './base_controller'
FeedbackController = require './feedback/feedback_controller'
FileCache = require '../models/site/file_cache'
FooterController = require './footer/footer_controller'
GitHubUser = require '../models/site/github_user'
HeaderController = require './header/header_controller'
ImageLoader = require './image_loader'
Mod = require '../models/game/mod'
ModPack = require '../models/game/mod_pack'
Router = require './router'
########################################################################################################################
module.exports = class SiteController extends BaseController
constructor: (options={})->
if not options.client? then throw new Error 'options.client is required'
if not options.storage? then throw new Error 'options.storage is required'
options.el = 'html'
super options
@client = options.client
@fileCache = new FileCache c.url.modpackArchive()
@imageLoader = new ImageLoader defaultUrl:'/images/unknown.png'
@modPack = new ModPack {}, fileCache:@fileCache
@router = new Router this
@storage = options.storage
@_adsenseController = new AdsenseController
@_currentPage = null
@_currentPageController = null
@_user = null
# Public Methods ###############################################################################
loadDefaultModPack: ->
makeResponder = (m)-> return ->
m.activeModVersion.fetch() if m.activeModVersion?
for modSlug, modData of c.defaultMods
mod = new Mod {slug:modSlug}, {fileCache:@fileCache}
mod.on c.event.change + ':activeModVersion', makeResponder mod
@storage.register "mod:#{mod.slug}", mod, 'activeVersion', modData.defaultVersion
mod.fetch()
@modPack.addMod mod
if global.env isnt 'prerender'
@modPack.once c.event.sync, =>
@$pageContent.removeClass 'hidden'
@$pageContentLoading.addClass 'hidden'
loadCurrentUser: ->
@client.fetchCurrentUser()
.then (response)=>
userData = response.json?.data?.user
@user = new GitHubUser userData if userData?
.catch (error)=>
if error?.response?.statusCode isnt 401
logger.error "Failed to get current user: #{error}"
else
logger.info "User is not logged in"
.done()
login: ->
@storage.store 'post-login-url', window.location.pathname
@router.navigate c.url.login(), trigger:true
logout: ->
@storage.store 'loginSecurityToken', null
@user = null
@client.logout()
.catch (error)->
logger.error -> "Failed to log out: #{error}"
.done()
resumeAfterLogin: ->
url = @storage.load 'post-login-url'
url = if (not url? or url is 'null') then null else url
if url? then @router.navigate url, trigger:true
@storage.store 'post-login-url', null
# Property Methods #############################################################################
getControllerOptions: ->
client: @client
imageLoader: @imageLoader
modPack: @modPack
router: @router
storage: @storage
enterFeedback: (message)=> @_feedbackController.enterFeedback(message)
user: @user
getUser: ->
return @_user
setUser: (newUser)->
oldUser = @_user
return if newUser is oldUser
@_user = newUser
logger.info -> "User changed to: #{newUser?.name}"
@trigger c.event.change + ':user', this, oldUser, newUser
@trigger c.event.change, this
if @_currentPageController? then @_currentPageController.user = newUser
Object.defineProperties @prototype,
controllerOptions: { get:@::getControllerOptions }
user: { get:@::getUser, set:@::setUser }
# BaseController Overrides #####################################################################
render: ->
@_footerController = @addChild FooterController, '.view__footer', @controllerOptions
@_headerController = @addChild HeaderController, '.view__header', @controllerOptions
@$pageContent = @$('.page > .content')
@$pageContentLoading = @$('.page > .content-loading')
@_feedbackController = @addChild FeedbackController, '.view__feedback'
# Private Methods ##############################################################################
setPage: (page, controller)->
return if @_currentPageController is controller
logger.info -> "changing to page controller: #{controller.constructor.name}"
if @_currentPageController
@_currentPageController.unrender()
@_resetGlobals()
@_currentPage = page
@_currentPageController = controller
$pageContent = $('.page > .content')
$pageContent.removeClass()
$pageContent.addClass 'content'
$pageContent.css display:''
if not @$pageContentLoading.hasClass 'hidden'
$pageContent.addClass 'hidden'
window.scrollTo 0, 0
@_headerController.model = controller: controller
@_currentPageController.user = @user
@_currentPageController.onWillShow()
@_currentPageController.$el = $pageContent
@_currentPageController.render()
@_adsenseController.reset()
_resetGlobals: ->
if global.env in c.productionEnvs
for key, value of global
if key.indexOf('google') isnt -1
delete global[key]
delete global.adsByGoogle
$('script[src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"]').remove()
$('body').append('<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>')