- 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.
94 lines
2.2 KiB
TypeScript
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,
|
|
};
|
|
}
|
|
|