From 645b226359b67000542e192e8682876c837eac39 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Tue, 14 Jul 2026 19:47:23 +0200 Subject: [PATCH] fix(source): ensure object update doesn't reset player --- bun.lock | 6 +++--- src/provider.web.tsx | 15 +++++++++++++-- src/view.web.tsx | 18 +++++++++++------- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/bun.lock b/bun.lock index ce4eca7..822705b 100644 --- a/bun.lock +++ b/bun.lock @@ -23,9 +23,9 @@ "typescript": "^7.0.2", }, "peerDependencies": { - "react": "19.2.7", - "react-native": "0.86.0", - "react-native-nitro-modules": "0.36.1", + "react": ">=19.0.0", + "react-native": ">=0.86.0", + "react-native-nitro-modules": ">=0.36.0", }, }, "example": { diff --git a/src/provider.web.tsx b/src/provider.web.tsx index fa3a81d..62dc528 100644 --- a/src/provider.web.tsx +++ b/src/provider.web.tsx @@ -1,6 +1,12 @@ import { createPlayer } from "@videojs/react"; import { videoFeatures } from "@videojs/react/video"; -import { createContext, type ReactNode, useContext, useEffect } from "react"; +import { + createContext, + type ReactNode, + useContext, + useEffect, + useRef, +} from "react"; import { WebOmniPlayer } from "./player.web"; import type { OmniPlayer } from "./types/player"; import type { Source } from "./types/source"; @@ -39,10 +45,15 @@ const PlayerInitializer = ({ }) => { const store = VideoPlayer.usePlayer(); const player = useLazyRef(() => new WebOmniPlayer(store)); + const seekedForSrc = useRef(undefined); useEffect(() => { player.source = source; - if (source.startTime) store.seek(source.startTime).catch(() => {}); + const uri = source.src[0]?.uri; + if (uri !== seekedForSrc.current) { + seekedForSrc.current = uri; + if (source.startTime) store.seek(source.startTime) + } }, [source, store]); useEffect(() => { diff --git a/src/view.web.tsx b/src/view.web.tsx index 59e95c7..955457a 100644 --- a/src/view.web.tsx +++ b/src/view.web.tsx @@ -114,19 +114,23 @@ export const OmniView = ({ false; const Tech = isHls ? HlsJsVideo : Video; - const config = useMemo(() => { - const headers = src?.headers; - if (!headers || Object.keys(headers).length === 0) return undefined; - return { + const headersRef = useRef(src?.headers); + headersRef.current = src?.headers; + + const config = useMemo( + () => ({ hlsJs: { xhrSetup: (xhr: XMLHttpRequest) => { + const headers = headersRef.current; + if (!headers) return; for (const [key, value] of Object.entries(headers)) { if (value) xhr.setRequestHeader(key, value); } }, }, - }; - }, [src?.headers]); + }), + [], + ); return (