mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-12-04 04:41:42 -05:00
249255e4dc
On Windows/Chrome, the first click of the g+ button shows a popup blocked warning, because the action is deferred while loading the gplus library. Have the modals load the library first, and enable the buttons when they're ready.
135 lines
4.2 KiB
CoffeeScript
135 lines
4.2 KiB
CoffeeScript
ModalView = require 'views/core/ModalView'
|
|
template = require 'templates/core/auth'
|
|
{loginUser, createUser, me} = require 'core/auth'
|
|
forms = require 'core/forms'
|
|
User = require 'models/User'
|
|
application = require 'core/application'
|
|
errors = require 'core/errors'
|
|
|
|
module.exports = class AuthModal extends ModalView
|
|
id: 'auth-modal'
|
|
template: template
|
|
|
|
events:
|
|
'click #switch-to-signup-btn': 'onSignupInstead'
|
|
'click #github-login-button': 'onGitHubLoginClicked'
|
|
'submit form': 'onSubmitForm'
|
|
'keyup #name': 'onNameChange'
|
|
'click #gplus-login-btn': 'onClickGPlusLoginButton'
|
|
'click #facebook-login-btn': 'onClickFacebookLoginButton'
|
|
'click #close-modal': 'hide'
|
|
|
|
subscriptions:
|
|
'errors:server-error': 'onServerError'
|
|
|
|
|
|
# Initialization
|
|
|
|
initialize: (options={}) ->
|
|
@previousFormInputs = options.initialValues or {}
|
|
|
|
# TODO: Switch to promises and state, rather than using defer to hackily enable buttons after render
|
|
application.gplusHandler.loadAPI({ success: => _.defer => @$('#gplus-login-btn').attr('disabled', false) })
|
|
application.facebookHandler.loadAPI({ success: => _.defer => @$('#facebook-login-btn').attr('disabled', false) })
|
|
|
|
getRenderData: ->
|
|
c = super()
|
|
c.showRequiredError = @options.showRequiredError
|
|
c.showSignupRationale = @options.showSignupRationale
|
|
c.mode = @mode
|
|
c.formValues = @previousFormInputs or {}
|
|
c.me = me
|
|
c
|
|
|
|
afterRender: ->
|
|
super()
|
|
@playSound 'game-menu-open'
|
|
|
|
afterInsert: ->
|
|
super()
|
|
_.delay (=> $('input:visible:first', @$el).focus()), 500
|
|
|
|
onSignupInstead: (e) ->
|
|
CreateAccountModal = require('./CreateAccountModal')
|
|
modal = new CreateAccountModal({initialValues: forms.formToObject @$el})
|
|
currentView.openModalView(modal)
|
|
|
|
onSubmitForm: (e) ->
|
|
@playSound 'menu-button-click'
|
|
e.preventDefault()
|
|
forms.clearFormAlerts(@$el)
|
|
userObject = forms.formToObject @$el
|
|
res = tv4.validateMultiple userObject, User.schema
|
|
return forms.applyErrorsToForm(@$el, res.errors) unless res.valid
|
|
@enableModalInProgress(@$el) # TODO: part of forms
|
|
loginUser userObject, null, window.nextURL
|
|
|
|
onServerError: (e) -> # TODO: work error handling into a separate forms system
|
|
@disableModalInProgress(@$el)
|
|
|
|
|
|
# Google Plus
|
|
|
|
onClickGPlusLoginButton: ->
|
|
btn = @$('#gplus-login-btn')
|
|
application.gplusHandler.connect({
|
|
context: @
|
|
success: ->
|
|
btn.find('.sign-in-blurb').text($.i18n.t('login.logging_in'))
|
|
btn.attr('disabled', true)
|
|
application.gplusHandler.loadPerson({
|
|
context: @
|
|
success: (gplusAttrs) ->
|
|
existingUser = new User()
|
|
existingUser.fetchGPlusUser(gplusAttrs.gplusID, {
|
|
success: =>
|
|
me.loginGPlusUser(gplusAttrs.gplusID, {
|
|
success: -> window.location.reload()
|
|
error: @onGPlusLoginError
|
|
})
|
|
error: @onGPlusLoginError
|
|
})
|
|
})
|
|
})
|
|
|
|
onGPlusLoginError: =>
|
|
btn = @$('#gplus-login-btn')
|
|
btn.find('.sign-in-blurb').text($.i18n.t('login.sign_in_with_gplus'))
|
|
btn.attr('disabled', false)
|
|
errors.showNotyNetworkError(arguments...)
|
|
|
|
|
|
# Facebook
|
|
|
|
onClickFacebookLoginButton: ->
|
|
btn = @$('#facebook-login-btn')
|
|
application.facebookHandler.connect({
|
|
context: @
|
|
success: ->
|
|
btn.find('.sign-in-blurb').text($.i18n.t('login.logging_in'))
|
|
btn.attr('disabled', true)
|
|
application.facebookHandler.loadPerson({
|
|
context: @
|
|
success: (facebookAttrs) ->
|
|
existingUser = new User()
|
|
existingUser.fetchFacebookUser(facebookAttrs.facebookID, {
|
|
success: =>
|
|
me.loginFacebookUser(facebookAttrs.facebookID, {
|
|
success: -> window.location.reload()
|
|
error: @onFacebookLoginError
|
|
})
|
|
error: @onFacebookLoginError
|
|
})
|
|
})
|
|
})
|
|
|
|
onFacebookLoginError: =>
|
|
btn = @$('#facebook-login-btn')
|
|
btn.find('.sign-in-blurb').text($.i18n.t('login.sign_in_with_facebook'))
|
|
btn.attr('disabled', false)
|
|
errors.showNotyNetworkError(arguments...)
|
|
|
|
|
|
onHidden: ->
|
|
super()
|
|
@playSound 'game-menu-close'
|