Devices.jsx 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import './Devices.css';
  2. import { DevicesLogic } from './Devices.js';
  3. // Devices 组件:显示设备列表和连接/断开功能
  4. function Devices() {
  5. const { devices, loading, scanDevices, connectDevice, disconnectDevice, connectedDevices, previewingDevices, togglePreview } = DevicesLogic();
  6. // 处理连接设备点击
  7. const handleConnect = async (ipPort) => {
  8. await connectDevice(ipPort);
  9. };
  10. // 处理断开设备点击
  11. const handleDisconnect = async (ipPort) => {
  12. await disconnectDevice(ipPort);
  13. };
  14. return (
  15. <div className="Devices-container">
  16. <div className="devices-header">
  17. <div className="devices-title">可连接设备</div>
  18. <div
  19. className={`refresh-btn ${loading ? 'disabled' : ''}`}
  20. onClick={loading ? undefined : scanDevices}
  21. >
  22. <div className={`refresh-icon ${loading ? 'spinning' : ''}`}>↻</div>
  23. {loading ? '扫描中' : '刷新'}
  24. </div>
  25. </div>
  26. <div className="devices-scroll-area">
  27. {devices.map((ipPort, index) => (
  28. <div key={index} className="device-item">
  29. <div className="device-info">
  30. <div className="device-id">{ipPort}</div>
  31. </div>
  32. <div className="device-actions">
  33. {!connectedDevices.has(ipPort) && (
  34. <div
  35. className="connect-btn"
  36. onClick={() => handleConnect(ipPort)}
  37. >
  38. 连接
  39. </div>
  40. )}
  41. {connectedDevices.has(ipPort) && (
  42. <div className="action-row">
  43. <div
  44. className={`preview-btn ${previewingDevices.has(ipPort) ? 'preview-btn--active' : ''}`}
  45. onClick={() => togglePreview(ipPort)}
  46. >
  47. {previewingDevices.has(ipPort) ? '取消' : '预览'}
  48. </div>
  49. <div
  50. className="disconnect-btn"
  51. onClick={() => handleDisconnect(ipPort)}
  52. >
  53. 断开
  54. </div>
  55. </div>
  56. )}
  57. </div>
  58. </div>
  59. ))}
  60. </div>
  61. </div>
  62. );
  63. }
  64. export default Devices;