bsky-app/src/view/com/util/post-embeds/ActiveVideoNativeContext.tsx
2024-08-28 08:46:47 -07:00

40 lines
972 B
TypeScript

import React from 'react'
import {useVideoPlayer, VideoPlayer} from 'expo-video'
import {isNative} from '#/platform/detection'
const Context = React.createContext<{
activeSource: string | null
setActiveSource: (src: string) => void
player: VideoPlayer
} | null>(null)
export function Provider({children}: {children: React.ReactNode}) {
if (!isNative) {
throw new Error('ActiveVideoProvider may only be used on native.')
}
const [activeSource, setActiveSource] = React.useState('')
const player = useVideoPlayer(activeSource, p => {
p.muted = true
p.loop = true
p.play()
})
return (
<Context.Provider value={{activeSource, setActiveSource, player}}>
{children}
</Context.Provider>
)
}
export function useActiveVideoNative() {
const context = React.useContext(Context)
if (!context) {
throw new Error(
'useActiveVideoNative must be used within a ActiveVideoNativeProvider',
)
}
return context
}