feat(chat): show revert button on all user messages

Remove restriction preventing revert on first user message
Simplify message props by removing isFirstMessage flag
This commit is contained in:
Bohdan Triapitsyn
2026-01-02 19:54:16 +02:00
parent ad0439da39
commit dca8be01ca
3 changed files with 16 additions and 29 deletions
@@ -66,7 +66,6 @@ interface ChatMessageProps {
scrollToBottom?: (options?: { instant?: boolean; force?: boolean }) => void;
isPendingAnchor?: boolean;
turnGroupingContext?: TurnGroupingContext;
isFirstMessage?: boolean;
}
const ChatMessage: React.FC<ChatMessageProps> = ({
@@ -77,7 +76,6 @@ const ChatMessage: React.FC<ChatMessageProps> = ({
animationHandlers,
isPendingAnchor = false,
turnGroupingContext,
isFirstMessage = false,
}) => {
const { isMobile, hasTouchInput } = useDeviceInfo();
const { currentTheme } = useThemeSystem();
@@ -790,7 +788,6 @@ const ChatMessage: React.FC<ChatMessageProps> = ({
onAuxiliaryContentComplete={handleAuxiliaryContentComplete}
agentMention={agentMention}
onRevert={handleRevert}
isFirstMessage={isFirstMessage}
errorMessage={assistantErrorText}
/>
</div>
+13 -20
View File
@@ -80,26 +80,19 @@ const MessageList: React.FC<MessageListProps> = ({
)}
<div className="flex flex-col">
{displayMessages.map((message, index) => {
// Check if this is the first user message
const isFirstUserMessage = message.info.role === 'user' &&
!displayMessages.slice(0, index).some((m) => m.info.role === 'user');
return (
<ChatMessage
key={message.info.id}
message={message}
previousMessage={index > 0 ? displayMessages[index - 1] : undefined}
nextMessage={index < displayMessages.length - 1 ? displayMessages[index + 1] : undefined}
onContentChange={onMessageContentChange}
animationHandlers={getAnimationHandlers(message.info.id)}
scrollToBottom={scrollToBottom}
isPendingAnchor={pendingAnchorId === message.info.id}
turnGroupingContext={getContextForMessage(message.info.id)}
isFirstMessage={isFirstUserMessage}
/>
);
})}
{displayMessages.map((message, index) => (
<ChatMessage
key={message.info.id}
message={message}
previousMessage={index > 0 ? displayMessages[index - 1] : undefined}
nextMessage={index < displayMessages.length - 1 ? displayMessages[index + 1] : undefined}
onContentChange={onMessageContentChange}
animationHandlers={getAnimationHandlers(message.info.id)}
scrollToBottom={scrollToBottom}
isPendingAnchor={pendingAnchorId === message.info.id}
turnGroupingContext={getContextForMessage(message.info.id)}
/>
))}
</div>
@@ -133,7 +133,6 @@ interface MessageBodyProps {
agentMention?: AgentMentionInfo;
turnGroupingContext?: TurnGroupingContext;
onRevert?: () => void;
isFirstMessage?: boolean;
errorMessage?: string;
}
@@ -148,8 +147,7 @@ const UserMessageBody: React.FC<{
onShowPopup: (content: ToolPopupContent) => void;
agentMention?: AgentMentionInfo;
onRevert?: () => void;
isFirstMessage?: boolean;
}> = ({ messageId, parts, isMobile, hasTouchInput, hasTextContent, onCopyMessage, copiedMessage, onShowPopup, agentMention, onRevert, isFirstMessage }) => {
}> = ({ messageId, parts, isMobile, hasTouchInput, hasTextContent, onCopyMessage, copiedMessage, onShowPopup, agentMention, onRevert }) => {
const [copyHintVisible, setCopyHintVisible] = React.useState(false);
const copyHintTimeoutRef = React.useRef<number | null>(null);
@@ -241,12 +239,12 @@ const UserMessageBody: React.FC<{
})}
</div>
<MessageFilesDisplay files={parts} onShowPopup={onShowPopup} />
{(canCopyMessage && hasCopyableText) || (onRevert && !isFirstMessage) ? (
{(canCopyMessage && hasCopyableText) || onRevert ? (
<div className={cn(
"mt-1 flex items-center justify-end gap-2 opacity-0 pointer-events-none transition-opacity duration-150 group-hover/message:opacity-100 group-hover/message:pointer-events-auto focus-within:opacity-100 focus-within:pointer-events-auto",
copyHintVisible && "opacity-100 pointer-events-auto"
)}>
{onRevert && !isFirstMessage && (
{onRevert && (
<Tooltip delayDuration={1000}>
<TooltipTrigger asChild>
<Button
@@ -1228,7 +1226,6 @@ const MessageBody: React.FC<MessageBodyProps> = ({ isUser, ...props }) => {
onShowPopup={props.onShowPopup}
agentMention={props.agentMention}
onRevert={props.onRevert}
isFirstMessage={props.isFirstMessage}
/>
);
}