mirror of
https://github.com/Boof2015/astra-mobile.git
synced 2026-08-19 04:06:43 +02:00
fix queue bug
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user