import { UIMessage as VercelMessage } from '@ai-sdk/react' import { useState } from 'react' import { toast } from 'sonner' import { cn } from 'ui' import { DeleteMessageConfirmModal } from './DeleteMessageConfirmModal' import { MessageActions } from './Message.Actions' import type { AddToolApprovalResponse, MessageInfo } from './Message.Context' import { MessageProvider, useMessageActionsContext, useMessageInfoContext } from './Message.Context' import { MessageDisplay } from './Message.Display' function AssistantMessage({ message }: { message: VercelMessage }) { const { id, variant, state, isLastMessage, readOnly, rating, isLoading } = useMessageInfoContext() const { onCancelEdit, onRate } = useMessageActionsContext() const handleRate = (newRating: 'positive' | 'negative', reason?: string) => { onRate?.(id, newRating, reason) } return ( {!readOnly && isLastMessage && onRate && !isLoading && ( handleRate('positive')} isActive={rating === 'positive'} disabled={!!rating} /> handleRate('negative', reason)} isActive={rating === 'negative'} disabled={!!rating} /> )} ) } function UserMessage({ message }: { message: VercelMessage }) { const { id, variant, state } = useMessageInfoContext() const { onCancelEdit, onEdit, onDelete } = useMessageActionsContext() const [showDeleteConfirmModal, setShowDeleteConfirmModal] = useState(false) return ( <> onEdit(id) : onCancelEdit} tooltip={state === 'idle' ? 'Edit message' : 'Cancel editing'} /> setShowDeleteConfirmModal(true)} /> { onDelete(id) setShowDeleteConfirmModal(false) toast.success('Message deleted successfully') }} onCancel={() => setShowDeleteConfirmModal(false)} /> ) } interface MessageProps { id: string message: VercelMessage isLoading: boolean readOnly?: boolean variant?: 'default' | 'warning' addToolApprovalResponse?: AddToolApprovalResponse onDelete: (id: string) => void onEdit: (id: string) => void isAfterEditedMessage: boolean isBeingEdited: boolean onCancelEdit: () => void isLastMessage?: boolean onRate?: (id: string, rating: 'positive' | 'negative', reason?: string) => void rating?: 'positive' | 'negative' | null } export function Message(props: MessageProps) { const message = props.message const { role } = message const isUserMessage = role === 'user' const messageInfo = { id: props.id, isLoading: props.isLoading, readOnly: props.readOnly, variant: props.variant, isUserMessage, state: props.isBeingEdited ? 'editing' : props.isAfterEditedMessage ? 'predecessor-editing' : 'idle', isLastMessage: props.isLastMessage, rating: props.rating, } satisfies MessageInfo const messageActions = { addToolApprovalResponse: props.addToolApprovalResponse, onDelete: props.onDelete, onEdit: props.onEdit, onCancelEdit: props.onCancelEdit, onRate: props.onRate, } return ( {isUserMessage ? : } ) }