import React, { useEffect, useState } from 'react'; import { Outlet, Link, useLocation } from 'react-router-dom'; import { useAuth } from '../../contexts/AuthContext'; import { useTheme } from '../../contexts/ThemeContext'; import { departmentsAPI } from '../../services/api'; import type { Department } from '../../types'; const Layout: React.FC = () => { const { user, logout } = useAuth(); const { theme, toggleTheme } = useTheme(); const location = useLocation(); const [hasSnippetAccess, setHasSnippetAccess] = useState(false); const [userMenuOpen, setUserMenuOpen] = useState(false); const getInitials = () => { if (!user) return '?'; if (user.full_name) { const parts = user.full_name.trim().split(' '); if (parts.length >= 2) { return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase(); } return parts[0][0].toUpperCase(); } return user.username.charAt(0).toUpperCase(); }; // Close menu when clicking outside useEffect(() => { const handleClickOutside = (event: MouseEvent) => { const target = event.target as HTMLElement; if (userMenuOpen && !target.closest('.user-menu-container')) { setUserMenuOpen(false); } }; document.addEventListener('mousedown', handleClickOutside); return () => document.removeEventListener('mousedown', handleClickOutside); }, [userMenuOpen]); useEffect(() => { let isMounted = true; const determineSnippetAccess = async () => { if (!user) { if (isMounted) { setHasSnippetAccess(false); } return; } if (user.is_admin) { if (isMounted) { setHasSnippetAccess(true); } return; } try { const departments: Department[] = await departmentsAPI.getMy(); if (!isMounted) { return; } const enabled = departments.some((dept) => dept.snippets_enabled); setHasSnippetAccess(enabled); } catch (error) { console.error('Failed to determine snippet permissions:', error); if (isMounted) { setHasSnippetAccess(false); } } }; determineSnippetAccess(); return () => { isMounted = false; }; }, [user?.id, user?.is_admin]); return (