import { commands } from "@/commands.gen"; import { Note, ReplyNote, Spinner } from "@/components"; import { LumeEvent, useEvent } from "@/system"; import type { EventPayload } from "@/types"; import * as ScrollArea from "@radix-ui/react-scroll-area"; import { useQuery } from "@tanstack/react-query"; import { createLazyFileRoute } from "@tanstack/react-router"; import { getCurrentWindow } from "@tauri-apps/api/window"; import { type RefObject, useEffect, useRef } from "react"; import { Virtualizer } from "virtua"; export const Route = createLazyFileRoute("/columns/_layout/events/$id")({ component: Screen, pendingComponent: Pending, }); function Pending() { return (
); } function Screen() { const ref = useRef(null); return ( }> ); } function RootEvent() { const { id } = Route.useParams(); const { data: event, error, isLoading, isError } = useEvent(id); if (isLoading) { return (

Loading...

); } if (isError || !event) { return (
{error?.message || "Event not found within your current relay set"}
); } return (
); } function ReplyList() { const { id } = Route.useParams(); const { queryClient } = Route.useRouteContext(); const { data, isLoading } = useQuery({ queryKey: ["replies", id], queryFn: async () => { const res = await commands.getReplies(id); if (res.status === "ok") { const events = res.data // Create Lume Events .map((item) => LumeEvent.from(item.raw, item.parsed)) // Filter quote .filter( (ev) => !ev.tags.filter((t) => t[0] === "q" || t[3] === "mention").length, ); return events; } else { throw new Error(res.error); } }, select: (events) => { const removeQueues = new Set(); for (const event of events) { const tags = event.tags.filter((t) => t[0] === "e" && t[1] !== id); if (tags.length === 1) { const index = events.findIndex((ev) => ev.id === tags[0][1]); if (index !== -1) { const rootEvent = events[index]; if (rootEvent.replies?.length) { rootEvent.replies.push(event); } else { rootEvent.replies = [event]; } // Add current event to queue removeQueues.add(event.id); continue; } } for (const tag of tags) { const id = tag[1]; const rootIndex = events.findIndex((ev) => ev.id === id); if (rootIndex !== -1) { const rootEvent = events[rootIndex]; if (rootEvent.replies?.length) { const childIndex = rootEvent.replies.findIndex( (ev) => ev.id === id, ); if (childIndex !== -1) { const childEvent = rootEvent.replies[rootIndex]; if (childEvent.replies?.length) { childEvent.replies.push(event); } else { childEvent.replies = [event]; } // Add current event to queue removeQueues.add(event.id); } } else { rootEvent.replies = [event]; // Add current event to queue removeQueues.add(event.id); } } break; } } return events.filter((ev) => !removeQueues.has(ev.id)); }, }); useEffect(() => { const unlisten = getCurrentWindow().listen( "event", async (data) => { const event = LumeEvent.from(data.payload.raw, data.payload.parsed); await queryClient.setQueryData( ["replies", id], (prevEvents: LumeEvent[]) => { if (!prevEvents) return [event]; return [event, ...prevEvents]; }, ); }, ); return () => { unlisten.then((f) => f()); }; }, []); useEffect(() => { const unlisten = getCurrentWindow().listen(id, async () => { await queryClient.invalidateQueries({ queryKey: ["replies", id] }); }); return () => { unlisten.then((f) => f()); }; }, []); return (
All replies
{isLoading ? (
Getting replies...
) : (
{!data?.length ? (

👋

Be the first to Reply!

) : ( data.map((event) => ) )}
)}
); }