import type React from "react"; import { useEffect, useState } from "react"; import { fromByteArray } from "base64-js"; import { toast } from "react-hot-toast"; import { QRCode } from "react-qrcode-logo"; import { Dialog } from "@headlessui/react"; import { ClipboardIcon, XMarkIcon } from "@heroicons/react/24/outline"; import { Protobuf } from "@meshtastic/meshtasticjs"; import { Checkbox } from "../form/Checkbox.js"; import { Input } from "../form/Input.js"; import { IconButton } from "../IconButton.js"; export interface ImportDialogProps { isOpen: boolean; close: () => void; loraConfig?: Protobuf.Config_LoRaConfig; channels: Protobuf.Channel[]; } export const ImportDialog = ({ isOpen, close, loraConfig, channels }: ImportDialogProps): JSX.Element => { const [selectedChannels, setSelectedChannels] = useState([0]); 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({ loraConfig, settings: channelsToEncode }); const base64 = fromByteArray(encoded) .replace(/=/g, "") .replace(/\+/g, "-") .replace(/\//g, "_"); setQRCodeURL(`https://meshtastic.org/e/#${base64}`); }, [channels, selectedChannels, loraConfig]); return ( ); };