import { Context, ComponentType, FunctionComponent } from 'react' import { StoreonStore, StoreonDispatch } from '../index.js' export namespace useStoreon { export type StoreData = { dispatch: StoreonDispatch } & State } /** * Hook to use Storeon in functional React component. * * ```js * import { useStoreon } from 'storeon/react' * const Counter = () => { * const { dispatch, count } = useStoreon('count') * return
* {count} *
* } * ``` * * @param keys List of state’s field. * @returns The selected part of the state. */ export function useStoreon( ...keys: (keyof State)[] ): useStoreon.StoreData /** * Higher-order function to let user create their own custom hooks in case of server-side rendering * * ```js * // Parent component * import { CreateContext } from 'react' * import { customContext } from 'storeon/react' * * const CustomContext = CreateContext(storeon) * * export const useStoreon = customContext(CustomContext) * * const Component = props => { * return ( * * {props.children} * * ) * } * ``` * * ```js * // Children component * import { useStoreon } from './parent' * * const Counter = () => { * const { dispatch, count } = useStoreon('count') * return
* {count} *
* } * ``` * * @param context User's owned React context * @returns useStoreon hooks that attatched to User's React context */ export function customContext( context: Context> ): (...keys: (keyof State)[]) => useStoreon.StoreData /** * Context to put store for `connect` decorator. * * ```js * import { StoreContext } from 'storeon/react' * render( * , * document.body * ) * ``` */ export const StoreContext: Context declare namespace connectStoreon { export type Omit = Pick> export type ConnectedComponent = FunctionComponent< Partial> > } /** * Connect React components to the store. * * ```js * import { connectStoreon } from 'storeon/react/connect' * const Counter = ({ count, dispatch }) => { * return
* {count} *
* } * export default connect('count', Counter) * ``` * * @returns Wrapped component. */ export function connectStoreon( ...keysOrComponent: (PropertyKey | ComponentType)[] ): connectStoreon.ConnectedComponent