mirror of
https://github.com/streamich/react-use.git
synced 2026-01-25 14:17:16 +00:00
31 lines
936 B
TypeScript
31 lines
936 B
TypeScript
import { createContext, createElement, 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 = ({
|
|
children,
|
|
initialValue,
|
|
}: {
|
|
children?: React.ReactNode;
|
|
initialValue?: T;
|
|
}) => {
|
|
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;
|