UNPKG

yahoi

Version:

Yet Another Highly Opinionated Isomorphic Framework

70 lines (60 loc) 2.43 kB
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)); }); } }