From 940af76c12639cca55e4881f542fe81691fc614e Mon Sep 17 00:00:00 2001 From: Lachezar Lechev Date: Tue, 4 Nov 2025 17:02:02 +0200 Subject: [PATCH 1/4] fix(streaming server) - use new state for warning Signed-off-by: Lachezar Lechev --- .../NavMenu/NavMenuContent.js | 43 ++++++++++--------- src/routes/Board/Board.js | 4 +- src/types/models/StremingServer.d.ts | 1 + 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/components/NavBar/HorizontalNavBar/NavMenu/NavMenuContent.js b/src/components/NavBar/HorizontalNavBar/NavMenu/NavMenuContent.js index de0a02212..233ddd15d 100644 --- a/src/components/NavBar/HorizontalNavBar/NavMenu/NavMenuContent.js +++ b/src/components/NavBar/HorizontalNavBar/NavMenu/NavMenuContent.js @@ -24,11 +24,12 @@ const NavMenuContent = ({ onClick }) => { const [fullscreen, requestFullscreen, exitFullscreen] = useFullscreen(); const [isIOSPWA, isAndroidPWA] = usePWA(); const streamingServerWarningDismissed = React.useMemo(() => { - return streamingServer.settings !== null && streamingServer.settings.type === 'Ready' || ( - !isNaN(profile.settings.streamingServerWarningDismissed.getTime()) && - profile.settings.streamingServerWarningDismissed.getTime() > Date.now() - ); - }, [profile.settings, streamingServer.settings]); + return streamingServer.state !== null && (streamingServer.state.type === 'Ready' && streamingServer.state.content === 'running') + || ( + !isNaN(profile.settings.streamingServerWarningDismissed.getTime()) && + profile.settings.streamingServerWarningDismissed.getTime() > Date.now() + ); + }, [profile.settings, streamingServer.state]); const logoutButtonOnClick = React.useCallback(() => { core.transport.dispatch({ action: 'Ctx', @@ -41,12 +42,12 @@ const NavMenuContent = ({ onClick }) => { try { const clipboardText = await navigator.clipboard.readText(); createTorrentFromMagnet(clipboardText); - } catch(e) { + } catch (e) { console.error(e); } }, []); return ( -
+
{ null }
- - - -
- - { profile.auth !== null ? - : null diff --git a/src/routes/Board/Board.js b/src/routes/Board/Board.js index 13acb4a86..4d811a107 100644 --- a/src/routes/Board/Board.js +++ b/src/routes/Board/Board.js @@ -23,11 +23,11 @@ const Board = () => { const boardCatalogsOffset = continueWatchingPreview.items.length > 0 ? 1 : 0; const scrollContainerRef = React.useRef(); const streamingServerWarningDismissed = React.useMemo(() => { - return streamingServer.settings !== null && streamingServer.settings.type === 'Ready' || ( + return streamingServer.settings !== null && (streamingServer.state.type === 'Ready' && streamingServer.state.content === 'running') || ( !isNaN(profile.settings.streamingServerWarningDismissed.getTime()) && profile.settings.streamingServerWarningDismissed.getTime() > Date.now() ); - }, [profile.settings, streamingServer.settings]); + }, [profile.settings, streamingServer.state]); const onVisibleRangeChange = React.useCallback(() => { const range = getVisibleChildrenRange(scrollContainerRef.current); if (range === null) { diff --git a/src/types/models/StremingServer.d.ts b/src/types/models/StremingServer.d.ts index 6e6f96f39..6485d36b2 100644 --- a/src/types/models/StremingServer.d.ts +++ b/src/types/models/StremingServer.d.ts @@ -127,4 +127,5 @@ type StreamingServer = { playbackDevices: Loadable | null, networkInfo: Loadable | null, deviceInfo: Loadable | null, + state: Loadable | null }; From 67ce6658016bc6b2be8ea1733d4b1c87f40009e3 Mon Sep 17 00:00:00 2001 From: Lachezar Lechev Date: Mon, 22 Dec 2025 14:56:29 +0200 Subject: [PATCH 2/4] fix: navMenuContent and Board server warning state Signed-off-by: Lachezar Lechev --- .../HorizontalNavBar/NavMenu/NavMenuContent.js | 4 ++-- src/routes/Board/Board.js | 16 +++++++++++----- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/components/NavBar/HorizontalNavBar/NavMenu/NavMenuContent.js b/src/components/NavBar/HorizontalNavBar/NavMenu/NavMenuContent.js index 233ddd15d..a94db6b27 100644 --- a/src/components/NavBar/HorizontalNavBar/NavMenu/NavMenuContent.js +++ b/src/components/NavBar/HorizontalNavBar/NavMenu/NavMenuContent.js @@ -24,9 +24,9 @@ const NavMenuContent = ({ onClick }) => { const [fullscreen, requestFullscreen, exitFullscreen] = useFullscreen(); const [isIOSPWA, isAndroidPWA] = usePWA(); const streamingServerWarningDismissed = React.useMemo(() => { - return streamingServer.state !== null && (streamingServer.state.type === 'Ready' && streamingServer.state.content === 'running') + return (streamingServer.state !== null && streamingServer.state.type === 'Ready' && streamingServer.state.content === 'running') || ( - !isNaN(profile.settings.streamingServerWarningDismissed.getTime()) && + isNaN(profile.settings.streamingServerWarningDismissed.getTime()) || profile.settings.streamingServerWarningDismissed.getTime() > Date.now() ); }, [profile.settings, streamingServer.state]); diff --git a/src/routes/Board/Board.js b/src/routes/Board/Board.js index 8cedc75e8..9fad9fa53 100644 --- a/src/routes/Board/Board.js +++ b/src/routes/Board/Board.js @@ -22,11 +22,17 @@ const Board = () => { const profile = useProfile(); const boardCatalogsOffset = continueWatchingPreview.items.length > 0 ? 1 : 0; const scrollContainerRef = React.useRef(); - const showStreamingServerWarning = React.useMemo(() => { - return streamingServer.settings !== null && (streamingServer.state.type !== 'Ready' || streamingServer.state.content === 'running') || ( - isNaN(profile.settings.streamingServerWarningDismissed.getTime()) || - profile.settings.streamingServerWarningDismissed.getTime() < Date.now()); - }, [profile.settings, streamingServer.settings]); + + const [showStreamingServerWarning, setStreamingServerWarning] = React.useState(true); + + React.useEffect(() => { + setStreamingServerWarning(streamingServer.state === null || streamingServer.state.type === 'Err' || (streamingServer.state.type === 'Ready' && streamingServer.state.content === 'notRunning') + ? ( + isNaN(profile.settings.streamingServerWarningDismissed.getTime()) || + profile.settings.streamingServerWarningDismissed.getTime() > Date.now()) + : false); + }, [profile.settings, streamingServer.state]); + const onVisibleRangeChange = React.useCallback(() => { const range = getVisibleChildrenRange(scrollContainerRef.current); if (range === null) { From 2b253003b0cf881786701c04b6caf0647766dbe1 Mon Sep 17 00:00:00 2001 From: Botzy Date: Mon, 22 Dec 2025 15:29:31 +0200 Subject: [PATCH 3/4] fix(StreamingServerWarning): align server state warning checks across app --- .../HorizontalNavBar/NavMenu/NavMenuContent.js | 15 +++++++++------ src/routes/Board/Board.js | 16 ++++++++-------- .../Settings/Streaming/URLsManager/Item/Item.tsx | 12 +++++++----- 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/src/components/NavBar/HorizontalNavBar/NavMenu/NavMenuContent.js b/src/components/NavBar/HorizontalNavBar/NavMenu/NavMenuContent.js index a94db6b27..72a8443de 100644 --- a/src/components/NavBar/HorizontalNavBar/NavMenu/NavMenuContent.js +++ b/src/components/NavBar/HorizontalNavBar/NavMenu/NavMenuContent.js @@ -23,12 +23,15 @@ const NavMenuContent = ({ onClick }) => { const { createTorrentFromMagnet } = useTorrent(); const [fullscreen, requestFullscreen, exitFullscreen] = useFullscreen(); const [isIOSPWA, isAndroidPWA] = usePWA(); - const streamingServerWarningDismissed = React.useMemo(() => { - return (streamingServer.state !== null && streamingServer.state.type === 'Ready' && streamingServer.state.content === 'running') - || ( + const showStreamingServerWarning = React.useMemo(() => { + return streamingServer.state === null || + streamingServer.state.type === 'Err' || + (streamingServer.state.type === 'Ready' && streamingServer.state.content === 'notRunning') ? + ( isNaN(profile.settings.streamingServerWarningDismissed.getTime()) || - profile.settings.streamingServerWarningDismissed.getTime() > Date.now() - ); + profile.settings.streamingServerWarningDismissed.getTime() < Date.now() + ) + : false; }, [profile.settings, streamingServer.state]); const logoutButtonOnClick = React.useCallback(() => { core.transport.dispatch({ @@ -47,7 +50,7 @@ const NavMenuContent = ({ onClick }) => { } }, []); return ( -
+
{ const profile = useProfile(); const boardCatalogsOffset = continueWatchingPreview.items.length > 0 ? 1 : 0; const scrollContainerRef = React.useRef(); - - const [showStreamingServerWarning, setStreamingServerWarning] = React.useState(true); - - React.useEffect(() => { - setStreamingServerWarning(streamingServer.state === null || streamingServer.state.type === 'Err' || (streamingServer.state.type === 'Ready' && streamingServer.state.content === 'notRunning') - ? ( + const showStreamingServerWarning = React.useMemo(() => { + return streamingServer.state === null || + streamingServer.state.type === 'Err' || + (streamingServer.state.type === 'Ready' && streamingServer.state.content === 'notRunning') ? + ( isNaN(profile.settings.streamingServerWarningDismissed.getTime()) || - profile.settings.streamingServerWarningDismissed.getTime() > Date.now()) - : false); + profile.settings.streamingServerWarningDismissed.getTime() < Date.now() + ) + : false; }, [profile.settings, streamingServer.state]); const onVisibleRangeChange = React.useCallback(() => { diff --git a/src/routes/Settings/Streaming/URLsManager/Item/Item.tsx b/src/routes/Settings/Streaming/URLsManager/Item/Item.tsx index ec712a78b..2b674a804 100644 --- a/src/routes/Settings/Streaming/URLsManager/Item/Item.tsx +++ b/src/routes/Settings/Streaming/URLsManager/Item/Item.tsx @@ -23,6 +23,8 @@ const Item = ({ url }: Props) => { const selected = useMemo(() => profile.settings.streamingServerUrl === url, [url, profile.settings]); const defaultUrl = useMemo(() => url === DEFAULT_STREAMING_SERVER_URL, [url]); + const serverReady = useMemo(() => streamingServer.state?.type === 'Ready' && streamingServer.state.content === 'running', [streamingServer.state]); + const serverError = useMemo(() => streamingServer.state?.type === 'Err' || (streamingServer.state?.type === 'Ready' && streamingServer.state.content === 'notRunning'), [streamingServer.state]); const handleDelete = useCallback(() => { deleteServerUrl(url); @@ -43,19 +45,19 @@ const Item = ({ url }: Props) => { { selected ?
-
+
{ - streamingServer.settings === null ? + streamingServer.state === null ? 'NotLoaded' : - streamingServer.settings.type === 'Ready' ? + serverReady ? t('SETTINGS_SERVER_STATUS_ONLINE') : - streamingServer.settings.type === 'Err' ? + serverError ? t('SETTINGS_SERVER_STATUS_ERROR') : - streamingServer.settings.type + streamingServer.state.type }
From a3268e8a66ae511822a5329459136d304dd38c49 Mon Sep 17 00:00:00 2001 From: Botzy Date: Mon, 22 Dec 2025 15:55:42 +0200 Subject: [PATCH 4/4] fix: update streaming server state if server url is changed --- src/routes/Settings/Streaming/URLsManager/Item/Item.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/Settings/Streaming/URLsManager/Item/Item.tsx b/src/routes/Settings/Streaming/URLsManager/Item/Item.tsx index 2b674a804..c058a032c 100644 --- a/src/routes/Settings/Streaming/URLsManager/Item/Item.tsx +++ b/src/routes/Settings/Streaming/URLsManager/Item/Item.tsx @@ -23,8 +23,8 @@ const Item = ({ url }: Props) => { const selected = useMemo(() => profile.settings.streamingServerUrl === url, [url, profile.settings]); const defaultUrl = useMemo(() => url === DEFAULT_STREAMING_SERVER_URL, [url]); - const serverReady = useMemo(() => streamingServer.state?.type === 'Ready' && streamingServer.state.content === 'running', [streamingServer.state]); - const serverError = useMemo(() => streamingServer.state?.type === 'Err' || (streamingServer.state?.type === 'Ready' && streamingServer.state.content === 'notRunning'), [streamingServer.state]); + const serverReady = useMemo(() => streamingServer.state?.type === 'Ready' && streamingServer.state.content === 'running', [streamingServer]); + const serverError = useMemo(() => streamingServer.state?.type === 'Err' || (streamingServer.state?.type === 'Ready' && streamingServer.state.content === 'notRunning'), [streamingServer]); const handleDelete = useCallback(() => { deleteServerUrl(url);