"use client" import { useState, useEffect } from "react" import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog" import { Input } from "@/components/ui/input" import { Button } from "@/components/ui/button" import { Search, RefreshCw, Filter } 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" interface Device { id: string name: string imei: string status: "online" | "offline" wechatAccounts: { wechatId: string nickname: string remainingAdds: number maxDailyAdds: number }[] } interface DeviceSelectionDialogProps { open: boolean onOpenChange: (open: boolean) => void selectedDevices: string[] onSelect: (deviceIds: string[]) => void } export function DeviceSelectionDialog({ open, onOpenChange, selectedDevices, onSelect }: DeviceSelectionDialogProps) { const [devices, setDevices] = useState([]) const [loading, setLoading] = useState(false) const [searchQuery, setSearchQuery] = useState("") const [statusFilter, setStatusFilter] = useState("all") const [selectedDeviceIds, setSelectedDeviceIds] = useState([]) useEffect(() => { if (open) setSelectedDeviceIds(selectedDevices) }, [open, selectedDevices]) useEffect(() => { if (!open) return const fetchDevices = async () => { setLoading(true) try { const params = [] if (searchQuery) params.push(`keyword=${encodeURIComponent(searchQuery)}`) if (statusFilter !== "all") params.push(`status=${statusFilter}`) params.push("page=1", "limit=100") const url = `/v1/devices?${params.join("&")}` const response = await api.get(url) const list = response.data?.list || response.data?.items || [] const devices = list.map((device: any) => ({ id: device.id?.toString() || device.id, imei: device.imei || "", name: device.memo || device.name || `设备_${device.id}`, status: device.alive === 1 || device.status === "online" ? "online" : "offline", wechatAccounts: [ { wechatId: device.wechatId || device.wxid || "", nickname: device.nickname || "", remainingAdds: device.remainingAdds || 0, maxDailyAdds: device.maxDailyAdds || 0, }, ], })) setDevices(devices) } catch { setDevices([]) } finally { setLoading(false) } } fetchDevices() }, [open, searchQuery, statusFilter]) const handleSelectDevice = (deviceId: string) => { setSelectedDeviceIds((prev) => prev.includes(deviceId) ? prev.filter((id) => id !== deviceId) : [...prev, deviceId] ) } const handleSelectAll = () => { if (selectedDeviceIds.length === filteredDevices.length) { setSelectedDeviceIds([]) } else { setSelectedDeviceIds(filteredDevices.map((device) => device.id)) } } const handleConfirm = () => { onSelect(selectedDeviceIds) onOpenChange(false) } const handleCancel = () => { setSelectedDeviceIds(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.wechatAccounts[0]?.wechatId || '').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="flex-1 rounded-lg border-gray-200 focus:border-blue-500 focus:ring-2 focus:ring-blue-100" />
{/* 设备列表 */}
{loading ? (
加载中...
) : filteredDevices.length === 0 ? (
暂无设备
) : ( filteredDevices.map(device => { const checked = selectedDeviceIds.includes(device.id) const wx = device.wechatAccounts[0] || {} return ( ) }) )}
{/* 确认按钮 */}
) }