fix queue bug

This commit is contained in:
Boof2015
2026-07-28 19:30:16 -04:00
parent 00d0fc4b2f
commit d4c88042e0
3 changed files with 43 additions and 2 deletions
+20 -2
View File
@@ -87,6 +87,7 @@ import { QueueSheetHandle } from './QueueSheetHandle';
import {
VIRTUAL_QUEUE_PAGE_SIZE,
isCurrentVirtualQueueRequest,
isVirtualQueueWaitingForTracks,
mergeVirtualQueueTracks,
nextVirtualQueuePageStart,
seedVirtualQueueTracks,
@@ -390,7 +391,17 @@ export const QueueTray = memo(function QueueTray({ onClose, embedded = false }:
if (embedded || listPaintedRef.current) {
void loadVirtualPage(true);
} else {
resetVirtualTracks();
const state = resetVirtualTracks();
if (
state
&& isVirtualQueueWaitingForTracks(
virtualTracksRef.current.length,
state.activePosition,
state.totalCount,
)
) {
void loadVirtualPage(false);
}
}
}, [
embedded,
@@ -912,7 +923,14 @@ export const QueueTray = memo(function QueueTray({ onClose, embedded = false }:
);
const queueReady = hasSnapshot;
const isLoadingQueue = !queueReady;
const isLoadingQueue = !queueReady || (
virtualState !== null
&& isVirtualQueueWaitingForTracks(
entries.length,
virtualState.activePosition,
virtualState.totalCount,
)
);
const listExtraData = useMemo(
() => ({ editMode, selectedKeys: visibleSelectedKeys, queueReady }),
@@ -4,6 +4,7 @@ import {
VIRTUAL_QUEUE_PAGE_SIZE,
VIRTUAL_QUEUE_PREFETCH_ROWS,
isCurrentVirtualQueueRequest,
isVirtualQueueWaitingForTracks,
mergeVirtualQueueTracks,
nextVirtualQueuePageStart,
seedVirtualQueueTracks,
@@ -65,6 +66,12 @@ test('stops paging at the virtual queue end', () => {
assert.equal(nextVirtualQueuePageStart([], 5, 6), null);
});
test('loads an empty virtual seed immediately when tracks remain', () => {
assert.equal(isVirtualQueueWaitingForTracks(0, 5, 10), true);
assert.equal(isVirtualQueueWaitingForTracks(1, 5, 10), false);
assert.equal(isVirtualQueueWaitingForTracks(0, 9, 10), false);
});
test('rejects stale generations and replaced playback sessions', () => {
assert.equal(isCurrentVirtualQueueRequest(4, 4, 'session-a', 'session-a'), true);
assert.equal(isCurrentVirtualQueueRequest(3, 4, 'session-a', 'session-a'), false);
@@ -64,6 +64,22 @@ export function nextVirtualQueuePageStart(
return start < totalCount ? start : null;
}
/**
* Break the empty-list mount deadlock: when the playback window has no usable
* upcoming rows but the virtual context still has tracks, paging cannot wait
* for FlashList's first paint because an empty list may never report one.
*/
export function isVirtualQueueWaitingForTracks(
visibleTrackCount: number,
activePosition: number,
totalCount: number,
): boolean {
return (
visibleTrackCount === 0
&& nextVirtualQueuePageStart([], activePosition, totalCount) !== null
);
}
export function shouldPrefetchVirtualQueue(
lastVisibleIndex: number,
loadedCount: number,