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 (
);
}