diff --git a/src/routes/Player/ControlBar/ControlBar.js b/src/routes/Player/ControlBar/ControlBar.js index 60e3157a0..c81d0e38e 100644 --- a/src/routes/Player/ControlBar/ControlBar.js +++ b/src/routes/Player/ControlBar/ControlBar.js @@ -41,6 +41,8 @@ const ControlBar = ({ onToggleOptionsMenu, onToggleStatisticsMenu, onContextMenu, + onTouchStart, + onTouchEnd, ...props }) => { const { chromecast } = useServices(); @@ -104,7 +106,7 @@ const ControlBar = ({ }; }, []); return ( -
+
{ toggleFullscreen(); }, [toggleFullscreen]); - const onContextMenu = React.useCallback((e) => { - e.preventDefault(); - const { clientX, clientY } = e; + const handleContextMenuPosition = (clientX, clientY) => { const safeAreaTop = parseFloat(getComputedStyle(document.documentElement).getPropertyValue('env(safe-area-inset-top)')) || 0; const safeAreaRight = parseFloat(getComputedStyle(document.documentElement).getPropertyValue('env(safe-area-inset-right)')) || 0; const safeAreaBottom = parseFloat(getComputedStyle(document.documentElement).getPropertyValue('env(safe-area-inset-bottom)')) || 0; @@ -280,9 +278,24 @@ const Player = ({ urlParams, queryParams }) => { x: adjustedX, y: adjustedY, }); + }; + + const onContextMenu = React.useCallback((e) => { + e.preventDefault(); + const { clientX, clientY } = e; + handleContextMenuPosition(clientX, clientY); openContextMenu(); }, [contextMenuRef]); + const onTouchStart = (event) => { + const touch = event.touches[0]; + handleContextMenuPosition(touch.clientX, touch.clientY); + }; + + const onTouchEnd = () => { + openContextMenu(); + }; + React.useEffect(() => { if (!contextMenuOpen) { const menuSize = contextMenuRef?.current?.getBoundingClientRect(); @@ -689,7 +702,7 @@ const Player = ({ urlParams, queryParams }) => { /> { !video.state.loaded ? -
+
: @@ -697,7 +710,7 @@ const Player = ({ urlParams, queryParams }) => { } { (video.state.buffering || !video.state.loaded) && !error ? - + : null } @@ -755,6 +768,8 @@ const Player = ({ urlParams, queryParams }) => { onMouseMove={onBarMouseMove} onMouseOver={onBarMouseMove} onContextMenu={onContextMenu} + onTouchStart={onTouchStart} + onTouchEnd={onTouchEnd} /> { player.metaItem?.type === 'Ready' ? @@ -762,6 +777,8 @@ const Player = ({ urlParams, queryParams }) => { className={classnames(styles['layer'], styles['side-drawer-button-layer'])} onClick={toggleSideDrawer} onContextMenu={onContextMenu} + onTouchStart={onTouchStart} + onTouchEnd={onTouchEnd} /> : null @@ -797,6 +814,8 @@ const Player = ({ urlParams, queryParams }) => { onMouseMove={onBarMouseMove} onMouseOver={onBarMouseMove} onContextMenu={onContextMenu} + onTouchStart={onTouchStart} + onTouchEnd={onTouchEnd} /> { nextVideoPopupOpen ? diff --git a/src/routes/Player/SideDrawerButton/SideDrawerButton.tsx b/src/routes/Player/SideDrawerButton/SideDrawerButton.tsx index 5f5590476..9d5897548 100644 --- a/src/routes/Player/SideDrawerButton/SideDrawerButton.tsx +++ b/src/routes/Player/SideDrawerButton/SideDrawerButton.tsx @@ -1,6 +1,6 @@ // Copyright (C) 2017-2024 Smart code 203358507 -import React from 'react'; +import React, { BaseSyntheticEvent } from 'react'; import classNames from 'classnames'; import Icon from '@stremio/stremio-icons/react'; import styles from './SideDrawerButton.less'; @@ -9,11 +9,13 @@ type Props = { className: string, onClick: () => void, onContextMenu: () => void, + onTouchStart: (event: BaseSyntheticEvent) => void, + onTouchEnd: () => void, }; -const SideDrawerButton = ({ className, onClick, onContextMenu }: Props) => { +const SideDrawerButton = ({ className, onClick, onContextMenu, onTouchStart, onTouchEnd }: Props) => { return ( -
+
);