force-disconnected.tsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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. setSecondsUntilRefresh(connectionState.forcedDisconnectDelay)
  16. }
  17. }, [connectionState])
  18. useEffect(() => {
  19. if (show) {
  20. const timer = window.setInterval(() => {
  21. setSecondsUntilRefresh(seconds => Math.max(0, seconds - 1))
  22. }, 1000)
  23. return () => {
  24. window.clearInterval(timer)
  25. }
  26. }
  27. }, [show])
  28. if (!show) {
  29. return null
  30. }
  31. return (
  32. <AccessibleModal
  33. show
  34. // It's not possible to hide this modal, but it's a required prop
  35. onHide={() => {}}
  36. className="lock-editor-modal"
  37. backdrop={false}
  38. keyboard={false}
  39. >
  40. <Modal.Header>
  41. <Modal.Title>{t('please_wait')}</Modal.Title>
  42. </Modal.Header>
  43. <Modal.Body>
  44. {t('were_performing_maintenance', { seconds: secondsUntilRefresh })}
  45. </Modal.Body>
  46. </AccessibleModal>
  47. )
  48. }
  49. export default memo(ForceDisconnected)