codecombat/app/views/modal/AuthModal.coffee

116 lines
4 KiB
CoffeeScript
Raw Normal View History

2014-07-17 20:22:26 -04:00
ModalView = require 'views/kinds/ModalView'
template = require 'templates/modal/auth'
{loginUser, createUser, me} = require 'lib/auth'
forms = require 'lib/forms'
User = require 'models/User'
application = require 'application'
module.exports = class AuthModal extends ModalView
2014-06-30 22:16:26 -04:00
id: 'auth-modal'
template: template
mode: 'signup' # or 'login'
2014-06-30 22:16:26 -04:00
events:
# login buttons
2014-06-30 22:16:26 -04:00
'click #switch-to-signup-button': 'onSignupInstead'
'click #switch-to-login-button': 'onLoginInstead'
2014-10-06 17:02:29 -04:00
'click #confirm-age': 'checkAge'
2014-08-15 10:20:45 -04:00
'click #github-login-button': 'onGitHubLoginClicked'
'submit': 'onSubmitForm' # handles both submit buttons
'keyup #name': 'onNameChange'
subscriptions:
'errors:server-error': 'onServerError'
'auth:logging-in-with-facebook': 'onLoggingInWithFacebook'
2014-06-30 22:16:26 -04:00
constructor: (options) ->
@onNameChange = _.debounce @checkNameExists, 500
super options
getRenderData: ->
c = super()
c.showRequiredError = @options.showRequiredError
2014-06-30 22:16:26 -04:00
c.title = {0: 'short', 1: 'long'}[me.get('testGroupNumber') % 2]
c.descriptionOn = {0: 'yes', 1: 'no'}[Math.floor(me.get('testGroupNumber')/2) % 2]
if @mode is 'signup'
application.tracker.identify authModalTitle: c.title
application.tracker.trackEvent 'Started Signup', authModalTitle: c.title, descriptionOn: c.descriptionOn
c.mode = @mode
c.formValues = @previousFormInputs or {}
2014-07-08 02:23:36 -04:00
c.onEmployersPage = Backbone.history.fragment is "employers"
c.me = me
c
afterInsert: ->
super()
_.delay (=> application.router.renderLoginButtons()), 500
_.delay (=> $('input:visible:first', @$el).focus()), 500
2014-06-30 22:16:26 -04:00
onSignupInstead: (e) ->
@mode = 'signup'
@previousFormInputs = forms.formToObject @$el
@render()
_.delay application.router.renderLoginButtons, 500
2014-06-30 22:16:26 -04:00
onLoginInstead: (e) ->
@mode = 'login'
@previousFormInputs = forms.formToObject @$el
@render()
_.delay application.router.renderLoginButtons, 500
onSubmitForm: (e) ->
e.preventDefault()
if @mode is 'login' then @loginAccount() else @createAccount()
false
checkAge: (e) ->
2014-06-30 22:16:26 -04:00
$('#signup-button', @$el).prop 'disabled', not $(e.target).prop('checked')
loginAccount: ->
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)
createAccount: ->
forms.clearFormAlerts(@$el)
userObject = forms.formToObject @$el
delete userObject.subscribe
2014-06-30 22:16:26 -04:00
delete userObject['confirm-age']
delete userObject.name if userObject.name is ''
userObject.name = @suggestedName if @suggestedName
2014-06-30 22:16:26 -04:00
for key, val of me.attributes when key in ['preferredLanguage', 'testGroupNumber', 'dateCreated', 'wizardColor1', 'name', 'music', 'volume', 'emails']
userObject[key] ?= val
subscribe = @$el.find('#subscribe').prop('checked')
userObject.emails ?= {}
userObject.emails.generalNews ?= {}
userObject.emails.generalNews.enabled = subscribe
res = tv4.validateMultiple userObject, User.schema
return forms.applyErrorsToForm(@$el, res.errors) unless res.valid
window.tracker?.trackEvent 'Finished Signup'
@enableModalInProgress(@$el)
createUser userObject, null, window.nextLevelURL
onLoggingInWithFacebook: (e) ->
modal = $('.modal:visible', @$el)
@enableModalInProgress(modal) # TODO: part of forms
onServerError: (e) -> # TODO: work error handling into a separate forms system
2014-06-30 22:16:26 -04:00
@disableModalInProgress(@$el)
checkNameExists: =>
name = $('#name', @$el).val()
return forms.clearFormAlerts(@$el) if name is ''
User.getUnconflictedName name, (newName) =>
forms.clearFormAlerts(@$el)
if name is newName
@suggestedName = undefined
else
@suggestedName = newName
forms.setErrorToProperty @$el, 'name', "That name is taken! How about #{newName}?", true
2014-08-15 10:20:45 -04:00
onGitHubLoginClicked: ->
Backbone.Mediator.publish 'auth:log-in-with-github', {}