1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.StateQueueManager = void 0;
|
4 | var common_1 = require("../common");
|
5 | var stateObject_1 = require("./stateObject");
|
6 | var StateQueueManager = (function () {
|
7 | function StateQueueManager(router, states, builder, listeners) {
|
8 | this.router = router;
|
9 | this.states = states;
|
10 | this.builder = builder;
|
11 | this.listeners = listeners;
|
12 | this.queue = [];
|
13 | }
|
14 | StateQueueManager.prototype.dispose = function () {
|
15 | this.queue = [];
|
16 | };
|
17 | StateQueueManager.prototype.register = function (stateDecl) {
|
18 | var queue = this.queue;
|
19 | var state = stateObject_1.StateObject.create(stateDecl);
|
20 | var name = state.name;
|
21 | if (!common_1.isString(name))
|
22 | throw new Error('State must have a valid name');
|
23 | if (this.states.hasOwnProperty(name) || common_1.inArray(queue.map(common_1.prop('name')), name))
|
24 | throw new Error("State '" + name + "' is already defined");
|
25 | queue.push(state);
|
26 | this.flush();
|
27 | return state;
|
28 | };
|
29 | StateQueueManager.prototype.flush = function () {
|
30 | var _this = this;
|
31 | var _a = this, queue = _a.queue, states = _a.states, builder = _a.builder;
|
32 | var registered = [],
|
33 | orphans = [],
|
34 | previousQueueLength = {};
|
35 | var getState = function (name) { return _this.states.hasOwnProperty(name) && _this.states[name]; };
|
36 | var notifyListeners = function () {
|
37 | if (registered.length) {
|
38 | _this.listeners.forEach(function (listener) {
|
39 | return listener('registered', registered.map(function (s) { return s.self; }));
|
40 | });
|
41 | }
|
42 | };
|
43 | while (queue.length > 0) {
|
44 | var state = queue.shift();
|
45 | var name_1 = state.name;
|
46 | var result = builder.build(state);
|
47 | var orphanIdx = orphans.indexOf(state);
|
48 | if (result) {
|
49 | var existingState = getState(name_1);
|
50 | if (existingState && existingState.name === name_1) {
|
51 | throw new Error("State '" + name_1 + "' is already defined");
|
52 | }
|
53 | var existingFutureState = getState(name_1 + '.**');
|
54 | if (existingFutureState) {
|
55 |
|
56 | this.router.stateRegistry.deregister(existingFutureState);
|
57 | }
|
58 | states[name_1] = state;
|
59 | this.attachRoute(state);
|
60 | if (orphanIdx >= 0)
|
61 | orphans.splice(orphanIdx, 1);
|
62 | registered.push(state);
|
63 | continue;
|
64 | }
|
65 | var prev = previousQueueLength[name_1];
|
66 | previousQueueLength[name_1] = queue.length;
|
67 | if (orphanIdx >= 0 && prev === queue.length) {
|
68 |
|
69 |
|
70 | queue.push(state);
|
71 | notifyListeners();
|
72 | return states;
|
73 | }
|
74 | else if (orphanIdx < 0) {
|
75 | orphans.push(state);
|
76 | }
|
77 | queue.push(state);
|
78 | }
|
79 | notifyListeners();
|
80 | return states;
|
81 | };
|
82 | StateQueueManager.prototype.attachRoute = function (state) {
|
83 | if (state.abstract || !state.url)
|
84 | return;
|
85 | var rulesApi = this.router.urlService.rules;
|
86 | rulesApi.rule(rulesApi.urlRuleFactory.create(state));
|
87 | };
|
88 | return StateQueueManager;
|
89 | }());
|
90 | exports.StateQueueManager = StateQueueManager;
|
91 |
|
\ | No newline at end of file |