124 lines
4.2 KiB
TypeScript
124 lines
4.2 KiB
TypeScript
import AlphaFooter from '@/components/alpha/AlphaFooter';
|
|
import { AlphaNav } from '@/components/alpha/AlphaNav';
|
|
import DevToolbar from '@/components/dev/DevToolbar';
|
|
import { ApiErrorBoundary } from '@/components/errors/ApiErrorBoundary';
|
|
import { NotificationIntegration } from '@/components/errors/NotificationIntegration';
|
|
import NotificationProvider from '@/components/notifications/NotificationProvider';
|
|
import { AuthProvider } from '@/lib/auth/AuthContext';
|
|
import { getAppMode } from '@/lib/mode';
|
|
import { ServiceProvider } from '@/lib/services/ServiceProvider';
|
|
import { Metadata, Viewport } from 'next';
|
|
import Image from 'next/image';
|
|
import Link from 'next/link';
|
|
import React from 'react';
|
|
import './globals.css';
|
|
|
|
export const dynamic = 'force-dynamic';
|
|
|
|
export const viewport: Viewport = {
|
|
width: 'device-width',
|
|
initialScale: 1,
|
|
maximumScale: 1,
|
|
userScalable: false,
|
|
viewportFit: 'cover',
|
|
};
|
|
|
|
export const metadata: Metadata = {
|
|
title: 'GridPilot - SimRacing Platform',
|
|
description: 'The dedicated home for serious sim racing leagues. Automatic results, standings, team racing, and professional race control.',
|
|
themeColor: '#0a0a0a',
|
|
appleWebApp: {
|
|
capable: true,
|
|
statusBarStyle: 'black-translucent',
|
|
},
|
|
openGraph: {
|
|
title: 'GridPilot - iRacing League Racing Platform',
|
|
description: 'Structure over chaos. The professional platform for iRacing league racing.',
|
|
type: 'website',
|
|
},
|
|
twitter: {
|
|
card: 'summary_large_image',
|
|
title: 'GridPilot - iRacing League Racing Platform',
|
|
description: 'Structure over chaos. The professional platform for iRacing league racing.',
|
|
},
|
|
icons: {
|
|
icon: '/favicon.svg',
|
|
},
|
|
};
|
|
|
|
export default async function RootLayout({
|
|
children,
|
|
}: {
|
|
children: React.ReactNode;
|
|
}) {
|
|
const mode = getAppMode();
|
|
|
|
if (mode === 'alpha') {
|
|
//const session = await authService.getCurrentSession();
|
|
const session = null;
|
|
|
|
return (
|
|
<html lang="en" className="scroll-smooth overflow-x-hidden">
|
|
<head>
|
|
<meta name="mobile-web-app-capable" content="yes" />
|
|
</head>
|
|
<body className="antialiased overflow-x-hidden min-h-screen bg-deep-graphite flex flex-col">
|
|
<ServiceProvider>
|
|
<AuthProvider initialSession={session}>
|
|
<NotificationProvider>
|
|
<NotificationIntegration />
|
|
<ApiErrorBoundary>
|
|
<AlphaNav />
|
|
<main className="flex-1 max-w-7xl mx-auto px-6 py-8 w-full">
|
|
{children}
|
|
</main>
|
|
<AlphaFooter />
|
|
<DevToolbar />
|
|
</ApiErrorBoundary>
|
|
</NotificationProvider>
|
|
</AuthProvider>
|
|
</ServiceProvider>
|
|
</body>
|
|
</html>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<html lang="en" className="scroll-smooth overflow-x-hidden">
|
|
<head>
|
|
<meta name="mobile-web-app-capable" content="yes" />
|
|
</head>
|
|
<body className="antialiased overflow-x-hidden">
|
|
<NotificationProvider>
|
|
<NotificationIntegration />
|
|
<ApiErrorBoundary>
|
|
<header className="fixed top-0 left-0 right-0 z-50 bg-deep-graphite/80 backdrop-blur-sm border-b border-white/5">
|
|
<div className="max-w-7xl mx-auto px-6 py-4">
|
|
<div className="flex items-center justify-between">
|
|
<div className="flex items-center space-x-3">
|
|
<Link href="/" className="inline-flex items-center">
|
|
<Image
|
|
src="/images/logos/wordmark-rectangle-dark.svg"
|
|
alt="GridPilot"
|
|
width={160}
|
|
height={30}
|
|
className="h-6 w-auto md:h-8"
|
|
priority
|
|
/>
|
|
</Link>
|
|
<p className="hidden sm:block text-sm text-gray-400 font-light">
|
|
Making league racing less chaotic
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</header>
|
|
<div className="pt-16">
|
|
{children}
|
|
</div>
|
|
</ApiErrorBoundary>
|
|
</NotificationProvider>
|
|
</body>
|
|
</html>
|
|
);
|
|
} |