Rev 16290 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
import { axios, useWindowSize } from "../../utils";
import React, { useEffect, useState } from "react";
import AddGroupTab from "./add-group-tab/AddGroupTab";
import AddMember from "./add-member/AddMember";
import Chat from "./chat/Chat";
import Contacts from "./contacts/Contacts";
import GroupMembers from "./group-members/GroupMembers";
import GroupSettings from "./group-settings/GroupSettings";
import DesktopChat from "./desktop-chat/DesktopChat";
import styles from "./mobileChat.module.scss";
const CHAT_TABS = {
CHAT: "CHAT",
DEFAULT: "DEFAULT",
ADDGROUP: "ADDGROUP",
GROUP_SETTINGS: "GROUP_SETTINGS",
GROUP_MEMBERS: "GROUP_MEMBERS",
ADD_GROUP_MEMBER: "ADD_GROUP_MEMBER",
};
const notifyAudio = new Audio("/audio/chat.mp3");
const MobileChat = (props) => {
// backendVars Destructuring
const { emojione_image_path_png, timezones } = props.backendVars;
// states
const [chatUsers, setChatUsers] = useState([]);
const [chatGroups, setChatGroups] = useState([]);
const [unreadEntities, setUnreadEntities] = useState([]);
const [activeTab, setActiveTab] = useState(CHAT_TABS.DEFAULT);
const [activeChat, setActiveChat] = useState(null);
useEffect(() => {
const heartBeatInterval = setInterval(heartBeat, 1000);
heartBeat();
return () => {
clearInterval(heartBeatInterval);
};
}, []);
console.log(props);
// emojione settings
/* useEffect(() => {
emojione.imageType = "png";
emojione.sprites = false;
emojione.ascii = true;
emojione.imagePathPNG = emojione_image_path_png;
}, []); */
const heartBeat = async () => {
axios.get("/chat/heart-beat").then((response) => {
const resData = response.data;
if (resData.success) {
const entities = resData.data;
let updatedChatUsers = [];
let updatedChatGroups = [];
let updatedUnreadEntites = [];
entities.map((entity) => {
if (entity.not_received_messages) {
handlePlayNewMessage(entity.url_mark_received);
}
if (entity.not_seen_messages) {
return (updatedUnreadEntites = [...updatedUnreadEntites, entity]);
}
switch (entity.type) {
case "user":
updatedChatUsers = [...updatedChatUsers, entity];
break;
case "group":
updatedChatGroups = [...updatedChatGroups, entity];
break;
default:
break;
}
});
setChatUsers(updatedChatUsers);
setChatGroups(updatedChatGroups);
setUnreadEntities(updatedUnreadEntites);
}
});
};
const handlePlayNewMessage = async (setReceivedLink) => {
notifyAudio.play();
const resData = (await axios.post(setReceivedLink)).data;
resData;
};
const handleOpenChat = (entity) => {
if (activeTab === CHAT_TABS.CHAT) {
setActiveTab(CHAT_TABS.DEFAULT);
}
setActiveChat(entity);
setTimeout(() => {
setActiveTab(CHAT_TABS.CHAT);
}, 500);
};
const handleCloseChat = () => {
setActiveTab(CHAT_TABS.DEFAULT);
axios.post(activeChat.url_close).then((response) => {
const resData = response.data;
resData;
});
setActiveChat(null);
};
const handleAddGroup = () => {
setActiveTab(CHAT_TABS.ADDGROUP);
};
const handleDefaultTab = () => {
setActiveTab(CHAT_TABS.DEFAULT);
};
const openGroupMembersTab = () => {
setActiveTab(CHAT_TABS.GROUP_MEMBERS);
};
const openAddMemberTab = () => {
setActiveTab(CHAT_TABS.ADD_GROUP_MEMBER);
};
return (
<div className={styles.mobileChat}>
{activeTab === CHAT_TABS.CHAT && (
<div className={styles.mobileChat__header}>
<div className={styles.entityHeader}>
<a
href="#"
onClick={(e) => {
e.preventDefault();
handleCloseChat();
}}
className={styles.entityHeader__backBtn}
>
<i className="fa fa-arrow-left"></i>
</a>
<img
src={
activeChat && activeChat.type === "user"
? activeChat.image
: "/images/users-group.png"
}
alt=""
/>
<span className={styles.entityHeader__name}>{activeChat.name}</span>
</div>
{activeChat.type === "group" && (
<i
className="fa fa-gear"
onClick={() => {
setActiveTab(CHAT_TABS.GROUP_SETTINGS);
}}
></i>
)}
</div>
)}
{(activeTab === CHAT_TABS.ADDGROUP ||
activeTab === CHAT_TABS.GROUP_SETTINGS ||
activeTab === CHAT_TABS.GROUP_MEMBERS ||
activeTab === CHAT_TABS.ADD_GROUP_MEMBER) && (
<div className={styles.mobileChat__header}>
<div className={styles.entityHeader}>
<a
href="#"
onClick={(e) => {
e.preventDefault();
switch (activeTab) {
case CHAT_TABS.ADDGROUP:
handleDefaultTab();
break;
case CHAT_TABS.GROUP_SETTINGS:
setActiveTab(CHAT_TABS.CHAT);
break;
case CHAT_TABS.GROUP_MEMBERS:
case CHAT_TABS.ADD_GROUP_MEMBER:
setActiveTab(CHAT_TABS.GROUP_SETTINGS);
break;
default:
break;
}
}}
className={styles.entityHeader__backBtn}
>
<i className="fa fa-arrow-left"></i>
<span>Atrás</span>
</a>
</div>
</div>
)}
<div className={styles.mainSection}>
{window.innerWidth >= 768 ? (
<DesktopChat
unreadEntities={unreadEntities}
chatUsers={chatUsers}
chatGroups={chatGroups}
timezones={timezones}
/>
) : (
<>
{activeTab === CHAT_TABS.DEFAULT && (
<Contacts
onOpenChat={handleOpenChat}
unreadEntities={unreadEntities}
chatUsers={chatUsers}
chatGroups={chatGroups}
onAddGroup={handleAddGroup}
/>
)}
{activeTab === CHAT_TABS.CHAT && (
<Chat entity={activeChat} timezones={timezones} />
)}
</>
)}
{activeTab === CHAT_TABS.ADDGROUP && (
<AddGroupTab onClose={handleDefaultTab} />
)}
{activeTab === CHAT_TABS.GROUP_SETTINGS && (
<GroupSettings
group={activeChat}
onOpenMembersTab={openGroupMembersTab}
onOpenAddMemberTab={openAddMemberTab}
f
onClose={handleCloseChat}
/>
)}
{activeTab === CHAT_TABS.GROUP_MEMBERS && (
<GroupMembers group={activeChat} />
)}
{activeTab === CHAT_TABS.ADD_GROUP_MEMBER && (
<AddMember group={activeChat} />
)}
</div>
</div>
);
};
export default MobileChat;