import React, { useMemo, useState } from 'react'; import { MessageSquare, Trash2 } from 'lucide-react'; import { PageContainer } from '@/components/ui/Typography'; import { PageHeader } from '@/components/layout/PageHeader'; import { Table } from '@/components/ui/Table'; import { TableColumn } from '@/types'; import { Pagination } from '@/components/ui/Pagination'; import { DeleteConfirmModal } from '@/components/common/DeleteConfirmModal'; import { englishToPersian } from '@/utils/numberUtils'; import { formatDateTime } from '@/utils/formatters'; import { useContactUsMessages, useDeleteContactUsMessage } from '../core/_hooks'; import { ContactUsFilters, ContactUsMessage } from '../core/_models'; const ContactUsListPage: React.FC = () => { const [filters, setFilters] = useState({ limit: 20, offset: 0, }); const [deleteTarget, setDeleteTarget] = useState( null ); const { data, isLoading, error } = useContactUsMessages(filters); const deleteMessageMutation = useDeleteContactUsMessage(); const messages = data?.messages || []; const total = data?.total ?? messages.length; const limit = filters.limit || 20; const currentPage = Math.floor((filters.offset || 0) / limit) + 1; const totalPages = total > 0 ? Math.ceil(total / limit) : 1; const handlePageChange = (page: number) => { setFilters((prev) => ({ ...prev, offset: (page - 1) * prev.limit, })); }; const handleDeleteConfirm = () => { if (!deleteTarget) return; deleteMessageMutation.mutate(deleteTarget.ID, { onSuccess: () => setDeleteTarget(null), }); }; const columns: TableColumn[] = useMemo( () => [ { key: 'id', label: 'شناسه', align: 'center', render: (value: number) => englishToPersian(value), }, { key: 'name', label: 'نام', align: 'right', render: (value: string) => value || '-', }, { key: 'phone', label: 'شماره تماس', align: 'left', render: (value: string) => { const display = value ? englishToPersian(value) : '-'; return {display}; }, }, { key: 'message', label: 'پیام', align: 'right', render: (value: string) => { if (!value) return '-'; return value.length > 120 ? `${value.slice(0, 120)}...` : value; }, }, { key: 'created_at', label: 'تاریخ', align: 'right', render: (value: string) => formatDateTime(value), }, { key: 'actions', label: 'عملیات', align: 'center', render: (_val: unknown, row: any) => (
), }, ], [] ); const tableData = messages.map((message) => ({ id: message.ID, name: message.Name || '-', phone: message.PhoneNumber || '-', message: message.Message || '-', created_at: message.CreatedAt, raw: message, })); if (error) { return (

خطا در دریافت پیام‌های تماس با ما

); } return (
{isLoading ? ( ) : messages.length === 0 ? (

پیامی یافت نشد

هنوز پیامی برای نمایش وجود ندارد

) : (
)} {messages.length > 0 && totalPages > 1 && ( )} setDeleteTarget(null)} onConfirm={handleDeleteConfirm} title="حذف پیام تماس با ما" message="آیا از حذف این پیام اطمینان دارید؟ این عمل قابل بازگشت نیست." isLoading={deleteMessageMutation.isPending} /> ); }; export default ContactUsListPage;