react-async-states
Version:
A low-level multi paradigm state management library
154 lines (151 loc) • 10.5 kB
TypeScript
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 };