faster nostrlinkhandler
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
Martti Malmi 2023-12-27 14:43:17 +02:00
parent 9d2b867552
commit f47994b3ee
2 changed files with 41 additions and 36 deletions

View File

@ -1,55 +1,60 @@
import { NostrPrefix, tryParseNostrLink } from "@snort/system"; import React, { useEffect, useState } from "react";
import { useEffect, useState } from "react"; import { useParams, useLocation } from "react-router-dom";
import { FormattedMessage } from "react-intl";
import { useLocation, useParams } from "react-router-dom";
import { fetchNip05Pubkey } from "@snort/shared"; import { fetchNip05Pubkey } from "@snort/shared";
import Spinner from "@/Icons/Spinner"; import Spinner from "@/Icons/Spinner";
import ProfilePage from "@/Pages/Profile/ProfilePage"; import ProfilePage from "@/Pages/Profile/ProfilePage";
import { ThreadRoute } from "@/Element/Event/Thread"; import { ThreadRoute } from "@/Element/Event/Thread";
import { GenericFeed } from "@/Element/Feed/Generic"; import { GenericFeed } from "@/Element/Feed/Generic";
import { NostrPrefix, tryParseNostrLink } from "@snort/system";
import { FormattedMessage } from "react-intl";
export default function NostrLinkHandler() { export default function NostrLinkHandler() {
const params = useParams();
const { state } = useLocation(); const { state } = useLocation();
const [loading, setLoading] = useState(true); const { link } = useParams();
const [renderComponent, setRenderComponent] = useState<React.ReactNode>(null);
const link = decodeURIComponent(params["*"] ?? "").toLowerCase(); const determineInitialComponent = (link) => {
async function handleLink(link: string) {
const nav = tryParseNostrLink(link); const nav = tryParseNostrLink(link);
if (nav) { if (nav) {
if (nav.type === NostrPrefix.Event || nav.type === NostrPrefix.Note || nav.type === NostrPrefix.Address) { switch (nav.type) {
setRenderComponent(<ThreadRoute key={link} id={nav.encode()} />); // Directly render ThreadRoute case NostrPrefix.Event:
} else if (nav.type === NostrPrefix.PublicKey || nav.type === NostrPrefix.Profile) { case NostrPrefix.Note:
const id = nav.encode(); case NostrPrefix.Address:
setRenderComponent(<ProfilePage key={id} id={id} state={state} />); // Directly render ProfilePage return <ThreadRoute key={link} id={nav.encode()} />;
} else if (nav.type === NostrPrefix.Req) { case NostrPrefix.PublicKey:
setRenderComponent(<GenericFeed key={link} link={nav} />); case NostrPrefix.Profile:
return <ProfilePage key={link} id={nav.encode()} state={state} />;
case NostrPrefix.Req:
return <GenericFeed key={link} link={nav} />;
default:
return null;
} }
} else { } else {
if (state) { return state ? <ProfilePage key={link} state={state} /> : null;
setRenderComponent(<ProfilePage key={link} state={state} />); // Directly render ProfilePage from route state }
} else { };
try {
const pubkey = await fetchNip05Pubkey(link, CONFIG.nip05Domain); const initialRenderComponent = determineInitialComponent(link);
if (pubkey) { const [loading, setLoading] = useState(initialRenderComponent ? false : true);
setRenderComponent(<ProfilePage key={link} id={pubkey} state={state} />); // Directly render ProfilePage const [renderComponent, setRenderComponent] = useState(initialRenderComponent);
}
} catch { async function handleLink(link) {
//ignored if (!tryParseNostrLink(link)) {
} try {
} const pubkey = await fetchNip05Pubkey(link, CONFIG.nip05Domain);
if (pubkey) {
setRenderComponent(<ProfilePage key={link} id={pubkey} state={state} />);
}
} catch {
// Ignored
}
setLoading(false);
} }
setLoading(false);
} }
useEffect(() => { useEffect(() => {
if (link.length > 0) { setRenderComponent(determineInitialComponent(link));
handleLink(link).catch(console.error); handleLink(link);
} }, [link]); // Depend only on 'link'
}, [link]);
if (renderComponent) { if (renderComponent) {
return renderComponent; return renderComponent;

View File

@ -296,7 +296,7 @@ if (CONFIG.features.subscriptions) {
// add catch all route // add catch all route
mainRoutes.push({ mainRoutes.push({
path: "/*", path: "/:link",
element: <NostrLinkHandler />, element: <NostrLinkHandler />,
}); });