mirror of
https://github.com/streamyfin/streamyfin.git
synced 2026-06-02 12:08:37 +01:00
fix(player): keep controls visible while settings popover is open
Re-enabling the auto-hide timeout (previous commit) let it fire while the player settings popover was open, dismissing it mid-interaction — most visibly on iOS, where the popover lives inside the controls and closes when they fade out. Surface the popover's open state up through DropdownView -> HeaderControls -> Controls and pass it as useControlsTimeout's `disabled` flag, so the auto-hide pauses while the menu is open and re-arms once it closes. iOS reports open/close via the SwiftUI Popover binding; Android's menu is a separate global bottom-sheet modal and is unaffected by controls hiding.
This commit is contained in:
@@ -110,6 +110,10 @@ export const Controls: FC<Props> = ({
|
||||
|
||||
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<Props> = ({
|
||||
episodeView,
|
||||
onHideControls: hideControls,
|
||||
timeout: CONTROLS_CONSTANTS.TIMEOUT,
|
||||
disabled: settingsMenuOpen,
|
||||
});
|
||||
|
||||
const switchOnEpisodeMode = useCallback(() => {
|
||||
@@ -527,6 +532,7 @@ export const Controls: FC<Props> = ({
|
||||
setPlaybackSpeed={setPlaybackSpeed}
|
||||
showTechnicalInfo={showTechnicalInfo}
|
||||
onToggleTechnicalInfo={onToggleTechnicalInfo}
|
||||
onSettingsMenuOpenChange={setSettingsMenuOpen}
|
||||
/>
|
||||
</Animated.View>
|
||||
<Animated.View
|
||||
|
||||
@@ -37,6 +37,9 @@ interface HeaderControlsProps {
|
||||
// Technical info props
|
||||
showTechnicalInfo?: boolean;
|
||||
onToggleTechnicalInfo?: () => 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<HeaderControlsProps> = ({
|
||||
@@ -57,6 +60,7 @@ export const HeaderControls: FC<HeaderControlsProps> = ({
|
||||
setPlaybackSpeed,
|
||||
showTechnicalInfo = false,
|
||||
onToggleTechnicalInfo,
|
||||
onSettingsMenuOpenChange,
|
||||
}) => {
|
||||
const { settings } = useSettings();
|
||||
const router = useRouter();
|
||||
@@ -117,6 +121,7 @@ export const HeaderControls: FC<HeaderControlsProps> = ({
|
||||
setPlaybackSpeed={setPlaybackSpeed}
|
||||
showTechnicalInfo={showTechnicalInfo}
|
||||
onToggleTechnicalInfo={onToggleTechnicalInfo}
|
||||
onOpenChange={onSettingsMenuOpenChange}
|
||||
/>
|
||||
</View>
|
||||
)}
|
||||
|
||||
@@ -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,
|
||||
}}
|
||||
|
||||
Reference in New Issue
Block a user