import { commands } from "@/commands.gen"; import { toLumeEvents } from "@/commons"; import { Spinner, TextNote, User } from "@/components"; import { type LumeEvent, LumeWindow } from "@/system"; import { Kind } from "@/types"; import { MagnifyingGlass } from "@phosphor-icons/react"; import * as ScrollArea from "@radix-ui/react-scroll-area"; import { createLazyFileRoute } from "@tanstack/react-router"; import { message } from "@tauri-apps/plugin-dialog"; import { useCallback, useRef, useState, useTransition } from "react"; import { Virtualizer } from "virtua"; export const Route = createLazyFileRoute("/columns/_layout/search")({ component: Screen, }); function Screen() { const [query, setQuery] = useState(""); const [events, setEvents] = useState([]); const [isPending, startTransition] = useTransition(); const ref = useRef(null); const renderItem = useCallback( (event: LumeEvent) => { if (!event) return; switch (event.kind) { case Kind.Text: return ; case Kind.Metadata: return (
); default: return ; } }, [events], ); const search = () => { startTransition(async () => { if (!query.length) return; const res = await commands.search(query, null); if (res.status === "ok") { const data = toLumeEvents(res.data); setEvents(data); } else { await message(res.error, { title: "Search", kind: "error" }); return; } }); }; return (
setQuery(e.target.value)} onKeyDown={(event) => { if (event.key === "Enter") search(); }} className="h-9 px-5 flex-1 rounded-full border-none bg-black/5 dark:bg-white/10 placeholder:text-neutral-500 dark:placeholder:text-neutral-400 focus:bg-black/10 dark:focus:bg-white/10 focus:outline-none focus:ring-0" />
{isPending ? (
Searching...
) : !events.length ? (
Type somethings to search.
) : ( events.map((event) => renderItem(event)) )}
); }