Add render to comments-client

This commit is contained in:
Jerko Steiner 2019-03-13 19:07:49 +05:00
parent 3257a6ffb4
commit 6c2728228e
5 changed files with 30 additions and 22 deletions

View File

@ -1,34 +1,41 @@
import ReactDOM from 'react-dom'
import React from 'react' import React from 'react'
import {Provider} from 'react-redux' import ReactDOM from 'react-dom'
import {IStoreFactory} from './IStoreFactory' import {Action} from 'redux'
import {IRenderer} from './IRenderer' import {IRenderer} from './IRenderer'
import {IStoreFactory} from './IStoreFactory'
import {Provider} from 'react-redux'
export class ClientRenderer implements IRenderer { export interface IClientRendererParams<State, A extends Action> {
constructor( readonly createStore: IStoreFactory<State, A | any>,
readonly createStore: IStoreFactory, readonly RootComponent: React.ComponentType,
readonly RootComponent: React.ComponentType, readonly target?: HTMLElement
readonly target = document.body, }
) {}
export class ClientRenderer<State, A extends Action> implements IRenderer {
constructor(readonly params: IClientRendererParams<State, A>) {}
render(state = (window as any).__PRELOADED_STATE__) { render(state = (window as any).__PRELOADED_STATE__) {
const {RootComponent} = this const {
RootComponent,
createStore,
target = document.body,
} = this.params
if (state) { if (state) {
const store = this.createStore(state) const store = createStore(state)
ReactDOM.hydrate( ReactDOM.hydrate(
<Provider store={store}> <Provider store={store}>
<RootComponent /> <RootComponent />
</Provider>, </Provider>,
this.target, target,
) )
} else { } else {
const store = this.createStore() const store = createStore()
ReactDOM.render( ReactDOM.render(
<Provider store={store}> <Provider store={store}>
<RootComponent /> <RootComponent />
</Provider>, </Provider>,
this.target, target,
) )
} }
} }

View File

@ -1,4 +1,5 @@
import {Store} from 'redux' import {Action, Store} from 'redux'
// TODO maybe Store should also be typed // TODO maybe Store should also be typed
export type IStoreFactory = (state?: any) => Store export type IStoreFactory<State, A extends Action> =
(state?: State) => Store<State, A | any>

View File

@ -1,12 +1,13 @@
import React from 'react' import React from 'react'
import {Action} from 'redux'
import {IRenderer} from './IRenderer' import {IRenderer} from './IRenderer'
import {IStoreFactory} from './IStoreFactory' import {IStoreFactory} from './IStoreFactory'
import {Provider} from 'react-redux' import {Provider} from 'react-redux'
import {renderToNodeStream} from 'react-dom/server' import {renderToNodeStream} from 'react-dom/server'
export class ServerRenderer implements IRenderer { export class ServerRenderer<State, A extends Action> implements IRenderer {
constructor( constructor(
readonly createStore: IStoreFactory, readonly createStore: IStoreFactory<State, A | any>,
readonly RootComponent: React.ComponentType, readonly RootComponent: React.ComponentType,
) {} ) {}
render(state?: any) { render(state?: any) {

View File

@ -24,9 +24,9 @@ export function createStore<State, A extends Action>(
params: ICreateStoreParams<State, A>, params: ICreateStoreParams<State, A>,
) { ) {
const middleware = params.middleware || [new PromiseMiddleware().handle] const middleware = params.middleware || [new PromiseMiddleware().handle]
return create( return (state?: DeepPartial<State>) => create(
combineReducers(params.reducers), combineReducers(params.reducers),
params.state, state,
applyMiddleware(...middleware), applyMiddleware(...middleware),
) )
} }

View File

@ -48,8 +48,7 @@ export class TestUtils {
) { ) {
const store = this.createStore({ const store = this.createStore({
reducers: params.reducers, reducers: params.reducers,
state: params.state, })(params.state)
})
const Component = params.connector.connect(params.select) const Component = params.connector.connect(params.select)
const render = (additionalProps: {[key: string]: any} = {}) => { const render = (additionalProps: {[key: string]: any} = {}) => {