/** @jsx h */ import { h, VNode } from "https://esm.sh/preact@10.17.1"; import { tw } from "https://esm.sh/twind@0.16.16"; import * as cl from "./contact-list.tsx"; import { Database_Contextual_View } from "../database.ts"; import { MessagePanel, RightPanelModel } from "./message-panel.tsx"; import { EventBus } from "../event-bus.ts"; import { LeftArrowIcon } from "./icons/left-arrow-icon.tsx"; import { IconButtonClass } from "./components/tw.ts"; import { DM_EditorModel } from "./editor.tsx"; import { getConversationMessages, UI_Interaction_Event } from "./app_update.ts"; import { NostrAccountContext, NostrKind } from "../lib/nostr-ts/nostr.ts"; import { ConnectionPool } from "../lib/nostr-ts/relay.ts"; import { getProfileEvent, ProfilesSyncer } from "../features/profile.ts"; import { ChatMessage } from "./message.ts"; import { DM_Container_Model } from "./dm.ts"; import { getFocusedContent } from "./app.tsx"; import { EventSyncer } from "./event_syncer.ts"; import { UserInfo } from "./contact-list.ts"; type DirectMessageContainerProps = { editors: Map; rightPanelModel: RightPanelModel; myAccountContext: NostrAccountContext; pool: ConnectionPool; eventEmitter: EventBus; db: Database_Contextual_View; allUserInfo: Map; profilesSyncer: ProfilesSyncer; eventSyncer: EventSyncer; } & DM_Container_Model; export type MessageThread = { root: ChatMessage; replies: ChatMessage[]; }; export function DirectMessageContainer(props: DirectMessageContainerProps) { const t = Date.now(); const currentConversation = props.currentSelectedContact; // todo: refactor it to be more performant let currentEditorModel: DM_EditorModel | undefined; if (currentConversation) { for (const [v, editor] of props.editors.entries()) { if (v == currentConversation.hex) { currentEditorModel = editor; const profile = getProfileEvent(props.db, currentConversation); currentEditorModel.target.receiver = { pubkey: currentConversation, name: profile?.profile.name, picture: profile?.profile.picture, }; } } if (currentEditorModel == undefined) { throw new Error("impossible state"); } } console.log("DirectMessageContainer", Date.now() - t); let messagePanel: VNode | undefined; if (currentEditorModel) { const convoMsgs = getConversationMessages({ targetPubkey: currentEditorModel.target.receiver.pubkey.hex, allUserInfo: props.allUserInfo, }); console.log("DirectMessageContainer:convoMsgs", Date.now() - t); const focusedContent = (() => { let _ = getFocusedContent( props.focusedContent.get(currentEditorModel.target.receiver.pubkey.hex), props.allUserInfo, convoMsgs, ); if (_?.type == "MessageThread") { let editor = props.editors.get(_.data.root.event.id); if (editor == undefined) { editor = { id: _.data.root.event.id, files: [], text: "", tags: [ ["e", _.data.root.event.id], ], target: { kind: NostrKind.DIRECT_MESSAGE, receiver: currentEditorModel.target.receiver, }, }; props.editors.set(editor.id, editor); } return { ..._, editor, }; } return _; })(); messagePanel = MessagePanel({ myPublicKey: props.myAccountContext.publicKey, messages: convoMsgs, rightPanelModel: props.rightPanelModel, eventEmitter: props.eventEmitter, editorModel: currentEditorModel, focusedContent: focusedContent, db: props.db, profilesSyncer: props.profilesSyncer, eventSyncer: props.eventSyncer, allUserInfo: props.allUserInfo, }); } const vDom = (
{cl.ContactList({ database: props.db, currentSelected: currentConversation, userInfoMap: props.allUserInfo, ...props, })}
{currentConversation ? (
{currentEditorModel?.target.receiver.name || currentConversation.bech32()}
{messagePanel}
) : undefined}
); console.debug("DirectMessageContainer:end", Date.now() - t); return vDom; }