From 66b17657197e26d9b4c5c951e7cc9eef66519d6d Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Wed, 11 Jun 2025 22:26:27 +0300 Subject: [PATCH] lift up useFullscreen, hide mediainsetborder when fullscreen --- .../VideoEmbedInner/VideoEmbedInnerWeb.tsx | 20 +++++++++++++++---- .../web-controls/VideoControls.tsx | 19 +++++------------- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/view/com/util/post-embeds/VideoEmbedInner/VideoEmbedInnerWeb.tsx b/src/view/com/util/post-embeds/VideoEmbedInner/VideoEmbedInnerWeb.tsx index 77f6cd0a6c..e4c29d0b6c 100644 --- a/src/view/com/util/post-embeds/VideoEmbedInner/VideoEmbedInnerWeb.tsx +++ b/src/view/com/util/post-embeds/VideoEmbedInner/VideoEmbedInnerWeb.tsx @@ -1,4 +1,4 @@ -import React, {useEffect, useId, useRef, useState} from 'react' +import {useEffect, useId, useRef, useState} from 'react' import {View} from 'react-native' import {type AppBskyEmbedVideo} from '@atproto/api' import {msg} from '@lingui/macro' @@ -7,6 +7,7 @@ import type * as HlsTypes from 'hls.js' import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback' import {atoms as a} from '#/alf' +import {useFullscreen} from '#/components/hooks/useFullscreen' import {MediaInsetBorder} from '#/components/MediaInsetBorder' import * as BandwidthEstimate from './bandwidth-estimate' import {Controls} from './web-controls/VideoControls' @@ -25,10 +26,11 @@ export function VideoEmbedInnerWeb({ lastKnownTime: React.MutableRefObject }) { const containerRef = useRef(null) + const [isFullscreen, toggleFullscreen] = useFullscreen(containerRef) const videoRef = useRef(null) const [focused, setFocused] = useState(false) const [hasSubtitleTrack, setHasSubtitleTrack] = useState(false) - const [hlsLoading, setHlsLoading] = React.useState(false) + const [hlsLoading, setHlsLoading] = useState(false) const figId = useId() const {_} = useLingui() @@ -52,6 +54,15 @@ export function VideoEmbedInnerWeb({ } }, [lastKnownTime]) + useEffect(() => { + if (isFullscreen) { + document.documentElement.style.scrollbarGutter = 'unset' + return () => { + document.documentElement.style.removeProperty('scrollbar-gutter') + } + } + }, [isFullscreen]) + return ( - + {!isFullscreen && } ) diff --git a/src/view/com/util/post-embeds/VideoEmbedInner/web-controls/VideoControls.tsx b/src/view/com/util/post-embeds/VideoEmbedInner/web-controls/VideoControls.tsx index 8e134d2217..c7ed4f5c35 100644 --- a/src/view/com/util/post-embeds/VideoEmbedInner/web-controls/VideoControls.tsx +++ b/src/view/com/util/post-embeds/VideoEmbedInner/web-controls/VideoControls.tsx @@ -1,4 +1,4 @@ -import React, {useCallback, useEffect, useRef, useState} from 'react' +import {useCallback, useEffect, useRef, useState} from 'react' import {Pressable, View} from 'react-native' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' @@ -14,7 +14,6 @@ import { } from '#/state/preferences' import {atoms as a, useTheme, web} from '#/alf' import {useIsWithinMessage} from '#/components/dms/MessageContext' -import {useFullscreen} from '#/components/hooks/useFullscreen' import {useInteractionState} from '#/components/hooks/useInteractionState' import { ArrowsDiagonalIn_Stroke2_Corner0_Rounded as ArrowsInIcon, @@ -42,7 +41,8 @@ export function Controls({ focused, setFocused, onScreen, - fullscreenRef, + isFullscreen, + toggleFullscreen, hlsLoading, hasSubtitleTrack, }: { @@ -53,7 +53,8 @@ export function Controls({ focused: boolean setFocused: (focused: boolean) => void onScreen: boolean - fullscreenRef: React.RefObject + isFullscreen: boolean + toggleFullscreen: () => void hlsLoading: boolean hasSubtitleTrack: boolean }) { @@ -79,7 +80,6 @@ export function Controls({ onIn: onHover, onOut: onEndHover, } = useInteractionState() - const [isFullscreen, toggleFullscreen] = useFullscreen(fullscreenRef) const {state: hasFocus, onIn: onFocus, onOut: onBlur} = useInteractionState() const [interactingViaKeypress, setInteractingViaKeypress] = useState(false) const showSpinner = hlsLoading || buffering @@ -104,15 +104,6 @@ export function Controls({ } }, [interactingViaKeypress]) - useEffect(() => { - if (isFullscreen) { - document.documentElement.style.scrollbarGutter = 'unset' - return () => { - document.documentElement.style.removeProperty('scrollbar-gutter') - } - } - }, [isFullscreen]) - // pause + unfocus when another video is active useEffect(() => { if (!active) {