PageHeader.tsx 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import { type JSX, useCallback, useEffect, useRef, useState } from 'react';
  2. import { useCurrentPageData } from '~/states/page';
  3. import { usePageControlsX } from '~/states/ui/page';
  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 currentPage = useCurrentPageData();
  10. const pageControlsX = usePageControlsX();
  11. const pageHeaderRef = useRef<HTMLDivElement>(null);
  12. const [maxWidth, setMaxWidth] = useState<number>();
  13. const calcMaxWidth = useCallback(() => {
  14. if (pageControlsX == null || pageHeaderRef.current == null) {
  15. // Length that allows users to use PageHeader functionality.
  16. setMaxWidth(300);
  17. return;
  18. }
  19. // PageControls.x - PageHeader.x
  20. const maxWidth =
  21. pageControlsX - pageHeaderRef.current.getBoundingClientRect().x;
  22. setMaxWidth(maxWidth);
  23. }, [pageControlsX]);
  24. useEffect(() => {
  25. calcMaxWidth();
  26. }, [calcMaxWidth]);
  27. if (currentPage == null) {
  28. return <></>;
  29. }
  30. return (
  31. <div className={`${moduleClass} w-100`} ref={pageHeaderRef}>
  32. <PagePathHeader
  33. currentPage={currentPage}
  34. maxWidth={maxWidth}
  35. onRenameTerminated={calcMaxWidth}
  36. />
  37. <div className="mt-0 mt-md-1">
  38. <PageTitleHeader
  39. currentPage={currentPage}
  40. maxWidth={maxWidth}
  41. onMoveTerminated={calcMaxWidth}
  42. />
  43. </div>
  44. </div>
  45. );
  46. };