Dm chat fix

fixes #604
This commit is contained in:
2023-07-12 12:20:11 +01:00
parent 9be92003bb
commit 10d7c26470
3 changed files with 19 additions and 11 deletions

View File

@ -6,6 +6,7 @@ import { Chats } from "Cache";
import { findTag, unixNow } from "SnortUtils"; import { findTag, unixNow } from "SnortUtils";
import { Nip29ChatSystem } from "./nip29"; import { Nip29ChatSystem } from "./nip29";
import useModeration from "Hooks/useModeration"; import useModeration from "Hooks/useModeration";
import useLogin from "Hooks/useLogin";
export enum ChatType { export enum ChatType {
DirectMessage = 1, DirectMessage = 1,
@ -31,7 +32,7 @@ export interface ChatSystem {
subscription(id: string): RequestBuilder | undefined; subscription(id: string): RequestBuilder | undefined;
onEvent(evs: Array<NostrEvent>): Promise<void> | void; onEvent(evs: Array<NostrEvent>): Promise<void> | void;
listChats(): Array<Chat>; listChats(pk: string): Array<Chat>;
} }
export const Nip4Chats = new Nip4ChatSystem(Chats); export const Nip4Chats = new Nip4ChatSystem(Chats);
@ -58,6 +59,10 @@ export function inChatWith(e: NostrEvent, myPk: string) {
} }
} }
export function selfChat(e: NostrEvent, myPk: string) {
return chatTo(e) === myPk && e.pubkey === myPk;
}
export function lastReadInChat(id: string) { export function lastReadInChat(id: string) {
const k = `dm:seen:${id}`; const k = `dm:seen:${id}`;
return parseInt(window.localStorage.getItem(k) ?? "0"); return parseInt(window.localStorage.getItem(k) ?? "0");
@ -70,9 +75,10 @@ export function setLastReadIn(id: string) {
} }
export function useNip4Chat() { export function useNip4Chat() {
const { publicKey } = useLogin();
return useSyncExternalStore( return useSyncExternalStore(
c => Nip4Chats.hook(c), c => Nip4Chats.hook(c),
() => Nip4Chats.snapshot() () => Nip4Chats.snapshot(publicKey)
); );
} }

View File

@ -1,6 +1,6 @@
import { ExternalStore, FeedCache, dedupe } from "@snort/shared"; import { ExternalStore, FeedCache, dedupe } from "@snort/shared";
import { EventKind, NostrEvent, RequestBuilder, SystemInterface } from "@snort/system"; import { EventKind, NostrEvent, RequestBuilder, SystemInterface } from "@snort/system";
import { Chat, ChatSystem, ChatType, chatTo, inChatWith, lastReadInChat } from "chat"; import { Chat, ChatSystem, ChatType, inChatWith, lastReadInChat, selfChat } from "chat";
import { debug } from "debug"; import { debug } from "debug";
export class Nip4ChatSystem extends ExternalStore<Array<Chat>> implements ChatSystem { export class Nip4ChatSystem extends ExternalStore<Array<Chat>> implements ChatSystem {
@ -34,14 +34,16 @@ export class Nip4ChatSystem extends ExternalStore<Array<Chat>> implements ChatSy
return rb; return rb;
} }
takeSnapshot() { takeSnapshot(p: string) {
return this.listChats(); return this.listChats(p);
} }
listChats(): Chat[] { listChats(pk: string): Chat[] {
const myDms = this.#nip4Events(); const myDms = this.#nip4Events();
return dedupe(myDms.map(a => chatTo(a))).map(a => { return dedupe(myDms.map(a => inChatWith(a, pk))).map(a => {
const messages = myDms.filter(b => chatTo(b) === a || b.pubkey === a); const messages = myDms.filter(
b => (a === pk && selfChat(b, pk)) || (!selfChat(b, pk) && inChatWith(b, pk) === a)
);
return Nip4ChatSystem.createChatObj(a, messages); return Nip4ChatSystem.createChatObj(a, messages);
}); });
} }

View File

@ -24,9 +24,9 @@ export abstract class ExternalStore<TSnapshot> {
}; };
} }
snapshot() { snapshot(p?: any) {
if (this.#changed) { if (this.#changed) {
this.#snapshot = this.takeSnapshot(); this.#snapshot = this.takeSnapshot(p);
this.#changed = false; this.#changed = false;
} }
return this.#snapshot; return this.#snapshot;
@ -39,5 +39,5 @@ export abstract class ExternalStore<TSnapshot> {
} }
} }
abstract takeSnapshot(): TSnapshot; abstract takeSnapshot(p?: any): TSnapshot;
} }