From 9b8d9aa47d287a68c429c84fdd33c6788b6e9bfc Mon Sep 17 00:00:00 2001 From: BlowaterNostr <127284497+BlowaterNostr@users.noreply.github.com> Date: Mon, 9 Oct 2023 18:52:30 +0000 Subject: [PATCH] refactor DirectMessageGetter (#230) --- UI/app_model.ts | 2 +- UI/app_update.tsx | 25 ++--------------- UI/dm.ts | 69 ----------------------------------------------- UI/dm.tsx | 34 +++++++++++++++++------ features/dm.ts | 59 +++++++++++++++++++++++++++++++++++++++- 5 files changed, 87 insertions(+), 102 deletions(-) delete mode 100644 UI/dm.ts diff --git a/UI/app_model.ts b/UI/app_model.ts index d6f6629..204f4d0 100644 --- a/UI/app_model.ts +++ b/UI/app_model.ts @@ -2,10 +2,10 @@ import { NavigationModel } from "./nav.tsx"; import { SearchInitModel, SearchModel } from "./search_model.ts"; import { ProfileData } from "../features/profile.ts"; import { RightPanelModel } from "./message-panel.tsx"; -import { DM_Model } from "./dm.ts"; import { App } from "./app.tsx"; import { SignInModel } from "./signIn.tsx"; import { EditorModel } from "./editor.tsx"; +import { DM_Model } from "./dm.tsx"; export type Model = { app: App | undefined; // app is only available after sign-in diff --git a/UI/app_update.tsx b/UI/app_update.tsx index e2626da..392d47f 100644 --- a/UI/app_update.tsx +++ b/UI/app_update.tsx @@ -7,9 +7,8 @@ import { ConversationLists } from "./conversation-list.ts"; import * as csp from "https://raw.githubusercontent.com/BlowaterNostr/csp/master/csp.ts"; import { Database_Contextual_View } from "../database.ts"; -import { convertEventsToChatMessages } from "./dm.ts"; -import { DirectedMessageController, sendDMandImages } from "../features/dm.ts"; +import { convertEventsToChatMessages, DirectedMessageController, sendDMandImages } from "../features/dm.ts"; import { notify } from "./notification.ts"; import { EventBus } from "../event-bus.ts"; import { ContactUpdate } from "./conversation-list.tsx"; @@ -458,33 +457,13 @@ export async function* UI_Interaction_Update(args: { } export type DirectMessageGetter = { - getDirectMessages(publicKey: string): DirectedMessage_Event[]; + getDirectMessages(publicKey: string): ChatMessage[]; }; export type GroupMessageGetter = { getGroupMessages(publicKey: string): ChatMessage[]; }; -export function getConversationMessages(args: { - targetPubkey: string; - isGroupChat: boolean; - dmGetter: DirectMessageGetter; - gmGetter: GroupMessageGetter; -}): ChatMessage[] { - const { targetPubkey } = args; - if (args.isGroupChat) { - return args.gmGetter.getGroupMessages(args.targetPubkey); - } - - let events = args.dmGetter.getDirectMessages(targetPubkey); - if (events == undefined) { - events = []; - } - - const messages = convertEventsToChatMessages(events); - return messages; -} - export function updateConversation( model: Model, targetPublicKey: PublicKey, diff --git a/UI/dm.ts b/UI/dm.ts deleted file mode 100644 index 0fd45ff..0000000 --- a/UI/dm.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { NostrEvent } from "../lib/nostr-ts/nostr.ts"; -import { - DirectedMessage_Event, - getTags, - groupImageEvents, - reassembleBase64ImageFromEvents, -} from "../nostr.ts"; -import { ChatMessage } from "./message.ts"; -import { PublicKey } from "../lib/nostr-ts/key.ts"; -import { EditorModel } from "./editor.tsx"; - -export type DM_Model = { - currentEditor: EditorModel | undefined; - focusedContent: Map; - isGroupMessage: boolean; -}; - -export function convertEventsToChatMessages( - events: Iterable, -): ChatMessage[] { - const messages: ChatMessage[] = []; - const groups = groupImageEvents(events); - let pubKeys = Array.from(groups.values()).map((es) => es[0].pubkey); - - let textEvents = groups.get(undefined); - if (textEvents === undefined) { - textEvents = []; - } - pubKeys = pubKeys.concat(textEvents.map((e) => e.pubkey)); - - groups.delete(undefined); - - for (let i = 0; i < textEvents.length; i++) { - const pubkey = PublicKey.FromHex(textEvents[i].pubkey); - if (pubkey instanceof Error) { - throw new Error(textEvents[i].pubkey); - } - messages.push({ - event: textEvents[i], - author: pubkey, - content: textEvents[i].decryptedContent, - type: "text", - created_at: new Date(textEvents[i].created_at * 1000), - lamport: getTags(textEvents[i]).lamport_timestamp, - }); - } - - for (const imageEvents of groups.values()) { - const imageBase64 = reassembleBase64ImageFromEvents(imageEvents); - if (imageBase64 instanceof Error) { - console.info(imageBase64.message); - continue; - } - const pubkey = PublicKey.FromHex(imageEvents[0].pubkey); - if (pubkey instanceof Error) { - throw new Error(imageEvents[0].pubkey); - } - messages.push({ - event: imageEvents[0], - author: pubkey, - content: imageBase64, - type: "image", - created_at: new Date(imageEvents[0].created_at * 1000), - lamport: getTags(imageEvents[0]).lamport_timestamp, - }); - } - - return messages; -} diff --git a/UI/dm.tsx b/UI/dm.tsx index 51c459b..1859b18 100644 --- a/UI/dm.tsx +++ b/UI/dm.tsx @@ -6,16 +6,10 @@ import { MessagePanel, RightPanelModel } from "./message-panel.tsx"; import { EventBus } from "../event-bus.ts"; import { LeftArrowIcon } from "./icons/left-arrow-icon.tsx"; import { CenterClass, IconButtonClass } from "./components/tw.ts"; -import { - DirectMessageGetter, - getConversationMessages, - GroupMessageGetter, - UI_Interaction_Event, -} from "./app_update.tsx"; -import { NostrAccountContext } from "../lib/nostr-ts/nostr.ts"; +import { DirectMessageGetter, GroupMessageGetter, UI_Interaction_Event } from "./app_update.tsx"; +import { NostrAccountContext, NostrEvent } from "../lib/nostr-ts/nostr.ts"; import { ConnectionPool } from "../lib/nostr-ts/relay.ts"; import { ProfileSyncer } from "../features/profile.ts"; -import { DM_Model } from "./dm.ts"; import { getFocusedContent } from "./app.tsx"; import { EventSyncer } from "./event_syncer.ts"; import { ButtonGroup } from "./components/button-group.tsx"; @@ -25,6 +19,15 @@ import { GroupMessageController } from "../features/gm.ts"; import { ProfileGetter } from "./search.tsx"; import { InviteIcon } from "./icons2/invite-icon.tsx"; import { PublicKey } from "../lib/nostr-ts/key.ts"; +import { convertEventsToChatMessages } from "../features/dm.ts"; +import { ChatMessage } from "./message.ts"; +import { EditorModel } from "./editor.tsx"; + +export type DM_Model = { + currentEditor: EditorModel | undefined; + focusedContent: Map; + isGroupMessage: boolean; +}; type DirectMessageContainerProps = { rightPanelModel: RightPanelModel; @@ -169,3 +172,18 @@ export function DirectMessageContainer(props: DirectMessageContainerProps) { console.debug("DirectMessageContainer:end", Date.now() - t); return vDom; } + +export function getConversationMessages(args: { + targetPubkey: string; + isGroupChat: boolean; + dmGetter: DirectMessageGetter; + gmGetter: GroupMessageGetter; +}): ChatMessage[] { + const { targetPubkey } = args; + if (args.isGroupChat) { + return args.gmGetter.getGroupMessages(args.targetPubkey); + } + + let messages = args.dmGetter.getDirectMessages(targetPubkey); + return messages; +} diff --git a/features/dm.ts b/features/dm.ts index f404e82..27939f0 100644 --- a/features/dm.ts +++ b/features/dm.ts @@ -5,14 +5,17 @@ import { compare, DirectedMessage_Event, getTags, + groupImageEvents, Parsed_Event, prepareNostrImageEvent, + reassembleBase64ImageFromEvents, Tag, } from "../nostr.ts"; import { PublicKey } from "../lib/nostr-ts/key.ts"; import { prepareEncryptedNostrEvent } from "../lib/nostr-ts/event.ts"; import { DirectMessageGetter } from "../UI/app_update.tsx"; import { parseDM } from "../database.ts"; +import { ChatMessage } from "../UI/message.ts"; export async function sendDMandImages(args: { sender: NostrAccountContext; @@ -169,7 +172,8 @@ export class DirectedMessageController implements DirectMessageGetter { events.push(event); } } - return events.sort(compare); + const messages = convertEventsToChatMessages(events.sort(compare)); + return messages; } async addEvent(event: Parsed_Event) { @@ -195,3 +199,56 @@ function is_DM_between(event: NostrEvent, myPubkey: string, theirPubKey: string) return false; } } + +export function convertEventsToChatMessages( + events: Iterable, +): ChatMessage[] { + const messages: ChatMessage[] = []; + const groups = groupImageEvents(events); + let pubKeys = Array.from(groups.values()).map((es) => es[0].pubkey); + + let textEvents = groups.get(undefined); + if (textEvents === undefined) { + textEvents = []; + } + pubKeys = pubKeys.concat(textEvents.map((e) => e.pubkey)); + + groups.delete(undefined); + + for (let i = 0; i < textEvents.length; i++) { + const pubkey = PublicKey.FromHex(textEvents[i].pubkey); + if (pubkey instanceof Error) { + throw new Error(textEvents[i].pubkey); + } + messages.push({ + event: textEvents[i], + author: pubkey, + content: textEvents[i].decryptedContent, + type: "text", + created_at: new Date(textEvents[i].created_at * 1000), + lamport: getTags(textEvents[i]).lamport_timestamp, + }); + } + + for (const imageEvents of groups.values()) { + const imageBase64 = reassembleBase64ImageFromEvents(imageEvents); + if (imageBase64 instanceof Error) { + console.info(imageBase64.message); + continue; + } + const pubkey = PublicKey.FromHex(imageEvents[0].pubkey); + if (pubkey instanceof Error) { + throw new Error(imageEvents[0].pubkey); + } + messages.push({ + event: imageEvents[0], + author: pubkey, + content: imageBase64, + type: "image", + created_at: new Date(imageEvents[0].created_at * 1000), + lamport: getTags(imageEvents[0]).lamport_timestamp, + }); + } + + return messages; +}