import { useState, useEffect, useRef } from 'react'; // Devices 页面的业务逻辑 Hook export function DevicesLogic() { // 设备列表(IP:端口格式) const [devices, setDevices] = useState([]); // 加载状态 const [loading, setLoading] = useState(false); // 已连接设备集合(用于控制按钮显示) const [connectedDevices, setConnectedDevices] = useState(new Set()); // 预览中的设备集合 const [previewingDevices, setPreviewingDevices] = useState(new Set()); // 防止重复扫描标记 const hasScanned = useRef(false); // 扫描设备列表(只获取已连接设备,不自动连接) const scanDevices = async () => { if (!window.electronAPI || !window.electronAPI.getADBDevices) { console.warn('Electron API 不可用'); setDevices([]); return; } setLoading(true); try { const deviceList = await window.electronAPI.getADBDevices(); // 过滤出 IP:端口格式的设备 const ipPortList = (deviceList || []) .map(device => device?.id || device) .filter(Boolean) .filter(id => { const ipPortPattern = /^\d+\.\d+\.\d+\.\d+:\d+$/; return ipPortPattern.test(id); }); console.log('devices:', ipPortList); setDevices(ipPortList); } catch (err) { console.error('扫描失败:', err); setDevices([]); } finally { setLoading(false); } }; // 连接设备 const connectDevice = async (ipPort) => { if (!window.electronAPI || !window.electronAPI.connectADBDevice) { console.warn('连接设备功能不可用'); return; } try { await window.electronAPI.connectADBDevice(ipPort); setConnectedDevices(prev => new Set([...prev, ipPort])); } catch (err) { console.error('连接设备失败:', err); } }; // 断开设备 const disconnectDevice = async (ipPort) => { if (window.electronAPI && window.electronAPI.disconnectADBDevice) { try { await window.electronAPI.disconnectADBDevice(ipPort); } catch (err) { console.error('断开设备失败:', err); } } setConnectedDevices(prev => { const newSet = new Set(prev); newSet.delete(ipPort); return newSet; }); // 同时取消预览状态 setPreviewingDevices(prev => { const next = new Set(prev); next.delete(ipPort); return next; }); }; // 切换预览/取消预览 const togglePreview = (ipPort) => { setPreviewingDevices(prev => { const next = new Set(prev); if (next.has(ipPort)) { next.delete(ipPort); } else { next.add(ipPort); } return next; }); }; // 页面加载时自动扫描 useEffect(() => { if (!hasScanned.current) { hasScanned.current = true; scanDevices(); } }, []); return { devices, loading, scanDevices, connectDevice, disconnectDevice, connectedDevices, previewingDevices, togglePreview, }; }