feat: add unread messages badge and live updates in sidebar
- Display unread message count badge in the sidebar. - Integrate `useSocket` for real-time updates on unread messages. - Reset unread message count when navigating to the messages page. - Increment badge count on receiving `new_message` WebSocket events.
This commit is contained in:
@@ -45,6 +45,7 @@ import {
|
|||||||
SidebarGroupLabel,
|
SidebarGroupLabel,
|
||||||
SidebarHeader,
|
SidebarHeader,
|
||||||
SidebarMenu,
|
SidebarMenu,
|
||||||
|
SidebarMenuBadge,
|
||||||
SidebarMenuButton,
|
SidebarMenuButton,
|
||||||
SidebarMenuItem,
|
SidebarMenuItem,
|
||||||
SidebarMenuSub,
|
SidebarMenuSub,
|
||||||
@@ -54,7 +55,9 @@ import {
|
|||||||
SidebarTrigger,
|
SidebarTrigger,
|
||||||
} from "@/components/ui/sidebar";
|
} from "@/components/ui/sidebar";
|
||||||
import { useAuth } from "@/providers/auth-provider";
|
import { useAuth } from "@/providers/auth-provider";
|
||||||
|
import { useSocket } from "@/providers/socket-provider";
|
||||||
import { CategoryService } from "@/services/category.service";
|
import { CategoryService } from "@/services/category.service";
|
||||||
|
import { MessageService } from "@/services/message.service";
|
||||||
import type { Category } from "@/types/content";
|
import type { Category } from "@/types/content";
|
||||||
|
|
||||||
const mainNav = [
|
const mainNav = [
|
||||||
@@ -79,15 +82,46 @@ export function AppSidebar() {
|
|||||||
const pathname = usePathname();
|
const pathname = usePathname();
|
||||||
const searchParams = useSearchParams();
|
const searchParams = useSearchParams();
|
||||||
const { user, logout, isAuthenticated } = useAuth();
|
const { user, logout, isAuthenticated } = useAuth();
|
||||||
|
const { socket } = useSocket();
|
||||||
const { resolvedTheme } = useTheme();
|
const { resolvedTheme } = useTheme();
|
||||||
const [categories, setCategories] = React.useState<Category[]>([]);
|
const [categories, setCategories] = React.useState<Category[]>([]);
|
||||||
const [mounted, setMounted] = React.useState(false);
|
const [mounted, setMounted] = React.useState(false);
|
||||||
|
const [unreadMessages, setUnreadMessages] = React.useState(0);
|
||||||
|
|
||||||
React.useEffect(() => {
|
React.useEffect(() => {
|
||||||
setMounted(true);
|
setMounted(true);
|
||||||
CategoryService.getAll().then(setCategories).catch(console.error);
|
CategoryService.getAll().then(setCategories).catch(console.error);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
// Gérer le compteur de messages non-lus
|
||||||
|
React.useEffect(() => {
|
||||||
|
if (isAuthenticated) {
|
||||||
|
MessageService.getUnreadCount().then(setUnreadMessages).catch(console.error);
|
||||||
|
}
|
||||||
|
}, [isAuthenticated]);
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
if (socket && isAuthenticated) {
|
||||||
|
socket.on("new_message", () => {
|
||||||
|
// Incrémenter si on n'est pas sur la page messages
|
||||||
|
if (pathname !== "/messages") {
|
||||||
|
setUnreadMessages((prev) => prev + 1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
socket.off("new_message");
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}, [socket, isAuthenticated, pathname]);
|
||||||
|
|
||||||
|
// Remettre à zéro si on arrive sur la page messages
|
||||||
|
React.useEffect(() => {
|
||||||
|
if (pathname === "/messages") {
|
||||||
|
setUnreadMessages(0);
|
||||||
|
}
|
||||||
|
}, [pathname]);
|
||||||
|
|
||||||
const logoSrc = React.useMemo(() => {
|
const logoSrc = React.useMemo(() => {
|
||||||
if (!mounted) return "/memegoat-color.svg";
|
if (!mounted) return "/memegoat-color.svg";
|
||||||
return resolvedTheme === "dark"
|
return resolvedTheme === "dark"
|
||||||
@@ -193,6 +227,11 @@ export function AppSidebar() {
|
|||||||
<span>Messages</span>
|
<span>Messages</span>
|
||||||
</Link>
|
</Link>
|
||||||
</SidebarMenuButton>
|
</SidebarMenuButton>
|
||||||
|
{unreadMessages > 0 && (
|
||||||
|
<SidebarMenuBadge className="bg-red-500 text-white border-none h-5 min-w-5 flex items-center justify-center p-1 text-[10px]">
|
||||||
|
{unreadMessages > 9 ? "9+" : unreadMessages}
|
||||||
|
</SidebarMenuBadge>
|
||||||
|
)}
|
||||||
</SidebarMenuItem>
|
</SidebarMenuItem>
|
||||||
)}
|
)}
|
||||||
</SidebarMenu>
|
</SidebarMenu>
|
||||||
|
|||||||
Reference in New Issue
Block a user