/** @jsx h */ import { Fragment, h } from "https://esm.sh/preact@10.17.1"; import { tw } from "https://esm.sh/twind@0.16.16"; import { emitFunc, EventEmitter } from "../event-bus.ts"; import { DirectMessagePanelUpdate, NameAndTime, ParseMessageContent, Time, ViewThread, ViewUserDetail, } from "./message-panel.tsx"; import { PublicKey } from "../lib/nostr-ts/key.ts"; import { ChatMessage, groupContinuousMessages } from "./message.ts"; import { Editor, EditorEvent, EditorModel } from "./editor.tsx"; import { Database_Contextual_View } from "../database.ts"; import { getUserInfoFromPublicKey, UserInfo } from "./contact-list.ts"; import { EventSyncer } from "./event_syncer.ts"; import { Avatar } from "./components/avatar.tsx"; import { ProfilesSyncer } from "../features/profile.ts"; import { DirectedMessage_Event, Text_Note_Event } from "../nostr.ts"; import { ButtonGroup } from "./components/button-group.tsx"; import { AboutIcon } from "./icons/about-icon.tsx"; import { PrimaryTextColor } from "./style/colors.ts"; interface MessageThreadProps { emit: emitFunc; messages: ChatMessage[]; myPublicKey: PublicKey; db: Database_Contextual_View; editorModel: EditorModel; profilesSyncer: ProfilesSyncer; eventSyncer: EventSyncer; allUserInfo: Map; } export function MessageThreadPanel(props: MessageThreadProps) { return (
Thread
); } function MessageThreadList(props: { myPublicKey: PublicKey; messages: ChatMessage[]; db: Database_Contextual_View; profilesSyncer: ProfilesSyncer; eventSyncer: EventSyncer; emit: emitFunc; allUserInfo: Map; }) { let groups = groupContinuousMessages(props.messages, (pre, cur) => { const sameAuthor = pre.event.pubkey == cur.event.pubkey; const _66sec = Math.abs(cur.created_at.getTime() - pre.created_at.getTime()) < 1000 * 60; return sameAuthor && _66sec; }); let groupNodes = []; for (let group of groups) { groupNodes.push( , ); } return (
    {groupNodes}
); } function MessageThreadBoxGroup(props: { messages: ChatMessage[]; myPublicKey: PublicKey; db: Database_Contextual_View; profilesSyncer: ProfilesSyncer; eventSyncer: EventSyncer; emit: emitFunc; allUserInfo: Map; }) { const first_group = props.messages[0]; const rows = []; rows.push(
  • {MessageThreadActions(first_group.event, props.emit)} { props.emit({ type: "ViewUserDetail", pubkey: first_group.event.publicKey, }); }} />
    {NameAndTime( first_group.event.publicKey, getUserInfoFromPublicKey(first_group.event.publicKey, props.allUserInfo) ?.profile?.profile, props.myPublicKey, first_group.created_at, )}
                        {ParseMessageContent(first_group, props.allUserInfo, props.profilesSyncer, props.eventSyncer, props.emit)}
                    
  • , ); for (let i = 1; i < props.messages.length; i++) { const msg = props.messages[i]; rows.push(
  • {MessageThreadActions(msg.event, props.emit)} {Time(msg.created_at)}
                        {ParseMessageContent(msg, props.allUserInfo, props.profilesSyncer, props.eventSyncer, props.emit)}
                        
  • , ); } const vnode = (
      {rows}
    ); // console.log("MessageBoxGroup", Date.now() - t) return vnode; } export function MessageThreadActions( event: Text_Note_Event | DirectedMessage_Event, emit: emitFunc<{ type: "ViewEventDetail"; event: Text_Note_Event | DirectedMessage_Event }>, ) { return ( ); }