Skip to content

Commit d81edaa

Browse files
author
richardson
committed
修复设备列表刷新问题
1 parent 4c77757 commit d81edaa

File tree

1 file changed

+116
-8
lines changed

1 file changed

+116
-8
lines changed

src/components/SettingsPanel.tsx

+116-8
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,14 @@ import { Card, CardContent, CardHeader } from "@/components/ui/card";
77
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
88
import { db } from '../lib/db';
99
import { useSerialPorts } from '../hooks/useSerialPorts';
10+
import { RefreshCw } from 'lucide-react';
11+
import { invoke } from '@tauri-apps/api';
12+
13+
interface Device {
14+
deviceId: string;
15+
screenSize: string;
16+
lastSeen: number;
17+
}
1018

1119
interface SettingsPanelProps {
1220
setIsConfigured?: (value: boolean) => void;
@@ -27,6 +35,10 @@ export const SettingsPanel: React.FC<SettingsPanelProps> = ({ setIsConfigured })
2735
phoneSerialNumber: '',
2836
});
2937

38+
const [devices, setDevices] = useState<Device[]>([]);
39+
const [loadingDevices, setLoadingDevices] = useState(false);
40+
const [deviceError, setDeviceError] = useState<string | null>(null);
41+
3042
const { ports, loading, error } = useSerialPorts();
3143

3244
useEffect(() => {
@@ -42,6 +54,13 @@ export const SettingsPanel: React.FC<SettingsPanelProps> = ({ setIsConfigured })
4254
loadSettings();
4355
}, []);
4456

57+
58+
useEffect(() => {
59+
if (settings.wsEndpoint) {
60+
handleRefreshDevices();
61+
}
62+
}, [settings.wsEndpoint]);
63+
4564
const handleChange = (key: keyof typeof settings, value: string) => {
4665
setSettings(prev => ({ ...prev, [key]: value }));
4766
};
@@ -50,7 +69,7 @@ export const SettingsPanel: React.FC<SettingsPanelProps> = ({ setIsConfigured })
5069
setSettings(prev => ({
5170
...prev,
5271
serialPort: value,
53-
deviceName: value // Extract the last part of the path as device name
72+
deviceName: value
5473
}));
5574
};
5675

@@ -69,6 +88,55 @@ export const SettingsPanel: React.FC<SettingsPanelProps> = ({ setIsConfigured })
6988
alert('设置已保存');
7089
};
7190

91+
async function refreshPorts(): Promise<void> {
92+
try {
93+
// Call Rust's get_serial_ports command
94+
const portsResult = await invoke('get_serial_ports');
95+
// Update the ports state through the useSerialPorts hook
96+
if (Array.isArray(portsResult)) {
97+
// The ports will automatically update through the useSerialPorts hook
98+
// No need to manually clear/update the dropdown since it's handled by the hook
99+
}
100+
} catch (error) {
101+
console.error('Failed to refresh ports:', error);
102+
}
103+
}
104+
105+
const handleRefreshDevices = async () => {
106+
console.log('开始刷新设备列表...');
107+
setLoadingDevices(true);
108+
setDeviceError(null);
109+
try {
110+
const requestConfig = {
111+
targetUrl: `${settings.wsEndpoint}/api/device/list`,
112+
method: 'GET',
113+
body: [] as number[]
114+
};
115+
116+
console.log('发送请求配置:', requestConfig);
117+
118+
const response = await invoke('proxy_request', requestConfig);
119+
console.log('收到原始响应:', response);
120+
121+
const data = JSON.parse(response as string);
122+
console.log('解析后的数据:', data);
123+
124+
if (data.success) {
125+
console.log('成功获取设备列表:', data.devices);
126+
setDevices(data.devices);
127+
} else {
128+
console.error('API返回错误:', data.error);
129+
setDeviceError(data.error || '获取设备列表失败');
130+
}
131+
} catch (err) {
132+
console.error('请求过程出错:', err);
133+
setDeviceError('获取设备列表失败');
134+
} finally {
135+
console.log('设备列表刷新完成');
136+
setLoadingDevices(false);
137+
}
138+
};
139+
72140
return (
73141
<div className="container mx-auto p-4">
74142
<h1 className="text-2xl font-bold mb-4">设置</h1>
@@ -122,7 +190,17 @@ export const SettingsPanel: React.FC<SettingsPanelProps> = ({ setIsConfigured })
122190
<CardContent>
123191
<div className="space-y-4">
124192
<div>
125-
<label className="block mb-1">串口</label>
193+
<div className="flex justify-between items-center mb-1">
194+
<label className="block">串口</label>
195+
<Button
196+
variant="outline"
197+
size="sm"
198+
onClick={() => refreshPorts()}
199+
disabled={loading}
200+
>
201+
<RefreshCw className="h-4 w-4" />
202+
</Button>
203+
</div>
126204
<Select
127205
value={settings.serialPort}
128206
onValueChange={handleSerialPortChange}
@@ -158,12 +236,42 @@ export const SettingsPanel: React.FC<SettingsPanelProps> = ({ setIsConfigured })
158236
/>
159237
</div>
160238
<div>
161-
<label className="block mb-1">手机串号</label>
162-
<Input
163-
value={settings.phoneSerialNumber}
164-
onChange={(e) => handleChange('phoneSerialNumber', e.target.value)}
165-
placeholder="请输入手机唯一标识符,在手机屏幕连续单机3下获取"
166-
/>
239+
<div className="flex justify-between items-center mb-1">
240+
<label className="block">手机设备</label>
241+
<Button
242+
variant="outline"
243+
size="sm"
244+
onClick={handleRefreshDevices}
245+
disabled={loadingDevices}
246+
>
247+
<RefreshCw className="h-4 w-4" />
248+
</Button>
249+
</div>
250+
<div className="space-y-2">
251+
<Select
252+
value={settings.phoneSerialNumber}
253+
onValueChange={(value) => handleChange('phoneSerialNumber', value)}
254+
disabled={loadingDevices}
255+
>
256+
<SelectTrigger>
257+
<SelectValue placeholder="选择设备" />
258+
</SelectTrigger>
259+
<SelectContent>
260+
{loadingDevices && <SelectItem value="loading">加载中...</SelectItem>}
261+
{deviceError && <SelectItem value="error">错误: {deviceError}</SelectItem>}
262+
{devices.map((device) => (
263+
<SelectItem key={device.deviceId} value={device.deviceId}>
264+
{device.deviceId} ({device.screenSize})
265+
</SelectItem>
266+
))}
267+
</SelectContent>
268+
</Select>
269+
<Input
270+
value={settings.phoneSerialNumber}
271+
onChange={(e) => handleChange('phoneSerialNumber', e.target.value)}
272+
placeholder="或手动输入设备串号"
273+
/>
274+
</div>
167275
</div>
168276
</div>
169277
</CardContent>

0 commit comments

Comments
 (0)