From 8bd694eb15b859c80ac99229ee9d02c109cf4caf Mon Sep 17 00:00:00 2001 From: Kieran Date: Fri, 31 Mar 2023 10:51:50 +0100 Subject: [PATCH] feat: short links --- packages/app/src/Pages/Layout.tsx | 2 +- packages/app/src/Pages/Login.tsx | 6 +- packages/app/src/Pages/NostrLinkHandler.tsx | 68 +++++++++++++++------ packages/app/src/index.tsx | 8 +-- 4 files changed, 57 insertions(+), 27 deletions(-) diff --git a/packages/app/src/Pages/Layout.tsx b/packages/app/src/Pages/Layout.tsx index f9850e2..dfdf3a0 100644 --- a/packages/app/src/Pages/Layout.tsx +++ b/packages/app/src/Pages/Layout.tsx @@ -110,7 +110,7 @@ export default function Layout() { if ("registerProtocolHandler" in window.navigator) { window.navigator.registerProtocolHandler( "web+nostr", - `${window.location.protocol}//${window.location.host}/handler/%s` + `${window.location.protocol}//${window.location.host}/%s` ); console.info("Registered protocol handler for 'web+nostr'"); } diff --git a/packages/app/src/Pages/Login.tsx b/packages/app/src/Pages/Login.tsx index 1ca1b63..05b6b39 100644 --- a/packages/app/src/Pages/Login.tsx +++ b/packages/app/src/Pages/Login.tsx @@ -49,10 +49,12 @@ const Artwork: Array = [ export async function getNip05PubKey(addr: string): Promise { const [username, domain] = addr.split("@"); - const rsp = await fetch(`https://${domain}/.well-known/nostr.json?name=${encodeURIComponent(username)}`); + const rsp = await fetch( + `https://${domain}/.well-known/nostr.json?name=${encodeURIComponent(username.toLocaleLowerCase())}` + ); if (rsp.ok) { const data = await rsp.json(); - const pKey = data.names[username]; + const pKey = data.names[username.toLowerCase()]; if (pKey) { return pKey; } diff --git a/packages/app/src/Pages/NostrLinkHandler.tsx b/packages/app/src/Pages/NostrLinkHandler.tsx index b60e47c..079ac13 100644 --- a/packages/app/src/Pages/NostrLinkHandler.tsx +++ b/packages/app/src/Pages/NostrLinkHandler.tsx @@ -1,38 +1,66 @@ import { NostrPrefix } from "@snort/nostr"; -import { useEffect } from "react"; +import { useEffect, useState } from "react"; +import { FormattedMessage } from "react-intl"; import { useDispatch } from "react-redux"; import { useNavigate, useParams } from "react-router-dom"; +import Spinner from "Icons/Spinner"; import { setRelays } from "State/Login"; -import { parseNostrLink, unixNowMs, unwrap } from "Util"; +import { parseNostrLink, profileLink, unixNowMs, unwrap } from "Util"; +import { getNip05PubKey } from "Pages/Login"; export default function NostrLinkHandler() { const params = useParams(); + const [loading, setLoading] = useState(true); const dispatch = useDispatch(); const navigate = useNavigate(); const link = decodeURIComponent(params["*"] ?? "").toLowerCase(); + async function handleLink(link: string) { + const nav = parseNostrLink(link); + if (nav) { + if ((nav.relays?.length ?? 0) > 0) { + // todo: add as ephemerial connection + dispatch( + setRelays({ + relays: Object.fromEntries(unwrap(nav.relays).map(a => [a, { read: true, write: false }])), + createdAt: unixNowMs(), + }) + ); + } + if (nav.type === NostrPrefix.Event || nav.type === NostrPrefix.Note || nav.type === NostrPrefix.Address) { + navigate(`/e/${nav.encode()}`); + } else if (nav.type === NostrPrefix.PublicKey || nav.type === NostrPrefix.Profile) { + navigate(`/p/${nav.encode()}`); + } + } else { + try { + const pubkey = await getNip05PubKey(`${link}@snort.social`); + if (pubkey) { + navigate(profileLink(pubkey)); + } + } catch { + //ignored + } + } + setLoading(false); + } + useEffect(() => { if (link.length > 0) { - const nav = parseNostrLink(link); - if (nav) { - if ((nav.relays?.length ?? 0) > 0) { - // todo: add as ephemerial connection - dispatch( - setRelays({ - relays: Object.fromEntries(unwrap(nav.relays).map(a => [a, { read: true, write: false }])), - createdAt: unixNowMs(), - }) - ); - } - if (nav.type === NostrPrefix.Event || nav.type === NostrPrefix.Note || nav.type === NostrPrefix.Address) { - navigate(`/e/${nav.encode()}`); - } else if (nav.type === NostrPrefix.PublicKey || nav.type === NostrPrefix.Profile) { - navigate(`/p/${nav.encode()}`); - } - } + handleLink(link).catch(console.error); } }, [link]); - return <>Could not handle {link}; + return ( +
+ {loading ? ( + + ) : ( + + + + )} +
+ ); } diff --git a/packages/app/src/index.tsx b/packages/app/src/index.tsx index 7ff5c36..c78d200 100644 --- a/packages/app/src/index.tsx +++ b/packages/app/src/index.tsx @@ -92,12 +92,12 @@ export const router = createBrowserRouter([ path: "/search/:keyword?", element: , }, - { - path: "/handler/*", - element: , - }, ...NewUserRoutes, ...WalletRoutes, + { + path: "/*", + element: , + }, ], }, ]);