import { SearchIcon } from "@lume/icons"; import { type NostrEvent, 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"; import { LumeEvent, LumeWindow } from "@lume/system"; 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 NostrEvent[]; const lumeEvents = events.map((ev) => new LumeEvent(ev)); const sorted = lumeEvents.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 px-3 pt-10 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) => ( ))}
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: LumeEvent }) { return ( ); } function SearchNote({ event }: { event: LumeEvent }) { return (
); }