file-tree-modal-error.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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}>{t('ok')}</Button>
  63. </Modal.Footer>
  64. </Modal>
  65. )
  66. }
  67. export default FileTreeModalError