import type { Draft } from 'immer'; export interface BaseAction { onError?: (info: { error: E; arg: Arg; }) => void; onSuccess?: (info: { data: D; arg: Arg; }) => void; } export interface Action extends BaseAction { fetchData: (arg: Arg, context: { getState: () => S; }) => Promise; syncState: (draft: Draft, payload: { arg: Arg; data: Data; }) => void; } export interface InfiniteAction extends BaseAction { fetchData: (arg: Arg, context: { previousData: Data | null; pageIndex: number; getState: () => S; }) => Promise; syncState: (draft: Draft, payload: { data: Data; arg: Arg; pageSize: number; pageIndex: number; }) => void; } export type Subscribe = (listener: () => void) => () => void; export interface BaseConstructorArgs { arg: Arg; updateState: UpdateModelState; getState: (serverStateKey?: object) => S; subscribeModel: Subscribe; notifyModel: () => void; onMount: () => void; onUnmount: () => void; setStaleTime: (staleTime: number) => void; getIsStale: () => boolean; isAuto: boolean; creatorName: string; } export interface ConstructorArgs extends BaseConstructorArgs { action: Action; } export interface InfiniteConstructorArgs extends BaseConstructorArgs { action: InfiniteAction; data: Data[]; } export type NotifyDatabaseContext = { serverStateKey: object; modelName: string; creatorName: string; data: any; arg?: any; pageSize?: number; pageIndex?: number; }; export type UpdateModelStateContext = { serverStateKey?: object; creatorName?: string; data?: any; arg?: any; pageSize?: number; pageIndex?: number; }; export type UpdateModelState = (cb: (draft: Draft) => void, context: UpdateModelStateContext) => void;