Spaces:
Sleeping
Sleeping
| 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, | |
| }); | |
| }, | |
| }); | |
| }; | |