import React, { useState, useEffect } from "react"; import { Search } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Checkbox } from "@/components/ui/checkbox"; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { fetchDeviceList } from "@/api/devices"; // 设备选择项接口 interface DeviceSelectionItem { id: string; name: string; imei: string; wechatId: string; status: "online" | "offline"; } // 组件属性接口 interface DeviceSelectionProps { selectedDevices: string[]; onSelect: (devices: string[]) => void; placeholder?: string; className?: string; } export default function DeviceSelection({ selectedDevices, onSelect, placeholder = "选择设备", className = "", }: DeviceSelectionProps) { const [dialogOpen, setDialogOpen] = useState(false); const [devices, setDevices] = useState([]); const [searchQuery, setSearchQuery] = useState(""); const [statusFilter, setStatusFilter] = useState("all"); const [loading, setLoading] = useState(false); // 获取设备列表,支持keyword const fetchDevices = async (keyword: string = "") => { setLoading(true); try { const res = await fetchDeviceList(1, 100, keyword.trim() || undefined); if (res && res.data && Array.isArray(res.data.list)) { setDevices( res.data.list.map((d) => ({ id: d.id?.toString() || "", name: d.memo || d.imei || "", imei: d.imei || "", wechatId: d.wechatId || "", status: d.alive === 1 ? "online" : "offline", })) ); } } catch (error) { console.error("获取设备列表失败:", error); } finally { setLoading(false); } }; // 打开弹窗时获取设备列表 const openDialog = () => { setSearchQuery(""); setDialogOpen(true); fetchDevices(""); }; // 搜索防抖 useEffect(() => { if (!dialogOpen) return; const timer = setTimeout(() => { fetchDevices(searchQuery); }, 500); return () => clearTimeout(timer); }, [searchQuery, dialogOpen]); // 过滤设备(只保留状态过滤) const filteredDevices = devices.filter((device) => { const matchesStatus = statusFilter === "all" || (statusFilter === "online" && device.status === "online") || (statusFilter === "offline" && device.status === "offline"); return matchesStatus; }); // 处理设备选择 const handleDeviceToggle = (deviceId: string) => { if (selectedDevices.includes(deviceId)) { onSelect(selectedDevices.filter((id) => id !== deviceId)); } else { onSelect([...selectedDevices, deviceId]); } }; // 获取显示文本 const getDisplayText = () => { if (selectedDevices.length === 0) return ""; return `已选择 ${selectedDevices.length} 个设备`; }; return ( <> {/* 输入框 */}
{/* 设备选择弹窗 */}
请选择一个或多个设备,支持搜索和筛选。
选择设备
setSearchQuery(e.target.value)} className="pl-9" />
{loading ? (
加载中...
) : (
{filteredDevices.map((device) => ( ))}
)}
已选择 {selectedDevices.length} 个设备
); }