Vizzuality/gfw-climate

View on GitHub
app/assets/javascripts/insights/router.js

Summary

Maintainability
C
7 hrs
Test Coverage
define(
  [
    'backbone',
    'underscore',
    'mps',
    'urijs/URI',
    'utils',
    'countries/services/PlaceService',
    'insights/views/glad-alerts/InsightsGladAlertsView',
    'insights/views/emissions-calculator/EmissionCalculatorIndexView',
    'insights/views/carbon-cycle/CarbonCycleView'
  ],
  function(
    Backbone,
    _,
    mps,
    URI,
    utils,
    PlaceService,
    InsightsGladAlertsView,
    EmissionCalculatorIndexView,
    CarbonCycleView
  ) {
    'use strict';

    var Router = Backbone.Router.extend({
      params: new (Backbone.Model.extend())(),

      routes: {
        'insights/glad-alerts(/:iso)': '_initGladAlerts',
        'insights/carbon-cycle': '_initCarbonCycle',
        'insights/emissions-calculator': '_initEmissionsCalculatorIndex',
        'insights/emissions-calculator/:id': '_initEmissionsCalculatorShow'
      },

      initialize: function() {
        this.placeService = new PlaceService(this);

        this.setSubscriptions();
        this.setEvents();
      },

      setSubscriptions: function() {
        mps.subscribe('Router/change', this.setParams.bind(this));
        mps.subscribe('Router/goInsight', this.updateInsight.bind(this));
      },

      setEvents: function() {
        this.params.on('change', this.updateUrl, this);
      },

      /**
       * Setting new params and update it
       * @param {Object} params
       */
      setParams: function(params) {
        this.params.clear({ silent: true }).set(params);
      },

      /**
       * Namespace to get current params
       */
      getParams: function() {
        return this.params.attributes;
      },

      /**
       * Change URL with current params
       */
      updateUrl: function() {
        var uri = new URI();
        var params = _.omit(this.getParams(), 'vars', 'defaults', 'params');
        uri.query(this._serializeParams(params));
        // {replace: true} update the URL without creating an entry in the browser's history and allow us to go back
        this.navigate(uri.path().slice(1) + uri.search(), {
          trigger: true,
          replace: true
        });
      },

      /**
       * Update the country insight
       */
      updateInsight: function(iso) {
        this.navigate('/insights/' + this.insight + '/' + iso, {
          trigger: false
        });
      },

      /**
       * Transform URL string params to object
       * @param  {String} paramsQuery
       * @return {Object}
       * @example https://medialize.github.io/URI.js/docs.html
       */
      _unserializeParams: function(paramsQuery) {
        var params = {};
        if (typeof paramsQuery === 'string' && paramsQuery.length) {
          var uri = new URI();
          uri.query(paramsQuery);
          params = uri.search(true);
        }
        return params;
      },

      /**
       * Transform object params to URL string
       * @param  {Object} params
       * @return {String}
       * @example https://medialize.github.io/URI.js/docs.html
       */
      _serializeParams: function(params) {
        var uri = new URI();
        uri.search(params);
        return uri.search();
      },

      _initGladAlerts: function(iso) {
        this.iso = iso;
        this.insight = 'glad-alerts';

        this.view = new InsightsGladAlertsView({
          country: this.iso
        });
      },

      _initCarbonCycle: function() {
        this.insight = 'carbon-cycle';
        this.view = new CarbonCycleView();
      },

      _initEmissionsCalculatorIndex: function() {
        this.insight = 'emissions-calculator';
        this.view = new EmissionCalculatorIndexView();
      }
    });

    return Router;
  }
);