From 56860195879e157c4613fda58451e361eb96c7d0 Mon Sep 17 00:00:00 2001 From: AK <144495202+AKnassa@users.noreply.github.com> Date: Thu, 30 Apr 2026 15:29:56 -0400 Subject: [PATCH] fix(fullscreen): use settings hook for escape behavior Wrap the fullscreen provider with the core suspender so it can read escExitFullscreen through useSettings instead of manually parsing core event payloads. --- src/common/Fullscreen/FullscreenProvider.tsx | 49 ++++---------------- 1 file changed, 8 insertions(+), 41 deletions(-) diff --git a/src/common/Fullscreen/FullscreenProvider.tsx b/src/common/Fullscreen/FullscreenProvider.tsx index 77c385013..2300602c5 100644 --- a/src/common/Fullscreen/FullscreenProvider.tsx +++ b/src/common/Fullscreen/FullscreenProvider.tsx @@ -1,8 +1,9 @@ // Copyright (C) 2017-2026 Smart code 203358507 -import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import { useServices } from 'stremio/services'; +import React, { useCallback, useEffect, useMemo, useState } from 'react'; +import { withCoreSuspender } from '../CoreSuspender'; import onShortcut from '../Shortcuts/onShortcut'; +import useSettings from '../useSettings'; import useShell, { type WindowVisibility } from '../useShell'; import FullscreenContext, { type FullscreenContextValue } from './FullscreenContext'; @@ -22,15 +23,14 @@ const isTextInputFocused = () => { const FullscreenProvider = ({ children }: Props) => { const shell = useShell(); - const { core } = useServices(); + const [settings] = useSettings(); + const escExitFullscreen = settings.escExitFullscreen; const [fullscreen, setFullscreen] = useState(() => { if (typeof document === 'undefined') return false; return document.fullscreenElement === document.documentElement; }); - const escExitFullscreenRef = useRef(false); - const requestFullscreen = useCallback(async () => { if (shell.active) { shell.send('win-set-visibility', { fullscreen: true }); @@ -64,39 +64,6 @@ const FullscreenProvider = ({ children }: Props) => { onShortcut('fullscreen', toggleFullscreenFromShortcut, [toggleFullscreenFromShortcut]); - useEffect(() => { - if (!core?.active) return; - - let cancelled = false; - - const onCoreEvent = (...listenerArgs: unknown[]) => { - const payload = listenerArgs[0] as - | { event?: string, args?: { settings?: { escExitFullscreen?: boolean } } } - | undefined; - if (payload?.event === 'SettingsUpdated' && - typeof payload.args?.settings?.escExitFullscreen === 'boolean') { - escExitFullscreenRef.current = payload.args.settings.escExitFullscreen; - } - }; - - core.transport.getState('ctx') - .then((ctx) => { - if (cancelled) return; - const settings = (ctx as Ctx | null)?.profile?.settings; - escExitFullscreenRef.current = !!settings?.escExitFullscreen; - }) - .catch((err) => { - console.error('FullscreenProvider: failed to read ctx state', err); - }); - - core.transport.on('CoreEvent', onCoreEvent); - - return () => { - cancelled = true; - core.transport.off('CoreEvent', onCoreEvent); - }; - }, [core]); - useEffect(() => { const onWindowVisibilityChanged = (state: WindowVisibility) => { setFullscreen(state.isFullscreen === true); @@ -107,7 +74,7 @@ const FullscreenProvider = ({ children }: Props) => { }; const onKeyDown = (event: KeyboardEvent) => { - if (event.code === 'Escape' && escExitFullscreenRef.current) { + if (event.code === 'Escape' && escExitFullscreen) { exitFullscreen(); } @@ -125,7 +92,7 @@ const FullscreenProvider = ({ children }: Props) => { document.removeEventListener('keydown', onKeyDown); document.removeEventListener('fullscreenchange', onFullscreenChange); }; - }, [shell, toggleFullscreen, exitFullscreen]); + }, [shell, toggleFullscreen, exitFullscreen, escExitFullscreen]); const value = useMemo( () => [fullscreen, requestFullscreen, exitFullscreen, toggleFullscreen], @@ -139,4 +106,4 @@ const FullscreenProvider = ({ children }: Props) => { ); }; -export default FullscreenProvider; +export default withCoreSuspender(FullscreenProvider);