11"use client" ;
22import React , { Suspense , useCallback , useEffect , useState } from "react" ;
3+ import dynamic from "next/dynamic" ;
34import Link from "next/link" ;
45import NavBar from "@/app/components/nav-bar" ;
56import { usePathname , useSearchParams } from "next/navigation" ;
@@ -14,6 +15,12 @@ import {
1415 PaperSplitViewProvider ,
1516 usePaperSplitView ,
1617} from "@/app/components/past_papers/paper-split-view" ;
18+ import { POSTHOG_FEATURE_FLAGS } from "@/lib/posthog/shared" ;
19+ import { usePostHogFeatureFlagEnabled } from "@/lib/posthog/use-feature-flag-enabled" ;
20+
21+ const CommandPalette = dynamic ( ( ) => import ( "@/app/components/command-palette" ) , {
22+ ssr : false ,
23+ } ) ;
1724
1825function RouteEffects ( { onPathChange } : { onPathChange : ( ) => void } ) {
1926 const pathname = usePathname ( ) ;
@@ -174,11 +181,30 @@ function ClientShell({
174181 children,
175182 isNavOn,
176183 toggleNavbar,
184+ commandPaletteOpen,
185+ setCommandPaletteOpen,
177186} : {
178187 children : React . ReactNode ;
179188 isNavOn : boolean ;
180189 toggleNavbar : ( ) => void ;
190+ commandPaletteOpen : boolean ;
191+ setCommandPaletteOpen : ( open : boolean ) => void ;
181192} ) {
193+ const commandPaletteEnabled =
194+ usePostHogFeatureFlagEnabled ( POSTHOG_FEATURE_FLAGS . commandPalette ) ?? false ;
195+
196+ useEffect ( ( ) => {
197+ if ( ! commandPaletteEnabled && commandPaletteOpen ) {
198+ setCommandPaletteOpen ( false ) ;
199+ }
200+ } , [ commandPaletteEnabled , commandPaletteOpen , setCommandPaletteOpen ] ) ;
201+
202+ const openCommandPalette = useCallback ( ( ) => {
203+ if ( commandPaletteEnabled ) {
204+ setCommandPaletteOpen ( true ) ;
205+ }
206+ } , [ commandPaletteEnabled , setCommandPaletteOpen ] ) ;
207+
182208 return (
183209 < Suspense fallback = { < div className = "relative flex" /> } >
184210 < NavFromProvider >
@@ -192,8 +218,19 @@ function ClientShell({
192218 />
193219 }
194220 >
195- < NavBar isNavOn = { isNavOn } toggleNavbar = { toggleNavbar } />
221+ < NavBar
222+ isNavOn = { isNavOn }
223+ toggleNavbar = { toggleNavbar }
224+ commandPaletteEnabled = { commandPaletteEnabled }
225+ onOpenCommandPalette = { openCommandPalette }
226+ />
196227 </ Suspense >
228+ { commandPaletteEnabled ? (
229+ < CommandPalette
230+ open = { commandPaletteOpen }
231+ onOpenChange = { setCommandPaletteOpen }
232+ />
233+ ) : null }
197234 < main className = "ec-app-main min-w-0 flex-1 pb-[calc(4.25rem+env(safe-area-inset-bottom))] pt-[env(safe-area-inset-top)] lg:pb-0 lg:pl-14 lg:pt-0" >
198235 < PaperSplitViewProvider >
199236 < Suspense fallback = { null } >
@@ -217,6 +254,7 @@ export default function ClientSide({
217254 children : React . ReactNode ;
218255} ) {
219256 const [ isNavOn , setIsNavOn ] = useState ( false ) ;
257+ const [ commandPaletteOpen , setCommandPaletteOpen ] = useState ( false ) ;
220258
221259 useEffect ( ( ) => {
222260 if ( typeof window === "undefined" ) return ;
@@ -251,6 +289,8 @@ export default function ClientSide({
251289 < ClientShell
252290 isNavOn = { isNavOn }
253291 toggleNavbar = { toggleNavbar }
292+ commandPaletteOpen = { commandPaletteOpen }
293+ setCommandPaletteOpen = { setCommandPaletteOpen }
254294 >
255295 < Suspense fallback = { null } >
256296 < RouteEffects onPathChange = { handlePathChange } />
0 commit comments