codecombat/app/views/play/modal/BuyGemsModal.coffee

137 lines
4.4 KiB
CoffeeScript
Raw Normal View History

ModalView = require 'views/core/ModalView'
2014-11-12 12:40:55 -05:00
template = require 'templates/play/modal/buy-gems-modal'
stripeHandler = require 'core/services/stripe'
utils = require 'core/utils'
SubscribeModal = require 'views/core/SubscribeModal'
2015-12-14 14:10:37 -05:00
Products = require 'collections/Products'
2014-11-12 12:40:55 -05:00
module.exports = class BuyGemsModal extends ModalView
id:
if (me.get('preferredLanguage',true) || 'en-US').split('-')[0] == 'nl'
'buy-gems-modal-nl'
else
'buy-gems-modal'
2014-11-12 12:40:55 -05:00
template: template
plain: true
subscriptions:
'ipad:products': 'onIPadProducts'
'ipad:iap-complete': 'onIAPComplete'
'stripe:received-token': 'onStripeReceivedToken'
events:
'click .product button:not(.start-subscription-button)': 'onClickProductButton'
'click #close-modal': 'hide'
'click .start-subscription-button': 'onClickStartSubscription'
constructor: (options) ->
super(options)
@timestampForPurchase = new Date().getTime()
@state = 'standby'
2015-12-14 14:10:37 -05:00
@products = new Products()
@products.comparator = 'amount'
if application.isIPadApp
@products = []
Backbone.Mediator.publish 'buy-gems-modal:update-products'
else
2015-12-14 14:10:37 -05:00
@supermodel.loadCollection(@products, 'products')
$.post '/db/payment/check-stripe-charges', (something, somethingElse, jqxhr) =>
if jqxhr.status is 201
@state = 'recovered_charge'
@render()
2015-12-14 14:10:37 -05:00
onLoaded: ->
2016-01-11 12:52:46 -05:00
@basicProduct = @products.findWhere { name: 'basic_subscription' }
if countrySpecificProduct = @products.findWhere { name: "#{me.get('country')}_basic_subscription" }
@basicProduct = countrySpecificProduct
2015-12-14 14:10:37 -05:00
@products.reset @products.filter (product) -> _.string.startsWith(product.get('name'), 'gems_')
super()
afterRender: ->
super()
return unless @supermodel.finished()
@playSound 'game-menu-open'
2016-01-11 12:52:46 -05:00
if @basicProduct
@$el.find('.subscription-gem-amount').text $.i18n.t('buy_gems.price').replace('{{gems}}', @basicProduct.get('gems'))
onHidden: ->
super()
@playSound 'game-menu-close'
onIPadProducts: (e) ->
2015-12-14 14:10:37 -05:00
# TODO: Update to handle new products collection
# newProducts = []
# for iapProduct in e.products
# localProduct = _.find @originalProducts, { id: iapProduct.id }
# continue unless localProduct
# localProduct.price = iapProduct.price
# newProducts.push localProduct
# @products = _.sortBy newProducts, 'gems'
# @render()
2014-11-12 12:40:55 -05:00
onClickProductButton: (e) ->
@playSound 'menu-button-click'
productID = $(e.target).closest('button').val()
2016-05-04 09:36:54 -04:00
# Don't throw error when product is not found
if productID.length == 0
return
2015-12-14 14:10:37 -05:00
product = @products.findWhere { name: productID }
2014-11-12 12:40:55 -05:00
if application.isIPadApp
Backbone.Mediator.publish 'buy-gems-modal:purchase-initiated', { productID: productID }
2014-11-12 12:40:55 -05:00
else
application.tracker?.trackEvent 'Started gem purchase', { productID: productID }
stripeHandler.open({
2015-12-14 14:10:37 -05:00
description: $.t(product.get('i18n'))
amount: product.get('amount')
2015-02-25 14:33:51 -05:00
bitcoin: true
alipay: if me.get('country') is 'china' or (me.get('preferredLanguage') or 'en-US')[...2] is 'zh' then true else 'auto'
})
@productBeingPurchased = product
onStripeReceivedToken: (e) ->
data = {
2015-12-14 14:10:37 -05:00
productID: @productBeingPurchased.get('name')
stripe: {
token: e.token.id
timestamp: @timestampForPurchase
}
}
@state = 'purchasing'
@render()
jqxhr = $.post('/db/payment', data)
jqxhr.done(=>
2014-12-09 16:57:01 -05:00
application.tracker?.trackEvent 'Finished gem purchase',
2015-12-14 14:10:37 -05:00
productID: @productBeingPurchased.get('name')
value: @productBeingPurchased.get('amount')
document.location.reload()
)
jqxhr.fail(=>
if jqxhr.status is 402
@state = 'declined'
@stateMessage = arguments[2]
else if jqxhr.status is 500
@state = 'retrying'
f = _.bind @onStripeReceivedToken, @, e
_.delay f, 2000
else
@state = 'unknown_error'
@stateMessage = "#{jqxhr.status}: #{jqxhr.responseText}"
@render()
)
onIAPComplete: (e) ->
2015-12-14 14:10:37 -05:00
product = @products.findWhere { name: e.productID }
purchased = me.get('purchased') ? {}
purchased = _.clone purchased
purchased.gems ?= 0
purchased.gems += product.gems
me.set('purchased', purchased)
@hide()
onClickStartSubscription: (e) ->
@openModalView new SubscribeModal()
window.tracker?.trackEvent 'Show subscription modal', category: 'Subscription', label: 'buy gems modal'