import React from "react"; import useTime from "../../../hooks/useTime"; import MessageCheck from "../../globals/MessageCheck"; import { useDispatch, useSelector } from "react-redux"; import { modalActions } from "../../../store/modalSlice"; import useModalBestPosition from "../../../hooks/useModalBestPosition"; import useChat from "../../../hooks/useChat"; import { chatListActions } from "../../../store/chatListSlice"; import Image from "../../globals/Image"; import { useEffect } from "react"; import { chatActions } from "../../../store/chatSlice"; import { useState } from "react"; function ChatItem({ chatData }) { // Chat options visibility const chatOptionVisible = useSelector( (state) => state.modalReducer.payload.chatRoomId === chatData.chatRoomId ); // To know if chatItem was clicked to make chat room visible const [chatItemClicked, setChatItemClicked] = useState(); const activeChat = useSelector( (state) => state.chatReducer.currentChatRoom._id === chatData.chatRoomId ); const chatRoomShown = useSelector((state) => state.chatReducer.active); // Chat mode of user i.e Typing, recording const chatMode = useSelector((state) => { const chatIndex = state.chatListReducer.findIndex( (chat) => chat.chatRoomId === chatData.chatRoomId ); return state.chatListReducer[chatIndex]?.mode; }); // Currently logged in user id const userId = useSelector((state) => state.userReducer.user._id); // Set chat room function const { setChatRoom } = useChat(chatData, "chatList"); // Format latest message date const formattedDate = useTime(chatData.latestMessage.timeSent); const dispatch = useDispatch(); // returns function to get the best position for a modal const getBestModalPostion = useModalBestPosition(); // Elements data to help with getting best position const elemData = { modalData: { width: 140, height: 80, }, overlayId: "side-bar", }; // show options handler const showOptions = (event) => { event.preventDefault(); const positions = getBestModalPostion(event, elemData); dispatch( modalActions.openModal({ type: "chatOptions", payload: chatData, positions, }) ); }; // On mobile, enable holding down to show options const timeoutToShowOptions = (event) => { const timer = setTimeout(() => { showOptions(event); }, 250); event.currentTarget.addEventListener("mouseup", () => { clearTimeout(timer); }); }; useEffect(() => { if (activeChat && !chatItemClicked && chatRoomShown) { setChatRoom({ disableSettingChatRoomActive: true }); } if (chatItemClicked) { setChatItemClicked(false); } }, [chatRoomShown]); return (
{ setChatRoom(); setChatItemClicked(true); }} onContextMenu={showOptions} onMouseDown={timeoutToShowOptions} className={`p-[1rem] rounded-[1.5rem] not-selectable flex gap-[1rem] text-secondary-text group h-[75px] cursor-default ${ activeChat ? "bg-cta-icon !text-white sm:bg-transparent" : "hover:bg-secondary-light-text" } ${ chatOptionVisible && `${ activeChat ? "sm:bg-secondary-light-text" : "bg-secondary-light-text" }` }`} > {/* Avatar */} {chatData.profile.name {/* Details */}
{/* Title */}
{chatData.profile.name || chatData.profile.username} {/* Message check */} {chatData.latestMessage.sender === userId && ( )} {formattedDate}
{/* Subtitle */}
{/* Chat mode status */} {chatMode && ( {chatMode} {chatMode === "recording" && "audio"}... )} {/* Default without chatMode active */} {!chatMode && ( <> {/* Latest text */} {!(chatData.roomType === "Private") && !!chatData.latestMessage.sender && ( {chatData.latestMessage.sender}: )} {chatData.latestMessage.messageType === "text" && ( )} {chatData.latestMessage.messageType === "image" && ( Photo )} {chatData.latestMessage.messageType === "voice" && ( Voice Note )} {chatData.latestMessage.messageType === "call" && ( {chatData.latestMessage.callDetails.callType === "voice" && ( )} {chatData.latestMessage.callDetails.callType === "video" && ( )} {chatData.latestMessage.callDetails.callType} call )} {/* When user has a message pinned and also has an unread message, the unread message indicator takes precedence */} {chatData.unreadMessagesCount ? ( {chatData.unreadMessagesCount} ) : ( chatData.pinned && ( ) )} )}
); } export default ChatItem;