/* * @since 2020-11-03 13:42:04 * @author acrazing */ import React, { createContext, ReactNode, useEffect, useState } from 'react'; import { Store } from './store'; /** @internal */ export interface ContextState { store: Store; } /** @internal */ export const __Context = createContext(null); /** * Provider props * * @stable */ export interface ProviderProps { store: Store; children: ReactNode; } /** * A component to inject amos context * * @stable */ export const Provider = ({ store, children }: ProviderProps) => { const [state, setState] = useState({ store }); useEffect(() => { state.store !== store && setState({ store }); }, [store]); return <__Context.Provider value={state}>{children}; }; /** * Consumer props * * @stable */ export interface ConsumerProps { children: (store: Store) => ReactNode; } /** * A component to subscribe the amos context * * @stable */ export const Consumer = ({ children }: ConsumerProps) => { return ( <__Context.Consumer> {(value) => { if (!value) { throw new Error('[Amos] should use inside .'); } return children(value.store); }} ); };