UNPKG

@lens-protocol/react

Version:

Interacting with the Lens Protocol API using React.

96 lines (95 loc) 3 kB
import { IEquatableError, PromiseResult } from '@lens-protocol/shared-kernel'; /** * An deferrable task is a function that can be executed multiple times and that can be in a pending state. * * @internal */ export type DeferrableTask<TValue, TError extends IEquatableError = never, TInput = void> = (input: TInput) => PromiseResult<TValue, TError>; /** * The initial state of a deferred task. */ export type DeferredTaskIdle = { called: boolean; loading: false; data: undefined; error: undefined; }; /** * The state of a deferred task during the loading. */ export type DeferredTaskLoading<TData> = { called: true; loading: true; data: TData | undefined; error: undefined; }; /** * The state of a deferred task after a successful call. */ export type DeferredTaskSuccess<TData> = { called: true; loading: false; data: TData; error: undefined; }; /** * The state of a deferred task after a failed call. */ export type DeferredTaskFailed<TError extends IEquatableError> = { called: true; loading: false; data: undefined; error: TError; }; /** * @deprecated Use DeferredTaskLoading instead. Removal slated for v2.0.0. */ export type DeferredTaskFirstCall = DeferredTaskLoading<unknown>; /** * @deprecated Use DeferredTaskLoading instead. Removal slated for v2.0.0. */ export type DeferredTaskNthCall<TData> = DeferredTaskLoading<TData>; /** * The possible statuses of a deferred task. */ export type DeferredTaskState<TData, TError extends IEquatableError> = DeferredTaskIdle | DeferredTaskLoading<TData> | DeferredTaskSuccess<TData> | DeferredTaskFailed<TError>; /** * A deferred task React Hook is a lightweight wrapper for an asynchronous function. * It allows tracking of the task's execution status and provides access to the * last error that occurred during the task's execution, if any. * * ```ts * const { called, loading, data, error, execute }: UseDeferredTask<TData, TError, TInput> = useAnyDeferredTask(); * * if (!called) { * // data === undefined * // error === undefined * return <p>Click the button to execute the task</p>; * } * * if (loading) { * // data === undefined on first call * // data === TData from previous successful call * // error === undefined * return <Loader />; * } * * if (error) { * // data === undefined * // error === TError * return <p>Something went wrong: {error.message}</p>; * } * * // called === true * // data === TData * // error === undefined * return <p>Task completed: {data}</p>; * ``` */ export type UseDeferredTask<TData = void, TError extends IEquatableError = never, TInput = void, TResultValue = TData> = DeferredTaskState<TData, TError> & { execute: DeferrableTask<TResultValue, TError, TInput>; }; /** * @internal */ export declare function useDeferredTask<TData, TError extends IEquatableError, TInput = never>(handler: DeferrableTask<TData, TError, TInput>): UseDeferredTask<TData, TError, TInput>;