diff --git a/src/App/App.js b/src/App/App.js index d6e92fbbb..b5f67a658 100644 --- a/src/App/App.js +++ b/src/App/App.js @@ -9,6 +9,7 @@ const { NotFound } = require('stremio/routes'); const { ToastProvider, TooltipProvider, CONSTANTS, withCoreSuspender } = require('stremio/common'); const ServicesToaster = require('./ServicesToaster'); const DeepLinkHandler = require('./DeepLinkHandler'); +const SearchParamsHandler = require('./SearchParamsHandler'); const ErrorDialog = require('./ErrorDialog'); const withProtectedRoutes = require('./withProtectedRoutes'); const routerViewsConfig = require('./routerViewsConfig'); @@ -164,6 +165,7 @@ const App = () => { + { + const { core } = useServices(); + const profile = useProfile(); + const toast = useToast(); + + const [searchParams, setSearchParams] = React.useState({}); + + const onLocationChange = () => { + const { origin, hash, search } = window.location; + const { searchParams } = new URL(`${origin}${hash.replace('#', '')}${search}`); + + setSearchParams((previousSearchParams) => { + const currentSearchParams = Object.fromEntries(searchParams.entries()); + return isEqual(previousSearchParams, currentSearchParams) ? previousSearchParams : currentSearchParams; + }); + }; + + React.useEffect(() => { + const { streamingServerUrl } = searchParams; + + if (streamingServerUrl) { + core.transport.dispatch({ + action: 'Ctx', + args: { + action: 'UpdateSettings', + args: { + ...profile.settings, + streamingServerUrl, + }, + }, + }); + + toast.show({ + type: 'success', + title: `Using streaming server at ${streamingServerUrl}`, + timeout: 4000, + }); + } + }, [searchParams]); + + React.useEffect(() => { + onLocationChange(); + window.addEventListener('hashchange', onLocationChange); + return () => window.removeEventListener('hashchange', onLocationChange); + }, []); + + return null; +}; + +module.exports = withCoreSuspender(SearchParamsHandler);