diff --git a/packages/app/src/Pages/NostrLinkHandler.tsx b/packages/app/src/Pages/NostrLinkHandler.tsx index 8fcea11d..2edd428f 100644 --- a/packages/app/src/Pages/NostrLinkHandler.tsx +++ b/packages/app/src/Pages/NostrLinkHandler.tsx @@ -1,55 +1,60 @@ -import { NostrPrefix, tryParseNostrLink } from "@snort/system"; -import { useEffect, useState } from "react"; -import { FormattedMessage } from "react-intl"; -import { useLocation, useParams } from "react-router-dom"; +import React, { useEffect, useState } from "react"; +import { useParams, useLocation } from "react-router-dom"; import { fetchNip05Pubkey } from "@snort/shared"; - import Spinner from "@/Icons/Spinner"; import ProfilePage from "@/Pages/Profile/ProfilePage"; import { ThreadRoute } from "@/Element/Event/Thread"; import { GenericFeed } from "@/Element/Feed/Generic"; +import { NostrPrefix, tryParseNostrLink } from "@snort/system"; +import { FormattedMessage } from "react-intl"; export default function NostrLinkHandler() { - const params = useParams(); const { state } = useLocation(); - const [loading, setLoading] = useState(true); - const [renderComponent, setRenderComponent] = useState(null); + const { link } = useParams(); - const link = decodeURIComponent(params["*"] ?? "").toLowerCase(); - - async function handleLink(link: string) { + const determineInitialComponent = (link) => { const nav = tryParseNostrLink(link); if (nav) { - if (nav.type === NostrPrefix.Event || nav.type === NostrPrefix.Note || nav.type === NostrPrefix.Address) { - setRenderComponent(); // Directly render ThreadRoute - } else if (nav.type === NostrPrefix.PublicKey || nav.type === NostrPrefix.Profile) { - const id = nav.encode(); - setRenderComponent(); // Directly render ProfilePage - } else if (nav.type === NostrPrefix.Req) { - setRenderComponent(); + switch (nav.type) { + case NostrPrefix.Event: + case NostrPrefix.Note: + case NostrPrefix.Address: + return ; + case NostrPrefix.PublicKey: + case NostrPrefix.Profile: + return ; + case NostrPrefix.Req: + return ; + default: + return null; } } else { - if (state) { - setRenderComponent(); // Directly render ProfilePage from route state - } else { - try { - const pubkey = await fetchNip05Pubkey(link, CONFIG.nip05Domain); - if (pubkey) { - setRenderComponent(); // Directly render ProfilePage - } - } catch { - //ignored - } - } + return state ? : null; + } + }; + + const initialRenderComponent = determineInitialComponent(link); + const [loading, setLoading] = useState(initialRenderComponent ? false : true); + const [renderComponent, setRenderComponent] = useState(initialRenderComponent); + + async function handleLink(link) { + if (!tryParseNostrLink(link)) { + try { + const pubkey = await fetchNip05Pubkey(link, CONFIG.nip05Domain); + if (pubkey) { + setRenderComponent(); + } + } catch { + // Ignored + } + setLoading(false); } - setLoading(false); } useEffect(() => { - if (link.length > 0) { - handleLink(link).catch(console.error); - } - }, [link]); + setRenderComponent(determineInitialComponent(link)); + handleLink(link); + }, [link]); // Depend only on 'link' if (renderComponent) { return renderComponent; diff --git a/packages/app/src/index.tsx b/packages/app/src/index.tsx index 98872b44..69643bad 100644 --- a/packages/app/src/index.tsx +++ b/packages/app/src/index.tsx @@ -296,7 +296,7 @@ if (CONFIG.features.subscriptions) { // add catch all route mainRoutes.push({ - path: "/*", + path: "/:link", element: , });