error-boundary-fallback.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import PropTypes from 'prop-types'
  2. import { Alert } from 'react-bootstrap'
  3. import { Trans, useTranslation } from 'react-i18next'
  4. import { useState } from 'react'
  5. import importOverleafModules from '../../../../macros/import-overleaf-module.macro'
  6. const [contactUsModalModules] = importOverleafModules('contactUsModal')
  7. const ContactUsModal = contactUsModalModules?.import.default
  8. function ErrorBoundaryFallback({ type }) {
  9. const { t } = useTranslation()
  10. const [showContactUsModal, setShowContactUsModal] = useState(false)
  11. function handleContactUsClick() {
  12. setShowContactUsModal(true)
  13. }
  14. function handleContactUsModalHide() {
  15. setShowContactUsModal(false)
  16. }
  17. if (!ContactUsModal) {
  18. return (
  19. <div className="pdf-error-alert">
  20. <Alert bsStyle="danger">
  21. {`${t('generic_something_went_wrong')}. ${t('please_refresh')}`}
  22. </Alert>
  23. </div>
  24. )
  25. }
  26. // we create each instance of `<Trans/>` individually so `i18next-scanner` can detect hardcoded `i18nKey` values
  27. let content
  28. if (type === 'pdf') {
  29. content = (
  30. <>
  31. <p>{t('pdf_viewer_error')}</p>
  32. <p>
  33. <Trans
  34. i18nKey="try_recompile_project"
  35. components={[<a href="#" onClick={handleContactUsClick} />]} // eslint-disable-line react/jsx-key, jsx-a11y/anchor-has-content, jsx-a11y/anchor-is-valid
  36. />
  37. </p>
  38. </>
  39. )
  40. } else if (type === 'logs') {
  41. content = (
  42. <>
  43. <p>{t('log_viewer_error')}</p>
  44. <p>
  45. <Trans
  46. i18nKey="try_recompile_project"
  47. components={[<a href="#" onClick={handleContactUsClick} />]} // eslint-disable-line react/jsx-key, jsx-a11y/anchor-has-content, jsx-a11y/anchor-is-valid
  48. />
  49. </p>
  50. </>
  51. )
  52. } else {
  53. content = (
  54. <>
  55. <p>{t('pdf_preview_error')}</p>
  56. <p>
  57. <Trans
  58. i18nKey="try_refresh_page"
  59. components={[<a href="#" onClick={handleContactUsClick} />]} // eslint-disable-line react/jsx-key, jsx-a11y/anchor-has-content, jsx-a11y/anchor-is-valid
  60. />
  61. </p>
  62. </>
  63. )
  64. }
  65. return (
  66. <div className="pdf-error-alert">
  67. <Alert bsStyle="danger">{content}</Alert>
  68. <ContactUsModal
  69. show={showContactUsModal}
  70. handleHide={handleContactUsModalHide}
  71. />
  72. </div>
  73. )
  74. }
  75. ErrorBoundaryFallback.propTypes = {
  76. type: PropTypes.oneOf(['preview', 'pdf', 'logs']).isRequired,
  77. }
  78. export default ErrorBoundaryFallback