'use client' import { useState } from 'react' import dynamic from 'next/dynamic' import { useParams } from 'next/navigation' import { Tab } from '@/components/heroui/Tabs' import useDisclosure from '@/hooks/useDisclosure' import PaginatedList from '@/components/PaginatedList' import PageNavbar from '@/components/layouts/PageNavbar' import Button from '@/components/formElements/Button' import { DetailSkeleton, TableSkeleton } from '@/components/feedback/LoadingState' import AdminState from '@/components/feedback/AdminState' import { APP_ROUTES } from '@/constants/routes' import { formatPersonName, coerceToString } from '@/helpers' import { formatIranianMobile, formatPersianDate } from '@/lib/formatters' import StatusChip from '@/components/ui/StatusChip' import AppTabs from '@/components/ui/AppTabs' import useAuth from '@/hooks/useAuth' import useAlertModal from '@/hooks/useAlertModal' import { addToast } from '@/lib/toast' import { useAdminUserDetail } from '@/features/admin-users/useAdminUserDetail' import { ADMIN_ATTEST_IDENTITY } from '@/services/adminUserDetail' import { AdminUserActivitySummary, AdminUserContactInfo, AdminUserOverview, blocksColumns, bookingsColumns, followsColumns, formatToman, hostedEventsColumns, paymentsColumns, reportsColumns, reviewsColumns, } from '@/features/admin-users/adminUserDetailUi' import { getActiveStatus, getBooleanStatus, getBookingStatus, getEventStatus, getPaymentMethod, getPaymentStatus, getReportStatus, getReviewStatus, } from '@/constants/status' import { API_ROUTES } from '@/services/config' const UserEditModal = dynamic(() => import('@/app/(dashboard)/users/[id]/_components/UserEditModal'), { ssr: false }) const WalletCreditModal = dynamic(() => import('@/app/(dashboard)/users/[id]/_components/WalletCreditModal'), { ssr: false }) const UserMobileChangeModal = dynamic(() => import('@/app/(dashboard)/users/[id]/_components/UserMobileChangeModal'), { ssr: false }) const UserDetailPage = () => { const params = useParams<{ id: string }>() const userId = params.id const { user: currentAdmin } = useAuth() const currentAdminId = currentAdmin?.userId const { data: detail, error, isLoading, refetch: refetchDetail } = useAdminUserDetail(userId) const { showAlert } = useAlertModal() const { isOpen: isEditOpen, onOpen: openEdit, onOpenChange: onEditOpenChange } = useDisclosure() const { isOpen: isCreditOpen, onOpen: openCredit, onOpenChange: onCreditOpenChange } = useDisclosure() const { isOpen: isMobileChangeOpen, onOpen: openMobileChange, onOpenChange: onMobileChangeOpenChange } = useDisclosure() const [editModalLoaded, setEditModalLoaded] = useState(false) const [creditModalLoaded, setCreditModalLoaded] = useState(false) const [mobileChangeModalLoaded, setMobileChangeModalLoaded] = useState(false) const canChangeMobile = Boolean(detail && currentAdminId && currentAdminId !== detail.id) const canAttestIdentity = Boolean(detail && detail.identityStatus !== 'verified') const handleOpenEdit = () => { setEditModalLoaded(true) openEdit() } const handleOpenCredit = () => { setCreditModalLoaded(true) openCredit() } const handleOpenMobileChange = () => { setMobileChangeModalLoaded(true) openMobileChange() } const handleAttestIdentity = () => { if (!userId || !canAttestIdentity) return showAlert('احراز هویت این کاربر بدون ارسال درخواست از طرف خودش تأیید شود؟ پس از تأیید می‌تواند رویداد بسازد.', async () => { const result = await ADMIN_ATTEST_IDENTITY(userId) if (!result.ok) return addToast({ title: 'احراز هویت تأیید شد', color: 'success' }) await refetchDetail() }) } return (
{detail && ( <> {canChangeMobile && ( )} {canAttestIdentity && ( )} )} } pageTitle={detail ? formatPersonName(detail.firstName, detail.lastName, 'جزئیات کاربر') : 'جزئیات کاربر'} /> {detail && ( <> {editModalLoaded ? ( void refetchDetail()} /> ) : null} {creditModalLoaded ? ( void refetchDetail()} /> ) : null} {canChangeMobile && mobileChangeModalLoaded ? ( void refetchDetail()} /> ) : null} )}
{isLoading && (
)} {!isLoading && error && (
void refetchDetail()} />
)} {!isLoading && detail && ( <>
{detail.identityStatus === 'verified' ? ( ) : null}
{{ status: (_row, cellValue) => , startsAt: (_row, cellValue) => formatPersianDate(cellValue), isFree: (_row, cellValue) => , price: (_row, cellValue) => formatToman(cellValue), createdAt: (_row, cellValue) => formatPersianDate(cellValue), }}
{{ status: (_row, cellValue) => , checkedInAt: (_row, cellValue) => formatPersianDate(cellValue), createdAt: (_row, cellValue) => formatPersianDate(cellValue), }}
{{ method: (_row, cellValue) => , status: (_row, cellValue) => , totalAmount: (_row, cellValue) => formatToman(cellValue), createdAt: (_row, cellValue) => formatPersianDate(cellValue), }}
{{ status: (_row, cellValue) => , createdAt: (_row, cellValue) => formatPersianDate(cellValue), }} {{ status: (_row, cellValue) => , createdAt: (_row, cellValue) => formatPersianDate(cellValue), }} {{ mobile: (_row, cellValue) => formatIranianMobile(cellValue), notifyNewEvents: (_row, cellValue) => , createdAt: (_row, cellValue) => formatPersianDate(cellValue), }} {{ mobile: (_row, cellValue) => formatIranianMobile(cellValue), notifyNewEvents: (_row, cellValue) => , createdAt: (_row, cellValue) => formatPersianDate(cellValue), }}
{{ otherUserMobile: (_row, cellValue) => formatIranianMobile(cellValue), status: (_row, cellValue) => , createdAt: (_row, cellValue) => formatPersianDate(cellValue), }}
{{ otherUserMobile: (_row, cellValue) => formatIranianMobile(cellValue), status: (_row, cellValue) => , createdAt: (_row, cellValue) => formatPersianDate(cellValue), }}
{{ otherUserMobile: (_row, cellValue) => formatIranianMobile(cellValue), createdAt: (_row, cellValue) => formatPersianDate(cellValue), }} {{ otherUserMobile: (_row, cellValue) => formatIranianMobile(cellValue), createdAt: (_row, cellValue) => formatPersianDate(cellValue), }}
)}
) } export default UserDetailPage