import type { AxiosError } from 'axios'; import type { MutationApiOptions } from '../mutation.api'; import { MutationApi } from '../mutation.api'; /** * Factory for creating a MutationApi instance. * Accepts either a plain options object or a function. * * Use a **function** when options depend on observables (e.g., `invalidatedQueries` with dynamic keys) — * MobX tracks observables accessed during the function call and updates options on change. * A plain object is evaluated once at class field initialization and does not react to changes. * * @example Plain object (options don't depend on observables) * ```typescript * deleteJob = mutation({ * mutationFn: async (arg) => await this.api?.deleteJob(arg.id), * invalidatedQueries: [['scheduling', 'jobs']], * }); * ``` * * @example Function (options depend on observables — reactive) * ```typescript * updateJob = mutation(() => ({ * mutationFn: async (req) => (await this.api?.updateJob(req))?.data, * invalidatedQueries: [['scheduling', 'jobs'], ['scheduling', 'job', this.selectedJobId]], * })); * ``` */ export function mutation( options: | MutationApiOptions | (() => MutationApiOptions) ): MutationApi { const optionsFn = typeof options === 'function' ? options : () => options; return new MutationApi(optionsFn); }