import { useState } from 'react' import { createFileRoute, useNavigate } from '@tanstack/react-router' import { useQuery } from '@tanstack/react-query' import { useTranslation } from 'react-i18next' import { Button } from '@/shared/ui/button' import { Card, CardContent, CardHeader, CardTitle } from '@/shared/ui/card' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/shared/ui/select' import { TicketStatusBadge } from '@/features/support/TicketStatusBadge' import { AdminTicketDetailDialog } from '@/features/admin/support/AdminTicketDetailDialog' import { listAllTickets } from '@/features/admin/support/api' import type { TicketStatus, TicketType } from '@/shared/api/types' const TYPES: TicketType[] = ['BugReport', 'ExtensionRequest'] const STATUSES: TicketStatus[] = ['Open', 'Resolved', 'Closed'] export const Route = createFileRoute('/admin/support')({ component: AdminSupportPage, // Ссылка из Telegram-уведомления ведёт на этот же роут с ?ticket= — отдельного роута // на конкретный тикет нет, он открывается диалогом поверх списка. validateSearch: (search: Record): { ticket?: string } => ({ ticket: typeof search.ticket === 'string' ? search.ticket : undefined, }), }) const PAGE_SIZE = 20 function AdminSupportPage() { const { t } = useTranslation() const navigate = useNavigate({ from: Route.fullPath }) const { ticket: selectedTicketId } = Route.useSearch() const [page, setPage] = useState(1) const [type, setType] = useState('all') const [status, setStatus] = useState('all') const typeFilter = type === 'all' ? undefined : type const statusFilter = status === 'all' ? undefined : status const { data, isLoading, isError, refetch } = useQuery({ queryKey: ['admin-tickets', page, typeFilter, statusFilter], queryFn: () => listAllTickets(typeFilter, statusFilter, page, PAGE_SIZE), }) return (
{isLoading &&

} {isError && (

{t('auth.genericError')}

)} {data?.items.length === 0 &&

{t('admin.support.empty')}

} {data && data.items.length > 0 && (
{data.items.map((ticket) => ( navigate({ search: { ticket: ticket.id } })}> {ticket.userName} — {t(`support.type.${ticket.type}`)} {ticket.messagePreview &&

{ticket.messagePreview}

}

{t('support.lastActivity', { date: new Date(ticket.lastActivityAt).toLocaleString() })}

))}
)} {data && data.total > PAGE_SIZE && (
)} {selectedTicketId && ( !open && navigate({ search: {} })} /> )}
) }