From 7cd012de70bdd5f9180c23ef4358b46f442a3f4d Mon Sep 17 00:00:00 2001 From: jeffvli Date: Wed, 5 Nov 2025 19:44:30 -0800 Subject: [PATCH] add subscribers for player repeat and shuffle --- .../audio-player/hooks/use-player-events.ts | 21 +++++++++++++++++- src/renderer/store/player.store.ts | 22 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/renderer/features/player/audio-player/hooks/use-player-events.ts b/src/renderer/features/player/audio-player/hooks/use-player-events.ts index e5ac3d471..24674cb37 100644 --- a/src/renderer/features/player/audio-player/hooks/use-player-events.ts +++ b/src/renderer/features/player/audio-player/hooks/use-player-events.ts @@ -5,13 +5,15 @@ import { subscribePlayerMute, subscribePlayerProgress, subscribePlayerQueue, + subscribePlayerRepeat, subscribePlayerSeekToTimestamp, + subscribePlayerShuffle, subscribePlayerSpeed, subscribePlayerStatus, subscribePlayerVolume, } from '/@/renderer/store'; import { QueueData, QueueSong } from '/@/shared/types/domain-types'; -import { PlayerStatus } from '/@/shared/types/types'; +import { PlayerRepeat, PlayerShuffle, PlayerStatus } from '/@/shared/types/types'; interface PlayerEvents { cleanup: () => void; @@ -25,11 +27,16 @@ interface PlayerEventsCallbacks { onPlayerMute?: (properties: { muted: boolean }, prev: { muted: boolean }) => void; onPlayerProgress?: (properties: { timestamp: number }, prev: { timestamp: number }) => void; onPlayerQueueChange?: (queue: QueueData, prev: QueueData) => void; + onPlayerRepeat?: (properties: { repeat: PlayerRepeat }, prev: { repeat: PlayerRepeat }) => void; onPlayerSeek?: (properties: { seconds: number }, prev: { seconds: number }) => void; onPlayerSeekToTimestamp?: ( properties: { timestamp: number }, prev: { timestamp: number }, ) => void; + onPlayerShuffle?: ( + properties: { shuffle: PlayerShuffle }, + prev: { shuffle: PlayerShuffle }, + ) => void; onPlayerSpeed?: (properties: { speed: number }, prev: { speed: number }) => void; onPlayerStatus?: (properties: { status: PlayerStatus }, prev: { status: PlayerStatus }) => void; onPlayerVolume?: (properties: { volume: number }, prev: { volume: number }) => void; @@ -97,6 +104,18 @@ function createPlayerEvents(callbacks: PlayerEventsCallbacks): PlayerEvents { unsubscribers.push(unsubscribe); } + // Subscribe to repeat changes + if (callbacks.onPlayerRepeat) { + const unsubscribe = subscribePlayerRepeat(callbacks.onPlayerRepeat); + unsubscribers.push(unsubscribe); + } + + // Subscribe to shuffle changes + if (callbacks.onPlayerShuffle) { + const unsubscribe = subscribePlayerShuffle(callbacks.onPlayerShuffle); + unsubscribers.push(unsubscribe); + } + return { cleanup: () => { unsubscribers.forEach((unsubscribe) => unsubscribe()); diff --git a/src/renderer/store/player.store.ts b/src/renderer/store/player.store.ts index 8a1e273a6..126a7979c 100644 --- a/src/renderer/store/player.store.ts +++ b/src/renderer/store/player.store.ts @@ -1245,6 +1245,28 @@ export const subscribePlayerSpeed = ( ); }; +export const subscribePlayerRepeat = ( + onChange: (properties: { repeat: PlayerRepeat }, prev: { repeat: PlayerRepeat }) => void, +) => { + return usePlayerStoreBase.subscribe( + (state) => state.player.repeat, + (repeat, prevRepeat) => { + onChange({ repeat }, { repeat: prevRepeat }); + }, + ); +}; + +export const subscribePlayerShuffle = ( + onChange: (properties: { shuffle: PlayerShuffle }, prev: { shuffle: PlayerShuffle }) => void, +) => { + return usePlayerStoreBase.subscribe( + (state) => state.player.shuffle, + (shuffle, prevShuffle) => { + onChange({ shuffle }, { shuffle: prevShuffle }); + }, + ); +}; + export const usePlayerProperties = () => { return usePlayerStoreBase( useShallow((state) => ({