import { forwardRef, useEffect, useState, useRef, useCallback } from 'react';
import PropTypes from 'prop-types';
import { motion, useAnimationControls } from 'framer-motion';
import { CloseFullscreen, Settings } from '../../../../assets/icons';
import { clsm } from '../../../../utils';
import { createAnimationProps } from '../../../../helpers/animationPropsHelper';
import { fitRectIntoContainer } from '../../../../helpers/webBroadcastHelpers';
import { MODAL_TYPE, useModal } from '../../../../contexts/Modal';
import { streamManager as $content } from '../../../../content';
import Button from '../../../../components/Button';
import GoLiveStreamButton from './GoLiveStreamButton';
import useFocusTrap from '../../../../hooks/useFocusTrap';
import useResize from '../../../../hooks/useResize';
import WebBroadcastControl from './WebBroadcastControl';
import withPortal from '../../../../components/withPortal';
const $webBroadcastContent = $content.stream_manager_web_broadcast;
const animationDuration = 0.25;
const animationTransition = { duration: animationDuration, type: 'tween' };
const WebBroadcastFullScreen = forwardRef(
(
{ dimensions, setIsFullScreenOpen, webBroadcastControllerButtons },
previewRef
) => {
const canvasControls = useAnimationControls();
const { isModalOpen, openModal } = useModal();
const [canvasDimensionClasses, setCanvasDimensionClasses] = useState([]);
const canvasContainerRef = useRef();
const settingsButtonRef = useRef();
const webbroadcastfullscreenContainerRef = useRef();
const {
animationInitialWidth,
animationInitialHeight,
animationInitialLeft,
animationInitialTop
} = dimensions;
const handleSettingsClick = () => {
openModal({
type: MODAL_TYPE.STREAM_BROADCAST_SETTINGS,
lastFocusedElement: settingsButtonRef
});
};
const webBroadcastControllerWithSettingsButton = [
...webBroadcastControllerButtons,
{
onClick: handleSettingsClick,
ariaLabel: 'Open video and audio settings modal',
withRef: true,
icon: ,
tooltip: $webBroadcastContent.open_settings
}
];
useEffect(() => {
const windowWidth = window.innerWidth;
const windowHeight = window.innerHeight;
const aspectRatioProportion = 0.667; // 3:2 aspect ratio or 2/3
// Updating the initial dimensions of the canvas will make the canvas dimension animation smoother once the animation completes
setCanvasDimensionClasses([
'aspect-video',
windowHeight / windowWidth < aspectRatioProportion
? ['w-auto', 'h-full']
: ['w-full', 'h-auto']
]);
}, []);
const animateCanvasWidthHeight = useCallback(() => {
const { width: newCanvasWidth, height: newCanvasHeight } =
fitRectIntoContainer(
previewRef.current.clientWidth,
previewRef.current.clientHeight,
canvasContainerRef.current.clientWidth,
canvasContainerRef.current.clientHeight
);
canvasControls.start({
width: newCanvasWidth,
height: newCanvasHeight
});
}, [canvasControls, previewRef]);
useFocusTrap([webbroadcastfullscreenContainerRef], !isModalOpen, {
shouldReFocusBackOnLastClickedItem: true
});
useResize(animateCanvasWidthHeight);
const handleOnClose = () => {
setCanvasDimensionClasses([]);
// Animate canvas dimensions back to initial values
canvasControls.start({
width: 311,
height: 174.94,
transition: animationTransition
});
setIsFullScreenOpen();
};
return (
);
}
);
WebBroadcastFullScreen.propTypes = {
webBroadcastControllerButtons: PropTypes.array.isRequired,
dimensions: PropTypes.shape({
animationInitialWidth: PropTypes.number.isRequired,
animationInitialHeight: PropTypes.number.isRequired,
animationInitialLeft: PropTypes.number.isRequired,
animationInitialTop: PropTypes.number.isRequired
}).isRequired,
setIsFullScreenOpen: PropTypes.func.isRequired
};
export default withPortal(WebBroadcastFullScreen, 'web-broadcast-full-screen', {
isAnimated: true
});