// Copyright (C) 2017-2026 Smart code 203358507 import React, { useEffect } from 'react'; import { createPortal } from 'react-dom'; import { useTranslation } from 'react-i18next'; import Icon from '@stremio/stremio-icons/react'; import { Button } from 'stremio/components'; import { useGamepad } from 'stremio/services'; import type { ControllerType } from 'stremio/services/GamepadContext'; import GamepadDiagram from './GamepadDiagram'; import styles from './styles.less'; const LEFT = '←'; const RIGHT = '→'; const UP = '↑'; const DOWN = '↓'; type FaceLabels = { bottom: string; right: string; left: string; top: string; lb: string; rb: string; lStick: string; rStick: string; }; const LABELS: Record = { playstation: { bottom: '✕', right: '○', left: '□', top: '△', lb: 'L1', rb: 'R1', lStick: 'L stick', rStick: 'R stick', }, xbox: { bottom: 'A', right: 'B', left: 'X', top: 'Y', lb: 'LB', rb: 'RB', lStick: 'L stick', rStick: 'R stick', }, generic: { bottom: '✕', right: '○', left: '□', top: '△', lb: 'L1', rb: 'R1', lStick: 'L stick', rStick: 'R stick', }, }; type Props = { onClose: () => void, }; const GamepadModal = ({ onClose }: Props) => { const { t } = useTranslation(); const gamepad = useGamepad(); const labels = LABELS[gamepad?.controllerType ?? 'generic']; useEffect(() => { gamepad?.lock('gamepad-'); const onKeyDown = ({ key }: KeyboardEvent) => { key === 'Escape' && onClose(); }; document.addEventListener('keydown', onKeyDown); gamepad?.on('buttonB', 'gamepad-modal', onClose); return () => { document.removeEventListener('keydown', onKeyDown); gamepad?.off('buttonB', 'gamepad-modal'); gamepad?.unlock(); }; }, [gamepad]); return createPortal((
{t('GAMEPAD_CONTROLS_TITLE')}
{t('GAMEPAD_SECTION_NAVIGATION')}
{labels.lStick} {t('GAMEPAD_ACTION_NAVIGATE')}
{labels.bottom} {t('GAMEPAD_ACTION_SELECT')}
{labels.right} {t('GAMEPAD_ACTION_BACK')}
{labels.top} {t('GAMEPAD_ACTION_FULLSCREEN')}
{labels.left} {t('GAMEPAD_ACTION_GUIDE')}
{labels.lb} {t('GAMEPAD_ACTION_PREV_TAB')}
{labels.rb} {t('GAMEPAD_ACTION_NEXT_TAB')}
{t('GAMEPAD_SECTION_PLAYER')}
{labels.left} {t('GAMEPAD_ACTION_PLAY_PAUSE')}
{labels.rStick} {LEFT} {t('GAMEPAD_ACTION_SEEK_BACK')}
{labels.rStick} {RIGHT} {t('GAMEPAD_ACTION_SEEK_FWD')}
{labels.rStick} {UP} {t('GAMEPAD_ACTION_VOL_UP')}
{labels.rStick} {DOWN} {t('GAMEPAD_ACTION_VOL_DOWN')}
), document.body); }; export default GamepadModal;