1
0
mirror of synced 2025-12-25 02:17:36 -05:00

Fix flash of incorrect theme for @primer/components (#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 <mikesurowiec@users.noreply.github.com>
This commit is contained in:
Siddharth Kshetrapal
2022-03-21 23:10:06 +01:00
committed by GitHub
parent 4368b99fef
commit 6e039efe70
3 changed files with 60 additions and 23 deletions

View File

@@ -2,7 +2,7 @@ import React, { useEffect } from 'react'
import App from 'next/app'
import type { AppProps, AppContext } from 'next/app'
import Head from 'next/head'
import { useTheme, ThemeProvider } from '@primer/react'
import { ThemeProvider, ThemeProviderProps } from '@primer/react'
import { SSRProvider } from '@react-aria/ssr'
import { defaultComponentThemeProps, getThemeProps } from 'components/lib/getThemeProps'
@@ -14,7 +14,7 @@ import { LanguagesContext, LanguagesContextT } from 'components/context/Language
type MyAppProps = AppProps & {
csrfToken: string
themeProps: typeof defaultComponentThemeProps
themeProps: typeof defaultComponentThemeProps & Pick<ThemeProviderProps, 'colorMode'>
languagesContext: LanguagesContextT
}
const MyApp = ({ Component, pageProps, csrfToken, themeProps, languagesContext }: MyAppProps) => {
@@ -51,9 +51,13 @@ const MyApp = ({ Component, pageProps, csrfToken, themeProps, languagesContext }
<meta name="csrf-token" content={csrfToken} />
</Head>
<SSRProvider>
<ThemeProvider dayScheme={themeProps.dayTheme} nightScheme={themeProps.nightTheme}>
<ThemeProvider
colorMode={themeProps.colorMode}
dayScheme={themeProps.dayTheme}
nightScheme={themeProps.nightTheme}
preventSSRMismatch
>
<LanguagesContext.Provider value={languagesContext}>
<SetTheme themeProps={themeProps} />
<Component {...pageProps} />
</LanguagesContext.Provider>
</ThemeProvider>
@@ -76,15 +80,4 @@ MyApp.getInitialProps = async (appContext: AppContext) => {
}
}
const SetTheme = ({ themeProps }: { themeProps: typeof defaultComponentThemeProps }) => {
// Cause primer/components to re-evaluate the 'auto' color mode on client side render
const { setColorMode } = useTheme()
useEffect(() => {
setTimeout(() => {
setColorMode(themeProps.colorMode as any)
})
}, [])
return null
}
export default MyApp