codecombat/app/views/play/level/modal/VictoryModal.coffee

139 lines
4.7 KiB
CoffeeScript
Raw Normal View History

2014-07-17 20:22:26 -04:00
ModalView = require 'views/kinds/ModalView'
2014-01-03 13:32:13 -05:00
template = require 'templates/play/level/modal/victory'
{me} = require 'lib/auth'
LadderSubmissionView = require 'views/play/common/LadderSubmissionView'
2014-01-03 13:32:13 -05:00
LevelFeedback = require 'models/LevelFeedback'
utils = require 'lib/utils'
2014-01-03 13:32:13 -05:00
2014-07-17 20:22:26 -04:00
module.exports = class VictoryModal extends ModalView
2014-01-03 13:32:13 -05:00
id: 'level-victory-modal'
template: template
subscriptions:
'ladder:game-submitted': 'onGameSubmitted'
2014-01-03 13:32:13 -05:00
events:
'click .next-level-button': 'onPlayNextLevel'
'click .world-map-button': 'onClickWorldMap'
2014-01-03 13:32:13 -05:00
# review events
'mouseover .rating i': (e) -> @showStars(@starNum($(e.target)))
'mouseout .rating i': -> @showStars()
'click .rating i': (e) ->
@setStars(@starNum($(e.target)))
@$el.find('.review').show()
'keypress .review textarea': -> @saveReviewEventually()
shortcuts:
'enter': -> 'onPlayNextLevel'
constructor: (options) ->
application.router.initializeSocialMediaServices()
2014-01-03 13:32:13 -05:00
victory = options.level.get('victory')
body = utils.i18n(victory, 'body') or 'Sorry, this level has no victory message yet.'
2014-01-03 13:32:13 -05:00
@body = marked(body)
@level = options.level
@session = options.session
@saveReviewEventually = _.debounce(@saveReviewEventually, 2000)
@loadExistingFeedback()
if @level.get('type', true) is 'hero'
@closeButton = false
@closesOnClickOutside = false
2014-01-03 13:32:13 -05:00
super options
loadExistingFeedback: ->
url = "/db/level/#{@level.id}/feedback"
@feedback = new LevelFeedback()
2014-08-26 20:34:00 -04:00
@feedback.setURL url
2014-01-03 13:32:13 -05:00
@feedback.fetch()
@listenToOnce(@feedback, 'sync', -> @onFeedbackLoaded())
@listenToOnce(@feedback, 'error', -> @onFeedbackNotFound())
2014-01-03 13:32:13 -05:00
onFeedbackLoaded: ->
@feedback.url = -> '/db/level.feedback/' + @id
@$el.find('.review textarea').val(@feedback.get('review'))
@$el.find('.review').show()
@showStars()
onFeedbackNotFound: ->
@feedback = new LevelFeedback()
@feedback.set('levelID', @level.get('slug') or @level.id)
@feedback.set('levelName', @level.get('name') or '')
2014-06-30 22:16:26 -04:00
@feedback.set('level', {majorVersion: @level.get('version').major, original: @level.get('original')})
2014-01-03 13:32:13 -05:00
@showStars()
onPlayNextLevel: ->
@saveReview() if @$el.find('.review textarea').val()
Backbone.Mediator.publish 'level:play-next-level', {}
2014-01-03 13:32:13 -05:00
onClickWorldMap: (e) ->
e.preventDefault()
e.stopImmediatePropagation()
Backbone.Mediator.publish 'router:navigate', route: '/play', viewClass: require('views/play/WorldMapView'), viewArgs: [{supermodel: @supermodel}]
onGameSubmitted: (e) ->
ladderURL = "/play/ladder/#{@level.get('slug')}#my-matches"
Backbone.Mediator.publish 'router:navigate', route: ladderURL
2014-01-03 13:32:13 -05:00
getRenderData: ->
c = super()
c.body = @body
c.me = me
c.hasNextLevel = _.isObject(@level.get('nextLevel'))
c.levelName = utils.i18n @level.attributes, 'name'
c.level = @level
if c.level.get('type') is 'ladder'
c.readyToRank = @session.readyToRank()
2014-01-03 13:32:13 -05:00
if me.get 'hourOfCode'
# Show the Hour of Code "I'm Done" tracking pixel after they played for 30 minutes
elapsed = (new Date() - new Date(me.get('dateCreated')))
enough = not c.hasNextLevel or elapsed >= 30 * 60 * 1000
if enough and not me.get('hourOfCodeComplete')
2014-06-30 22:16:26 -04:00
$('body').append($('<img src="http://code.org/api/hour/finish_codecombat.png" style="visibility: hidden;">'))
2014-01-03 13:32:13 -05:00
me.set 'hourOfCodeComplete', true
me.patch()
2014-01-03 13:32:13 -05:00
window.tracker?.trackEvent 'Hour of Code Finish', {}
# Show the "I'm done" button if they get to the end, unless it's been over two hours
tooMuch = elapsed >= 120 * 60 * 1000
c.showHourOfCodeDoneButton = not c.hasNextLevel and not tooMuch
c
afterRender: ->
super()
@ladderSubmissionView = new LadderSubmissionView session: @session, level: @level
@insertSubView @ladderSubmissionView, @$el.find('.ladder-submission-view')
2014-01-03 13:32:13 -05:00
afterInsert: ->
super()
Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'victory'
gapi?.plusone?.go? @$el[0]
FB?.XFBML?.parse? @$el[0]
twttr?.widgets?.load?()
2014-01-03 13:32:13 -05:00
destroy: ->
@saveReview() if @$el.find('.review textarea').val()
@feedback.off()
super()
2014-01-03 13:32:13 -05:00
# rating, review
starNum: (starEl) -> starEl.prevAll('i').length + 1
showStars: (num) ->
@$el.find('.rating').show()
num ?= @feedback?.get('rating') or 0
stars = @$el.find('.rating i')
stars.removeClass('icon-star').addClass('icon-star-empty')
stars.slice(0, num).removeClass('icon-star-empty').addClass('icon-star')
setStars: (num) ->
@feedback.set('rating', num)
@feedback.save()
saveReviewEventually: ->
@saveReview()
saveReview: ->
@feedback.set('review', @$el.find('.review textarea').val())
@feedback.save()