diff --git a/src/App/App.js b/src/App/App.js index 7a1383dc4..04ca718ba 100644 --- a/src/App/App.js +++ b/src/App/App.js @@ -4,7 +4,7 @@ require('spatial-navigation-polyfill'); const React = require('react'); const { useTranslation } = require('react-i18next'); const { Router } = require('stremio-router'); -const { Core, Shell, Chromecast, DragAndDrop, KeyboardShortcuts, ServicesProvider } = require('stremio/services'); +const { Core, Shell, Chromecast, DragAndDrop, KeyboardShortcuts, ServicesProvider, GamepadProvider } = require('stremio/services'); const { NotFound } = require('stremio/routes'); const { FileDropProvider, PlatformProvider, ToastProvider, TooltipProvider, ShortcutsProvider, CONSTANTS, withCoreSuspender, useShell, useBinaryState } = require('stremio/common'); const ServicesToaster = require('./ServicesToaster'); @@ -22,6 +22,7 @@ const RouterWithProtectedRoutes = withCoreSuspender(withProtectedRoutes(Router)) const App = () => { const { i18n } = useTranslation(); const shell = useShell(); + const [gamepadSupportEnabled, setGamepadSupportEnabled] = React.useState(false); const onPathNotMatch = React.useCallback(() => { return NotFound; }, []); @@ -141,6 +142,10 @@ const App = () => { i18n.changeLanguage(args.settings.interfaceLanguage); } + if (args?.settings?.gamepadSupport !== undefined) { + setGamepadSupportEnabled(args.settings.gamepadSupport); + } + if (args?.settings?.quitOnClose && shell.windowClosed) { shell.send('quit'); } @@ -154,6 +159,10 @@ const App = () => { i18n.changeLanguage(state.profile.settings.interfaceLanguage); } + if (typeof state.profile.settings.gamepadSupport === 'boolean') { + setGamepadSupportEnabled(state.profile.settings.gamepadSupport); + } + if (state?.profile?.settings?.quitOnClose && shell.windowClosed) { shell.send('quit'); } @@ -213,20 +222,22 @@ const App = () => { - - { - shortcutModalOpen && - } - - - - - - + + + { + shortcutModalOpen && + } + + + + + + + diff --git a/src/components/MainNavBars/MainNavBars.tsx b/src/components/MainNavBars/MainNavBars.tsx index 43d08f5c8..e3b4a7ea4 100644 --- a/src/components/MainNavBars/MainNavBars.tsx +++ b/src/components/MainNavBars/MainNavBars.tsx @@ -3,6 +3,7 @@ import React, { memo } from 'react'; import classnames from 'classnames'; import { VerticalNavBar, HorizontalNavBar } from 'stremio/components/NavBar'; +import { useContentGamepadNavigation, useVerticalNavGamepadNavigation } from 'stremio/services/GamepadNavigation'; import styles from './MainNavBars.less'; const TABS = [ @@ -22,6 +23,12 @@ type Props = { }; const MainNavBars = memo(({ className, route, query, children }: Props) => { + const navRef = React.useRef(null); + const contentRef = React.useRef(null); + + useContentGamepadNavigation(contentRef, route || ''); + useVerticalNavGamepadNavigation(navRef, route || ''); + return (
{ navMenu={true} /> -
{children}
+
{children}
); }); diff --git a/src/components/NavBar/HorizontalNavBar/HorizontalNavBar.js b/src/components/NavBar/HorizontalNavBar/HorizontalNavBar.js index 6fed91c8a..c6c02ab46 100644 --- a/src/components/NavBar/HorizontalNavBar/HorizontalNavBar.js +++ b/src/components/NavBar/HorizontalNavBar/HorizontalNavBar.js @@ -7,6 +7,7 @@ const { default: Icon } = require('@stremio/stremio-icons/react'); const { Button, Image } = require('stremio/components'); const { default: useFullscreen } = require('stremio/common/useFullscreen'); const usePWA = require('stremio/common/usePWA'); +const { useHorizontalNavGamepadNavigation } = require('stremio/services/GamepadNavigation'); const SearchBar = require('./SearchBar'); const NavMenu = require('./NavMenu'); const styles = require('./styles'); @@ -24,6 +25,7 @@ const HorizontalNavBar = React.memo(({ className, route, query, title, backButto {children} ), []); + useHorizontalNavGamepadNavigation(route || className, backButton); return (