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