import { useState } from 'react' import { useQueryClient } from '@tanstack/react-query' import { Timeline } from './components/timeline/Timeline' import { LeftSidebar } from './components/layout/LeftSidebar' import { RightSidebar } from './components/layout/RightSidebar' import { TopBar } from './components/layout/TopBar' import { ScanProgress } from './components/ScanProgress' import { ToastContainer } from './components/ToastContainer' import { KeyboardShortcuts } from './components/KeyboardShortcuts' import { KeyboardHints } from './components/KeyboardHints' import { LoupeView } from './components/loupe/LoupeView' import { usePhotoStore } from './store/photoStore' import { useKeyboardShortcuts } from './hooks/useKeyboardShortcuts' import type { Photo } from './types/photo' function App() { const [leftSidebarOpen, setLeftSidebarOpen] = useState(true) const [rightSidebarOpen, setRightSidebarOpen] = useState(false) const selectedPhotos = usePhotoStore((state) => state.selectedPhotos) const viewMode = usePhotoStore((state) => state.viewMode) const queryClient = useQueryClient() // Set up global keyboard shortcuts useKeyboardShortcuts({ onToggleLeftSidebar: () => setLeftSidebarOpen(!leftSidebarOpen), onToggleRightSidebar: () => setRightSidebarOpen(!rightSidebarOpen), getFirstPhotoId: () => { const photos = queryClient.getQueryData(['photos']) return photos && photos.length > 0 ? photos[0].id : null }, }) // Auto-show right sidebar when photos are selected — but only in grid mode, // so leaving loupe doesn't fight the user's prior sidebar state. if (viewMode === 'grid') { if (selectedPhotos.length > 0 && !rightSidebarOpen) { setRightSidebarOpen(true) } else if (selectedPhotos.length === 0 && rightSidebarOpen) { setRightSidebarOpen(false) } } const showRightSidebar = rightSidebarOpen && viewMode === 'grid' return (
{/* Left Sidebar */}
{/* Main Content - Timeline */}
{/* Right Sidebar */}
{/* Contextual Keyboard Hints */} {/* Keyboard Shortcuts Legend */} {/* Scan Progress Indicator */} {/* Toast Notifications */} {/* Loupe overlay — covers TopBar when active */} {viewMode === 'loupe' && }
) } export default App