import type React from "react"; import { useEffect, useState } from "react"; import { fromByteArray } from "base64-js"; import { QRCode } from "react-qrcode-logo"; import { Dialog } from "@headlessui/react"; import { ClipboardIcon } from "@heroicons/react/24/outline"; import { Protobuf } from "@meshtastic/meshtasticjs"; import { Checkbox } from "../form/Checkbox.js"; import { Input } from "../form/Input.js"; export interface QRDialogProps { isOpen: boolean; close: () => void; loraConfig?: Protobuf.Config_LoRaConfig; channels: Protobuf.Channel[]; } export const QRDialog = ({ isOpen, close, loraConfig, channels, }: QRDialogProps): JSX.Element => { const [selectedChannels, setSelectedChannels] = useState([]); const [QRCodeURL, setQRCodeURL] = useState(""); useEffect(() => { const channelsToEncode = channels .filter((channel) => selectedChannels.includes(channel.index)) .map((channel) => channel.settings) .filter((ch): ch is Protobuf.ChannelSettings => !!ch); const encoded = Protobuf.ChannelSet.toBinary( Protobuf.ChannelSet.create({ loraConfig, settings: channelsToEncode, }) ); const base64 = fromByteArray(encoded) .replace(/=/g, "") .replace(/\+/g, "-") .replace(/\//g, "_"); setQRCodeURL(`https://www.meshtastic.org/e/#${base64}`); }, [channels, selectedChannels, loraConfig]); return ( ); };