force-disconnected.tsx 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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 '@/shared/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 (
  17. connectionState.forceDisconnected &&
  18. // out of sync has its own modal
  19. connectionState.error !== 'out-of-sync'
  20. ) {
  21. setShow(true)
  22. }
  23. }, [connectionState.forceDisconnected, connectionState.error])
  24. useEffect(() => {
  25. if (connectionState.forceDisconnected) {
  26. setSecondsUntilRefresh(connectionState.forcedDisconnectDelay)
  27. }
  28. }, [connectionState.forceDisconnected, connectionState.forcedDisconnectDelay])
  29. useEffect(() => {
  30. if (show) {
  31. const timer = window.setInterval(() => {
  32. setSecondsUntilRefresh(seconds => Math.max(0, seconds - 1))
  33. }, 1000)
  34. return () => {
  35. window.clearInterval(timer)
  36. }
  37. }
  38. }, [show])
  39. if (!show) {
  40. return null
  41. }
  42. return (
  43. <OLModal
  44. show
  45. // It's not possible to hide this modal, but it's a required prop
  46. onHide={() => {}}
  47. className="lock-editor-modal"
  48. backdrop={false}
  49. keyboard={false}
  50. >
  51. <OLModalHeader>
  52. <OLModalTitle>{t('please_wait')}</OLModalTitle>
  53. </OLModalHeader>
  54. <OLModalBody>
  55. {t('were_performing_maintenance', { seconds: secondsUntilRefresh })}
  56. </OLModalBody>
  57. </OLModal>
  58. )
  59. }
  60. export default memo(ForceDisconnected)