/* istanbul ignore file */ // IMPORTANT! leave upper blank line so this file is ignored for coverage!!! More on this issue here // https://github.com/facebook/create-react-app/issues/6106#issuecomment-550076629 import React, { useEffect, useMemo, useState, useCallback } from 'react'; import { Alignment, Button, Card, H5, Switch, Divider, Text, Icon, Tooltip, Position, Popover, Classes, Toaster, Intent, } from '@blueprintjs/core'; import { useTranslation } from 'react-i18next'; import FullScreenEnter from '../../images/fullscreen_24px.svg'; import FullScreenExit from '../../images/fullscreen_exit-24px.svg'; import RedHeartTwemojiPNG from '../../images/red_heart_2764_twemoji_120x120.png'; import { Col, Row } from 'react-flexbox-grid'; import screenfull from 'screenfull'; import { VideoQuality } from '../../features/VideoAutoQualityOptimizer/VideoQualityEnum'; import handlePlayerToggleFullscreen from './handlePlayerToggleFullscreen'; import initScreenfullOnChange from './initScreenfullOnChange'; import ScreenSharingSource from '../../features/PeerConnection/ScreenSharingSourceEnum'; import { REACT_PLAYER_WRAPPER_ID } from '../../constants/appConstants'; const videoQualityButtonStyle: React.CSSProperties = { width: '100%', textAlign: 'center', }; interface PlayerControlPanelProps { onSwitchChangedCallback: (isEnabled: boolean) => void; isPlaying: boolean; isDefaultPlayerTurnedOn: boolean; handleClickFullscreen: () => void; handleClickPlayPause: () => void; setVideoQuality: (q: VideoQuality) => void; selectedVideoQuality: VideoQuality; screenSharingSourceType: ScreenSharingSourceType; toaster: undefined | Toaster; } const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); function PlayerControlPanel(props: PlayerControlPanelProps) { const { t } = useTranslation(); const { isPlaying, onSwitchChangedCallback, isDefaultPlayerTurnedOn, handleClickPlayPause, handleClickFullscreen, selectedVideoQuality, setVideoQuality, screenSharingSourceType, toaster, } = props; const isFullScreenAPIAvailable = useMemo(() => screenfull.isEnabled, []); const [isFullScreenOn, setIsFullScreenOn] = useState(false); const [isVideoFlipped, setIsVideoFlipped] = useState(false); useEffect(() => { initScreenfullOnChange(setIsFullScreenOn); }, []); const handleClickFullscreenWhenDefaultPlayerIsOn = useCallback(() => { handlePlayerToggleFullscreen(); }, []); const toggleFlipVideo = useCallback(() => { const videoElement = isSafari ? document.querySelector(`#${REACT_PLAYER_WRAPPER_ID}`) : document.querySelector(`#${REACT_PLAYER_WRAPPER_ID} > video`); if (isVideoFlipped) { // @ts-ignore videoElement.style.transform = ''; setIsVideoFlipped(false); } else { // @ts-ignore videoElement.style.transform = 'rotateY(180deg)'; setIsVideoFlipped(true); } toaster?.show({ icon: 'clean', intent: Intent.PRIMARY, message: t('Video is flipped horizontally'), }); }, [isVideoFlipped, toaster, t]); return ( <>
{`${t('Video Settings')}:`}
{Object.values(VideoQuality).map((q: VideoQuality) => { return ( ); })} } position={Position.BOTTOM} popoverClassName={Classes.POPOVER_CONTENT_SIZING} >
{ onSwitchChangedCallback(!isDefaultPlayerTurnedOn); toaster?.show({ icon: 'video', intent: Intent.PRIMARY, message: `${ isDefaultPlayerTurnedOn ? t('Default video player has been turned OFF') : t('Default video player has been turned ON') }`, }); }} innerLabel={isDefaultPlayerTurnedOn ? t('ON') : t('OFF')} inline label={t('Default Video Player')} alignIndicator={Alignment.RIGHT} checked={isDefaultPlayerTurnedOn} disabled={!isFullScreenAPIAvailable} style={{ marginBottom: '0px', }} />
); } export default PlayerControlPanel;