import type { AwaitableFn, Fn, Getter, NoopFn, PromiseFn, Recordable } from '@rhao/types-base'; import type { RequestHookable } from './hooks'; import type { RequestBasicOptions, RequestOptions } from './options'; import type { RequestResult } from './result'; import type { RequestFetcher } from './fetcher'; import type { RequestState } from './state'; import type { BasicRequestHook } from './core'; import type { InferStore, StoreKey } from './store'; interface MutateOptions { (options: Partial & Recordable>): void; } interface MutateState = RequestState> { (state: Partial): void; (key: K, value: S[K]): void; } interface MutateResult { (result: Partial>): void; } /** * "xxx.d.ts" or "xxx.ts" * * @example * ```ts * declare module '@rhao/request' { * interface RequestBasicContext { * custom: {} // 自定义基础上下文 * } * } * ``` */ export interface RequestBasicContext { /** * `request()` */ request: BasicRequestHook; /** * `hooks` 管理器 */ hooks: RequestHookable; /** * 获取或设置 `fetcher` */ fetcher: RequestFetcher; /** * 获取或设置 `executor` */ executor: PromiseFn; /** * 获取唯一标识 */ getKey: Getter; /** * 获取 `request()` 的配置项 */ getOptions: Getter & Required>; /** * 获取 `request()` 的状态 */ getState: Getter>; /** * 获取 `request()` 的结果 */ getResult: Getter>; /** * 修改 `request()` 配置项,仅支持浅合并 * * ***注意:对于请求流来说该函数会产生副作用,需谨慎调用,必要时需手动还原!*** */ mutateOptions: MutateOptions; /** * 修改 `request()` 的状态,执行流时推荐使用 `mutateData` 修改 `data` 属性,避免频繁更新 */ mutateState: MutateState; /** * 修改 `request()` 结果 */ mutateResult: MutateResult; /** * 是否存在未完成的执行,用于判断多次并发是否全部完成 */ hasPending: Getter; /** * 清除未完成的执行记录 */ clearPending: NoopFn; /** * 取消未完成的执行并立即清除执行记录 */ clearPendingWithCancel: NoopFn; /** * 是否已释放资源 */ isDisposed: Getter; /** * 主动释放资源,当不再使用某个 `request()` 时可调用该函数触发 `hook:dispose` * * ***谨慎调用*** */ dispose: Fn<[]>; /** * 设置数据中心,仅存在于单次 `request()` 周期内 */ setStore: >(key: K, value: InferStore) => InferStore; /** * 获取数据中心,仅获取存在于单次 `request()` 周期内 */ getStore: >(key: K) => InferStore; /** * 获取 `fetcher` 的原始未解析和处理的结果,成功时为原始数据,失败后为原始错误 */ getRawData: Getter; } /** * "xxx.d.ts" or "xxx.ts" * * @example * ```ts * declare module '@rhao/request' { * interface RequestContext { * custom: {} // 自定义上下文 * } * } * ``` */ export interface RequestContext extends Omit, 'mutateResult' | 'dispose'> { /** * 修改 `state.data` * * ***注意:不会直接触发 `stateChange`,在 `hook:finally` 时会通过 `dataComparer` 对比前后数据,不一致时触发 `hook:stateChange`,避免频繁更新*** */ mutateData: AwaitableFn<[data: TData]>; /** * 是否是最后一次执行 */ isLatestExecution: Getter; /** * 是否执行失败 */ isFailed: Getter; /** * 是否已取消执行 */ isCanceled: Getter; /** * 取消执行 * @param silent 不触发 `cancel` 事件 * @default false */ cancel: Fn<[silent?: boolean]>; } export declare function createMutateState(state: RequestState, context: Getter>): MutateState; export {};