FolderItem.tsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import { Details2Svg } from '../../_shared/svg/Details2Svg';
  2. import AddSvg from '../../_shared/svg/AddSvg';
  3. import { NavItemOptionsPopup } from './NavItemOptionsPopup';
  4. import { NewPagePopup } from './NewPagePopup';
  5. import { IFolder } from '$app_reducers/folders/slice';
  6. import { useFolderEvents } from './FolderItem.hooks';
  7. import { IPage } from '$app_reducers/pages/slice';
  8. import { PageItem } from './PageItem';
  9. import { Button } from '../../_shared/Button';
  10. import { RenamePopup } from './RenamePopup';
  11. import { useEffect, useRef, useState } from 'react';
  12. import { DropDownShowSvg } from '../../_shared/svg/DropDownShowSvg';
  13. import { ANIMATION_DURATION } from '../../_shared/constants';
  14. export const FolderItem = ({
  15. folder,
  16. pages,
  17. onPageClick,
  18. }: {
  19. folder: IFolder;
  20. pages: IPage[];
  21. onPageClick: (page: IPage) => void;
  22. }) => {
  23. const {
  24. showPages,
  25. onFolderNameClick,
  26. showFolderOptions,
  27. onFolderOptionsClick,
  28. showNewPageOptions,
  29. onNewPageClick,
  30. showRenamePopup,
  31. startFolderRename,
  32. changeFolderTitle,
  33. closeRenamePopup,
  34. deleteFolder,
  35. duplicateFolder,
  36. onAddNewDocumentPage,
  37. onAddNewBoardPage,
  38. onAddNewGridPage,
  39. closePopup,
  40. folderHeight,
  41. } = useFolderEvents(folder, pages);
  42. const [popupY, setPopupY] = useState(0);
  43. const el = useRef<HTMLDivElement>(null);
  44. useEffect(() => {
  45. if (el.current) {
  46. const { top } = el.current.getBoundingClientRect();
  47. setPopupY(top);
  48. }
  49. }, [showFolderOptions, showNewPageOptions, showRenamePopup]);
  50. return (
  51. <div ref={el}>
  52. <div
  53. className={`my-2 overflow-hidden transition-all`}
  54. style={{ height: folderHeight, transitionDuration: `${ANIMATION_DURATION}ms` }}
  55. >
  56. <div
  57. onClick={() => onFolderNameClick()}
  58. className={'flex cursor-pointer items-center justify-between rounded-lg px-4 py-2 hover:bg-surface-2'}
  59. >
  60. <button className={'flex min-w-0 flex-1 items-center'}>
  61. <i className={`mr-2 h-5 w-5 transition-transform duration-500 ${showPages && 'rotate-180'}`}>
  62. {pages.length > 0 && <DropDownShowSvg></DropDownShowSvg>}
  63. </i>
  64. <span className={'min-w-0 flex-1 overflow-hidden overflow-ellipsis whitespace-nowrap text-left'}>
  65. {folder.title}
  66. </span>
  67. </button>
  68. <div className={'flex items-center'}>
  69. <Button size={'box-small-transparent'} onClick={() => onFolderOptionsClick()}>
  70. <Details2Svg></Details2Svg>
  71. </Button>
  72. <Button size={'box-small-transparent'} onClick={() => onNewPageClick()}>
  73. <AddSvg></AddSvg>
  74. </Button>
  75. </div>
  76. </div>
  77. {pages.map((page, index) => (
  78. <PageItem key={index} page={page} onPageClick={() => onPageClick(page)}></PageItem>
  79. ))}
  80. </div>
  81. {showFolderOptions && (
  82. <NavItemOptionsPopup
  83. onRenameClick={() => startFolderRename()}
  84. onDeleteClick={() => deleteFolder()}
  85. onDuplicateClick={() => duplicateFolder()}
  86. onClose={() => closePopup()}
  87. top={popupY - 124 + 40}
  88. ></NavItemOptionsPopup>
  89. )}
  90. {showNewPageOptions && (
  91. <NewPagePopup
  92. onDocumentClick={() => onAddNewDocumentPage()}
  93. onBoardClick={() => onAddNewBoardPage()}
  94. onGridClick={() => onAddNewGridPage()}
  95. onClose={() => closePopup()}
  96. top={popupY - 124 + 40}
  97. ></NewPagePopup>
  98. )}
  99. {showRenamePopup && (
  100. <RenamePopup
  101. value={folder.title}
  102. onChange={(newTitle) => changeFolderTitle(newTitle)}
  103. onClose={closeRenamePopup}
  104. top={popupY - 124 + 40}
  105. ></RenamePopup>
  106. )}
  107. </div>
  108. );
  109. };