UNPKG

pullstate

Version:

Simple state stores using immer and React hooks

234 lines (233 loc) 11.9 kB
import { IPullstateAllStores } from "./PullstateCore"; import { TUpdateFunction } from "./Store"; type TPullstateAsyncUpdateListener = () => void; export type TPullstateAsyncWatchResponse<R = any, T extends string = string, N = any> = [ boolean, boolean, TAsyncActionResult<R, T, N>, boolean, number ]; export type TPullstateAsyncBeckonResponse<R = any, T extends string = string, N = any> = [ boolean, TAsyncActionResult<R, T, N>, boolean ]; export type TPullstateAsyncRunResponse<R = any, T extends string = string, N = any> = Promise<TAsyncActionResult<R, T, N>>; export interface IPullstateAsyncResultState { [key: string]: TPullstateAsyncWatchResponse<any, string, any>; } export interface IPullstateAsyncActionOrdState { [key: string]: number; } export declare enum EAsyncEndTags { THREW_ERROR = "THREW_ERROR", RETURNED_ERROR = "RETURNED_ERROR", UNFINISHED = "UNFINISHED", DORMANT = "DORMANT" } interface IAsyncActionResultBase<T extends string> { message: string; tags: (EAsyncEndTags | T)[]; } export interface IAsyncActionResultPositive<R, T extends string> extends IAsyncActionResultBase<T> { error: false; payload: R; errorPayload: null; } export interface IAsyncActionResultNegative<T extends string, N = unknown> extends IAsyncActionResultBase<T> { error: true; errorPayload: N; payload: null; } export type TAsyncActionResult<R, T extends string, N> = IAsyncActionResultPositive<R, T> | IAsyncActionResultNegative<T, N>; export type TPullstateAsyncShortCircuitHook<A, R, T extends string, N, S extends IPullstateAllStores> = (inputs: { args: A; stores: S; }) => TAsyncActionResult<R, T, N> | false; export type TPullstateAsyncCacheBreakHook<A, R, T extends string, N, S extends IPullstateAllStores> = (inputs: { args: A; result: TAsyncActionResult<R, T, N>; stores: S; timeCached: number; }) => boolean; export declare enum EPostActionContext { WATCH_HIT_CACHE = "WATCH_HIT_CACHE", BECKON_HIT_CACHE = "BECKON_HIT_CACHE", RUN_HIT_CACHE = "RUN_HIT_CACHE", READ_HIT_CACHE = "READ_HIT_CACHE", READ_RUN = "READ_RUN", SHORT_CIRCUIT = "SHORT_CIRCUIT", DIRECT_RUN = "DIRECT_RUN", BECKON_RUN = "BECKON_RUN", CACHE_UPDATE = "CACHE_UPDATE" } export type TPullstateAsyncPostActionHook<A, R, T extends string, N, S extends IPullstateAllStores> = (inputs: { args: A; result: TAsyncActionResult<R, T, N>; stores: S; context: EPostActionContext; }) => void; export interface IAsyncActionReadOptions<A, R, T extends string, N, S extends IPullstateAllStores> { postActionEnabled?: boolean; cacheBreakEnabled?: boolean; key?: string; cacheBreak?: boolean | number | TPullstateAsyncCacheBreakHook<A, R, T, N, S>; } export interface IAsyncActionBeckonOptions<A, R, T extends string, N, S extends IPullstateAllStores> extends IAsyncActionReadOptions<A, R, T, N, S> { ssr?: boolean; holdPrevious?: boolean; dormant?: boolean; } export interface IAsyncActionWatchOptions<A, R, T extends string, N, S extends IPullstateAllStores> extends IAsyncActionBeckonOptions<A, R, T, N, S> { initiate?: boolean; } export interface IAsyncActionUseOptions<A, R, T extends string, N, S extends IPullstateAllStores> extends IAsyncActionWatchOptions<A, R, T, N, S> { onSuccess?: (result: R, args: A) => void; } export interface IAsyncActionUseDeferOptions<A, R, T extends string, N, S extends IPullstateAllStores> extends Omit<IAsyncActionReadOptions<A, R, T, N, S>, "key"> { key?: string; holdPrevious?: boolean; onSuccess?: (result: R, args: A) => void; clearOnSuccess?: boolean; } export interface IAsyncActionRunOptions<A, R, T extends string, N, S extends IPullstateAllStores> { treatAsUpdate?: boolean; ignoreShortCircuit?: boolean; respectCache?: boolean; key?: string; cacheBreak?: boolean | number | TPullstateAsyncCacheBreakHook<A, R, T, N, S>; _asyncCache?: IPullstateAsyncCache; _stores?: S; _customContext?: any; } export interface IAsyncActionGetCachedOptions<A, R, T extends string, N, S extends IPullstateAllStores> { checkCacheBreak?: boolean; cacheBreak?: boolean | number | TPullstateAsyncCacheBreakHook<A, R, T, N, S>; key?: string; } export interface IGetCachedResponse<R, T extends string, N = any> { started: boolean; finished: boolean; result: TAsyncActionResult<R, T, N>; updating: boolean; existed: boolean; cacheBreakable: boolean; timeCached: number; } export interface IAsyncClearCacheOptions { notify?: boolean; } export interface IAsyncActionSetOrClearCachedValueOptions extends IAsyncClearCacheOptions { key?: string; } export interface IAsyncActionUpdateCachedOptions extends IAsyncActionSetOrClearCachedValueOptions { resetTimeCached?: boolean; runPostActionHook?: boolean; } export type TAsyncActionUse<A, R, T extends string, N, S extends IPullstateAllStores> = (args?: A, options?: IAsyncActionUseOptions<A, R, T, N, S>) => TUseResponse<A, R, T, N, S>; export type TAsyncActionUseDefer<A, R, T extends string, N, S extends IPullstateAllStores> = (options?: IAsyncActionUseDeferOptions<A, R, T, N, S>) => TUseDeferResponse<A, R, T, N, S>; export type TAsyncActionBeckon<A, R, T extends string, N, S extends IPullstateAllStores> = (args?: A, options?: IAsyncActionBeckonOptions<A, R, T, N, S>) => TPullstateAsyncBeckonResponse<R, T, N>; export type TAsyncActionWatch<A, R, T extends string, N, S extends IPullstateAllStores> = (args?: A, options?: IAsyncActionWatchOptions<A, R, T, N, S>) => TPullstateAsyncWatchResponse<R, T, N>; export type TAsyncActionRun<A, R, T extends string, N, S extends IPullstateAllStores> = (args?: A, options?: IAsyncActionRunOptions<A, R, T, N, S>) => TPullstateAsyncRunResponse<R, T, N>; export type TAsyncActionClearCache<A> = (args?: A, options?: IAsyncActionSetOrClearCachedValueOptions) => void; export type TAsyncActionClearAllCache = (options?: IAsyncClearCacheOptions) => void; export type TAsyncActionClearAllUnwatchedCache = (options?: IAsyncClearCacheOptions) => void; export type TAsyncActionGetCached<A, R, T extends string, N, S extends IPullstateAllStores> = (args?: A, options?: IAsyncActionGetCachedOptions<A, R, T, N, S>) => IGetCachedResponse<R, T, N>; export type TAsyncActionSetCached<A, R, T extends string, N> = (args: A, result: TAsyncActionResult<R, T, N>, options?: IAsyncActionSetOrClearCachedValueOptions) => void; export type TAsyncActionSetCachedPayload<A, R> = (args: A, payload: R, options?: IAsyncActionSetOrClearCachedValueOptions) => void; export type TAsyncActionUpdateCached<A, R> = (args: A, updater: TUpdateFunction<R>, options?: IAsyncActionUpdateCachedOptions) => void; export type TAsyncActionRead<A, R, T extends string, N, S extends IPullstateAllStores> = (args?: A, options?: IAsyncActionReadOptions<A, R, T, N, S>) => R; export type TAsyncActionDelayedRun<A, R, T extends string, N, S extends IPullstateAllStores> = (args: A, options: IAsyncActionRunOptions<A, R, T, N, S> & { delay: number; clearOldRun?: boolean; immediateIfCached?: boolean; }) => () => void; export interface IOCreateAsyncActionOutput<A = any, R = any, T extends string = string, N = any, S extends IPullstateAllStores = IPullstateAllStores> { use: TAsyncActionUse<A, R, T, N, S>; useDefer: TAsyncActionUseDefer<A, R, T, N, S>; read: TAsyncActionRead<A, R, T, N, S>; useBeckon: TAsyncActionBeckon<A, R, T, N, S>; useWatch: TAsyncActionWatch<A, R, T, N, S>; run: TAsyncActionRun<A, R, T, N, S>; delayedRun: TAsyncActionDelayedRun<A, R, T, N, S>; getCached: TAsyncActionGetCached<A, R, T, N, S>; setCached: TAsyncActionSetCached<A, R, T, N>; setCachedPayload: TAsyncActionSetCachedPayload<A, R>; updateCached: TAsyncActionUpdateCached<A, R>; clearCache: TAsyncActionClearCache<A>; clearAllCache: TAsyncActionClearAllCache; clearAllUnwatchedCache: TAsyncActionClearAllUnwatchedCache; } export interface IPullstateAsyncCache { results: IPullstateAsyncResultState; listeners: { [key: string]: { [watchId: string]: TPullstateAsyncUpdateListener; }; }; actions: { [key: string]: () => Promise<TAsyncActionResult<any, string, any>>; }; actionOrd: IPullstateAsyncActionOrdState; } export type TPullstateAsyncAction<A, R, T extends string, N, S extends IPullstateAllStores> = (args: A, stores: S, customContext: any) => Promise<TAsyncActionResult<R, T, N>>; export interface ICreateAsyncActionOptions<A, R, T extends string, N, S extends IPullstateAllStores> { forceContext?: boolean; shortCircuitHook?: TPullstateAsyncShortCircuitHook<A, R, T, N, S>; cacheBreakHook?: TPullstateAsyncCacheBreakHook<A, R, T, N, S>; postActionHook?: TPullstateAsyncPostActionHook<A, R, T, N, S>; subsetKey?: (args: A) => any; actionId?: string | number; } export interface IUseDebouncedExecutionOptions<A, R, T extends string, N, S extends IPullstateAllStores> { validInput?: (args: A) => boolean; equality?: ((argsPrev: A, argsNew: A) => boolean) | any; executeOptions?: Omit<IAsyncActionRunOptions<A, R, T, N, S>, "key" | "cacheBreak">; watchLastValid?: boolean; } export type TRunWithPayload<R> = (func: (payload: R) => any) => any; export interface IBaseObjResponseUse<A, R, T extends string, N, S extends IPullstateAllStores> { execute: (runOptions?: IAsyncActionRunOptions<A, R, T, N, S>) => TPullstateAsyncRunResponse<R, T, N>; } export interface IBaseObjResponseUseDefer<A, R, T extends string, N, S extends IPullstateAllStores> { execute: (args?: A, runOptions?: Omit<IAsyncActionRunOptions<A, R, T, N, S>, "key" | "cacheBreak">) => TPullstateAsyncRunResponse<R, T, N>; hasCached: (args?: A, options?: { successOnly?: boolean; } & Omit<IAsyncActionGetCachedOptions<A, R, T, N, S>, "key">) => boolean; unwatchExecuted: () => void; useDebouncedExecution: (args: A, delay: number, options?: IUseDebouncedExecutionOptions<A, R, T, N, S>) => void; args: A; key: string; } export interface IBaseObjResponse<R, T extends string, N> { isLoading: boolean; isFinished: boolean; isUpdating: boolean; isStarted: boolean; clearCached: () => void; updateCached: (updater: TUpdateFunction<R>, options?: IAsyncActionUpdateCachedOptions) => void; setCached: (result: TAsyncActionResult<R, T, N>, options?: IAsyncActionSetOrClearCachedValueOptions) => void; setCachedPayload: (payload: R, options?: IAsyncActionSetOrClearCachedValueOptions) => void; endTags: (T | EAsyncEndTags)[]; renderPayload: TRunWithPayload<R>; message: string; raw: TPullstateAsyncWatchResponse<R, T, N>; } export interface IBaseObjSuccessResponse<R, T extends string, N> extends IBaseObjResponse<R, T, N> { payload: R; errorPayload: null; error: false; isSuccess: true; isFailure: false; } export interface IBaseObjErrorResponse<R, T extends string, N> extends IBaseObjResponse<R, T, N> { payload: null; errorPayload: N; error: true; isFailure: true; isSuccess: false; } export type TUseResponse<A = any, R = any, T extends string = string, N = any, S extends IPullstateAllStores = IPullstateAllStores> = (IBaseObjSuccessResponse<R, T, N> | IBaseObjErrorResponse<R, T, N>) & IBaseObjResponseUse<A, R, T, N, S>; export type TUseDeferResponse<A = any, R = any, T extends string = string, N = any, S extends IPullstateAllStores = IPullstateAllStores> = (IBaseObjSuccessResponse<R, T, N> | IBaseObjErrorResponse<R, T, N>) & IBaseObjResponseUseDefer<A, R, T, N, S>; export {};