({
agentPubkeys,
channel,
channelId,
channelName,
currentPubkey,
disabled = false,
firstUnreadReplyId,
huddleMemberPubkeys,
huddleMemberPubkeysPending = false,
layout = "standalone",
editTarget,
isSending,
isSinglePanelView = false,
isFollowingThread,
isMessageUnreadById,
onCancelEdit,
onCancelReply,
onClose,
onDelete,
onEdit,
onEditLastOwnMessage,
onEditSave,
onFollowThread,
onMarkUnread,
onMarkRead,
onExpandReplies,
onScrollTargetResolved,
onSelectReplyTarget,
onSend,
onToggleReaction,
onUnfollowThread,
profiles,
replyTargetMessage,
scrollTargetId,
threadHead,
threadHeadVideoReviewContext,
threadReplies,
threadUnreadCount,
threadReplyUnreadCounts,
threadTypingPubkeys,
toolbarExtraActions,
widthPx,
transparentChrome = false,
}: MessageThreadPanelProps)
| 283 | } |
| 284 | |
| 285 | export function MessageThreadPanel({ |
| 286 | agentPubkeys, |
| 287 | channel, |
| 288 | channelId, |
| 289 | channelName, |
| 290 | currentPubkey, |
| 291 | disabled = false, |
| 292 | firstUnreadReplyId, |
| 293 | huddleMemberPubkeys, |
| 294 | huddleMemberPubkeysPending = false, |
| 295 | layout = "standalone", |
| 296 | editTarget, |
| 297 | isSending, |
| 298 | isSinglePanelView = false, |
| 299 | isFollowingThread, |
| 300 | isMessageUnreadById, |
| 301 | onCancelEdit, |
| 302 | onCancelReply, |
| 303 | onClose, |
| 304 | onDelete, |
| 305 | onEdit, |
| 306 | onEditLastOwnMessage, |
| 307 | onEditSave, |
| 308 | onFollowThread, |
| 309 | onMarkUnread, |
| 310 | onMarkRead, |
| 311 | onExpandReplies, |
| 312 | onScrollTargetResolved, |
| 313 | onSelectReplyTarget, |
| 314 | onSend, |
| 315 | onToggleReaction, |
| 316 | onUnfollowThread, |
| 317 | profiles, |
| 318 | replyTargetMessage, |
| 319 | scrollTargetId, |
| 320 | threadHead, |
| 321 | threadHeadVideoReviewContext, |
| 322 | threadReplies, |
| 323 | threadUnreadCount, |
| 324 | threadReplyUnreadCounts, |
| 325 | threadTypingPubkeys, |
| 326 | toolbarExtraActions, |
| 327 | widthPx, |
| 328 | transparentChrome = false, |
| 329 | }: MessageThreadPanelProps) { |
| 330 | const threadBodyRef = React.useRef<HTMLDivElement>(null); |
| 331 | const threadContentRef = React.useRef<HTMLDivElement>(null); |
| 332 | const threadComposerWrapperRef = React.useRef<HTMLDivElement>(null); |
| 333 | const [hoveredCollapseBranchId, setHoveredCollapseBranchId] = React.useState< |
| 334 | string | null |
| 335 | >(null); |
| 336 | const [collapsedThreadHeadId, setCollapsedThreadHeadId] = React.useState< |
| 337 | string | null |
| 338 | >(null); |
| 339 | const isOverlay = useIsThreadPanelOverlay(); |
| 340 | const threadHeadId = threadHead?.id ?? null; |
| 341 | useEscapeKey(onClose, isOverlay || isSinglePanelView); |
| 342 | useComposerHeightPadding( |
nothing calls this directly
no test coverage detected