reiso
Version:
153 lines • 11.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const React = require("react");
const mobx_react_1 = require("mobx-react");
const ReactDOMServer = require("react-dom/server");
const react_router_1 = require("react-router");
const ApolloReact = require("react-apollo");
const ApolloClient = require("apollo-client");
const ApolloCache = require("apollo-cache-inmemory");
const react_helmet_1 = require("react-helmet");
const apollo_link_batch_http_1 = require("apollo-link-batch-http");
const ApolloLink = require("apollo-link");
const Config_1 = require("../Modules/Config");
const Translation = require("../Modules/Translation");
const Router = require("../Modules/Router");
const Model = require("../Modules/Model");
const ServerHook_1 = require("../Modules/ServerHook");
const Log = require("../Modules/Log");
const Translation_1 = require("./Lib/Translation");
async function checkInteruptHook(req, res, next, stores, context, hooksRes) {
for (let hook of ServerHook_1.getHooksRender()) {
let hookRes = await hook(req, res, next, context, stores);
if (!hookRes)
return false;
hooksRes.push(hookRes);
}
return true;
}
exports.checkInteruptHook = checkInteruptHook;
function genLink(hooksRes) {
const linkNetwork = new apollo_link_batch_http_1.BatchHttpLink({
uri: `http://${Config_1.getConfig().host}:${Config_1.getConfig().globalPort}/graphql`,
});
let links = [];
hooksRes.forEach(hook => {
if (hook.linksBefore)
links = links.concat(hook.linksBefore);
});
links = links.concat(linkNetwork);
hooksRes.forEach(hook => {
if (hook.linksAfter)
links = links.concat(hook.linksAfter);
});
// TODO: Error processing
// const linkError = onError(({ graphQLErrors, networkError, operation }) => {
// if (graphQLErrors) {
// graphQLErrors.map(({ message, locations, path }) => {
// console.error(
// `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`,
// );
// store.dispatch(Header.setNotification({
// id: 'GraphQLError',
// title: operation.operationName ? `Server has sended an error: ${operation.operationName}` : `Server has sended an error`,
// message: `Message: ${message}`,
// type: 'error'
// }));
// });
// }
// if (networkError) {
// console.error(`[Network error]: ${networkError}`);
// store.dispatch(Header.setNotification({
// id: 'NetworkError',
// title: operation.operationName ? `Network error: ${operation.operationName}` : `Network error`,
// message: networkError.message,
// type: 'error'
// }));
// }
// });
// const link = linkError.concat(ApolloLink.ApolloLink.from(links));
let link = ApolloLink.ApolloLink.from(links);
hooksRes.forEach(hook => {
if (hook.linksWrap)
link = hook.linksWrap.concat(link);
});
return link;
}
exports.genLink = genLink;
async function Render(req, res, next, language) {
const context = {
language: language || Translation.getLanguage()
};
const stores = Model.getStores();
const hooksRes = [];
if (!await checkInteruptHook(req, res, next, stores, context, hooksRes))
return;
Translation_1.setLanguageContext(context);
const link = genLink(hooksRes);
const cache = new ApolloCache.InMemoryCache();
const gqlClient = new ApolloClient.ApolloClient({
link,
cache,
ssrMode: true,
queryDeduplication: true,
defaultOptions: {
watchQuery: {
fetchPolicy: 'cache-and-network',
errorPolicy: 'ignore',
},
query: {
fetchPolicy: 'cache-and-network',
errorPolicy: 'all',
},
mutate: {
errorPolicy: 'all'
}
}
});
const Html = Router.GetHtml();
const component = (React.createElement(ApolloReact.ApolloProvider, { client: gqlClient },
React.createElement(mobx_react_1.Provider, Object.assign({}, stores),
React.createElement(react_router_1.StaticRouter, { location: req.url, context: {} },
React.createElement(Html, { client: gqlClient, language: context.language }, Router.GetRoutes(stores, context.language))))));
// TODO: Fix server rendering with context (Fixed & need to test)
let html;
try {
html = await ApolloReact.renderToStringWithData(component);
// await ApolloReact.getDataFromTree(component);
}
catch (e) {
Log.logError(e, { type: "server_render" });
html = ReactDOMServer.renderToString(component);
}
// html = ReactDOMServer.renderToString(component);
const helmet = react_helmet_1.Helmet.renderStatic();
res.status(200);
res.send(`
<!doctype html>
<html ${helmet.htmlAttributes.toString()}>
<head>
<meta charset="utf-8"/>
${helmet.title.toString()}
${helmet.meta.toString()}
${helmet.link.toString()}
<script type="application/javascript">
window.__INITIAL_STATE__ = ${JSON.stringify(Model.serialize(stores))};
window.__TRANSLATION__ = ${JSON.stringify(Translation.getTranslation())};
window.__LANGUAGES__ = ${JSON.stringify(Translation.getLanguages())};
window.__LANGUAGE__ = "${context.language}";
window.__CONTEXT__ = ${JSON.stringify(context)};
window.__HOST__ = "${Config_1.getConfig().host}";
window.__WSADDRESS__ = ${Config_1.getConfig().globalPortWS};
window.__APOLLO_STATE__ = ${JSON.stringify(cache.extract())};
</script>
</head>
<body ${helmet.bodyAttributes.toString()}>
<div style="min-height: 100vh; display: flex; flex-flow: column" id="body">${html}</div>
<script src="/index.js"></script>
</body>
</html>
`);
}
exports.Render = Render;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL1NlcnZlci9SZW5kZXIudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsK0JBQStCO0FBQy9CLDJDQUFzQztBQUN0QyxtREFBbUQ7QUFDbkQsK0NBQTRDO0FBQzVDLDRDQUE0QztBQUM1Qyw4Q0FBOEM7QUFDOUMscURBQXFEO0FBQ3JELCtDQUFzQztBQUN0QyxtRUFBdUQ7QUFDdkQsMENBQTBDO0FBSTFDLDhDQUE4QztBQUM5QyxzREFBc0Q7QUFDdEQsNENBQTRDO0FBQzVDLDBDQUEwQztBQUMxQyxzREFBNkQ7QUFDN0Qsc0NBQXNDO0FBQ3RDLG1EQUF1RDtBQUVoRCxLQUFLLDRCQUE0QixHQUFvQixFQUFFLEdBQXFCLEVBQUUsSUFBMEIsRUFBRSxNQUFXLEVBQUUsT0FBTyxFQUFFLFFBQWdCO0lBQ3JKLEtBQUssSUFBSSxJQUFJLElBQUksMkJBQWMsRUFBRSxFQUFFO1FBQ2pDLElBQUksT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUxRCxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRTNCLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDeEI7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFWRCw4Q0FVQztBQUVELGlCQUF3QixRQUFlO0lBQ3JDLE1BQU0sV0FBVyxHQUFHLElBQUksc0NBQWEsQ0FBQztRQUNwQyxHQUFHLEVBQUUsVUFBVSxrQkFBUyxFQUFFLENBQUMsSUFBSSxJQUFJLGtCQUFTLEVBQUUsQ0FBQyxVQUFVLFVBQVU7S0FDcEUsQ0FBQyxDQUFDO0lBRUgsSUFBSSxLQUFLLEdBQTRCLEVBQUUsQ0FBQztJQUV4QyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3RCLElBQUks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