import { Mono } from "@components/generic/Mono.tsx"; import { Button } from "@components/UI/Button.tsx"; import { useAppStore, useDeviceStore, useMessageStore, useNodeDBStore, } from "@core/stores"; import { subscribeAll } from "@core/subscriptions.ts"; import { randId } from "@core/utils/randId.ts"; import { MeshDevice } from "@meshtastic/core"; import { TransportWebBluetooth } from "@meshtastic/transport-web-bluetooth"; import { useCallback, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import type { TabElementProps } from "../../Dialog/NewDeviceDialog.tsx"; export const BLE = ({ closeDialog }: TabElementProps) => { const [connectionInProgress, setConnectionInProgress] = useState(false); const [bleDevices, setBleDevices] = useState([]); const { addDevice } = useDeviceStore(); const { addNodeDB } = useNodeDBStore(); const { addMessageStore } = useMessageStore(); const { setSelectedDevice } = useAppStore(); const { t } = useTranslation(); const updateBleDeviceList = useCallback(async (): Promise => { setBleDevices(await navigator.bluetooth.getDevices()); }, []); useEffect(() => { updateBleDeviceList(); }, [updateBleDeviceList]); const onConnect = async (bleDevice: BluetoothDevice) => { const id = randId(); const transport = await TransportWebBluetooth.createFromDevice(bleDevice); const device = addDevice(id); const nodeDB = addNodeDB(id); const messageStore = addMessageStore(id); const connection = new MeshDevice(transport, id); connection.configure(); setSelectedDevice(id); device.addConnection(connection); subscribeAll(device, connection, messageStore, nodeDB); const HEARTBEAT_INTERVAL = 5 * 60 * 1000; connection.setHeartbeatInterval(HEARTBEAT_INTERVAL); closeDialog(); }; return (
{bleDevices.map((device) => ( ))} {bleDevices.length === 0 && ( {t("newDeviceDialog.bluetoothConnection.noDevicesPaired")} )}
); };