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 });