feat: efficient data query

This commit is contained in:
reya
2024-08-01 13:52:14 +07:00
parent fb28cf3bc0
commit 8f73e8ccd8
6 changed files with 162 additions and 102 deletions

View File

@@ -13,7 +13,11 @@ import { useCallback, useRef, useState, useTransition } from "react";
import { useEffect } from "react";
import { Virtualizer } from "virtua";
type Payload = {
type ChatPayload = {
events: string[];
};
type EventPayload = {
event: string;
sender: string;
};
@@ -140,7 +144,29 @@ function List() {
);
useEffect(() => {
const unlisten = listen<Payload>("event", async (data) => {
const unlisten = listen<ChatPayload>(`sync_chat_${id}`, async (data) => {
const raw = data.payload.events;
const events: NostrEvent[] = raw.map((item) => JSON.parse(item));
const chats: NostrEvent[] = await queryClient.getQueryData(["chats", id]);
if (chats?.length) {
const newEvents = [...events, ...chats];
const dedup = newEvents.filter(
(obj1, i, arr) => arr.findIndex((obj2) => obj2.id === obj1.id) === i,
);
await queryClient.setQueryData(["chats", id], dedup);
} else {
await queryClient.setQueryData(["chats", id], events);
}
});
return () => {
unlisten.then((f) => f());
};
}, []);
useEffect(() => {
const unlisten = listen<EventPayload>("event", async (data) => {
const event: NostrEvent = JSON.parse(data.payload.event);
const sender = data.payload.sender;
const receivers = getReceivers(event.tags);

View File

@@ -19,6 +19,10 @@ import { message } from "@tauri-apps/plugin-dialog";
import type { NostrEvent } from "nostr-tools";
import { useCallback, useEffect, useState, useTransition } from "react";
type ChatPayload = {
events: string[];
};
type EventPayload = {
event: string;
sender: string;
@@ -95,8 +99,20 @@ function ChatList() {
});
useEffect(() => {
const unlisten = listen("synchronized", async () => {
await queryClient.refetchQueries({ queryKey: ["chats"] });
const unlisten = listen<ChatPayload>("sync_chat", async (data) => {
const raw = data.payload.events;
const events: NostrEvent[] = raw.map((item) => JSON.parse(item));
const chats: NostrEvent[] = await queryClient.getQueryData(["chats"]);
if (chats?.length) {
const newEvents = [...events, ...chats];
const uniqs = [
...new Map(newEvents.map((item) => [item.pubkey, item])).values(),
];
await queryClient.setQueryData(["chats"], uniqs);
} else {
await queryClient.setQueryData(["chats"], events);
}
});
return () => {