Rev 988 | AutorÃa | Ultima modificación | Ver Log |
import { async } from "postcss-js";import React, { useCallback } from "react";import { useState, useEffect } from "react";import { axios } from "../../utils";import Contacts from "./contacts/Contacts";import Groups from "./groups/Groups";import PersonalChat from "./personal-chat/PersonalChat";const notifyAudio = new Audio("/audio/chat.mp3");const Chat = (props) => {// statesconst [fullChats, setFullChats] = useState([]);const [contacts, setContacts] = useState([]);const [groups, setGroups] = useState([]);const [activeChats, setActiveChats] = useState([]);const [isChatOpen, setIsChatOpen] = useState(false);const [isMuted, setIsMuted] = useState(false);const [activeTab, setActiveTab] = useState("user");const defaultChatInterval = 1500;const [chatInterval, setChatInterval] = useState(defaultChatInterval);const [search, setSearch] = useState('');const filtredContacts = contacts.filter(({ name }) => name.toLowerCase().includes(search.toLowerCase()))const filtredGroups = groups.filter(({ name }) => name.toLowerCase().includes(search.toLowerCase()))// Time intervalslet heartBeatInterval;const handleEntities = entities => {setFullChats([...entities]);let newUserContacts = [];let newGroups = [];entities.map((entity) => {if (entity.is_open) {handleOpenConversation(entity, true);}if (entity.not_received_messages) {handleNewMessage(entity);}switch (entity.type) {case "user":newUserContacts = [...newUserContacts, entity];handleUpdateOnline(entity);break;case "group":newGroups = [...newGroups, entity];break;default:break;}});setContacts(newUserContacts);setGroups(newGroups);}const heartBeat = async () => {try {const res = await axios.get("/chat/heart-beat")let entities = [];const resData = res.data;if (resData.success) {entities = resData.data;handleEntities(entities);}return entities;} catch (error) {console.log('>>: chat error > ', error)}};const handleUpdateOnline = (entity) => {const existingChatId = activeChats.findIndex((activeChat) => activeChat.id === entity.id);if (existingChatId >= 0) {if (activeChats[existingChatId].online !== entity.online) {const newActiveChats = [...activeChats];newActiveChats[existingChatId].online = entity.online;setActiveChats(newActiveChats);}}};const handleNewMessage = async (unseeEntity) => {await axios.post(unseeEntity.url_mark_received).then((response) => {('')});if (!activeChats.some((activeChat) => activeChat.id === unseeEntity.id)) {setActiveChats([...activeChats, { ...unseeEntity, minimized: false }]);playNotifyAudio();} else {const existingChatId = activeChats.findIndex((activeChat) => activeChat.id === unseeEntity.id);if (!activeChats[existingChatId].unsee_messages) {const newActiveChats = [...activeChats];newActiveChats[existingChatId].unsee_messages = true;setActiveChats(newActiveChats);playNotifyAudio(newActiveChats[existingChatId].minimized);}}};const handleOpenConversation = (entity, minimized = false) => {if (activeChats.length < 3 && !activeChats.some((el) => el.id === entity.id)) {setActiveChats([...activeChats, { ...entity, minimized: minimized }]);}if (activeChats.length >= 3 && !activeChats.some((el) => el.id === entity.id)) {activeChats.map((el, index) => {if (index === 0) {axios.post(el.url_close)}})const newActiveChats = activeChats.filter((el, index) => index !== 0)setActiveChats([...newActiveChats, { ...entity, minimized: minimized }]);}};const handleReadChat = (index) => {if (activeChats[index].unsee_messages) {const newActiveChats = [...activeChats];newActiveChats[index].unsee_messages = false;setActiveChats(newActiveChats);}};const handleMinimizeChat = (chatIndex, minimize) => {const newActiveChats = [...activeChats];switch (minimize) {case false:newActiveChats[chatIndex].minimized = false;break;default:newActiveChats[chatIndex].minimized =!newActiveChats[chatIndex].minimized;break;}setActiveChats(newActiveChats);};const handleCloseChat = (entityId, url_close) => {let newActiveChats = [];axios.post(url_close).then((response) => {const resData = response.data;});newActiveChats = activeChats.filter((activeChat) => activeChat.id !== entityId);setActiveChats(newActiveChats);};const playNotifyAudio = (minimized = true) => {if (!isMuted && minimized) {notifyAudio.play();}};const handleMute = () => {setIsMuted(!isMuted);if (isMuted) {notifyAudio.play();}};const handleChangeTab = (tab) => {setActiveTab(tab);};useEffect(() => {let entities = [];clearInterval(heartBeatInterval);heartBeatInterval = setInterval(async () => {entities = await heartBeat() || [];}, chatInterval);if ((entities === fullChats) && (chatInterval !== defaultChatInterval * 2)) {clearInterval(heartBeatInterval);setChatInterval(defaultChatInterval * 2);}return () => {clearInterval(heartBeatInterval);};}, [chatInterval, fullChats]);useEffect(() => {emojione.imageType = "png";emojione.sprites = false;emojione.ascii = true;emojione.imagePathPNG = props.emojiOnePath;}, []);return window.innerWidth > 1000 ? (<React.Fragment><div id="drupalchat-wrapper"><div id="drupalchat"><div className="item-list" id="chatbox_chatlist"><ul id="mainpanel"><li id="chatpanel" className="first last"><div className="subpanel" style={{ display: "block" }}><divclassName="subpanel_title"onClick={(e) => {if (e.currentTarget === e.target)setIsChatOpen(!isChatOpen);}}><divstyle={{ width: "89%", height: "100%" }}id="minmaxchatlist"onClick={() => {setIsChatOpen(!isChatOpen);}}><ahref="/chat"className="text-white">Chat</a></div><spanclassName="min localhost-icon-minus-1"id="mute-sound"><iclassName={`icon ${isMuted ? "icon-volume-off" : "icon-volume-2"} text-20`}aria-hidden="true"onClick={handleMute}></i></span>{/* <spanclassName="min localhost-icon-minus-1"id="new-chat-group"style={{ marginRight: "5%" }}title="Crear grupo"><i className="fa fa-edit"></i></span> */}</div><divid="showhidechatlist"style={{ display: isChatOpen ? "block" : "none" }}><divclassName="drupalchat_search_main chatboxinput"style={{ background: "#f9f9f9" }}><divclassName="drupalchat_search"style={{ height: "auto" }}><inputclassName="drupalchat_searchinput live-search-box"id="live-search-box"placeholder="Buscar"size="24"type="text"name='search'value={search}onChange={e => {setSearch(e.target.value || '')}}/><buttonclassName="searchbutton"id="searchbutton"title=""style={{height: "30px",border: "none",margin: "0px",paddingRight: "13px",verticalAlign: "middle",}}type="submit"></button><divid="search_result"style={{textAlign: "center",fontSize: "11px",display: "none",}}>Sin resultados</div></div></div><divclassName="drupalchat_search_main chatboxinput"style={{ background: "#f9f9f9" }}><divstyle={{width: "50%",float: "left",display: "inline-block",padding: "5px",textAlign: "center",fontSize: "14px",}}><ahref="#"className="blue-color chat-contacts"onClick={(e) => {e.preventDefault();handleChangeTab("user");}}>Contactos</a></div><divstyle={{width: "50%",display: "inline-block",padding: "5px",textAlign: "center",fontSize: "14px",}}><ahref="#"className="chat-groups"onClick={(e) => {e.preventDefault();handleChangeTab("group");}}>Grupos</a></div></div><divclassName="contact-list chatboxcontent"style={{display: activeTab === "user" ? "block" : "none",}}><Contactscontacts={filtredContacts}onOpenConversation={handleOpenConversation}/></div><divclassName="group-list chatboxcontent"style={{display: activeTab === "group" ? "block" : "none",}}><ul id="group-list-ul" className="live-search-list-group"><Groupsgroups={filtredGroups}onOpenConversation={handleOpenConversation}/></ul></div><divclassName="group-contacts-list chatboxcontent"style={{ display: "none" }}><div style={{ textAlign: "center", fontSize: "13px" }}>Integrantes del grupo</div><ulid="contact-group-list-ul"className="live-search-list"></ul></div></div></div></li></ul></div></div></div><div style={{ display: "flex" }}>{activeChats.map((entity, index) => (<PersonalChatkey={entity.id}entity={entity}index={index}onClose={handleCloseChat}onMinimize={handleMinimizeChat}onRead={handleReadChat}/>))}</div></React.Fragment>) : ("");};export default Chat;