mirror of
https://github.com/Boof2015/astra-mobile.git
synced 2026-08-20 04:30:54 +02:00
fix queue bug
This commit is contained in:
@@ -87,6 +87,7 @@ import { QueueSheetHandle } from './QueueSheetHandle';
|
|||||||
import {
|
import {
|
||||||
VIRTUAL_QUEUE_PAGE_SIZE,
|
VIRTUAL_QUEUE_PAGE_SIZE,
|
||||||
isCurrentVirtualQueueRequest,
|
isCurrentVirtualQueueRequest,
|
||||||
|
isVirtualQueueWaitingForTracks,
|
||||||
mergeVirtualQueueTracks,
|
mergeVirtualQueueTracks,
|
||||||
nextVirtualQueuePageStart,
|
nextVirtualQueuePageStart,
|
||||||
seedVirtualQueueTracks,
|
seedVirtualQueueTracks,
|
||||||
@@ -390,7 +391,17 @@ export const QueueTray = memo(function QueueTray({ onClose, embedded = false }:
|
|||||||
if (embedded || listPaintedRef.current) {
|
if (embedded || listPaintedRef.current) {
|
||||||
void loadVirtualPage(true);
|
void loadVirtualPage(true);
|
||||||
} else {
|
} else {
|
||||||
resetVirtualTracks();
|
const state = resetVirtualTracks();
|
||||||
|
if (
|
||||||
|
state
|
||||||
|
&& isVirtualQueueWaitingForTracks(
|
||||||
|
virtualTracksRef.current.length,
|
||||||
|
state.activePosition,
|
||||||
|
state.totalCount,
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
void loadVirtualPage(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}, [
|
}, [
|
||||||
embedded,
|
embedded,
|
||||||
@@ -912,7 +923,14 @@ export const QueueTray = memo(function QueueTray({ onClose, embedded = false }:
|
|||||||
);
|
);
|
||||||
|
|
||||||
const queueReady = hasSnapshot;
|
const queueReady = hasSnapshot;
|
||||||
const isLoadingQueue = !queueReady;
|
const isLoadingQueue = !queueReady || (
|
||||||
|
virtualState !== null
|
||||||
|
&& isVirtualQueueWaitingForTracks(
|
||||||
|
entries.length,
|
||||||
|
virtualState.activePosition,
|
||||||
|
virtualState.totalCount,
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
const listExtraData = useMemo(
|
const listExtraData = useMemo(
|
||||||
() => ({ editMode, selectedKeys: visibleSelectedKeys, queueReady }),
|
() => ({ editMode, selectedKeys: visibleSelectedKeys, queueReady }),
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import {
|
|||||||
VIRTUAL_QUEUE_PAGE_SIZE,
|
VIRTUAL_QUEUE_PAGE_SIZE,
|
||||||
VIRTUAL_QUEUE_PREFETCH_ROWS,
|
VIRTUAL_QUEUE_PREFETCH_ROWS,
|
||||||
isCurrentVirtualQueueRequest,
|
isCurrentVirtualQueueRequest,
|
||||||
|
isVirtualQueueWaitingForTracks,
|
||||||
mergeVirtualQueueTracks,
|
mergeVirtualQueueTracks,
|
||||||
nextVirtualQueuePageStart,
|
nextVirtualQueuePageStart,
|
||||||
seedVirtualQueueTracks,
|
seedVirtualQueueTracks,
|
||||||
@@ -65,6 +66,12 @@ test('stops paging at the virtual queue end', () => {
|
|||||||
assert.equal(nextVirtualQueuePageStart([], 5, 6), null);
|
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', () => {
|
test('rejects stale generations and replaced playback sessions', () => {
|
||||||
assert.equal(isCurrentVirtualQueueRequest(4, 4, 'session-a', 'session-a'), true);
|
assert.equal(isCurrentVirtualQueueRequest(4, 4, 'session-a', 'session-a'), true);
|
||||||
assert.equal(isCurrentVirtualQueueRequest(3, 4, 'session-a', 'session-a'), false);
|
assert.equal(isCurrentVirtualQueueRequest(3, 4, 'session-a', 'session-a'), false);
|
||||||
|
|||||||
@@ -64,6 +64,22 @@ export function nextVirtualQueuePageStart(
|
|||||||
return start < totalCount ? start : null;
|
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(
|
export function shouldPrefetchVirtualQueue(
|
||||||
lastVisibleIndex: number,
|
lastVisibleIndex: number,
|
||||||
loadedCount: number,
|
loadedCount: number,
|
||||||
|
|||||||
Reference in New Issue
Block a user