auto follow queue when autodj is triggered

This commit is contained in:
jeffvli
2025-12-28 14:34:38 -08:00
parent 0a54f7c44c
commit ffdef596ad
3 changed files with 39 additions and 0 deletions
+5
View File
@@ -1,6 +1,11 @@
import { LibraryItem, Song } from '/@/shared/types/domain-types';
export type AutoDJQueueAddedEventPayload = {
songCount: number;
};
export type EventMap = {
AUTODJ_QUEUE_ADDED: AutoDJQueueAddedEventPayload;
ITEM_LIST_REFRESH: ItemListRefreshEventPayload;
ITEM_LIST_UPDATE_ITEM: ItemListUpdateItemEventPayload;
MEDIA_NEXT: MediaNextEventPayload;
@@ -11,16 +11,20 @@ import {
} from '/@/renderer/components/item-list/item-table-list/item-table-list';
import { ItemTableListColumn } from '/@/renderer/components/item-list/item-table-list/item-table-list-column';
import { ItemListHandle } from '/@/renderer/components/item-list/types';
import { eventEmitter } from '/@/renderer/events/event-emitter';
import { useIsPlayerFetching, usePlayer } from '/@/renderer/features/player/context/player-context';
import { searchLibraryItems } from '/@/renderer/features/shared/utils';
import { useDragDrop } from '/@/renderer/hooks/use-drag-drop';
import {
isShuffleEnabled,
mapShuffledToQueueIndex,
subscribeCurrentTrack,
subscribePlayerQueue,
useListSettings,
usePlayerActions,
usePlayerQueueType,
usePlayerSong,
usePlayerStore,
useSettingsStore,
} from '/@/renderer/store';
import { Flex } from '/@/shared/components/flex/flex';
@@ -101,11 +105,35 @@ export const PlayQueue = forwardRef<ItemListHandle, QueueProps>(({ listKey, sear
}
});
const handleAutoDJQueueAdded = () => {
if (followCurrentSong) {
const state = usePlayerStore.getState();
let index = state.player.index;
if (isShuffleEnabled(state)) {
index = mapShuffledToQueueIndex(index, state.queue.shuffled);
}
if (index !== -1) {
// Use setTimeout to ensure the DOM has updated with the new queue items
setTimeout(() => {
tableRef.current?.scrollToIndex(index, {
align: 'center',
behavior: 'auto',
});
}, 0);
}
}
};
eventEmitter.on('AUTODJ_QUEUE_ADDED', handleAutoDJQueueAdded);
setQueue();
return () => {
unsub();
unsubCurrentTrack();
eventEmitter.off('AUTODJ_QUEUE_ADDED', handleAutoDJQueueAdded);
};
}, [getQueue, queueType, tableRef, followCurrentSong]);
@@ -2,6 +2,7 @@ import { useQueryClient } from '@tanstack/react-query';
import { useEffect } from 'react';
import { queryKeys } from '/@/renderer/api/query-keys';
import { eventEmitter } from '/@/renderer/events/event-emitter';
import { useIsPlayerFetching, usePlayer } from '/@/renderer/features/player/context/player-context';
import { songsQueries } from '/@/renderer/features/songs/api/songs-api';
import {
@@ -198,6 +199,11 @@ export const useAutoDJ = () => {
// Add to the end of the queue
player.addToQueueByData(songsToAdd, Play.LAST);
// Emit event to trigger queue follow
eventEmitter.emit('AUTODJ_QUEUE_ADDED', {
songCount: songsToAdd.length,
});
} catch (error) {
logFn.error(logMsg[LogCategory.PLAYER].autoPlayFailed, {
category: LogCategory.PLAYER,