UNPKG

react-async-states

Version:

A low-level multi paradigm state management library

154 lines (151 loc) 10.5 kB
import * as React from 'react'; import { State, Source, Producer, InitialState, PendingState, SuccessState, ErrorState, AbortFn, LastSuccessSavedState, CachedState, ProducerSavedProps, ProducerConfig } from 'async-states'; type UseAsyncState<TData, TArgs extends unknown[] = unknown[], TError = Error, S = State<TData, TArgs, TError>> = LegacyHookReturn<TData, TArgs, TError, S>; type EqualityFn<TData> = (prev: TData, next: TData) => boolean; interface BaseConfig<TData, TArgs extends unknown[], TError> extends ProducerConfig<TData, TArgs, TError> { key?: string; lane?: string; concurrent?: boolean; source?: Source<TData, TArgs, TError>; autoRunArgs?: TArgs; producer?: Producer<TData, TArgs, TError>; subscriptionKey?: string; payload?: Record<string, unknown>; events?: UseAsyncStateEvents<TData, TArgs, TError>; lazy?: boolean; condition?: boolean | ((state: State<TData, TArgs, TError>, args?: TArgs, payload?: Record<string, unknown> | null) => boolean); useServerState?: boolean; } interface ConfigWithKeyWithSelector<TData, TArgs extends unknown[], TError, S> extends ConfigWithKeyWithoutSelector<TData, TArgs, TError> { selector: UseSelector<TData, TArgs, TError, S>; areEqual?: EqualityFn<S>; } interface ConfigWithKeyWithoutSelector<TData, TArgs extends unknown[], TError> extends BaseConfig<TData, TArgs, TError> { key: string; } interface ConfigWithSourceWithSelector<TData, TArgs extends unknown[], TError, S> extends ConfigWithSourceWithoutSelector<TData, TArgs, TError> { selector: UseSelector<TData, TArgs, TError, S>; areEqual?: EqualityFn<S>; useServerState?: boolean; } interface ConfigWithSourceWithoutSelector<TData, TArgs extends unknown[], TError> extends BaseConfig<TData, TArgs, TError> { source: Source<TData, TArgs, TError>; useServerState?: boolean; } interface ConfigWithProducerWithSelector<TData, TArgs extends unknown[], TError, S> extends ConfigWithProducerWithoutSelector<TData, TArgs, TError> { selector: UseSelector<TData, TArgs, TError, S>; areEqual?: EqualityFn<S>; } interface ConfigWithProducerWithoutSelector<TData, TArgs extends unknown[], TError> extends BaseConfig<TData, TArgs, TError> { producer?: Producer<TData, TArgs, TError>; } type MixedConfig<TData, TArgs extends unknown[], TError, S = State<TData, TArgs, TError>> = string | undefined | Source<TData, TArgs, TError> | Producer<TData, TArgs, TError> | ConfigWithKeyWithSelector<TData, TArgs, TError, S> | ConfigWithKeyWithoutSelector<TData, TArgs, TError> | ConfigWithSourceWithSelector<TData, TArgs, TError, S> | ConfigWithSourceWithoutSelector<TData, TArgs, TError> | ConfigWithProducerWithSelector<TData, TArgs, TError, S> | ConfigWithProducerWithoutSelector<TData, TArgs, TError>; type UseAsyncChangeEventProps<TData, TArgs extends unknown[], TError> = UseAsyncStateEventPropsInitial<TData, TArgs, TError> | UseAsyncStateEventPropsPending<TData, TArgs, TError> | UseAsyncStateEventPropsSuccess<TData, TArgs, TError> | UseAsyncStateEventPropsError<TData, TArgs, TError>; type UseAsyncStateEventPropsInitial<TData, TArgs extends unknown[], TError> = { state: InitialState<TData, TArgs>; source: Source<TData, TArgs, TError>; }; type UseAsyncStateEventPropsPending<TData, TArgs extends unknown[], TError> = { state: PendingState<TData, TArgs, TError>; source: Source<TData, TArgs, TError>; }; type UseAsyncStateEventPropsSuccess<TData, TArgs extends unknown[], TError> = { state: SuccessState<TData, TArgs>; source: Source<TData, TArgs, TError>; }; type UseAsyncStateEventPropsError<TData, TArgs extends unknown[], TError> = { state: ErrorState<TData, TArgs, TError>; source: Source<TData, TArgs, TError>; }; type UseAsyncStateEvents<TData, TArgs extends unknown[], TError> = { change?: UseAsyncStateEventFn<TData, TArgs, TError> | UseAsyncStateEventFn<TData, TArgs, TError>[]; subscribe?: HookSubscribeEvents<TData, TArgs, TError>; }; type UseAsyncStateChangeEventHandler<TData, TArgs extends unknown[], TError> = UseAsyncChangeEventInitial<TData, TArgs, TError> | UseAsyncChangeEventSuccess<TData, TArgs, TError> | UseAsyncChangeEventPending<TData, TArgs, TError> | UseAsyncStateChangeEventHandlerError<TData, TArgs, TError>; type UseAsyncChangeEventInitial<TData, TArgs extends unknown[], TError> = (props: UseAsyncStateEventPropsInitial<TData, TArgs, TError>) => void; type UseAsyncChangeEventSuccess<TData, TArgs extends unknown[], TError> = (props: UseAsyncStateEventPropsSuccess<TData, TArgs, TError>) => void; type UseAsyncChangeEventPending<TData, TArgs extends unknown[], TError> = (props: UseAsyncStateEventPropsPending<TData, TArgs, TError>) => void; type UseAsyncStateChangeEventHandlerError<TData, TArgs extends unknown[], TError> = (props: UseAsyncStateEventPropsError<TData, TArgs, TError>) => void; type UseAsyncStateEventFn<TData, TArgs extends unknown[], TError> = UseAsyncStateChangeEvent<TData, TArgs, TError> | UseAsyncStateChangeEventHandler<TData, TArgs, TError>; type UseAsyncStateChangeEvent<TData, TArgs extends unknown[], TError> = UseAsyncStateChangeEventInitial<TData, TArgs, TError> | UseAsyncStateChangeEventPending<TData, TArgs, TError> | UseAsyncStateChangeEventSuccess<TData, TArgs, TError> | UseAsyncStateChangeEventError<TData, TArgs, TError>; type UseAsyncStateChangeEventInitial<TData, TArgs extends unknown[], TError> = { status: "initial"; handler: UseAsyncChangeEventInitial<TData, TArgs, TError>; }; type UseAsyncStateChangeEventPending<TData, TArgs extends unknown[], TError> = { status: "pending"; handler: UseAsyncChangeEventPending<TData, TArgs, TError>; }; type UseAsyncStateChangeEventSuccess<TData, TArgs extends unknown[], TError> = { status: "success"; handler: UseAsyncChangeEventSuccess<TData, TArgs, TError>; }; type UseAsyncStateChangeEventError<TData, TArgs extends unknown[], TError> = { status: "error"; handler: UseAsyncStateChangeEventHandlerError<TData, TArgs, TError>; }; type HookSubscribeEvents<TData, TArgs extends unknown[], TError> = ((props: SubscribeEventProps<TData, TArgs, TError>) => CleanupFn) | ((props: SubscribeEventProps<TData, TArgs, TError>) => CleanupFn)[]; type UseAsyncStateEventSubscribeFunction<TData, TArgs extends unknown[], TError> = (prevEvents: HookSubscribeEvents<TData, TArgs, TError> | null) => HookSubscribeEvents<TData, TArgs, TError>; type SubscribeEventProps<TData, TArgs extends unknown[], TError> = Source<TData, TArgs, TError>; type UseSelector<TData, TArgs extends unknown[], TError, S> = (currentState: State<TData, TArgs, TError>, lastSuccess: LastSuccessSavedState<TData, TArgs>, cache: { [id: string]: CachedState<TData, TArgs, TError>; } | null) => S; type CleanupFn = AbortFn | (() => void) | undefined; interface BaseHooksReturn<TData, TArgs extends unknown[], TError, S = State<TData, TArgs, TError>> { state: S; source: Source<TData, TArgs, TError>; dataProps: ProducerSavedProps<TData, TArgs>; read(suspend?: boolean, throwError?: boolean): S; isError: boolean; isInitial: boolean; isPending: boolean; isSuccess: boolean; data: TData | null; error: TError | null; Hydrate: () => React.ReactNode; onChange(events: HookChangeEventsFunction<TData, TArgs, TError> | HookChangeEvents<TData, TArgs, TError>): void; onSubscribe(events: UseAsyncStateEventSubscribeFunction<TData, TArgs, TError> | HookSubscribeEvents<TData, TArgs, TError>): void; } interface HookReturnInitial<TData, TArgs extends unknown[], TError, S> extends BaseHooksReturn<TData, TArgs, TError, S> { state: S; isError: false; isInitial: true; isSuccess: false; isPending: false; error: null; data: TData | null; dataProps: ProducerSavedProps<TData, TArgs>; } interface HookReturnSuccess<TData, TArgs extends unknown[], TError, S> extends BaseHooksReturn<TData, TArgs, TError, S> { isError: false; isInitial: false; isSuccess: true; isPending: false; error: null; data: TData; } interface HookReturnError<TData, TArgs extends unknown[], TError, S> extends BaseHooksReturn<TData, TArgs, TError, S> { state: S; isError: true; isInitial: false; isSuccess: false; isPending: false; error: TError; data: TData | null; dataProps: ProducerSavedProps<TData, TArgs>; } interface HookReturnPending<TData, TArgs extends unknown[], TError, S> extends BaseHooksReturn<TData, TArgs, TError, S> { state: S; isError: false; isPending: true; isInitial: false; isSuccess: false; error: TError | null; data: TData | null; dataProps: ProducerSavedProps<TData, TArgs>; } type LegacyHookReturn<TData, TArgs extends unknown[], TError, S = State<TData, TArgs, TError>> = HookReturnInitial<TData, TArgs, TError, S> | HookReturnPending<TData, TArgs, TError, S> | HookReturnSuccess<TData, TArgs, TError, S> | HookReturnError<TData, TArgs, TError, S>; type ModernHookReturn<TData, TArgs extends unknown[], TError, S = State<TData, TArgs, TError>> = HookReturnInitial<TData, TArgs, TError, S> | HookReturnSuccess<TData, TArgs, TError, S>; type HookChangeEvents<TData, TArgs extends unknown[], TError> = UseAsyncStateEventFn<TData, TArgs, TError> | UseAsyncStateEventFn<TData, TArgs, TError>[]; type HookChangeEventsFunction<TData, TArgs extends unknown[], TError> = (prev: HookChangeEvents<TData, TArgs, TError> | null) => HookChangeEvents<TData, TArgs, TError>; export { BaseConfig, BaseHooksReturn, CleanupFn, ConfigWithKeyWithSelector, ConfigWithKeyWithoutSelector, ConfigWithProducerWithSelector, ConfigWithProducerWithoutSelector, ConfigWithSourceWithSelector, ConfigWithSourceWithoutSelector, EqualityFn, HookChangeEvents, HookChangeEventsFunction, HookReturnError, HookReturnInitial, HookReturnPending, HookReturnSuccess, HookSubscribeEvents, LegacyHookReturn, MixedConfig, ModernHookReturn, SubscribeEventProps, UseAsyncChangeEventInitial, UseAsyncChangeEventPending, UseAsyncChangeEventProps, UseAsyncChangeEventSuccess, UseAsyncState, UseAsyncStateChangeEvent, UseAsyncStateChangeEventError, UseAsyncStateChangeEventHandler, UseAsyncStateChangeEventHandlerError, UseAsyncStateChangeEventInitial, UseAsyncStateChangeEventPending, UseAsyncStateChangeEventSuccess, UseAsyncStateEventFn, UseAsyncStateEventPropsError, UseAsyncStateEventPropsInitial, UseAsyncStateEventPropsPending, UseAsyncStateEventPropsSuccess, UseAsyncStateEventSubscribeFunction, UseAsyncStateEvents, UseSelector };