import { Box, ScrollBox, Text, type ScrollBoxRenderable } from "../../../../ui"; import type { Dispatch, SetStateAction } from "react"; import type { InlineTickerCatalogEntry } from "../../../../state/hooks/inline-tickers"; import { Button } from "../../../../components"; import { colors } from "../../../../theme/colors"; import { t } from "../../../../i18n"; import type { ChatMessage, ChatUserSummary } from "../../../../api-client"; import { DesktopChatMessage } from "../message/desktop"; import { UserProfilePopover } from "../message/profile-popover"; import { TerminalChatMessage } from "../message/terminal"; interface MutableRef { current: T; } interface ChatTranscriptProps { beginReplyTo: (index: number, options?: { deferFocus?: boolean }) => void; beginEditMessage: (index: number, options?: { deferFocus?: boolean }) => boolean; canSend: boolean; catalog: Record; cancelProfilePopoverClose: () => void; chatWidth: number; contentWidth: number; handleTranscriptScrollActivity: (event?: { scroll?: { direction?: "up" | "down" | "left" | "right" } }) => void; hoveredIdx: number | null; jumpToMessage: (messageId: string) => void; loading: boolean; loadingOlderMessages: boolean; messagesError: string | null; onRetryMessages: () => void; messageAreaHeight: number; messageBodyWidth: number; messages: ChatMessage[]; nativePaneChrome: boolean | undefined; latestEditableMessageId: string | null; openTicker: (symbol: string) => void; profilePopoverUser: ChatUserSummary | null; registerMessageElement: (messageId: string, node: unknown | null) => void; scheduleProfilePopoverClose: () => void; scrollRef: MutableRef; selectedIdx: number; setHoveredIdx: Dispatch>; showProfilePopover: (user: ChatUserSummary) => void; onSetUpProfile: () => void; stickyTranscript: boolean; user: { id: string; username: string; emailVerified: boolean } | null; userByUsername: Map; } export function ChatTranscript({ beginReplyTo, beginEditMessage, canSend, catalog, cancelProfilePopoverClose, chatWidth, contentWidth, handleTranscriptScrollActivity, hoveredIdx, jumpToMessage, loading, loadingOlderMessages, messagesError, onRetryMessages, messageAreaHeight, messageBodyWidth, messages, nativePaneChrome, latestEditableMessageId, openTicker, profilePopoverUser, registerMessageElement, scheduleProfilePopoverClose, scrollRef, selectedIdx, setHoveredIdx, showProfilePopover, stickyTranscript, user, userByUsername, onSetUpProfile, }: ChatTranscriptProps) { return ( <> {loadingOlderMessages && ( {t("Loading earlier messages...")} )} {loading && messages.length === 0 ? ( {t("Loading...")} ) : messagesError && messages.length === 0 ? ( // A failed load must not read as an empty channel. {messagesError} ) : messages.length === 0 && ( {t("No messages yet. Be the first to say something!")} )} {messages.map((msg, index) => ( nativePaneChrome ? ( ) : ( ) ))} {profilePopoverUser && ( )} ); }