react-use/src/createStateContext.ts
2020-01-13 13:32:24 +01:00

24 lines
854 B
TypeScript

import { createFactory, createContext, useContext, useState } from 'react';
const createStateContext = <T>(defaultInitialValue: T) => {
const context = createContext<[T, React.Dispatch<React.SetStateAction<T>>] | undefined>(undefined);
const providerFactory = createFactory(context.Provider);
const StateProvider: React.FC<{ initialValue?: T }> = ({ children, initialValue }) => {
const state = useState<T>(initialValue !== undefined ? initialValue : defaultInitialValue);
return providerFactory({ value: state }, children);
};
const useStateContext = () => {
const state = useContext(context);
if (state == null) {
throw new Error(`useStateContext must be used inside a StateProvider.`);
}
return state;
};
return [useStateContext, StateProvider, context] as const;
};
export default createStateContext;