mirror of
https://github.com/BlowaterNostr/blowater.git
synced 2024-10-18 07:33:22 +00:00
refactor DirectMessageGetter (#230)
This commit is contained in:
parent
f97a8c9dbf
commit
9b8d9aa47d
@ -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
|
||||
|
@ -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,
|
||||
|
69
UI/dm.ts
69
UI/dm.ts
@ -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;
|
||||
}
|
34
UI/dm.tsx
34
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<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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user