force-disconnected.tsx 1.8 KB

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