remove explicit currentTrack and instead derive it from the currentIndex and actualQueue

This commit is contained in:
Violet Caulfield
2026-03-04 17:42:52 -06:00
parent 575b864609
commit 678a703d91
3 changed files with 18 additions and 34 deletions

View File

@@ -187,7 +187,6 @@ export const useRemoveFromQueue = () => {
// If queue is now empty, reset player state to hide miniplayer
if (newQueue.length === 0) {
usePlayerQueueStore.getState().setCurrentTrack(undefined)
usePlayerQueueStore.getState().setCurrentIndex(undefined)
PlayerQueue.deletePlaylist(playlistId)
}
@@ -220,7 +219,6 @@ export const useResetQueue = () => () => {
usePlayerQueueStore.getState().setShuffled(false)
usePlayerQueueStore.getState().setQueueRef('Recently Played')
usePlayerQueueStore.getState().setQueue([])
usePlayerQueueStore.getState().setCurrentTrack(undefined)
usePlayerQueueStore.getState().setCurrentIndex(undefined)
}

View File

@@ -28,12 +28,7 @@ export async function updateTrackMediaInfo(tracks: TrackItem[]) {
await TrackPlayer.updateTracks(updatedTracks)
const { currentTrack: storedCurrentTrack, queue: persistedQueue } =
usePlayerQueueStore.getState()
const updatedCurrentTrack =
updatedTracks.find((t) => t.id === storedCurrentTrack?.id) ??
persistedQueue.find((t) => t.id === storedCurrentTrack?.id)
const { queue: persistedQueue } = usePlayerQueueStore.getState()
usePlayerQueueStore.setState((state) => ({
...state,
@@ -41,7 +36,6 @@ export async function updateTrackMediaInfo(tracks: TrackItem[]) {
const updatedTrack = updatedTracks.find((ut) => ut.id === t.id)
return updatedTrack ?? t
}),
currentTrack: updatedCurrentTrack ?? state.currentTrack,
}))
}
@@ -67,11 +61,12 @@ export async function onChangeTrack() {
return
}
const { currentIndex, currentTrack } = await TrackPlayer.getState()
const { currentIndex } = await TrackPlayer.getState()
const actualQueue = await TrackPlayer.getActualQueue()
// Get the last track and the last known position...
const previousTrack = usePlayerQueueStore.getState().currentTrack
const { queue: prevQueue, currentIndex: prevIndex } = usePlayerQueueStore.getState()
const previousTrack = prevIndex !== undefined ? prevQueue[prevIndex] : undefined
const lastPosition = usePlayerPlaybackStore.getState().position
// ...report that playback has stopped for the previous track, including the last position
@@ -85,19 +80,18 @@ export async function onChangeTrack() {
usePlayerQueueStore.setState((state) => ({
...state,
currentIndex,
currentTrack: currentTrack ?? undefined,
queue: actualQueue,
}))
// ...report that playback has started for the new track...
await reportPlaybackStarted(currentTrack!, 0)
await reportPlaybackStarted(actualQueue[currentIndex], 0)
// TODO: Fix audio normalization logic against nitro player
const { enableAudioNormalization } = usePlayerSettingsStore.getState()
// ...and apply audio normalization if enabled in settings
if (enableAudioNormalization) {
const volume = calculateTrackVolume(currentTrack!)
const volume = calculateTrackVolume(actualQueue[currentIndex])
TrackPlayer.setVolume(volume)
}
}
@@ -107,7 +101,8 @@ export async function onPlaybackProgress(position: number, totalDuration: number
position,
})
const { currentTrack } = usePlayerQueueStore.getState()
const { queue, currentIndex } = usePlayerQueueStore.getState()
const currentTrack = currentIndex !== undefined ? queue[currentIndex] : undefined
if (!currentTrack) return
@@ -130,7 +125,8 @@ export async function onPlaybackProgress(position: number, totalDuration: number
}
export async function onPlaybackStateChange(state: TrackPlayerState, reason: Reason | undefined) {
const currentTrack = usePlayerQueueStore.getState().currentTrack
const { queue, currentIndex } = usePlayerQueueStore.getState()
const currentTrack = currentIndex !== undefined ? queue[currentIndex] : undefined
const position = usePlayerPlaybackStore.getState().position
if (!currentTrack || reason === 'skip') return

View File

@@ -30,9 +30,6 @@ type PlayerQueueStore = {
queue: TrackItem[]
setQueue: (queue: TrackItem[]) => void
currentTrack: TrackItem | undefined
setCurrentTrack: (track: TrackItem | undefined) => void
currentIndex: number | undefined
setCurrentIndex: (index: number | undefined) => void
}
@@ -58,7 +55,6 @@ const queueStorage: PersistStorage<PlayerQueueStore> = {
...state,
queue: state.queue ?? [],
unShuffledQueue: state.unShuffledQueue ?? [],
currentTrack: state.currentTrack,
} as unknown as PlayerQueueStore,
}
} catch (e) {
@@ -122,12 +118,6 @@ export const usePlayerQueueStore = create<PlayerQueueStore>()(
queue,
}),
currentTrack: undefined,
setCurrentTrack: (currentTrack: TrackItem | undefined) =>
set({
currentTrack,
}),
currentIndex: undefined,
setCurrentIndex: (currentIndex: number | undefined) =>
set({
@@ -148,16 +138,19 @@ export const useShuffle = () => usePlayerQueueStore((state) => state.shuffled)
export const useQueueRef = () => usePlayerQueueStore((state) => state.queueRef)
export const useCurrentTrack = () => usePlayerQueueStore((state) => state.currentTrack)
export const useCurrentTrack = () =>
usePlayerQueueStore((state) =>
state.currentIndex !== undefined ? state.queue[state.currentIndex] : undefined,
)
/**
* Returns only the current track ID for efficient comparisons.
* Use this in list items to avoid re-renders when other track properties change.
*/
export const useCurrentTrackId = () => {
const currentTrack = useCurrentTrack()
return currentTrack?.id
}
export const useCurrentTrackId = () =>
usePlayerQueueStore((state) =>
state.currentIndex !== undefined ? state.queue[state.currentIndex]?.id : undefined,
)
export const useCurrentIndex = () => usePlayerQueueStore((state) => state.currentIndex)
@@ -173,7 +166,6 @@ export const setNewQueue = (
queue,
queueRef,
currentIndex: index,
currentTrack: queue[index],
shuffled,
})
}
@@ -187,7 +179,6 @@ export const clearQueueStore = () => {
setQueueRef,
setUnshuffledQueue,
setQueue,
setCurrentTrack,
setCurrentIndex,
setRepeatMode,
} = usePlayerQueueStore.getState()
@@ -196,7 +187,6 @@ export const clearQueueStore = () => {
setQueueRef(undefined)
setUnshuffledQueue([])
setQueue([])
setCurrentTrack(undefined)
setCurrentIndex(undefined)
setRepeatMode('off')
}