Rev 3608 | Rev 3635 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
import React from 'react';
import { Box, Avatar, Typography, IconButton, Menu, MenuItem } from '@mui/material';
import { MoreVert, Report } from '@mui/icons-material';
export const MessageItem = ({ message, onReport }) => {
const [anchorEl, setAnchorEl] = React.useState(null);
const open = Boolean(anchorEl);
const handleClick = (event) => {
setAnchorEl(event.currentTarget);
};
const handleClose = () => {
setAnchorEl(null);
};
const handleReport = () => {
if (message.url_abuse_report) {
onReport({ url: message.url_abuse_report, id: message.uuid });
}
handleClose();
};
const renderMessageContent = () => {
switch (message.type) {
case 'text':
return (
<Typography variant='body2' sx={{ wordBreak: 'break-word' }}>
{message.message}
</Typography>
);
case 'image':
return (
<Box sx={{ maxWidth: '250px', maxHeight: '250px' }}>
<img
src={message.filename}
alt='Mensaje de imagen'
style={{
width: '100%',
height: 'auto',
borderRadius: '8px',
objectFit: 'cover'
}}
/>
</Box>
);
case 'document':
return (
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
<img
src='/images/extension/pdf.png'
alt='Documento'
style={{ width: '24px', height: '24px' }}
/>
<Typography variant='body2' component='a' href={message.filename} download>
Descargar documento
</Typography>
</Box>
);
default:
return (
<Typography variant='body2' sx={{ wordBreak: 'break-word' }}>
{message.message || 'Contenido no disponible'}
</Typography>
);
}
};
return (
<Box
sx={{
display: 'flex',
justifyContent: message.side === 'right' ? 'flex-end' : 'flex-start',
mb: 1,
px: 1
}}
>
<Box
sx={{
display: 'flex',
flexDirection: 'column',
maxWidth: '70%',
position: 'relative'
}}
>
{message.side === 'left' && (
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 0.5 }}>
<Avatar
src={message.sender_image}
alt={message.sender_name}
sx={{ width: 24, height: 24 }}
/>
<Typography variant='caption' color='text.secondary'>
{message.sender_name}
</Typography>
</Box>
)}
<Box
sx={{
backgroundColor: message.side === 'right' ? 'primary.main' : 'grey.100',
color: message.side === 'right' ? 'white' : 'text.primary',
borderRadius: message.side === 'right' ? '12px 12px 4px 12px' : '12px 12px 12px 4px',
padding: 1.5,
position: 'relative',
'&:hover .message-actions': {
opacity: 1
}
}}
>
{renderMessageContent()}
<Box
sx={{
display: 'flex',
justifyContent: 'space-between',
alignItems: 'center',
mt: 0.5,
gap: 1
}}
>
<Typography variant='caption' color='text.secondary'>
{message.date}
</Typography>
{message.url_abuse_report && (
<IconButton
size='small'
onClick={handleClick}
className='message-actions'
sx={{
opacity: 0,
transition: 'opacity 0.2s',
color: 'inherit'
}}
>
<MoreVert fontSize='small' />
</IconButton>
)}
</Box>
</Box>
</Box>
<Menu
anchorEl={anchorEl}
open={open}
onClose={handleClose}
anchorOrigin={{
vertical: 'top',
horizontal: 'right'
}}
transformOrigin={{
vertical: 'top',
horizontal: 'left'
}}
>
<MenuItem onClick={handleReport}>
<Report fontSize='small' sx={{ mr: 1 }} />
Reportar mensaje
</MenuItem>
</Menu>
</Box>
);
};