import React from 'react'; import { isComponent } from './utils'; /** * @internal @unstable */ export interface Controls extends Partial> {} /** * @internal @unstable */ export const ControlsContext = React.createContext( undefined ); /** * @internal @unstable * * `ControlsProvider` provides the values contained in `ControlsContext` * to consumers. `ControlsContext` lookup is handled directly * by `Control` components returned by `withControls`. * * @example * * Add `ControlsContext` aware `Controls` components to a Connected * Component: * * ```tsx * const DataList = withControls(function DataList(data: T[]) { * return data.map(ListItem); * }, 'DataList'); * * const DataListControl = () => { * const data = useData(); * return ; * } * * interface ComponentControls { * DataList: typeof DataListControl; * } * * function Component( * controls?: T * ) { * function ConnectedComponent({ * children, * }: { children?: React.ReactNode }) { * return ( * * {children} * * ); * } * * return ConnectedComponent; * } * ``` */ export function ControlsProvider({ controls, ...props }: { children?: React.ReactNode; controls?: T; }): React.JSX.Element { return ; } /** * @internal @unstable * * @note reference `ControlsProvider` for example usage */ export function withControls< T extends React.ComponentType, K extends keyof Controls, >(Default: T, name: K): (props: React.ComponentProps) => React.JSX.Element { const Component = (props: React.ComponentProps) => { const Override = React.useContext(ControlsContext)?.[name]; if (isComponent(Override)) { return ; } return ; }; Component.displayName = name; return Component; }