import { useState, useEffect } from 'react' import { Sidebar } from './Sidebar' import { TopNavbar } from './TopNavbar' import { DashboardHome } from './DashboardHome' import { UserManagement } from './UserManagement' import { ExperimentManagement } from './ExperimentManagement' import { DataEntry } from './DataEntry' import { VisionSystem } from './VisionSystem' import { Scheduling } from './Scheduling' import { VideoStreamingPage } from '../features/video-streaming' import { UserProfile } from './UserProfile' import { userManagement, type User } from '../lib/supabase' interface DashboardLayoutProps { onLogout: () => void currentRoute: string } export function DashboardLayout({ onLogout, currentRoute }: DashboardLayoutProps) { const [user, setUser] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [currentView, setCurrentView] = useState('dashboard') const [isExpanded, setIsExpanded] = useState(true) const [isMobileOpen, setIsMobileOpen] = useState(false) const [isHovered, setIsHovered] = useState(false) // Valid dashboard views const validViews = ['dashboard', 'user-management', 'experiments', 'analytics', 'data-entry', 'vision-system', 'scheduling', 'video-library', 'profile'] // Save current view to localStorage const saveCurrentView = (view: string) => { try { localStorage.setItem('dashboard-current-view', view) } catch (error) { console.warn('Failed to save current view to localStorage:', error) } } // Get saved view from localStorage const getSavedView = (): string => { try { const savedView = localStorage.getItem('dashboard-current-view') return savedView && validViews.includes(savedView) ? savedView : 'dashboard' } catch (error) { console.warn('Failed to get saved view from localStorage:', error) return 'dashboard' } } // Check if user has access to a specific view const hasAccessToView = (view: string): boolean => { if (!user) return false // Admin-only views if (view === 'user-management') { return user.roles.includes('admin') } // All other views are accessible to authenticated users return true } // Handle view change with persistence and URL updates const handleViewChange = (view: string) => { if (validViews.includes(view) && hasAccessToView(view)) { setCurrentView(view) saveCurrentView(view) // Update URL const newPath = view === 'dashboard' ? '/' : `/${view}` window.history.pushState({}, '', newPath) } } useEffect(() => { fetchUserProfile() }, []) // Restore saved view when user is loaded useEffect(() => { if (user) { const savedView = getSavedView() if (hasAccessToView(savedView)) { setCurrentView(savedView) } else { // If user doesn't have access to saved view, default to dashboard setCurrentView('dashboard') saveCurrentView('dashboard') } } }, [user]) // Handle route changes for scheduling sub-routes useEffect(() => { if (currentRoute.startsWith('/scheduling')) { setCurrentView('scheduling') } else if (currentRoute === '/') { // Handle root route - use saved view or default to dashboard if (user) { const savedView = getSavedView() if (hasAccessToView(savedView)) { setCurrentView(savedView) } else { setCurrentView('dashboard') } } } else { // Handle other routes by extracting the view name const routeView = currentRoute.substring(1) // Remove leading slash if (validViews.includes(routeView) && hasAccessToView(routeView)) { setCurrentView(routeView) } } }, [currentRoute, user]) const fetchUserProfile = async () => { try { setLoading(true) setError(null) const currentUser = await userManagement.getCurrentUser() if (currentUser) { setUser(currentUser) } else { setError('No authenticated user found') } } catch (err) { setError('Failed to fetch user profile') console.error('Profile fetch error:', err) } finally { setLoading(false) } } const handleLogout = async () => { // Call the logout function passed from parent onLogout() } const toggleSidebar = () => { setIsExpanded(!isExpanded) } const toggleMobileSidebar = () => { setIsMobileOpen(!isMobileOpen) } const handleToggleSidebar = () => { if (window.innerWidth >= 1024) { toggleSidebar() } else { toggleMobileSidebar() } } const renderCurrentView = () => { if (!user) return null switch (currentView) { case 'dashboard': return case 'user-management': if (user.roles.includes('admin')) { return } else { return (
Access denied. You need admin privileges to access user management.
) } case 'experiments': return case 'analytics': return (

Analytics

Analytics module coming soon...
) case 'data-entry': return case 'vision-system': return case 'scheduling': return case 'video-library': return case 'profile': return default: return } } if (loading) { return (

Loading dashboard...

) } if (error) { return (
{error}
) } if (!user) { return (
No user data available
) } return (
{/* Backdrop for mobile */} {isMobileOpen && (
setIsMobileOpen(false)} /> )}
handleViewChange('profile')} />
{renderCurrentView()}
) }