import { motion } from 'framer-motion'; import { useCallback, useRef, useState, useEffect } from 'react'; import PropTypes from 'prop-types'; import { clsm, isElementsOverlapping } from '../../../utils'; import { DEFAULT_PROFILE_VIEW_TRANSITION } from '../../../constants'; import { useChannel } from '../../../contexts/Channel'; import { usePlayerContext } from '../contexts/Player'; import { useProfileViewAnimation } from '../contexts/ProfileViewAnimation'; import { useUser } from '../../../contexts/User'; import FollowButton from './FollowButton'; import PlayerOverlay from './PlayerOverlay'; import ProfileViewMenu from './ProfileViewMenu'; import UserAvatar from '../../../components/UserAvatar'; import { POPUP_ID } from './Controls/RenditionSetting'; import useResize from '../../../hooks/useResize'; const getHeaderButtonClasses = (shouldRemoveZIndex = false) => { return clsm([ 'flex', 'items-center', 'space-x-2', 'shrink-0', 'pointer-events-all', !shouldRemoveZIndex && 'z-10' ]); }; const PlayerHeader = ({ avatarSrc, color, username, openPopupIds }) => { const { getProfileViewAnimationProps, headerAnimationControls, isProfileViewAnimationEnabled, isProfileViewExpanded, shouldAnimateProfileView, toggleProfileView } = useProfileViewAnimation(); const isRenditionSettingPopupExpanded = !!openPopupIds.find( (openPopupId) => openPopupId === POPUP_ID ); const [shouldRemoveFollowButtonZIndex, setShouldRemoveFollowButtonZIndex] = useState(false); const [followButtonRefState, setFollowButtonRefState] = useState(); const { qualitiesContainerRef } = usePlayerContext(); useResize(() => { if ( isRenditionSettingPopupExpanded && followButtonRefState && qualitiesContainerRef?.current ) { if ( !shouldRemoveFollowButtonZIndex && isElementsOverlapping( followButtonRefState, qualitiesContainerRef?.current ) ) { setShouldRemoveFollowButtonZIndex(true); } if ( shouldRemoveFollowButtonZIndex && !isElementsOverlapping( followButtonRefState, qualitiesContainerRef?.current ) ) { setShouldRemoveFollowButtonZIndex(false); } } }); const qualitiesContainerInitialHeight = qualitiesContainerRef?.current?.clientHeight; // On mount useEffect(() => { if ( isRenditionSettingPopupExpanded && followButtonRefState && qualitiesContainerRef?.current ) { if ( isElementsOverlapping( followButtonRefState, qualitiesContainerRef?.current ) || qualitiesContainerRef?.current.clientHeight > qualitiesContainerInitialHeight ) { setShouldRemoveFollowButtonZIndex(true); } } }, [ followButtonRefState, qualitiesContainerRef, isRenditionSettingPopupExpanded, qualitiesContainerInitialHeight, shouldRemoveFollowButtonZIndex ]); useEffect(() => { if (!isRenditionSettingPopupExpanded) { setShouldRemoveFollowButtonZIndex(false); } }, [isRenditionSettingPopupExpanded]); const { isOverlayVisible } = usePlayerContext(); const { isSessionValid } = useUser(); const { channelData: { isLive } = {} } = useChannel(); const layoutDependency = useRef(null); const animationDuration = DEFAULT_PROFILE_VIEW_TRANSITION.duration; const shouldShowHeaderOverlay = isOverlayVisible || isLive === false || isProfileViewExpanded; if (shouldAnimateProfileView.current) layoutDependency.current = Date.now(); const getPlayerHeaderProfileViewAnimationProps = useCallback( (variantStyles) => getProfileViewAnimationProps(headerAnimationControls, variantStyles), [getProfileViewAnimationProps, headerAnimationControls] ); return (