From 6bd34441fba95215bfc6fb1f1a6a2ef3e5efcf4a Mon Sep 17 00:00:00 2001 From: Leonid Pershin Date: Tue, 14 Jul 2026 07:14:38 +0300 Subject: [PATCH] Update TelegramNotifier URL structure and enhance admin support routing - Modified TelegramNotifier to change the support ticket URL format, using a query parameter for ticket identification. - Enhanced the admin support route to validate search parameters, allowing for ticket-specific navigation from Telegram notifications. - Updated AdminSupportPage to utilize navigation for ticket selection, improving user experience when accessing ticket details. --- .../PnvPanel.Api/Telegram/TelegramNotifier.cs | 2 +- frontend/src/routes/admin/support.tsx | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/backend/src/PnvPanel.Api/Telegram/TelegramNotifier.cs b/backend/src/PnvPanel.Api/Telegram/TelegramNotifier.cs index c8be340..db159f2 100644 --- a/backend/src/PnvPanel.Api/Telegram/TelegramNotifier.cs +++ b/backend/src/PnvPanel.Api/Telegram/TelegramNotifier.cs @@ -51,7 +51,7 @@ internal sealed class TelegramNotifier(ITelegramBotClient botClient, IIdentitySe InlineKeyboardMarkup? keyboard = null; if (!string.IsNullOrWhiteSpace(options.Value.PublicSiteUrl)) { - var url = $"{options.Value.PublicSiteUrl.TrimEnd('/')}/admin/support/{ticketId}"; + var url = $"{options.Value.PublicSiteUrl.TrimEnd('/')}/admin/support?ticket={ticketId}"; keyboard = new InlineKeyboardMarkup(new[] { InlineKeyboardButton.WithUrl("🌐 Открыть на сайте", url) }); } diff --git a/frontend/src/routes/admin/support.tsx b/frontend/src/routes/admin/support.tsx index 0816555..5af5d27 100644 --- a/frontend/src/routes/admin/support.tsx +++ b/frontend/src/routes/admin/support.tsx @@ -1,5 +1,5 @@ import { useState } from 'react' -import { createFileRoute } from '@tanstack/react-router' +import { createFileRoute, useNavigate } from '@tanstack/react-router' import { useQuery } from '@tanstack/react-query' import { useTranslation } from 'react-i18next' import { Button } from '@/shared/ui/button' @@ -8,14 +8,22 @@ import { TicketStatusBadge } from '@/features/support/TicketStatusBadge' import { AdminTicketDetailDialog } from '@/features/admin/support/AdminTicketDetailDialog' import { listAllTickets } from '@/features/admin/support/api' -export const Route = createFileRoute('/admin/support')({ component: AdminSupportPage }) +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 [selectedTicketId, setSelectedTicketId] = useState(null) const { data, isLoading, isError, refetch } = useQuery({ queryKey: ['admin-tickets', page], @@ -40,7 +48,7 @@ function AdminSupportPage() { {data && data.items.length > 0 && (
{data.items.map((ticket) => ( - setSelectedTicketId(ticket.id)}> + navigate({ search: { ticket: ticket.id } })}> {ticket.userName} — {t(`support.type.${ticket.type}`)} @@ -69,7 +77,7 @@ function AdminSupportPage() { )} {selectedTicketId && ( - !open && setSelectedTicketId(null)} /> + !open && navigate({ search: {} })} /> )}
)