yahoi
Version:
Yet Another Highly Opinionated Isomorphic Framework
70 lines (60 loc) • 2.43 kB
JavaScript
import ControllerResponseType from './../ControllerResponseType';
import React from 'react';
import { renderToString } from 'react-dom/server'
import { ViewRenderer } from './../Renderer';
import { Provider } from 'react-redux'
import fs from 'fs';
export default class RenderComponent extends ControllerResponseType {
constructor(props) {
super();
this.req = props.req;
this.preloadedState = props.preloadedState || {};
this.targetView = props.targetView;
this.projectPath = props.projectPath;
}
render(props) {
let req = this.req;
let preloadedState = this.preloadedState;
return new Promise((fulfill, reject) => {
if(this.content!=null) {
fulfill(this.content);
} else {
//let compPath = `${this.projectPath}/Client/server-client.js`;
//let compPath = `${this.projectPath}/Client/browser-client.js`;
let compPath = `${this.projectPath}/Client/index.js`;
// let compPath = '/Users/matt/Development/publicgit/yahoiApp/dist/public/js/main.js'
// console.log('thisss', compPath);
// turn off for prod env
if(typeof(require.cache[compPath])!='undefined') {
delete require.cache[compPath];
}
let preloadedState = { Auth: { a: 1} };
let injectedPreloadedState = JSON.stringify(preloadedState);
let sourceComponent = require(compPath).default;
let Component = (React.createFactory(sourceComponent));
let ssr = {
location: req.url,
context: { },
preloadedState: preloadedState
}
let renderedClient = renderToString(<Component ssr={ssr} />);
let CLIENT_INJECTOR = `<script>window.__PRELOADED_STATE__=${injectedPreloadedState}</script><div id='client-wrapper'>${renderedClient}</div><script src="/public/js/vendor.js"></script><script src="/public/js/main.js"></script>`
var viewRenderer = new ViewRenderer();
viewRenderer.render(`${this.projectPath}/Views/${this.targetView}`, { CLIENT: CLIENT_INJECTOR }).then(renderedHtml => {
fulfill(renderedHtml);
}).catch(e => {
console.log(e);
reject(e);
})
}
});
}
respond(req, res) {
this.render(req).then(content => {
res.send(content);
}).catch(e => {
console.log(e);
res.send('error: ' + String(e));
});
}
}