{"version":3,"file":"useApiMutation.mjs","sources":["../../../../src/lib/api/hooks/useApiMutation.ts"],"sourcesContent":["/**\n * @file useApiMutation Hook\n * @description React hook for making typed API mutations (POST, PUT, PATCH, DELETE)\n * with optimistic updates, cache invalidation, and error handling.\n *\n * @example\n * ```typescript\n * import { useApiMutation } from '@/lib/api';\n *\n * function CreateUserForm() {\n *   const { mutate, isLoading, error } = useApiMutation<User, CreateUserDto>({\n *     method: 'POST',\n *     url: '/users',\n *     invalidateQueries: [['users', 'list']],\n *     onSuccess: (user) => toast.success(`Created user: ${user.name}`),\n *   });\n *\n *   const handleSubmit = (data: CreateUserDto) => {\n *     mutate({ body: data });\n *   };\n *\n *   return <Form onSubmit={handleSubmit} />;\n * }\n * ```\n */\n\nimport { useMemo, useCallback } from 'react';\nimport {\n  useMutation,\n  useQueryClient,\n  type QueryKey,\n  type UseMutationResult,\n} from '@tanstack/react-query';\nimport { useApiClient } from './useApiClient';\nimport type { ApiResponse, ApiError, RequestConfig, QueryParams } from '../types';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Mutation variables structure\n */\nexport interface MutationVariables<TBody = unknown> {\n  /** Request body */\n  body?: TBody;\n  /** Path parameters */\n  pathParams?: Record<string, string | number>;\n  /** Query parameters */\n  queryParams?: QueryParams;\n}\n\n/**\n * API mutation configuration\n */\nexport interface ApiMutationConfig<TResponse = unknown, TBody = unknown, TContext = unknown> {\n  /** HTTP method */\n  method: 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n  /** Request URL (can include :param placeholders) */\n  url: string;\n  /** Additional request options */\n  requestOptions?: Partial<RequestConfig>;\n  /** Query keys to invalidate on success */\n  invalidateQueries?: QueryKey[];\n  /** Query keys to refetch on success */\n  refetchQueries?: QueryKey[];\n  /** Query key for optimistic updates */\n  optimisticQueryKey?: QueryKey;\n  /** Optimistic update function */\n  optimisticUpdate?: (oldData: unknown, variables: MutationVariables<TBody>) => unknown;\n  /** On mutate callback (for custom optimistic updates) */\n  onMutate?: (variables: MutationVariables<TBody>) => Promise<TContext> | TContext;\n  /** On success callback */\n  onSuccess?: (\n    data: TResponse,\n    variables: MutationVariables<TBody>,\n    context: TContext | undefined\n  ) => void | Promise<void>;\n  /** On error callback */\n  onError?: (\n    error: ApiError,\n    variables: MutationVariables<TBody>,\n    context: TContext | undefined\n  ) => void | Promise<void>;\n  /** On settled callback */\n  onSettled?: (\n    data: TResponse | undefined,\n    error: ApiError | null,\n    variables: MutationVariables<TBody>,\n    context: TContext | undefined\n  ) => void | Promise<void>;\n  /** Retry configuration */\n  retry?: number | boolean;\n  /** Retry delay */\n  retryDelay?: number;\n}\n\n/**\n * Return type for useApiMutation\n */\nexport interface UseApiMutationResult<TResponse, TBody = unknown> extends Omit<\n  UseMutationResult<TResponse, ApiError, MutationVariables<TBody>>,\n  never\n> {\n  /** Execute mutation with just body */\n  mutateWithBody: (body: TBody) => void;\n  /** Execute mutation async with just body */\n  mutateAsyncWithBody: (body: TBody) => Promise<TResponse>;\n}\n\n// =============================================================================\n// HOOK IMPLEMENTATION\n// =============================================================================\n\n/**\n * Hook for making typed API mutations\n *\n * @typeParam TResponse - Expected response data type\n * @typeParam TBody - Request body type\n * @typeParam TContext - Mutation context type (for optimistic updates)\n * @param config - Mutation configuration\n * @returns Mutation result with utilities\n *\n * @example\n * ```typescript\n * // Create mutation\n * const createUser = useApiMutation<User, CreateUserDto>({\n *   method: 'POST',\n *   url: '/users',\n *   invalidateQueries: [['users', 'list']],\n * });\n *\n * // Execute\n * createUser.mutate({ body: { name: 'John', email: 'john@example.com' } });\n *\n * // Or with simplified API\n * createUser.mutateWithBody({ name: 'John', email: 'john@example.com' });\n *\n * // Update mutation with path params\n * const updateUser = useApiMutation<User, UpdateUserDto>({\n *   method: 'PATCH',\n *   url: '/users/:id',\n *   invalidateQueries: [['users', 'list']],\n * });\n *\n * updateUser.mutate({\n *   pathParams: { id: '123' },\n *   body: { name: 'Updated Name' },\n * });\n *\n * // Delete mutation\n * const deleteUser = useApiMutation<void>({\n *   method: 'DELETE',\n *   url: '/users/:id',\n *   invalidateQueries: [['users', 'list']],\n * });\n *\n * deleteUser.mutate({ pathParams: { id: '123' } });\n * ```\n */\nexport function useApiMutation<TResponse = unknown, TBody = unknown, TContext = unknown>(\n  config: ApiMutationConfig<TResponse, TBody, TContext>\n): UseApiMutationResult<TResponse, TBody> {\n  const { client } = useApiClient();\n  const queryClient = useQueryClient();\n\n  // Mutation function\n  const mutationFn = useCallback(\n    async (variables: MutationVariables<TBody>): Promise<TResponse> => {\n      // Build URL with path params\n      let { url } = config;\n      if (variables.pathParams) {\n        for (const [key, value] of Object.entries(variables.pathParams)) {\n          url = url.replace(`:${key}`, encodeURIComponent(String(value)));\n        }\n      }\n\n      const requestOptions: Partial<RequestConfig> = {\n        params: variables.queryParams,\n        ...config.requestOptions,\n      };\n\n      let response: ApiResponse<TResponse>;\n\n      switch (config.method) {\n        case 'POST':\n          response = await client.post<TResponse, TBody>(url, variables.body, requestOptions);\n          break;\n        case 'PUT':\n          response = await client.put<TResponse, TBody>(url, variables.body, requestOptions);\n          break;\n        case 'PATCH':\n          response = await client.patch<TResponse, TBody>(url, variables.body, requestOptions);\n          break;\n        case 'DELETE':\n          response = await client.delete<TResponse>(url, requestOptions);\n          break;\n      }\n\n      return response.data;\n    },\n    [client, config]\n  );\n\n  // Build onMutate handler with optimistic update support\n  const onMutate = useCallback(\n    async (variables: MutationVariables<TBody>): Promise<TContext> => {\n      // Run custom onMutate if provided\n      if (config.onMutate) {\n        return config.onMutate(variables);\n      }\n\n      // Handle built-in optimistic updates\n      if (config.optimisticQueryKey && config.optimisticUpdate) {\n        await queryClient.cancelQueries({ queryKey: config.optimisticQueryKey });\n\n        const previousData = queryClient.getQueryData(config.optimisticQueryKey);\n\n        const { optimisticUpdate } = config;\n        queryClient.setQueryData(config.optimisticQueryKey, (old: unknown) =>\n          optimisticUpdate(old, variables)\n        );\n\n        return { previousData } as TContext;\n      }\n\n      return undefined as TContext;\n    },\n    [queryClient, config]\n  );\n\n  // Build onSuccess handler\n  const onSuccess = useCallback(\n    async (data: TResponse, variables: MutationVariables<TBody>, context: TContext | undefined) => {\n      // Invalidate queries\n      if (config.invalidateQueries && config.invalidateQueries.length > 0) {\n        await Promise.all(\n          config.invalidateQueries.map(async (queryKey) =>\n            queryClient.invalidateQueries({ queryKey })\n          )\n        );\n      }\n\n      // Refetch queries\n      if (config.refetchQueries && config.refetchQueries.length > 0) {\n        await Promise.all(\n          config.refetchQueries.map(async (queryKey) => queryClient.refetchQueries({ queryKey }))\n        );\n      }\n\n      // Call custom onSuccess\n      if (config.onSuccess) {\n        await config.onSuccess(data, variables, context);\n      }\n    },\n    [queryClient, config]\n  );\n\n  // Build onError handler\n  const onError = useCallback(\n    async (error: ApiError, variables: MutationVariables<TBody>, context: TContext | undefined) => {\n      // Rollback optimistic update\n      if (config.optimisticQueryKey !== undefined && context !== undefined && context !== null) {\n        const ctx = context as { previousData?: unknown };\n        if (ctx.previousData !== undefined) {\n          queryClient.setQueryData(config.optimisticQueryKey, ctx.previousData);\n        }\n      }\n\n      // Call custom onError\n      if (config.onError) {\n        await config.onError(error, variables, context);\n      }\n    },\n    [queryClient, config]\n  );\n\n  // Build onSettled handler\n  const onSettled = useCallback(\n    async (\n      data: TResponse | undefined,\n      error: ApiError | null,\n      variables: MutationVariables<TBody>,\n      context: TContext | undefined\n    ) => {\n      // Invalidate optimistic query to ensure fresh data\n      if (config.optimisticQueryKey) {\n        await queryClient.invalidateQueries({ queryKey: config.optimisticQueryKey });\n      }\n\n      // Call custom onSettled\n      if (config.onSettled) {\n        await config.onSettled(data, error, variables, context);\n      }\n    },\n    [queryClient, config]\n  );\n\n  // Execute mutation\n  const mutation = useMutation<TResponse, ApiError, MutationVariables<TBody>, TContext>({\n    mutationFn,\n    onMutate,\n    onSuccess,\n    onError,\n    onSettled,\n    retry: config.retry,\n    retryDelay: config.retryDelay,\n  });\n\n  // Simplified mutate functions\n  const mutateWithBody = useCallback(\n    (body: TBody) => {\n      mutation.mutate({ body });\n    },\n    [mutation]\n  );\n\n  const mutateAsyncWithBody = useCallback(\n    async (body: TBody) => {\n      return mutation.mutateAsync({ body });\n    },\n    [mutation]\n  );\n\n  // Build result\n  return useMemo(\n    () => ({\n      ...mutation,\n      mutateWithBody,\n      mutateAsyncWithBody,\n    }),\n    [mutation, mutateWithBody, mutateAsyncWithBody]\n  );\n}\n\n// =============================================================================\n// TYPED MUTATION HOOKS\n// =============================================================================\n\n/**\n * Hook for POST mutations\n *\n * @example\n * ```typescript\n * const createUser = usePost<User, CreateUserDto>('/users', {\n *   invalidateQueries: [['users', 'list']],\n * });\n *\n * createUser.mutateWithBody({ name: 'John' });\n * ```\n */\nexport function usePost<TResponse = unknown, TBody = unknown, TContext = unknown>(\n  url: string,\n  options?: Omit<ApiMutationConfig<TResponse, TBody, TContext>, 'method' | 'url'>\n): UseApiMutationResult<TResponse, TBody> {\n  return useApiMutation<TResponse, TBody, TContext>({\n    method: 'POST',\n    url,\n    ...options,\n  });\n}\n\n/**\n * Hook for PUT mutations\n *\n * @example\n * ```typescript\n * const updateUser = usePut<User, UpdateUserDto>('/users/:id', {\n *   invalidateQueries: [['users', 'list']],\n * });\n *\n * updateUser.mutate({\n *   pathParams: { id: '123' },\n *   body: { name: 'Updated' },\n * });\n * ```\n */\nexport function usePut<TResponse = unknown, TBody = unknown, TContext = unknown>(\n  url: string,\n  options?: Omit<ApiMutationConfig<TResponse, TBody, TContext>, 'method' | 'url'>\n): UseApiMutationResult<TResponse, TBody> {\n  return useApiMutation<TResponse, TBody, TContext>({\n    method: 'PUT',\n    url,\n    ...options,\n  });\n}\n\n/**\n * Hook for PATCH mutations\n *\n * @example\n * ```typescript\n * const patchUser = usePatch<User, Partial<User>>('/users/:id');\n *\n * patchUser.mutate({\n *   pathParams: { id: '123' },\n *   body: { status: 'active' },\n * });\n * ```\n */\nexport function usePatch<TResponse = unknown, TBody = unknown, TContext = unknown>(\n  url: string,\n  options?: Omit<ApiMutationConfig<TResponse, TBody, TContext>, 'method' | 'url'>\n): UseApiMutationResult<TResponse, TBody> {\n  return useApiMutation<TResponse, TBody, TContext>({\n    method: 'PATCH',\n    url,\n    ...options,\n  });\n}\n\n/**\n * Hook for DELETE mutations\n *\n * @example\n * ```typescript\n * const deleteUser = useDelete<void>('/users/:id', {\n *   invalidateQueries: [['users', 'list']],\n * });\n *\n * deleteUser.mutate({ pathParams: { id: '123' } });\n * ```\n */\nexport function useDelete<TResponse = unknown, TContext = unknown>(\n  url: string,\n  options?: Omit<ApiMutationConfig<TResponse, never, TContext>, 'method' | 'url'>\n): UseApiMutationResult<TResponse, never> {\n  return useApiMutation<TResponse, never, TContext>({\n    method: 'DELETE',\n    url,\n    ...options,\n  });\n}\n\n// =============================================================================\n// OPTIMISTIC UPDATE HELPERS\n// =============================================================================\n\n/**\n * Create optimistic update configuration for adding item to list\n *\n * @example\n * ```typescript\n * const createUser = usePost<User, CreateUserDto>('/users', {\n *   ...createOptimisticAdd(['users', 'list'], (body) => ({\n *     ...body,\n *     id: 'temp-id',\n *     createdAt: new Date().toISOString(),\n *   })),\n * });\n * ```\n */\nexport function createOptimisticAdd<TItem>(\n  queryKey: QueryKey,\n  createTempItem: (body: unknown) => TItem\n): Pick<\n  ApiMutationConfig<TItem, unknown, { previousData: TItem[] | undefined }>,\n  'optimisticQueryKey' | 'optimisticUpdate'\n> {\n  return {\n    optimisticQueryKey: queryKey,\n    optimisticUpdate: (oldData, variables) => {\n      const items = oldData as TItem[] | undefined;\n      if (!items) return [createTempItem(variables.body)];\n      return [...items, createTempItem(variables.body)];\n    },\n  };\n}\n\n/**\n * Create optimistic update configuration for updating item in list\n *\n * @example\n * ```typescript\n * const updateUser = usePatch<User, Partial<User>>('/users/:id', {\n *   ...createOptimisticUpdate<User>(['users', 'list'], (item) => item.id),\n * });\n * ```\n */\nexport function createOptimisticUpdate<TItem extends Record<string, unknown>>(\n  queryKey: QueryKey,\n  getItemId: (item: TItem) => string | number\n): Pick<\n  ApiMutationConfig<TItem, Partial<TItem>, { previousData: TItem[] | undefined }>,\n  'optimisticQueryKey' | 'optimisticUpdate'\n> {\n  return {\n    optimisticQueryKey: queryKey,\n    optimisticUpdate: (oldData, variables) => {\n      const items = oldData as TItem[] | undefined;\n      if (items === undefined || items === null) return items;\n\n      const id = variables.pathParams?.id;\n      if (id === undefined || id === null) return items;\n\n      return items.map((item) => (getItemId(item) === id ? { ...item, ...variables.body } : item));\n    },\n  };\n}\n\n/**\n * Create optimistic update configuration for removing item from list\n *\n * @example\n * ```typescript\n * const deleteUser = useDelete<void>('/users/:id', {\n *   ...createOptimisticRemove<User>(['users', 'list'], (item) => item.id),\n * });\n * ```\n */\nexport function createOptimisticRemove<TItem>(\n  queryKey: QueryKey,\n  getItemId: (item: TItem) => string | number\n): Pick<\n  ApiMutationConfig<void, never, { previousData: TItem[] | undefined }>,\n  'optimisticQueryKey' | 'optimisticUpdate'\n> {\n  return {\n    optimisticQueryKey: queryKey,\n    optimisticUpdate: (oldData, variables) => {\n      const items = oldData as TItem[] | undefined;\n      if (items === undefined || items === null) return items;\n\n      const id = variables.pathParams?.id;\n      if (id === undefined || id === null) return items;\n\n      return items.filter((item) => getItemId(item) !== id);\n    },\n  };\n}\n\n// =============================================================================\n// BATCH MUTATIONS\n// =============================================================================\n\n/**\n * Hook for executing multiple mutations in sequence\n *\n * @example\n * ```typescript\n * const batchUpdate = useBatchMutation<User, UpdateUserDto>(\n *   '/users/:id',\n *   'PATCH'\n * );\n *\n * await batchUpdate.mutateAsync([\n *   { pathParams: { id: '1' }, body: { status: 'active' } },\n *   { pathParams: { id: '2' }, body: { status: 'active' } },\n * ]);\n * ```\n */\nexport function useBatchMutation<TResponse = unknown, TBody = unknown>(\n  url: string,\n  method: 'POST' | 'PUT' | 'PATCH' | 'DELETE',\n  options?: Omit<ApiMutationConfig<TResponse[], TBody>, 'method' | 'url'>\n): {\n  mutate: (variables: MutationVariables<TBody>[]) => void;\n  mutateAsync: (variables: MutationVariables<TBody>[]) => Promise<TResponse[]>;\n  isPending: boolean;\n  isError: boolean;\n  error: ApiError | null;\n  data: TResponse[] | undefined;\n  reset: () => void;\n} {\n  const { client } = useApiClient();\n  const queryClient = useQueryClient();\n\n  const mutation = useMutation<TResponse[], ApiError, MutationVariables<TBody>[]>({\n    mutationFn: async (variables) => {\n      const results: TResponse[] = [];\n\n      for (const v of variables) {\n        let reqUrl = url;\n        if (v.pathParams) {\n          for (const [key, value] of Object.entries(v.pathParams)) {\n            reqUrl = reqUrl.replace(`:${key}`, encodeURIComponent(String(value)));\n          }\n        }\n\n        let response: ApiResponse<TResponse>;\n\n        switch (method) {\n          case 'POST':\n            response = await client.post<TResponse, TBody>(reqUrl, v.body);\n            break;\n          case 'PUT':\n            response = await client.put<TResponse, TBody>(reqUrl, v.body);\n            break;\n          case 'PATCH':\n            response = await client.patch<TResponse, TBody>(reqUrl, v.body);\n            break;\n          case 'DELETE':\n            response = await client.delete<TResponse>(reqUrl);\n            break;\n        }\n\n        results.push(response.data);\n      }\n\n      return results;\n    },\n    onSuccess: async () => {\n      if (options?.invalidateQueries) {\n        await Promise.all(\n          options.invalidateQueries.map(async (queryKey) =>\n            queryClient.invalidateQueries({ queryKey })\n          )\n        );\n      }\n    },\n  });\n\n  return {\n    mutate: mutation.mutate,\n    mutateAsync: mutation.mutateAsync,\n    isPending: mutation.isPending,\n    isError: mutation.isError,\n    error: mutation.error,\n    data: mutation.data,\n    reset: mutation.reset,\n  };\n}\n"],"names":["useApiMutation","config","client","useApiClient","queryClient","useQueryClient","mutationFn","useCallback","variables","url","key","value","requestOptions","response","onMutate","previousData","optimisticUpdate","old","onSuccess","data","context","queryKey","onError","error","ctx","onSettled","mutation","useMutation","mutateWithBody","body","mutateAsyncWithBody","useMemo","usePost","options","usePut","usePatch","useDelete","createOptimisticAdd","createTempItem","oldData","items","createOptimisticUpdate","getItemId","id","item","createOptimisticRemove","useBatchMutation","method","results","v","reqUrl"],"mappings":"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"}