mirror of
https://github.com/streamich/react-use.git
synced 2026-01-18 14:06:52 +00:00
24 lines
892 B
TypeScript
24 lines
892 B
TypeScript
import { createElement, createContext, useContext, useState } from 'react';
|
|
|
|
const createStateContext = <T>(defaultInitialValue: T) => {
|
|
const context = createContext<[T, React.Dispatch<React.SetStateAction<T>>] | undefined>(undefined);
|
|
const providerFactory = (props, children) => createElement(context.Provider, props, children);
|
|
|
|
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;
|