forked from Kieran/snort
faster nostrlinkhandler
This commit is contained in:
parent
9d2b867552
commit
f47994b3ee
@ -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;
|
||||||
|
@ -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 />,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user