/// https://github.com/jamiebuilds/unstated-next/blob/master/src/unstated-next.tsx import React from 'react'; const EMPTY: unique symbol = Symbol(); export interface ContainerProviderProps { initialState?: State; children: React.ReactNode; } export interface Container { Provider: React.ComponentType>; useContainer: () => Value; } export function createContainer( useHook: (initialState?: State) => Value, ): Container { const Context = React.createContext(EMPTY); function Provider(props: ContainerProviderProps) { const value = useHook(props.initialState); return {props.children}; } function useContainer(): Value { const value = React.useContext(Context); if (value === EMPTY) { throw new Error('Component must be wrapped with '); } return value; } return { Provider, useContainer }; } export function useContainer(container: Container): Value { return container.useContainer(); }