2025-09-09 14:37:32 +05:30
|
|
|
import "./globals.css";
|
|
|
|
|
|
|
|
|
|
import type { Metadata } from "next";
|
|
|
|
|
import { Geist, Geist_Mono } from "next/font/google";
|
|
|
|
|
import { Suspense } from "react";
|
|
|
|
|
|
2025-11-04 18:12:57 +05:30
|
|
|
import ChatwootWidget from "@/components/ChatwootWidget";
|
2025-11-29 15:39:57 +05:30
|
|
|
import AppLayout from "@/components/layout/AppLayout";
|
2025-09-09 14:37:32 +05:30
|
|
|
import PostHogIdentify from "@/components/PostHogIdentify";
|
|
|
|
|
import SpinLoader from "@/components/SpinLoader";
|
|
|
|
|
import { Toaster } from "@/components/ui/sonner";
|
2026-01-23 18:53:59 +05:30
|
|
|
import { AppConfigProvider } from "@/context/AppConfigContext";
|
2025-09-15 14:08:51 +05:30
|
|
|
import { OnboardingProvider } from "@/context/OnboardingContext";
|
2025-09-09 14:37:32 +05:30
|
|
|
import { UserConfigProvider } from "@/context/UserConfigContext";
|
|
|
|
|
import { AuthProvider } from "@/lib/auth";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const geistSans = Geist({
|
|
|
|
|
variable: "--font-geist-sans",
|
|
|
|
|
subsets: ["latin"],
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const geistMono = Geist_Mono({
|
|
|
|
|
variable: "--font-geist-mono",
|
|
|
|
|
subsets: ["latin"],
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
export const metadata: Metadata = {
|
|
|
|
|
title: "Dograh",
|
|
|
|
|
description: "Open Source Voice Assistant Workflow Builder",
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export default function RootLayout({
|
|
|
|
|
children
|
|
|
|
|
}: {
|
|
|
|
|
children: React.ReactNode
|
|
|
|
|
}) {
|
|
|
|
|
|
|
|
|
|
return (
|
2025-11-29 15:39:57 +05:30
|
|
|
<html lang="en" suppressHydrationWarning>
|
|
|
|
|
<head>
|
|
|
|
|
{/* Inline script to prevent flash of light theme - runs before React hydrates */}
|
|
|
|
|
<script
|
|
|
|
|
dangerouslySetInnerHTML={{
|
|
|
|
|
__html: `
|
|
|
|
|
(function() {
|
|
|
|
|
try {
|
|
|
|
|
var theme = localStorage.getItem('theme');
|
|
|
|
|
if (theme === 'dark' || (!theme && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
|
|
|
|
|
document.documentElement.classList.add('dark');
|
|
|
|
|
} else {
|
|
|
|
|
document.documentElement.classList.remove('dark');
|
|
|
|
|
}
|
|
|
|
|
} catch (e) {}
|
|
|
|
|
})();
|
|
|
|
|
`,
|
|
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
</head>
|
2025-09-09 14:37:32 +05:30
|
|
|
<body
|
|
|
|
|
className={`${geistSans.variable} ${geistMono.variable} antialiased`}>
|
|
|
|
|
<AuthProvider>
|
2026-01-23 18:53:59 +05:30
|
|
|
<AppConfigProvider>
|
|
|
|
|
<Suspense fallback={<SpinLoader />}>
|
|
|
|
|
<UserConfigProvider>
|
|
|
|
|
<OnboardingProvider>
|
|
|
|
|
<PostHogIdentify />
|
|
|
|
|
<AppLayout>
|
|
|
|
|
{children}
|
|
|
|
|
</AppLayout>
|
|
|
|
|
<Toaster />
|
|
|
|
|
<ChatwootWidget />
|
|
|
|
|
</OnboardingProvider>
|
|
|
|
|
</UserConfigProvider>
|
|
|
|
|
</Suspense>
|
|
|
|
|
</AppConfigProvider>
|
2025-09-09 14:37:32 +05:30
|
|
|
</AuthProvider>
|
|
|
|
|
</body>
|
|
|
|
|
</html>
|
|
|
|
|
);
|
|
|
|
|
}
|