From 8689861f64612f8e962aadfa538066f6b21e8355 Mon Sep 17 00:00:00 2001 From: Tim Date: Mon, 31 Oct 2022 17:08:26 +0100 Subject: [PATCH 1/5] refactor(NavMenu): remove remote control --- src/common/NavBar/HorizontalNavBar/NavMenu/NavMenuContent.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/common/NavBar/HorizontalNavBar/NavMenu/NavMenuContent.js b/src/common/NavBar/HorizontalNavBar/NavMenu/NavMenuContent.js index 7dce73962..8c5362e9f 100644 --- a/src/common/NavBar/HorizontalNavBar/NavMenu/NavMenuContent.js +++ b/src/common/NavBar/HorizontalNavBar/NavMenu/NavMenuContent.js @@ -57,10 +57,6 @@ const NavMenuContent = ({ onClick }) => {
Addons
- - From 65b576f0040a73689407fecb152a056b4f5288e1 Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 2 Nov 2022 02:52:55 +0100 Subject: [PATCH 3/5] refactor: move magnet torrent logic to a hook --- .../NavMenu/NavMenuContent.js | 14 ++---- .../HorizontalNavBar/SearchBar/SearchBar.js | 20 ++------ src/common/index.js | 4 +- src/common/useTorrent.js | 50 +++++++++++++++++++ 4 files changed, 61 insertions(+), 27 deletions(-) create mode 100644 src/common/useTorrent.js diff --git a/src/common/NavBar/HorizontalNavBar/NavMenu/NavMenuContent.js b/src/common/NavBar/HorizontalNavBar/NavMenu/NavMenuContent.js index a52de8816..efcef4feb 100644 --- a/src/common/NavBar/HorizontalNavBar/NavMenu/NavMenuContent.js +++ b/src/common/NavBar/HorizontalNavBar/NavMenu/NavMenuContent.js @@ -3,18 +3,19 @@ const React = require('react'); const PropTypes = require('prop-types'); const classnames = require('classnames'); -const magnet = require('magnet-uri'); const Icon = require('@stremio/stremio-icons/dom'); const { useServices } = require('stremio/services'); const Button = require('stremio/common/Button'); const useFullscreen = require('stremio/common/useFullscreen'); const useProfile = require('stremio/common/useProfile'); +const useTorrent = require('stremio/common/useTorrent'); const { withCoreSuspender } = require('stremio/common/CoreSuspender'); const styles = require('./styles'); const NavMenuContent = ({ onClick }) => { const { core } = useServices(); const profile = useProfile(); + const { createTorrentFromMagnet } = useTorrent(); const [fullscreen, requestFullscreen, exitFullscreen] = useFullscreen(); const logoutButtonOnClick = React.useCallback(() => { core.transport.dispatch({ @@ -27,16 +28,7 @@ const NavMenuContent = ({ onClick }) => { const onPlayMagnetLinkClick = React.useCallback(async () => { try { const clipboardText = await navigator.clipboard.readText(); - const parsed = magnet.decode(clipboardText); - if (parsed && typeof parsed.infoHash === 'string') { - core.transport.dispatch({ - action: 'StreamingServer', - args: { - action: 'CreateTorrent', - args: clipboardText - } - }); - } + createTorrentFromMagnet(clipboardText); } catch(e) { console.error(e); } diff --git a/src/common/NavBar/HorizontalNavBar/SearchBar/SearchBar.js b/src/common/NavBar/HorizontalNavBar/SearchBar/SearchBar.js index 2bc3a657b..f6ff91122 100644 --- a/src/common/NavBar/HorizontalNavBar/SearchBar/SearchBar.js +++ b/src/common/NavBar/HorizontalNavBar/SearchBar/SearchBar.js @@ -3,17 +3,17 @@ const React = require('react'); const PropTypes = require('prop-types'); const classnames = require('classnames'); -const magnet = require('magnet-uri'); -const { useServices } = require('stremio/services'); const Icon = require('@stremio/stremio-icons/dom'); const { useRouteFocused } = require('stremio-router'); const Button = require('stremio/common/Button'); const TextInput = require('stremio/common/TextInput'); +const useTorrent = require('stremio/common/useTorrent'); +const { withCoreSuspender } = require('stremio/common/CoreSuspender'); const styles = require('./styles'); const SearchBar = ({ className, query, active }) => { - const { core } = useServices(); const routeFocused = useRouteFocused(); + const { createTorrentFromMagnet } = useTorrent(); const searchInputRef = React.useRef(null); const searchBarOnClick = React.useCallback(() => { if (!active) { @@ -22,17 +22,7 @@ const SearchBar = ({ className, query, active }) => { }, [active]); const queryInputOnChange = React.useCallback(() => { try { - const parsed = magnet.decode(searchInputRef.current.value); - if (parsed && typeof parsed.infoHash === 'string') { - core.transport.dispatch({ - action: 'StreamingServer', - args: { - action: 'CreateTorrent', - args: searchInputRef.current.value - } - }); - searchInputRef.current.value = ''; - } + createTorrentFromMagnet(searchInputRef.current.value); // eslint-disable-next-line no-empty } catch { } }, []); @@ -80,4 +70,4 @@ SearchBar.propTypes = { active: PropTypes.bool }; -module.exports = SearchBar; +module.exports = withCoreSuspender(SearchBar); diff --git a/src/common/index.js b/src/common/index.js index 54fac3a83..90c266e64 100644 --- a/src/common/index.js +++ b/src/common/index.js @@ -38,6 +38,7 @@ const useModelState = require('./useModelState'); const useOnScrollToBottom = require('./useOnScrollToBottom'); const useProfile = require('./useProfile'); const useStreamingServer = require('./useStreamingServer'); +const useTorrent = require('./useTorrent'); module.exports = { AddonDetailsModal, @@ -80,5 +81,6 @@ module.exports = { useModelState, useOnScrollToBottom, useProfile, - useStreamingServer + useStreamingServer, + useTorrent }; diff --git a/src/common/useTorrent.js b/src/common/useTorrent.js new file mode 100644 index 000000000..da209fd8e --- /dev/null +++ b/src/common/useTorrent.js @@ -0,0 +1,50 @@ +// Copyright (C) 2017-2022 Smart code 203358507 + +const React = require('react'); +const magnet = require('magnet-uri'); +const { useServices } = require('stremio/services'); +const useToast = require('stremio/common/Toast/useToast'); +const useStreamingServer = require('stremio/common/useStreamingServer'); + +const useTorrent = () => { + const { core } = useServices(); + const streamingServer = useStreamingServer(); + const toast = useToast(); + const createTorrentTimeout = React.useRef(null); + const createTorrentFromMagnet = React.useCallback((text) => { + const parsed = magnet.decode(text); + if (parsed && typeof parsed.infoHash === 'string') { + core.transport.dispatch({ + action: 'StreamingServer', + args: { + action: 'CreateTorrent', + args: text + } + }); + clearTimeout(createTorrentTimeout.current); + createTorrentTimeout.current = setTimeout(() => { + toast.show({ + type: 'error', + title: 'It\'s taking a long time to get metadata from the torrent.', + timeout: 10000 + }); + }, 10000); + } + }, [toast]); + React.useEffect(() => { + if (streamingServer.torrent !== null) { + const [, { type }] = streamingServer.torrent; + if (type === 'Ready') { + clearTimeout(createTorrentTimeout.current); + } + } + }, [streamingServer.torrent]); + React.useEffect(() => { + return () => clearTimeout(createTorrentTimeout.current); + }, []); + return { + createTorrentFromMagnet + }; +}; + +module.exports = useTorrent; From ea5e0f8c27c5221638000b7368f2085cdfdd5cc3 Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 2 Nov 2022 17:05:49 +0100 Subject: [PATCH 4/5] fix(useTorrent): remove toast from hook deps --- src/common/useTorrent.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/useTorrent.js b/src/common/useTorrent.js index da209fd8e..6ecfe4de6 100644 --- a/src/common/useTorrent.js +++ b/src/common/useTorrent.js @@ -30,7 +30,7 @@ const useTorrent = () => { }); }, 10000); } - }, [toast]); + }, []); React.useEffect(() => { if (streamingServer.torrent !== null) { const [, { type }] = streamingServer.torrent; From 7713d6579df9c0812ae637225e0b349c04f7873c Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 2 Nov 2022 17:15:18 +0100 Subject: [PATCH 5/5] refactor(SearchBar): add core suspender fallback --- .../HorizontalNavBar/SearchBar/SearchBar.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/common/NavBar/HorizontalNavBar/SearchBar/SearchBar.js b/src/common/NavBar/HorizontalNavBar/SearchBar/SearchBar.js index f6ff91122..dd76c8e84 100644 --- a/src/common/NavBar/HorizontalNavBar/SearchBar/SearchBar.js +++ b/src/common/NavBar/HorizontalNavBar/SearchBar/SearchBar.js @@ -70,4 +70,17 @@ SearchBar.propTypes = { active: PropTypes.bool }; -module.exports = withCoreSuspender(SearchBar); +const SearchBarFallback = ({ className }) => ( + +); + +SearchBarFallback.propTypes = SearchBar.propTypes; + +module.exports = withCoreSuspender(SearchBar, SearchBarFallback);