"use client" import { useState, useEffect } from "react" import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from "@/components/ui/dialog" import { Input } from "@/components/ui/input" import { Button } from "@/components/ui/button" import { Badge } from "@/components/ui/badge" import { Search, RefreshCw, Loader2 } from "lucide-react" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { ScrollArea } from "@/components/ui/scroll-area" import { Checkbox } from "@/components/ui/checkbox" import { api } from "@/lib/api" import { showToast } from "@/lib/toast" interface ServerDevice { id: number imei: string memo: string wechatId: string alive: number totalFriend: number } interface Device { id: number name: string imei: string wxid: string status: "online" | "offline" totalFriend: number } interface DeviceSelectionDialogProps { open: boolean onOpenChange: (open: boolean) => void selectedDevices: number[] onSelect: (devices: number[]) => void } export function DeviceSelectionDialog({ open, onOpenChange, selectedDevices, onSelect }: DeviceSelectionDialogProps) { const [searchQuery, setSearchQuery] = useState("") const [statusFilter, setStatusFilter] = useState("all") const [devices, setDevices] = useState([]) const [loading, setLoading] = useState(false) const [tempSelectedDevices, setTempSelectedDevices] = useState(selectedDevices) useEffect(() => { if (open) { setTempSelectedDevices(selectedDevices) fetchDevices() } }, [open, selectedDevices]) const fetchDevices = async () => { const loadingToast = showToast("正在加载设备列表...", "loading", true); try { setLoading(true) const response = await api.get<{code: number, msg: string, data: {list: ServerDevice[], total: number}}>('/v1/devices?page=1&limit=100') if (response.code === 200 && response.data.list) { const transformedDevices: Device[] = response.data.list.map(device => ({ id: device.id, name: device.memo || device.imei || '', imei: device.imei || '', wxid: device.wechatId || '', status: device.alive === 1 ? "online" : "offline", totalFriend: device.totalFriend || 0 })) setDevices(transformedDevices) } else { showToast(response.msg || "获取设备列表失败", "error") } } catch (error: any) { console.error('获取设备列表失败:', error) showToast(error?.message || "请检查网络连接", "error") } finally { loadingToast.remove(); setLoading(false) } } const handleRefresh = () => { fetchDevices() } const handleDeviceToggle = (deviceId: number, checked: boolean) => { if (checked) { setTempSelectedDevices(prev => [...prev, deviceId]) } else { setTempSelectedDevices(prev => prev.filter(id => id !== deviceId)) } } const handleConfirm = () => { onSelect(tempSelectedDevices) onOpenChange(false) } const handleCancel = () => { setTempSelectedDevices(selectedDevices) onOpenChange(false) } const filteredDevices = devices.filter((device) => { const searchLower = searchQuery.toLowerCase() const matchesSearch = (device.name || '').toLowerCase().includes(searchLower) || (device.imei || '').toLowerCase().includes(searchLower) || (device.wxid || '').toLowerCase().includes(searchLower) const matchesStatus = statusFilter === "all" || (statusFilter === "online" && device.status === "online") || (statusFilter === "offline" && device.status === "offline") return matchesSearch && matchesStatus }) return ( 选择设备
setSearchQuery(e.target.value)} className="pl-9" />
{loading ? (
) : (
{filteredDevices.map((device) => ( ))}
)}
) }