RawLayout.tsx 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import React, {
  2. ReactNode, useCallback, useEffect, useState,
  3. } from 'react';
  4. import Head from 'next/head';
  5. import Image from 'next/image';
  6. import { useGrowiTheme } from '~/stores/context';
  7. import { Themes, useNextThemes } from '~/stores/use-next-themes';
  8. import { getBackgroundImageSrc } from '../Theme/utils/ThemeImageProvider';
  9. import { ThemeProvider } from '../Theme/utils/ThemeProvider';
  10. type Props = {
  11. title?: string,
  12. className?: string,
  13. children?: ReactNode,
  14. }
  15. export const RawLayout = ({ children, title, className }: Props): JSX.Element => {
  16. const classNames: string[] = ['wrapper'];
  17. if (className != null) {
  18. classNames.push(className);
  19. }
  20. const { data: growiTheme } = useGrowiTheme();
  21. // get color scheme from next-themes
  22. const { resolvedTheme } = useNextThemes();
  23. const [colorScheme, setColorScheme] = useState<Themes|undefined>(undefined);
  24. const [backgroundImageSrc, setBackgroundImageSrc] = useState<string | undefined>(undefined);
  25. // set colorScheme in CSR
  26. useEffect(() => {
  27. setColorScheme(resolvedTheme as Themes);
  28. }, [resolvedTheme]);
  29. // set background image
  30. useEffect(() => {
  31. const imgSrc = getBackgroundImageSrc(growiTheme, colorScheme);
  32. setBackgroundImageSrc(imgSrc);
  33. }, [growiTheme, colorScheme]);
  34. return (
  35. <>
  36. <Head>
  37. <title>{title}</title>
  38. <meta charSet="utf-8" />
  39. <meta name="viewport" content="initial-scale=1.0, width=device-width" />
  40. </Head>
  41. <ThemeProvider theme={growiTheme}>
  42. <div className={classNames.join(' ')} data-color-scheme={colorScheme}>
  43. {backgroundImageSrc != null && <div className="grw-bg-image-wrapper">
  44. <Image className='grw-bg-image' alt='background-image' src={backgroundImageSrc} layout='fill' quality="100" />
  45. </div>}
  46. {children}
  47. </div>
  48. </ThemeProvider>
  49. </>
  50. );
  51. };