From 6eabedd037e6631eef4be5302b25e6cdba18f126 Mon Sep 17 00:00:00 2001
From: Hailey <me@haileyok.com>
Date: Thu, 5 Sep 2024 14:54:09 -0700
Subject: [Video] More adjustments for loading state jank (#5171)

---
 src/view/com/util/post-embeds/VideoEmbed.tsx | 90 +++++++++++++++-------------
 1 file changed, 47 insertions(+), 43 deletions(-)

(limited to 'src/view/com/util/post-embeds/VideoEmbed.tsx')

diff --git a/src/view/com/util/post-embeds/VideoEmbed.tsx b/src/view/com/util/post-embeds/VideoEmbed.tsx
index 2dafce7ba..7db25b4d0 100644
--- a/src/view/com/util/post-embeds/VideoEmbed.tsx
+++ b/src/view/com/util/post-embeds/VideoEmbed.tsx
@@ -68,7 +68,9 @@ function InnerWrapper({embed}: Props) {
     useActiveVideoNative()
   const viewId = useId()
 
-  const [playerStatus, setPlayerStatus] = useState<VideoPlayerStatus>('loading')
+  const [playerStatus, setPlayerStatus] = useState<
+    VideoPlayerStatus | 'switching'
+  >('loading')
   const [isMuted, setIsMuted] = useState(player.muted)
   const [isFullscreen, setIsFullscreen] = React.useState(false)
   const [timeRemaining, setTimeRemaining] = React.useState(0)
@@ -77,6 +79,8 @@ function InnerWrapper({embed}: Props) {
     isActive &&
     (playerStatus === 'waitingToPlayAtSpecifiedRate' ||
       playerStatus === 'loading')
+  const isSwitching = playerStatus === 'switching'
+  const showOverlay = !isActive || isLoading || isSwitching
 
   // send error up to error boundary
   const [error, setError] = useState<Error | PlayerError | null>(null)
@@ -130,6 +134,7 @@ function InnerWrapper({embed}: Props) {
         player.play()
       }
     } else {
+      setPlayerStatus('switching')
       player.muted = true
       if (player.playing) {
         player.pause()
@@ -148,48 +153,47 @@ function InnerWrapper({embed}: Props) {
           setIsFullscreen={setIsFullscreen}
         />
       ) : null}
-      {!isActive || isLoading ? (
-        <View
-          style={[
-            {
-              position: 'absolute',
-              top: 0,
-              bottom: 0,
-              left: 0,
-              right: 0,
-            },
-          ]}>
-          <Image
-            source={{uri: embed.thumbnail}}
-            alt={embed.alt}
-            style={a.flex_1}
-            contentFit="cover"
-            accessibilityIgnoresInvertColors
-          />
-          <Button
-            style={[a.absolute, a.inset_0]}
-            onPress={() => {
-              setActiveSource(embed.playlist, viewId)
-            }}
-            label={_(msg`Play video`)}
-            color="secondary">
-            {isLoading ? (
-              <View
-                style={[
-                  a.rounded_full,
-                  a.p_xs,
-                  a.absolute,
-                  {top: 'auto', left: 'auto'},
-                  {backgroundColor: 'rgba(0,0,0,0.5)'},
-                ]}>
-                <Loader size="2xl" style={{color: 'white'}} />
-              </View>
-            ) : (
-              <PlayButtonIcon />
-            )}
-          </Button>
-        </View>
-      ) : null}
+      <View
+        style={[
+          {
+            position: 'absolute',
+            top: 0,
+            bottom: 0,
+            left: 0,
+            right: 0,
+            display: showOverlay ? 'flex' : 'none',
+          },
+        ]}>
+        <Image
+          source={{uri: embed.thumbnail}}
+          alt={embed.alt}
+          style={a.flex_1}
+          contentFit="cover"
+          accessibilityIgnoresInvertColors
+        />
+        <Button
+          style={[a.absolute, a.inset_0]}
+          onPress={() => {
+            setActiveSource(embed.playlist, viewId)
+          }}
+          label={_(msg`Play video`)}
+          color="secondary">
+          {isLoading ? (
+            <View
+              style={[
+                a.rounded_full,
+                a.p_xs,
+                a.absolute,
+                {top: 'auto', left: 'auto'},
+                {backgroundColor: 'rgba(0,0,0,0.5)'},
+              ]}>
+              <Loader size="2xl" style={{color: 'white'}} />
+            </View>
+          ) : (
+            <PlayButtonIcon />
+          )}
+        </Button>
+      </View>
     </VisibilityView>
   )
 }
-- 
cgit 1.4.1

