import React, { useState, useEffect, useRef } from "react"; import io, { Socket } from 'socket.io-client'; import '../../styles/Messages.css' import styled from "styled-components"; import api from '../../script/axiosApi.tsx'; import { motion , AnimatePresence} from "framer-motion"; import Modal from "./Modal.tsx"; import GameModal from "./GameModal.tsx"; import Message from "./Message.tsx" //react icons import { TbSend } from 'react-icons/tb'; import { ImBlocked } from 'react-icons/im'; import { MdOutlineGroupAdd } from 'react-icons/md'; import { GrAdd } from 'react-icons/gr'; import { RiListSettingsLine } from 'react-icons/ri' import { HiChatBubbleLeft } from 'react-icons/hi2' import GreenAlert from "../Alert/GreenAlert.tsx"; import RedAlert from "../Alert/RedAlert.tsx"; import ModalSetting from "./ModalSetting.tsx"; import PartyInvite from "./PartyInvite.tsx"; import {User, Conv} from "../../../interfaces.tsx" import { IoLogoOctocat } from "react-icons/io5"; const TouchDiv = styled.div` margin-left: 10px; margin-right: 4px; margin-bottom: 21px; margin-top: 21px; cursor: pointer; justify-content: space-around; &:hover { color: #F4F3EF; } ` const UserChat = styled.div ` padding: 5px; display: flex; align-items: center; gap: 5px; color: white; cursor: pointer; &:hover{ background-color: #3e3c61; } &:active { filter: black; } ` const SideP = styled.p` font-size: 14px; color: lightgray; margin-left: 15px; ` //======================================================================================================== //======================================================================================================== // Logical part //======================================================================================================== //======================================================================================================== interface MessageProps { id: number; convId: number; sender: string; text: string; createdAt?: Date; } function Chats(){ const [isLoading, setIsLoading] = useState(true); const [conversations, setConversation] = useState([]); const [partyInvite, setPartyInvite] = useState([]); const [user, setUser] = useState(); const [currentChat, setCurrentChat] = useState(); // false is good? const [isAdmin, setIsAdmin] = useState(false); // false is good? const [messages, setMessage] = useState([]); const [newMessages, setNewMessage] = useState(""); const [incomingMessage, setIncomingMessage] = useState(); const socket = useRef(null); useEffect(()=> { const getConv = async ()=>{ try{ const convs = await api.get("/conv") const tmpInvite = await api.get("/partyInvite") const tmpUser = await api.get("/profile") const tmpUsers = await api.get("/users"); console.log(convs); setPartyInvite(tmpInvite.data); setUser(tmpUser.data); setConversation(convs.data); setUsers(tmpUsers.data); socket.current = io('http://' + process.env.REACT_APP_SOCKET_URL + ':4001', { transports: ['polling'] }); socket.current.emit('connection', {username: tmpUser.data.username}) socket.current.on('message', (data) => { //data should be a message ?) setIncomingMessage(data); }); socket.current.on('ban', (data) => { window.location.reload() }); // socket.current.on('mute', (data) => { // console.log("muted hehe"); // //set mute var to true and do nothing // }); setIsLoading(false) } catch(err){ console.log(err); } }; getConv(); return () => { if (socket.current) socket.current.disconnect(); }; }, []) useEffect(()=> { const updateChat = async ()=> { if (currentChat) { try { const res = await api.post("/isAdmin", {convId: currentChat.id}) setIsAdmin(res.data); } catch (err) { console.log(err); } } // console.log(`result1 = ${currentChat.id !== incomingMessage.convId}`) if (currentChat && incomingMessage && currentChat.id === incomingMessage.convId) setMessage((prev) => [...prev, incomingMessage]); } updateChat(); }, [incomingMessage, currentChat]) useEffect(()=> { const getMessage = async ()=> { if (!currentChat) return ; const data = {convId: currentChat.id}; try { const res = await api.post('/getMessage', data); setMessage(res.data); } catch(err) { } } getMessage(); }, [currentChat]); const handleSubmit = async (e: { key?: any; preventDefault: any; })=>{ e.preventDefault(); if (!user || !currentChat) return ; const message = { sender: user.username, text: newMessages, convId: currentChat.id, members: null, id: null, }; try{ const allowed = await api.post('/allowed', {convId: currentChat.id}); if (!allowed.data) return ; const res = await api.post('/message', message); const convMember = await api.post('/member', message); message.members = convMember.data.members; message.id = res.data.id setMessage([...messages, res.data]); setNewMessage(""); if (socket.current) socket.current.emit('sendMessage', message); } catch(err){ console.log(err) } } const handleKeyPress = async (e: { key?: any; preventDefault: () => void; })=> { if (e.key !== "Enter") return ; handleSubmit(e); } const [friend, setFriend] = useState(""); const [addFriend, setAddFriend] = useState(false); const [block, setBlock] = useState(false); const [showAddFriendAlert, setShowAddFriendAlert] = useState(false); const [showBlockAlert, setShowBlockAlert] = useState(false); const [setting, setSetting] = useState(false); const [newGameModalOpen, setNewGameModalOpen] = useState(false); const [newConversationModalOpen, setNewConversationModalOpen] = useState(false); const [selectTags, setSelectTag] = useState([{ id: 1, selectedOption: ''}]); const [users, setUsers] = useState([]); const [unblock, setUnblock] = useState(false); const closeUnblock = () => setUnblock(false); const openNewGameModal = () => { setNewGameModalOpen(true); }; const closeNewGameModal = () => { setNewGameModalOpen(false); }; const openNewConversationModal = () => { setNewConversationModalOpen(true); }; const closeNewConversationModal = () => { setNewConversationModalOpen(false); }; const closeSetting = () => setSetting(false); const handleFriend = (event: { target: { value: React.SetStateAction; }; }) => { setFriend(event.target.value); }; const handleAddFriend = async () => { try{ console.log("friend= ", friend); const res = await api.post("/invite", {username: friend}) console.log("res in friend= ", res.data) if(res.data === 1) { setAddFriend(true); setBlock(false); // Reset block state setShowBlockAlert(false); } else setAddFriend(false); setShowAddFriendAlert(true); } catch(err) { console.log(err) } }; const handleBlockFriend = async () => { try{ const res = await api.post("/block", {username: friend}) // if(1) if (res.data === 2) setUnblock(true); if (res.data === 1) { setBlock(true); setAddFriend(false); setShowAddFriendAlert(false); } else setBlock(false); setShowBlockAlert(true); } catch(err) { console.log(err) } }; const closeAddFriend = () => { setAddFriend(false); setShowAddFriendAlert(false); }; const closeBlock = () => { setBlock(false); setShowBlockAlert(false); }; const handleOptionChange = (selectId: number, selectedOption: string) => { console.log("selected Option=", selectedOption) setFriend(selectedOption); setSelectTag((prevTags) => prevTags.map((tag) => tag.id === selectId ? { ...tag, selectedOption } : tag ) ); }; //======================================================================================================== //======================================================================================================== // HTML //======================================================================================================== //======================================================================================================== return (
{isLoading || !user ? (

Loading...

) : (

Chat

)}
{selectTags.map((selectTag) => (
))} null}> {showAddFriendAlert && addFriend && ( )} {showAddFriendAlert && !addFriend && ( )} null}> {showBlockAlert && block && ( )} {showBlockAlert && !block && ( )} {unblock ? ( ):("")} {currentChat && isAdmin ? ( (setting ? setSetting(false) : setSetting(true))} > null} > {setting && } ):("")}
New Game {newGameModalOpen && } New Conversation {newConversationModalOpen && ( )} {partyInvite.map( i =>( ))} {conversations.map((c: Conv, index ) => { return (
setCurrentChat(c)}>

{c.name}

{/* Desc? */}
)})}
{ currentChat && user ? ( <>
{messages.map(m=>( ))}
setNewMessage(e.target.value)} value={newMessages} />
) : (
Open a conversation
)}
); } export default Chats