import { SearchIcon } from "@lume/icons"; import { type Event, Kind } from "@lume/types"; import { Spinner } from "@lume/ui"; import { Note } from "@/components/note"; import { User } from "@/components/user"; import { createFileRoute } from "@tanstack/react-router"; import { useEffect, useState } from "react"; import { toast } from "sonner"; import { useDebounce } from "use-debounce"; export const Route = createFileRoute("/search")({ component: Screen, }); function Screen() { const [loading, setLoading] = useState(false); const [events, setEvents] = useState([]); const [search, setSearch] = useState(""); const [searchValue] = useDebounce(search, 500); const searchEvents = async () => { try { setLoading(true); const query = `https://api.nostr.wine/search?query=${searchValue}&kind=0,1`; const res = await fetch(query); const content = await res.json(); const events = content.data as Event[]; const sorted = events.sort((a, b) => b.created_at - a.created_at); setLoading(false); setEvents(sorted); } catch (e) { setLoading(false); toast.error(String(e)); } }; useEffect(() => { if (searchValue.length >= 3 && searchValue.length < 500) { searchEvents(); } }, [searchValue]); return (
setSearch(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") searchEvents(); }} placeholder="Search anything..." className="w-full h-20 pt-10 px-3 text-lg bg-transparent border-none focus:outline-none focus:ring-0 placeholder:text-neutral-500 dark:placeholder:text-neutral-600" />
{loading ? (
) : events.length ? (
Users
{events .filter((ev) => ev.kind === Kind.Metadata) .map((event, index) => ( ))}
Notes
{events .filter((ev) => ev.kind === Kind.Text) .map((event) => ( ))}
) : null} {!loading && !events.length ? (
Try searching for people, notes, or keywords
) : null}
); } function SearchUser({ event }: { event: Event }) { const { ark } = Route.useRouteContext(); return ( ); } function SearchNote({ event }: { event: Event }) { return (
); }