import React, { useState, useEffect } from 'react'; import { Sun, Moon } from 'lucide-react'; import Timeline from './components/Timeline'; import PhotoDetail from './components/PhotoDetail'; import Admin from './components/Admin'; import MusicPlayer from './components/MusicPlayer'; import { fetchPhotos } from './data/photos'; function App() { const [view, setView] = useState(() => { return window.location.pathname === '/admin' ? 'admin' : 'timeline'; }); const [activePhoto, setActivePhoto] = useState(null); const [photos, setPhotos] = useState([]); useEffect(() => { document.title = import.meta.env.VITE_APP_TITLE || 'Chronicle'; }, []); // Theme State const [theme, setTheme] = useState(() => { return localStorage.getItem('theme_preference') || 'dark'; }); useEffect(() => { document.documentElement.setAttribute('data-theme', theme); localStorage.setItem('theme_preference', theme); }, [theme]); const toggleTheme = () => { setTheme(prev => prev === 'dark' ? 'light' : 'dark'); }; const loadPhotos = async () => { const data = await fetchPhotos(); setPhotos(data); }; useEffect(() => { const fetchAndSet = async () => { const data = await fetchPhotos(); setPhotos(data); }; fetchAndSet(); }, [view]); // Handle browser back/forward useEffect(() => { const handlePopState = () => { setView(window.location.pathname === '/admin' ? 'admin' : 'timeline'); }; window.addEventListener('popstate', handlePopState); return () => window.removeEventListener('popstate', handlePopState); }, []); // Update URL when view changes useEffect(() => { const path = view === 'admin' ? '/admin' : '/'; if (window.location.pathname !== path) { window.history.pushState({}, '', path); } }, [view]); if (view === 'admin') { return setView('timeline')} onUpdate={loadPhotos} />; } return (
{/* Theme Toggle */}
{/* Main Timeline View */}
{/* Footer */}

© {new Date().getFullYear()} {import.meta.env.VITE_APP_TITLE || 'Chronicle'}. All rights reserved.

{/* Detail Overlay */} {activePhoto && ( setActivePhoto(null)} /> )} {/* Music Player */}
); } export default App;