PagePathNavLayout.tsx 2.4 KB

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