neweb
Version:
[![NPM version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Dependency Status][daviddm-image]][daviddm-url] [![Coverage percentage][coveralls-image]][coveralls-url] [ • 1.26 kB
text/typescript
import React = require("react");
// tslint:disable-next-line:no-submodule-imports
import ReactDOMServer = require("react-dom/server");
import SeansStatusContext from "./../client/SeansStatusContext";
import { IApplication, IPage, IPageFrame } from "./../typings";
export interface IServerRendererConfig {
app: IApplication;
}
class PageRenderer {
constructor(protected config: IServerRendererConfig) {
}
public async render(page: IPage) {
let el: any;
const data = [];
const frames = [...page.frames];
for (const pageFrame of frames.reverse()) {
el = await this.renderFrame(pageFrame, el);
data.push(pageFrame.data);
}
return {
html: ReactDOMServer.renderToString(el),
data: data.reverse(),
};
}
protected async renderFrame(frame: IPageFrame, children: any) {
const ViewClass = await this.config.app.getFrameViewClass(frame.frameName);
return React.createElement(SeansStatusContext.Provider, {
value: "initializing",
children: React.createElement(ViewClass, { params: frame.params, data: frame.data, children }),
});
}
}
export default PageRenderer;