import type React from "react"; import { useCallback, useEffect, useState } from "react"; import { Mono } from "@app/components/generic/Mono.js"; import { Button } from "@components/form/Button.js"; import { useAppStore } from "@core/stores/appStore.js"; import { useDeviceStore } from "@core/stores/deviceStore.js"; import { subscribeAll } from "@core/subscriptions.js"; import { randId } from "@core/utils/randId.js"; import { PlusCircleIcon } from "@heroicons/react/24/outline"; import { ISerialConnection } from "@meshtastic/meshtasticjs"; export const Serial = (): 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", () => { void updateSerialPortList(); }); navigator.serial.addEventListener("disconnect", () => { void updateSerialPortList(); }); useEffect(() => { void updateSerialPortList(); }, [updateSerialPortList]); const onConnect = async (port: SerialPort) => { const id = randId(); const device = addDevice(id); setSelectedDevice(id); const connection = new ISerialConnection(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); }; return (
{serialPorts.map((port, index) => ( ))} {serialPorts.length === 0 && ( No devices paired yet. )}
); };