CollapsedParentsDropdown.tsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import { useMemo } from 'react';
  2. import Link from 'next/link';
  3. import {
  4. DropdownItem, DropdownMenu, DropdownToggle, UncontrolledDropdown,
  5. } from 'reactstrap';
  6. import type LinkedPagePath from '~/models/linked-page-path';
  7. import styles from './CollapsedParentsDropdown.module.scss';
  8. const getAncestorPathAndPathNames = (linkedPagePath: LinkedPagePath) => {
  9. const pathAndPathName: Array<{ path: string, pathName: string }> = [];
  10. let currentLinkedPagePath = linkedPagePath;
  11. while (currentLinkedPagePath.parent != null) {
  12. pathAndPathName.unshift({ path: currentLinkedPagePath.path, pathName: currentLinkedPagePath.pathName });
  13. currentLinkedPagePath = currentLinkedPagePath.parent;
  14. }
  15. return pathAndPathName;
  16. };
  17. type Props = {
  18. linkedPagePath: LinkedPagePath,
  19. }
  20. export const CollapsedParentsDropdown = (props: Props): JSX.Element => {
  21. const { linkedPagePath } = props;
  22. const ancestorPathAndPathNames = useMemo(() => getAncestorPathAndPathNames(linkedPagePath), [linkedPagePath]);
  23. return (
  24. <UncontrolledDropdown className="d-inline-block">
  25. <DropdownToggle color="transparent">...</DropdownToggle>
  26. <DropdownMenu className={`dropdown-menu ${styles['collapsed-parents-dropdown-menu']}`} container="body">
  27. {ancestorPathAndPathNames.map(data => (
  28. <DropdownItem key={data.path}>
  29. <Link href={data.path} legacyBehavior>
  30. <a role="menuitem">{data.pathName}</a>
  31. </Link>
  32. </DropdownItem>
  33. ))}
  34. </DropdownMenu>
  35. </UncontrolledDropdown>
  36. );
  37. };