Proyectos de Subversion LeadersLinked - Backend

Rev

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

import React from "react";
import ChatMail from "./ChatRoom";
import Sidebar from "./Sidebar";
import { Modal } from "react-bootstrap";
import { axios } from "../../../utils";
import Chat from "../chat/Chat";
import styled from "styled-components";
import Spinner from "../../../shared/loading-spinner/Spinner";

const StyledSpinnerContainer = styled.div`
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  background: rgba(255, 255, 255, 0.4);
  display: flex;
  justify-content: center;
  align-items: center;
  z-index: 300;
`;
export default (props) => {
  const defaultPage = { current: 1, last: 1 };
  const [conversations, setConversations] = React.useState([]);
  const [selectedConversation, setSelectedConversation] = React.useState(null);
  const [page, setPage] = React.useState(defaultPage);
  const [messages, setMessages] = React.useState([]);
  const [isGettingMessages, setIsGettingMessages] = React.useState(false);
  const [visible, setVisible] = React.useState(false);
  const [inmailPersons, setInmailPersons] = React.useState([]);
  const [search, setSearch] = React.useState("");
  const [loading, setLoading] = React.useState(false);
  const getMessages = async (
    conversation = selectedConversation,
    _page = page.current,
    justPaginate = false
  ) => {
    try {
      const res = await axios.get(
        conversation.messages_link + "?page=" + _page
      );
      if (justPaginate) {
        const _messages = [...messages, ...res.data.data];
        setMessages(_messages);
      } else {
        setMessages(res.data.data || []);
      }
      if (
        res.data.pagination &&
        res.data.pagination.last &&
        res.data.pagination.last !== page.last
      ) {
        setPage({
          ...page,
          last: res.data.pagination.last,
        });
      }
    } catch (error) {
      console.log(">>: error > ", error);
    } finally {
      if (isGettingMessages) {
        setIsGettingMessages(false);
      }
    }
  };
  const handleChangeConversation = async (conversation) => {
    // setPage(defaultPage)
    setLoading(true);
    setSelectedConversation(null);
    setTimeout(() => {
      setSelectedConversation(conversation);
      setLoading(false);
    }, 1000);
    // getMessages(conversation, defaultPage.current)
  };

  const handleSend = async (message) => {
    if (selectedConversation) {
      try {
        const params = {
          message,
        };
        const formData = new FormData();
        Object.entries(params).map(([key, value]) => {
          formData.append(key, value);
        });
        const res = await axios.post(selectedConversation.send_link, formData);
        const _messages = [...messages];
        _messages.push(res.data.data);
        setMessages(_messages);
      } catch (error) {
        console.log(">>: err0r > ", error);
      } finally {
        getMessages();
      }
    }
  };

  const getMoreMessages = () => {
    if (page.last > page.current) {
      let { current } = page;
      current += 1;
      if (!isGettingMessages) {
        setIsGettingMessages(true);
        setPage({
          ...page,
          current,
        });
        getMessages(selectedConversation, current, true);
      }
    }
  };
  const onClose = () => {
    setVisible(false);
  };

  const handleChange = async (e) => {
    const value = e.target.value;
    setSearch(value);
    try {
      const res = await axios.get("/helpers/search-people?search=" + value);
      if (res.data.success) {
        setInmailPersons(res.data.data);
      }
    } catch (error) {
      console.log(">>: error > ", error);
    }
  };

  const handleInmailPerson = (uuid) => {
    onClose();
    window.location.href = "/inmail/" + uuid;
    setTimeout(() => {
      window.location.reload();
    }, 1000);
  };

  const handleCloseChat = () => {
    console.log(">>: close chat");
  };

  return (
    <>
      {loading && (
        <StyledSpinnerContainer>
          <Spinner />
        </StyledSpinnerContainer>
      )}
      <Modal show={visible} onHide={onClose}>
        <div className="card">
          <div className="card-body">
            <h3 className="card-title font-weight-bold">Crear sala de Chat</h3>
            <div class="form-group">
              <label for="search-people">Direccion de email</label>
              <input
                type="email"
                className="form-control"
                id="search-people"
                aria-describedby="Buscador de personas"
                placeholder="Escribe el nombre de la persona"
                onChange={handleChange}
              />
            </div>
            <div className="container">
              {inmailPersons.map((element) => {
                return (
                  <div className="row" key={element.value}>
                    <div className="col-8">
                      <p> {element.text} </p>
                    </div>
                    <div className="col-4">
                      <button
                        className="btn btn-primary"
                        onClick={() => handleInmailPerson(element.value)}
                      >
                        <i className="fa fa-check" />
                      </button>
                    </div>
                  </div>
                );
              })}
            </div>
            <a href="#" onClick={onClose} className="btn btn-danger">
              Cerrar
            </a>
          </div>
        </div>
      </Modal>
      <section className="messages-page">
        <div className="messages-sec">
          <div className="row">
            <div className="col-lg-4 col-md-12 no-pdd">
              <div className="chat_contacts">
                <h2 className="chat-title">Personas y grupos</h2>
                <Sidebar
                  onClick={(conversation) =>
                    handleChangeConversation(conversation)
                  }
                  conversations={[...props.chatUsers, ...props.chatGroups]}
                  selectedConversation={selectedConversation}
                />
              </div>
            </div>
            <div className="col-12 col-md-8">
              {!!selectedConversation ? (
                <Chat
                  entity={selectedConversation}
                  onCloseChat={handleCloseChat}
                />
              ) : (
                <div>
                  <p>Seleccione un chat</p>
                </div>
              )}
            </div>
          </div>
        </div>
      </section>
    </>
  );
};