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 { useState, useEffect } from "react";
|
||||
import { MessageCircle } from "lucide-react";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { Badge } from "@/components/ui/badge";
|
||||
import { useSession } from "@/lib/hooks/use-session";
|
||||
import { MessagesPanel } from "./MessagesPanel";
|
||||
|
||||
interface MessagesBellProps {
|
||||
className?: string;
|
||||
}
|
||||
|
||||
export function MessagesBell({ className }: MessagesBellProps) {
|
||||
const { user } = useSession();
|
||||
const [unreadUsersCount, setUnreadUsersCount] = useState(0);
|
||||
const [isOpen, setIsOpen] = useState(false);
|
||||
|
||||
// Buscar contagem de usuários únicos com mensagens não vistas
|
||||
const fetchUnreadCount = async () => {
|
||||
if (!user) return;
|
||||
|
||||
try {
|
||||
const res = await fetch("/api/chats/unread-count", {
|
||||
credentials: "include",
|
||||
});
|
||||
if (res.ok) {
|
||||
const data = await res.json();
|
||||
if (data.success) {
|
||||
setUnreadUsersCount(data.count);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("[CHAT-DEBUG] Erro ao buscar contagem de chats:", error);
|
||||
}
|
||||
};
|
||||
|
||||
// Polling automático a cada 30 segundos
|
||||
useEffect(() => {
|
||||
if (!user) return;
|
||||
|
||||
fetchUnreadCount();
|
||||
|
||||
const interval = setInterval(() => {
|
||||
fetchUnreadCount();
|
||||
}, 30000); // 30 segundos
|
||||
|
||||
return () => clearInterval(interval);
|
||||
}, [user]);
|
||||
|
||||
// Atualizar contagem quando abrir/fechar
|
||||
useEffect(() => {
|
||||
if (isOpen) {
|
||||
fetchUnreadCount();
|
||||
}
|
||||
}, [isOpen]);
|
||||
|
||||
// Marcar como visto quando abrir
|
||||
const handleOpenChange = (open: boolean) => {
|
||||
setIsOpen(open);
|
||||
};
|
||||
|
||||
if (!user) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<Button
|
||||
variant="ghost"
|
||||
size="icon"
|
||||
className={`relative ${className}`}
|
||||
onClick={() => handleOpenChange(true)}
|
||||
>
|
||||
<MessageCircle className="h-5 w-5" />
|
||||
{unreadUsersCount > 0 && (
|
||||
<Badge
|
||||
variant="destructive"
|
||||
className="absolute -top-1 -right-1 h-5 w-5 flex items-center justify-center p-0 text-xs rounded-full animate-pulse"
|
||||
>
|
||||
{unreadUsersCount > 99 ? "99+" : unreadUsersCount}
|
||||
</Badge>
|
||||
)}
|
||||
</Button>
|
||||
|
||||
<MessagesPanel
|
||||
open={isOpen}
|
||||
onOpenChange={handleOpenChange}
|
||||
onUnreadCountChange={setUnreadUsersCount}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
}
|
||||
Reference in new issue
Block a user