force-disconnected.tsx 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import { useTranslation } from 'react-i18next'
  2. import { Modal } from 'react-bootstrap'
  3. import AccessibleModal from '@/shared/components/accessible-modal'
  4. import { memo, useEffect, useState } from 'react'
  5. import { useConnectionContext } from '@/features/ide-react/context/connection-context'
  6. // show modal when editor is forcefully disconnected
  7. function ForceDisconnected() {
  8. const { connectionState } = useConnectionContext()
  9. const { t } = useTranslation()
  10. const [secondsUntilRefresh, setSecondsUntilRefresh] = useState(0)
  11. const [show, setShow] = useState(false)
  12. useEffect(() => {
  13. if (connectionState.forceDisconnected) {
  14. setShow(true)
  15. }
  16. }, [connectionState.forceDisconnected])
  17. useEffect(() => {
  18. if (connectionState.forceDisconnected) {
  19. setSecondsUntilRefresh(connectionState.forcedDisconnectDelay)
  20. }
  21. }, [connectionState.forceDisconnected, connectionState.forcedDisconnectDelay])
  22. useEffect(() => {
  23. if (show) {
  24. const timer = window.setInterval(() => {
  25. setSecondsUntilRefresh(seconds => Math.max(0, seconds - 1))
  26. }, 1000)
  27. return () => {
  28. window.clearInterval(timer)
  29. }
  30. }
  31. }, [show])
  32. if (!show) {
  33. return null
  34. }
  35. return (
  36. <AccessibleModal
  37. show
  38. // It's not possible to hide this modal, but it's a required prop
  39. onHide={() => {}}
  40. className="lock-editor-modal"
  41. backdrop={false}
  42. keyboard={false}
  43. >
  44. <Modal.Header>
  45. <Modal.Title>{t('please_wait')}</Modal.Title>
  46. </Modal.Header>
  47. <Modal.Body>
  48. {t('were_performing_maintenance', { seconds: secondsUntilRefresh })}
  49. </Modal.Body>
  50. </AccessibleModal>
  51. )
  52. }
  53. export default memo(ForceDisconnected)