updated
This commit is contained in:
parent
97eafb10e7
commit
6cd9dcd41e
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
2
backend/web/dist/index.html
vendored
2
backend/web/dist/index.html
vendored
@ -5,7 +5,7 @@
|
|||||||
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||||
<title>App</title>
|
<title>App</title>
|
||||||
<script type="module" crossorigin src="/assets/index-DlgYo3oN.js"></script>
|
<script type="module" crossorigin src="/assets/index-JupgTTdL.js"></script>
|
||||||
<link rel="stylesheet" crossorigin href="/assets/index-SqYhLYXQ.css">
|
<link rel="stylesheet" crossorigin href="/assets/index-SqYhLYXQ.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@ -1613,10 +1613,6 @@ export default function App() {
|
|||||||
setPlayerJob((prev) => (prev && baseName(prev.output || '') === file ? null : prev))
|
setPlayerJob((prev) => (prev && baseName(prev.output || '') === file ? null : prev))
|
||||||
}, 320)
|
}, 320)
|
||||||
|
|
||||||
window.setTimeout(() => {
|
|
||||||
void refreshDoneNow()
|
|
||||||
}, 350)
|
|
||||||
|
|
||||||
const undoToken = typeof data?.undoToken === 'string' ? data.undoToken : ''
|
const undoToken = typeof data?.undoToken === 'string' ? data.undoToken : ''
|
||||||
return undoToken ? { undoToken } : {} // ✅ kein null mehr
|
return undoToken ? { undoToken } : {} // ✅ kein null mehr
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
@ -1654,7 +1650,6 @@ export default function App() {
|
|||||||
setPlayerJob((prev) => (prev && baseName(prev.output || '') === file ? null : prev))
|
setPlayerJob((prev) => (prev && baseName(prev.output || '') === file ? null : prev))
|
||||||
}, 320)
|
}, 320)
|
||||||
|
|
||||||
void refreshDoneNow()
|
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
window.dispatchEvent(new CustomEvent('finished-downloads:delete', { detail: { file, phase: 'error' as const } }))
|
window.dispatchEvent(new CustomEvent('finished-downloads:delete', { detail: { file, phase: 'error' as const } }))
|
||||||
notify.error('Keep fehlgeschlagen', e?.message ?? String(e))
|
notify.error('Keep fehlgeschlagen', e?.message ?? String(e))
|
||||||
|
|||||||
@ -1595,64 +1595,6 @@ export default function FinishedDownloads({
|
|||||||
}
|
}
|
||||||
}, [isSmall])
|
}, [isSmall])
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
let es: EventSource | null = null
|
|
||||||
let closed = false
|
|
||||||
let reconnectTimer: number | null = null
|
|
||||||
let refillDebounce: number | null = null
|
|
||||||
|
|
||||||
const scheduleRefill = () => {
|
|
||||||
if (refillDebounce != null) return
|
|
||||||
refillDebounce = window.setTimeout(() => {
|
|
||||||
refillDebounce = null
|
|
||||||
|
|
||||||
// optional: wenn du gerade "leer" bist, auf Seite 1 springen
|
|
||||||
// (sonst könntest du auf Seite >1 hängen, während wieder Inhalte kommen)
|
|
||||||
if (emptyFolder && page !== 1) onPageChange(1)
|
|
||||||
|
|
||||||
queueRefill()
|
|
||||||
}, 80)
|
|
||||||
}
|
|
||||||
|
|
||||||
const connect = () => {
|
|
||||||
if (closed) return
|
|
||||||
try {
|
|
||||||
// ✅ NEU: Done-Change Stream (nicht Job-Snapshot Stream)
|
|
||||||
es = new EventSource('/api/record/done/stream')
|
|
||||||
|
|
||||||
es.onmessage = () => {
|
|
||||||
// Payload ist egal – jede Message heißt: done-Liste hat sich geändert
|
|
||||||
scheduleRefill()
|
|
||||||
}
|
|
||||||
|
|
||||||
// optional: wenn du serverseitig "event: doneChanged" sendest:
|
|
||||||
// es.addEventListener('doneChanged', scheduleRefill as any)
|
|
||||||
|
|
||||||
es.onerror = () => {
|
|
||||||
try { es?.close() } catch {}
|
|
||||||
es = null
|
|
||||||
if (closed) return
|
|
||||||
|
|
||||||
// simple reconnect (du kannst hier auch exponentiell machen)
|
|
||||||
if (reconnectTimer != null) window.clearTimeout(reconnectTimer)
|
|
||||||
reconnectTimer = window.setTimeout(connect, 1000)
|
|
||||||
}
|
|
||||||
} catch {
|
|
||||||
if (reconnectTimer != null) window.clearTimeout(reconnectTimer)
|
|
||||||
reconnectTimer = window.setTimeout(connect, 1000)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
connect()
|
|
||||||
|
|
||||||
return () => {
|
|
||||||
closed = true
|
|
||||||
if (reconnectTimer != null) window.clearTimeout(reconnectTimer)
|
|
||||||
if (refillDebounce != null) window.clearTimeout(refillDebounce)
|
|
||||||
try { es?.close() } catch {}
|
|
||||||
}
|
|
||||||
}, [queueRefill, emptyFolder, page, onPageChange])
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (emptyFolder && page !== 1) onPageChange(1)
|
if (emptyFolder && page !== 1) onPageChange(1)
|
||||||
}, [emptyFolder, page, onPageChange])
|
}, [emptyFolder, page, onPageChange])
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user