// src/hooks/mutations/useUpdateShoppingListItemMutation.ts import { useMutation, useQueryClient } from '@tanstack/react-query'; import * as apiClient from '../../services/apiClient'; import { notifySuccess, notifyError } from '../../services/notificationService'; import { queryKeyBases } from '../../config/queryKeys'; import type { ShoppingListItem } from '../../types'; interface UpdateShoppingListItemParams { itemId: number; updates: Partial< Pick >; } /** * Mutation hook for updating a shopping list item. * * This hook provides automatic cache invalidation. When the mutation succeeds, * it invalidates the shopping-lists query to trigger a refetch of the updated list. * * You can update: custom_item_name, quantity, is_purchased, notes. * * @returns Mutation object with mutate function and state * * @example * ```tsx * const updateShoppingListItem = useUpdateShoppingListItemMutation(); * * // Mark item as purchased * const handlePurchase = () => { * updateShoppingListItem.mutate({ * itemId: 42, * updates: { is_purchased: true } * }); * }; * * // Update quantity * const handleQuantityChange = () => { * updateShoppingListItem.mutate({ * itemId: 42, * updates: { quantity: 3 } * }); * }; * ``` */ export const useUpdateShoppingListItemMutation = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: async ({ itemId, updates }: UpdateShoppingListItemParams) => { const response = await apiClient.updateShoppingListItem(itemId, updates); if (!response.ok) { const error = await response.json().catch(() => ({ message: `Request failed with status ${response.status}`, })); throw new Error(error.message || 'Failed to update shopping list item'); } return response.json(); }, onSuccess: () => { // Invalidate and refetch shopping lists to get the updated list queryClient.invalidateQueries({ queryKey: queryKeyBases.shoppingLists }); notifySuccess('Shopping list item updated'); }, onError: (error: Error) => { notifyError(error.message || 'Failed to update shopping list item'); }, }); };