refactor DirectMessageGetter (#230)

This commit is contained in:
BlowaterNostr 2023-10-09 18:52:30 +00:00 committed by GitHub
parent f97a8c9dbf
commit 9b8d9aa47d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 87 additions and 102 deletions

View File

@ -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

View File

@ -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,

View File

@ -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<string, NostrEvent /* thread root event */ | PublicKey /* selected user profile */>;
isGroupMessage: boolean;
};
export function convertEventsToChatMessages(
events: Iterable<DirectedMessage_Event>,
): 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;
}

View File

@ -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<string, NostrEvent /* thread root event */ | PublicKey /* selected user profile */>;
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;
}

View File

@ -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<NostrKind.DIRECT_MESSAGE>) {
@ -195,3 +199,56 @@ function is_DM_between(event: NostrEvent, myPubkey: string, theirPubKey: string)
return false;
}
}
export function convertEventsToChatMessages(
events: Iterable<DirectedMessage_Event>,
): 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;
}