import type { Status } from '../../types/mod.ts'; /** State of `useQuery` hook. */ export interface QueryState { /** Current status of query. */ status: Status; /** Data since last fetch. */ data: null | T; /** Error since last failed query. */ error: null | unknown; } /** Options of `useQuery` hook. */ export interface UseQueryOptions { key?: string; /** Query implementation. */ query: (ctx: QueryContext) => Promise; /** If false is passed the request will not be executed. */ enabled?: boolean; } /** Return value type of `useQuery` hook. */ export interface UseQueryReturn extends QueryState { /** Trigger for forcing refetch data. */ invalidate: () => void; } /** Options of `useMutation` hook. */ export interface UseMutationOptions { key?: string; /** Mutation implementation. */ mutation: (payload: T) => Promise; /** Callback that will be called after mutation is done. */ onSuccess?: (data: R) => void; /** Callback that will be called after mutation is failed. */ onError?: (error: unknown) => void; } /** Result value type of `useMutation` hook. */ export interface UseMutationReturn extends QueryState { /** Starts a mutation. */ mutate: (payload: T) => Promise; } export interface QueryManager { getQuery(key: string): Query; invalidateQueries(keys: string[]): void; } export interface Query { events: QueryEvents; getState(): QueryState; /** * Calls query action and saves result. * @param action Query action. * @returns Promise with action result. */ execute(action: (ctx: QueryContext) => Promise): Promise; /** * Calls `execute` if not pending. * @param action Query action. * @returns Promise with result notation. */ tryExecute(action: (ctx: QueryContext) => Promise): Promise>; } export interface QueryContext { prevData: T | null; } export type TryExecuteResult = { status: 'done'; data: T; } | { status: 'skip'; } | { status: 'fail'; error: unknown; }; export interface QueryEvents extends EventTarget { addEventListener>(type: K, listener: (event: QueryEventMap[K]) => void, options?: boolean | AddEventListenerOptions): void; addEventListener(type: string, callback: EventListenerOrEventListenerObject | null, options?: EventListenerOptions | boolean): void; removeEventListener>(type: K, listener: (event: QueryEventMap[K]) => void, options?: boolean | AddEventListenerOptions): void; removeEventListener(type: string, callback: EventListenerOrEventListenerObject | null, options?: EventListenerOptions | boolean): void; } export interface QueryEventMap { done: QueryDoneEvent; failed: QueryFailedEvent; changed: CustomEvent; invalidated: CustomEvent; } export type QueryDoneEvent = CustomEvent<{ data: T; }>; export type QueryFailedEvent = CustomEvent<{ error: unknown; }>;