import { memo, useState } from 'react' import { Megaphone } from 'lucide-react' import { useTranslation } from 'react-i18next' import { getAnnouncementColorClass } from '@/lib/colors' import { formatDateTimeObject } from '@/lib/time' import { cn } from '@/lib/utils' import { ScrollArea } from '@/components/ui/scroll-area' import { useAnnouncements } from '@/features/dashboard/hooks/use-status-data' import { getPreviewText } from '@/features/dashboard/lib' import type { AnnouncementItem } from '@/features/dashboard/types' import { PanelWrapper } from '../ui/panel-wrapper' import { AnnouncementDetailModal } from './announcement-detail-dialog' const AnnouncementStatusDot = memo(function AnnouncementStatusDot(props: { type?: string }) { return ( ) }) export function AnnouncementsPanel() { const { t } = useTranslation() const { items: list, loading } = useAnnouncements() const [selectedAnnouncement, setSelectedAnnouncement] = useState(null) const [isDialogOpen, setIsDialogOpen] = useState(false) const handleAnnouncementClick = (item: AnnouncementItem) => { setSelectedAnnouncement(item) setIsDialogOpen(true) } return ( {t('Announcements')} } loading={loading} empty={!list.length} emptyMessage={t('No announcements at this time')} height='h-56 sm:h-64' > {list.map((item: AnnouncementItem, idx: number) => { const key = item.id ?? `announcement-${idx}` return ( handleAnnouncementClick(item)} className={cn( 'group hover:bg-muted/40 w-full px-3 py-3 text-left transition-colors sm:px-5 sm:py-3.5', idx < list.length - 1 && 'border-border/60 border-b' )} > {getPreviewText(item.content)} {item.publishDate && ( {formatDateTimeObject(new Date(item.publishDate))} )} {t('Click for details')} ) })} ) }
{getPreviewText(item.content)}