Files
overleaf-cep/services/web/frontend/js/features/ide-react/components/alerts/alerts.tsx
Jimmy Domagala-Tang 07166bff73 feat: add in-editor notification when rolling image has updated (#28529)
GitOrigin-RevId: 771773ba1914ef609b6ac84799bdda2d7ae4affa
2025-09-25 08:05:39 +00:00

85 lines
2.5 KiB
TypeScript

import { useTranslation } from 'react-i18next'
import { LostConnectionAlert } from './lost-connection-alert'
import { useConnectionContext } from '@/features/ide-react/context/connection-context'
import { debugging } from '@/utils/debugging'
import { ElementType } from 'react'
import { createPortal } from 'react-dom'
import { useGlobalAlertsContainer } from '@/features/ide-react/context/global-alerts-context'
import OLNotification from '@/shared/components/ol/ol-notification'
import importOverleafModules from '../../../../../macros/import-overleaf-module.macro'
const rollingBuildsUpdatedAlert: Array<{
import: { default: ElementType }
path: string
}> = importOverleafModules('rollingBuildsUpdatedAlert')
export function Alerts() {
const { t } = useTranslation()
const {
connectionState,
isConnected,
isStillReconnecting,
tryReconnectNow,
secondsUntilReconnect,
} = useConnectionContext()
const globalAlertsContainer = useGlobalAlertsContainer()
if (!globalAlertsContainer) {
return null
}
return createPortal(
<>
{rollingBuildsUpdatedAlert.map(
({ import: { default: Component }, path }) => (
<Component key={path} />
)
)}
{connectionState.forceDisconnected &&
// hide "disconnected" banner when displaying out of sync modal
connectionState.error !== 'out-of-sync' ? (
<OLNotification
type="error"
content={<strong>{t('disconnected')}</strong>}
/>
) : null}
{connectionState.reconnectAt ? (
<LostConnectionAlert
reconnectAt={connectionState.reconnectAt}
tryReconnectNow={tryReconnectNow}
/>
) : null}
{isStillReconnecting ? (
<OLNotification
type="warning"
content={<strong>{t('reconnecting')}</strong>}
/>
) : null}
{connectionState.inactiveDisconnect ||
(connectionState.readyState === WebSocket.CLOSED &&
(connectionState.error === 'rate-limited' ||
connectionState.error === 'unable-to-connect') &&
!secondsUntilReconnect()) ? (
<OLNotification
type="warning"
content={
<strong>{t('editor_disconected_click_to_reconnect')}</strong>
}
/>
) : null}
{debugging ? (
<OLNotification
type="warning"
content={<strong>Connected: {isConnected.toString()}</strong>}
/>
) : null}
</>,
globalAlertsContainer
)
}