import * as odd from "@oddjs/odd"; import { useEffect, useMemo, useState } from "react"; import { useLocation, useNavigate } from "react-router-dom"; import { addNotification } from "../lib/notifications"; import { createAccountLinkingConsumer } from "../lib/auth/linking"; import { loadAccount } from "../lib/auth/account"; import type { LinkDeviceView } from "../lib/views"; import FilesystemActivity from "../components/common/FilesystemActivity"; import LinkDevice from "../components/auth/link-device/LinkDevice"; const useQuery = () => { const { search } = useLocation(); return useMemo(() => new URLSearchParams(search), [search]); }; let accountLinkingConsumer: odd.AccountLinkingConsumer; const LinkDeviceRoute = () => { const navigate = useNavigate(); const [view, setView] = useState<LinkDeviceView>("link-device"); const [displayPin, setDisplayPin] = useState<string>(""); // const [accountLinkingConsumer, setAccountLinkingConsumer] = // useState<account.AccountLinkingConsumer>(); const query = useQuery(); const hashedUsername = query.get('hashedUsername') as string; const fullUsername = decodeURIComponent( query.get('username') as string ); const initAccountLinkingConsumer = async () => { const accountLinkingConsumer = await createAccountLinkingConsumer(hashedUsername); // setAccountLinkingConsumer(updatedAccountLinkingConsumer) accountLinkingConsumer?.on("challenge", ({ pin }) => { setDisplayPin(pin.join("")); }); accountLinkingConsumer?.on("link", async ({ approved }) => { if (approved) { setView("load-filesystem"); await loadAccount(hashedUsername, fullUsername); addNotification({ msg: "You're now connected!", type: "success" }); navigate("/"); } else { addNotification({ msg: "The connection attempt was cancelled", type: "info", }); navigate("/"); } }); }; const cancelConnection = async () => { addNotification({ msg: "The connection attempt was cancelled", type: "info", }); accountLinkingConsumer?.cancel(); navigate("/"); }; const useMountEffect = () => useEffect(() => { initAccountLinkingConsumer(); }, []); useMountEffect(); return ( <> <input type="checkbox" id="my-modal-5" defaultChecked className="modal-toggle" /> {view === "link-device" && ( <LinkDevice pin={displayPin} cancelConnection={cancelConnection} /> )} {view === "load-filesystem" && <FilesystemActivity activity="Loading" />} </> ); }; export default LinkDeviceRoute;