Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3605 | Rev 3608 | 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
 
3607 stevensc 5
const MessageItem = ({ message, elementRef, 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
      }}
3607 stevensc 77
      ref={elementRef}
3599 stevensc 78
    >
79
      <Box
80
        sx={{
81
          display: 'flex',
82
          flexDirection: 'column',
83
          maxWidth: '70%',
84
          position: 'relative'
85
        }}
86
      >
87
        {message.side === 'left' && (
88
          <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 0.5 }}>
89
            <Avatar
90
              src={message.sender_image}
91
              alt={message.sender_name}
92
              sx={{ width: 24, height: 24 }}
93
            />
94
            <Typography variant='caption' color='text.secondary'>
95
              {message.sender_name}
96
            </Typography>
97
          </Box>
98
        )}
99
 
100
        <Box
101
          sx={{
102
            backgroundColor: message.side === 'right' ? 'primary.main' : 'grey.100',
103
            color: message.side === 'right' ? 'white' : 'text.primary',
104
            borderRadius: message.side === 'right' ? '12px 12px 4px 12px' : '12px 12px 12px 4px',
105
            padding: 1.5,
106
            position: 'relative',
107
            '&:hover .message-actions': {
108
              opacity: 1
109
            }
110
          }}
111
        >
112
          {renderMessageContent()}
113
 
114
          <Box
115
            sx={{
116
              display: 'flex',
117
              justifyContent: 'space-between',
118
              alignItems: 'center',
119
              mt: 0.5,
120
              gap: 1
121
            }}
122
          >
123
            <Typography variant='caption' color='text.secondary'>
124
              {message.date}
125
            </Typography>
126
 
127
            {message.url_abuse_report && (
128
              <IconButton
129
                size='small'
130
                onClick={handleClick}
131
                className='message-actions'
132
                sx={{
133
                  opacity: 0,
134
                  transition: 'opacity 0.2s',
135
                  color: 'inherit'
136
                }}
137
              >
138
                <MoreVert fontSize='small' />
139
              </IconButton>
140
            )}
141
          </Box>
142
        </Box>
143
      </Box>
144
 
145
      <Menu
146
        anchorEl={anchorEl}
147
        open={open}
148
        onClose={handleClose}
149
        anchorOrigin={{
150
          vertical: 'top',
151
          horizontal: 'right'
152
        }}
153
        transformOrigin={{
154
          vertical: 'top',
155
          horizontal: 'left'
156
        }}
157
      >
158
        <MenuItem onClick={handleReport}>
159
          <Report fontSize='small' sx={{ mr: 1 }} />
160
          Reportar mensaje
161
        </MenuItem>
162
      </Menu>
163
    </Box>
164
  );
165
};
166
 
3605 stevensc 167
export default MessageItem;