LazyRenderer.tsx 819 B

12345678910111213141516171819202122232425262728293031323334353637
  1. import React, { useEffect, useState } from 'react';
  2. type Props = {
  3. shouldRender: boolean | (() => boolean),
  4. children: JSX.Element,
  5. }
  6. export const LazyRenderer = (props: Props): JSX.Element => {
  7. const { shouldRender: _shouldRender, children } = props;
  8. const [isActivated, setActivated] = useState(false);
  9. const shouldRender = typeof _shouldRender === 'function'
  10. ? _shouldRender()
  11. : _shouldRender;
  12. useEffect(() => {
  13. if (isActivated) {
  14. return;
  15. }
  16. setActivated(shouldRender);
  17. }, [isActivated, shouldRender]);
  18. const additionalClassName = shouldRender ? '' : 'd-none';
  19. if (!isActivated) {
  20. return <></>;
  21. }
  22. return (
  23. <>
  24. { React.cloneElement(children, {
  25. className: `${children.props.className ?? ''} ${additionalClassName}`,
  26. }) }
  27. </>
  28. );
  29. };