import React, { useEffect } from 'react';
import { useDispatch } from 'react-redux';
import { makeStyles } from 'tss-react/mui';
import Icon from '../../../base/icons/components/Icon';
import { IconConnection, IconConnectionInactive } from '../../../base/icons/svg';
import { JitsiTrackEvents } from '../../../base/lib-jitsi-meet';
import { trackStreamingStatusChanged } from '../../../base/tracks/actions.web';
import { ITrack } from '../../../base/tracks/types';
interface IProps {
/**
* An object containing the CSS classes.
*/
classes: any;
/**
* A CSS class that interprets the current connection status as a color.
*/
colorClass: string;
/**
* Disable/enable inactive indicator.
*/
connectionIndicatorInactiveDisabled: boolean;
/**
* Whether or not the connection status is inactive.
*/
isConnectionStatusInactive: boolean;
/**
* Whether or not the connection status is interrupted.
*/
isConnectionStatusInterrupted?: boolean;
/**
* JitsiTrack instance.
*/
track?: ITrack;
}
const useStyles = makeStyles()(() => {
return {};
});
export const ConnectionIndicatorIcon = ({
classes,
colorClass,
connectionIndicatorInactiveDisabled,
isConnectionStatusInactive,
isConnectionStatusInterrupted,
track
}: IProps) => {
const { cx } = useStyles();
const dispatch = useDispatch();
const sourceName = track?.jitsiTrack?.getSourceName();
const handleTrackStreamingStatusChanged = (jitsiTrack: any, streamingStatus: string) => {
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 (
);
};