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;
+}