file-tree-doc.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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, isLinkedFile }) {
  9. const { isSelected, props: selectableEntityProps } = useSelectableEntity(id)
  10. return (
  11. <li
  12. role="treeitem"
  13. {...selectableEntityProps}
  14. aria-label={name}
  15. tabIndex="0"
  16. >
  17. <FileTreeItemInner
  18. id={id}
  19. name={name}
  20. isSelected={isSelected}
  21. icons={<FileTreeIcon isLinkedFile={isLinkedFile} name={name} />}
  22. />
  23. </li>
  24. )
  25. }
  26. FileTreeDoc.propTypes = {
  27. name: PropTypes.string.isRequired,
  28. id: PropTypes.string.isRequired,
  29. isLinkedFile: PropTypes.bool,
  30. }
  31. export const FileTreeIcon = ({ isLinkedFile, name }) => {
  32. const { t } = useTranslation()
  33. const className = classnames('spaced', { 'linked-file-icon': isLinkedFile })
  34. return (
  35. <>
  36. &nbsp;
  37. <Icon type={iconTypeFromName(name)} fw className={className} />
  38. {isLinkedFile && (
  39. <Icon
  40. type="external-link-square"
  41. modifier="rotate-180"
  42. className="linked-file-highlight"
  43. accessibilityLabel={t('linked_file')}
  44. />
  45. )}
  46. </>
  47. )
  48. }
  49. FileTreeIcon.propTypes = {
  50. name: PropTypes.string.isRequired,
  51. isLinkedFile: PropTypes.bool,
  52. }
  53. export default FileTreeDoc