1 | "use strict";
|
2 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
3 | return new (P || (P = Promise))(function (resolve, reject) {
|
4 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
5 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
6 | function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
7 | step((generator = generator.apply(thisArg, _arguments || [])).next());
|
8 | });
|
9 | };
|
10 | Object.defineProperty(exports, "__esModule", { value: true });
|
11 | const debug = require("debug");
|
12 | const neweb_components_1 = require("neweb-components");
|
13 | const BehaviorSubject_1 = require("rxjs/BehaviorSubject");
|
14 | class ClientPageRenderer {
|
15 | constructor(config) {
|
16 | this.config = config;
|
17 | this.views = {};
|
18 | this.frames = {};
|
19 | }
|
20 | setMethods(params) {
|
21 | this.navigate = params.navigate;
|
22 | this.dispatch = params.dispatch;
|
23 | this.seansStatusEmitter = params.seansStatusEmitter;
|
24 | this.networkStatusEmitter = params.networkStatusEmitter;
|
25 | this.historyContext = params.historyContext;
|
26 | }
|
27 | loadPage(page) {
|
28 | return __awaiter(this, void 0, void 0, function* () {
|
29 | yield this.loadViews(page);
|
30 |
|
31 | page.frames.map((pageFrame) => {
|
32 | this.frames[pageFrame.frameId] = this.createFrame(pageFrame);
|
33 | });
|
34 | this.renderFrame(page.rootFrame, page);
|
35 | this.currentPage = page;
|
36 | });
|
37 | }
|
38 | newPage(page) {
|
39 | return __awaiter(this, void 0, void 0, function* () {
|
40 | debug("neweb:renderer")("new page", page);
|
41 | yield this.loadViews(page);
|
42 | const frameIds = [];
|
43 | page.frames.map((frame) => __awaiter(this, void 0, void 0, function* () {
|
44 | if (!this.frames[frame.frameId]) {
|
45 | this.frames[frame.frameId] = this.createFrame(frame);
|
46 | frameIds.push(frame.frameId);
|
47 | }
|
48 | else {
|
49 | const xFrame = this.frames[frame.frameId];
|
50 | if (JSON.stringify(xFrame.params.getValue()) !== frame.params) {
|
51 | xFrame.params.next(frame.params);
|
52 | }
|
53 | }
|
54 | }));
|
55 |
|
56 | this.renderFrame(page.rootFrame, page);
|
57 |
|
58 | if (this.currentPage.rootFrame !== page.rootFrame) {
|
59 | neweb_components_1.replace(this.frames[page.rootFrame].component, this.config.rootHtmlElement);
|
60 | }
|
61 | this.currentPage = page;
|
62 | });
|
63 | }
|
64 | initialize() {
|
65 | return __awaiter(this, void 0, void 0, function* () {
|
66 | neweb_components_1.hydrate(this.frames[this.currentPage.rootFrame].component, this.config.rootHtmlElement);
|
67 | });
|
68 | }
|
69 | emitFrameControllerData(params) {
|
70 | const frame = this.frames[params.frameId];
|
71 | if (frame) {
|
72 | frame.data[params.fieldName].next(params.value);
|
73 | }
|
74 | }
|
75 | loadViews(page) {
|
76 | return __awaiter(this, void 0, void 0, function* () {
|
77 | yield Promise.all(page.frames.map((pageFrame) => __awaiter(this, void 0, void 0, function* () {
|
78 | this.views[pageFrame.frameName] = yield this.config.app.getFrameViewClass(pageFrame);
|
79 | })));
|
80 | });
|
81 | }
|
82 | renderFrame(frameId, page) {
|
83 | const frame = this.frames[frameId];
|
84 | const pageFrame = page.frames.filter((f) => f.frameId === frameId)[0];
|
85 | Object.keys(pageFrame.frames).map((placeName) => {
|
86 | const childFrameId = pageFrame.frames[placeName];
|
87 | this.renderFrame(childFrameId, page);
|
88 | const childFrame = this.frames[childFrameId];
|
89 | if (frame.pageFrame.frames[placeName] !== pageFrame.frames[placeName]
|
90 | || !frame.children[placeName].getValue()) {
|
91 | frame.children[placeName].next(childFrame.component);
|
92 | }
|
93 | });
|
94 | }
|
95 | createFrame(pageFrame) {
|
96 | const ViewClass = this.views[pageFrame.frameName];
|
97 | const data = {};
|
98 | Object.keys(pageFrame.data).map((dataName) => {
|
99 | data[dataName] = new BehaviorSubject_1.BehaviorSubject(pageFrame.data[dataName]);
|
100 | });
|
101 | const children = {};
|
102 | Object.keys(pageFrame.frames).map((childName) => {
|
103 | children[childName] = new BehaviorSubject_1.BehaviorSubject(undefined);
|
104 | });
|
105 | const params = new BehaviorSubject_1.BehaviorSubject(pageFrame.params);
|
106 | const component = new ViewClass({
|
107 | data,
|
108 | children,
|
109 | params,
|
110 | navigate: this.navigate,
|
111 | dispatch: (actionName, ...args) => this.dispatch({
|
112 | frameId: pageFrame.frameId,
|
113 | actionName,
|
114 | args,
|
115 | }),
|
116 | });
|
117 | return {
|
118 | pageFrame,
|
119 | component,
|
120 | data,
|
121 | children,
|
122 | params,
|
123 | };
|
124 | }
|
125 | }
|
126 | exports.default = ClientPageRenderer;
|