'use client' import type { AdminEventDetailData } from './types' import dynamic from 'next/dynamic' import DOMPurify from 'isomorphic-dompurify' import type { EventFaq, EventMedia } from '@/services/eventDetail' import Button from '@/components/formElements/Button' import AdminTableViewButton from '@/components/ui/AdminTableViewButton' import FallbackImage from '@/components/media/FallbackImage' import { Card, CardBody, CardHeader } from '@/components/heroui/Card' import { Chip } from '@/components/heroui/Chip' import { APP_ROUTES } from '@/constants/routes' import { getBooleanStatus } from '@/constants/status' import { DEFAULT_EVENT_IMAGE } from '@/constants/images' import { formatNumber, formatPersonName } from '@/helpers' import { getPublicMapApiKey } from '@/helpers/mapir' import { formatIranianMobile, formatPersianDate } from '@/lib/formatters' import { ageRestrictionLabel, genderRestrictionLabel } from '@/lib/eventAudience' import { DetailItem } from './AdminEventDetailUi' const MapirPreviewMap = dynamic(() => import('@/components/map/MapirPreviewMap'), { ssr: false }) const number = formatNumber const hostDisplayName = (event: AdminEventDetailData) => formatPersonName(event.organizer?.firstName, event.organizer?.lastName) const restrictionStatus = (value: string | null | undefined, label: string) => (value === 'open' ? 'بدون محدودیت' : `دارد · ${label}`) interface AdminEventDetailsSectionProps { event: AdminEventDetailData categoryName: string cityName: string provinceName: string media: EventMedia[] faqs: EventFaq[] onEditCommission: () => void } const AdminEventDetailsSection = ({ event, categoryName, cityName, provinceName, media, faqs, onEditCommission, }: AdminEventDetailsSectionProps) => { const autoGroupBadge = getBooleanStatus(event.settings.autoCreateGroup, { true: 'گروه چت خودکار', false: 'بدون گروه خودکار', }) const waitlistOfferBadge = getBooleanStatus(event.settings.waitlistAutoOffer, { true: 'پیشنهاد لیست انتظار', false: 'بدون پیشنهاد انتظار', }) const reviewSmsBadge = getBooleanStatus(event.settings.sendReviewRequestSms ?? false, { true: 'پیامک درخواست نظر', false: 'بدون پیامک نظر', }) return ( اطلاعات عمومی رویداد
ذخیره · {number(event.bookmarkCount ?? 0)} {autoGroupBadge.label} {waitlistOfferBadge.label} {reviewSmsBadge.label} پایان · {formatPersianDate(event.endsAt)}
{event.slug} {categoryName} {provinceName}، {cityName} {event.address ? `، ${event.address}` : ''}
{hostDisplayName(event)} {event.organizer?.mobile ? ( ({formatIranianMobile(event.organizer.mobile)}) ) : null}
{number(event.effectiveCommissionPercent ?? 0)}٪ {event.commissionPercent != null ? '(اختصاصی)' : '(پیش‌فرض)'}
{number(event.cancellationFeePercent)}٪ {restrictionStatus(event.genderRestriction, genderRestrictionLabel(event.genderRestriction))} {restrictionStatus(event.ageRestriction, ageRestrictionLabel(event.ageRestriction))} {event.settings.addressVisibility === 'attendees_only' ? 'فقط رزروکنندگان' : 'نمایش برای همه'} {event.settings.generalArea ?? 'ثبت نشده'} {event.avgRating == null ? 'بدون امتیاز' : `${number(event.avgRating)} از ۵`} · {number(event.reviewsCount)} نظر {event.discoveryPlacements?.length ? event.discoveryPlacements.map((item) => `${item.placement} (${number(item.priority)})`).join('، ') : '—'} {event.publishedAt ? formatPersianDate(String(event.publishedAt)) : 'منتشر نشده'} {event.adminApprovedAt ? formatPersianDate(String(event.adminApprovedAt)) : 'تایید نشده'} {event.rejectionReason ? {event.rejectionReason} : null} {formatPersianDate(String(event.createdAt))} {formatPersianDate(String(event.updatedAt))} {event.lat != null && event.lng != null && Number.isFinite(event.lat) && Number.isFinite(event.lng) ? ( {event.lat.toFixed(6)}, {event.lng.toFixed(6)} ) : null} {event.clonedFromEventId ? ( ) : null}
{event.lat != null && event.lng != null && Number.isFinite(event.lat) && Number.isFinite(event.lng) && getPublicMapApiKey() ? (

موقعیت روی نقشه

) : null} {event.shortDescription || event.description ? (
توضیحات {event.shortDescription ?

{event.shortDescription}

: null} {event.description ? (
) : null}
) : null}
رسانه‌ها ({number(media.length)}) {media.length ? (
{media.map((item) => ( ))}
) : event.posterUrl ? (
) : (

رسانه‌ای ثبت نشده است.

)}
سوالات متداول ({number(faqs.length)}) {faqs.length ? (
{faqs.map((faq) => (

{faq.question}

{faq.answer}

))}
) : (

سوالی ثبت نشده است.

)}
) } export default AdminEventDetailsSection