UNPKG

@airma/react-effect

Version:

This is a react async state management tool

681 lines (614 loc) 18.8 kB
import type { Model, ModelKey, Store, StoreIndex } from '@airma/react-state'; import type { ReactNode, ComponentType, LazyExoticComponent, ExoticComponent } from 'react'; import type { SessionRequest } from './src/libs/type'; export declare type ModelKeys = ModelKey<any> | StoreIndex; declare type TriggerType = 'mount' | 'update' | 'manual'; declare type SessionType = 'query' | 'mutation'; declare interface AbstractSessionState { data: unknown; payload?: unknown; stale?: { data: unknown }; error?: any; isError: boolean; isFetching: boolean; fetchingKey?: unknown; finalFetchingKey?: unknown; abandon: boolean; triggerType: undefined | TriggerType; loaded: boolean; sessionLoaded: boolean; uniqueKey: unknown; variables: any[] | undefined; round: number; visited: boolean; lastSuccessfulRound: number; lastSuccessfulRoundVariables: any[] | undefined; lastFailedRound: number; lastFailedRoundVariables: any[] | undefined; online: boolean; } export declare interface LoadedSessionState<T, V> extends AbstractSessionState { data: T; variables: V; lastSuccessfulRoundVariables: V; lastFailedRoundVariables: V | undefined; loaded: true; } export declare interface UnloadedSessionState extends AbstractSessionState { data: undefined; variables: undefined; lastSuccessfulRoundVariables: undefined; lastFailedRoundVariables: undefined; loaded: false; } export declare interface ErrorSessionState extends AbstractSessionState { isError: true; } export declare type SessionState<T = any, V extends any[] = any[]> = | LoadedSessionState<T, V> | UnloadedSessionState; export declare interface SessionInstance<T = any> { state: SessionState<T>; request: SessionRequest | undefined; setState: ( s: SessionState<T> ) => SessionState<T> & { request?: SessionRequest }; trigger: () => SessionState<T> & { request?: SessionRequest }; execute: (variables: any[]) => SessionState<T> & { request?: SessionRequest }; } export interface SessionToken { abandon: (tokens?: SessionToken[]) => any; silence: () => any; } export declare interface StrategyType<T = any, V extends any[] = any[]> { (runtime: { getSessionState: () => SessionState<T, V>; getSessionToken: () => SessionToken; abandon: (data?: SessionState<T, V>) => SessionState<T, V>; variables: V; triggerType: TriggerType; runner: ( setFetchingSessionState?: (s: SessionState<T, V>) => SessionState<T, V> ) => Promise<SessionState<T, V>>; localCache: { current: any }; executeContext: { set: (key: any, value: any) => void; get: (key: any) => any; }; }): Promise<SessionState<T, V>>; effect?: | (( state: SessionState<T, V>, prevState: SessionState<T, V> ) => void | (() => void)) | [ ( state: SessionState<T, V>, prevState: SessionState<T, V> ) => void | (() => void), (state: SessionState<T, V>, prevState: SessionState<T, V>) => boolean ]; } declare type PromiseCallback<T> = (...params: any[]) => Promise<T>; export declare type SessionKey<E extends PromiseCallback<any>> = ModelKey< Model, undefined > & { sessionPayload: [E, { sessionType?: SessionType }]; }; export declare type SessionStore<E extends PromiseCallback<any>> = Store< Model, undefined > & { sessionPayload: [E, { sessionType?: SessionType }]; }; export declare interface QuerySessionKey<E extends PromiseCallback<any>> extends SessionKey<E> { sessionPayload: [E, { sessionType?: 'query' }]; } export declare interface MutationSessionKey<E extends PromiseCallback<any>> extends SessionKey<E> { sessionPayload: [E, { sessionType?: 'mutation' }]; } export declare interface QuerySessionStore<E extends PromiseCallback<any>> extends SessionStore<E> { sessionPayload: [E, { sessionType?: 'query' }]; } export declare interface MutationSessionStore<E extends PromiseCallback<any>> extends SessionStore<E> { sessionPayload: [E, { sessionType?: 'mutation' }]; } declare interface StrategyConfig<T = any, V extends any[] = any[]> { list: (StrategyType<T, V> | null | undefined)[]; withoutWrapper?: boolean; withoutDefault?: boolean; } declare type StrategyCollectionType<T = any, V extends any[] = any[]> = | undefined | null | StrategyType<T, V> | StrategyConfig<T, V> | (StrategyType<T, V> | null | undefined)[]; declare type QueryConfig<T, C extends PromiseCallback<T>> = { deps?: any[]; triggerOn?: TriggerType[]; variables?: Parameters<C>; strategy?: StrategyCollectionType<T, Parameters<C>>; ignoreStrategyWrapper?: boolean; manual?: boolean; payload?: unknown; }; declare type DefaultQueryConfig<T, C extends PromiseCallback<T>> = QueryConfig< T, C > & ( | { defaultData: T; } | { defaultData?: T; loaded: true; } ); declare type MutationConfig<T, C extends PromiseCallback<T>> = { deps?: any[]; triggerOn?: TriggerType[]; variables?: Parameters<C>; strategy?: StrategyCollectionType<T, Parameters<C>>; ignoreStrategyWrapper?: boolean; payload?: unknown; }; declare type DefaultMutationConfig< T, C extends PromiseCallback<T> > = MutationConfig<T, C> & ( | { defaultData: T; } | { defaultData?: T; loaded: true; } ); declare interface SessionCreation<E extends PromiseCallback<any>> extends StoreIndex<(state: SessionState) => SessionInstance, undefined> { key: SessionKey<E>; } declare type PCR< T extends | PromiseCallback<any> | SessionKey<any> | SessionStore<any> | SessionCreation<any> > = T extends SessionKey<infer C> ? PCR<C> : T extends PromiseCallback<infer R> ? R : T extends SessionStore<infer S> ? PCR<S> : T extends SessionCreation<infer L> ? PCR<L> : never; declare type MCC< T extends | PromiseCallback<any> | SessionKey<any> | SessionStore<any> | SessionCreation<any> > = T extends SessionKey<infer C> ? C : T extends PromiseCallback<any> ? T : T extends SessionStore<infer S> ? S : T extends SessionCreation<infer L> ? L : never; declare type LoadedSessionResult< D extends | PromiseCallback<any> | SessionKey<any> | SessionStore<any> | SessionCreation<any> > = [ LoadedSessionState<PCR<D>, Parameters<MCC<D>>>, { (): Promise<LoadedSessionState<PCR<D>, Parameters<MCC<D>>>>; payload: ( payloadData: unknown | undefined ) => () => Promise<LoadedSessionState<PCR<D>, Parameters<MCC<D>>>>; }, { ( ...variables: Parameters<MCC<D>> ): Promise<LoadedSessionState<PCR<D>, Parameters<MCC<D>>>>; payload: ( payloadData: unknown | undefined ) => ( ...variables: Parameters<MCC<D>> ) => Promise<LoadedSessionState<PCR<D>, Parameters<MCC<D>>>>; } ]; declare type SessionResult< D extends | PromiseCallback<any> | SessionKey<any> | SessionStore<any> | SessionCreation<any> > = [ SessionState<PCR<D>, Parameters<MCC<D>>>, { (): Promise<SessionState<PCR<D>, Parameters<MCC<D>>>>; payload: ( payloadData: unknown | undefined ) => () => Promise<SessionState<PCR<D>, Parameters<MCC<D>>>>; }, { ( ...variables: Parameters<MCC<D>> ): Promise<SessionState<PCR<D>, Parameters<MCC<D>>>>; payload: ( payloadData: unknown | undefined ) => ( ...variables: Parameters<MCC<D>> ) => Promise<SessionState<PCR<D>, Parameters<MCC<D>>>>; } ]; declare type AbstractSessionResult = [ SessionState, () => any, ((...variables: any[]) => Promise<SessionState>)? ]; export declare function useQuery< D extends | PromiseCallback<any> | SessionKey<any> | SessionStore<any> | SessionCreation<any> >( callback: D, config: DefaultQueryConfig<PCR<D>, MCC<D>> ): D extends MutationSessionKey<any> | MutationSessionStore<any> ? never : LoadedSessionResult<D>; export declare function useQuery< D extends | PromiseCallback<any> | SessionKey<any> | SessionStore<any> | SessionCreation<any> >( callback: D, config?: QueryConfig<PCR<D>, MCC<D>> | Parameters<MCC<D>> ): D extends MutationSessionKey<any> | MutationSessionStore<any> ? never : SessionResult<D>; export declare function useMutation< D extends | PromiseCallback<any> | SessionKey<any> | SessionStore<any> | SessionCreation<any> >( callback: D, config: DefaultMutationConfig<PCR<D>, MCC<D>> ): D extends QuerySessionKey<any> | QuerySessionStore<any> ? never : LoadedSessionResult<D>; export declare function useMutation< D extends | PromiseCallback<any> | SessionKey<any> | SessionStore<any> | SessionCreation<any> >( callback: D, config?: MutationConfig<PCR<D>, MCC<D>> | Parameters<MCC<D>> ): D extends QuerySessionKey<any> | QuerySessionStore<any> ? never : SessionResult<D>; declare interface UseSessionConfig { sessionType?: SessionType; } declare interface LoadedUseSessionConfig extends UseSessionConfig { loaded: true; } declare interface UnloadedUseSessionConfig extends UseSessionConfig { loaded?: false; } export declare function useSession< D extends SessionKey<any> | SessionStore<any> | SessionCreation<any> >(sessionKeyOrStore: D, config: LoadedUseSessionConfig): LoadedSessionResult<D>; export declare function useSession< D extends SessionKey<any> | SessionStore<any> | SessionCreation<any> >(sessionKeyOrStore: D, config: SessionType): SessionResult<D>; export declare function useSession< D extends SessionKey<any> | SessionStore<any> | SessionCreation<any> >(sessionKeyOrStore: D, config?: UnloadedUseSessionConfig): SessionResult<D>; export declare function useSession< D extends SessionKey<any> | SessionStore<any> | SessionCreation<any> >( sessionKeyOrStore: D, config?: { loaded?: boolean; sessionType?: SessionType } | SessionType ): SessionResult<D>; export declare function useLoadedSession< D extends SessionKey<any> | SessionStore<any> | SessionCreation<any> >( sessionKeyOrStore: D, config?: UseSessionConfig | SessionType ): LoadedSessionResult<D>; export declare function createSessionKey< E extends (...params: any[]) => Promise<any> >(effectCallback: E): SessionKey<E>; export declare function createSessionKey< E extends (...params: any[]) => Promise<any> >(effectCallback: E, sessionType: 'query'): QuerySessionKey<E>; export declare function createSessionKey< E extends (...params: any[]) => Promise<any> >(effectCallback: E, sessionType: 'mutation'): MutationSessionKey<E>; export declare function createSessionStore< E extends (...params: any[]) => Promise<any> >(effectCallback: E): SessionStore<E>; export declare function createSessionStore< E extends (...params: any[]) => Promise<any> >(effectCallback: E, sessionType: 'query'): QuerySessionStore<E>; export declare function createSessionStore< E extends (...params: any[]) => Promise<any> >(effectCallback: E, sessionType: 'mutation'): MutationSessionStore<E>; export declare function useIsFetching( ...sessionStates: (AbstractSessionState | AbstractSessionResult)[] ): boolean; declare type LazyComponentSupportType<P> = | ComponentType<P> | ExoticComponent<P>; declare type CheckLazyComponentSupportType< T extends LazyComponentSupportType<any> > = T extends LazyComponentSupportType<infer P> ? P extends { error?: ErrorSessionState } ? LazyExoticComponent<T> : never : never; export declare function useLazyComponent< T extends LazyComponentSupportType<any> >( componentLoader: () => Promise<T | { default: T }>, ...deps: (AbstractSessionState | AbstractSessionResult)[] ): CheckLazyComponentSupportType<T>; declare type ImportantVariable<T extends SessionState> = Omit< T, 'variables' > & { variables: Exclude<T['variables'], undefined>; }; declare type SuccessStateOf<T extends SessionState> = Omit< T, 'variables' | 'data' > & { variables: Exclude<T['variables'], undefined>; data: Exclude<T['data'], undefined>; }; declare type ResponseOption = { watchOnly?: boolean }; export declare const useResponse: { <T extends SessionState>( process: (state: ImportantVariable<T>) => void | (() => void), sessionState: T | [T, ResponseOption?] ): void; useSuccess: <T extends SessionState>( process: ( data: SuccessStateOf<T>['data'], sessionState: SuccessStateOf<T> ) => void | (() => void), sessionState: T | [T, ResponseOption?] ) => void; useFailure: <T extends SessionState>( process: ( error: unknown, sessionState: ImportantVariable<T> ) => void | (() => void), sessionState: T | [T, ResponseOption?] ) => void; }; export declare const Provider: FC<{ value: | Array< | StoreIndex<Model, any> | ModelKey<Model, any> | Record<string, StoreIndex<Model, any>> | Record<string, ModelKey<Model, any>> > | Record<string, StoreIndex<Model, any>> | Record<string, ModelKey<Model, any>>; children?: ReactNode; }>; export declare type GlobalConfig = { batchUpdate?: (callback: () => void) => void; experience?: 'next'; test?: { act: (callback: () => any) => any; }; strategy?: ( strategy: (StrategyType | null | undefined)[], type: SessionType ) => (StrategyType | null | undefined)[]; }; export declare const ConfigProvider: FC<{ value: GlobalConfig; children?: ReactNode; }>; export declare type HostStage = 'mounted' | 'unmounted'; export declare const Strategy: { atomic: <T = any, V extends any[] = any[]>(op?: { throttle?: boolean; stopWhenError?: boolean; }) => StrategyType<T, V>; cache: <T = any, V extends any[] = any[]>(op?: { key?: (vars: V) => string; staleTime?: number; capacity?: number; static?: boolean; }) => StrategyType<T, V>; debounce: <T = any, V extends any[] = any[]>( op: { duration: number; lead?: boolean } | number ) => StrategyType<T, V>; /** * @deprecated * @param op */ throttle: <T = any, V extends any[] = any[]>( op?: { duration: number } | number ) => StrategyType<T, V>; once: <T = any, V extends any[] = any[]>() => StrategyType<T, V>; failure: <T = any, V extends any[] = any[]>( process: ( e: unknown, sessionData: ImportantVariable<SessionState<T, V>> ) => any, option?: { withAbandoned?: boolean } ) => StrategyType<T, V>; success: <T = any, V extends any[] = any[]>( process: (data: T, sessionData: SuccessStateOf<SessionState<T, V>>) => any, option?: { withAbandoned?: boolean } ) => StrategyType<T, V>; validate: <T = any, V extends any[] = any[]>( process: ( variables: V, isOnline: () => boolean ) => boolean | Promise<boolean> ) => StrategyType<T, V>; memo: <T = any, V extends any[] = any[]>( equalFn?: (source: T | undefined, target: T) => boolean ) => StrategyType<T, V>; reduce: <T = any, V extends any[] = any[]>( call: ( previous: T | undefined, currentData: T, states: [ SessionState<T | undefined, V>, SuccessStateOf<SessionState<T, V>> ] ) => T | undefined ) => StrategyType<T, V>; response: { <T = any, V extends any[] = any[]>( process: ( state: ImportantVariable<SessionState<T, V>> ) => void | (() => void) ): StrategyType<T, V>; success: <T = any, V extends any[] = any[]>( process: ( data: T, sessionData: SuccessStateOf<SessionState<T, V>> ) => void | (() => void) ) => StrategyType<T, V>; failure: <T = any, V extends any[] = any[]>( process: ( e: unknown, sessionData: ImportantVariable<SessionState<T, V>> ) => void | (() => void) ) => StrategyType<T, V>; }; }; export declare function provide( ...storeCreators: ( | StoreIndex<Model, any> | ModelKey<Model, any> | Record<string, StoreIndex<Model, any>> | Record<string, ModelKey<Model, any>> | Record<number, StoreIndex<Model, any>> | Record<number, ModelKey<Model, any>> )[] ): { <P extends Record<string, any>>( component: ComponentType<P> | ExoticComponent<P> ): typeof component; to: <P extends Record<string, any>>( component: ComponentType<P> | ExoticComponent<P> ) => typeof component; }; /** new api * */ declare interface DefaultDataQueryConfig<T, C extends PromiseCallback<T>> extends QueryConfig<T, C> { defaultData: T; } declare type UseQueryShort< D extends PromiseCallback<any> | SessionKey<any> | SessionStore<any> > = < C extends | QueryConfig<PCR<D>, MCC<D>> | Parameters<MCC<D>> | DefaultQueryConfig<PCR<D>, MCC<D>> >( config?: C ) => C extends DefaultQueryConfig<PCR<D>, MCC<D>> ? LoadedSessionResult<D> : SessionResult<D>; declare type UseMutationShort< D extends PromiseCallback<any> | SessionKey<any> | SessionStore<any> > = < C extends | MutationConfig<PCR<D>, MCC<D>> | Parameters<MCC<D>> | DefaultMutationConfig<PCR<D>, MCC<D>> >( config?: C ) => C extends DefaultMutationConfig<PCR<D>, MCC<D>> ? LoadedSessionResult<D> : SessionResult<D>; declare type UseSessionShort<D extends PromiseCallback<any>> = () => SessionResult<D>; declare type UseLoadedSessionShort<D extends PromiseCallback<any>> = () => LoadedSessionResult<D>; declare interface SessionKeyApi<D extends PromiseCallback<any>> extends SessionCreation<D> { useSession: UseSessionShort<D>; useLoadedSession: UseLoadedSessionShort<D>; } declare interface SessionStoreApi<D extends PromiseCallback<any>> extends SessionCreation<D> { useSession: UseSessionShort<D>; useLoadedSession: UseLoadedSessionShort<D>; } declare interface QueryKeyApi<D extends PromiseCallback<any>> extends SessionKeyApi<D> { useQuery: UseQueryShort<D>; } declare interface QueryStoreApi<D extends PromiseCallback<any>> extends SessionStoreApi<D> { useQuery: UseQueryShort<D>; } declare interface MutationKeyApi<D extends PromiseCallback<any>> extends SessionKeyApi<D> { useMutation: UseMutationShort<D>; } declare interface MutationStoreApi<D extends PromiseCallback<any>> extends SessionStoreApi<D> { useMutation: UseMutationShort<D>; } export declare function session<D extends PromiseCallback<any>>( sessionCallback: D, sessionType: 'query' ): { (...p: Parameters<D>): ReturnType<D>; useQuery: UseQueryShort<D>; createStore: () => QueryStoreApi<D>; createKey: () => QueryKeyApi<D>; }; export declare function session<D extends PromiseCallback<any>>( sessionCallback: D, sessionType: 'mutation' ): { (...p: Parameters<D>): ReturnType<D>; useMutation: UseMutationShort<D>; createStore: () => MutationStoreApi<D>; createKey: () => MutationKeyApi<D>; };