Yuki / App.tsx
Severian's picture
Upload 43 files
be02369 verified
import React, { useState, useContext, useEffect } from 'react';
import { AuthProvider, AuthContext } from './context/AuthContext';
import Sidebar from './components/Sidebar';
import AiStewardView from './views/AiStewardView';
import PestLibraryView from './views/PestLibraryView';
import SeasonalGuideView from './views/SeasonalGuideView';
import ToolGuideView from './views/ToolGuideView';
import BonsaiDiaryView from './views/BonsaiDiaryView';
import HealthCheckView from './views/HealthCheckView';
import SpeciesIdentifierView from './views/SpeciesIdentifierView';
import DesignStudioView from './views/DesignStudioView';
import WiringGuideView from './views/WiringGuideView';
import SoilAnalyzerView from './views/SoilAnalyzerView';
import NebariDeveloperView from './views/NebariDeveloperView';
import PotCalculatorView from './views/PotCalculatorView';
import SunTrackerView from './views/SunTrackerView';
import FertilizerMixerView from './views/FertilizerMixerView';
import SoilVolumeCalculatorView from './views/SoilVolumeCalculatorView';
import WeatherShieldView from './views/WeatherShieldView';
import SettingsView from './views/SettingsView';
import LoginView from './views/LoginView';
import { View } from './types';
import Spinner from './components/Spinner';
const AppContent: React.FC = () => {
const { user, isLoading } = useContext(AuthContext);
const [activeView, setActiveView] = useState<View>('garden');
const [isSidebarCollapsed, setIsSidebarCollapsed] = useState(false);
useEffect(() => {
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('/service-worker.js').then(registration => {
console.log('ServiceWorker registration successful with scope: ', registration.scope);
}).catch(error => {
console.log('ServiceWorker registration failed: ', error);
});
});
}
}, []);
const renderView = () => {
switch (activeView) {
case 'steward': return <AiStewardView setActiveView={setActiveView} />;
case 'pests': return <PestLibraryView setActiveView={setActiveView} />;
case 'seasons': return <SeasonalGuideView setActiveView={setActiveView} />;
case 'tools': return <ToolGuideView />;
case 'garden': return <BonsaiDiaryView setActiveView={setActiveView} />;
case 'healthCheck': return <HealthCheckView setActiveView={setActiveView} />;
case 'speciesIdentifier': return <SpeciesIdentifierView setActiveView={setActiveView} />;
case 'designStudio': return <DesignStudioView setActiveView={setActiveView} />;
case 'wiringGuide': return <WiringGuideView setActiveView={setActiveView} />;
case 'soilAnalyzer': return <SoilAnalyzerView setActiveView={setActiveView} />;
case 'nebariDeveloper': return <NebariDeveloperView setActiveView={setActiveView} />;
case 'potCalculator': return <PotCalculatorView />;
case 'sunTracker': return <SunTrackerView />;
case 'fertilizerMixer': return <FertilizerMixerView />;
case 'soilVolumeCalculator': return <SoilVolumeCalculatorView />;
case 'weatherShield': return <WeatherShieldView />;
case 'settings': return <SettingsView />;
default: return <BonsaiDiaryView setActiveView={setActiveView} />;
}
};
if (isLoading) {
return <div className="flex items-center justify-center h-screen bg-stone-100"><Spinner text="Loading Yuki..." /></div>;
}
if (!user) {
return <LoginView />;
}
return (
<div className="flex h-screen bg-stone-100">
<Sidebar
activeView={activeView}
setActiveView={setActiveView}
isCollapsed={isSidebarCollapsed}
setIsCollapsed={setIsSidebarCollapsed}
/>
<main className="flex-1 p-8 overflow-y-auto">
{renderView()}
</main>
</div>
);
};
const AppWrapper = () => (
<AuthProvider>
<AppContent />
</AuthProvider>
);
export default AppWrapper;