import type { TabElementProps } from "../../Dialog/NewDeviceDialog.tsx"; import { Button } from "@components/UI/Button.tsx"; import { Mono } from "@components/generic/Mono.tsx"; import { useAppStore } from "@core/stores/appStore.ts"; import { useDeviceStore } from "@core/stores/deviceStore.ts"; import { subscribeAll } from "@core/subscriptions.ts"; import { randId } from "@core/utils/randId.ts"; import { MeshDevice } from "@meshtastic/core"; import { TransportWebSerial } from "@meshtastic/transport-web-serial"; import { useCallback, useEffect, useState } from "react"; import { useMessageStore } from "@core/stores/messageStore.ts"; export const Serial = ({ closeDialog }: TabElementProps) => { const [serialPorts, setSerialPorts] = useState([]); const { addDevice } = useDeviceStore(); const messageStore = useMessageStore() const { setSelectedDevice } = useAppStore(); const updateSerialPortList = useCallback(async () => { setSerialPorts(await navigator?.serial.getPorts()); }, []); navigator?.serial?.addEventListener("connect", () => { updateSerialPortList(); }); navigator?.serial?.addEventListener("disconnect", () => { updateSerialPortList(); }); useEffect(() => { updateSerialPortList(); }, [updateSerialPortList]); const onConnect = async (port: SerialPort) => { const id = randId(); const device = addDevice(id); setSelectedDevice(id); const transport = await TransportWebSerial.createFromPort(port); const connection = new MeshDevice(transport, id); connection.configure(); device.addConnection(connection); subscribeAll(device, connection, messageStore); closeDialog(); }; return (
{serialPorts.map((port, index) => { const { usbProductId, usbVendorId } = port.getInfo(); return ( ); })} {serialPorts.length === 0 && ( No devices paired yet. )}
); };