import { DataTable } from '@/components/admin/DataTable.tsx'; import { Badge, Button } from '@/components/ui'; import { usePages, useDeletePage } from '@/hooks/api/useAdminAPI.ts'; import { useTranslation } from '@/hooks/useI18n.tsx'; import type { StaticPage } from '@/services/admin-api.ts'; import { Edit, Plus, Trash2, Eye } from 'lucide-react'; import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; const ContentPagesPage = () => { const { t } = useTranslation(); const navigate = useNavigate(); const [currentPage, setCurrentPage] = useState(1); const pageSize = 25; const { data, isLoading } = usePages(); const { mutate: deletePage } = useDeletePage(); const handleDelete = (page: StaticPage) => { if ( window.confirm( t('adminPage.content.pages.confirmDelete', { title: page.title }) || `Delete "${page.title}"?` ) ) { deletePage(page.id, { onSuccess: () => { // Query will refetch automatically }, }); } }; const getStatusBadge = (status: string) => { switch (status) { case 'published': return ( {t('adminPage.content.pages.published') || 'Published'} ); case 'draft': return {t('adminPage.content.pages.draft') || 'Draft'}; case 'archived': return ( {t('adminPage.content.pages.archived') || 'Archived'} ); default: return {status}; } }; const columns = [ { key: 'slug', header: t('adminPage.content.pages.table.slug') || 'Slug', render: (page: StaticPage) => {page.slug}, }, { key: 'title', header: t('adminPage.content.pages.table.title') || 'Title', render: (page: StaticPage) => {page.title}, }, { key: 'status', header: t('adminPage.content.pages.table.status') || 'Status', render: (page: StaticPage) => getStatusBadge(page.status), }, { key: 'visibility', header: t('adminPage.content.pages.table.visibility') || 'Visibility', render: (page: StaticPage) => {page.visibility || 'public'}, }, { key: 'updatedAt', header: t('adminPage.content.pages.table.updated') || 'Updated', render: (page: StaticPage) => { try { const date = new Date(page.updatedAt); return {date.toLocaleDateString()}; } catch { return ; } }, }, ]; const actions = [ { label: t('adminPage.content.pages.edit') || 'Edit', icon: , onClick: (page: StaticPage) => navigate(`/admin/content/pages/${page.id}/edit`), }, { label: t('adminPage.content.pages.view') || 'View', icon: , onClick: (page: StaticPage) => window.open(`/${page.slug}`, '_blank'), }, { label: t('adminPage.content.pages.delete') || 'Delete', icon: , variant: 'destructive' as const, onClick: (page: StaticPage) => handleDelete(page), }, ]; const pages = data?.pages || []; return (
{/* Header */}

{t('adminPage.content.pages.title') || 'Static Pages'}

{t('adminPage.content.pages.description') || 'Manage static content pages like About, Contact, Privacy Policy, etc.'}

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