PagePathNavLayout.tsx 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import type { ReactNode } from 'react';
  2. import dynamic from 'next/dynamic';
  3. import { useIsNotFound } from '~/stores/page';
  4. import styles from './PagePathNav.module.scss';
  5. const moduleClass = styles['grw-page-path-nav-layout'] ?? '';
  6. export type PagePathNavLayoutProps = {
  7. className?: string,
  8. pagePath: string,
  9. pageId?: string | null,
  10. isWipPage?: boolean,
  11. maxWidth?: number,
  12. formerLinkClassName?: string,
  13. latterLinkClassName?: string,
  14. }
  15. type Props = PagePathNavLayoutProps & {
  16. formerLink?: ReactNode,
  17. latterLink?: ReactNode,
  18. }
  19. const CopyDropdown = dynamic(() => import('~/client/components/Common/CopyDropdown').then(mod => mod.CopyDropdown), { ssr: false });
  20. export const PagePathNavLayout = (props: Props): JSX.Element => {
  21. const {
  22. className = '',
  23. pageId, pagePath, isWipPage,
  24. formerLink,
  25. formerLinkClassName = '',
  26. latterLink,
  27. latterLinkClassName = '',
  28. maxWidth,
  29. } = props;
  30. const { data: isNotFound } = useIsNotFound();
  31. const copyDropdownId = `copydropdown-${pageId}`;
  32. return (
  33. <div
  34. className={`${className} ${moduleClass}`}
  35. style={{ maxWidth }}
  36. >
  37. <span className={`${formerLinkClassName ?? ''} ${styles['grw-former-link']}`}>{formerLink}</span>
  38. <div className="d-flex align-items-center">
  39. <h1 className={`m-0 ${latterLinkClassName}`}>
  40. {latterLink}
  41. </h1>
  42. { pageId != null && !isNotFound && (
  43. <div className="d-flex align-items-center ms-2">
  44. { isWipPage && (
  45. <span className="badge text-bg-secondary ms-1 me-1">WIP</span>
  46. )}
  47. <span className=" grw-page-path-nav-copydropdown">
  48. <CopyDropdown pageId={pageId} pagePath={pagePath} dropdownToggleId={copyDropdownId} dropdownToggleClassName="p-2">
  49. <span className="material-symbols-outlined">content_paste</span>
  50. </CopyDropdown>
  51. </span>
  52. </div>
  53. ) }
  54. </div>
  55. </div>
  56. );
  57. };