file-tree-modal-error.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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. />
  42. )
  43. case InvalidFilenameError:
  44. return t('files_cannot_include_invalid_characters')
  45. case BlockedFilenameError:
  46. return t('blocked_filename')
  47. default:
  48. return t('generic_something_went_wrong')
  49. }
  50. }
  51. return (
  52. <Modal show onHide={handleHide}>
  53. <Modal.Header>
  54. <Modal.Title>{errorTitle()}</Modal.Title>
  55. </Modal.Header>
  56. <Modal.Body>
  57. <div role="alert" aria-label={errorMessage()}>
  58. {errorMessage()}
  59. </div>
  60. </Modal.Body>
  61. <Modal.Footer>
  62. <Button onClick={handleHide} bsStyle="primary">
  63. {t('ok')}
  64. </Button>
  65. </Modal.Footer>
  66. </Modal>
  67. )
  68. }
  69. export default FileTreeModalError