about summary refs log tree commit diff
path: root/src/view/com/util/post-embeds/ActiveVideoNativeContext.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/view/com/util/post-embeds/ActiveVideoNativeContext.tsx')
-rw-r--r--src/view/com/util/post-embeds/ActiveVideoNativeContext.tsx40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/view/com/util/post-embeds/ActiveVideoNativeContext.tsx b/src/view/com/util/post-embeds/ActiveVideoNativeContext.tsx
new file mode 100644
index 000000000..77616d788
--- /dev/null
+++ b/src/view/com/util/post-embeds/ActiveVideoNativeContext.tsx
@@ -0,0 +1,40 @@
+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
+}