diff --git a/packages/app/src/Icons/Spinner.tsx b/packages/app/src/Icons/Spinner.tsx index b08ffde37..b53c2b2cd 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 79a98a7d9..c358ad211 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 87192ccc3..ead1a9c78 100644 --- a/packages/app/src/Pages/SearchPage.tsx +++ b/packages/app/src/Pages/SearchPage.tsx @@ -92,7 +92,7 @@ const SearchPage = () => { } return ( -
+