mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-12-05 05:11:17 -05:00
101 lines
3.6 KiB
CoffeeScript
101 lines
3.6 KiB
CoffeeScript
ModalView = require 'views/core/ModalView'
|
|
template = require 'templates/courses/student-sign-up-modal'
|
|
auth = require 'core/auth'
|
|
forms = require 'core/forms'
|
|
User = require 'models/User'
|
|
Classroom = require 'models/Classroom'
|
|
utils = require 'core/utils'
|
|
|
|
module.exports = class StudentSignUpModal extends ModalView
|
|
id: 'student-sign-up-modal'
|
|
template: template
|
|
|
|
events:
|
|
'submit form': 'onSubmitForm'
|
|
'click #skip-link': 'onClickSkipLink'
|
|
|
|
initialize: (options) ->
|
|
options ?= {}
|
|
@willPlay = options.willPlay
|
|
@classCode = utils.getQueryVariable('_cc') or ''
|
|
|
|
afterInsert: ->
|
|
super()
|
|
_.delay (=> @$('input:visible:first').focus()), 500
|
|
|
|
onClickSkipLink: ->
|
|
@trigger 'click-skip-link' # defer to view that opened this modal
|
|
@hide?()
|
|
|
|
onSubmitForm: (e) ->
|
|
e.preventDefault()
|
|
@signupClassroomPrecheck()
|
|
|
|
emailCheck: ->
|
|
email = @$('#email').val()
|
|
filter = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,63}$/i # https://news.ycombinator.com/item?id=5763990
|
|
unless filter.test(email)
|
|
@$('#errors-alert').text($.i18n.t('share_progress_modal.email_invalid')).removeClass('hide')
|
|
return false
|
|
return true
|
|
|
|
signupClassroomPrecheck: ->
|
|
if not _.all([@$('#email').val(), @$('#password').val(), @$('#name').val()])
|
|
@$('#errors-alert').text('Enter email, username and password').removeClass('hide')
|
|
return
|
|
classCode = @$('#class-code-input').val()
|
|
if not classCode
|
|
return @signup()
|
|
classroom = new Classroom()
|
|
classroom.fetch({ url: '/db/classroom?code='+classCode })
|
|
classroom.once 'sync', @signup, @
|
|
classroom.once 'error', @onClassroomFetchError, @
|
|
@enableModalInProgress(@$el)
|
|
|
|
onClassroomFetchError: ->
|
|
@disableModalInProgress(@$el)
|
|
@$('#errors-alert').text('Classroom code could not be found').removeClass('hide')
|
|
|
|
signup: ->
|
|
return unless @emailCheck()
|
|
# TODO: consolidate with AuthModal logic, or make user creation process less magical, more RESTful
|
|
data = forms.formToObject @$el
|
|
delete data.classCode
|
|
for key, val of me.attributes when key in ['preferredLanguage', 'testGroupNumber', 'dateCreated', 'wizardColor1', 'name', 'music', 'volume', 'emails', 'schoolName']
|
|
data[key] ?= val
|
|
Backbone.Mediator.publish "auth:signed-up", {}
|
|
data.emails ?= {}
|
|
data.emails.generalNews ?= {}
|
|
data.emails.generalNews.enabled = false
|
|
# TODO: Doesn't handle failed user creation. Double posts when placed in onCreateUserSuccess.
|
|
window.tracker?.trackEvent 'Finished Student Signup', category: 'Courses', label: 'Courses Student Signup'
|
|
@enableModalInProgress(@$el)
|
|
user = new User(data)
|
|
user.notyErrors = false
|
|
user.save({}, {
|
|
validate: false # make server deal with everything
|
|
error: @onCreateUserError
|
|
success: @onCreateUserSuccess
|
|
})
|
|
|
|
onCreateUserError: (model, jqxhr) =>
|
|
# really need to make our server errors uniform
|
|
if jqxhr.responseJSON
|
|
error = jqxhr.responseJSON
|
|
error = error[0] if _.isArray(error)
|
|
message = _.filter([error.property, error.message]).join(' ')
|
|
else
|
|
message = jqxhr.responseText
|
|
@disableModalInProgress(@$el)
|
|
@$('#errors-alert').text(message).removeClass('hide')
|
|
|
|
onCreateUserSuccess: =>
|
|
classCode = @$('#class-code-input').val()
|
|
if classCode
|
|
url = "/courses?_cc="+classCode
|
|
document.location.href = url
|
|
# This was a terrible hack to make navigating trigger when just adding query params
|
|
# application.router.navigate('/thisisahack')
|
|
# application.router.navigate(url, { trigger: true })
|
|
else
|
|
window.location.reload()
|