Skip to content

Commit

Permalink
[Video] Hide mouse when inactive (#5094)
Browse files Browse the repository at this point in the history
  • Loading branch information
mozzius authored Sep 3, 2024
1 parent 0469ca6 commit f9d7366
Showing 1 changed file with 33 additions and 11 deletions.
44 changes: 33 additions & 11 deletions src/view/com/util/post-embeds/VideoEmbedInner/VideoWebControls.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,8 @@ export function Controls({
const setSubtitlesEnabled = useSetSubtitlesEnabled()
const {
state: hovered,
onIn: onMouseEnter,
onOut: onMouseLeave,
onIn: onHover,
onOut: onEndHover,
} = useInteractionState()
const [isFullscreen, toggleFullscreen] = useFullscreen(fullscreenRef)
const {state: hasFocus, onIn: onFocus, onOut: onBlur} = useInteractionState()
Expand Down Expand Up @@ -220,6 +220,25 @@ export function Controls({
onSeek(clamp(currentTime + 5, 0, duration))
}, [onSeek, videoRef])

const [showCursor, setShowCursor] = useState(true)
const cursorTimeoutRef = useRef<ReturnType<typeof setTimeout>>()
const onPointerMoveEmptySpace = useCallback(() => {
setShowCursor(true)
if (cursorTimeoutRef.current) {
clearTimeout(cursorTimeoutRef.current)
}
cursorTimeoutRef.current = setTimeout(() => {
setShowCursor(false)
onEndHover()
}, 2000)
}, [onEndHover])
const onPointerLeaveEmptySpace = useCallback(() => {
setShowCursor(false)
if (cursorTimeoutRef.current) {
clearTimeout(cursorTimeoutRef.current)
}
}, [])

const showControls =
(focused && !playing) || (interactingViaKeypress ? hasFocus : hovered)

Expand All @@ -236,24 +255,28 @@ export function Controls({
evt.stopPropagation()
setInteractingViaKeypress(false)
}}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onPointerEnter={onHover}
onPointerMove={onHover}
onPointerLeave={onEndHover}
onFocus={onFocus}
onBlur={onBlur}
onKeyDown={onKeyDown}>
<Pressable
accessibilityRole="button"
onPointerEnter={onPointerMoveEmptySpace}
onPointerMove={onPointerMoveEmptySpace}
onPointerLeave={onPointerLeaveEmptySpace}
accessibilityHint={_(
!focused
? msg`Unmute video`
: playing
? msg`Pause video`
: msg`Play video`,
)}
style={a.flex_1}
style={[a.flex_1, web({cursor: showCursor ? 'pointer' : 'none'})]}
onPress={onPressEmptySpace}
/>
{active && !showControls && !focused && duration > 0 && (
{!showControls && !focused && duration > 0 && (
<TimeIndicator time={Math.floor(duration - currentTime)} />
)}
<View
Expand Down Expand Up @@ -407,8 +430,8 @@ function Scrubber({
const [scrubberActive, setScrubberActive] = useState(false)
const {
state: hovered,
onIn: onMouseEnter,
onOut: onMouseLeave,
onIn: onStartHover,
onOut: onEndHover,
} = useInteractionState()
const {state: focused, onIn: onFocus, onOut: onBlur} = useInteractionState()
const [seekPosition, setSeekPosition] = useState(0)
Expand Down Expand Up @@ -521,9 +544,8 @@ function Scrubber({
<View
testID="scrubber"
style={[{height: 10, width: '100%'}, a.flex_shrink_0, a.px_xs]}
// @ts-expect-error web only -sfn
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}>
onPointerEnter={onStartHover}
onPointerLeave={onEndHover}>
<div
ref={barRef}
style={{
Expand Down

0 comments on commit f9d7366

Please sign in to comment.