mozilla/webmaker.org

View on GitHub
public/js/pages/badge-detail.js

Summary

Maintainability
C
1 day
Test Coverage
define(['jquery', 'eventEmitter/EventEmitter', 'base/login'],
  function ($, EventEmitter, auth) {
    'use strict';

    var emitter = new EventEmitter();

    var $applyBtn = $('#apply-now');
    var $closeBtn = $('.js-close-panel');
    var $issueBadgeBtn = $('#js-badge-issuing');
    var $applicationForm = $('#submit-badge-application');
    var $application = $('#application');
    var $claimCodeButtonLogin = $('.claim-code-button-login');
    var $claimCodeButtonLogout = $('.claim-code-button-logout');
    var $claimCodeInput = $applicationForm.find('[name="claimcode"]');
    var $evidenceInput = $applicationForm.find('[name="evidence"]');
    var $cityInput = $applicationForm.find('[name="city"]');
    var $applicationInputs = $evidenceInput.add($cityInput);
    var $error = $('.submit-badge-error');
    var $success = $('#submit-badge-success');
    var $successIssued = $('#issue-badge-success');
    var $successClaimed = $('#claim-badge-success');
    var $loginOnly = $('.login-only');
    var $logoutOnly = $('.logout-only');
    var $applicationOn = $('.application-on');
    var $applicationOff = $('.application-off');
    var $issueBadgeOn = $('.js-issue-badge-on');
    var $claimCodContainer = $('.claim-code-container');
    var $issue = $('#issue');
    var $issueForm = $('#issue-form');
    var $claimCodeQuestion = $('#claim-code-explainer');

    var badgeSlug = $application.attr('data-badge-slug');
    var applicationSlug = $application.attr('data-application-slug');

    // An application was submitted successfully
    emitter.on('submit-application', function () {
      $success.removeClass('hidden');
      $error.addClass('hidden');
      $application.addClass('hidden');
    });

    // An claim code was claimed successfully
    emitter.on('claim-successful', function () {
      $successClaimed.removeClass('hidden');
      $error.addClass('hidden');
      $application.addClass('hidden');
    });

    // An application was submitted successfully
    emitter.on('badge-issued', function () {
      $successIssued.removeClass('hidden');
      $error.addClass('hidden');
      $issue.addClass('hidden');
    });

    // An application error occurred
    emitter.on('error', function (err) {
      if (err.responseJSON) {
        $error.find('.error-message').html('(' + err.responseJSON.error + ')');
      }
      $success.addClass('hidden');
      $successIssued.addClass('hidden');
      $error.removeClass('hidden');
    });

    emitter.on('reset-application', function (err) {
      $success.addClass('hidden');
      $error.addClass('hidden');
      $application.removeClass('hidden');
    });

    emitter.on('application-on', function () {
      $issueBadgeOn.addClass('hidden');
      $claimCodContainer.addClass('hidden');
      $applicationOn.removeClass('hidden');
      $applicationOff.addClass('hidden');
      $claimCodeButtonLogin.removeClass('hidden');
    });

    emitter.on('claim-code-button-click', function () {
      $applicationOn.addClass('hidden');
      $issueBadgeOn.addClass('hidden');
      $claimCodContainer.removeClass('hidden');
      $applicationOff.removeClass('hidden');
      $claimCodeButtonLogin.addClass('hidden');
    });

    emitter.on('js-issue-badge-on', function () {
      $applicationOn.addClass('hidden');
      $claimCodContainer.addClass('hidden');
      $issueBadgeOn.removeClass('hidden');
      $applicationOff.addClass('hidden');
      $claimCodeButtonLogin.removeClass('hidden');
    });

    emitter.on('application-off', function () {
      $applicationOn.addClass('hidden');
      $issueBadgeOn.addClass('hidden');
      $claimCodContainer.addClass('hidden');
      $applicationOff.removeClass('hidden');
      $claimCodeButtonLogin.removeClass('hidden');
    });

    $logoutOnly.on('click', function () {
      auth.login();
    });

    var fireClaimCode = false;
    $claimCodeButtonLogout.on('click', function (e) {
      e.preventDefault();
      fireClaimCode = true;
      auth.login();
    });
    auth.on('login', function (user) {
      $claimCodeButtonLogin.removeClass('hidden');
      $claimCodeButtonLogout.addClass('hidden');
      $('.webmaker-email-placeholder').text(user.email);

      if (fireClaimCode) {
        fireClaimCode = false;
        emitter.emitEvent('claim-code-button-click');
      }

      $loginOnly.removeClass('hidden');
      $logoutOnly.addClass('hidden');
    });
    auth.on('logout', function () {
      $claimCodeButtonLogin.addClass('hidden');
      $claimCodeButtonLogout.removeClass('hidden');
      $('.webmaker-email-placeholder').text('');

      $loginOnly.addClass('hidden');
      $logoutOnly.removeClass('hidden');
    });

    auth.wmLogin.verify();
    $claimCodeInput.on('change', function (e) {
      if ($claimCodeInput.val().length) {
        $applicationInputs.removeAttr('required');
        $applicationInputs.attr('disabled', 'disabled');
      } else {
        $applicationInputs.attr('required', 'required');
        $applicationInputs.removeAttr('disabled');
      }
    }).change();

    $claimCodeQuestion.powerTip({
      placement: 'ne'
    });

    $applicationForm.on('submit', function (e) {
      e.preventDefault();

      var claimcode = $claimCodeInput.val();
      if (claimcode.length) {
        $.post('/api/badges/' + badgeSlug + '/claim', {
          claimcode: claimcode,
          _csrf: $('meta[name="csrf-token"]').attr('content')
        })
          .done(function (data) {
            emitter.emitEvent('claim-successful');
          })
          .fail(function (err) {
            emitter.emitEvent('error', [err]);
          });
      } else {
        $.post('/api/badges/' + badgeSlug + '/apply', {
          evidence: $evidenceInput.val(),
          city: $cityInput.val(),
          applicationSlug: applicationSlug,
          _csrf: $('meta[name="csrf-token"]').attr('content')
        })
          .done(function (data) {
            emitter.emitEvent('submit-application');
          })
          .fail(function (err) {
            emitter.emitEvent('error', [err]);
          });
      }
    });

    $issueForm.on('submit', function (e) {
      e.preventDefault();
      $.post('/api/badges/' + badgeSlug + '/issue', {
        email: $issueForm.find('[name="email"]').val(),
        comment: $issueForm.find('[name="comment""]').val(),
        _csrf: $('meta[name="csrf-token"]').attr('content')
      })
        .done(function (data) {
          emitter.emitEvent('badge-issued');
        })
        .fail(function (err) {
          emitter.emitEvent('error', [err]);
        });
    });

    $applyBtn.on('click', function (e) {
      e.preventDefault();
      emitter.emitEvent('application-on');
    });
    $closeBtn.on('click', function (e) {
      e.preventDefault();
      emitter.emitEvent('application-off');
    });
    $claimCodeButtonLogin.on('click', function (e) {
      e.preventDefault();
      emitter.emitEvent('claim-code-button-click');
    });
    $issueBadgeBtn.on('click', function (e) {
      e.preventDefault();
      emitter.emitEvent('js-issue-badge-on');
    });
  });