From b91dbb1a601a0bfe6c63b928edf795de6e9512ab Mon Sep 17 00:00:00 2001 From: Shantur Rathore Date: Thu, 26 Feb 2026 10:10:46 +0000 Subject: [PATCH] fix(ui): sync delete-hover overlays across preview and stream --- packages/ui/src/components/message-block.tsx | 36 +++++++++++++++++-- packages/ui/src/components/message-item.tsx | 12 +++++-- .../ui/src/components/message-preview.tsx | 5 +++ .../ui/src/components/message-section.tsx | 1 + .../ui/src/components/message-timeline.tsx | 3 ++ 5 files changed, 52 insertions(+), 5 deletions(-) diff --git a/packages/ui/src/components/message-block.tsx b/packages/ui/src/components/message-block.tsx index 7dc66e17..4f9560f7 100644 --- a/packages/ui/src/components/message-block.tsx +++ b/packages/ui/src/components/message-block.tsx @@ -199,6 +199,7 @@ interface MessageContentItemProps { onFork?: (messageId?: string) => void onContentRendered?: () => void showDeleteMessage?: boolean + deleteHover?: () => DeleteHoverState onDeleteHoverChange?: (state: DeleteHoverState) => void } @@ -287,6 +288,7 @@ function MessageContentItem(props: MessageContentItemProps) { isQueued={isQueued()} showAgentMeta={showAgentMeta()} showDeleteMessage={props.showDeleteMessage} + deleteHover={props.deleteHover} onDeleteHoverChange={props.onDeleteHoverChange} onRevert={props.onRevert} onFork={props.onFork} @@ -305,6 +307,7 @@ interface ToolCallItemProps { partId: string onContentRendered?: () => void showDeleteMessage?: boolean + deleteHover?: () => DeleteHoverState onDeleteHoverChange?: (state: DeleteHoverState) => void } @@ -401,10 +404,18 @@ function ToolCallItem(props: ToolCallItemProps) { } } + const isDeleteHoveredFromStore = () => { + const hover = props.deleteHover?.() ?? ({ kind: "none" } as DeleteHoverState) + return hover.kind === "part" && hover.messageId === props.messageId && hover.partId === props.partId + } + return ( {(resolvedToolPart) => ( -
+
{TOOL_ICON} @@ -747,6 +758,7 @@ export default function MessageBlock(props: MessageBlockProps) { messageIndex={props.messageIndex} lastAssistantIndex={props.lastAssistantIndex} showDeleteMessage={index() === 0} + deleteHover={props.deleteHover} onDeleteHoverChange={props.onDeleteHoverChange} onRevert={props.onRevert} onFork={props.onFork} @@ -765,6 +777,7 @@ export default function MessageBlock(props: MessageBlockProps) { messageId={toolItem.messageId} partId={toolItem.partId} showDeleteMessage={index() === 0} + deleteHover={props.deleteHover} onDeleteHoverChange={props.onDeleteHoverChange} onContentRendered={props.onContentRendered} /> @@ -809,6 +822,7 @@ export default function MessageBlock(props: MessageBlockProps) { messageId={(item as CompactionDisplayItem).messageId} partId={(item as CompactionDisplayItem).partId} showDeleteMessage={index() === 0} + deleteHover={props.deleteHover} onDeleteHoverChange={props.onDeleteHoverChange} /> @@ -823,6 +837,7 @@ export default function MessageBlock(props: MessageBlockProps) { showAgentMeta={(item as ReasoningDisplayItem).showAgentMeta} defaultExpanded={(item as ReasoningDisplayItem).defaultExpanded} showDeleteMessage={index() === 0} + deleteHover={props.deleteHover} onDeleteHoverChange={props.onDeleteHoverChange} /> @@ -858,6 +873,7 @@ interface CompactionCardProps { messageId: string partId: string showDeleteMessage?: boolean + deleteHover?: () => DeleteHoverState onDeleteHoverChange?: (state: DeleteHoverState) => void } @@ -914,10 +930,15 @@ function CompactionCard(props: CompactionCardProps) { } } + const isDeleteHoveredFromStore = () => { + const hover = props.deleteHover?.() ?? ({ kind: "none" } as DeleteHoverState) + return hover.kind === "part" && hover.messageId === props.messageId && hover.partId === props.partId + } + return (
DeleteHoverState onDeleteHoverChange?: (state: DeleteHoverState) => void } @@ -1130,6 +1152,11 @@ function ReasoningCard(props: ReasoningCardProps) { const [deletingMessage, setDeletingMessage] = createSignal(false) const [hoverDeletePart, setHoverDeletePart] = createSignal(false) + const isDeleteHoveredFromStore = () => { + const hover = props.deleteHover?.() ?? ({ kind: "none" } as DeleteHoverState) + return hover.kind === "part" && hover.messageId === props.messageId && hover.partId === props.partId + } + createEffect(() => { setExpanded(Boolean(props.defaultExpanded)) }) @@ -1238,7 +1265,10 @@ function ReasoningCard(props: ReasoningCardProps) { } return ( -
+
)