From 19a597aa7889f92a1d0bdb3b0fc121b5dfd2523d Mon Sep 17 00:00:00 2001 From: Botzy Date: Thu, 13 Aug 2026 15:38:51 +0300 Subject: [PATCH] fix: use correct server state and improve checks for server running/not running --- src/common/getStreamingServerWarning.ts | 18 ++++++++++++++++++ src/common/index.js | 2 ++ src/common/usePlayUrl.ts | 7 ++++--- .../HorizontalNavBar/NavMenu/NavMenuContent.js | 15 +++++---------- src/routes/Board/Board.js | 17 +++++------------ .../Streaming/URLsManager/Item/Item.tsx | 4 ++-- 6 files changed, 36 insertions(+), 27 deletions(-) create mode 100644 src/common/getStreamingServerWarning.ts diff --git a/src/common/getStreamingServerWarning.ts b/src/common/getStreamingServerWarning.ts new file mode 100644 index 000000000..bb7a02e1c --- /dev/null +++ b/src/common/getStreamingServerWarning.ts @@ -0,0 +1,18 @@ +// Copyright (C) 2017-2024 Smart code 203358507 + +const isStreamingServerNotRunning = (streamingServer: StreamingServer): boolean => ( + streamingServer.state === null || + streamingServer.state.type === 'Err' || + (streamingServer.state.type === 'Ready' && streamingServer.state.content === 'notRunning') +); + +const getStreamingServerWarning = (streamingServer: StreamingServer, profile: Profile): boolean => { + if (!isStreamingServerNotRunning(streamingServer)) { + return false; + } + + const dismissedAt = profile.settings.streamingServerWarningDismissed; + return dismissedAt === null || isNaN(dismissedAt.getTime()) || dismissedAt.getTime() < Date.now(); +}; + +export default getStreamingServerWarning; diff --git a/src/common/index.js b/src/common/index.js index 36860d6f4..27dd5f9fa 100644 --- a/src/common/index.js +++ b/src/common/index.js @@ -10,6 +10,7 @@ const { DiscordProvider, useDiscord, EMPTY_DISCORD_TIMESTAMPS, getPlaybackDiscor const CONSTANTS = require('./CONSTANTS'); const { withCoreSuspender, useCoreSuspender } = require('./CoreSuspender'); const getVisibleChildrenRange = require('./getVisibleChildrenRange'); +const { default: getStreamingServerWarning } = require('./getStreamingServerWarning'); const interfaceLanguages = require('./interfaceLanguages.json'); const languageNames = require('./languageNames.json'); const languages = require('./languages'); @@ -56,6 +57,7 @@ module.exports = { withCoreSuspender, useCoreSuspender, getVisibleChildrenRange, + getStreamingServerWarning, interfaceLanguages, languageNames, languages, diff --git a/src/common/usePlayUrl.ts b/src/common/usePlayUrl.ts index c2c28590a..ee17780aa 100644 --- a/src/common/usePlayUrl.ts +++ b/src/common/usePlayUrl.ts @@ -48,8 +48,9 @@ const usePlayUrl = () => { const parsed = magnet.decode(trimmed); if (parsed && typeof parsed.infoHash === 'string') { - const serverReady = streamingServer.settings !== null - && streamingServer.settings.type === 'Ready'; + const serverReady = streamingServer.state !== null + && streamingServer.state.type === 'Ready' + && streamingServer.state.content === 'running'; if (!serverReady) { toast.show({ type: 'error', @@ -63,7 +64,7 @@ const usePlayUrl = () => { } return false; - }, [streamingServer.settings, createTorrentFromMagnet]); + }, [streamingServer.state, createTorrentFromMagnet]); return { handlePlayUrl }; }; diff --git a/src/components/NavBar/HorizontalNavBar/NavMenu/NavMenuContent.js b/src/components/NavBar/HorizontalNavBar/NavMenu/NavMenuContent.js index be2a51f73..9c181db14 100644 --- a/src/components/NavBar/HorizontalNavBar/NavMenu/NavMenuContent.js +++ b/src/components/NavBar/HorizontalNavBar/NavMenu/NavMenuContent.js @@ -15,6 +15,7 @@ const { default: usePlayUrl } = require('stremio/common/usePlayUrl'); const useToast = require('stremio/common/Toast/useToast'); const { withCoreSuspender } = require('stremio/common/CoreSuspender'); const useStreamingServer = require('stremio/common/useStreamingServer'); +const { default: getStreamingServerWarning } = require('stremio/common/getStreamingServerWarning'); const styles = require('./styles'); const NavMenuContent = ({ onClick }) => { @@ -27,16 +28,10 @@ const NavMenuContent = ({ onClick }) => { const toast = useToast(); const [fullscreen, requestFullscreen, exitFullscreen, , supported] = useFullscreen(); const [, isAndroidPWA] = usePWA(); - 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, streamingServer.state]); + const showStreamingServerWarning = React.useMemo( + () => getStreamingServerWarning(streamingServer, profile), + [profile.settings, streamingServer.state] + ); const logoutButtonOnClick = React.useCallback(() => { core.transport.dispatch({ action: 'Ctx', diff --git a/src/routes/Board/Board.js b/src/routes/Board/Board.js index ab103c42d..9f8f1c1ca 100644 --- a/src/routes/Board/Board.js +++ b/src/routes/Board/Board.js @@ -4,7 +4,7 @@ const React = require('react'); const classnames = require('classnames'); const debounce = require('lodash.debounce'); const useTranslate = require('stremio/common/useTranslate'); -const { useStreamingServer, useNotifications, withCoreSuspender, getVisibleChildrenRange, useProfile } = require('stremio/common'); +const { useStreamingServer, useNotifications, withCoreSuspender, getVisibleChildrenRange, getStreamingServerWarning, useProfile } = require('stremio/common'); const { ContinueWatchingItem, EventModal, MainNavBars, MetaItem, MetaRow } = require('stremio/components'); const useBoard = require('./useBoard'); const useContinueWatchingPreview = require('./useContinueWatchingPreview'); @@ -22,17 +22,10 @@ const Board = () => { const profile = useProfile(); const boardCatalogsOffset = continueWatchingPreview.items.length > 0 ? 1 : 0; const scrollContainerRef = React.useRef(); - 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, streamingServer.state]); - + const showStreamingServerWarning = React.useMemo( + () => getStreamingServerWarning(streamingServer, profile), + [profile.settings, streamingServer.state] + ); const onVisibleRangeChange = React.useCallback(() => { const range = getVisibleChildrenRange(scrollContainerRef.current); if (range === null) { diff --git a/src/routes/Settings/Streaming/URLsManager/Item/Item.tsx b/src/routes/Settings/Streaming/URLsManager/Item/Item.tsx index c058a032c..2b674a804 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]); - const serverError = useMemo(() => streamingServer.state?.type === 'Err' || (streamingServer.state?.type === 'Ready' && streamingServer.state.content === 'notRunning'), [streamingServer]); + 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);