summaryrefslogtreecommitdiff
path: root/web-ui/app/js/page/router.js
blob: cc51100b4dc35e3fd352ff1abf253563152c5a8b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
define(['flight/lib/component', 'page/events', 'page/router/url_params'], function (defineComponent, events, urlParams) {
  'use strict';

  return defineComponent(function () {
    this.defaultAttrs({
      history: window.history
    });

    function createHash(data) {
      var hash = "/#/" + data.tag;
      if (!_.isUndefined(data.mailIdent)) {
        hash += '/mail/' + data.mailIdent;
      }
      return hash;
    }

    function createState(data, previousState) {
      return {
        tag: data.tag || (previousState && previousState.tag) || urlParams.defaultTag(),
        mailIdent: data.mailIdent,
        isDisplayNoMessageSelected: !!data.isDisplayNoMessageSelected
      };
    }

    this.smailPushState = function (ev, data) {
      if (!data.fromPopState) {
        var nextState = createState(data, this.attr.history.state);
        this.attr.history.pushState(nextState, '', createHash(nextState));
      }
    };

    this.smailPopState = function (ev) {
      var state = ev.state || {};

      this.trigger(document, events.ui.tag.select, {
        tag: state.tag || urlParams.getTag(),
        mailIdent: state.mailIdent,
        fromPopState: true
      });

      if (ev.state.isDisplayNoMessageSelected) {
        this.trigger(document, events.dispatchers.rightPane.openNoMessageSelectedWithoutPushState);
      }
    };

    this.after('initialize', function () {
      this.on(document, events.router.pushState, this.smailPushState);
      window.onpopstate = this.smailPopState.bind(this);
    });
  });
});