11import {
22 useInfiniteQuery ,
33 useMutation ,
4+ useQueries ,
45 useQuery ,
56 useQueryClient ,
67 type InfiniteData ,
78} from '@tanstack/react-query'
89
910import {
11+ getMyPlaylistDetail ,
1012 getPlaylistDetail ,
1113 getPlaylistViewCounts ,
1214 getShufflePlaylists ,
1315 postPlaylistConfirm ,
1416 postPlaylistStart ,
1517} from '@/entities/playlist/api/playlist'
16- import type { Cursor , PlaylistResponse } from '@/entities/playlist/types/playlist'
18+ import type { PlaylistDetail , PlaylistResponse } from '@/entities/playlist/types/playlist'
1719import { useAuthStore } from '@/features/auth/store/authStore'
1820import { isDowntimeNow } from '@/shared/lib/isDowntimeNow'
1921
2022export const useShufflePlaylists = ( size : number = 5 ) => {
2123 return useInfiniteQuery <
2224 PlaylistResponse , // queryFn 반환 타입
2325 Error , // 에러 타입
24- InfiniteData < PlaylistResponse , Cursor > , // select 후 데이터 타입
26+ InfiniteData < PlaylistResponse , number > , // select 후 데이터 타입
2527 [ 'playlists' , number ] , // queryKey 타입
26- Cursor | undefined // pageParam 타입
28+ number | undefined // pageParam 타입
2729 > ( {
2830 queryKey : [ 'playlists' , size ] ,
2931 queryFn : ( { pageParam } ) =>
3032 getShufflePlaylists ( {
31- cursorPosition : pageParam ?. position ,
32- cursorCardId : pageParam ?. cardId ,
33+ cursorId : pageParam ,
3334 size,
3435 } ) ,
3536 initialPageParam : undefined , // 첫 호출은 커서 없이 시작
3637 getNextPageParam : ( lastPage ) => {
37- if ( lastPage . hasNext && lastPage . nextCursor ) {
38- return lastPage . nextCursor // Cursor 타입
38+ if ( lastPage . hasNext ) {
39+ return lastPage . nextCursor
3940 }
4041 return undefined
4142 } ,
@@ -53,6 +54,14 @@ export const usePlaylistDetail = (playlistId: number | null, options?: { enabled
5354 } )
5455}
5556
57+ export const useMyPlaylistDetail = ( playlistId : number | null , options ?: { enabled ?: boolean } ) => {
58+ return useQuery ( {
59+ queryKey : [ 'myPlaylistDetail' , playlistId ] ,
60+ queryFn : ( ) => getMyPlaylistDetail ( playlistId as number ) ,
61+ enabled : options ?. enabled ?? ! ! playlistId ,
62+ } )
63+ }
64+
5665export const usePlaylistStartMutation = ( ) => {
5766 const queryClient = useQueryClient ( )
5867
@@ -81,3 +90,22 @@ export const usePlaylistViewCounts = (playlistId: number) => {
8190 queryFn : ( ) => getPlaylistViewCounts ( playlistId ) ,
8291 } )
8392}
93+
94+ export const usePlaylistDetails = ( ids : number [ ] ) => {
95+ const results = useQueries ( {
96+ queries : ids . map ( ( id ) => ( {
97+ queryKey : [ 'playlistDetail' , id ] ,
98+ queryFn : ( ) => getPlaylistDetail ( id ) ,
99+ enabled : ids . length > 0 ,
100+ } ) ) ,
101+ } )
102+
103+ const isLoading = results . some ( ( r ) => r . isLoading )
104+ const isError = results . some ( ( r ) => r . isError )
105+ const data = results . reduce < PlaylistDetail [ ] > ( ( acc , q ) => {
106+ if ( q . data ) acc . push ( q . data )
107+ return acc
108+ } , [ ] )
109+
110+ return { data, isLoading, isError }
111+ }
0 commit comments