2023-08-28 17:58:05 +00:00
|
|
|
import { NostrEvent } from "../lib/nostr-ts/nostr.ts";
|
2023-07-16 15:04:23 +00:00
|
|
|
import {
|
2023-09-12 14:51:27 +00:00
|
|
|
DirectedMessage_Event,
|
2023-07-16 15:04:23 +00:00
|
|
|
getTags,
|
|
|
|
groupImageEvents,
|
|
|
|
reassembleBase64ImageFromEvents,
|
|
|
|
} from "../nostr.ts";
|
2023-06-30 14:05:57 +00:00
|
|
|
import { ChatMessage } from "./message.ts";
|
2023-08-28 17:58:05 +00:00
|
|
|
import { PublicKey } from "../lib/nostr-ts/key.ts";
|
2023-09-23 21:33:30 +00:00
|
|
|
import { ConversationGroup } from "./contact-list.tsx";
|
2023-07-11 10:45:57 +00:00
|
|
|
|
2023-06-30 14:05:57 +00:00
|
|
|
import { SearchModel } from "./search_model.ts";
|
|
|
|
import { UserInfo } from "./contact-list.ts";
|
|
|
|
|
2023-09-15 08:58:40 +00:00
|
|
|
export type DM_Model = {
|
2023-09-23 21:33:30 +00:00
|
|
|
selectedContactGroup: ConversationGroup;
|
2023-06-30 14:05:57 +00:00
|
|
|
currentSelectedContact: PublicKey | undefined;
|
|
|
|
focusedContent: Map<string, NostrEvent /* thread root event */ | PublicKey /* selected user profile */>;
|
|
|
|
hasNewMessages: Set<string>;
|
|
|
|
};
|
|
|
|
|
|
|
|
export function convertEventsToChatMessages(
|
2023-09-12 14:51:27 +00:00
|
|
|
events: Iterable<DirectedMessage_Event>,
|
2023-06-30 14:05:57 +00:00
|
|
|
userProfiles: Map<string, UserInfo>,
|
|
|
|
): 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],
|
2023-09-12 14:51:27 +00:00
|
|
|
content: textEvents[i].decryptedContent,
|
2023-06-30 14:05:57 +00:00
|
|
|
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 author = userProfiles.get(imageEvents[0].pubkey);
|
|
|
|
const pubkey = PublicKey.FromHex(imageEvents[0].pubkey);
|
|
|
|
if (pubkey instanceof Error) {
|
|
|
|
throw new Error(imageEvents[0].pubkey);
|
|
|
|
}
|
|
|
|
messages.push({
|
|
|
|
event: imageEvents[0],
|
|
|
|
content: imageBase64,
|
|
|
|
type: "image",
|
|
|
|
created_at: new Date(imageEvents[0].created_at * 1000),
|
|
|
|
lamport: getTags(imageEvents[0]).lamport_timestamp,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
return messages;
|
|
|
|
}
|