diff --git a/src/components/auth/SessionTimeoutModal.tsx b/src/components/auth/SessionTimeoutModal.tsx index c41f212..1bc51f5 100644 --- a/src/components/auth/SessionTimeoutModal.tsx +++ b/src/components/auth/SessionTimeoutModal.tsx @@ -1,5 +1,4 @@ import { useEffect, useState, useCallback, useRef } from 'react'; -import { useNavigate } from 'react-router-dom'; import { Dialog, DialogContent, @@ -15,18 +14,22 @@ const AUTO_REDIRECT_SECONDS = 5; export default function SessionTimeoutModal() { const [open, setOpen] = useState(false); const [secondsLeft, setSecondsLeft] = useState(AUTO_REDIRECT_SECONDS); - const navigate = useNavigate(); const timerRef = useRef>(); + const wasOpenRef = useRef(false); const redirectToLogin = useCallback(() => { tokenManager.clearToken(); - navigate('/login', { replace: true }); - }, [navigate]); + window.location.href = '/login'; + }, []); useEffect(() => { const onSessionExpired = () => { setOpen(true); - setSecondsLeft(AUTO_REDIRECT_SECONDS); + // Only reset the countdown when the modal transitions from closed → open + if (!wasOpenRef.current) { + setSecondsLeft(AUTO_REDIRECT_SECONDS); + } + wasOpenRef.current = true; }; window.addEventListener('session:expired', onSessionExpired); return () => window.removeEventListener('session:expired', onSessionExpired); diff --git a/src/components/navigation/AppSidebar.tsx b/src/components/navigation/AppSidebar.tsx index da09be8..b754af6 100644 --- a/src/components/navigation/AppSidebar.tsx +++ b/src/components/navigation/AppSidebar.tsx @@ -47,13 +47,14 @@ const userNavItems = [ { title: "Activity", url: "/activity", icon: Activity }, { title: "CLI Guide", url: "/cli-guide", icon: BookOpen }, { title: "ZeroTier Devices", url: "/org/zerotier/devices", icon: Monitor }, + { title: "My Memberships", url: "/org/my-memberships", icon: Layers }, + ]; // Visible to ALL org members const orgMemberNavItems = [ { title: "Overview", url: "/org", icon: Building2 }, - { title: "My Memberships", url: "/org/my-memberships", icon: Layers }, ]; // Visible to org admins/owners only (management)