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 [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;
|
||||||
|
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
Reference in New Issue
Block a user