2
0

PagePathNavLayout.tsx 2.3 KB

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