united-tattoo/app/ClientLayout.tsx
Nicholai 1b6462429e
Some checks are pending
Enhanced CI/CD Pipeline / Deploy to Preview (push) Blocked by required conditions
Enhanced CI/CD Pipeline / Deploy to Production (push) Blocked by required conditions
Enhanced CI/CD Pipeline / Code Quality (push) Waiting to run
Enhanced CI/CD Pipeline / Security Scan (push) Waiting to run
Enhanced CI/CD Pipeline / Tests (push) Blocked by required conditions
Enhanced CI/CD Pipeline / Build Application (push) Blocked by required conditions
Enhanced CI/CD Pipeline / Post-Deployment Checks (push) Blocked by required conditions
Enhanced CI/CD Pipeline / Cleanup (push) Blocked by required conditions
feat: add global under-construction banner with session dismissal and booking phone\n\n- New components/construction-banner.tsx with amber warning style, tel link (719-698-9004), sessionStorage-based dismissal\n- Update app/ClientLayout.tsx to render banner, offset content via CSS var, and push fixed nav down
2025-10-20 14:34:55 -06:00

72 lines
2.6 KiB
TypeScript

"use client"
import type React from "react"
import { SessionProvider } from "next-auth/react"
import { QueryClient, QueryClientProvider } from "@tanstack/react-query"
import { ReactQueryDevtools } from "@tanstack/react-query-devtools"
import { Suspense, useState } from "react"
import { FeatureFlagsProvider } from "@/components/feature-flags-provider"
import { LenisProvider } from "@/components/smooth-scroll-provider"
import { Toaster } from "@/components/ui/sonner"
import { ThemeProvider } from "@/components/theme-provider"
import type { FlagsSnapshot } from "@/lib/flags"
import "./globals.css"
import ConstructionBanner from "@/components/construction-banner"
export default function ClientLayout({
children,
initialFlags,
}: Readonly<{
children: React.ReactNode
initialFlags: FlagsSnapshot
}>) {
// Create a new QueryClient instance for each component tree
const [queryClient] = useState(
() =>
new QueryClient({
defaultOptions: {
queries: {
// With SSR, we usually want to set some default staleTime
// above 0 to avoid refetching immediately on the client
staleTime: 60 * 1000, // 1 minute
retry: (failureCount, error: unknown) => {
// Don't retry on 4xx errors
if (typeof error === "object" && error !== null && "status" in error) {
const status = (error as { status?: number }).status
if (typeof status === "number" && status >= 400 && status < 500) {
return false
}
}
return failureCount < 3
},
},
},
})
)
return (
<SessionProvider>
<QueryClientProvider client={queryClient}>
<FeatureFlagsProvider value={initialFlags}>
<ThemeProvider attribute="class" defaultTheme="dark" enableSystem={false}>
<Suspense fallback={<div>Loading...</div>}>
<LenisProvider>
{/* Global construction banner */}
<ConstructionBanner />
{/* Push fixed nav down when banner visible */}
<style>{`html.has-site-banner nav.fixed{top:var(--site-banner-height,0)!important}`}</style>
{/* Offset page content by banner height */}
<div style={{ paddingTop: "var(--site-banner-height, 0px)" }}>{children}</div>
<Toaster />
</LenisProvider>
</Suspense>
</ThemeProvider>
</FeatureFlagsProvider>
<ReactQueryDevtools initialIsOpen={false} />
</QueryClientProvider>
</SessionProvider>
)
}