'use client' import { useState } from 'react' import type { PaginationListColumnType } from '@/types' import useDisclosure from '@/hooks/useDisclosure' import PaginatedList from '@/components/PaginatedList' import Button from '@/components/formElements/Button' import Modal from '@/components/modals/Modal' import AdminTableViewButton from '@/components/ui/AdminTableViewButton' import StatusChip from '@/components/ui/StatusChip' import { APP_ROUTES, CONSUMER_ROUTES } from '@/constants/routes' import { coerceToString, formatPersonName } from '@/helpers' import { API_ROUTES } from '@/services/config' import { formatIranianMobile, formatPersianDate, truncateValue } from '@/lib/formatters' interface PushDeliveryRow { id: string notificationId: string userId: string subscriptionId: string mobile: string category: string title: string body: string actionUrl: string | null status: string errorMessage: string | null userAgent: string | null displayedAt: string | null openedAt: string | null createdAt: string recipient?: { firstName: string | null lastName: string | null } } const columns: PaginationListColumnType[] = [ { field: 'userId', label: 'گیرنده', filterable: true, sortable: false, type: 'text' }, { field: 'mobile', label: 'موبایل', filterable: true, sortable: false, type: 'text' }, { field: 'title', label: 'عنوان', filterable: false, sortable: false }, { field: 'status', label: 'ارسال', filterable: true, sortable: false, type: 'select', filterItems: [ { code: 'sent', name: 'ارسال‌شده' }, { code: 'failed', name: 'ناموفق' }, ], }, { field: 'displayedAt', label: 'نمایش', filterable: false, sortable: false }, { field: 'openedAt', label: 'بازشدن', filterable: false, sortable: false }, { field: 'createdAt', label: 'تاریخ ثبت', filterable: false, sortable: true }, { field: 'actions', label: 'عملیات' }, ] const getPushStatus = (row: PushDeliveryRow) => { if (row.status === 'failed') { return { label: 'ناموفق', chipColor: 'danger' as const, description: row.errorMessage ?? undefined, } } if (row.openedAt) { return { label: 'باز شده', chipColor: 'success' as const } } if (row.displayedAt) { return { label: 'نمایش داده شده', chipColor: 'warning' as const } } return { label: 'ارسال‌شده', chipColor: 'default' as const } } const PushDeliveriesPanel = () => { const { isOpen, onOpen, onOpenChange } = useDisclosure() const [activeDelivery, setActiveDelivery] = useState(null) const openDetails = (row: PushDeliveryRow) => { setActiveDelivery(row) onOpen() } return ( <> {{ userId: (row) => { const delivery = row as unknown as PushDeliveryRow const name = formatPersonName(delivery.recipient?.firstName, delivery.recipient?.lastName) return (
{name !== '—' && {name}} {formatIranianMobile(delivery.mobile)}
) }, mobile: (_row, cellValue) => {formatIranianMobile(coerceToString(cellValue))}, title: (row, cellValue) => { const delivery = row as unknown as PushDeliveryRow return (
{truncateValue(coerceToString(cellValue), 50)} {truncateValue(delivery.body, 70)}
) }, status: (row) => { const delivery = row as unknown as PushDeliveryRow const status = getPushStatus(delivery) return ( ) }, displayedAt: (_row, cellValue) => formatPersianDate(cellValue), openedAt: (_row, cellValue) => formatPersianDate(cellValue), createdAt: (_row, cellValue) => formatPersianDate(cellValue), actions: (row) => { const delivery = row as unknown as PushDeliveryRow return (
) }, }}

عنوان

{activeDelivery?.title ?? '—'}

متن اعلان

{activeDelivery?.body ?? '—'}

مسیر مقصد

{activeDelivery?.actionUrl ?? CONSUMER_ROUTES.PROFILE_NOTIFICATIONS}

دسته

{activeDelivery?.category ?? '—'}

زمان نمایش

{formatPersianDate(activeDelivery?.displayedAt)}

زمان بازشدن

{formatPersianDate(activeDelivery?.openedAt)}

User-Agent

{activeDelivery?.userAgent ?? '—'}

{activeDelivery?.errorMessage ? (

خطای تحویل

{activeDelivery.errorMessage}

) : null}
) } export default PushDeliveriesPanel