import { useHotel } from "../context/HotelContext"; import { useState, useEffect } from "react"; import { useRef } from "react"; //import {fetchMessage} from . import "./chatWidget.css" //FIXME: split element to avoid re render (convcard are being re rendered every time something is typed in the creation ) //TODO: split into multiple component export default function ChatWidget({convlist}) { const { createConversation, fetchMessages, sendMessage, usersById, clientId, fetchConvUsers, addUserToConv } = useHotel(); const [activeConvId, setActiveConvId] = useState(null); const [showAddUsers, setShowAddUsers] = useState(false); const [showCreateConv, setShowCreateConv] = useState(false); //FIXME: does this make multiple re render ? const handleOpenConv = async (conv_id) => { setActiveConvId(conv_id); }; console.log("client id in chat widget"); function hideCreateConv(){ setShowCreateConv(false); }; function hideAddUser(){ showAddUsers(false) }; return (
{convlist.map(conv => ( ))}
{showAddUsers && activeConvId && ( setShowAddUsers(false)} /> )} {showCreateConv && ( )} {activeConvId && ( )}
); } function SenderBox({ conv_id, onSend, disabled }) { const [text, setText] = useState(""); const handleSend = () => { console.log("conv_Id: ",conv_id) if (!text.trim() || !conv_id) return; onSend({ conv_id, message: text, }); setText(""); }; return ( ); } function ConvCard({id, title, onOpenConv}) { return(
onOpenConv(id)} >

{title}

) } function MessagesBox({ conv_id }) { const { messagesByConvId, usersById, clientId } = useHotel(); const messages = messagesByConvId[conv_id] ?? []; console.log(messagesByConvId); console.log(usersById); if (messages.length === 0) { return
No messages
; } return (
{messages .slice() .sort((a, b) => new Date(a.sent_at) - new Date(b.sent_at)) .map(msg => { const isMine = msg.sender_id === clientId; return (

Sender:{" "} {usersById[msg.sender_id] ?? "Unknown user"}

{msg.content}

); })}
); } function AddUsersMenu({ convId, usersById, fetchConvUsers, onValidate, onClose }) { const [selected, setSelected] = useState(new Set()); //new function to fetch already present users in the conv //let current = fetchConvUsers(convId); const toggleUser = (id) => { setSelected(prev => { const next = new Set(prev); next.has(id) ? next.delete(id) : next.add(id); return next; }); }; const handleValidate = () => { if (selected.size === 0) return; onValidate({ conv_id: convId, users: [...selected], }); onClose(); }; useEffect(() => { async function load() { console.log("fetching conv users ar :", convId); const ids = await fetchConvUsers({ conv_id: convId }); setSelected(new Set(ids)); } load(); }, [convId, fetchConvUsers]); return (

update users

); } function CreateConvMenu({onSend, exit}) { const [nameText, setNameText] = useState(""); const handleSend = () =>{ if (!nameText.trim()) return; onSend(nameText); setNameText(""); setTimeout(() => { window.location.reload(); }, 1000); }; return (
setNameText(element.target.value)} onKeyDown={e => e.key === "Enter" && handleSend() } placeholder="Ma Conversation" onBlur={exit} />
) }