file-tree-modal-error.js 2.0 KB

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