"use client"; import { useCallback, useEffect, useRef, useState } from "react"; import { NoPermissionState } from "@/components/auth/no-permission-state"; import { useSuperAdminSession } from "@/components/auth/session-context"; import { PageHeader } from "@/components/dashboard/page-header"; import { PaginationControls } from "@/components/dashboard/pagination-controls"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { EmptyState } from "@/components/ui/empty-state"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { useToast } from "@/components/ui/toast"; import { getItems, getPagination } from "@/lib/api/core"; import { listPlatformNotifications } from "@/lib/api/notifications"; import { formatDateTime } from "@/lib/format"; import { SUPERADMIN_PERMISSIONS, hasPermission } from "@/lib/permissions"; import type { NotificationItem, NotificationsResponse } from "@/types/api"; export default function NotificationsPage() { const { permissions } = useSuperAdminSession(); const [readFilter, setReadFilter] = useState("all"); const [typeFilter, setTypeFilter] = useState("all"); const [resourceTypeFilter, setResourceTypeFilter] = useState("all"); const [page, setPage] = useState(1); const [response, setResponse] = useState(null); const [loading, setLoading] = useState(true); const { toast } = useToast(); const filtersRef = useRef({ readFilter, typeFilter, resourceTypeFilter }); const canReadNotifications = hasPermission( permissions, SUPERADMIN_PERMISSIONS.NOTIFICATIONS_READ, ); filtersRef.current = { readFilter, typeFilter, resourceTypeFilter }; const loadNotifications = useCallback(async () => { if (!canReadNotifications) { setLoading(false); return; } const { readFilter: currentReadFilter, typeFilter: currentTypeFilter, resourceTypeFilter: currentResourceTypeFilter, } = filtersRef.current; const read = currentReadFilter === "all" ? undefined : currentReadFilter === "read" ? true : false; setLoading(true); try { const result = await listPlatformNotifications({ page, limit: 15, read, type: currentTypeFilter === "all" ? undefined : currentTypeFilter, resourceType: currentResourceTypeFilter === "all" ? undefined : currentResourceTypeFilter, sortOrder: "desc", }); setResponse(result); } catch (error) { toast({ title: "Failed to load notifications", description: String(error), variant: "danger" }); } finally { setLoading(false); } }, [canReadNotifications, page, toast]); useEffect(() => { void loadNotifications(); }, [loadNotifications]); const applyFilters = () => { if (page === 1) { void loadNotifications(); return; } setPage(1); }; const items = getItems(response) as NotificationItem[]; if (!canReadNotifications) { return (
); } return (
Filters Notifications Unread: {response?.unreadCount ?? 0} {!items.length && !loading ? ( ) : (
{items.map((item) => (

{item.title ?? item.type}

{formatDateTime(item.createdAt)}

{item.read ? "Read" : "New"} {item.type} {item.resourceType ?? "-"}

{item.previewText ?? item.body ?? "-"}

{item.deepLink ? (

Deep link: {item.deepLink}

) : null}
))}
)}
); }