import type { PaginationListColumnType } from '@/types' import type { AdminUserDetail } from '@/services/adminUserDetail' import { Card, CardBody, CardHeader } from '@/components/heroui/Card' import { Chip } from '@/components/heroui/Chip' import StatusChip from '@/components/ui/StatusChip' import { getBooleanStatus, getIdentityStatus, getUserAccountStatus, getUserRole } from '@/constants/status' import { formatNumber } from '@/helpers' import { formatIranianMobile, formatPersianDate } from '@/lib/formatters' export const formatToman = (value: unknown) => { const amount = Number(value) return Number.isFinite(amount) ? `${formatNumber(amount)} تومان` : '—' } const column = (field: string, label: string, type?: 'text' | 'date'): PaginationListColumnType => ({ field, label, filterable: false, sortable: false, ...(type ? { type } : {}), }) export const hostedEventsColumns = [ column('title', 'عنوان', 'text'), column('status', 'وضعیت'), column('startsAt', 'شروع', 'date'), column('bookedCount', 'ظرفیت پرشده'), column('capacity', 'ظرفیت کل'), column('isFree', 'رایگان'), column('price', 'قیمت'), column('createdAt', 'تاریخ ثبت', 'date'), ] export const bookingsColumns = [ column('bookingCode', 'کد رزرو', 'text'), column('eventTitle', 'رویداد', 'text'), column('status', 'وضعیت'), column('checkedInAt', 'چک‌این', 'date'), column('createdAt', 'تاریخ ثبت', 'date'), ] export const paymentsColumns = [ column('paymentCode', 'کد پرداخت', 'text'), column('eventTitle', 'رویداد', 'text'), column('method', 'روش'), column('status', 'وضعیت'), column('totalAmount', 'مبلغ کل'), column('createdAt', 'تاریخ ثبت', 'date'), ] export const reviewsColumns = [ column('eventTitle', 'رویداد', 'text'), column('authorName', 'نویسنده', 'text'), column('rating', 'امتیاز'), column('body', 'متن', 'text'), column('status', 'وضعیت'), column('createdAt', 'تاریخ ثبت', 'date'), ] export const followsColumns = [ column('mobile', 'موبایل', 'text'), column('name', 'نام', 'text'), column('notifyNewEvents', 'اعلان رویداد جدید'), column('createdAt', 'تاریخ', 'date'), ] export const reportsColumns = [ column('otherUserMobile', 'موبایل طرف مقابل', 'text'), column('otherUserName', 'نام طرف مقابل', 'text'), column('reasonLabel', 'دلیل', 'text'), column('status', 'وضعیت'), column('createdAt', 'تاریخ', 'date'), ] export const blocksColumns = [ column('otherUserMobile', 'موبایل', 'text'), column('otherUserName', 'نام', 'text'), column('createdAt', 'تاریخ', 'date'), ] const DetailItem = ({ label, children }: { label: string; children: React.ReactNode }) => (
{label} {children}
) /** Compact profile strip — name is already in the page navbar. */ export const AdminUserOverview = ({ detail }: { detail: AdminUserDetail }) => { const role = getUserRole(detail.role) const accountStatus = getUserAccountStatus(detail.status) const identityStatus = getIdentityStatus(detail.identityStatus) return ( {formatIranianMobile(detail.mobile)} {detail.cityName ? ( {detail.cityName} ) : null} {role.label} {accountStatus.label} احراز · {identityStatus.label} کیف‌پول · {formatToman(detail.walletBalance)} آخرین ورود · {formatPersianDate(detail.lastLoginAt)} ثبت‌نام · {formatPersianDate(detail.createdAt)} {detail.dateOfBirth ? ( تولد · {formatPersianDate(detail.dateOfBirth, { dateStyle: 'medium' })} ) : null} ) } export const AdminUserContactInfo = ({ detail }: { detail: AdminUserDetail }) => { const links = detail.contactLinks ?? [] const hasAddress = Boolean(detail.defaultAddress?.trim()) const hasLinks = links.length > 0 if (!hasAddress && !hasLinks && !detail.bio) { return ( اطلاعات تماس هنوز آدرس ثابت یا لینک تماسی ثبت نشده است. ) } return ( اطلاعات تماس {detail.bio ? {detail.bio} : null} {hasAddress ? {detail.defaultAddress} : null} {hasLinks ? (
راه‌های تماس
{links.map((link) => (
{link.label}
{link.value}
))}
) : null}
) } export const AdminUserActivitySummary = ({ detail }: { detail: AdminUserDetail }) => { const summary = [ ['رویدادهای میزبانی‌شده', detail.summary.hostedEventsCount], ['رزروها', detail.summary.bookingsCount], ['پرداخت‌ها', detail.summary.paymentsCount], ['نظرات نوشته‌شده', detail.summary.reviewsWrittenCount], ['نظرات دریافت‌شده', detail.summary.reviewsReceivedCount], ['دنبال‌شونده‌ها', detail.summary.followingCount], ['دنبال‌کننده‌ها', detail.summary.followersCount], ['گزارش‌های ثبت‌شده', detail.summary.reportsFiledCount], ['گزارش‌های دریافت‌شده', detail.summary.reportsReceivedCount], ['بلاک‌کرده', detail.summary.blockingCount], ['بلاک‌شده توسط', detail.summary.blockedByCount], ] as const return ( خلاصه فعالیت‌ها
{summary.map(([label, value]) => ( {value} ))}
) }