-import cookieParser = require('cookie-parser');
-import * as serialize from 'serialize-javascript';
-import * as express from 'express';
+// import cookieParser = require('cookie-parser');
+import serialize from 'serialize-javascript';
+import express from 'express';
import { StaticRouter } from 'inferno-router';
import { renderToString } from 'inferno-server';
-import path = require('path');
-import App from '../client/components/App/App';
+import { matchPath } from 'inferno-router';
+import path from 'path';
+import { App } from '../shared/components/app';
+import { IsoData } from '../shared/interfaces';
+import { routes } from '../shared/routes';
+import IsomorphicCookie from 'isomorphic-cookie';
+import { lemmyHttp, setAuth } from '../shared/utils';
+import { GetSiteForm } from 'lemmy-js-client';
const server = express();
const port = 1234;
server.use(express.json());
server.use(express.urlencoded({ extended: false }));
-server.use('/static', express.static(path.resolve('./dist/client')));
+server.use('/assets', express.static(path.resolve('./src/assets')));
+server.use('/static', express.static(path.resolve('./dist')));
-server.use(cookieParser());
+// server.use(cookieParser());
-server.get('/*', (req, res) => {
+server.get('/*', async (req, res) => {
+ const activeRoute = routes.find(route => matchPath(req.url, route)) || {};
const context = {} as any;
- const isoData = {
- name: 'fishing sux',
+ let auth: string = IsomorphicCookie.load('jwt', req);
+
+ let getSiteForm: GetSiteForm = {};
+ setAuth(getSiteForm, auth);
+
+ let promises: Promise<any>[] = [];
+
+ let siteData = lemmyHttp.getSite(getSiteForm);
+ promises.push(siteData);
+ if (activeRoute.fetchInitialData) {
+ promises.push(...activeRoute.fetchInitialData(auth, req.path));
+ }
+
+ let resolver = await Promise.all(promises);
+
+ let isoData: IsoData = {
+ path: req.path,
+ site: resolver[0],
+ routeData: resolver.slice(1, resolver.length),
};
+ console.log(activeRoute.path);
+
const wrapper = (
- <StaticRouter location={req.url} context={context}>
- <App name={isoData.name} />
+ <StaticRouter location={req.url} context={isoData}>
+ <App site={isoData.site} />
</StaticRouter>
);
if (context.url) {
}
res.send(`
- <!doctype html>
- <html>
- <head>
- <title>My Universal App</title>
- <script>window.isoData = ${serialize(isoData)}</script>
- </head>
- <body>
- <div id='root'>${renderToString(wrapper)}</div>
- <script src='./static/bundle.js'></script>
- </body>
- </html>
+ <!DOCTYPE html>
+ <html lang="en">
+ <head>
+ <script>window.isoData = ${serialize(isoData)}</script>
+
+ <!-- Required meta tags -->
+ <meta name="Description" content="Lemmy">
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+
+ <!-- Icons -->
+ <link rel="shortcut icon" type="image/svg+xml" href="/assets/favicon.svg" />
+ <!-- <link rel="apple-touch-icon" href="/assets/apple-touch-icon.png" /> -->
+
+ <!-- Styles -->
+ <link rel="stylesheet" type="text/css" href="/static/styles/styles.css" />
+ </head>
+
+ <body>
+ <div id='root'>${renderToString(wrapper)}</div>
+ <script src='/static/js/client.js'></script>
+ </body>
+ </html>
`);
});
let Server = server.listen(port, () => {