feat: 支持收藏歌单和专辑

This commit is contained in:
qier222 2022-04-05 21:23:55 +08:00
parent db5730dfdd
commit 49bb849982
No known key found for this signature in database
GPG key ID: 9C85007ED905F14D
12 changed files with 242 additions and 46 deletions

View file

@ -1,12 +1,16 @@
import { likeAAlbum } from '@/api/album'
import type { FetchUserAlbumsParams, FetchUserAlbumsResponse } from '@/api/user'
import { UserApiNames, fetchUserAlbums } from '@/api/user'
import { useQueryClient } from 'react-query'
import useUser from './useUser'
export default function useUserAlbums(params: FetchUserAlbumsParams) {
export default function useUserAlbums(params: FetchUserAlbumsParams = {}) {
const { data: user } = useUser()
return useQuery(
[UserApiNames.FETCH_USER_ALBUMS, params],
[UserApiNames.FETCH_USER_ALBUMS, user?.profile?.userId ?? 0],
() => fetchUserAlbums(params),
{
placeholderData: (): FetchUserAlbumsResponse =>
placeholderData: (): FetchUserAlbumsResponse | undefined =>
window.ipcRenderer?.sendSync('getApiCacheSync', {
api: 'album/sublist',
query: params,
@ -14,3 +18,56 @@ export default function useUserAlbums(params: FetchUserAlbumsParams) {
}
)
}
export const useMutationLikeAAlbum = () => {
const queryClient = useQueryClient()
const { data: user } = useUser()
const { data: userAlbums } = useUserAlbums({ limit: 2000 })
const uid = user?.account?.id ?? 0
const key = [UserApiNames.FETCH_USER_ALBUMS, uid]
return useMutation(
async (album: Album) => {
if (!album.id || userAlbums?.data === undefined) {
throw new Error('album id is required or userAlbums is undefined')
}
const response = await likeAAlbum({
id: album.id,
t: userAlbums?.data.findIndex(a => a.id === album.id) > -1 ? 2 : 1,
})
if (response.code !== 200) throw new Error((response as any).msg)
return response
},
{
onMutate: async album => {
// Cancel any outgoing refetches (so they don't overwrite our optimistic update)
await queryClient.cancelQueries(key)
// Snapshot the previous value
const previousData = queryClient.getQueryData(key)
// Optimistically update to the new value
queryClient.setQueryData(key, old => {
const userAlbums = old as FetchUserAlbumsResponse
const albums = userAlbums.data
const newAlbums =
albums.findIndex(a => a.id === album.id) > -1
? albums.filter(a => a.id !== album.id)
: [...albums, album]
return {
...userAlbums,
data: newAlbums,
}
})
// Return a context object with the snapshotted value
return { previousData }
},
// If the mutation fails, use the context returned from onMutate to roll back
onError: (err, trackID, context) => {
queryClient.setQueryData(key, (context as any).previousData)
toast((err as any).toString())
},
}
)
}