import { Context } from "almin"; import * as React from "react"; // Provider export type ProviderProps = { initialState?: T; children: React.ReactNode; }; // Consumer export type ConsumerProps = { children: (props: T) => React.ReactNode; }; export function createReactContext( alminContext: Context ): { Provider: React.ComponentType>; Consumer: React.ComponentType>; } { const initialState = alminContext.getState(); const StateContext: React.Context = React.createContext(initialState); // Provider class Provider extends React.PureComponent> { private releaseHandler: () => void; constructor(props: ProviderProps) { super(props); // If , prefer to use the props value // This props.initialState is for testing this.state = props.initialState || initialState; this.releaseHandler = alminContext.onChange(this.onChange); } private onChange = () => { this.setState(alminContext.getState()); }; componentWillUnmount() { this.releaseHandler(); } render() { if (StateContext === null) { return null; } return {this.props.children}; } } // Consumer class Consumer extends React.PureComponent> { render() { if (StateContext === null) { throw new Error( "You must wrap your components with a component.\n" + "You can get component via `createContext()` API." ); } return ( {(value) => { return this.props.children(value); }} ); } } return { Provider, Consumer, }; }