Bluesky app fork with some witchin' additions 馃挮
witchsky.app
bluesky
fork
client
1import React from 'react'
2
3import {device, useStorage} from '#/storage'
4
5const Context = React.createContext<{
6 // native
7 muted: boolean
8 setMuted: (v: boolean) => void
9 // web
10 volume: number
11 setVolume: (v: number) => void
12} | null>(null)
13Context.displayName = 'VideoVolumeContext'
14
15export function Provider({children}: {children: React.ReactNode}) {
16 const [muted, setMuted] = React.useState(true)
17 const [volume = 1, setVolume] = useStorage(device, ['videoVolume'])
18
19 const value = React.useMemo(
20 () => ({
21 muted,
22 setMuted,
23 volume,
24 setVolume,
25 }),
26 [muted, setMuted, volume, setVolume],
27 )
28
29 return <Context.Provider value={value}>{children}</Context.Provider>
30}
31
32export function useVideoVolumeState() {
33 const context = React.useContext(Context)
34 if (!context) {
35 throw new Error(
36 'useVideoVolumeState must be used within a VideoVolumeProvider',
37 )
38 }
39 return [context.volume, context.setVolume] as const
40}
41
42export function useVideoMuteState() {
43 const context = React.useContext(Context)
44 if (!context) {
45 throw new Error(
46 'useVideoMuteState must be used within a VideoVolumeProvider',
47 )
48 }
49 return [context.muted, context.setMuted] as const
50}