file-tree-toolbar.jsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import PropTypes from 'prop-types'
  2. import { useTranslation } from 'react-i18next'
  3. import * as eventTracking from '../../../infrastructure/event-tracking'
  4. import { Button } from 'react-bootstrap'
  5. import Tooltip from '../../../shared/components/tooltip'
  6. import Icon from '../../../shared/components/icon'
  7. import { useEditorContext } from '../../../shared/context/editor-context'
  8. import { useFileTreeActionable } from '../contexts/file-tree-actionable'
  9. function FileTreeToolbar() {
  10. const { permissionsLevel } = useEditorContext(editorContextPropTypes)
  11. if (permissionsLevel === 'readOnly') return null
  12. return (
  13. <div className="toolbar toolbar-filetree">
  14. <FileTreeToolbarLeft />
  15. <FileTreeToolbarRight />
  16. </div>
  17. )
  18. }
  19. const editorContextPropTypes = {
  20. permissionsLevel: PropTypes.oneOf(['readOnly', 'readAndWrite', 'owner']),
  21. }
  22. function FileTreeToolbarLeft() {
  23. const { t } = useTranslation()
  24. const {
  25. canCreate,
  26. startCreatingFolder,
  27. startCreatingDocOrFile,
  28. startUploadingDocOrFile,
  29. } = useFileTreeActionable()
  30. const createWithAnalytics = () => {
  31. eventTracking.sendMB('new-file-click', { location: 'toolbar' })
  32. startCreatingDocOrFile()
  33. }
  34. const uploadWithAnalytics = () => {
  35. eventTracking.sendMB('upload-click', { location: 'toolbar' })
  36. startUploadingDocOrFile()
  37. }
  38. if (!canCreate) return null
  39. return (
  40. <div className="toolbar-left">
  41. <Tooltip
  42. id="new-file"
  43. description={t('new_file')}
  44. overlayProps={{ placement: 'bottom' }}
  45. >
  46. <Button onClick={createWithAnalytics} bsStyle={null}>
  47. <Icon type="file" fw accessibilityLabel={t('new_file')} />
  48. </Button>
  49. </Tooltip>
  50. <Tooltip
  51. id="new-folder"
  52. description={t('new_folder')}
  53. overlayProps={{ placement: 'bottom' }}
  54. >
  55. <Button onClick={startCreatingFolder} bsStyle={null}>
  56. <Icon type="folder" fw accessibilityLabel={t('new_folder')} />
  57. </Button>
  58. </Tooltip>
  59. <Tooltip
  60. id="upload"
  61. description={t('upload')}
  62. overlayProps={{ placement: 'bottom' }}
  63. >
  64. <Button onClick={uploadWithAnalytics}>
  65. <Icon type="upload" fw accessibilityLabel={t('upload')} />
  66. </Button>
  67. </Tooltip>
  68. </div>
  69. )
  70. }
  71. function FileTreeToolbarRight() {
  72. const { t } = useTranslation()
  73. const { canRename, canDelete, startRenaming, startDeleting } =
  74. useFileTreeActionable()
  75. if (!canRename && !canDelete) {
  76. return null
  77. }
  78. return (
  79. <div className="toolbar-right">
  80. {canRename ? (
  81. <Tooltip
  82. id="rename"
  83. description={t('rename')}
  84. overlayProps={{ placement: 'bottom' }}
  85. >
  86. <Button onClick={startRenaming}>
  87. <Icon type="pencil" fw accessibilityLabel={t('rename')} />
  88. </Button>
  89. </Tooltip>
  90. ) : null}
  91. {canDelete ? (
  92. <Tooltip
  93. id="delete"
  94. description={t('delete')}
  95. overlayProps={{ placement: 'bottom' }}
  96. >
  97. <Button onClick={startDeleting}>
  98. <Icon type="trash-o" fw accessibilityLabel={t('delete')} />
  99. </Button>
  100. </Tooltip>
  101. ) : null}
  102. </div>
  103. )
  104. }
  105. export default FileTreeToolbar