file-tree-folder.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import React, { useState } from 'react'
  2. import PropTypes from 'prop-types'
  3. import { useTranslation } from 'react-i18next'
  4. import classNames from 'classnames'
  5. import Icon from '../../../shared/components/icon'
  6. import { useSelectableEntity } from '../contexts/file-tree-selectable'
  7. import { useDroppable } from '../contexts/file-tree-draggable'
  8. import FileTreeItemInner from './file-tree-item/file-tree-item-inner'
  9. import FileTreeFolderList from './file-tree-folder-list'
  10. function FileTreeFolder({ name, id, folders, docs, files }) {
  11. const { t } = useTranslation()
  12. const { isSelected, props: selectableEntityProps } = useSelectableEntity(id)
  13. const [expanded, setExpanded] = useState(false)
  14. function handleExpandCollapseClick() {
  15. setExpanded(!expanded)
  16. }
  17. const { isOver: isOverRoot, dropRef: dropRefRoot } = useDroppable(id)
  18. const { isOver: isOverList, dropRef: dropRefList } = useDroppable(id)
  19. const icons = (
  20. <>
  21. <button
  22. onClick={handleExpandCollapseClick}
  23. aria-label={expanded ? t('collapse') : t('expand')}
  24. >
  25. <Icon type={expanded ? 'angle-down' : 'angle-right'} modifier="fw" />
  26. </button>
  27. <Icon type={expanded ? 'folder-open' : 'folder'} modifier="fw" />
  28. </>
  29. )
  30. return (
  31. <>
  32. <li
  33. role="treeitem"
  34. {...selectableEntityProps}
  35. aria-expanded={expanded}
  36. aria-label={name}
  37. tabIndex="0"
  38. ref={dropRefRoot}
  39. className={classNames(selectableEntityProps.className, {
  40. 'dnd-droppable-hover': isOverRoot || isOverList
  41. })}
  42. >
  43. <FileTreeItemInner
  44. id={id}
  45. name={name}
  46. isSelected={isSelected}
  47. icons={icons}
  48. />
  49. </li>
  50. {expanded ? (
  51. <FileTreeFolderList
  52. folders={folders}
  53. docs={docs}
  54. files={files}
  55. dropRef={dropRefList}
  56. />
  57. ) : null}
  58. </>
  59. )
  60. }
  61. FileTreeFolder.propTypes = {
  62. name: PropTypes.string.isRequired,
  63. id: PropTypes.string.isRequired,
  64. folders: PropTypes.array.isRequired,
  65. docs: PropTypes.array.isRequired,
  66. files: PropTypes.array.isRequired
  67. }
  68. export default FileTreeFolder