| | import { Box, Stack, Typography, IconButton, Tooltip } from '@mui/material';
|
| | import CloseIcon from '@mui/icons-material/Close';
|
| | import type { Message } from '@/types/agent';
|
| |
|
| | interface UserMessageProps {
|
| | message: Message;
|
| |
|
| | isLastTurn?: boolean;
|
| |
|
| | onUndoTurn?: () => void;
|
| |
|
| | isProcessing?: boolean;
|
| | }
|
| |
|
| | export default function UserMessage({
|
| | message,
|
| | isLastTurn = false,
|
| | onUndoTurn,
|
| | isProcessing = false,
|
| | }: UserMessageProps) {
|
| | const showUndo = isLastTurn && !isProcessing && !!onUndoTurn;
|
| |
|
| | return (
|
| | <Stack
|
| | direction="row"
|
| | spacing={1.5}
|
| | justifyContent="flex-end"
|
| | alignItems="flex-start"
|
| | sx={{
|
| | // Show the undo button when hovering the entire row
|
| | '& .undo-btn': {
|
| | opacity: 0,
|
| | transition: 'opacity 0.15s ease',
|
| | },
|
| | '&:hover .undo-btn': {
|
| | opacity: 1,
|
| | },
|
| | }}
|
| | >
|
| | {/* Undo button — visible on hover, left of the bubble */}
|
| | {showUndo && (
|
| | <Box className="undo-btn" sx={{ display: 'flex', alignItems: 'center', mt: 0.75 }}>
|
| | <Tooltip title="Remove this turn" placement="left">
|
| | <IconButton
|
| | onClick={onUndoTurn}
|
| | size="small"
|
| | sx={{
|
| | width: 24,
|
| | height: 24,
|
| | color: 'var(--muted-text)',
|
| | '&:hover': {
|
| | color: 'var(--accent-red)',
|
| | bgcolor: 'rgba(244,67,54,0.08)',
|
| | },
|
| | }}
|
| | >
|
| | <CloseIcon sx={{ fontSize: 14 }} />
|
| | </IconButton>
|
| | </Tooltip>
|
| | </Box>
|
| | )}
|
| |
|
| | <Box
|
| | sx={{
|
| | maxWidth: { xs: '88%', md: '72%' },
|
| | bgcolor: 'var(--surface)',
|
| | borderRadius: 1.5,
|
| | borderTopRightRadius: 4,
|
| | px: { xs: 1.5, md: 2.5 },
|
| | py: 1.5,
|
| | border: '1px solid var(--border)',
|
| | }}
|
| | >
|
| | <Typography
|
| | variant="body1"
|
| | sx={{
|
| | fontSize: '0.925rem',
|
| | lineHeight: 1.65,
|
| | color: 'var(--text)',
|
| | whiteSpace: 'pre-wrap',
|
| | wordBreak: 'break-word',
|
| | }}
|
| | >
|
| | {message.content}
|
| | </Typography>
|
| |
|
| | <Typography
|
| | variant="caption"
|
| | sx={{
|
| | display: 'block',
|
| | textAlign: 'right',
|
| | mt: 1,
|
| | fontSize: '0.68rem',
|
| | color: 'var(--muted-text)',
|
| | opacity: 0.7,
|
| | }}
|
| | >
|
| | {new Date(message.timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}
|
| | </Typography>
|
| | </Box>
|
| | </Stack>
|
| | );
|
| | }
|
| |
|