Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 11350 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
15761 stevensc 1
import React, { useState } from 'react'
2
import parse from 'html-react-parser'
3
import styled from 'styled-components'
4
import LikeButton from '../like-button/LikeButton'
5
import { addNotification } from '../../../../redux/notification/notification.actions'
6
import { useDispatch } from 'react-redux'
11350 nelberth 7
 
8
const StyledChatImgMessage = styled.div`
9
  display: flex;
10
  justify-content: center;
11
  align-items: center;
12
  position: initial !important;
13
  transform: initial !important;
14
  .chat_image_container {
15
    video {
16
      width: 100%;
17
      outline: none;
18
    }
19
    img {
20
      width: 150px;
21
      max-height: 200px;
22
    }
23
    .pdf {
24
      width: 40px;
25
    }
26
  }
27
  .chat_image__download_button {
28
    margin-left: 0.5rem;
29
    .fa {
15761 stevensc 30
      font-size: 1rem;
31
      color: gray;
11350 nelberth 32
    }
33
  }
15761 stevensc 34
`
11350 nelberth 35
 
36
const ResponseMessageContainer = styled.div`
37
  display: flex;
38
  flex-direction: column;
39
  text-align: center;
40
  gap: 10px;
41
  align-items: ${props => props.isRight ? 'flex-end' : 'flex-start'};
42
`
43
 
15761 stevensc 44
function propsAreEqual (prevProp, nextProp) {
45
  return prevProp.time === nextProp.time
46
}
11350 nelberth 47
 
15761 stevensc 48
const MessageTemplate = ({ message, setResponseMessage, responseMessage, time }) => {
49
  const [isShow, setIsShow] = useState(false)
50
  const [isLiked, setIsLiked] = useState(false)
11350 nelberth 51
  const dispatch = useDispatch()
52
 
53
  const senderName = (message) => {
15761 stevensc 54
    if (message.type === 'group') {
55
      return message.u === 1 ? '' : message.user_name
11350 nelberth 56
    }
15761 stevensc 57
  }
11350 nelberth 58
 
59
  const handleLike = () => {
60
    setIsLiked(!isLiked)
61
    setIsShow(!isShow)
62
  }
63
 
15761 stevensc 64
  const handleResponse = (msg) => {
65
    setIsShow(false)
66
    setResponseMessage(msg)
67
  }
68
 
11350 nelberth 69
  const handleCopy = async () => {
70
    await navigator.clipboard.writeText(`${message.m}`)
71
    dispatch(addNotification({
15761 stevensc 72
      style: 'success',
73
      msg: 'Mensaje copiado en el portapapeles'
11350 nelberth 74
    }))
75
    setIsShow(!isShow)
76
  }
77
 
78
  switch (message.mtype) {
15761 stevensc 79
    case 'text':
11350 nelberth 80
      return (
81
        <li
82
          key={message.id}
15761 stevensc 83
          className={`clearfix ${message.u === 1 ? 'odd' : ''} m-t-10 conversers${message.u}`}
11350 nelberth 84
        >
85
          <div className="conversation-text">
15761 stevensc 86
            <div className="conversation_container w-100">
11350 nelberth 87
              {
15761 stevensc 88
                responseMessage &&
11350 nelberth 89
                <ResponseMessageContainer isRight={message.u === 1}>
90
                  <span>{`Respondiendo a ${responseMessage.user_name}`}</span>
91
                  <div className="ctext-wrap">
92
                    {senderName(responseMessage)}
93
                    <p className="">
94
                      {parse(emojione.shortnameToImage(responseMessage.m))}
95
                      <br />
96
                    </p>
97
                  </div>
98
                </ResponseMessageContainer>
99
              }
100
              <div className="conversation-text">
101
                <div className="ctext-wrap">
102
                  {senderName(message)}
103
                  <p className="">
104
                    {parse(emojione.shortnameToImage(message.m))}
105
                    <br />
15761 stevensc 106
                    <div className="d-inline-flex align-items-center">
107
                      {
108
                        !message.not_received &&
109
                        <i className={'fa fa-check text-right ellipsis '} style={message.seen ? { color: 'blue' } : { color: 'gray' }} />
110
                      }
111
                      <label>{time}</label>
112
                    </div>
11350 nelberth 113
                  </p>
114
                  {
15761 stevensc 115
                    isLiked &&
11350 nelberth 116
                    <i
117
                      className="fas fa-heart"
118
                      style={{
119
                        color: '#0961bf',
120
                        position: 'absolute',
121
                        top: '87%',
122
                        left: '85%'
123
                      }}
124
                    />
125
                  }
126
                </div>
127
                <i
128
                  className="la la-ellipsis-v icon"
129
                  style={{ position: 'relative' }}
130
                  onClick={() => setIsShow(!isShow)}
15761 stevensc 131
                />
11350 nelberth 132
                {
15761 stevensc 133
                  isShow &&
134
                  <div className="display-reactions" >
135
                    <LikeButton onClick={handleLike} />
136
                    <button type="button" onClick={() => handleResponse(message)}>
137
                      <i className="fa fa-reply" />
11350 nelberth 138
                    </button>
15761 stevensc 139
                    <button type="button" onClick={() => handleCopy(message)}>
140
                      <i className="fa fa-copy" />
11350 nelberth 141
                    </button>
142
                  </div>
143
                }
144
              </div>
145
            </div>
146
          </div>
147
        </li>
15761 stevensc 148
      )
149
    case 'image':
11350 nelberth 150
      return (
151
        <li
152
          key={message.id}
15761 stevensc 153
          className={`clearfix ${message.u === 1 ? 'odd' : ''} m-t-10 conversers${message.u}`}
11350 nelberth 154
        >
155
          <div
156
            className="conversation-text"
157
            data-toggle="tooltip"
158
            data-placement="left"
159
            data-html="true"
160
          >
161
            <div className="ctext-wrap">
162
              {senderName(message)}
163
              <StyledChatImgMessage>
164
                <div className="chat_image_container">
165
                  <img src={message.m} alt="chat_image" />
166
                </div>
15761 stevensc 167
                {
168
                  message.u !== 1 &&
11350 nelberth 169
                  <a
170
                    href={message.m}
15761 stevensc 171
                    download
11350 nelberth 172
                    className="chat_image__download_button"
173
                  >
15761 stevensc 174
                    <i className="fa fa-arrow-circle-o-down" />
11350 nelberth 175
                  </a>
15761 stevensc 176
                }
11350 nelberth 177
              </StyledChatImgMessage>
178
              <br />
15761 stevensc 179
              <i className="text-right">{time}</i>
180
              {
181
                isLiked &&
182
                <i
183
                  className="fas fa-heart"
184
                  style={{
185
                    color: '#0961bf',
186
                    position: 'absolute',
187
                    top: '87%',
188
                    left: '85%'
189
                  }}
190
                />
191
              }
11350 nelberth 192
            </div>
15761 stevensc 193
            <i
194
              className="la la-ellipsis-v icon"
195
              style={{ position: 'relative' }}
196
              onClick={() => setIsShow(!isShow)}
197
            />
198
            {
199
              isShow &&
200
              <div className="display-reactions">
201
                <LikeButton onClick={handleLike} />
202
                <button type="button" onClick={() => handleResponse(message)}>
203
                  <i className="fa fa-reply" />
204
                </button>
205
              </div>
206
            }
11350 nelberth 207
          </div>
208
        </li>
15761 stevensc 209
      )
210
    case 'video':
11350 nelberth 211
      return (
212
        <li
213
          key={message.id}
15761 stevensc 214
          className={`clearfix ${message.u === 1 ? 'odd' : ''} m-t-10 conversers${message.u}`}
11350 nelberth 215
        >
216
          <div
217
            className="conversation-text"
218
            data-toggle="tooltip"
219
            data-placement="left"
220
            data-html="true"
221
          >
222
            <div className="ctext-wrap">
223
              {senderName(message)}
224
              <StyledChatImgMessage>
15761 stevensc 225
                <a
226
                  href={message.m}
227
                  target="_blank"
228
                  className="chat_image__download_button" rel="noreferrer"
229
                >
230
                  <div className="chat_image_container">
231
                    <video src={message.m} preload="none" controls></video>
232
                  </div>
233
                </a>
234
                {message.u !== 1 &&
11350 nelberth 235
                  <a
236
                    href={message.m}
15761 stevensc 237
                    download
11350 nelberth 238
                    className="chat_image__download_button"
239
                  >
15761 stevensc 240
                    <i className="fa fa-arrow-circle-o-down" />
11350 nelberth 241
                  </a>
15761 stevensc 242
                }
11350 nelberth 243
              </StyledChatImgMessage>
244
              <br />
15761 stevensc 245
              <i className="text-right">{time}</i>
246
              {
247
                isLiked &&
248
                <i
249
                  className="fas fa-heart"
250
                  style={{
251
                    color: '#0961bf',
252
                    position: 'absolute',
253
                    top: '87%',
254
                    left: '85%'
255
                  }}
256
                />
257
              }
11350 nelberth 258
            </div>
15761 stevensc 259
            <i
260
              className="la la-ellipsis-v icon"
261
              style={{ position: 'relative' }}
262
              onClick={() => setIsShow(!isShow)}
263
            />
264
            {
265
              isShow &&
266
              <div className="display-reactions">
267
                <LikeButton onClick={handleLike} />
268
                <button type="button" onClick={() => handleResponse(message)}>
269
                  <i className="fa fa-reply" />
270
                </button>
271
              </div>
272
            }
11350 nelberth 273
          </div>
274
        </li>
15761 stevensc 275
      )
276
    case 'document':
11350 nelberth 277
      return (
278
        <li
279
          key={message.id}
15761 stevensc 280
          className={`clearfix ${message.u === 1 ? 'odd' : ''} m-t-10 conversers${message.u}`}
11350 nelberth 281
        >
282
          <div
283
            className="conversation-text"
284
            data-toggle="tooltip"
285
            data-placement="left"
286
            data-html="true"
287
          >
288
            <div className="ctext-wrap">
289
              {senderName(message)}
290
              <StyledChatImgMessage>
291
                <div className="chat_image_container">
292
                  <img
293
                    className="pdf"
294
                    src="/storage/type/default/filename/pdf.png"
295
                    alt="pdf"
296
                  />
297
                </div>
15761 stevensc 298
                {message.u !== 1 &&
11350 nelberth 299
                  <a
300
                    href={message.m}
301
                    target="_blank"
15761 stevensc 302
                    className="chat_image__download_button" rel="noreferrer"
11350 nelberth 303
                  >
304
                    <i className="fa ti-arrow-circle-down"></i>
305
                  </a>
15761 stevensc 306
                }
11350 nelberth 307
              </StyledChatImgMessage>
308
              <br />
15761 stevensc 309
              <i className="text-right">{time}</i>
310
              {
311
                isLiked &&
312
                <i
313
                  className="fas fa-heart"
314
                  style={{
315
                    color: '#0961bf',
316
                    position: 'absolute',
317
                    top: '87%',
318
                    left: '85%'
319
                  }}
320
                />
321
              }
11350 nelberth 322
            </div>
15761 stevensc 323
            <i
324
              className="la la-ellipsis-v icon"
325
              style={{ position: 'relative' }}
326
              onClick={() => setIsShow(!isShow)}
327
            />
328
            {
329
              isShow &&
330
              <div className="display-reactions">
331
                <LikeButton onClick={handleLike} />
332
                <button type="button" onClick={() => handleResponse(message)}>
333
                  <i className="fa fa-reply" />
334
                </button>
335
              </div>
336
            }
11350 nelberth 337
          </div>
338
        </li>
15761 stevensc 339
      )
11350 nelberth 340
    default:
341
      return (
342
        <li
343
          key={message.id}
15761 stevensc 344
          className={`clearfix ${message.u === 1 ? 'odd' : ''} m-t-10 conversers${message.u}`}
11350 nelberth 345
        >
346
          <div
347
            className="conversation-text"
348
            data-toggle="tooltip"
349
            data-placement="left"
350
            data-html="true"
351
          >
352
            <div className="ctext-wrap">
353
              {senderName(message)}
15761 stevensc 354
              <p>
11350 nelberth 355
                {message.mtype}
356
                <br />
15761 stevensc 357
                <i className="text-right">{time}</i>
11350 nelberth 358
              </p>
359
            </div>
15761 stevensc 360
            <i
361
              className="la la-ellipsis-v icon"
362
              style={{ position: 'relative' }}
363
              onClick={() => setIsShow(!isShow)}
364
            />
365
            {
366
              isShow &&
367
              <div className="display-reactions">
368
                <LikeButton onClick={handleLike} />
369
                <button type="button" onClick={() => setResponseMessage(message)}>
370
                  <i className="fa fa-reply" />
371
                </button>
372
              </div>
373
            }
11350 nelberth 374
          </div>
375
        </li>
15761 stevensc 376
      )
11350 nelberth 377
  }
15761 stevensc 378
}
11350 nelberth 379
 
15761 stevensc 380
export default React.memo(MessageTemplate, propsAreEqual)