File size: 2,527 Bytes
0bfe2e3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
'use client';

import { useStatus } from '@/context/status';
import { StatusProvider } from '@/context/status';
import { Toaster } from '@/components/ui/toaster';
import {
  AppLayout,
  AppLayoutContent,
  AppLayoutSidebar,
  AppSidebarProvider,
} from '@/components/ui/app-layout';
import { MainSidebar } from './main-sidebar';
import { LoadingOverlayWithLogo } from '@/components/shared/loading-overlay';
import { MenuProvider } from '@/context/menu';
import { MenuContent } from '../components/menu-content';
import { ThemeProvider } from 'next-themes';
import { LoadingOverlay } from '@/components/ui/loading-spinner';
import Image from 'next/image';
import { TopNavbar } from './top-navbar';
import { Button } from '@/components/ui/button';
import { UserDataProvider } from '@/context/userData';
import { LuffyError } from '@/components/shared/luffy-error';
import { TextGenerateEffect } from '@/components/shared/text-generate-effect';
import { OptionsProvider } from '@/context/options';

function ErrorOverlay({ error }: { error: string | null }) {
  return (
    <LoadingOverlay showSpinner={false}>
      <LuffyError title="Something went wrong!" showRefreshButton>
        <p>{error}</p>
      </LuffyError>
    </LoadingOverlay>
  );
}

function AppContent() {
  const { status, loading, error } = useStatus();

  if (loading) {
    return (
      <LoadingOverlay showSpinner>
        <TextGenerateEffect words="Launching..." className="text-2xl" />
      </LoadingOverlay>
    );
  }

  if (error || !status) {
    return <ErrorOverlay error={error} />;
  }

  return (
    <MenuProvider>
      <AppSidebarProvider>
        <AppLayout withSidebar sidebarSize="slim">
          <AppLayoutSidebar>
            <MainSidebar />
          </AppLayoutSidebar>
          <AppLayout>
            <AppLayoutContent>
              <div data-main-layout-container className="h-auto">
                <TopNavbar />
                <div data-main-layout-content>
                  <MenuContent />
                </div>
              </div>
            </AppLayoutContent>
          </AppLayout>
        </AppLayout>
      </AppSidebarProvider>
      <Toaster />
    </MenuProvider>
  );
}

export default function Home() {
  return (
    <ThemeProvider attribute="class" defaultTheme="dark" forcedTheme="dark">
      <StatusProvider>
        <UserDataProvider>
          <OptionsProvider>
            <AppContent />
          </OptionsProvider>
        </UserDataProvider>
      </StatusProvider>
    </ThemeProvider>
  );
}