84 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
| /**
 | |
|  * Copyright (C) 2019-2021 Carl Kittelberger <icedream@icedream.pw>
 | |
|  *
 | |
|  * This program is free software: you can redistribute it and/or modify
 | |
|  * it under the terms of the GNU Affero General Public License as
 | |
|  * published by the Free Software Foundation, either version 3 of the
 | |
|  * License, or (at your option) any later version.
 | |
|  *
 | |
|  * This program is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|  * GNU Affero General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU Affero General Public License
 | |
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | |
|  */
 | |
| 
 | |
| import Document, {
 | |
|   Html,
 | |
|   Head,
 | |
|   Main,
 | |
|   NextScript,
 | |
|   DocumentContext,
 | |
|   DocumentInitialProps,
 | |
| } from 'next/document';
 | |
| import { SWRConfig } from 'swr';
 | |
| import * as React from 'react';
 | |
| import { IntlProvider } from 'react-intl';
 | |
| import { fetchJson } from '../util/api';
 | |
| import withSession, { IncomingMessageWithSession } from '../util/session';
 | |
| import { defaultLocale, loadLocaleData, LocaleData } from '../util/localization';
 | |
| 
 | |
| const getNewProps = withSession(async (req: IncomingMessageWithSession) => {
 | |
|   const enableDark = req.session.get('enable-dark') || false;
 | |
|   const locale = req.session.get('locale') || defaultLocale;
 | |
|   const messages = await loadLocaleData(locale);
 | |
| 
 | |
|   return {
 | |
|     enableDark,
 | |
|     locale,
 | |
|     messages,
 | |
|   };
 | |
| });
 | |
| 
 | |
| class GDQArchiveDocument extends Document<{
 | |
|   enableDark: boolean,
 | |
|   locale: string,
 | |
|   messages: LocaleData,
 | |
| }> {
 | |
|   static async getInitialProps(ctx: DocumentContext): Promise<DocumentInitialProps> {
 | |
|     const initialProps = await Document.getInitialProps(ctx);
 | |
|     return {
 | |
|       ...initialProps,
 | |
|       ...await getNewProps(ctx.req, ctx.res),
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   render() {
 | |
|     const { enableDark, locale, messages } = this.props;
 | |
|     return (
 | |
|       <SWRConfig
 | |
|         value={{
 | |
|           fetcher: fetchJson,
 | |
|           onError: (err) => {
 | |
|             console.error(err);
 | |
|           },
 | |
|         }}
 | |
|       >
 | |
|         <IntlProvider messages={messages} locale={locale} defaultLocale={defaultLocale}>
 | |
|           <Html lang={locale} data-enable-dark={enableDark}>
 | |
|             <Head />
 | |
|             <body>
 | |
|               <Main />
 | |
|               <NextScript />
 | |
|             </body>
 | |
|           </Html>
 | |
|         </IntlProvider>
 | |
|       </SWRConfig>
 | |
|     );
 | |
|   }
 | |
| }
 | |
| 
 | |
| export default GDQArchiveDocument;
 |