next.js/examples/with-rematch/shared/store.js
store.js48 lines1.1 KB
import { useMemo } from "react";
import { init } from "@rematch/core";
import { counter, github } from "./models";

let store;

const exampleInitialState = {
  counter: 5,
};

export const initStore = (initialState = exampleInitialState) =>
  init({
    models: {
      counter,
      github,
    },
    redux: {
      initialState,
    },
  });

export const initializeStore = (preloadedState) => {
  let _store = store ?? initStore(preloadedState);

  // After navigating to a page with an initial Redux state, merge that state
  // with the current state in the store, and create a new store
  if (preloadedState && store) {
    _store = initStore({
      ...store.getState(),
      ...preloadedState,
    });
    // Reset the current store
    store = undefined;
  }

  // For SSG and SSR always create a new store
  if (typeof window === "undefined") return _store;
  // Create the store once in the client
  if (!store) store = _store;

  return _store;
};

export function useStore(initialState) {
  const store = useMemo(() => initializeStore(initialState), [initialState]);
  return store;
}
Quest for Codev2.0.0
/
SIGN IN