Files
pagodera/lib/hooks/use-socket.ts
T
Evandro Fonseca Junior 7f42def478 feat(market): add Minha Intenções tab with panel, hook, and badge
- Introduced "Minhas Intenções" tab visible only to logged-in users.
- Integrated MyPurchaseIntentionsPanel and useMyPurchaseIntentions hook.
- Added tab badge showing count of pending intentions.
- Extended session API to include user’s main character for downstream features.
2025-11-07 17:25:51 -03:00

94 lines
2.2 KiB
TypeScript

"use client";
import { useEffect, useRef, useState } from "react";
import { io, 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<Socket | null>(null);
const [isConnected, setIsConnected] = useState(false);
const [error, setError] = useState<string | null>(null);
const socketRef = useRef<Socket | null>(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,
};
}