force-disconnected.tsx 1.7 KB

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