PageHeader.tsx 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  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. return 300;
  15. }
  16. return pageControlsX - pageHeaderRef.current.getBoundingClientRect().x - 10;
  17. }, [pageControlsX]);
  18. if (currentPage == null) {
  19. return <></>;
  20. }
  21. return (
  22. <div className={`${moduleClass} w-100`} ref={pageHeaderRef}>
  23. <PagePathHeader
  24. currentPage={currentPage}
  25. maxWidth={maxWidth}
  26. />
  27. <div className="mt-1">
  28. <PageTitleHeader
  29. currentPage={currentPage}
  30. maxWidth={maxWidth}
  31. />
  32. </div>
  33. </div>
  34. );
  35. };