@lens-protocol/react
Version:
Interacting with the Lens Protocol API using React.
96 lines (95 loc) • 3 kB
TypeScript
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>;