Sincronizza overlay video con punteggio dalla regia remota.
L'iPad accetta gli aggiornamenti ActionCable della regia, evita race con risposte API obsolete e ridisegna subito il tabellone sullo stream RTMP. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
co-authored by
Cursor
parent
270bf680a4
commit
c92099a41b
@@ -80,9 +80,9 @@ struct BroadcastScreen: View {
|
||||
}
|
||||
.task(id: sessionId) {
|
||||
while !Task.isCancelled {
|
||||
try? await Task.sleep(nanoseconds: 4_000_000_000)
|
||||
try? await Task.sleep(nanoseconds: 2_000_000_000)
|
||||
if let remote = try? await container.sessionRepository.fetchSession(id: sessionId).score {
|
||||
container.scoreController.applyRemote(remote)
|
||||
container.scoreController.applyRemote(remote, source: .polling)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -337,7 +337,9 @@ struct BroadcastScreen: View {
|
||||
session = loaded
|
||||
match = loadedMatch
|
||||
container.scoreController.bind(sessionId: sessionId, initial: loaded.score)
|
||||
wireCable()
|
||||
let refreshOverlay = { updateOverlay() }
|
||||
container.scoreController.onScoreDidChange = refreshOverlay
|
||||
wireCable(refreshOverlay: refreshOverlay)
|
||||
await preloadLogos(for: loadedMatch)
|
||||
updateOverlay()
|
||||
loading = false
|
||||
@@ -363,10 +365,14 @@ struct BroadcastScreen: View {
|
||||
}
|
||||
}
|
||||
|
||||
private func wireCable() {
|
||||
private func wireCable(refreshOverlay: @escaping () -> Void) {
|
||||
guard let token = container.tokenStore.session?.accessToken else { return }
|
||||
container.sessionCable.onScoreUpdate = { [weak container] remote in
|
||||
container?.scoreController.applyRemote(remote)
|
||||
Task { @MainActor in
|
||||
guard let container else { return }
|
||||
container.scoreController.applyRemote(remote, source: .cable)
|
||||
refreshOverlay()
|
||||
}
|
||||
}
|
||||
container.sessionCable.onPauseStream = { [weak container] in
|
||||
Task { @MainActor in
|
||||
@@ -528,6 +534,7 @@ struct BroadcastScreen: View {
|
||||
}
|
||||
|
||||
private func teardown() async {
|
||||
container.scoreController.onScoreDidChange = nil
|
||||
container.sessionCable.onScoreUpdate = nil
|
||||
container.sessionCable.onPauseStream = nil
|
||||
container.sessionCable.onResumeStream = nil
|
||||
|
||||
Reference in New Issue
Block a user