PageHeader.tsx 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import { useMemo, useRef } from 'react';
  2. import { useSWRxCurrentPage } from '~/stores/page';
  3. import { usePageControlsX } from '~/stores/ui';
  4. import { PagePathHeader } from './PagePathHeader';
  5. import { PageTitleHeader } from './PageTitleHeader';
  6. import styles from './PageHeader.module.scss';
  7. const moduleClass = styles['page-header'] ?? '';
  8. export const PageHeader = (): JSX.Element => {
  9. const { data: currentPage } = useSWRxCurrentPage();
  10. const { data: pageControlsX } = usePageControlsX();
  11. const pageHeaderRef = useRef<HTMLDivElement>(null);
  12. const maxWidth = useMemo(() => {
  13. if (pageControlsX == null || pageHeaderRef.current == null) {
  14. // Length that allows users to use PageHeader functionality.
  15. return 300;
  16. }
  17. // At least 10px space between PageHeader and PageControls
  18. return pageControlsX - pageHeaderRef.current.getBoundingClientRect().x - 10;
  19. }, [pageControlsX]);
  20. if (currentPage == null) {
  21. return <></>;
  22. }
  23. return (
  24. <div className={`${moduleClass} w-100`} ref={pageHeaderRef}>
  25. <PagePathHeader
  26. currentPage={currentPage}
  27. maxWidth={maxWidth}
  28. />
  29. <div className="mt-0 mt-md-1">
  30. <PageTitleHeader
  31. currentPage={currentPage}
  32. maxWidth={maxWidth}
  33. />
  34. </div>
  35. </div>
  36. );
  37. };