2026-06-25 14:42:25 +00:00
|
|
|
import { createPortal } from 'react-dom'
|
2026-06-23 16:55:10 +00:00
|
|
|
import { Outlet } from 'react-router-dom'
|
2026-06-25 09:34:28 +00:00
|
|
|
import { SceneDecor } from './AuthDecor'
|
|
|
|
|
import { AppBrandLink } from './AppBrandLink'
|
2026-06-23 16:55:10 +00:00
|
|
|
import { AppSidebar } from './AppSidebar'
|
2026-06-23 09:54:27 +00:00
|
|
|
import { MobileBottomNav } from './MobileBottomNav'
|
2026-06-23 16:55:10 +00:00
|
|
|
import { AccountSwitcher } from './AccountSwitcher'
|
|
|
|
|
import { MemberMenu } from './MemberMenu'
|
|
|
|
|
import { JobMonitor } from './JobMonitor'
|
|
|
|
|
import { IslanderCompanion } from './islander/IslanderCompanion'
|
2026-06-25 09:34:28 +00:00
|
|
|
import { useIslanderUnlock } from '../hooks/useIslanderUnlock'
|
2026-06-23 16:55:10 +00:00
|
|
|
import { IslanderPageProvider } from '../lib/islander'
|
|
|
|
|
import { OnboardingBanner } from './OnboardingBanner'
|
|
|
|
|
import { OnboardingRouteGuard } from './OnboardingRouteGuard'
|
|
|
|
|
import { OnboardingProvider } from '../onboarding/OnboardingContext'
|
|
|
|
|
import { ThreadsAccountProvider } from '../threads/ThreadsAccountContext'
|
2026-06-23 09:54:27 +00:00
|
|
|
|
|
|
|
|
export function Layout() {
|
2026-06-25 09:34:28 +00:00
|
|
|
const islanderUnlocked = useIslanderUnlock()
|
|
|
|
|
|
2026-06-23 09:54:27 +00:00
|
|
|
return (
|
2026-06-23 16:55:10 +00:00
|
|
|
<ThreadsAccountProvider>
|
|
|
|
|
<OnboardingProvider>
|
|
|
|
|
<div className="hx-scene ac-app-shell flex min-h-dvh flex-col">
|
|
|
|
|
<SceneDecor />
|
2026-06-23 10:10:22 +00:00
|
|
|
|
2026-06-23 16:55:10 +00:00
|
|
|
<div className="ac-workbench relative z-10 flex min-h-0 w-full flex-1">
|
|
|
|
|
<AppSidebar />
|
2026-06-23 09:54:27 +00:00
|
|
|
|
2026-06-23 16:55:10 +00:00
|
|
|
<div className="ac-workspace-column flex min-w-0 flex-1 flex-col">
|
|
|
|
|
<header className="ac-app-chrome">
|
2026-06-25 09:34:28 +00:00
|
|
|
<AppBrandLink />
|
|
|
|
|
<div className="ac-app-chrome-spacer min-w-0 flex-1" aria-hidden />
|
2026-06-23 16:55:10 +00:00
|
|
|
<div className="ac-app-header-actions flex shrink-0 items-center gap-2">
|
|
|
|
|
<AccountSwitcher />
|
|
|
|
|
<MemberMenu />
|
|
|
|
|
</div>
|
|
|
|
|
</header>
|
2026-06-23 09:54:27 +00:00
|
|
|
|
2026-06-23 16:55:10 +00:00
|
|
|
<main className="ac-workspace layout-main min-h-0 min-w-0 flex-1">
|
|
|
|
|
<IslanderPageProvider>
|
|
|
|
|
<div className="ac-workspace-inner">
|
|
|
|
|
<OnboardingBanner />
|
|
|
|
|
<OnboardingRouteGuard>
|
|
|
|
|
<Outlet />
|
|
|
|
|
</OnboardingRouteGuard>
|
|
|
|
|
</div>
|
|
|
|
|
</IslanderPageProvider>
|
|
|
|
|
</main>
|
2026-06-23 09:54:27 +00:00
|
|
|
</div>
|
2026-06-23 16:55:10 +00:00
|
|
|
</div>
|
2026-06-23 09:54:27 +00:00
|
|
|
|
2026-06-23 16:55:10 +00:00
|
|
|
<MobileBottomNav />
|
|
|
|
|
<JobMonitor />
|
2026-06-25 14:42:25 +00:00
|
|
|
{islanderUnlocked
|
|
|
|
|
? createPortal(<IslanderCompanion />, document.body)
|
|
|
|
|
: null}
|
2026-06-23 16:55:10 +00:00
|
|
|
</div>
|
|
|
|
|
</OnboardingProvider>
|
|
|
|
|
</ThreadsAccountProvider>
|
2026-06-23 09:54:27 +00:00
|
|
|
)
|
|
|
|
|
}
|