diff --git a/components/video-player/controls/Controls.tsx b/components/video-player/controls/Controls.tsx index c5e8c8c89..15cdbfb52 100644 --- a/components/video-player/controls/Controls.tsx +++ b/components/video-player/controls/Controls.tsx @@ -110,6 +110,10 @@ export const Controls: FC = ({ const [episodeView, setEpisodeView] = useState(false); const [showAudioSlider, setShowAudioSlider] = useState(false); + // Pause the controls auto-hide while the player settings popover is open so + // it can't be dismissed out from under the user (notably the iOS popover, + // which lives inside the controls and closes when they fade out). + const [settingsMenuOpen, setSettingsMenuOpen] = useState(false); const { height: screenHeight, width: screenWidth } = useWindowDimensions(); const { previousItem, nextItem } = usePlaybackManager({ @@ -467,6 +471,7 @@ export const Controls: FC = ({ episodeView, onHideControls: hideControls, timeout: CONTROLS_CONSTANTS.TIMEOUT, + disabled: settingsMenuOpen, }); const switchOnEpisodeMode = useCallback(() => { @@ -527,6 +532,7 @@ export const Controls: FC = ({ setPlaybackSpeed={setPlaybackSpeed} showTechnicalInfo={showTechnicalInfo} onToggleTechnicalInfo={onToggleTechnicalInfo} + onSettingsMenuOpenChange={setSettingsMenuOpen} /> void; + // Notifies the parent when the settings popover opens/closes so it can pause + // the controls auto-hide while the menu is up. + onSettingsMenuOpenChange?: (open: boolean) => void; } export const HeaderControls: FC = ({ @@ -57,6 +60,7 @@ export const HeaderControls: FC = ({ setPlaybackSpeed, showTechnicalInfo = false, onToggleTechnicalInfo, + onSettingsMenuOpenChange, }) => { const { settings } = useSettings(); const router = useRouter(); @@ -117,6 +121,7 @@ export const HeaderControls: FC = ({ setPlaybackSpeed={setPlaybackSpeed} showTechnicalInfo={showTechnicalInfo} onToggleTechnicalInfo={onToggleTechnicalInfo} + onOpenChange={onSettingsMenuOpenChange} /> )} diff --git a/components/video-player/controls/dropdown/DropdownView.tsx b/components/video-player/controls/dropdown/DropdownView.tsx index 9246ae9da..f5dfaf624 100644 --- a/components/video-player/controls/dropdown/DropdownView.tsx +++ b/components/video-player/controls/dropdown/DropdownView.tsx @@ -20,6 +20,8 @@ interface DropdownViewProps { setPlaybackSpeed?: (speed: number, scope: PlaybackSpeedScope) => void; showTechnicalInfo?: boolean; onToggleTechnicalInfo?: () => void; + /** Forwarded to the popover so the player can pause auto-hide while it's open. */ + onOpenChange?: (open: boolean) => void; } const DropdownView = ({ @@ -27,6 +29,7 @@ const DropdownView = ({ setPlaybackSpeed, showTechnicalInfo = false, onToggleTechnicalInfo, + onOpenChange, }: DropdownViewProps) => { const { subtitleTracks, audioTracks } = useVideoContext(); const { item, mediaSource } = usePlayerContext(); @@ -223,6 +226,7 @@ const DropdownView = ({ groups={optionGroups} trigger={trigger} expoUIConfig={{}} + onOpenChange={onOpenChange} bottomSheetConfig={{ enablePanDownToClose: true, }}