import { DataTable } from '@/components/admin/DataTable.tsx'; import { Badge, Button } from '@/components/ui'; import { useAnnouncements, useDeleteAnnouncement } from '@/hooks/api/useAdminAPI.ts'; import { useTranslation } from '@/hooks/useI18n.tsx'; import type { Announcement } from '@/services/admin-api.ts'; import { Edit, Plus, Trash2 } from 'lucide-react'; import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; const AnnouncementsPage = () => { const { t } = useTranslation(); const navigate = useNavigate(); const [currentPage, setCurrentPage] = useState(1); const pageSize = 25; const [isActiveFilter, setIsActiveFilter] = useState(); const { data, isLoading } = useAnnouncements({ isActive: isActiveFilter }); const { mutate: deleteAnnouncement } = useDeleteAnnouncement(); const handleDelete = (announcement: Announcement) => { if ( window.confirm( t('adminPage.content.announcements.confirmDelete', { title: announcement.title }) || `Delete "${announcement.title}"?` ) ) { deleteAnnouncement(announcement.id, { onSuccess: () => { // Query will refetch automatically }, }); } }; const getPriorityBadge = (priority: string) => { switch (priority) { case 'urgent': return ( {t('adminPage.content.announcements.urgent') || 'Urgent'} ); case 'high': return ( {t('adminPage.content.announcements.high') || 'High'} ); case 'normal': return ( {t('adminPage.content.announcements.normal') || 'Normal'} ); case 'low': return {t('adminPage.content.announcements.low') || 'Low'}; default: return {priority}; } }; const columns = [ { key: 'title', header: t('adminPage.content.announcements.table.title') || 'Title', render: (announcement: Announcement) => ( {announcement.title} ), }, { key: 'priority', header: t('adminPage.content.announcements.table.priority') || 'Priority', render: (announcement: Announcement) => getPriorityBadge(announcement.priority), }, { key: 'displayType', header: t('adminPage.content.announcements.table.displayType') || 'Display Type', render: (announcement: Announcement) => ( {announcement.displayType} ), }, { key: 'isActive', header: t('adminPage.content.announcements.table.status') || 'Status', render: (announcement: Announcement) => ( {announcement.isActive ? t('adminPage.content.announcements.active') || 'Active' : t('adminPage.content.announcements.inactive') || 'Inactive'} ), }, { key: 'views', header: t('adminPage.content.announcements.table.views') || 'Views', render: (announcement: Announcement) => ( {announcement.views || 0} ), }, ]; const actions = [ { label: t('adminPage.content.announcements.edit') || 'Edit', icon: , onClick: (announcement: Announcement) => navigate(`/admin/content/announcements/${announcement.id}/edit`), }, { label: t('adminPage.content.announcements.delete') || 'Delete', icon: , variant: 'destructive' as const, onClick: (announcement: Announcement) => handleDelete(announcement), }, ]; const announcements = data?.announcements || []; return (
{/* Header */}

{t('adminPage.content.announcements.title') || 'Announcements'}

{t('adminPage.content.announcements.description') || 'Manage system announcements and notifications'}

{/* Filters */}
{/* Table */} announcement.id} isLoading={isLoading} actions={actions} pagination={ announcements.length > 0 ? { currentPage, totalPages: Math.ceil(announcements.length / pageSize), pageSize, totalItems: announcements.length, onPageChange: setCurrentPage, } : undefined } emptyMessage={ t('adminPage.content.announcements.noAnnouncements') || 'No announcements found' } emptyDescription={ t('adminPage.content.announcements.createFirst') || 'Create your first announcement to get started' } emptyAction={ } />
); }; export default AnnouncementsPage;