import { useEffect, useState, useCallback } from "react"; import { io, Socket } from "socket.io-client"; const SOCKET_URL = typeof window !== "undefined" ? window.location.origin : "http://localhost:3000"; export interface DraftSocketEvents { // Events emitted by server "pick-made": (data: any) => void; "timer-update": (data: any) => void; "current-pick-changed": (data: any) => void; "draft-started": (data: any) => void; "draft-paused": (data: any) => void; "draft-completed": (data: any) => void; "queue-updated": (data: any) => void; "user-joined": (data: any) => void; } export function useDraftSocket(seasonId: string | null) { const [socket, setSocket] = useState(null); const [isConnected, setIsConnected] = useState(false); useEffect(() => { if (!seasonId) return; // Create socket connection const newSocket = io(SOCKET_URL, { transports: ["websocket", "polling"], }); newSocket.on("connect", () => { console.log("Socket connected:", newSocket.id); setIsConnected(true); // Join the draft room newSocket.emit("join-draft", seasonId); }); newSocket.on("disconnect", () => { console.log("Socket disconnected"); setIsConnected(false); }); newSocket.on("connect_error", (error) => { console.error("Socket connection error:", error); setIsConnected(false); }); setSocket(newSocket); // Cleanup on unmount return () => { if (newSocket) { newSocket.emit("leave-draft", seasonId); newSocket.close(); } }; }, [seasonId]); // Helper to emit events const emit = useCallback((event: string, data?: any) => { if (socket && isConnected) { socket.emit(event, data); } else { console.warn(`Cannot emit ${event}: socket not connected`); } }, [socket, isConnected]); // Helper to listen to events const on = useCallback(( event: K, handler: DraftSocketEvents[K] ) => { if (socket) { socket.on(event as string, handler as any); } }, [socket]); // Helper to remove event listeners const off = useCallback(( event: K, handler?: DraftSocketEvents[K] ) => { if (socket) { if (handler) { socket.off(event as string, handler as any); } else { socket.off(event as string); } } }, [socket]); return { socket, isConnected, emit, on, off, }; }