about summary refs log tree commit diff
path: root/src/view/com/util/post-embeds/VideoVolumeContext.tsx
diff options
context:
space:
mode:
authorSamuel Newman <mozzius@protonmail.com>2024-09-16 21:37:33 +0100
committerGitHub <noreply@github.com>2024-09-16 21:37:33 +0100
commit8241747fc22bb4363ff6cf48d54013cc72db7624 (patch)
treee6cd31d82100fb9c99f3443d7b2753672b55373c /src/view/com/util/post-embeds/VideoVolumeContext.tsx
parent38c8f01594ff515fbe49d00a777d70449e804fd4 (diff)
downloadvoidsky-8241747fc22bb4363ff6cf48d54013cc72db7624.tar.zst
[Video] Volume controls on web (#5363)
* split up VideoWebControls

* add basic slider

* logarithmic volume

* integrate mute state

* fix typo

* shared video volume

* rm log

* animate in/out

* disable for touch devices

* remove flicker on touch devices

* more detailed comment

* move into correct context provider

* add minHeight

* hack

* bettern umber

---------

Co-authored-by: Hailey <me@haileyok.com>
Diffstat (limited to 'src/view/com/util/post-embeds/VideoVolumeContext.tsx')
-rw-r--r--src/view/com/util/post-embeds/VideoVolumeContext.tsx31
1 files changed, 23 insertions, 8 deletions
diff --git a/src/view/com/util/post-embeds/VideoVolumeContext.tsx b/src/view/com/util/post-embeds/VideoVolumeContext.tsx
index cccb93ba8..6343081da 100644
--- a/src/view/com/util/post-embeds/VideoVolumeContext.tsx
+++ b/src/view/com/util/post-embeds/VideoVolumeContext.tsx
@@ -1,21 +1,26 @@
 import React from 'react'
 
-const Context = React.createContext(
-  {} as {
-    muted: boolean
-    setMuted: (muted: boolean) => void
-  },
-)
+const Context = React.createContext<{
+  // native
+  muted: boolean
+  setMuted: React.Dispatch<React.SetStateAction<boolean>>
+  // web
+  volume: number
+  setVolume: React.Dispatch<React.SetStateAction<number>>
+} | null>(null)
 
 export function Provider({children}: {children: React.ReactNode}) {
   const [muted, setMuted] = React.useState(true)
+  const [volume, setVolume] = React.useState(1)
 
   const value = React.useMemo(
     () => ({
       muted,
       setMuted,
+      volume,
+      setVolume,
     }),
-    [muted, setMuted],
+    [muted, setMuted, volume, setVolume],
   )
 
   return <Context.Provider value={value}>{children}</Context.Provider>
@@ -28,5 +33,15 @@ export function useVideoVolumeState() {
       'useVideoVolumeState must be used within a VideoVolumeProvider',
     )
   }
-  return context
+  return [context.volume, context.setVolume] as const
+}
+
+export function useVideoMuteState() {
+  const context = React.useContext(Context)
+  if (!context) {
+    throw new Error(
+      'useVideoMuteState must be used within a VideoVolumeProvider',
+    )
+  }
+  return [context.muted, context.setMuted] as const
 }