* fix: req.csrfToken doesn't always exist (e.g. 500 page) * feat: update dockerfile and add nextjs to build * fix: run linter * move @babel deps -> dev deps * move webpack looking things from deps -> dev deps * move pa11y-ci to optional dep * explicitly include optional deps for pa11y * allow heroku dev deps to be installed * fix: update postcss module * fix: update dockerfile build * tmp: disable renderReact * see if another deploy is slower/faster * move a few more packages to devDeps * upgrade to package-lock v2 * use dayjs instead of date-fns * move cross-env to devDeps * remove unused 'del' package * commit husky precommit hooks * add hrtime to clone-for-build.js * Revert "add hrtime to clone-for-build.js" This reverts commit 70ee647bacce833f4ed2f621f62c63c1d85e5413. * update babel/eslint * fix: remove unused plugin * try a .slugignore * fix: heroku-postbuild to use npm run build * fix: i cannot spell dereferenced * add .next/cache to heroku cacheDirectories * test cached build * remove aws-sdk, see what breaks * move jest-puppeteer to optional deps * fix: update browser-test.yml to use newer node version * move jimp to optional dependencies * move puppeteer to optional dependencies * fix: ci optional include * fix: bad copy pasta * remove previous react experiment * update tests/README.md with note about optional deps * bump node test version back to 14 * convert package-lock back to v1 * fix: use node 15.x to leverage npm optional deps * fix: optional dep install * test: see what happens with heroku/nodejs-typescript buildpack * back to heroku/nodejs buildpack * move jest to optional * revert jest move * remove .slugignore * cleanup dockerfile, move xlsx-population to optional, add comment about optional deps * Update Dockerfile Co-authored-by: James M. Greene <JamesMGreene@github.com> Co-authored-by: James M. Greene <JamesMGreene@github.com>
64 lines
2.0 KiB
TypeScript
64 lines
2.0 KiB
TypeScript
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/components'
|
|
import { getThemeProps } from 'components/lib/getThemeProps'
|
|
|
|
import '@primer/css/index.scss'
|
|
|
|
import { defaultThemeProps } from 'components/lib/getThemeProps'
|
|
|
|
type MyAppProps = AppProps & { csrfToken: string; themeProps: typeof defaultThemeProps }
|
|
const MyApp = ({ Component, pageProps, csrfToken, themeProps }: MyAppProps) => {
|
|
return (
|
|
<>
|
|
<Head>
|
|
<meta charSet="utf-8" />
|
|
<title>GitHub Documentation</title>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
|
|
<link rel="alternate icon" type="image/png" href="/assets/images/site/favicon.png" />
|
|
<link rel="icon" type="image/svg+xml" href="/assets/images/site/favicon.svg" />
|
|
|
|
<meta
|
|
name="google-site-verification"
|
|
content="OgdQc0GZfjDI52wDv1bkMT-SLpBUo_h5nn9mI9L22xQ"
|
|
/>
|
|
<meta
|
|
name="google-site-verification"
|
|
content="c1kuD-K2HIVF635lypcsWPoD4kilo5-jA_wBFyT4uMY"
|
|
/>
|
|
|
|
<meta name="csrf-token" content={csrfToken} />
|
|
</Head>
|
|
<ThemeProvider>
|
|
<SetTheme themeProps={themeProps} />
|
|
<Component {...pageProps} />
|
|
</ThemeProvider>
|
|
</>
|
|
)
|
|
}
|
|
|
|
MyApp.getInitialProps = async (appContext: AppContext) => {
|
|
const { ctx } = appContext
|
|
// calls page's `getInitialProps` and fills `appProps.pageProps`
|
|
const appProps = await App.getInitialProps(appContext)
|
|
const req: any = ctx.req
|
|
|
|
return { ...appProps, themeProps: getThemeProps(req), csrfToken: req?.csrfToken?.() || '' }
|
|
}
|
|
|
|
const SetTheme = ({ themeProps }: { themeProps: typeof defaultThemeProps }) => {
|
|
// 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
|