2026-03-03 13:09:29 -05:00
|
|
|
"use client";
|
|
|
|
|
|
|
|
|
|
import { ChevronLeft } from "lucide-react";
|
|
|
|
|
import { useEffect } from "react";
|
|
|
|
|
import { AnnouncementCard } from "@/components/announcements/AnnouncementCard";
|
2026-03-07 12:57:27 +05:30
|
|
|
import { AnnouncementsEmptyState } from "@/components/announcements/AnnouncementsEmptyState";
|
2026-03-03 13:09:29 -05:00
|
|
|
import { Button } from "@/components/ui/button";
|
|
|
|
|
import { useAnnouncements } from "@/hooks/use-announcements";
|
|
|
|
|
import { useMediaQuery } from "@/hooks/use-media-query";
|
|
|
|
|
import { SidebarSlideOutPanel } from "./SidebarSlideOutPanel";
|
|
|
|
|
|
2026-03-22 00:01:31 +05:30
|
|
|
export interface AnnouncementsSidebarContentProps {
|
2026-03-03 13:09:29 -05:00
|
|
|
onOpenChange: (open: boolean) => void;
|
|
|
|
|
onCloseMobileSidebar?: () => void;
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-22 00:01:31 +05:30
|
|
|
interface AnnouncementsSidebarProps extends AnnouncementsSidebarContentProps {
|
|
|
|
|
open: boolean;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function AnnouncementsSidebarContent({
|
2026-03-03 13:09:29 -05:00
|
|
|
onOpenChange,
|
|
|
|
|
onCloseMobileSidebar,
|
2026-03-22 00:01:31 +05:30
|
|
|
}: AnnouncementsSidebarContentProps) {
|
2026-03-03 13:09:29 -05:00
|
|
|
const isMobile = !useMediaQuery("(min-width: 640px)");
|
|
|
|
|
const { announcements, markAllRead } = useAnnouncements();
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
markAllRead();
|
2026-03-22 00:01:31 +05:30
|
|
|
}, [markAllRead]);
|
2026-03-03 13:09:29 -05:00
|
|
|
|
2026-03-22 00:01:31 +05:30
|
|
|
return (
|
2026-03-03 13:09:29 -05:00
|
|
|
<div className="h-full flex flex-col">
|
|
|
|
|
<div className="shrink-0 p-4 pb-2 space-y-3">
|
|
|
|
|
<div className="flex items-center justify-between">
|
|
|
|
|
<div className="flex items-center gap-2">
|
|
|
|
|
{isMobile && (
|
|
|
|
|
<Button
|
|
|
|
|
variant="ghost"
|
|
|
|
|
size="icon"
|
|
|
|
|
className="h-8 w-8 rounded-full"
|
|
|
|
|
onClick={() => {
|
|
|
|
|
onOpenChange(false);
|
|
|
|
|
onCloseMobileSidebar?.();
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
<ChevronLeft className="h-4 w-4 text-muted-foreground" />
|
|
|
|
|
<span className="sr-only">Close</span>
|
|
|
|
|
</Button>
|
|
|
|
|
)}
|
|
|
|
|
<h2 className="text-lg font-semibold">Announcements</h2>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div className="flex-1 overflow-y-auto p-4">
|
|
|
|
|
{announcements.length === 0 ? (
|
|
|
|
|
<AnnouncementsEmptyState />
|
|
|
|
|
) : (
|
|
|
|
|
<div className="flex flex-col gap-4">
|
|
|
|
|
{announcements.map((announcement) => (
|
|
|
|
|
<AnnouncementCard key={announcement.id} announcement={announcement} />
|
|
|
|
|
))}
|
|
|
|
|
</div>
|
|
|
|
|
)}
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
);
|
2026-03-22 00:01:31 +05:30
|
|
|
}
|
2026-03-03 13:09:29 -05:00
|
|
|
|
2026-03-22 00:01:31 +05:30
|
|
|
export function AnnouncementsSidebar({
|
|
|
|
|
open,
|
|
|
|
|
onOpenChange,
|
|
|
|
|
onCloseMobileSidebar,
|
|
|
|
|
}: AnnouncementsSidebarProps) {
|
2026-03-03 13:09:29 -05:00
|
|
|
return (
|
|
|
|
|
<SidebarSlideOutPanel open={open} onOpenChange={onOpenChange} ariaLabel="Announcements">
|
2026-03-22 00:01:31 +05:30
|
|
|
<AnnouncementsSidebarContent
|
|
|
|
|
onOpenChange={onOpenChange}
|
|
|
|
|
onCloseMobileSidebar={onCloseMobileSidebar}
|
|
|
|
|
/>
|
2026-03-03 13:09:29 -05:00
|
|
|
</SidebarSlideOutPanel>
|
|
|
|
|
);
|
|
|
|
|
}
|