Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 11394 | Rev 15853 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

import React, { useEffect, useRef } from "react";
import parse from "html-react-parser";

import styles from "./messages.module.scss";

const Messages = (props) => {
  const { onScrollToBottom, oldMessages, newMessages, chatType } = props;
  const lastEl = useRef();
  const lastMessageEl = useRef();

  useEffect(() => {
     (lastEl.current);
    if (lastEl.current) {
      lastEl.current.onload = () => {
         ("scrolled");
        onScrollToBottom();
      };
    }
  }, [lastEl.current]);

  useEffect(() => {
    if (lastMessageEl.current) {
      lastMessageEl.current.onload = () => {
         ("scrolled");
        onScrollToBottom();
      };
    }
  }, [lastMessageEl.current]);

  useEffect(() => {
    onScrollToBottom();
  }, [newMessages]);

  const messageRenderer = (message, type) => {
    const { m, mtype, user_name, u } = message;
    switch (mtype) {
      case "text":
        return (
          <div className={styles.messageContainer}>
            {chatType === "group" && u !== 1 && (
              <span className={styles.userName}>{user_name}</span>
            )}
            <div ref={lastMessageEl}>{parse(emojione.shortnameToImage(m))}</div>
          </div>
        );
      case "image":
        return (
          <React.Fragment>
            <div className={styles.messageContainer}>
              {chatType === "group" && u !== 1 && (
                <span className={styles.userName}>{user_name}</span>
              )}
              <img
                className={styles.chatImg}
                src={m}
                alt="chat_img"
                ref={type === "new" ? lastEl : undefined}
              />
            </div>
            <a href={m} target="_blank" className={styles.downloadBtn}>
              <i className="fa ti-arrow-circle-down"></i>
            </a>
          </React.Fragment>
        );
      case "video":
        return (
          <React.Fragment>
            <div className={styles.messageContainer}>
              {chatType === "group" && u !== 1 && (
                <span className={styles.userName}>{user_name}</span>
              )}
              <video
                className={styles.chatImg}
                src={m}
                preload="none"
                controls
                ref={type === "new" ? lastEl : undefined}
              ></video>
            </div>
            <a href={m} target="_blank" className={styles.downloadBtn}>
              <i className="fa ti-arrow-circle-down"></i>
            </a>
          </React.Fragment>
        );
      case "document":
        return (
          <React.Fragment>
            <div className={styles.messageContainer}>
              {chatType === "group" && u !== 1 && (
                <span className={styles.userName}>{user_name}</span>
              )}
              <img
                className={styles.pdfImage}
                src="/storage/type/default/filename/pdf.png"
                alt="pdf"
                ref={type === "new" ? lastEl : undefined}
              />
            </div>
            <a href={m} target="_blank" className={styles.downloadBtn}>
              <i className="fa ti-arrow-circle-down"></i>
            </a>
          </React.Fragment>
        );
      default:
        break;
    }
  };

  return (
    <React.Fragment>
      {oldMessages.map((message, index) => (
        <div
          className={`${styles.message} ${
            message.u === 1 ? styles.message_sent : styles.message_received
          }`}
          key={index}
        >
          {messageRenderer(message, "old")}
          <span className={styles.message__time}>{message.time}</span>
        </div>
      ))}
      {newMessages.map((message, index) => (
        <div
          className={`${styles.message} ${
            message.u === 1 ? styles.message_sent : styles.message_received
          }`}
          key={index}
        >
          {messageRenderer(message, "new")}
          <span className={styles.message__time}>{message.time}</span>
        </div>
      ))}
    </React.Fragment>
  );
};

export default Messages;