import Header from "@/components/header";
import SidebarComponent from "@/components/sidebar";
import { TooltipProvider } from "@/components/ui/tooltip";
import {
FullscreenProvider,
useFullscreen,
} from "@/contexts/fullscreen-context";
import {
createRootRoute,
Outlet,
useRouterState,
} from "@tanstack/react-router";
import { Loader } from "lucide-react";
import { Component, type ReactNode, useEffect, useState } from "react";
import { SidebarInset, SidebarProvider } from "../components/ui/sidebar";
import { getStoredPreference, syncThemeClass } from "../hooks/use-color-scheme";
import i18next from "../lib/i18n";
/** Routes that should render without sidebar/header chrome. */
const POPOUT_PREFIXES = ["/chat-popout/", "/embed/"];
/** Routes that own their own chrome via a layout route
* (see routes/dashboard/route.tsx). The root only needs to know about
* these to decide whether to wrap with ChromeLayout or render the
* Outlet bare. The dashboard's provider tree is mounted by the layout
* route itself, not by this check, so a stale read here is just a
* visual flash; not a render race. */
const DASHBOARD_PREFIX = "/dashboard";
export const Route = createRootRoute({
component: RootLayout,
pendingComponent: RouteLoadingSkeleton,
});
interface ErrorBoundaryState {
error: Error | null;
}
class ErrorBoundary extends Component<
{ children: ReactNode },
ErrorBoundaryState
> {
state: ErrorBoundaryState = { error: null };
static getDerivedStateFromError(error: Error) {
return { error };
}
componentDidCatch(error: Error, info: React.ErrorInfo) {
console.error("Unhandled render error:", error, info);
}
render() {
if (this.state.error) {
return (