1- import { createLogger } from '@sim/logger '
1+ import { Suspense } from 'react '
22import { dehydrate , HydrationBoundary } from '@tanstack/react-query'
3- import { cookies } from 'next/headers'
3+ import { cookies , headers } from 'next/headers'
44import { redirect } from 'next/navigation'
55import { SettingsNavigationProvider } from '@/components/settings/settings-navigation-provider'
66import { getSession } from '@/lib/auth'
77import { getActiveOrganizationId } from '@/lib/auth/session-response'
8- import { canUseBenchmarks } from '@/lib/benchmarks/config'
9- import { isChangelogEnabled } from '@/lib/changelog/feature-flag'
10- import { isComputerUseAvailable } from '@/lib/computer-use/availability.server'
11- import { isDashboardsEnabled } from '@/lib/dashboards/feature-flag'
12- import { isMothershipModelSelectorEnabled } from '@/lib/mothership/feature-flags'
138import { organizationRoutes , WORKSPACE_SETTINGS_PATH } from '@/lib/navigation/paths'
149import { getOrganizationSurfaceContext } from '@/lib/organizations/surface'
10+ import { resolveOrganizationSurfaceFlags } from '@/lib/organizations/surface-flags'
1511import { canBrowsePeople } from '@/lib/people/feature-flag'
16- import { isProjectsEnabled } from '@/lib/projects/rollout.server'
12+ import { isPlatformOrgUiEnabled } from '@/lib/platform/rollout'
13+ import { LEGACY_URL_HEADER , mapLegacyOrganizationUrl } from '@/lib/platform/routes'
1714import { resolveSimLinkOrganization } from '@/lib/sim-links/application/organization'
1815import { isSimLinksEnabled } from '@/lib/sim-links/feature-flag'
19- import { isWorkflowTestsEnabled } from '@/lib/workflow-tests/feature-flag'
2016import { getQueryClient } from '@/app/_shell/providers/get-query-client'
2117import { buildAuthCrossLink } from '@/app/(auth)/auth-redirect'
2218import { OrganizationAccessDenied } from '@/app/o/[organizationId]/components/organization-access-denied'
2319import { OrganizationSidebar } from '@/app/o/[organizationId]/components/organization-sidebar'
20+ import { PlatformRouteGuard } from '@/app/o/[organizationId]/components/platform-route-guard'
2421import { SimLinkOrganizationProvider } from '@/app/o/[organizationId]/links/sim-link-organization-provider'
2522import { prefetchOrganizationSidebar } from '@/app/o/[organizationId]/prefetch'
2623import { OrganizationProvider } from '@/app/o/[organizationId]/providers/organization-provider'
@@ -33,8 +30,6 @@ import {
3330import { FeatureFlagsProvider } from '@/app/workspace/[workspaceId]/providers/feature-flags-provider'
3431import { GlobalCommandsProvider } from '@/app/workspace/[workspaceId]/providers/global-commands-provider'
3532
36- const logger = createLogger ( 'OrganizationLayout' )
37-
3833/**
3934 * The organization surface: the viewer's own view of one organization, outside
4035 * any workspace. Requires membership and an available organization chat surface.
@@ -67,6 +62,12 @@ export default async function OrganizationLayout({
6762 if ( ! context ) {
6863 return < OrganizationAccessDenied />
6964 }
65+ const platformOrgUi = await isPlatformOrgUiEnabled ( organizationId )
66+ if ( platformOrgUi ) {
67+ const legacyUrl = ( await headers ( ) ) . get ( LEGACY_URL_HEADER )
68+ const platformUrl = legacyUrl && mapLegacyOrganizationUrl ( legacyUrl , organizationId )
69+ if ( platformUrl ) redirect ( platformUrl )
70+ }
7071 const peopleEnabledLookup = canBrowsePeople ( organizationId , context . viewer . role )
7172 const simLinksEnabledLookup = isSimLinksEnabled ( organizationId )
7273 if (
@@ -77,60 +78,34 @@ export default async function OrganizationLayout({
7778 )
7879 redirect ( WORKSPACE_SETTINGS_PATH )
7980
80- const [
81- ,
82- modelSelectorEnabled ,
83- dashboardsEnabled ,
84- benchmarkEnabled ,
85- computerUseEnabled ,
86- workflowTestsEnabled ,
87- changelogEnabled ,
88- projectsEnabled ,
89- simLinksEnabled ,
90- peopleEnabled ,
91- simLinkOrganizationId ,
92- ] = await Promise . all ( [
93- prefetchOrganizationSidebar (
94- queryClient ,
95- organizationId ,
96- { kind : 'session' , userId : session . user . id , sessionId : session . session . id } ,
97- getActiveOrganizationId ( session )
98- ) ,
99- isMothershipModelSelectorEnabled ( ) ,
100- isDashboardsEnabled ( organizationId ) ,
101- canUseBenchmarks ( session . user . id ) . catch ( ( ) => {
102- logger . warn ( 'Could not resolve benchmark navigation access' )
103- return false
104- } ) ,
105- isComputerUseAvailable ( organizationId ) ,
106- isWorkflowTestsEnabled ( organizationId ) ,
107- isChangelogEnabled ( organizationId ) ,
108- isProjectsEnabled ( ) ,
109- simLinksEnabledLookup ,
110- peopleEnabledLookup ,
111- resolveSimLinkOrganization ( {
112- kind : 'session' ,
113- userId : session . user . id ,
114- sessionId : session . session . id ,
115- } ) ,
116- ] )
81+ const [ , { flags, benchmarkEnabled } , simLinksEnabled , peopleEnabled , simLinkOrganizationId ] =
82+ await Promise . all ( [
83+ prefetchOrganizationSidebar (
84+ queryClient ,
85+ organizationId ,
86+ { kind : 'session' , userId : session . user . id , sessionId : session . session . id } ,
87+ getActiveOrganizationId ( session )
88+ ) ,
89+ resolveOrganizationSurfaceFlags ( organizationId , session . user . id ) ,
90+ simLinksEnabledLookup ,
91+ peopleEnabledLookup ,
92+ resolveSimLinkOrganization ( {
93+ kind : 'session' ,
94+ userId : session . user . id ,
95+ sessionId : session . session . id ,
96+ } ) ,
97+ ] )
11798 const initialSidebarCollapsed = cookieStore . get ( 'sidebar_collapsed' ) ?. value === '1'
11899
119100 return (
120101 < HydrationBoundary state = { dehydrate ( queryClient ) } >
121- < FeatureFlagsProvider
122- flags = { {
123- dashboards : dashboardsEnabled ,
124- 'workflow-tests' : workflowTestsEnabled ,
125- changelog : changelogEnabled ,
126- 'mothership-model-selector' : modelSelectorEnabled ,
127- 'mothership-computer-use' : computerUseEnabled ,
128- 'mothership-plan-mode' : benchmarkEnabled ,
129- 'mothership-memory-spaces' : benchmarkEnabled ,
130- projects : projectsEnabled ,
131- } }
132- >
102+ < FeatureFlagsProvider flags = { flags } >
133103 < OrganizationProvider context = { context } >
104+ { platformOrgUi && (
105+ < Suspense fallback = { null } >
106+ < PlatformRouteGuard organizationId = { organizationId } />
107+ </ Suspense >
108+ ) }
134109 < SimLinkOrganizationProvider organizationId = { simLinkOrganizationId } >
135110 < GlobalCommandsProvider >
136111 < WorkspaceViewport className = 'workspace-root' >
0 commit comments