brunner56's picture
implement app
0bfe2e3
'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>
);
}