Skip to content

Commit 6e039ef

Browse files
Fix flash of incorrect theme for @primer/components (github#24123)
* Pass color mode from server to ThemeProvider * Add preventSSRMismatch * Fix bad merge, my bad. * use release candidate for csrf safe approach * upgrade primer/react to 34.7.1 Co-authored-by: Mike Surowiec <[email protected]>
1 parent 4368b99 commit 6e039ef

File tree

3 files changed

+60
-23
lines changed

3 files changed

+60
-23
lines changed

package-lock.json

Lines changed: 51 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
"dependencies": {
1212
"@github/failbot": "0.8.0",
1313
"@primer/css": "^19.4.0",
14+
"@primer/react": "^34.7.1",
1415
"@primer/octicons": "17.0.0",
1516
"@primer/octicons-react": "17.0.0",
16-
"@primer/react": "^34.6.0",
1717
"@react-aria/ssr": "^3.1.0",
1818
"accept-language-parser": "^1.5.0",
1919
"ajv": "^8.9.0",

pages/_app.tsx

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { useEffect } from 'react'
22
import App from 'next/app'
33
import type { AppProps, AppContext } from 'next/app'
44
import Head from 'next/head'
5-
import { useTheme, ThemeProvider } from '@primer/react'
5+
import { ThemeProvider, ThemeProviderProps } from '@primer/react'
66
import { SSRProvider } from '@react-aria/ssr'
77
import { defaultComponentThemeProps, getThemeProps } from 'components/lib/getThemeProps'
88

@@ -14,7 +14,7 @@ import { LanguagesContext, LanguagesContextT } from 'components/context/Language
1414

1515
type MyAppProps = AppProps & {
1616
csrfToken: string
17-
themeProps: typeof defaultComponentThemeProps
17+
themeProps: typeof defaultComponentThemeProps & Pick<ThemeProviderProps, 'colorMode'>
1818
languagesContext: LanguagesContextT
1919
}
2020
const MyApp = ({ Component, pageProps, csrfToken, themeProps, languagesContext }: MyAppProps) => {
@@ -51,9 +51,13 @@ const MyApp = ({ Component, pageProps, csrfToken, themeProps, languagesContext }
5151
<meta name="csrf-token" content={csrfToken} />
5252
</Head>
5353
<SSRProvider>
54-
<ThemeProvider dayScheme={themeProps.dayTheme} nightScheme={themeProps.nightTheme}>
54+
<ThemeProvider
55+
colorMode={themeProps.colorMode}
56+
dayScheme={themeProps.dayTheme}
57+
nightScheme={themeProps.nightTheme}
58+
preventSSRMismatch
59+
>
5560
<LanguagesContext.Provider value={languagesContext}>
56-
<SetTheme themeProps={themeProps} />
5761
<Component {...pageProps} />
5862
</LanguagesContext.Provider>
5963
</ThemeProvider>
@@ -76,15 +80,4 @@ MyApp.getInitialProps = async (appContext: AppContext) => {
7680
}
7781
}
7882

79-
const SetTheme = ({ themeProps }: { themeProps: typeof defaultComponentThemeProps }) => {
80-
// Cause primer/components to re-evaluate the 'auto' color mode on client side render
81-
const { setColorMode } = useTheme()
82-
useEffect(() => {
83-
setTimeout(() => {
84-
setColorMode(themeProps.colorMode as any)
85-
})
86-
}, [])
87-
return null
88-
}
89-
9083
export default MyApp

0 commit comments

Comments
 (0)