From 482bdd0b0df43f84c41d4e28d1bb57741796ba04 Mon Sep 17 00:00:00 2001 From: c0mrade Date: Wed, 4 Feb 2026 06:11:29 +0300 Subject: [PATCH] Remove replace flag from back button navigation to fix double-click issue Fixed issue where users had to click the Telegram Mini App back button twice in many admin pages. The replace flag was causing conflicts between Telegram's BackButton internal history and React Router's history management. Updated all 32 admin pages to use simple navigate() calls without replace flag. --- src/pages/AdminApps.tsx | 2 +- src/pages/AdminBroadcastCreate.tsx | 2 +- src/pages/AdminBroadcastDetail.tsx | 2 +- src/pages/AdminBroadcasts.tsx | 2 +- src/pages/AdminCampaignCreate.tsx | 2 +- src/pages/AdminCampaignEdit.tsx | 2 +- src/pages/AdminCampaignStats.tsx | 2 +- src/pages/AdminCampaigns.tsx | 2 +- src/pages/AdminDashboard.tsx | 2 +- src/pages/AdminPaymentMethodEdit.tsx | 2 +- src/pages/AdminPaymentMethods.tsx | 2 +- src/pages/AdminPayments.tsx | 2 +- src/pages/AdminPromoGroupCreate.tsx | 2 +- src/pages/AdminPromoGroups.tsx | 2 +- src/pages/AdminPromoOfferSend.tsx | 2 +- src/pages/AdminPromoOfferTemplateEdit.tsx | 2 +- src/pages/AdminPromoOffers.tsx | 2 +- src/pages/AdminPromocodeCreate.tsx | 2 +- src/pages/AdminPromocodeStats.tsx | 2 +- src/pages/AdminPromocodes.tsx | 2 +- src/pages/AdminRemnawave.tsx | 2 +- src/pages/AdminRemnawaveSquadDetail.tsx | 2 +- src/pages/AdminServerEdit.tsx | 2 +- src/pages/AdminServers.tsx | 2 +- src/pages/AdminSettings.tsx | 2 +- src/pages/AdminTariffCreate.tsx | 2 +- src/pages/AdminTariffs.tsx | 2 +- src/pages/AdminTicketSettings.tsx | 2 +- src/pages/AdminTickets.tsx | 2 +- src/pages/AdminUserDetail.tsx | 2 +- src/pages/AdminUsers.tsx | 2 +- src/pages/AdminWheel.tsx | 2 +- 32 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/pages/AdminApps.tsx b/src/pages/AdminApps.tsx index df15423..8ed24d2 100644 --- a/src/pages/AdminApps.tsx +++ b/src/pages/AdminApps.tsx @@ -590,7 +590,7 @@ export default function AdminApps() { const { capabilities } = usePlatform(); // Use native Telegram back button in Mini App - useBackButton(() => navigate('/admin', { replace: true })); + useBackButton(() => navigate('/admin')); const [selectedPlatform, setSelectedPlatform] = useState('ios'); const [editingApp, setEditingApp] = useState<{ app: AppDefinition; isNew: boolean } | null>(null); diff --git a/src/pages/AdminBroadcastCreate.tsx b/src/pages/AdminBroadcastCreate.tsx index 7d555fc..0bc4f2d 100644 --- a/src/pages/AdminBroadcastCreate.tsx +++ b/src/pages/AdminBroadcastCreate.tsx @@ -119,7 +119,7 @@ export default function AdminBroadcastCreate() { const queryClient = useQueryClient(); const fileInputRef = useRef(null); - useBackButton(() => navigate('/admin/broadcasts', { replace: true })); + useBackButton(() => navigate('/admin/broadcasts')); // Channel selection const [channel, setChannel] = useState('telegram'); diff --git a/src/pages/AdminBroadcastDetail.tsx b/src/pages/AdminBroadcastDetail.tsx index 2b760e6..244d725 100644 --- a/src/pages/AdminBroadcastDetail.tsx +++ b/src/pages/AdminBroadcastDetail.tsx @@ -159,7 +159,7 @@ export default function AdminBroadcastDetail() { const broadcastId = id ? parseInt(id, 10) : null; - useBackButton(() => navigate('/admin/broadcasts', { replace: true })); + useBackButton(() => navigate('/admin/broadcasts')); // Fetch broadcast details const { diff --git a/src/pages/AdminBroadcasts.tsx b/src/pages/AdminBroadcasts.tsx index ede052c..f8fd05c 100644 --- a/src/pages/AdminBroadcasts.tsx +++ b/src/pages/AdminBroadcasts.tsx @@ -132,7 +132,7 @@ export default function AdminBroadcasts() { const { capabilities } = usePlatform(); // Use native Telegram back button in Mini App - useBackButton(() => navigate('/admin', { replace: true })); + useBackButton(() => navigate('/admin')); const [page, setPage] = useState(0); const limit = 20; diff --git a/src/pages/AdminCampaignCreate.tsx b/src/pages/AdminCampaignCreate.tsx index b82a133..e5d8566 100644 --- a/src/pages/AdminCampaignCreate.tsx +++ b/src/pages/AdminCampaignCreate.tsx @@ -156,7 +156,7 @@ export default function AdminCampaignCreate() { const navigate = useNavigate(); const queryClient = useQueryClient(); - useBackButton(() => navigate('/admin/campaigns', { replace: true })); + useBackButton(() => navigate('/admin/campaigns')); // Form state const [name, setName] = useState(''); diff --git a/src/pages/AdminCampaignEdit.tsx b/src/pages/AdminCampaignEdit.tsx index 796d05a..6c50895 100644 --- a/src/pages/AdminCampaignEdit.tsx +++ b/src/pages/AdminCampaignEdit.tsx @@ -133,7 +133,7 @@ export default function AdminCampaignEdit() { const campaignId = parseInt(id || '0'); - useBackButton(() => navigate('/admin/campaigns', { replace: true })); + useBackButton(() => navigate('/admin/campaigns')); // Fetch campaign const { diff --git a/src/pages/AdminCampaignStats.tsx b/src/pages/AdminCampaignStats.tsx index 78e64b7..1c7403b 100644 --- a/src/pages/AdminCampaignStats.tsx +++ b/src/pages/AdminCampaignStats.tsx @@ -98,7 +98,7 @@ export default function AdminCampaignStats() { const [copied, setCopied] = useState(false); const [showUsers, setShowUsers] = useState(false); - useBackButton(() => navigate('/admin/campaigns', { replace: true })); + useBackButton(() => navigate('/admin/campaigns')); // Fetch stats const { diff --git a/src/pages/AdminCampaigns.tsx b/src/pages/AdminCampaigns.tsx index 2217d2e..7ed0359 100644 --- a/src/pages/AdminCampaigns.tsx +++ b/src/pages/AdminCampaigns.tsx @@ -68,7 +68,7 @@ export default function AdminCampaigns() { const { capabilities } = usePlatform(); // Use native Telegram back button in Mini App - useBackButton(() => navigate('/admin', { replace: true })); + useBackButton(() => navigate('/admin')); const [deleteConfirm, setDeleteConfirm] = useState(null); diff --git a/src/pages/AdminDashboard.tsx b/src/pages/AdminDashboard.tsx index 9a2490e..6babd35 100644 --- a/src/pages/AdminDashboard.tsx +++ b/src/pages/AdminDashboard.tsx @@ -366,7 +366,7 @@ export default function AdminDashboard() { const { capabilities } = usePlatform(); // Use native Telegram back button in Mini App - useBackButton(() => navigate('/admin', { replace: true })); + useBackButton(() => navigate('/admin')); const [stats, setStats] = useState(null); const [loading, setLoading] = useState(true); diff --git a/src/pages/AdminPaymentMethodEdit.tsx b/src/pages/AdminPaymentMethodEdit.tsx index c4de007..15927c2 100644 --- a/src/pages/AdminPaymentMethodEdit.tsx +++ b/src/pages/AdminPaymentMethodEdit.tsx @@ -73,7 +73,7 @@ export default function AdminPaymentMethodEdit() { const { capabilities } = usePlatform(); // Use native Telegram back button in Mini App - useBackButton(() => navigate('/admin/payment-methods', { replace: true })); + useBackButton(() => navigate('/admin/payment-methods')); // Fetch payment methods const { data: methods, isLoading } = useQuery({ diff --git a/src/pages/AdminPaymentMethods.tsx b/src/pages/AdminPaymentMethods.tsx index ebbf18a..7d10f56 100644 --- a/src/pages/AdminPaymentMethods.tsx +++ b/src/pages/AdminPaymentMethods.tsx @@ -240,7 +240,7 @@ export default function AdminPaymentMethods() { const { capabilities } = usePlatform(); // Use native Telegram back button in Mini App - useBackButton(() => navigate('/admin', { replace: true })); + useBackButton(() => navigate('/admin')); const [methods, setMethods] = useState([]); const [orderChanged, setOrderChanged] = useState(false); diff --git a/src/pages/AdminPayments.tsx b/src/pages/AdminPayments.tsx index 30d0663..c80d6df 100644 --- a/src/pages/AdminPayments.tsx +++ b/src/pages/AdminPayments.tsx @@ -29,7 +29,7 @@ export default function AdminPayments() { const { capabilities } = usePlatform(); // Use native Telegram back button in Mini App - useBackButton(() => navigate('/admin', { replace: true })); + useBackButton(() => navigate('/admin')); const [page, setPage] = useState(1); const [methodFilter, setMethodFilter] = useState(''); diff --git a/src/pages/AdminPromoGroupCreate.tsx b/src/pages/AdminPromoGroupCreate.tsx index a8accb1..436ccdf 100644 --- a/src/pages/AdminPromoGroupCreate.tsx +++ b/src/pages/AdminPromoGroupCreate.tsx @@ -56,7 +56,7 @@ export default function AdminPromoGroupCreate() { const queryClient = useQueryClient(); const isEdit = !!id; - useBackButton(() => navigate('/admin/promo-groups', { replace: true })); + useBackButton(() => navigate('/admin/promo-groups')); // Form state const [name, setName] = useState(''); diff --git a/src/pages/AdminPromoGroups.tsx b/src/pages/AdminPromoGroups.tsx index f259af9..a4aa870 100644 --- a/src/pages/AdminPromoGroups.tsx +++ b/src/pages/AdminPromoGroups.tsx @@ -62,7 +62,7 @@ export default function AdminPromoGroups() { const { capabilities } = usePlatform(); // Use native Telegram back button in Mini App - useBackButton(() => navigate('/admin', { replace: true })); + useBackButton(() => navigate('/admin')); const [deleteConfirm, setDeleteConfirm] = useState(null); diff --git a/src/pages/AdminPromoOfferSend.tsx b/src/pages/AdminPromoOfferSend.tsx index 43cdf99..fb68f0d 100644 --- a/src/pages/AdminPromoOfferSend.tsx +++ b/src/pages/AdminPromoOfferSend.tsx @@ -76,7 +76,7 @@ export default function AdminPromoOfferSend() { const navigate = useNavigate(); const queryClient = useQueryClient(); - useBackButton(() => navigate('/admin/promo-offers', { replace: true })); + useBackButton(() => navigate('/admin/promo-offers')); const [selectedTemplateId, setSelectedTemplateId] = useState(null); const [sendMode, setSendMode] = useState<'segment' | 'user'>('segment'); diff --git a/src/pages/AdminPromoOfferTemplateEdit.tsx b/src/pages/AdminPromoOfferTemplateEdit.tsx index 7e2210b..40f4ff5 100644 --- a/src/pages/AdminPromoOfferTemplateEdit.tsx +++ b/src/pages/AdminPromoOfferTemplateEdit.tsx @@ -22,7 +22,7 @@ export default function AdminPromoOfferTemplateEdit() { const { id } = useParams<{ id: string }>(); const queryClient = useQueryClient(); - useBackButton(() => navigate('/admin/promo-offers', { replace: true })); + useBackButton(() => navigate('/admin/promo-offers')); // Form state const [name, setName] = useState(''); diff --git a/src/pages/AdminPromoOffers.tsx b/src/pages/AdminPromoOffers.tsx index 75e21bf..06eaad7 100644 --- a/src/pages/AdminPromoOffers.tsx +++ b/src/pages/AdminPromoOffers.tsx @@ -109,7 +109,7 @@ export default function AdminPromoOffers() { const { capabilities } = usePlatform(); // Use native Telegram back button in Mini App - useBackButton(() => navigate('/admin', { replace: true })); + useBackButton(() => navigate('/admin')); const [activeTab, setActiveTab] = useState<'templates' | 'logs'>('templates'); diff --git a/src/pages/AdminPromocodeCreate.tsx b/src/pages/AdminPromocodeCreate.tsx index dcaffd0..8c615e2 100644 --- a/src/pages/AdminPromocodeCreate.tsx +++ b/src/pages/AdminPromocodeCreate.tsx @@ -51,7 +51,7 @@ export default function AdminPromocodeCreate() { const isEdit = !!id; // Use native Telegram back button in Mini App - useBackButton(() => navigate('/admin/promocodes', { replace: true })); + useBackButton(() => navigate('/admin/promocodes')); // Form state const [code, setCode] = useState(''); diff --git a/src/pages/AdminPromocodeStats.tsx b/src/pages/AdminPromocodeStats.tsx index 0ead519..f6f7662 100644 --- a/src/pages/AdminPromocodeStats.tsx +++ b/src/pages/AdminPromocodeStats.tsx @@ -89,7 +89,7 @@ export default function AdminPromocodeStats() { const navigate = useNavigate(); const { id } = useParams<{ id: string }>(); - useBackButton(() => navigate('/admin/promocodes', { replace: true })); + useBackButton(() => navigate('/admin/promocodes')); const { data: promocode, diff --git a/src/pages/AdminPromocodes.tsx b/src/pages/AdminPromocodes.tsx index 561cae7..684b2f8 100644 --- a/src/pages/AdminPromocodes.tsx +++ b/src/pages/AdminPromocodes.tsx @@ -114,7 +114,7 @@ export default function AdminPromocodes() { const { capabilities } = usePlatform(); // Use native Telegram back button in Mini App - useBackButton(() => navigate('/admin', { replace: true })); + useBackButton(() => navigate('/admin')); const [deleteConfirm, setDeleteConfirm] = useState(null); const [copiedCode, setCopiedCode] = useState(null); diff --git a/src/pages/AdminRemnawave.tsx b/src/pages/AdminRemnawave.tsx index 8183a6d..c95072e 100644 --- a/src/pages/AdminRemnawave.tsx +++ b/src/pages/AdminRemnawave.tsx @@ -879,7 +879,7 @@ export default function AdminRemnawave() { const { capabilities } = usePlatform(); // Use native Telegram back button in Mini App - useBackButton(() => navigate('/admin', { replace: true })); + useBackButton(() => navigate('/admin')); // State const [activeTab, setActiveTab] = useState('overview'); diff --git a/src/pages/AdminRemnawaveSquadDetail.tsx b/src/pages/AdminRemnawaveSquadDetail.tsx index 89dff09..a4383a6 100644 --- a/src/pages/AdminRemnawaveSquadDetail.tsx +++ b/src/pages/AdminRemnawaveSquadDetail.tsx @@ -55,7 +55,7 @@ export default function AdminRemnawaveSquadDetail() { const { uuid } = useParams<{ uuid: string }>(); const navigate = useNavigate(); - useBackButton(() => navigate('/admin/remnawave', { replace: true })); + useBackButton(() => navigate('/admin/remnawave')); // Fetch all squads and find the one we need const { diff --git a/src/pages/AdminServerEdit.tsx b/src/pages/AdminServerEdit.tsx index 889ce68..2ad4e04 100644 --- a/src/pages/AdminServerEdit.tsx +++ b/src/pages/AdminServerEdit.tsx @@ -49,7 +49,7 @@ export default function AdminServerEdit() { const serverId = parseInt(id || '0'); - useBackButton(() => navigate('/admin/servers', { replace: true })); + useBackButton(() => navigate('/admin/servers')); const { data: server, diff --git a/src/pages/AdminServers.tsx b/src/pages/AdminServers.tsx index b70ae80..941a49f 100644 --- a/src/pages/AdminServers.tsx +++ b/src/pages/AdminServers.tsx @@ -59,7 +59,7 @@ export default function AdminServers() { const { capabilities } = usePlatform(); // Use native Telegram back button in Mini App - useBackButton(() => navigate('/admin', { replace: true })); + useBackButton(() => navigate('/admin')); // Queries const { data: serversData, isLoading } = useQuery({ diff --git a/src/pages/AdminSettings.tsx b/src/pages/AdminSettings.tsx index e9e86c2..8e145ff 100644 --- a/src/pages/AdminSettings.tsx +++ b/src/pages/AdminSettings.tsx @@ -51,7 +51,7 @@ export default function AdminSettings() { const { capabilities } = usePlatform(); // Use native Telegram back button in Mini App - useBackButton(() => navigate('/admin', { replace: true })); + useBackButton(() => navigate('/admin')); // State const [activeSection, setActiveSection] = useState('branding'); diff --git a/src/pages/AdminTariffCreate.tsx b/src/pages/AdminTariffCreate.tsx index c7e2386..af70c84 100644 --- a/src/pages/AdminTariffCreate.tsx +++ b/src/pages/AdminTariffCreate.tsx @@ -92,7 +92,7 @@ export default function AdminTariffCreate() { const queryClient = useQueryClient(); const isEdit = !!id; - useBackButton(() => navigate('/admin/tariffs', { replace: true })); + useBackButton(() => navigate('/admin/tariffs')); // Step: null = type selection, 'period' or 'daily' = form const [tariffType, setTariffType] = useState(null); diff --git a/src/pages/AdminTariffs.tsx b/src/pages/AdminTariffs.tsx index 7180759..55850c6 100644 --- a/src/pages/AdminTariffs.tsx +++ b/src/pages/AdminTariffs.tsx @@ -77,7 +77,7 @@ export default function AdminTariffs() { const { capabilities } = usePlatform(); // Use native Telegram back button in Mini App - useBackButton(() => navigate('/admin', { replace: true })); + useBackButton(() => navigate('/admin')); // Queries const { data: tariffsData, isLoading } = useQuery({ diff --git a/src/pages/AdminTicketSettings.tsx b/src/pages/AdminTicketSettings.tsx index 8fccfaa..72df75e 100644 --- a/src/pages/AdminTicketSettings.tsx +++ b/src/pages/AdminTicketSettings.tsx @@ -22,7 +22,7 @@ export default function AdminTicketSettings() { const navigate = useNavigate(); const queryClient = useQueryClient(); - useBackButton(() => navigate('/admin/tickets', { replace: true })); + useBackButton(() => navigate('/admin/tickets')); const { data: settings, diff --git a/src/pages/AdminTickets.tsx b/src/pages/AdminTickets.tsx index 903e2c6..fc6c7cc 100644 --- a/src/pages/AdminTickets.tsx +++ b/src/pages/AdminTickets.tsx @@ -124,7 +124,7 @@ export default function AdminTickets() { const { capabilities } = usePlatform(); // Use native Telegram back button in Mini App - useBackButton(() => navigate('/admin', { replace: true })); + useBackButton(() => navigate('/admin')); const [selectedTicketId, setSelectedTicketId] = useState(null); const [statusFilter, setStatusFilter] = useState(''); diff --git a/src/pages/AdminUserDetail.tsx b/src/pages/AdminUserDetail.tsx index 69481a9..eb1087b 100644 --- a/src/pages/AdminUserDetail.tsx +++ b/src/pages/AdminUserDetail.tsx @@ -82,7 +82,7 @@ export default function AdminUserDetail() { const navigate = useNavigate(); const { id } = useParams<{ id: string }>(); - useBackButton(() => navigate('/admin/users', { replace: true })); + useBackButton(() => navigate('/admin/users')); const localeMap: Record = { ru: 'ru-RU', en: 'en-US', zh: 'zh-CN', fa: 'fa-IR' }; const locale = localeMap[i18n.language] || 'ru-RU'; diff --git a/src/pages/AdminUsers.tsx b/src/pages/AdminUsers.tsx index 7f7e8fd..4132af4 100644 --- a/src/pages/AdminUsers.tsx +++ b/src/pages/AdminUsers.tsx @@ -399,7 +399,7 @@ export default function AdminUsers() { const { capabilities } = usePlatform(); // Use native Telegram back button in Mini App - useBackButton(() => navigate('/admin', { replace: true })); + useBackButton(() => navigate('/admin')); const [users, setUsers] = useState([]); const [stats, setStats] = useState(null); diff --git a/src/pages/AdminWheel.tsx b/src/pages/AdminWheel.tsx index 7645663..213e7a0 100644 --- a/src/pages/AdminWheel.tsx +++ b/src/pages/AdminWheel.tsx @@ -292,7 +292,7 @@ export default function AdminWheel() { const { capabilities } = usePlatform(); // Use native Telegram back button in Mini App - useBackButton(() => navigate('/admin', { replace: true })); + useBackButton(() => navigate('/admin')); const [activeTab, setActiveTab] = useState('settings'); const [expandedPrizeId, setExpandedPrizeId] = useState(null);