@@ -17,6 +17,10 @@ import { GoogleAnalyticsWorkaround } from "./components/client/GoogleAnalyticsWo
1717import StripeScript from "./components/client/StripeScript" ;
1818import { GleanScript } from "./components/client/GleanScript" ;
1919import { getExperimentationId } from "./functions/server/getExperimentationId" ;
20+ import { getExperiments } from "./functions/server/getExperiments" ;
21+ import { getCountryCode } from "./functions/server/getCountryCode" ;
22+ import { ExperimentsProvider } from "../contextProviders/experiments" ;
23+ import * as Sentry from "@sentry/nextjs" ;
2024
2125const inter = Inter ( { subsets : [ "latin" ] , variable : "--font-inter" } ) ;
2226
@@ -54,6 +58,29 @@ export default async function RootLayout({
5458 const nonce = headers ( ) . get ( "x-nonce" ) ?? "" ;
5559 const currentLocale = getLocale ( getL10nBundles ( ) ) ;
5660 const session = await getServerSession ( ) ;
61+ const headersList = headers ( ) ;
62+ const countryCode = getCountryCode ( headersList ) ;
63+
64+ // Check for Nimbus preview mode. Note that this requires a full page reload
65+ // to activate: https://nextjs.org/docs/app/api-reference/file-conventions/layout#caveats
66+ const nimbusPreviewMode = headers ( ) . get ( "x-nimbus-preview-mode" ) ;
67+ const experimentationId = getExperimentationId ( session ?. user ?? null ) ;
68+ const experimentData = await getExperiments ( {
69+ experimentationId : experimentationId ,
70+ countryCode : countryCode ,
71+ locale : currentLocale ,
72+ previewMode : nimbusPreviewMode === "true" ,
73+ } ) ;
74+
75+ const nimbus_user_id = experimentData [ "Enrollments" ] ?. nimbus_user_id ;
76+ if (
77+ typeof nimbus_user_id !== "undefined" &&
78+ nimbus_user_id !== experimentationId
79+ ) {
80+ Sentry . captureMessage (
81+ `Nimbus user ID from Cirrus: [${ nimbus_user_id } ] did not match experimentationId: [${ experimentationId } ]` ,
82+ ) ;
83+ }
5784
5885 return (
5986 < html lang = { currentLocale } >
@@ -64,12 +91,14 @@ export default async function RootLayout({
6491 data-ga4-measurement-id = { CONST_GA4_MEASUREMENT_ID }
6592 data-node-env = { process . env . NODE_ENV }
6693 >
67- < SessionProvider session = { session } > { children } </ SessionProvider >
94+ < ExperimentsProvider experimentData = { experimentData } >
95+ < SessionProvider session = { session } > { children } </ SessionProvider >
96+ </ ExperimentsProvider >
6897 </ body >
6998 < StripeScript />
7099 < GleanScript
71100 channel = { process . env . APP_ENV ?? "" }
72- experimentationId = { getExperimentationId ( session ?. user ?? null ) }
101+ experimentationId = { experimentationId }
73102 />
74103 { headers ( ) . get ( "DNT" ) !== "1" && (
75104 < GoogleAnalyticsWorkaround
0 commit comments