UNPKG

5.38 kBJavaScriptView Raw
1"use strict";
2var __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};
10Object.defineProperty(exports, "__esModule", { value: true });
11const debug = require("debug");
12const neweb_components_1 = require("neweb-components");
13const BehaviorSubject_1 = require("rxjs/BehaviorSubject");
14class 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 // create all frames
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 // frameIds.map((frameId) => this.renderFrame(frameId, page));
56 this.renderFrame(page.rootFrame, page);
57 // TODO delete old frames
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}
126exports.default = ClientPageRenderer;