BookmarkFolderMenuItem.tsx 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import React, { useCallback, useEffect, useState } from 'react';
  2. import {
  3. DropdownItem, DropdownMenu, DropdownToggle, Dropdown,
  4. } from 'reactstrap';
  5. import { BookmarkFolderItems } from '~/interfaces/bookmark-info';
  6. import { useSWRxBookamrkFolderAndChild } from '~/stores/bookmark-folder';
  7. import TriangleIcon from '../Icons/TriangleIcon';
  8. type Props ={
  9. item: BookmarkFolderItems
  10. }
  11. const BookmarkFolderMenuItem = (props: Props):JSX.Element => {
  12. const { item } = props;
  13. const [isOpen, setIsOpen] = useState(false);
  14. const { data: childFolders, mutate: mutateChildFolders } = useSWRxBookamrkFolderAndChild(item._id);
  15. useEffect(() => {
  16. if (isOpen) {
  17. mutateChildFolders();
  18. }
  19. }, [isOpen, mutateChildFolders]);
  20. const onMouseEnterHandler = useCallback(() => {
  21. setIsOpen(true);
  22. }, []);
  23. const onMouseLeaveHandler = useCallback(() => {
  24. setIsOpen(false);
  25. }, []);
  26. const toggleHandler = useCallback(() => {
  27. setIsOpen(!isOpen);
  28. }, [isOpen]);
  29. return (
  30. <Dropdown direction="right"
  31. onMouseOver={onMouseEnterHandler} onMouseLeave={onMouseLeaveHandler} isOpen={isOpen} toggle={toggleHandler}>
  32. <DropdownToggle color="transparent" className={'border-0 px-0 d-flex justify-content-between'} style={{ minWidth: '100%' }}>
  33. {item.name}
  34. <span className='pl-2'>
  35. <TriangleIcon/>
  36. </span>
  37. </DropdownToggle>
  38. { childFolders != null
  39. && (<DropdownMenu className='rounded-0 py-1 m-0'>
  40. {childFolders?.map(child => (
  41. <div key={child._id} >
  42. {child.children.length > 0 ? (
  43. <div className='dropdown-item' tabIndex={0} role="menuitem">
  44. <BookmarkFolderMenuItem item={child} />
  45. </div>
  46. ) : (
  47. <DropdownItem toggle={false}>
  48. {child.name}
  49. </DropdownItem>
  50. )}
  51. </div>
  52. ))}
  53. </DropdownMenu>
  54. )
  55. }
  56. </Dropdown>
  57. );
  58. };
  59. export default BookmarkFolderMenuItem;