From 86247207a4879399fdab97f1d9b65ed37d7cdd75 Mon Sep 17 00:00:00 2001 From: Kieran Date: Fri, 25 Aug 2023 17:52:59 +0100 Subject: [PATCH] Simple search --- packages/app/src/Icons/Spinner.tsx | 8 +++- packages/app/src/Pages/Layout.tsx | 53 +++++++++++++++++++++++++-- packages/app/src/Pages/SearchPage.tsx | 2 +- 3 files changed, 57 insertions(+), 6 deletions(-) diff --git a/packages/app/src/Icons/Spinner.tsx b/packages/app/src/Icons/Spinner.tsx index b08ffde3..b53c2b2c 100644 --- a/packages/app/src/Icons/Spinner.tsx +++ b/packages/app/src/Icons/Spinner.tsx @@ -2,7 +2,13 @@ import IconProps from "./IconProps"; import "./Spinner.css"; const Spinner = (props: IconProps) => ( - + diff --git a/packages/app/src/Pages/Layout.tsx b/packages/app/src/Pages/Layout.tsx index 79a98a7d..c358ad21 100644 --- a/packages/app/src/Pages/Layout.tsx +++ b/packages/app/src/Pages/Layout.tsx @@ -19,6 +19,9 @@ import Avatar from "Element/Avatar"; import { profileLink } from "SnortUtils"; import { getCurrentSubscription } from "Subscription"; import Toaster from "Toaster"; +import Spinner from "Icons/Spinner"; +import { NostrPrefix, createNostrLink, tryParseNostrLink } from "@snort/system"; +import { fetchNip05Pubkey } from "Nip05/Verifier"; export default function Layout() { const location = useLocation(); @@ -143,6 +146,31 @@ const AccountHeader = () => { const { publicKey, latestNotification, readNotifications } = useLogin(); const profile = useUserProfile(publicKey); + const [search, setSearch] = useState(""); + const [searching, setSearching] = useState(false); + + async function searchThing() { + try { + setSearching(true); + const link = tryParseNostrLink(search); + if (link) { + navigate(`/${link.encode()}`); + return; + } + if (search.includes("@")) { + const [handle, domain] = search.split("@"); + const pk = await fetchNip05Pubkey(handle, domain); + if (pk) { + navigate(`/${createNostrLink(NostrPrefix.PublicKey, pk).encode()}`); + return; + } + } + navigate(`/search/${encodeURIComponent(search)}`); + } finally { + setSearch(""); + setSearching(false); + } + } const hasNotifications = useMemo( () => latestNotification > readNotifications, @@ -166,10 +194,27 @@ const AccountHeader = () => { return (
-
- - -
+ {!location.pathname.startsWith("/search") && ( +
+ setSearch(e.target.value)} + onKeyDown={async e => { + if (e.key === "Enter") { + await searchThing(); + } + }} + /> + {searching ? ( + + ) : ( + navigate("/search")} /> + )} +
+ )} {unreadDms > 0 && } diff --git a/packages/app/src/Pages/SearchPage.tsx b/packages/app/src/Pages/SearchPage.tsx index 87192ccc..ead1a9c7 100644 --- a/packages/app/src/Pages/SearchPage.tsx +++ b/packages/app/src/Pages/SearchPage.tsx @@ -92,7 +92,7 @@ const SearchPage = () => { } return ( -
+