ariakit-react-utils
Version:
Ariakit React utils
80 lines (79 loc) • 2.85 kB
TypeScript
import { Context, ReactElement } from "react";
import { BivariantCallback } from "ariakit-utils/types";
import { Options, Props, WrapElement } from "./types";
declare type StateFilterFn<T> = BivariantCallback<(nextState: T) => unknown>;
declare type StateFilterDeps<T> = Array<StateFilterFn<T> | keyof NonNullable<T>>;
declare type StateFilter<T> = StateFilterDeps<T> | StateFilterFn<T>;
/**
* Creates a context that can be passed to `useStore` and `useStoreProvider`.
*/
export declare function createStoreContext<T>(): Context<T | undefined>;
/**
* Creates a type-safe component with the `as` prop, `state` prop,
* `React.forwardRef` and `React.memo`.
*
* @example
* import { Options, createMemoComponent } from "ariakit-react-utils/store";
*
* type Props = Options<"div"> & {
* state?: { customProp: boolean };
* };
*
* const Component = createMemoComponent<Props>(
* ({ state, ...props }) => <div {...props} />
* );
*
* <Component as="button" state={{ customProp: true }} />
*/
export declare function createMemoComponent<O extends Options & {
state?: unknown;
}>(render: (props: Props<O>) => ReactElement, propsAreEqual?: (prev: Props<O>, next: Props<O>) => boolean): import("./types").Component<O>;
/**
* Returns props with a `wrapElement` function that wraps an element with a
* React Context Provider that provides a store context to consumers.
* @example
* import * as React from "react";
* import { useStoreProvider } from "ariakit-react-utils/store";
*
* const StoreContext = createStoreContext();
*
* function Component({ state, ...props }) {
* const { wrapElement } = useStoreProvider({ state, ...props }, StoreContext);
* return wrapElement(<div {...props} />);
* }
*/
export declare function useStoreProvider<P, S>({ state, ...props }: P & {
state?: S;
wrapElement?: WrapElement;
}, context: Context<S>): Omit<P & {
state?: S | undefined;
wrapElement?: WrapElement | undefined;
}, "state"> & {
wrapElement: WrapElement;
};
/**
* Adds publishing capabilities to state so it can be passed to `useStore` or
* `useStoreProvider` later.
* @example
* import { useStorePublisher } from "ariakit-react-utils/store";
*
* function useComponentState() {
* const state = React.useMemo(() => ({ a: "a" }), []);
* return useStorePublisher(state);
* }
*/
export declare function useStorePublisher<T>(state: T): T;
/**
* Handles state updates on the state or context state passed as the first
* argument based on the filter argument.
* @example
* import { useStore } from "ariakit-react-utils/store";
*
* const ContextState = createContextState();
*
* function Component({ state }) {
* state = useStore(state || ContextState, ["stateProp"]);
* }
*/
export declare function useStore<T>(stateOrContext: T | Context<T>, filter?: StateFilter<T>): any;
export {};