file-tree-modal-error.jsx 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import { Trans, useTranslation } from 'react-i18next'
  2. import { useFileTreeActionable } from '../../contexts/file-tree-actionable'
  3. import {
  4. InvalidFilenameError,
  5. BlockedFilenameError,
  6. DuplicateFilenameError,
  7. DuplicateFilenameMoveError,
  8. } from '../../errors'
  9. import OLModal, {
  10. OLModalBody,
  11. OLModalFooter,
  12. OLModalHeader,
  13. OLModalTitle,
  14. } from '@/shared/components/ol/ol-modal'
  15. import OLButton from '@/shared/components/ol/ol-button'
  16. function FileTreeModalError() {
  17. const { t } = useTranslation()
  18. const { isRenaming, isMoving, cancel, error } = useFileTreeActionable()
  19. // the modal will not be rendered; return early
  20. if (!error) return null
  21. if (!isRenaming && !isMoving) return null
  22. function handleHide() {
  23. cancel()
  24. }
  25. function errorTitle() {
  26. switch (error.constructor) {
  27. case DuplicateFilenameError:
  28. case DuplicateFilenameMoveError:
  29. return t('duplicate_file')
  30. case InvalidFilenameError:
  31. case BlockedFilenameError:
  32. return t('invalid_file_name')
  33. default:
  34. return t('error')
  35. }
  36. }
  37. function errorMessage() {
  38. switch (error.constructor) {
  39. case DuplicateFilenameError:
  40. return t('file_already_exists')
  41. case DuplicateFilenameMoveError:
  42. return (
  43. <Trans
  44. i18nKey="file_already_exists_in_this_location"
  45. components={[<strong />]} // eslint-disable-line react/jsx-key
  46. values={{ fileName: error.entityName }}
  47. shouldUnescape
  48. tOptions={{ interpolation: { escapeValue: true } }}
  49. />
  50. )
  51. case InvalidFilenameError:
  52. return t('files_cannot_include_invalid_characters')
  53. case BlockedFilenameError:
  54. return t('blocked_filename')
  55. default:
  56. return t('generic_something_went_wrong')
  57. }
  58. }
  59. return (
  60. <OLModal show onHide={handleHide}>
  61. <OLModalHeader>
  62. <OLModalTitle>{errorTitle()}</OLModalTitle>
  63. </OLModalHeader>
  64. <OLModalBody>
  65. <div role="alert" aria-label={errorMessage()}>
  66. {errorMessage()}
  67. </div>
  68. </OLModalBody>
  69. <OLModalFooter>
  70. <OLButton onClick={handleHide} variant="primary">
  71. {t('ok')}
  72. </OLButton>
  73. </OLModalFooter>
  74. </OLModal>
  75. )
  76. }
  77. export default FileTreeModalError