"use client"; import { useEffect, useRef, useState } from "react"; import { io, type Socket } from "socket.io-client"; import { useSession } from "./use-session"; interface UseSocketReturn { socket: Socket | null; isConnected: boolean; error: string | null; } /** * Hook para gerenciar conexão Socket.io */ export function useSocket(): UseSocketReturn { const { user } = useSession(); const [socket, setSocket] = useState(null); const [isConnected, setIsConnected] = useState(false); const [error, setError] = useState(null); const socketRef = useRef(null); useEffect(() => { if (!user) { // Desconectar se usuário não estiver autenticado if (socketRef.current) { socketRef.current.disconnect(); socketRef.current = null; setSocket(null); setIsConnected(false); } return; } // Conectar ao Socket.io const connectSocket = async () => { if (socketRef.current?.connected) { return; } try { const newSocket = io( process.env.NEXT_PUBLIC_BASE_URL || "http://localhost:3000", { path: "/api/socket", transports: ["websocket", "polling"], withCredentials: true, // Enviar cookies automaticamente reconnection: true, reconnectionDelay: 1000, reconnectionDelayMax: 5000, reconnectionAttempts: 5, }, ); newSocket.on("connect", () => { setIsConnected(true); setError(null); }); newSocket.on("disconnect", () => { setIsConnected(false); }); newSocket.on("connect_error", (err) => { setError(err.message); setIsConnected(false); }); socketRef.current = newSocket; setSocket(newSocket); } catch (err) { setError(err instanceof Error ? err.message : "Erro ao conectar"); setIsConnected(false); } }; connectSocket(); // Cleanup return () => { if (socketRef.current) { socketRef.current.disconnect(); socketRef.current = null; setSocket(null); setIsConnected(false); } }; }, [user]); return { socket, isConnected, error, }; }