From dd0e44e665e9d08ec7e85a19be68f7e6fa0a45d9 Mon Sep 17 00:00:00 2001 From: Samuel Newman <10959775+mozzius@users.noreply.github.com> Date: Fri, 2 Aug 2024 21:58:32 +0200 Subject: [PATCH] render player earlier, allowing preload --- .../com/util/post-embeds/VideoEmbed.web.tsx | 47 ++++--------------- .../com/util/post-embeds/VideoEmbedInner.tsx | 1 - .../util/post-embeds/VideoEmbedInner.web.tsx | 12 ++--- .../com/util/post-embeds/VideoWebControls.tsx | 2 +- .../util/post-embeds/VideoWebControls.web.tsx | 2 +- 5 files changed, 15 insertions(+), 49 deletions(-) diff --git a/src/view/com/util/post-embeds/VideoEmbed.web.tsx b/src/view/com/util/post-embeds/VideoEmbed.web.tsx index 6cd1b45805..26b5c66c83 100644 --- a/src/view/com/util/post-embeds/VideoEmbed.web.tsx +++ b/src/view/com/util/post-embeds/VideoEmbed.web.tsx @@ -1,11 +1,7 @@ -import React, {useCallback, useEffect, useRef, useState} from 'react' +import React, {useEffect, useRef, useState} from 'react' import {View} from 'react-native' -import {msg} from '@lingui/macro' -import {useLingui} from '@lingui/react' import {atoms as a, useTheme} from '#/alf' -import {Button, ButtonIcon} from '#/components/Button' -import {Play_Filled_Corner2_Rounded as PlayIcon} from '#/components/icons/Play' import {useActiveVideoView} from './ActiveVideoContext' import {VideoEmbedInner} from './VideoEmbedInner' @@ -17,10 +13,6 @@ export function VideoEmbed({source}: {source: string}) { source, }) const [onScreen, setOnScreen] = useState(false) - const [hasBeenOnScreen, setHasBeenOnScreen] = useState(false) - const {_} = useLingui() - - const onPress = useCallback(() => setActive(), [setActive]) useEffect(() => { if (!ref.current) return @@ -29,9 +21,6 @@ export function VideoEmbed({source}: {source: string}) { const entry = entries[0] if (!entry) return setOnScreen(entry.isIntersecting) - if (entry.isIntersecting) { - setHasBeenOnScreen(true) - } sendPosition( entry.boundingClientRect.y + entry.boundingClientRect.height / 2, ) @@ -42,11 +31,6 @@ export function VideoEmbed({source}: {source: string}) { return () => observer.disconnect() }, [sendPosition]) - const onGoFarOffScreen = useCallback(() => { - setOnScreen(false) - setHasBeenOnScreen(false) - }, []) - return ( evt.stopPropagation()}> - {hasBeenOnScreen || active ? ( - - ) : ( - - )} + ) diff --git a/src/view/com/util/post-embeds/VideoEmbedInner.tsx b/src/view/com/util/post-embeds/VideoEmbedInner.tsx index 2cf098e697..cb213c0edf 100644 --- a/src/view/com/util/post-embeds/VideoEmbedInner.tsx +++ b/src/view/com/util/post-embeds/VideoEmbedInner.tsx @@ -20,7 +20,6 @@ export function VideoEmbedInner({}: { sendPosition: (position: number) => void onScreen: boolean isAnyViewActive?: boolean - onGoFarOffScreen: () => void }) { const player = useVideoPlayer() const aref = useAnimatedRef() diff --git a/src/view/com/util/post-embeds/VideoEmbedInner.web.tsx b/src/view/com/util/post-embeds/VideoEmbedInner.web.tsx index 37ddc3f5b3..74d583f95a 100644 --- a/src/view/com/util/post-embeds/VideoEmbedInner.web.tsx +++ b/src/view/com/util/post-embeds/VideoEmbedInner.web.tsx @@ -9,7 +9,6 @@ export function VideoEmbedInner({ active, sendPosition, isAnyViewActive, - onGoFarOffScreen, ...props }: { source: string @@ -17,10 +16,10 @@ export function VideoEmbedInner({ setActive: () => void sendPosition: (position: number) => void onScreen: boolean - onGoFarOffScreen: () => void isAnyViewActive?: boolean }) { const ref = useRef(null) + const [nearScreen, setNearScreen] = useState(false) // Send position when scrolling. This is done with an IntersectionObserver // observing a div of 100vh height @@ -33,16 +32,13 @@ export function VideoEmbedInner({ const position = entry.boundingClientRect.y + entry.boundingClientRect.height / 2 sendPosition(position) - if (!entry.isIntersecting) { - // unmounts the video player - onGoFarOffScreen() - } + setNearScreen(entry.isIntersecting) }, {threshold: Array.from({length: 101}, (_, i) => i / 100)}, ) observer.observe(ref.current) return () => observer.disconnect() - }, [sendPosition, onGoFarOffScreen]) + }, [sendPosition]) // In case scrolling hasn't started yet, send up the position useEffect(() => { @@ -55,7 +51,7 @@ export function VideoEmbedInner({ return ( - + {nearScreen && }
- hlsRef: React.RefObject + hlsRef: React.RefObject active: boolean setActive: () => void focused: boolean diff --git a/src/view/com/util/post-embeds/VideoWebControls.web.tsx b/src/view/com/util/post-embeds/VideoWebControls.web.tsx index 9be64f2d17..5b8a392f56 100644 --- a/src/view/com/util/post-embeds/VideoWebControls.web.tsx +++ b/src/view/com/util/post-embeds/VideoWebControls.web.tsx @@ -40,7 +40,7 @@ export function Controls({ hasSubtitleTrack, }: { videoRef: React.RefObject - hlsRef: React.RefObject + hlsRef: React.RefObject active: boolean setActive: () => void focused: boolean