file-tree-modal-error.tsx 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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 {
  10. OLModal,
  11. OLModalBody,
  12. OLModalFooter,
  13. OLModalHeader,
  14. OLModalTitle,
  15. } from '@/shared/components/ol/ol-modal'
  16. import OLButton from '@/shared/components/ol/ol-button'
  17. function FileTreeModalError() {
  18. const { t } = useTranslation()
  19. const { isRenaming, isMoving, cancel, error } = useFileTreeActionable()
  20. // the modal will not be rendered; return early
  21. if (!error) return null
  22. if (!isRenaming && !isMoving) return null
  23. function handleHide() {
  24. cancel()
  25. }
  26. function errorTitle() {
  27. switch (error.constructor) {
  28. case DuplicateFilenameError:
  29. case DuplicateFilenameMoveError:
  30. return t('duplicate_file')
  31. case InvalidFilenameError:
  32. case BlockedFilenameError:
  33. return t('invalid_file_name')
  34. default:
  35. return t('error')
  36. }
  37. }
  38. function errorMessage() {
  39. switch (error.constructor) {
  40. case DuplicateFilenameError:
  41. return t('file_already_exists')
  42. case DuplicateFilenameMoveError:
  43. return (
  44. <Trans
  45. i18nKey="file_already_exists_in_this_location"
  46. components={[<strong />]} // eslint-disable-line react/jsx-key
  47. values={{ fileName: error.entityName }}
  48. shouldUnescape
  49. tOptions={{ interpolation: { escapeValue: true } }}
  50. />
  51. )
  52. case InvalidFilenameError:
  53. return t('files_cannot_include_invalid_characters')
  54. case BlockedFilenameError:
  55. return t('blocked_filename')
  56. default:
  57. return t('generic_something_went_wrong')
  58. }
  59. }
  60. return (
  61. <OLModal show onHide={handleHide}>
  62. <OLModalHeader>
  63. <OLModalTitle>{errorTitle()}</OLModalTitle>
  64. </OLModalHeader>
  65. <OLModalBody>
  66. <div role="alert">{errorMessage()}</div>
  67. </OLModalBody>
  68. <OLModalFooter>
  69. <OLButton onClick={handleHide} variant="primary">
  70. {t('ok')}
  71. </OLButton>
  72. </OLModalFooter>
  73. </OLModal>
  74. )
  75. }
  76. export default FileTreeModalError