fix: use declarative Navigate instead of navigate() in render + fix useEffect deps

Subscriptions.tsx: navigate() in render → <Navigate> component (React safe).
Subscription.tsx: same fix for multi-tariff redirect.
AdminUserDetail.tsx: useRef guard for one-time auto-select instead of
activeSubscriptionId in dependency array (prevented manual selection).
This commit is contained in:
c0mrade
2026-03-25 18:11:30 +03:00
parent 29003a6cbe
commit 98e9cfadc6
3 changed files with 9 additions and 9 deletions

View File

@@ -336,6 +336,7 @@ export default function AdminUserDetail() {
const [subDays, setSubDays] = useState<number | ''>(30); const [subDays, setSubDays] = useState<number | ''>(30);
const [selectedTariffId, setSelectedTariffId] = useState<number | null>(null); const [selectedTariffId, setSelectedTariffId] = useState<number | null>(null);
const [activeSubscriptionId, setActiveSubscriptionId] = useState<number | null>(null); const [activeSubscriptionId, setActiveSubscriptionId] = useState<number | null>(null);
const hasAutoSelectedSub = useRef(false);
const [subscriptionDetailView, setSubscriptionDetailView] = useState(false); const [subscriptionDetailView, setSubscriptionDetailView] = useState(false);
// Promo group // Promo group
@@ -782,13 +783,14 @@ export default function AdminUserDetail() {
const selectedSub = const selectedSub =
userSubscriptions.find((s) => s.id === activeSubscriptionId) ?? user?.subscription ?? null; userSubscriptions.find((s) => s.id === activeSubscriptionId) ?? user?.subscription ?? null;
// Auto-select first subscription when user loads // Auto-select first subscription when user loads (one-time init)
useEffect(() => { useEffect(() => {
if (user && userSubscriptions.length > 0 && !activeSubscriptionId) { if (user && userSubscriptions.length > 0 && !hasAutoSelectedSub.current) {
const activeSub = userSubscriptions.find((s) => s.is_active) ?? userSubscriptions[0]; const activeSub = userSubscriptions.find((s) => s.is_active) ?? userSubscriptions[0];
setActiveSubscriptionId(activeSub.id); setActiveSubscriptionId(activeSub.id);
hasAutoSelectedSub.current = true;
} }
}, [user, userSubscriptions, activeSubscriptionId]); }, [user, userSubscriptions]);
const currentTariff = tariffs.find((t) => t.id === selectedSub?.tariff_id) || null; const currentTariff = tariffs.find((t) => t.id === selectedSub?.tariff_id) || null;

View File

@@ -1,7 +1,7 @@
import { useState, useEffect, useRef, useCallback, memo } from 'react'; import { useState, useEffect, useRef, useCallback, memo } from 'react';
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { useNavigate, useParams } from 'react-router'; import { Navigate, useNavigate, useParams } from 'react-router';
import { subscriptionApi } from '../api/subscription'; import { subscriptionApi } from '../api/subscription';
import { WebBackButton } from '../components/WebBackButton'; import { WebBackButton } from '../components/WebBackButton';
import { useDestructiveConfirm } from '../platform/hooks/useNativeDialog'; import { useDestructiveConfirm } from '../platform/hooks/useNativeDialog';
@@ -456,8 +456,7 @@ export default function Subscription() {
// In multi-tariff mode without a specific subscription ID, redirect to list // In multi-tariff mode without a specific subscription ID, redirect to list
if (isMultiTariff && !subscriptionId && !isLoading) { if (isMultiTariff && !subscriptionId && !isLoading) {
navigate('/subscriptions', { replace: true }); return <Navigate to="/subscriptions" replace />;
return null;
} }
if (isLoading) { if (isLoading) {

View File

@@ -1,5 +1,5 @@
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { useNavigate } from 'react-router'; import { Navigate, useNavigate } from 'react-router';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { subscriptionApi } from '../api/subscription'; import { subscriptionApi } from '../api/subscription';
import { useTheme } from '../hooks/useTheme'; import { useTheme } from '../hooks/useTheme';
@@ -68,8 +68,7 @@ export default function Subscriptions() {
// Single-tariff mode with one subscription: skip list, go directly to detail // Single-tariff mode with one subscription: skip list, go directly to detail
if (data && !isMultiTariff && subscriptions.length === 1) { if (data && !isMultiTariff && subscriptions.length === 1) {
navigate(`/subscriptions/${subscriptions[0].id}`, { replace: true }); return <Navigate to={`/subscriptions/${subscriptions[0].id}`} replace />;
return null;
} }
return ( return (