import { useEffect, useMemo, useState } from 'react' import { Mail, RotateCcw, Search } from 'lucide-react' import { useLocale } from '@meshkee/dashboard-ui' import { Breadcrumbs } from '../components/Breadcrumbs' import { EmptyTableRow } from '../components/EmptyState' import { PageTitle } from '../components/PageTitle' import { ContactSubmissionDetailModal } from '../components/ContactSubmissionDetailModal' import { Pagination } from '../components/Pagination' import { useT } from '../i18n/useT' import { ApiError, isAbortError } from '../lib/api' import { formatCellForDisplay } from '../lib/cellNumber' import { listContactSubmissions } from '../services/contactSubmissionService' import type { ContactSubmission, ContactSubmissionsListResponse, } from '../types/contactSubmission' import filterStyles from '../components/ListFiltersPanel.module.css' import pageStyles from '../components/PageContent.module.css' import styles from './WebsiteContactPage.module.css' const PAGE_SIZE = 20 const COLUMN_COUNT = 6 function formatDateTime(value: string, locale: 'en' | 'fa') { const d = new Date(value) if (Number.isNaN(d.getTime())) return { date: value, time: '' } const intlLocale = locale === 'fa' ? 'fa-IR' : 'en-US' return { date: d.toLocaleDateString(intlLocale, { year: 'numeric', month: 'short', day: '2-digit' }), time: d.toLocaleTimeString(intlLocale, { hour: '2-digit', minute: '2-digit' }), } } export function WebsiteContactPage() { const t = useT() const { locale } = useLocale() const [data, setData] = useState(null) const [loading, setLoading] = useState(false) const [error, setError] = useState('') const [appliedQuery, setAppliedQuery] = useState('') const [draftQuery, setDraftQuery] = useState('') const [page, setPage] = useState(1) const [selected, setSelected] = useState(null) useEffect(() => { const controller = new AbortController() async function load() { setLoading(true) setError('') try { const result = await listContactSubmissions( { page, pageSize: PAGE_SIZE, ...(appliedQuery ? { q: appliedQuery } : {}), }, controller.signal, ) if (controller.signal.aborted) return setData(result) } catch (err) { if (isAbortError(err) || controller.signal.aborted) return setError(err instanceof ApiError ? err.message : t('website.contact.errorLoad')) } finally { if (!controller.signal.aborted) setLoading(false) } } void load() return () => { controller.abort() } }, [page, appliedQuery]) const totalPages = useMemo(() => { const total = data?.total ?? 0 return Math.max(1, Math.ceil(total / PAGE_SIZE)) }, [data?.total]) const showingFrom = useMemo(() => { if (!data || data.total === 0) return 0 return (page - 1) * PAGE_SIZE + 1 }, [data, page]) const showingTo = useMemo(() => { if (!data) return 0 return Math.min(data.total, page * PAGE_SIZE) }, [data, page]) function applyFilters() { setPage(1) setAppliedQuery(draftQuery.trim()) } function clearFilters() { setDraftQuery('') setAppliedQuery('') setPage(1) } return (
{t('title.contactForm')}

{t('website.contact.subtitle')}

{t('website.contact.filters')}
{ e.preventDefault(); applyFilters() }}>
setDraftQuery(e.target.value)} placeholder={t('website.contact.searchPlaceholder')} aria-label={t('website.contact.search')} />
{t('website.contact.listTitle')}
{data ? ( data.total > 0 ? ( <> {t('website.contact.showing', { from: showingFrom, to: showingTo, total: data.total, })} ) : ( t('website.contact.none') ) ) : ( ' ' )}
{error &&
{error}
}
{loading && ( )} {!loading && data?.items.length === 0 && ( )} {!loading && data?.items.map((item) => { const { date, time } = formatDateTime(item.createdAt, locale) return ( setSelected(item)} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault() setSelected(item) } }} tabIndex={0} role="button" aria-label={t('website.contact.viewSubmission', { name: item.name })} > ) })}
{t('website.contact.col.title')} {t('website.contact.col.name')} {t('website.contact.col.email')} {t('website.contact.col.cell')} {t('website.contact.col.date')} {t('website.contact.col.time')}
{t('website.contact.loading')}
{item.title} {item.name} {item.email ?? '—'} {item.cellNumber ? formatCellForDisplay(item.cellNumber) : '—'} {date} {time || '—'}
{t('website.contact.pageMeta', { page, totalPages, pageSize: PAGE_SIZE, total: data?.total ?? 0, })}
setSelected(null)} />
) }