import type { TabElementProps } from "@app/components/Dialog/NewDeviceDialog"; 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 { SerialConnection } from "@meshtastic/js"; import { useCallback, useEffect, useState } from "react"; export const Serial = ({ closeDialog }: TabElementProps): JSX.Element => { const [serialPorts, setSerialPorts] = useState([]); const { addDevice } = useDeviceStore(); 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 connection = new SerialConnection(id); await connection .connect({ port, baudRate: undefined, concurrentLogOutput: true, }) .catch((e: Error) => console.log(`Unable to Connect: ${e.message}`)); device.addConnection(connection); subscribeAll(device, connection); closeDialog(); }; return (
{serialPorts.map((port, index) => { const { usbProductId, usbVendorId } = port.getInfo(); return ( ); })} {serialPorts.length === 0 && ( No devices paired yet. )}
); };