Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 3089 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

import React, { useState } from 'react'
import parse from 'html-react-parser'
import styled from 'styled-components'
import LikeButton from '../like-button/LikeButton'
import { addNotification } from '../../../../redux/notification/notification.actions'
import { useDispatch } from 'react-redux'

const StyledChatImgMessage = styled.div`
  display: flex;
  justify-content: center;
  align-items: center;
  position: initial !important;
  transform: initial !important;
  .chat_image_container {
    video {
      width: 100%;
      outline: none;
    }
    img {
      width: 150px;
      max-height: 200px;
    }
    .pdf {
      width: 40px;
    }
  }
  .chat_image__download_button {
    margin-left: 0.5rem;
    .fa {
      font-size: 1rem;
      color: gray;
    }
  }
`

const ResponseMessageContainer = styled.div`
  display: flex;
  flex-direction: column;
  text-align: center;
  gap: 10px;
  align-items: ${props => props.isRight ? 'flex-end' : 'flex-start'};
`

function propsAreEqual (prevProp, nextProp) {
  return prevProp.time === nextProp.time
}

const MessageTemplate = ({ message, setResponseMessage, responseMessage, time }) => {
  const [isShow, setIsShow] = useState(false)
  const [isLiked, setIsLiked] = useState(false)
  const dispatch = useDispatch()

  const senderName = (message) => {
    if (message.type === 'group') {
      return message.u === 1 ? '' : message.user_name
    }
  }

  const handleLike = () => {
    setIsLiked(!isLiked)
    setIsShow(!isShow)
  }

  const handleResponse = (msg) => {
    setIsShow(false)
    setResponseMessage(msg)
  }

  const handleCopy = async () => {
    await navigator.clipboard.writeText(`${message.m}`)
    dispatch(addNotification({
      style: 'success',
      msg: 'Mensaje copiado en el portapapeles'
    }))
    setIsShow(!isShow)
  }

  switch (message.mtype) {
    case 'text':
      return (
        <li
          key={message.id}
          className={`clearfix ${message.u === 1 ? 'odd' : ''} m-t-10 conversers${message.u}`}
        >
          <div className="conversation-text">
            <div className="conversation_container w-100">
              {
                responseMessage &&
                <ResponseMessageContainer isRight={message.u === 1}>
                  <span>{`Respondiendo a ${responseMessage.user_name}`}</span>
                  <div className="ctext-wrap">
                    {senderName(responseMessage)}
                    <p className="">
                      {parse(emojione.shortnameToImage(responseMessage.m))}
                      <br />
                    </p>
                  </div>
                </ResponseMessageContainer>
              }
              <div className="conversation-text">
                <div className="ctext-wrap">
                  {senderName(message)}
                  <p className="">
                    {parse(emojione.shortnameToImage(message.m))}
                    <br />
                    <div className="d-inline-flex align-items-center">
                      {
                        !message.not_received &&
                        <i className={'fa fa-check text-right ellipsis '} style={message.seen ? { color: 'blue' } : { color: 'gray' }} />
                      }
                      <label>{time}</label>
                    </div>
                  </p>
                  {
                    isLiked &&
                    <i
                      className="fas fa-heart"
                      style={{
                        color: '#0961bf',
                        position: 'absolute',
                        top: '87%',
                        left: '85%'
                      }}
                    />
                  }
                </div>
                <i
                  className="la la-ellipsis-v icon"
                  style={{ position: 'relative' }}
                  onClick={() => setIsShow(!isShow)}
                />
                {
                  isShow &&
                  <div className="display-reactions" >
                    <LikeButton onClick={handleLike} />
                    <button type="button" onClick={() => handleResponse(message)}>
                      <i className="fa fa-reply" />
                    </button>
                    <button type="button" onClick={() => handleCopy(message)}>
                      <i className="fa fa-copy" />
                    </button>
                  </div>
                }
              </div>
            </div>
          </div>
        </li>
      )
    case 'image':
      return (
        <li
          key={message.id}
          className={`clearfix ${message.u === 1 ? 'odd' : ''} m-t-10 conversers${message.u}`}
        >
          <div
            className="conversation-text"
            data-toggle="tooltip"
            data-placement="left"
            data-html="true"
          >
            <div className="ctext-wrap">
              {senderName(message)}
              <StyledChatImgMessage>
                <div className="chat_image_container">
                  <img src={message.m} alt="chat_image" />
                </div>
                {
                  message.u !== 1 &&
                  <a
                    href={message.m}
                    download
                    className="chat_image__download_button"
                  >
                    <i className="fa fa-arrow-circle-o-down" />
                  </a>
                }
              </StyledChatImgMessage>
              <br />
              <i className="text-right">{time}</i>
              {
                isLiked &&
                <i
                  className="fas fa-heart"
                  style={{
                    color: '#0961bf',
                    position: 'absolute',
                    top: '87%',
                    left: '85%'
                  }}
                />
              }
            </div>
            <i
              className="la la-ellipsis-v icon"
              style={{ position: 'relative' }}
              onClick={() => setIsShow(!isShow)}
            />
            {
              isShow &&
              <div className="display-reactions">
                <LikeButton onClick={handleLike} />
                <button type="button" onClick={() => handleResponse(message)}>
                  <i className="fa fa-reply" />
                </button>
              </div>
            }
          </div>
        </li>
      )
    case 'video':
      return (
        <li
          key={message.id}
          className={`clearfix ${message.u === 1 ? 'odd' : ''} m-t-10 conversers${message.u}`}
        >
          <div
            className="conversation-text"
            data-toggle="tooltip"
            data-placement="left"
            data-html="true"
          >
            <div className="ctext-wrap">
              {senderName(message)}
              <StyledChatImgMessage>
                <a
                  href={message.m}
                  target="_blank"
                  className="chat_image__download_button" rel="noreferrer"
                >
                  <div className="chat_image_container">
                    <video src={message.m} preload="none" controls></video>
                  </div>
                </a>
                {message.u !== 1 &&
                  <a
                    href={message.m}
                    download
                    className="chat_image__download_button"
                  >
                    <i className="fa fa-arrow-circle-o-down" />
                  </a>
                }
              </StyledChatImgMessage>
              <br />
              <i className="text-right">{time}</i>
              {
                isLiked &&
                <i
                  className="fas fa-heart"
                  style={{
                    color: '#0961bf',
                    position: 'absolute',
                    top: '87%',
                    left: '85%'
                  }}
                />
              }
            </div>
            <i
              className="la la-ellipsis-v icon"
              style={{ position: 'relative' }}
              onClick={() => setIsShow(!isShow)}
            />
            {
              isShow &&
              <div className="display-reactions">
                <LikeButton onClick={handleLike} />
                <button type="button" onClick={() => handleResponse(message)}>
                  <i className="fa fa-reply" />
                </button>
              </div>
            }
          </div>
        </li>
      )
    case 'document':
      return (
        <li
          key={message.id}
          className={`clearfix ${message.u === 1 ? 'odd' : ''} m-t-10 conversers${message.u}`}
        >
          <div
            className="conversation-text"
            data-toggle="tooltip"
            data-placement="left"
            data-html="true"
          >
            <div className="ctext-wrap">
              {senderName(message)}
              <StyledChatImgMessage>
                <div className="chat_image_container">
                  <img
                    className="pdf"
                    src="/storage/type/default/filename/pdf.png"
                    alt="pdf"
                  />
                </div>
                {message.u !== 1 &&
                  <a
                    href={message.m}
                    target="_blank"
                    className="chat_image__download_button" rel="noreferrer"
                  >
                    <i className="fa ti-arrow-circle-down"></i>
                  </a>
                }
              </StyledChatImgMessage>
              <br />
              <i className="text-right">{time}</i>
              {
                isLiked &&
                <i
                  className="fas fa-heart"
                  style={{
                    color: '#0961bf',
                    position: 'absolute',
                    top: '87%',
                    left: '85%'
                  }}
                />
              }
            </div>
            <i
              className="la la-ellipsis-v icon"
              style={{ position: 'relative' }}
              onClick={() => setIsShow(!isShow)}
            />
            {
              isShow &&
              <div className="display-reactions">
                <LikeButton onClick={handleLike} />
                <button type="button" onClick={() => handleResponse(message)}>
                  <i className="fa fa-reply" />
                </button>
              </div>
            }
          </div>
        </li>
      )
    default:
      return (
        <li
          key={message.id}
          className={`clearfix ${message.u === 1 ? 'odd' : ''} m-t-10 conversers${message.u}`}
        >
          <div
            className="conversation-text"
            data-toggle="tooltip"
            data-placement="left"
            data-html="true"
          >
            <div className="ctext-wrap">
              {senderName(message)}
              <p>
                {message.mtype}
                <br />
                <i className="text-right">{time}</i>
              </p>
            </div>
            <i
              className="la la-ellipsis-v icon"
              style={{ position: 'relative' }}
              onClick={() => setIsShow(!isShow)}
            />
            {
              isShow &&
              <div className="display-reactions">
                <LikeButton onClick={handleLike} />
                <button type="button" onClick={() => setResponseMessage(message)}>
                  <i className="fa fa-reply" />
                </button>
              </div>
            }
          </div>
        </li>
      )
  }
}

export default React.memo(MessageTemplate, propsAreEqual)