import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { assetItemApi } from '@/services/assetItemApi'; import { AssetItem, AssetItemCreateRequest, AssetItemUpdateRequest, } from '@/types/asset-management'; import { toast } from '@/lib/custom-toast'; /** * Hook to fetch all items for a specific asset */ export const useAssetItems = (assetId: number) => { return useQuery({ queryKey: ['assetItems', assetId], queryFn: () => assetItemApi.getByAsset(assetId), enabled: assetId > 0, }); }; /** * Hook to fetch a single asset item by ID */ export const useAssetItem = (itemId: number) => { return useQuery({ queryKey: ['assetItem', itemId], queryFn: () => assetItemApi.getById(itemId), enabled: itemId > 0, }); }; /** * Hook to create a new asset item */ export const useCreateAssetItem = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: (item: AssetItemCreateRequest) => assetItemApi.create(item), onSuccess: (data) => { // Invalidate and refetch asset items for this asset queryClient.invalidateQueries({ queryKey: ['assetItems', data.assetID] }); queryClient.invalidateQueries({ queryKey: ['asset', data.assetID] }); toast.success('Item added successfully', { description: `${data.itemName} has been added to the asset.`, }); }, onError: (error: Error) => { toast.error('Failed to add item', { description: error.message, }); }, }); }; /** * Hook to update an existing asset item */ export const useUpdateAssetItem = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: ({ id, item }: { id: number; item: AssetItemUpdateRequest }) => assetItemApi.update(id, item), onSuccess: (data) => { // Invalidate and refetch queryClient.invalidateQueries({ queryKey: ['assetItems', data.assetID] }); queryClient.invalidateQueries({ queryKey: ['assetItem', data.itemID] }); queryClient.invalidateQueries({ queryKey: ['asset', data.assetID] }); toast.success('Item updated successfully', { description: `${data.itemName} has been updated.`, }); }, onError: (error: Error) => { toast.error('Failed to update item', { description: error.message, }); }, }); }; /** * Hook to delete an asset item */ export const useDeleteAssetItem = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: (itemId: number) => assetItemApi.delete(itemId), onSuccess: (_, itemId) => { // Invalidate all asset items queries queryClient.invalidateQueries({ queryKey: ['assetItems'] }); queryClient.invalidateQueries({ queryKey: ['assetItem', itemId] }); queryClient.invalidateQueries({ queryKey: ['assets'] }); toast.success('Item deleted successfully', { description: 'The item has been removed from the asset.', }); }, onError: (error: Error) => { toast.error('Failed to delete item', { description: error.message, }); }, }); };