SeriouslyAwesome/democratictravelers

View on GitHub
app/assets/javascripts/map/map.suggestions.js.coffee.erb

Summary

Maintainability
Test Coverage
DemocraticTravelers.Map.Suggestions =
  initialize: ->
    $('form#suggestion').on 'submit', (e) =>
      e.preventDefault()
      data = $('form#suggestion').serialize()
      @create(data)

  fetch: ->
    url = "<%= Rails.application.secrets.api_base %>suggestions/"
    apiKey = $("meta[name='application-name']").attr('data-api-key')
    userId = $("meta[name='application-name']").attr('data-user-id')
    $.ajax url,
      dataType: 'json'
      beforeSend: (xhr) ->
        xhr.setRequestHeader('X-API-KEY', apiKey)
        xhr.setRequestHeader('X-USER-ID', userId)

        DemocraticTravelers.Map.locationsLayer.clearLayers()
        $('.suggestion').not('#new-suggestion').remove()
        $('#map-loading:hidden').fadeIn('fast')
      success: (data, callback) ->
        DemocraticTravelers.Map.renderMarkers data.locations
        DemocraticTravelers.Map.Experiences.renderAll data
      error: (e) ->
        console.log(e)
        return true
      complete: ->
        $('#map-loading:visible').fadeOut('fast')
      statusCode:
        401: ->
          console.log('Login is required.')
        403: ->
          console.log('Not authorized.')
        404: ->
          console.log('Dead link.')

  create: (data) ->
    url = "<%= Rails.application.secrets.api_base %>suggestions/"
    # AJAX call to SuggestionsController#create
    apiKey = $("meta[name='application-name']").attr('data-api-key')
    userId = $("meta[name='application-name']").attr('data-user-id')

    $.ajax url,
      dataType: 'json'
      type: 'POST'
      data: data
      beforeSend: (xhr) ->
        xhr.setRequestHeader('X-API-KEY', apiKey)
        xhr.setRequestHeader('X-USER-ID', userId)
      success: (data, status, xhr) =>
        if data.success
          $('form#suggestion')[0].reset()
          DemocraticTravelers.Map.searchLayer.clearLayers()
          $('#new-suggestion').slideUp('fast')
          @render(data)

          # Google Analytics
          exp = data.experiences[0]
          label = "#{exp.name} at #{exp.venue} in #{exp.city}, #{exp.state}"
          ga('send', 'event', 'Suggestion', 'Submit', label);
      error: (e) ->
        console.log(e)
        # TODO: Display apology.
      statusCode:
        401: ->
          console.log('Login is required.')
          # TODO: Display error.
        403: ->
          console.log('Not authorized.')
          # TODO: Display error.
        404: ->
          console.log('Dead link.')
          # TODO: Display error.

  render: (data) ->
    DemocraticTravelers.Map.Marker.render(data.locations[0])
    html = DemocraticTravelers.Map.Experiences.render(data.experiences[0])
    $(html).insertAfter('#new-suggestion').hide().slideDown('fast')
    if data.notice
      notice = "<div class=\"notice\">#{data.notice}</div>"
      $("[data-experience-id=#{data.experiences[0].slug}]").prepend(notice)
      $('#map-list').on 'ajax:success', '#convert', (e, data, status, xhr) ->
        $('p#suggestion-authentication').empty().html(data.greeting)
        $('#sign-up, #sign-in').remove()
        $(this).closest('.notice').slideUp('fast').html('Shazaam! You rock.')
          .slideDown('fast')