import { useEffect, useState } from "react"; import SocketIO from "socket.io-client"; import { auth } from "../../firebase/firebase.utils"; const useSocket = (bodyshop) => { const [socket, setSocket] = useState(null); const [clientId, setClientId] = useState(null); // State to store unique identifier useEffect(() => { if (bodyshop && bodyshop.id) { const endpoint = import.meta.env.PROD ? import.meta.env.VITE_APP_AXIOS_BASE_API_URL : ""; const socketInstance = SocketIO(endpoint, { path: "/wss", // Ensure this matches the Vite proxy and backend path withCredentials: true, auth: async (callback) => { const token = auth.currentUser && (await auth.currentUser.getIdToken()); callback({ token }); }, reconnectionAttempts: Infinity, // Try reconnecting forever reconnectionDelay: 2000, // How long to wait between reconnection attempts reconnectionDelayMax: 10000 // Maximum delay between attempts }); setSocket(socketInstance); const handleBodyshopMessage = (message) => { console.log(`Received message for bodyshop ${bodyshop.id}:`, message); }; const handleConnect = () => { console.log("Socket connected:", socketInstance.id); socketInstance.emit("join-bodyshop-room", bodyshop.id); setClientId(socketInstance.id); }; const handleReconnect = (attempt) => { console.log(`Socket reconnected after ${attempt} attempts`); }; const handleConnectionError = (err) => { console.error("Socket connection error:", err); }; const handleDisconnect = () => { console.log("Socket disconnected"); }; socketInstance.on("connect", handleConnect); socketInstance.on("reconnect", handleReconnect); socketInstance.on("connect_error", handleConnectionError); socketInstance.on("disconnect", handleDisconnect); socketInstance.on("bodyshop-message", handleBodyshopMessage); return () => { socketInstance.emit("leave-bodyshop-room", bodyshop.id); socketInstance.off("connect", handleConnect); socketInstance.off("reconnect", handleReconnect); socketInstance.off("connect_error", handleConnectionError); socketInstance.off("disconnect", handleDisconnect); socketInstance.off("bodyshop-message", handleBodyshopMessage); socketInstance.disconnect(); }; } }, [bodyshop]); // Return both socket and clientId return { socket, clientId }; }; export default useSocket;