file-tree-modal-error.jsx 2.1 KB

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