file-tree-modal-error.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import React from 'react'
  2. import { Button, Modal } from 'react-bootstrap'
  3. import { useTranslation } from 'react-i18next'
  4. import { useFileTreeActionable } from '../../contexts/file-tree-actionable'
  5. import { InvalidFilenameError, DuplicateFilenameError } from '../../errors'
  6. function FileTreeModalError() {
  7. const { t } = useTranslation()
  8. const { isRenaming, cancel, error } = useFileTreeActionable()
  9. if (!isRenaming || !error) return null // the modal will not be rendered; return early
  10. function handleHide() {
  11. cancel()
  12. }
  13. function errorTitle() {
  14. switch (error.constructor) {
  15. case DuplicateFilenameError:
  16. return t('duplicate_file')
  17. case InvalidFilenameError:
  18. return t('invalid_file_name')
  19. default:
  20. return t('error')
  21. }
  22. }
  23. function errorMessage() {
  24. switch (error.constructor) {
  25. case DuplicateFilenameError:
  26. return t('file_already_exists')
  27. case InvalidFilenameError:
  28. return t('files_cannot_include_invalid_characters')
  29. default:
  30. return t('generic_something_went_wrong')
  31. }
  32. }
  33. return (
  34. <Modal show onHide={handleHide}>
  35. <Modal.Header>
  36. <Modal.Title>{errorTitle()}</Modal.Title>
  37. </Modal.Header>
  38. <Modal.Body>
  39. <div role="alert" aria-label={errorMessage()}>
  40. {errorMessage()}
  41. </div>
  42. </Modal.Body>
  43. <Modal.Footer>
  44. <Button onClick={handleHide}>{t('ok')}</Button>
  45. </Modal.Footer>
  46. </Modal>
  47. )
  48. }
  49. export default FileTreeModalError