file-tree-doc.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import PropTypes from 'prop-types'
  2. import { useSelectableEntity } from '../contexts/file-tree-selectable'
  3. import FileTreeItemInner from './file-tree-item/file-tree-item-inner'
  4. import { useTranslation } from 'react-i18next'
  5. import Icon from '../../../shared/components/icon'
  6. import iconTypeFromName from '../util/icon-type-from-name'
  7. import classnames from 'classnames'
  8. function FileTreeDoc({ name, id, isFile, isLinkedFile }) {
  9. const { isSelected, props: selectableEntityProps } = useSelectableEntity(
  10. id,
  11. isFile
  12. )
  13. return (
  14. <li
  15. role="treeitem"
  16. {...selectableEntityProps}
  17. aria-label={name}
  18. tabIndex="0"
  19. >
  20. <FileTreeItemInner
  21. id={id}
  22. name={name}
  23. isSelected={isSelected}
  24. icons={<FileTreeIcon isLinkedFile={isLinkedFile} name={name} />}
  25. />
  26. </li>
  27. )
  28. }
  29. FileTreeDoc.propTypes = {
  30. name: PropTypes.string.isRequired,
  31. id: PropTypes.string.isRequired,
  32. isFile: PropTypes.bool,
  33. isLinkedFile: PropTypes.bool,
  34. }
  35. export const FileTreeIcon = ({ isLinkedFile, name }) => {
  36. const { t } = useTranslation()
  37. const className = classnames('spaced', { 'linked-file-icon': isLinkedFile })
  38. return (
  39. <>
  40. &nbsp;
  41. <Icon type={iconTypeFromName(name)} fw className={className} />
  42. {isLinkedFile && (
  43. <Icon
  44. type="external-link-square"
  45. modifier="rotate-180"
  46. className="linked-file-highlight"
  47. accessibilityLabel={t('linked_file')}
  48. />
  49. )}
  50. </>
  51. )
  52. }
  53. FileTreeIcon.propTypes = {
  54. name: PropTypes.string.isRequired,
  55. isLinkedFile: PropTypes.bool,
  56. }
  57. export default FileTreeDoc