mirror of
https://github.com/austinried/subtracks.git
synced 2026-02-10 23:02:43 +01:00
refactor star
This commit is contained in:
@@ -1,102 +1,15 @@
|
||||
import { StarrableItemType } from '@app/models/music'
|
||||
import { Store } from '@app/state/store'
|
||||
import { StarParams } from '@app/subsonic/params'
|
||||
import produce from 'immer'
|
||||
import { GetState, SetState } from 'zustand'
|
||||
|
||||
export type MusicSlice = {
|
||||
//
|
||||
// actions, etc.
|
||||
//
|
||||
starredSongs: { [id: string]: boolean }
|
||||
starredAlbums: { [id: string]: boolean }
|
||||
starredArtists: { [id: string]: boolean }
|
||||
starItem: (id: string, type: StarrableItemType, unstar?: boolean) => Promise<void>
|
||||
|
||||
albumIdCoverArt: { [id: string]: string | undefined }
|
||||
albumIdCoverArtRequests: { [id: string]: Promise<void> }
|
||||
fetchAlbumCoverArt: (id: string) => Promise<void>
|
||||
getAlbumCoverArt: (id: string | undefined) => Promise<string | undefined>
|
||||
}
|
||||
|
||||
export const selectMusic = {
|
||||
starItem: (store: MusicSlice) => store.starItem,
|
||||
}
|
||||
|
||||
function reduceStarred(
|
||||
starredType: { [id: string]: boolean },
|
||||
items: { id: string; starred?: Date | boolean }[],
|
||||
): { [id: string]: boolean } {
|
||||
return {
|
||||
...starredType,
|
||||
...items.reduce((acc, val) => {
|
||||
acc[val.id] = !!val.starred
|
||||
return acc
|
||||
}, {} as { [id: string]: boolean }),
|
||||
}
|
||||
}
|
||||
|
||||
export const createMusicSlice = (set: SetState<Store>, get: GetState<Store>): MusicSlice => ({
|
||||
starredSongs: {},
|
||||
starredAlbums: {},
|
||||
starredArtists: {},
|
||||
|
||||
starItem: async (id, type, unstar = false) => {
|
||||
const client = get().client
|
||||
if (!client) {
|
||||
return
|
||||
}
|
||||
|
||||
let params: StarParams
|
||||
let setStarred: (starred: boolean) => void
|
||||
|
||||
switch (type) {
|
||||
case 'song':
|
||||
params = { id }
|
||||
setStarred = starred => {
|
||||
set(
|
||||
produce<MusicSlice>(state => {
|
||||
state.starredSongs = reduceStarred(state.starredSongs, [{ id, starred }])
|
||||
}),
|
||||
)
|
||||
}
|
||||
break
|
||||
case 'album':
|
||||
params = { albumId: id }
|
||||
setStarred = starred => {
|
||||
set(
|
||||
produce<MusicSlice>(state => {
|
||||
state.starredAlbums = reduceStarred(state.starredAlbums, [{ id, starred }])
|
||||
}),
|
||||
)
|
||||
}
|
||||
break
|
||||
case 'artist':
|
||||
params = { artistId: id }
|
||||
setStarred = starred => {
|
||||
set(
|
||||
produce<MusicSlice>(state => {
|
||||
state.starredArtists = reduceStarred(state.starredArtists, [{ id, starred }])
|
||||
}),
|
||||
)
|
||||
}
|
||||
break
|
||||
default:
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
setStarred(!unstar)
|
||||
if (unstar) {
|
||||
await client.unstar(params)
|
||||
} else {
|
||||
await client.star(params)
|
||||
}
|
||||
} catch {
|
||||
setStarred(unstar)
|
||||
}
|
||||
},
|
||||
|
||||
albumIdCoverArt: {},
|
||||
albumIdCoverArtRequests: {},
|
||||
|
||||
|
||||
Reference in New Issue
Block a user