/* * @since 2020-11-04 12:38:33 * @author acrazing */ import React, { ComponentProps, ComponentType, ElementRef, forwardRef, ForwardRefExoticComponent, PropsWithoutRef, RefAttributes, } from 'react'; import { Consumer } from './context'; import { selector } from './selector'; import { Dispatch, Select } from './store'; import { values } from './utils'; export interface ConnectedProps { dispatch: Dispatch; } export type ConnectedComponent< TOwnedProps, TMappedProps, C extends ComponentType > = ForwardRefExoticComponent< PropsWithoutRef< Omit, keyof TMappedProps | keyof ConnectedProps> & TOwnedProps > & RefAttributes> > & { WrappedComponent: C; }; export type Connector = < C extends ComponentType & TMappedProps & ComponentProps> >( Component: C, ) => ConnectedComponent; const emptyMapper = () => ({}); export function connect( extractor: (select: Select, ownedProps: TOwnedProps) => TMappedProps = emptyMapper as any, ): Connector { const mapper = selector(extractor, (select, args) => values(args)); return function connector(Component: any) { const ConnectedComponent = forwardRef((props, ref) => { // TODO listen updates return ( {(store) => ( {props.children} )} ); }) as ConnectedComponent; ConnectedComponent.WrappedComponent = Component; return ConnectedComponent; } as any; }