Add render to comments-client
This commit is contained in:
parent
3257a6ffb4
commit
6c2728228e
@ -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,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
@ -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),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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} = {}) => {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user