168 lines
5.3 KiB
TypeScript
168 lines
5.3 KiB
TypeScript
/* eslint-disable lines-around-comment */
|
|
import { makeStyles } from '@material-ui/styles';
|
|
import clsx from 'clsx';
|
|
import React from 'react';
|
|
import { useSelector } from 'react-redux';
|
|
|
|
import { IState } from '../../../app/types';
|
|
// @ts-ignore
|
|
import { getMultipleVideoSupportFeatureFlag } from '../../../base/config';
|
|
import { isMobileBrowser } from '../../../base/environment/utils';
|
|
// @ts-ignore
|
|
import ConnectionIndicator from '../../../connection-indicator/components/web/ConnectionIndicator';
|
|
import { STATS_POPOVER_POSITION, THUMBNAIL_TYPE } from '../../constants';
|
|
// @ts-ignore
|
|
import { getIndicatorsTooltipPosition } from '../../functions.web';
|
|
|
|
// @ts-ignore
|
|
import PinnedIndicator from './PinnedIndicator';
|
|
// @ts-ignore
|
|
import RaisedHandIndicator from './RaisedHandIndicator';
|
|
// @ts-ignore
|
|
import StatusIndicators from './StatusIndicators';
|
|
import VideoMenuTriggerButton from './VideoMenuTriggerButton';
|
|
|
|
declare let interfaceConfig: any;
|
|
|
|
type Props = {
|
|
|
|
/**
|
|
* Hide popover callback.
|
|
*/
|
|
hidePopover: Function,
|
|
|
|
/**
|
|
* Class name for the status indicators container.
|
|
*/
|
|
indicatorsClassName: string,
|
|
|
|
/**
|
|
* Whether or not the thumbnail is hovered.
|
|
*/
|
|
isHovered: boolean,
|
|
|
|
/**
|
|
* Whether or not the thumbnail is a virtual screen share participant.
|
|
*/
|
|
isVirtualScreenshareParticipant?: boolean,
|
|
|
|
/**
|
|
* Whether or not the indicators are for the local participant.
|
|
*/
|
|
local: boolean,
|
|
|
|
/**
|
|
* Id of the participant for which the component is displayed.
|
|
*/
|
|
participantId: string,
|
|
|
|
/**
|
|
* Whether popover is visible or not.
|
|
*/
|
|
popoverVisible: boolean,
|
|
|
|
/**
|
|
* Show popover callback.
|
|
*/
|
|
showPopover: Function,
|
|
|
|
/**
|
|
* The type of thumbnail.
|
|
*/
|
|
thumbnailType: string
|
|
}
|
|
|
|
const useStyles = makeStyles(() => {
|
|
return {
|
|
container: {
|
|
display: 'flex',
|
|
|
|
'& > *:not(:last-child)': {
|
|
marginRight: '4px'
|
|
}
|
|
}
|
|
};
|
|
});
|
|
|
|
const ThumbnailTopIndicators = ({
|
|
hidePopover,
|
|
indicatorsClassName,
|
|
isVirtualScreenshareParticipant,
|
|
isHovered,
|
|
local,
|
|
participantId,
|
|
popoverVisible,
|
|
showPopover,
|
|
thumbnailType
|
|
}: Props) => {
|
|
const styles = useStyles();
|
|
|
|
const _isMobile = isMobileBrowser();
|
|
const { NORMAL = 16 } = interfaceConfig.INDICATOR_FONT_SIZES || {};
|
|
const _indicatorIconSize = NORMAL;
|
|
const _connectionIndicatorAutoHideEnabled = Boolean(
|
|
useSelector((state: IState) => state['features/base/config'].connectionIndicators?.autoHide) ?? true);
|
|
const _connectionIndicatorDisabled = _isMobile
|
|
|| Boolean(useSelector((state: IState) => state['features/base/config'].connectionIndicators?.disabled));
|
|
const _isMultiStreamEnabled = useSelector(getMultipleVideoSupportFeatureFlag);
|
|
const showConnectionIndicator = isHovered || !_connectionIndicatorAutoHideEnabled;
|
|
|
|
if (_isMultiStreamEnabled && isVirtualScreenshareParticipant) {
|
|
return (
|
|
<div className = { styles.container }>
|
|
{!_connectionIndicatorDisabled
|
|
&& <ConnectionIndicator
|
|
alwaysVisible = { showConnectionIndicator }
|
|
enableStatsDisplay = { true }
|
|
iconSize = { _indicatorIconSize }
|
|
participantId = { participantId }
|
|
statsPopoverPosition = { STATS_POPOVER_POSITION[thumbnailType] } />
|
|
}
|
|
</div>
|
|
);
|
|
}
|
|
|
|
const tooltipPosition = getIndicatorsTooltipPosition(thumbnailType);
|
|
|
|
return (
|
|
<>
|
|
<div className = { styles.container }>
|
|
<PinnedIndicator
|
|
iconSize = { _indicatorIconSize }
|
|
participantId = { participantId }
|
|
tooltipPosition = { tooltipPosition } />
|
|
{!_connectionIndicatorDisabled
|
|
&& <ConnectionIndicator
|
|
alwaysVisible = { showConnectionIndicator }
|
|
enableStatsDisplay = { true }
|
|
iconSize = { _indicatorIconSize }
|
|
participantId = { participantId }
|
|
statsPopoverPosition = { STATS_POPOVER_POSITION[thumbnailType] } />
|
|
}
|
|
<RaisedHandIndicator
|
|
iconSize = { _indicatorIconSize }
|
|
participantId = { participantId }
|
|
tooltipPosition = { tooltipPosition } />
|
|
{thumbnailType !== THUMBNAIL_TYPE.TILE && (
|
|
<div className = { clsx(indicatorsClassName, 'top-indicators') }>
|
|
<StatusIndicators
|
|
participantID = { participantId }
|
|
screenshare = { !_isMultiStreamEnabled } />
|
|
</div>
|
|
)}
|
|
</div>
|
|
<div className = { styles.container }>
|
|
<VideoMenuTriggerButton
|
|
hidePopover = { hidePopover }
|
|
local = { local }
|
|
participantId = { participantId }
|
|
popoverVisible = { popoverVisible }
|
|
showPopover = { showPopover }
|
|
thumbnailType = { thumbnailType }
|
|
visible = { isHovered } />
|
|
</div>
|
|
</>);
|
|
};
|
|
|
|
export default ThumbnailTopIndicators;
|