'use client' import { useEffect, useState } from 'react' import { useParams } from 'next/navigation' import PageNavbar from '@/components/layouts/PageNavbar' import Button from '@/components/formElements/Button' import Input from '@/components/formElements/Input' import { APP_ROUTES } from '@/constants/routes' import useAlertModal from '@/hooks/useAlertModal' import { addToast } from '@/lib/toast' import { formatIranianMobile, formatPersianDate } from '@/lib/formatters' import { adminReplyToSupportTicket, getAdminSupportTicket, SUPPORT_ADMIN_STATUS_LABELS, SUPPORT_CATEGORY_LABELS, SUPPORT_PRIORITY_LABELS, updateSupportTicketStatus, type SupportTicket, } from '@/services/supportTickets' const AdminSupportTicketDetail = () => { const { id } = useParams<{ id: string }>() const { showAlert } = useAlertModal() const [ticket, setTicket] = useState(null) const [reply, setReply] = useState('') const [pending, setPending] = useState(false) useEffect(() => { void getAdminSupportTicket(id) .then(setTicket) .catch(() => addToast({ title: 'دریافت تیکت ناموفق بود', color: 'danger' })) }, [id]) const send = async () => { if (!reply.trim()) return try { setPending(true) const updated = await adminReplyToSupportTicket(id, reply) setTicket(updated) setReply('') addToast({ title: 'پاسخ ثبت شد و پیامک کاربر در صف ارسال قرار گرفت', color: 'success' }) } catch { addToast({ title: 'ثبت پاسخ ناموفق بود', color: 'danger' }) } finally { setPending(false) } } const changeStatus = async (status: string) => { try { setTicket(await updateSupportTicketStatus(id, status)) addToast({ title: 'وضعیت تیکت تغییر کرد', color: 'success' }) } catch { addToast({ title: 'تغییر وضعیت ناموفق بود', color: 'danger' }) } } const confirmSend = () => { if (!reply.trim()) return showAlert('این پاسخ ثبت و پیامک اطلاع‌رسانی برای کاربر ارسال شود؟', () => { void send() }) } const confirmStatusChange = (nextStatus: string) => { if (!ticket || nextStatus === ticket.status) return if (nextStatus === 'closed') { showAlert( 'این تیکت بسته شود؟ کاربر دیگر نمی‌تواند پیام بفرستد و در صورت بستن توسط ادمین، خودش نمی‌تواند دوباره باز کند.', () => { void changeStatus('closed') }, undefined, { dangerAccept: true } ) return } const label = SUPPORT_ADMIN_STATUS_LABELS[nextStatus as keyof typeof SUPPORT_ADMIN_STATUS_LABELS] ?? nextStatus showAlert(`وضعیت تیکت به «${label}» تغییر کند؟`, () => { void changeStatus(nextStatus) }) } const confirmClose = () => { confirmStatusChange('closed') } return (
{!ticket ? (

در حال دریافت…

) : ( <>

کاربر

{ticket.user.displayName || 'کاربر'}

{formatIranianMobile(ticket.user.mobile)}

دسته‌بندی

{SUPPORT_CATEGORY_LABELS[ticket.category]}

اولویت

{SUPPORT_PRIORITY_LABELS[ticket.priority]}
{ticket.status !== 'closed' ? (
) : (

{ticket.closedBy === 'user' ? 'این تیکت توسط کاربر بسته شده است.' : 'این تیکت توسط پشتیبانی بسته شده است؛ کاربر نمی‌تواند دوباره باز کند.'}

)}
{ticket.messages.map((message) => (

{message.isAdmin ? 'پشتیبانی' : ticket.user.displayName || 'کاربر'}

{message.body}

{formatPersianDate(message.createdAt)}

))}
{ticket.status !== 'closed' ? (
{ setReply(String(value)) }} />

می‌توانید چند پیام پشت‌سرهم بفرستید. کاربر فقط بعد از پاسخ شما یک پیام می‌تواند بفرستد. پس از ثبت پاسخ، برای کاربر پیامک اطلاع‌رسانی ارسال می‌شود.

) : null} )}
) } export default AdminSupportTicketDetail