pmtool / src /hooks /asset-management /useAssetItems.ts
devarshia5's picture
Upload 487 files
d97b8f9 verified
Raw
History Blame Contribute Delete
3.24 kB
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,
});
},
});
};