import React, { useState, useEffect, useRef } from "react"; import io, { Socket } from 'socket.io-client'; import '../../styles/Messages.css' import styled from "styled-components"; import DefaultPic from '../../assets/profile.jpg' 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" // import Input from "./Input"; //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 { Rank } from "../../DataBase/DataRank"; import GreenAlert from "../Alert/GreenAlert.tsx"; import RedAlert from "../Alert/RedAlert.tsx"; import YellowAlert from "../Alert/YellowAlert"; import ModalSetting from "./ModalSetting.tsx"; import PartyInvite from "./PartyInvite.tsx"; // import {User, Conv, Message} from "../../../interfaces.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 SideSpan = styled.span` // font-size: 18px; // font-weight: 500; // ` 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 [currentChat, setCurrentChat] = useState(false); // false is good? const [messages, setMessage] = useState([]); const [newMessages, setNewMessage] = useState(""); const [incomingMessage, setIncomingMessage] = useState(); // let socket: Socket; const socket = useRef(null); // const socket = Socket | null // socket = useRef( 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); // console.log("invite data use effect= ", tmpInvite.data); setPartyInvite(tmpInvite.data); setUser(tmpUser.data); setConversation(convs.data); setUsers(tmpUsers.data); // console.log(`connection....`); socket.current = io('http://' + process.env.REACT_APP_SOCKET_URL + ':4001', { transports: ['polling'] }); // console.log(`connection done`); 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) => { // setIncomingMessage(data); console.log("banned hehe"); 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("ERRORRRRR") console.log(err); } }; getConv(); return () => { console.log("Cleanup"); if (socket.current) socket.current.disconnect(); // cleanup(); // Call the cleanup function to stop the ongoing process or perform necessary cleanup tasks // cleanup(); }; }, []) useEffect(()=> { const updateChat = async ()=> { // if (currentChat) // console.log(currentChat.id) if (currentChat) { try { const res = await api.post("/isAdmin", {convId: currentChat.id}) console.log("isadmin= ", res.data) setIsAdmin(res.data); } catch (err) { console.log(err); } } // console.log(`result1 = ${currentChat.id !== incomingMessage.convId}`) if (currentChat && incomingMessage && currentChat.id === incomingMessage.convId) { console.log("incoming meaasge=",incomingMessage) // if (user && !user.blocked.find(incomingMessage.sender)) // setMessage((prev) => [...prev, incomingMessage, key: incomingMessage.id]); // setMessage((prev) => [...prev, { ...incomingMessage, key: incomingMessage.id }]); 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); console.log("message of conv=", res.data) setMessage(res.data); } catch(err) { } } getMessage(); }, [currentChat]); const handleSubmit = async (e: { key?: any; preventDefault: any; })=>{ e.preventDefault(); // console.log(`e= ${e.key}`) // console.log(`name= ${user.username}`) // let message; console.log("in handle"); 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}); console.log("convid:", currentChat.id); if (!allowed.data) { console.log("muted or banned"); return ; } console.log("not muted or banned"); 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; })=> { // console.log(`e in press= ${e.key}`) if (e.key !== "Enter") return ; handleSubmit(e); } const [friend, setFriend] = useState(""); // const [modalOpen, setModalOpen] = useState(false); 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 openNewGameModal = () => { setNewGameModalOpen(true); }; const closeNewGameModal = () => { setNewGameModalOpen(false); }; const openNewConversationModal = () => { setNewConversationModalOpen(true); }; const closeNewConversationModal = () => { setNewConversationModalOpen(false); }; // const close = () => setModalOpen(false); // const open = () => setModalOpen(true); // const closeAddFriend = () => setAddFriend(false); // const closeBlock = () => setBlock(false); const closeSetting = () => setSetting(false); // const closeAddFriend = () => setAddFriend(false); // const closeBlock = () => setBlock(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}) // if (res.data === 1) // console.log("res in friend= ", res) 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 === 1) { setBlock(true); setAddFriend(false); // Reset addFriend state 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 (
{/* profile */} {isLoading || !user ? (

Loading...

) : (

Chat

)}
{/*
(addFriend ? setAddFriend(false) : setAddFriend(true))}> null} > {addFriend && } (block ? setBlock(false) : setBlock(true))} > null} > {block && } {currentChat ? ( (setting ? setSetting(false) : setSetting(true))} > null} > {setting && } ):("")}
*/}
{selectTags.map((selectTag) => (
))} null}> {showAddFriendAlert && addFriend && ( )} {showAddFriendAlert && !addFriend && ( )} null}> {showBlockAlert && block && ( )} {showBlockAlert && !block && ( )} {currentChat && isAdmin ? ( (setting ? setSetting(false) : setSetting(true))} > null} > {setting && } ):("")}
New Game {newGameModalOpen && } New Conversation {newConversationModalOpen && ( )} {/* {partyInvite.map((c) => { return ( )}) } */} {partyInvite.map( i =>( ))} {conversations.map((c: Conv, index ) => { return (
setCurrentChat(c)}> User
{c.name} {/* Desc? */}
)})}
{ currentChat && user ? ( <>
{messages.map(m=>( ))}
{/* */}
setNewMessage(e.target.value)} value={newMessages} />
) : (
Open a conversation
)}
// ); } export default Chats