Spaces:
Sleeping
Sleeping
File size: 3,241 Bytes
d97b8f9 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | 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,
});
},
});
};
|