fix: support multiple onTimeUpdate callbacks in VideoManager

Previously onTimeCallback was a single nullable function pointer, so
registerEvents()'s store.setVideoTime callback was overwritten by
goToScene()'s checkQTE callback, causing videoTime to stay at 0.
Changed to a Set to support multiple concurrent listeners.
This commit is contained in:
2026-06-07 20:38:24 +08:00
parent ef00babdb7
commit b3bbe7b39d

View File

@@ -7,7 +7,7 @@ export class VideoManager {
private activeSlot: 'A' | 'B' = 'A'
private crossFadeMs = 300
private onEndCallback: VideoEndCallback | null = null
private onTimeCallback: TimeUpdateCallback | null = null
private onTimeCallbacks: Set<TimeUpdateCallback> = new Set()
private currentSrc = ''
private preloaded: Map<'A' | 'B', string> = new Map()
private switching = false
@@ -50,6 +50,7 @@ export class VideoManager {
}
this.elA = null
this.elB = null
this.onTimeCallbacks.clear()
}
playInitial(src: string, preloadUrls: string[]) {
@@ -141,7 +142,11 @@ export class VideoManager {
}
onTimeUpdate(cb: TimeUpdateCallback) {
this.onTimeCallback = cb
this.onTimeCallbacks.add(cb)
}
offTimeUpdate(cb: TimeUpdateCallback) {
this.onTimeCallbacks.delete(cb)
}
private waitReady(el: HTMLVideoElement): Promise<void> {
@@ -160,7 +165,8 @@ export class VideoManager {
private handleTimeUpdate = () => {
if (this.active) {
this.onTimeCallback?.(this.active.currentTime)
const t = this.active.currentTime
this.onTimeCallbacks.forEach((cb) => cb(t))
}
}
}