mirror of
https://github.com/kilyabin/psysonic.git
synced 2026-07-21 22:15:40 +00:00
Merge pull request #314 from Psychotoxical/fix/queue-preserve-context-on-manual-click
fix(queue): preserve scroll context on manual queue click
This commit is contained in:
@@ -297,6 +297,12 @@ function QueuePanelHostOrSolo() {
|
|||||||
const enqueueAt = usePlayerStore(s => s.enqueueAt);
|
const enqueueAt = usePlayerStore(s => s.enqueueAt);
|
||||||
const contextMenu = usePlayerStore(s => s.contextMenu);
|
const contextMenu = usePlayerStore(s => s.contextMenu);
|
||||||
|
|
||||||
|
// When the user picks a track *from* the queue list, suppress the
|
||||||
|
// upcoming auto-scroll so their click target stays in view instead of
|
||||||
|
// the list rebasing onto the next track. Auto-advance (natural playback)
|
||||||
|
// never sets this flag, so it keeps its original "show what's next" behavior.
|
||||||
|
const suppressNextAutoScrollRef = useRef(false);
|
||||||
|
|
||||||
const playbackSource = usePlayerStore(s => s.currentPlaybackSource);
|
const playbackSource = usePlayerStore(s => s.currentPlaybackSource);
|
||||||
|
|
||||||
const crossfadeEnabled = useAuthStore(s => s.crossfadeEnabled);
|
const crossfadeEnabled = useAuthStore(s => s.crossfadeEnabled);
|
||||||
@@ -407,6 +413,10 @@ function QueuePanelHostOrSolo() {
|
|||||||
}, [enqueueAt]);
|
}, [enqueueAt]);
|
||||||
|
|
||||||
useEffect(function queueAutoScroll() {
|
useEffect(function queueAutoScroll() {
|
||||||
|
if (suppressNextAutoScrollRef.current) {
|
||||||
|
suppressNextAutoScrollRef.current = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (!queueListRef.current || queueIndex < 0) return;
|
if (!queueListRef.current || queueIndex < 0) return;
|
||||||
if (activeTab !== 'queue') return;
|
if (activeTab !== 'queue') return;
|
||||||
const songs = queueListRef.current!.querySelectorAll<HTMLElement>('[data-queue-idx]');
|
const songs = queueListRef.current!.querySelectorAll<HTMLElement>('[data-queue-idx]');
|
||||||
@@ -741,7 +751,10 @@ function QueuePanelHostOrSolo() {
|
|||||||
<div
|
<div
|
||||||
data-queue-idx={idx}
|
data-queue-idx={idx}
|
||||||
className={`queue-item ${isPlaying ? 'active' : ''} ${contextMenu.isOpen && contextMenu.type === 'queue-item' && contextMenu.queueIndex === idx ? 'context-active' : ''}`}
|
className={`queue-item ${isPlaying ? 'active' : ''} ${contextMenu.isOpen && contextMenu.type === 'queue-item' && contextMenu.queueIndex === idx ? 'context-active' : ''}`}
|
||||||
onClick={() => playTrack(track, queue)}
|
onClick={() => {
|
||||||
|
suppressNextAutoScrollRef.current = true;
|
||||||
|
playTrack(track, queue);
|
||||||
|
}}
|
||||||
onContextMenu={(e) => {
|
onContextMenu={(e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
usePlayerStore.getState().openContextMenu(e.clientX, e.clientY, track, 'queue-item', idx);
|
usePlayerStore.getState().openContextMenu(e.clientX, e.clientY, track, 'queue-item', idx);
|
||||||
|
|||||||
Reference in New Issue
Block a user