file-tree-modal-error.tsx 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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">{errorMessage()}</div>
  66. </OLModalBody>
  67. <OLModalFooter>
  68. <OLButton onClick={handleHide} variant="primary">
  69. {t('ok')}
  70. </OLButton>
  71. </OLModalFooter>
  72. </OLModal>
  73. )
  74. }
  75. export default FileTreeModalError