import { SearchIcon } from "@lume/icons"; import { type Event, Kind } from "@lume/types"; import { Note, Spinner, User } from "@lume/ui"; import { createFileRoute } from "@tanstack/react-router"; import { useEffect, useState } from "react"; import { useDebounce } from "use-debounce"; export const Route = createFileRoute("/search")({ component: Screen, }); function Screen() { const { ark } = Route.useRouteContext(); const [loading, setLoading] = useState(false); const [events, setEvents] = useState([]); const [search, setSearch] = useState(""); const [value] = useDebounce(search, 500); const searchEvents = async () => { if (!value.length) return; // start loading setLoading(true); const data = await ark.search(value, 100); // update state setLoading(false); setEvents(data); }; useEffect(() => { searchEvents(); }, [value]); return (
setSearch(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") searchEvents(); }} placeholder="Search anything..." className="z-10 w-full h-20 pt-10 px-6 text-lg bg-transparent border-none focus:outline-none focus:ring-0 placeholder:text-neutral-500 dark:placeholder:text-neutral-600" />
{loading ? (
) : !events.length ? (
Empty
) : (
Users
{events .filter((ev) => ev.kind === Kind.Metadata) .map((event) => ( ))}
Notes
{events .filter((ev) => ev.kind === Kind.Text) .map((event) => ( ))}
)} {!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 }) { const { ark } = Route.useRouteContext(); return (
ark.open_event(event)} onKeyDown={() => ark.open_event(event)} className="p-3 bg-white rounded-lg dark:bg-black" >
{event.content}
); }