const Context = React.createContext([{}, () => {}]);
const Provider = ({ children }) => {
const state = React.useState({});
const value = React.useMemo(() => state, [state[0]]);
return <Context.Provider value={value}>{children}</Context.Provider>;
};
function useContextState(contextKey, initialState) {
const [contextState, setContextState] = React.useContext(Context);
const state =
contextState[contextKey] != null ? contextState[contextKey] : initialState;
const setState = nextState =>
setContextState(prevState =>
Object.assign({}, prevState, {
[contextKey]:
typeof nextState === "function" ? nextState(prevState) : nextState
})
);
React.useMutationEffect(() => {
if (contextState[contextKey] == null && state != null) {
setContextState(prevState => {
if (prevState[contextKey] == null) {
return Object.assign({}, prevState, {
[contextKey]: state
});
}
return prevState;
});
}
}, [contextKey]);
return [state, setState];
}