From 091169ae7da89bf5617134380b26f59c08fc28d4 Mon Sep 17 00:00:00 2001 From: Martti Malmi Date: Sun, 8 Oct 2023 16:21:56 +0300 Subject: [PATCH] return note or profile component directly from NostrLinkHandler --- packages/app/src/Element/Event/Thread.tsx | 5 +++-- packages/app/src/Pages/NostrLinkHandler.tsx | 19 ++++++++++++------- .../app/src/Pages/Profile/ProfilePage.tsx | 17 +++++++++++------ 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/packages/app/src/Element/Event/Thread.tsx b/packages/app/src/Element/Event/Thread.tsx index 6fd8192c..20ccb721 100644 --- a/packages/app/src/Element/Event/Thread.tsx +++ b/packages/app/src/Element/Event/Thread.tsx @@ -205,9 +205,10 @@ const TierThree = ({ active, isLastSubthread, notes, related, chains, onNavigate ); }; -export function ThreadRoute() { +export function ThreadRoute({ id }: { id?: string }) { const params = useParams(); - const link = parseNostrLink(params.id ?? "", NostrPrefix.Note); + const resolvedId = id ?? params.id; + const link = parseNostrLink(resolvedId ?? "", NostrPrefix.Note); return ( diff --git a/packages/app/src/Pages/NostrLinkHandler.tsx b/packages/app/src/Pages/NostrLinkHandler.tsx index 99217d26..801ab794 100644 --- a/packages/app/src/Pages/NostrLinkHandler.tsx +++ b/packages/app/src/Pages/NostrLinkHandler.tsx @@ -1,32 +1,33 @@ import { NostrPrefix, tryParseNostrLink } from "@snort/system"; import { useEffect, useState } from "react"; import FormattedMessage from "Element/FormattedMessage"; -import { useNavigate, useParams } from "react-router-dom"; +import { useParams } from "react-router-dom"; import Spinner from "Icons/Spinner"; -import { profileLink } from "SnortUtils"; import { getNip05PubKey } from "Pages/LoginPage"; +import ProfilePage from "Pages/Profile/ProfilePage"; +import { ThreadRoute } from "Element/Event/Thread"; export default function NostrLinkHandler() { const params = useParams(); - const navigate = useNavigate(); - const [loading, setLoading] = useState(true); + const [renderComponent, setRenderComponent] = useState(null); + const link = decodeURIComponent(params["*"] ?? "").toLowerCase(); async function handleLink(link: string) { const nav = tryParseNostrLink(link); if (nav) { if (nav.type === NostrPrefix.Event || nav.type === NostrPrefix.Note || nav.type === NostrPrefix.Address) { - navigate(`/e/${nav.encode()}`); + setRenderComponent(); // Directly render ThreadRoute } else if (nav.type === NostrPrefix.PublicKey || nav.type === NostrPrefix.Profile) { - navigate(`/p/${nav.encode()}`); + setRenderComponent(); // Directly render ProfilePage } } else { try { const pubkey = await getNip05PubKey(`${link}@${process.env.NIP05_DOMAIN}`); if (pubkey) { - navigate(profileLink(pubkey)); + setRenderComponent(); // Directly render ProfilePage } } catch { //ignored @@ -41,6 +42,10 @@ export default function NostrLinkHandler() { } }, [link]); + if (renderComponent) { + return renderComponent; + } + return (
{loading ? ( diff --git a/packages/app/src/Pages/Profile/ProfilePage.tsx b/packages/app/src/Pages/Profile/ProfilePage.tsx index 1a1320a1..d0833a93 100644 --- a/packages/app/src/Pages/Profile/ProfilePage.tsx +++ b/packages/app/src/Pages/Profile/ProfilePage.tsx @@ -52,7 +52,11 @@ import ProfileTab, { } from "Pages/Profile/ProfileTab"; import DisplayName from "../../Element/User/DisplayName"; -export default function ProfilePage() { +interface ProfilePageProps { + id?: string; +} + +export default function ProfilePage({ id: propId }: ProfilePageProps) { const params = useParams(); const navigate = useNavigate(); const [id, setId] = useState(); @@ -95,21 +99,22 @@ export default function ProfilePage() { const horizontalScroll = useHorizontalScroll(); useEffect(() => { - if (params.id?.match(EmailRegex)) { - getNip05PubKey(params.id).then(a => { + const resolvedId = propId || params.id; + if (resolvedId?.match(EmailRegex)) { + getNip05PubKey(resolvedId).then(a => { setId(a); }); } else { - const nav = tryParseNostrLink(params.id ?? ""); + const nav = tryParseNostrLink(resolvedId ?? ""); if (nav?.type === NostrPrefix.PublicKey || nav?.type === NostrPrefix.Profile) { // todo: use relays if any for nprofile setId(nav.id); } else { - setId(parseId(params.id ?? "")); + setId(parseId(resolvedId ?? "")); } } setTab(ProfileTab.Notes); - }, [params]); + }, [propId, params]); function musicStatus() { if (!status.music) return;