import React from 'react';
import { renderReact } from 'art-ssr-react';
import { convertCustomRouteConfig, ensureReady } from 'art-ssr-react-router/dist/reactRouterHelper';
import { StaticRouter, matchPath } from 'react-router-dom';
import { renderRoutes } from 'react-router-config';
import StyleContext from 'art-isomorphic-style-loader/StyleContext';
import routes from './routes';
import createStore from './store/store';
import { Provider as ReduxProvider } from 'react-redux';
// TODO figure out tslint error reason
const routeConfig = convertCustomRouteConfig(routes as any);
console.log('routeConfig: ', routeConfig);
const store = createStore();
const css = new Set(); // CSS for all rendered React components
const insertCss = (...styles) => styles.forEach((style) => {
const getCss = style._getCss();
return css.add(getCss);
});
class IndexSSR extends React.Component {
constructor(props) {
super(props);
}
public componentDidUpdate(prev, curr) {
console.log('prev: ', prev);
}
public render() {
const { url } = (this.props as any).data;
return (
{
renderRoutes(routeConfig)
}
);
}
}
export default {
Main: (props: any) => {
const url = (props.data || {}).url;
console.log('props: ', props);
return ensureReady(routeConfig, url).then(() => {
const dataRequirements =
routeConfig
.filter((route) => matchPath(url, route)) // filter matching paths
.map((route) => route.component) // map to components
.filter((comp) => comp.serverFetch) // check if components have data requirement
.map((comp) => store.dispatch(comp.serverFetch())); // dispatch data requirement
return Promise.all(dataRequirements).then(() => {
return renderReact('Main', IndexSSR, css as Set, store);
});
});
}
};