import { useCallback } from "react"; import { Inbox, Paperclip } from "lucide-react"; import { Link } from "react-router"; import { DashboardWidgetList, DismissibleAlert, LoadingFrame, i18nMessage, useDashboardWidgetData, usePlatformLanguage, type ApiSettings, type DashboardWidgetConfiguration } from "@govoplan/core-webui"; import { listPostboxMessages, listPostboxes } from "../../api/postbox"; export default function PostboxInboxWidget({ settings, refreshKey, configuration }: { settings: ApiSettings; refreshKey: number; configuration: DashboardWidgetConfiguration; }) { const { language } = usePlatformLanguage(); const maxItems = numberSetting(configuration.maxItems, 5, 1, 12); const load = useCallback(async () => { const postboxes = await listPostboxes(settings); const eligible = postboxes.filter( (postbox) => postbox.grouping_policy.mode === "allow" ); const separatedCount = postboxes.length - eligible.length; if (!eligible.length) { return { messages: [], total: 0, separatedCount }; } const response = await listPostboxMessages( settings, eligible.map((postbox) => postbox.id), maxItems, 0, "", "unread" ); return { ...response, separatedCount }; }, [maxItems, settings]); const { data, loading, error } = useDashboardWidgetData(load, refreshKey); return ( {error && ( {error} )} {data?.separatedCount ? ( {data.separatedCount} governed Postbox source{data.separatedCount === 1 ? " is" : "s are"} shown only in separated inbox views. ) : null} ({ id: message.id, title: message.subject, detail: message.sender_label || message.producer_module || "Postbox", meta: new Intl.DateTimeFormat(language, { day: "2-digit", month: "short", hour: "2-digit", minute: "2-digit" }).format(new Date(message.delivered_at)), leading: ); } function numberSetting( value: unknown, fallback: number, minimum: number, maximum: number ): number { const numeric = typeof value === "number" ? value : Number(value); return Number.isFinite(numeric) ? Math.max(minimum, Math.min(maximum, Math.floor(numeric))) : fallback; }