// @flow
import clsx from 'clsx';
import React, { useEffect } from 'react';
import { useDispatch } from 'react-redux';
import { Icon, IconConnection, IconConnectionInactive } from '../../../base/icons';
import { JitsiTrackEvents } from '../../../base/lib-jitsi-meet';
import { trackStreamingStatusChanged } from '../../../base/tracks';
type Props = {
/**
* An object containing the CSS classes.
*/
classes: Object,
/**
* A CSS class that interprets the current connection status as a color.
*/
colorClass: string,
/**
* Disable/enable inactive indicator.
*/
connectionIndicatorInactiveDisabled: boolean,
/**
* JitsiTrack instance.
*/
track: Object,
/**
* Whether or not the connection status is inactive.
*/
isConnectionStatusInactive: boolean,
/**
* Whether or not the connection status is interrupted.
*/
isConnectionStatusInterrupted: boolean,
}
export const ConnectionIndicatorIcon = ({
classes,
colorClass,
connectionIndicatorInactiveDisabled,
isConnectionStatusInactive,
isConnectionStatusInterrupted,
track
}: Props) => {
const dispatch = useDispatch();
const sourceName = track?.jitsiTrack?.getSourceName();
const handleTrackStreamingStatusChanged = (jitsiTrack, streamingStatus) => {
dispatch(trackStreamingStatusChanged(jitsiTrack, streamingStatus));
};
// TODO: replace this with a custom hook to be reused where track streaming status is needed.
// TODO: In the hood the listener should updates a local track streaming status instead of that in redux store.
useEffect(() => {
if (track && !track.local) {
track.jitsiTrack.on(JitsiTrackEvents.TRACK_STREAMING_STATUS_CHANGED, handleTrackStreamingStatusChanged);
dispatch(trackStreamingStatusChanged(track.jitsiTrack, track.jitsiTrack.getTrackStreamingStatus?.()));
}
return () => {
if (track && !track.local) {
track.jitsiTrack.off(
JitsiTrackEvents.TRACK_STREAMING_STATUS_CHANGED,
handleTrackStreamingStatusChanged
);
dispatch(trackStreamingStatusChanged(track.jitsiTrack, track.jitsiTrack.getTrackStreamingStatus?.()));
}
};
}, [ sourceName ]);
if (isConnectionStatusInactive) {
if (connectionIndicatorInactiveDisabled) {
return null;
}
return (
);
}
let emptyIconWrapperClassName = 'connection_empty';
if (isConnectionStatusInterrupted) {
// emptyIconWrapperClassName is used by the torture tests to identify lost connection status handling.
emptyIconWrapperClassName = 'connection_lost';
}
return (
);
};