| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- import React from 'react';
- import configureStore from './store.js';
- import { readState, saveState } from './persisted.store.cookies.js';
- const isServer = typeof window === 'undefined';
- const __NEXT_REDUX_STORE__ = '__NEXT_REDUX_STORE__';
- function getOrCreateStore(initialState) {
- // Always make a new store if server, otherwise state is shared between requests
- if (isServer) {
- return configureStore(initialState);
- }
- // Create store if unavailable on the client and set it on the window object
- if (!window[__NEXT_REDUX_STORE__]) {
- window[__NEXT_REDUX_STORE__] = configureStore(initialState);
- }
- return window[__NEXT_REDUX_STORE__];
- }
- const AppFn = App => {
- return class AppWithRedux extends React.Component {
- static async getInitialProps(appContext) {
- let initialState = appContext.ctx.req
- ? readState(appContext.ctx.req.headers.cookie)
- : {};
- // Get or Create the store with `undefined` as initialState
- // This allows you to set a custom default initialState
- const reduxStore = getOrCreateStore(initialState);
- // Provide the store to getInitialProps of pages
- appContext.ctx.reduxStore = reduxStore;
- let appProps = {};
- if (typeof App.getInitialProps === 'function') {
- appProps = await App.getInitialProps(appContext);
- }
- return {
- ...appProps,
- initialReduxState: reduxStore.getState()
- };
- }
- constructor(props) {
- super(props);
- this.reduxStore = getOrCreateStore(props.initialReduxState);
- }
- render() {
- return <App {...this.props} reduxStore={this.reduxStore} />;
- }
- };
- };
- export default AppFn;
|