File size: 3,971 Bytes
be02369
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
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;