| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- 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,
- };
- }
|