Skip to content

Instantly share code, notes, and snippets.

@jhsu
Last active December 18, 2015 21:18
Show Gist options
  • Select an option

  • Save jhsu/5845970 to your computer and use it in GitHub Desktop.

Select an option

Save jhsu/5845970 to your computer and use it in GitHub Desktop.
stripeHidden = _.template """
<div>
<input type='hidden' name='stripeToken' value='<%= id %>' />
<input type='hidden' name='payment_method[name]' value='<%= name %>' />
<input type='hidden' name='payment_method[last4]' value='<%= last4 %>' />
<input type='hidden' name='payment_method[exp_month]' value='<%= exp_month %>' />
<input type='hidden' name='payment_method[exp_year]' value='<%= exp_year %>' />
</div>
"""
messageTemplate = _.template """
<div class="<%= type %>"><i class="icon-exclamation-sign"></i> <%= message %></div>
"""
class StripePaymentMethodForm
messageTemplate: messageTemplate
inputsTemplate: stripeHidden
constructor: (@form) ->
@messageView = null
@inputsView = null
hideMessage: ->
@messageView.remove() if @messageView
@messageView = null
showMessage: (data) ->
@messageView = @show(@messageView, @messageTemplate(data))
showInputs: (data) ->
@inputsView = @show(@inputsView, @inputsTemplate(data))
show: (currentView, view) ->
newView = $(view)
if currentView
currentView.replaceWith(newView)
else
@form.prepend newView
newView.fadeIn("slow")
newView
submit: ->
@form.get(0).submit()
toggleCvc: ->
@cvc_container ||= @form.find(".payment-cvc")
@cvc_content ||= @cvc_container.contents()
cvc = @cvc_content.find('input').val()
if !cvc || /^\s*$/.test(cvc)
@cvc_content.remove()
showCvc: ->
@cvc_container.html(@cvc_content)
renable: -> @form.find('button').prop('disabled', false)
disable: -> @form.find('button').prop('disabled', true)
stripeResponseHandler = (view) ->
view.hideMessage()
handler = (status, response) ->
view.showCvc()
if response.error
view.showMessage
type: "error"
message: response.error.message
view.renable()
else
card = response.card
view.showInputs
id: response.id
name: card.name
last4: card.last4
exp_month: card.exp_month
exp_year: card.exp_year
view.submit()
handler
@bindStripeForm = (selector) ->
form = $(selector)
view = new StripePaymentMethodForm(form)
form.on "submit", (e) ->
e.preventDefault()
view.toggleCvc()
view.disable()
Stripe.createToken(form, stripeResponseHandler(view))
false
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment