NAM-APJATEL/src/features/devices/hooks/use-devices.ts

165 lines
5.3 KiB
TypeScript

/* eslint-disable @typescript-eslint/no-explicit-any */
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
import { toast } from 'sonner'
import { devicesService } from '../services/devices-service'
import { DevicePortsUpdateRequest } from '../types/device'
export const useDevices = ({
type = 'all',
}: { type?: 'otb' | 'closure' | 'odp' | 'all' } = {}) => {
return useQuery({
queryKey: ['devices'],
queryFn: devicesService.getDevices,
select: (data) => {
if (type === 'otb') {
return data.data.filter(d => d.device_type.toLowerCase() === 'otb') || []
}
if (type === 'closure') {
return data.data.filter(d => d.device_type.toLowerCase() === 'closure') || []
}
if (type === 'odp') {
return data.data.filter(d => d.device_type.toLowerCase() === 'odp') || []
}
return data.data || []
},
})
}
export const useDevice = (id: string) => {
return useQuery({
queryKey: ['device', id],
queryFn: () => devicesService.getDevice(id),
select: (data) => data.data,
enabled: !!id,
})
}
export const useDeviceWithPorts = (id: string) => {
return useQuery({
queryKey: ['device-with-ports', id],
queryFn: () => devicesService.getDeviceWithPorts(id),
select: (data) => data.data,
enabled: !!id,
})
}
export const useCreateDevice = () => {
const queryClient = useQueryClient()
return useMutation({
mutationFn: (data: FormData) => devicesService.createDevice(data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['devices'] })
toast.success('Device created successfully')
},
onError: (error: any) => {
toast.error(error.response?.data?.status?.description || 'Failed to create device')
},
})
}
export const useUpdateDevice = () => {
const queryClient = useQueryClient()
return useMutation({
mutationFn: ({ id, formData }: { id: string; formData: FormData }) => devicesService.updateDevice(id, formData),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['devices'] })
toast.success('Device updated successfully')
},
onError: (error: any) => {
toast.error(error.response?.data?.status?.description || 'Failed to update device')
},
})
}
export const useDeleteDeviceImage = () => {
const queryClient = useQueryClient()
return useMutation({
mutationFn: ({ deviceId, imageName }: { deviceId: string; imageName: string }) =>
devicesService.deleteDeviceImage(deviceId, imageName),
onSuccess: (_, variables) => {
queryClient.invalidateQueries({ queryKey: ['devices'] })
queryClient.invalidateQueries({ queryKey: ['device', variables.deviceId] })
queryClient.invalidateQueries({ queryKey: ['device-with-ports', variables.deviceId] })
toast.success('Image deleted successfully')
},
onError: (error: any) => {
toast.error(error.response?.data?.status?.description || 'Failed to delete image')
},
})
}
// Updated hook to use the new assign-customer endpoint
export const useAssignCustomersToPorts = () => {
const queryClient = useQueryClient()
return useMutation({
mutationFn: (data: DevicePortsUpdateRequest) => devicesService.assignCustomersToPorts(data),
onSuccess: (_, variables) => {
queryClient.invalidateQueries({ queryKey: ['devices'] })
queryClient.invalidateQueries({ queryKey: ['device-with-ports', variables.device_id] })
toast.success('Customer assignments updated successfully')
},
onError: (error: any) => {
toast.error(error.response?.data?.status?.description || 'Failed to update customer assignments')
},
})
}
// Keep the old hook name for backward compatibility
export const useUpdateDevicePorts = useAssignCustomersToPorts
export const useDeleteDevice = () => {
const queryClient = useQueryClient()
return useMutation({
mutationFn: (id: string) => devicesService.deleteDevice(id),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['devices'] })
toast.success('Device deleted successfully')
},
onError: (error: any) => {
toast.error(error.response?.data?.status?.description || 'Failed to delete device')
},
})
}
export const useBulkDeleteDevices = () => {
const queryClient = useQueryClient()
return useMutation({
mutationFn: (ids: string[]) => devicesService.bulkDeleteDevices(ids),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['devices'] })
toast.success('Devices deleted successfully')
},
onError: (error: any) => {
toast.error(error.response?.data?.status?.description || 'Failed to delete devices')
},
})
}
export const useBulkCreateDevices = () => {
const queryClient = useQueryClient()
return useMutation({
mutationFn: (devices: any[]) => devicesService.bulkCreateDevices(devices),
onSuccess: (data) => {
queryClient.invalidateQueries({ queryKey: ['devices'] })
const successCount = data.data?.success_count || 0
const failureCount = data.data?.failure_count || 0
if (failureCount > 0) {
toast.warning(`${successCount} devices created successfully, ${failureCount} failed`)
} else {
toast.success(`${successCount} devices created successfully`)
}
},
onError: (error: any) => {
toast.error(error.response?.data?.status?.description || 'Failed to create devices')
},
})
}