1- 'use client'
2- import { useEffect , useState } from 'react'
3- import { Inter } from "next/font/google"
4- import "./globals.css"
5- import { TinybirdProvider } from '@/providers/TinybirdProvider'
6- import { ClerkProvider } from '@clerk/nextjs'
7- import { useTinybirdToken } from '@/providers/TinybirdProvider'
8- import { ModalProvider } from './context/ModalContext'
9- import CostPredictionModal from './components/CostPredictionModal'
10- import { useModal } from './context/ModalContext'
11- import { useKeyboardShortcut } from '@/hooks/useKeyboardShortcut'
1+ import { headers } from 'next/headers' ;
2+ import { Inter } from "next/font/google" ;
3+ import "./globals.css" ;
4+ import { TinybirdProvider } from '@/providers/TinybirdProvider' ;
5+ import { ClerkProvider } from '@clerk/nextjs' ;
6+ import { ModalProvider } from './context/ModalContext' ;
7+ import { RootLayoutContent } from './components/RootLayoutContent' ;
128
13- const inter = Inter ( { subsets : [ "latin" ] } )
9+ const inter = Inter ( { subsets : [ "latin" ] } ) ;
1410
15- function RootLayoutContent ( { children } : { children : React . ReactNode } ) {
16- const { setToken, setOrgName } = useTinybirdToken ( )
17- const [ isReady , setIsReady ] = useState ( false )
11+ export default async function RootLayout ( { children } : { children : React . ReactNode } ) {
12+ const headersList = await headers ( ) ;
13+ const token = headersList . get ( 'x-tinybird-token' ) || '' ;
14+ const orgName = headersList . get ( 'x-org-name' ) || '' ;
1815
19- useEffect ( ( ) => {
20- let isMounted = true
21-
22- const fetchToken = async ( ) => {
23- try {
24- const response = await fetch ( window . location . pathname )
25- if ( ! isMounted ) return
26-
27- const token = response . headers . get ( 'x-tinybird-token' )
28- const orgName = response . headers . get ( 'x-org-name' )
29-
30- if ( token ) {
31- setToken ( token )
32- setOrgName ( orgName || '' )
33- }
34-
35- setIsReady ( true )
36- } catch ( error ) {
37- console . error ( 'Error fetching token:' , error )
38- if ( isMounted ) setIsReady ( true )
39- }
40- }
41-
42- fetchToken ( )
43-
44- return ( ) => {
45- isMounted = false
46- }
47- } , [ ] ) // Empty dependency array to run only once
48-
49- if ( ! isReady ) return < div > Loading...</ div >
50-
51- return (
52- < >
53- { children }
54- </ >
55- )
56- }
57-
58- function ModalController ( { filters } : { filters : Record < string , string > } ) {
59- const { isCostPredictionOpen, openCostPrediction, closeCostPrediction } = useModal ( )
60-
61- // Use 'k' with modifier key (Cmd/Ctrl)
62- useKeyboardShortcut ( 'k' , ( ) => {
63- if ( ! isCostPredictionOpen ) {
64- openCostPrediction ( ) ;
65- }
66- } , true )
67-
68- return (
69- < CostPredictionModal
70- isOpen = { isCostPredictionOpen }
71- onClose = { closeCostPrediction }
72- currentFilters = { filters }
73- />
74- )
75- }
76-
77- export default function RootLayout ( { children } : { children : React . ReactNode } ) {
7816 return (
7917 < html lang = "en" className = "dark" >
8018 < body className = { inter . className } >
8119 < ClerkProvider >
8220 < TinybirdProvider >
8321 < ModalProvider >
84- < RootLayoutContent >
22+ < RootLayoutContent initialToken = { token } initialOrgName = { orgName } >
8523 { children }
86- < ModalController filters = { { } } />
8724 </ RootLayoutContent >
8825 </ ModalProvider >
8926 </ TinybirdProvider >
9027 </ ClerkProvider >
9128 </ body >
9229 </ html >
93- )
30+ ) ;
9431}
0 commit comments