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;