import { commands } from "@/commands"; import { ago, cn } from "@/commons"; import { User } from "@/components/user"; import { Plus, UsersThree } from "@phosphor-icons/react"; import * as ScrollArea from "@radix-ui/react-scroll-area"; import { useQuery, useQueryClient } from "@tanstack/react-query"; import { Link, Outlet, createLazyFileRoute } from "@tanstack/react-router"; import { listen } from "@tauri-apps/api/event"; import type { NostrEvent } from "nostr-tools"; import { useEffect } from "react"; type Payload = { event: string; sender: string; }; export const Route = createLazyFileRoute("/$account/chats")({ component: Screen, }); function Screen() { return (
); } function Header() { return (
); } function ChatList() { const { account } = Route.useParams(); const { isLoading, isError, data } = useQuery({ queryKey: ["chats"], queryFn: async () => { const res = await commands.getChats(); if (res.status === "ok") { const raw = res.data; const events = raw.map((item) => JSON.parse(item) as NostrEvent); return events; } else { throw new Error(res.error); } }, refetchOnWindowFocus: false, }); const queryClient = useQueryClient(); useEffect(() => { const unlisten = listen("synchronized", async () => { await queryClient.refetchQueries({ queryKey: ["chats"] }); }); return () => { unlisten.then((f) => f()); }; }, []); useEffect(() => { const unlisten = listen("event", async (data) => { const event: NostrEvent = JSON.parse(data.payload.event); const chats: NostrEvent[] = await queryClient.getQueryData(["chats"]); if (chats) { const exist = chats.find((ev) => ev.pubkey === event.pubkey); if (!exist) { await queryClient.setQueryData( ["chats"], (prevEvents: NostrEvent[]) => { if (!prevEvents) return prevEvents; if (event.pubkey === account) return; return [event, ...prevEvents]; }, ); } } }); return () => { unlisten.then((f) => f()); }; }, []); return ( {isLoading ? (
{Array.from(Array(5)).map((index) => (
))}
) : isError ? (
Error
) : ( data.map((item) => ( {({ isActive }) => (
{account === item.pubkey ? "(you)" : ""}
{ago(item.created_at)}
)} )) )} ); } function CurrentUser() { const { account } = Route.useParams(); return (
); }