Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3608 | Rev 3634 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
3605 stevensc 1
import React from 'react';
3599 stevensc 2
import { Box, Avatar, Typography, IconButton, Menu, MenuItem } from '@mui/material';
3
import { MoreVert, Report } from '@mui/icons-material';
4
 
3610 stevensc 5
export const MessageItem = ({ message, onReport }) => {
3599 stevensc 6
  const [anchorEl, setAnchorEl] = React.useState(null);
7
  const open = Boolean(anchorEl);
8
 
9
  const handleClick = (event) => {
10
    setAnchorEl(event.currentTarget);
11
  };
12
 
13
  const handleClose = () => {
14
    setAnchorEl(null);
15
  };
16
 
17
  const handleReport = () => {
18
    if (message.url_abuse_report) {
19
      onReport({ url: message.url_abuse_report, id: message.uuid });
20
    }
21
    handleClose();
22
  };
23
 
24
  const renderMessageContent = () => {
25
    switch (message.type) {
26
      case 'text':
27
        return (
28
          <Typography variant='body2' sx={{ wordBreak: 'break-word' }}>
29
            {message.message}
30
          </Typography>
31
        );
32
      case 'image':
33
        return (
34
          <Box sx={{ maxWidth: '250px', maxHeight: '250px' }}>
35
            <img
36
              src={message.filename}
37
              alt='Mensaje de imagen'
38
              style={{
39
                width: '100%',
40
                height: 'auto',
41
                borderRadius: '8px',
42
                objectFit: 'cover'
43
              }}
44
            />
45
          </Box>
46
        );
47
      case 'document':
48
        return (
49
          <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
50
            <img
51
              src='/images/extension/pdf.png'
52
              alt='Documento'
53
              style={{ width: '24px', height: '24px' }}
54
            />
55
            <Typography variant='body2' component='a' href={message.filename} download>
56
              Descargar documento
57
            </Typography>
58
          </Box>
59
        );
60
      default:
61
        return (
62
          <Typography variant='body2' sx={{ wordBreak: 'break-word' }}>
63
            {message.message || 'Contenido no disponible'}
64
          </Typography>
65
        );
66
    }
67
  };
68
 
69
  return (
70
    <Box
71
      sx={{
72
        display: 'flex',
73
        justifyContent: message.side === 'right' ? 'flex-end' : 'flex-start',
74
        mb: 1,
75
        px: 1
76
      }}
77
    >
78
      <Box
79
        sx={{
80
          display: 'flex',
81
          flexDirection: 'column',
82
          maxWidth: '70%',
83
          position: 'relative'
84
        }}
85
      >
86
        {message.side === 'left' && (
87
          <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 0.5 }}>
88
            <Avatar
89
              src={message.sender_image}
90
              alt={message.sender_name}
91
              sx={{ width: 24, height: 24 }}
92
            />
93
            <Typography variant='caption' color='text.secondary'>
94
              {message.sender_name}
95
            </Typography>
96
          </Box>
97
        )}
98
 
99
        <Box
100
          sx={{
101
            backgroundColor: message.side === 'right' ? 'primary.main' : 'grey.100',
102
            color: message.side === 'right' ? 'white' : 'text.primary',
103
            borderRadius: message.side === 'right' ? '12px 12px 4px 12px' : '12px 12px 12px 4px',
104
            padding: 1.5,
105
            position: 'relative',
106
            '&:hover .message-actions': {
107
              opacity: 1
108
            }
109
          }}
110
        >
111
          {renderMessageContent()}
112
 
113
          <Box
114
            sx={{
115
              display: 'flex',
116
              justifyContent: 'space-between',
117
              alignItems: 'center',
118
              mt: 0.5,
119
              gap: 1
120
            }}
121
          >
122
            <Typography variant='caption' color='text.secondary'>
123
              {message.date}
124
            </Typography>
125
 
126
            {message.url_abuse_report && (
127
              <IconButton
128
                size='small'
129
                onClick={handleClick}
130
                className='message-actions'
131
                sx={{
132
                  opacity: 0,
133
                  transition: 'opacity 0.2s',
134
                  color: 'inherit'
135
                }}
136
              >
137
                <MoreVert fontSize='small' />
138
              </IconButton>
139
            )}
140
          </Box>
141
        </Box>
142
      </Box>
143
 
144
      <Menu
145
        anchorEl={anchorEl}
146
        open={open}
147
        onClose={handleClose}
148
        anchorOrigin={{
149
          vertical: 'top',
150
          horizontal: 'right'
151
        }}
152
        transformOrigin={{
153
          vertical: 'top',
154
          horizontal: 'left'
155
        }}
156
      >
157
        <MenuItem onClick={handleReport}>
158
          <Report fontSize='small' sx={{ mr: 1 }} />
159
          Reportar mensaje
160
        </MenuItem>
161
      </Menu>
162
    </Box>
163
  );
164
};