165 lines
5.3 KiB
TypeScript
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')
|
|
},
|
|
})
|
|
}
|