mirror of
https://github.com/chillpadclub/bedolaga-cabinet.git
synced 2026-07-28 17:43:47 +00:00
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:
@@ -336,6 +336,7 @@ export default function AdminUserDetail() {
|
||||
const [subDays, setSubDays] = useState<number | ''>(30);
|
||||
const [selectedTariffId, setSelectedTariffId] = useState<number | null>(null);
|
||||
const [activeSubscriptionId, setActiveSubscriptionId] = useState<number | null>(null);
|
||||
const hasAutoSelectedSub = useRef(false);
|
||||
const [subscriptionDetailView, setSubscriptionDetailView] = useState(false);
|
||||
|
||||
// Promo group
|
||||
@@ -782,13 +783,14 @@ export default function AdminUserDetail() {
|
||||
const selectedSub =
|
||||
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(() => {
|
||||
if (user && userSubscriptions.length > 0 && !activeSubscriptionId) {
|
||||
if (user && userSubscriptions.length > 0 && !hasAutoSelectedSub.current) {
|
||||
const activeSub = userSubscriptions.find((s) => s.is_active) ?? userSubscriptions[0];
|
||||
setActiveSubscriptionId(activeSub.id);
|
||||
hasAutoSelectedSub.current = true;
|
||||
}
|
||||
}, [user, userSubscriptions, activeSubscriptionId]);
|
||||
}, [user, userSubscriptions]);
|
||||
|
||||
const currentTariff = tariffs.find((t) => t.id === selectedSub?.tariff_id) || null;
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { useState, useEffect, useRef, useCallback, memo } from 'react';
|
||||
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { useNavigate, useParams } from 'react-router';
|
||||
import { Navigate, useNavigate, useParams } from 'react-router';
|
||||
import { subscriptionApi } from '../api/subscription';
|
||||
import { WebBackButton } from '../components/WebBackButton';
|
||||
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
|
||||
if (isMultiTariff && !subscriptionId && !isLoading) {
|
||||
navigate('/subscriptions', { replace: true });
|
||||
return null;
|
||||
return <Navigate to="/subscriptions" replace />;
|
||||
}
|
||||
|
||||
if (isLoading) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { useQuery } from '@tanstack/react-query';
|
||||
import { useNavigate } from 'react-router';
|
||||
import { Navigate, useNavigate } from 'react-router';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { subscriptionApi } from '../api/subscription';
|
||||
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
|
||||
if (data && !isMultiTariff && subscriptions.length === 1) {
|
||||
navigate(`/subscriptions/${subscriptions[0].id}`, { replace: true });
|
||||
return null;
|
||||
return <Navigate to={`/subscriptions/${subscriptions[0].id}`} replace />;
|
||||
}
|
||||
|
||||
return (
|
||||
|
||||
Reference in New Issue
Block a user