import React, { useEffect } from 'react'; import { defineMessages, useIntl } from 'react-intl'; import { isEmpty } from 'radash'; import MeetingRemainingTime from '/imports/ui/components/common/remaining-time/meeting-duration/component'; import { useReactiveVar } from '@apollo/client'; import { layoutSelectInput, layoutDispatch } from '../layout/context'; import { ACTIONS } from '../layout/enums'; import NotificationsBar from './component'; import connectionStatus from '../../core/graphql/singletons/connectionStatus'; import useMeeting from '../../core/hooks/useMeeting'; // disconnected and trying to open a new connection const intlMessages = defineMessages({ failedMessage: { id: 'app.failedMessage', description: 'Notification for connecting to server problems', }, connectingMessage: { id: 'app.connectingMessage', description: 'Notification message for when client is connecting to server', }, waitingMessage: { id: 'app.waitingMessage', description: 'Notification message for disconnection with reconnection counter', }, reconnectingMessage: { id: 'app.reconnectingMessage', description: 'Notification message for disconnection', }, calculatingBreakoutTimeRemaining: { id: 'app.calculatingBreakoutTimeRemaining', description: 'Message that tells that the remaining time is being calculated', }, alertMeetingEndsUnderMinutes: { id: 'app.meeting.alertMeetingEndsUnderMinutes', description: 'Alert that tells that the meeting ends under x minutes', }, alertBreakoutEndsUnderMinutes: { id: 'app.meeting.alertBreakoutEndsUnderMinutes', description: 'Alert that tells that the breakout ends under x minutes', }, serverIsNotResponding: { id: 'app.serverIsNotResponding', description: 'Alert that tells that server is not responding', }, serverIsSlow: { id: 'app.serverIsSlow', description: 'Alert that tells that server is slow', }, }); const NotificationsBarContainer = () => { const data = {}; data.alert = true; data.color = 'primary'; const intl = useIntl(); const connected = useReactiveVar(connectionStatus.getConnectedStatusVar()); const serverIsResponding = useReactiveVar(connectionStatus.getServerIsRespondingVar()); const pingIsComing = useReactiveVar(connectionStatus.getPingIsComingVar()); const lastRttRequestSuccess = useReactiveVar(connectionStatus.getLastRttRequestSuccessVar()); // if connection failed x attempts a error will be thrown if ( !connected || !serverIsResponding || !pingIsComing ) { data.color = 'primary'; data.message = ( <> {!connected && intl.formatMessage(intlMessages.reconnectingMessage)} {(connected && !serverIsResponding && lastRttRequestSuccess) && intl.formatMessage(intlMessages.serverIsNotResponding)} {(connected && (!pingIsComing || !lastRttRequestSuccess)) && intl.formatMessage(intlMessages.serverIsSlow)} ); } const { data: meeting } = useMeeting((m) => ({ isBreakout: m.isBreakout, componentsFlags: m.componentsFlags, })); if (meeting?.isBreakout) { data.message = ( ); } if (meeting) { const { isBreakout, componentsFlags } = meeting; if (componentsFlags.showRemainingTime && !isBreakout) { data.message = ( ); } } const notificationsBar = layoutSelectInput((i) => i.notificationsBar); const layoutContextDispatch = layoutDispatch(); const { hasNotification } = notificationsBar; useEffect(() => { const localHasNotification = !!data.message; if (localHasNotification !== hasNotification) { layoutContextDispatch({ type: ACTIONS.SET_HAS_NOTIFICATIONS_BAR, value: localHasNotification, }); } }, [data.message, hasNotification]); if (isEmpty(data.message)) { return null; } return ( {data.message} ); }; export default NotificationsBarContainer;