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.
This commit is contained in:
1 parent
f35fee944d
commit
7f42def478
55 files changed
+4906
-95
No files matched your search
@@ -0,0 +1,93 @@
|
||||
"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,
|
||||
};
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user