ThemeInjector.tsx 771 B

1234567891011121314151617181920212223242526272829
  1. import React from 'react';
  2. import { useIsomorphicLayoutEffect } from 'usehooks-ts';
  3. type Props = {
  4. children: JSX.Element,
  5. className: string,
  6. bgImageNode?: React.ReactNode,
  7. }
  8. export const ThemeInjector = ({ children, className: themeClassName, bgImageNode }: Props): JSX.Element => {
  9. const className = `${children.props.className ?? ''} ${themeClassName}`;
  10. // add class name to <body>
  11. useIsomorphicLayoutEffect(() => {
  12. document.body.classList.add(themeClassName);
  13. // clean up
  14. return () => {
  15. document.body.classList.remove(themeClassName);
  16. };
  17. });
  18. return React.cloneElement(children, { className }, [
  19. <div key="grw-bg-image-wrapper" className="grw-bg-image-wrapper">{bgImageNode}</div>,
  20. children.props.children,
  21. ]);
  22. };