@@ -28,6 +28,8 @@ interface PageParam {
2828 lastValue : number | string ;
2929}
3030
31+
32+ // 로그인 한 유저의 킵 칵테일을 Get으로 불러옴
3133const fetchKeep = async ( ) : Promise < Set < number > > => {
3234 const res = await fetch ( `${ getApi } /me/bar` , {
3335 method : 'GET' ,
@@ -41,6 +43,7 @@ const fetchKeep = async (): Promise<Set<number>> => {
4143 return new Set ( myKeep . map ( ( v : { cocktailId : number } ) => v . cocktailId ) ) ;
4244} ;
4345
46+ // 비 로그인 유저도 볼 수 있는 칵테일 API fetch 각 종 정렬 파라미터를 문자열로 받아서 정렬함
4447const fetchRecipe = async (
4548 pageParam : PageParam | null ,
4649 size : number ,
@@ -68,6 +71,7 @@ const fetchRecipe = async (
6871 return json . data ?? [ ] ;
6972} ;
7073
74+ // 검색전용 API 여기서 필터링 토글도 받음
7175const searchCocktails = async ( filters : SearchFilters ) : Promise < Cocktail [ ] > => {
7276 const body = {
7377 keyword : filters . keyword ?. trim ( ) ?? '' ,
@@ -90,6 +94,7 @@ const searchCocktails = async (filters: SearchFilters): Promise<Cocktail[]> => {
9094 return json . data ?? [ ] ;
9195} ;
9296
97+ // 적용된 필터
9398const hasActiveFilters = ( filters : SearchFilters ) : boolean => {
9499 return ! ! (
95100 filters . keyword ?. trim ( ) ||
@@ -99,10 +104,25 @@ const hasActiveFilters = (filters: SearchFilters): boolean => {
99104 ) ;
100105} ;
101106
107+
108+ export const useKeepQuery = ( ) => {
109+ const user = useAuthStore ( ( state ) => state . user ) ;
110+
111+ return useQuery ( {
112+ queryKey : [ 'keeps' , user ?. id ] ,
113+ queryFn : fetchKeep ,
114+ enabled : ! ! user ,
115+ staleTime : 5 * 60 * 1000 ,
116+ gcTime : 10 * 60 * 1000 ,
117+ } )
118+ } ;
119+
120+ // 무한스크롤 fetch
102121export const useCocktailsInfiniteQuery = ( size : number = 20 , sortBy ?: Sort ) => {
103122 const user = useAuthStore ( ( state ) => state . user ) ;
104123 const queryClient = useQueryClient ( ) ;
105124 const prevSortBy = useRef ( sortBy ) ;
125+ const { data :keepIds } = useKeepQuery ( )
106126
107127 useEffect ( ( ) => {
108128 if ( prevSortBy . current !== undefined && prevSortBy . current !== sortBy ) {
@@ -118,12 +138,11 @@ export const useCocktailsInfiniteQuery = (size: number = 20, sortBy?: Sort) => {
118138 queryFn : async ( { pageParam } ) => {
119139 const cocktails = await fetchRecipe ( pageParam , size , sortBy ) ;
120140
121- if ( user ) {
122- const keepId = await fetchKeep ( ) ;
141+ if ( user && keepIds ) {
123142 return cocktails . map ( ( item ) => ( {
124143 ...item ,
125- isKeep : keepId . has ( item . cocktailId ) ,
126- } ) ) ;
144+ isKeep : keepIds . has ( item . cocktailId )
145+ } ) )
127146 }
128147
129148 return cocktails ;
@@ -159,31 +178,37 @@ export const useCocktailsInfiniteQuery = (size: number = 20, sortBy?: Sort) => {
159178 initialPageParam : null as PageParam | null ,
160179 refetchOnMount : false ,
161180 refetchOnWindowFocus : false ,
181+ staleTime : 2 * 60 * 1000
162182 } ) ;
163183} ;
164184
185+ // 검색용 fetch
165186export const useCocktailsSearchQuery = ( filters : SearchFilters ) => {
166187 const user = useAuthStore ( ( state ) => state . user ) ;
167188 const isActive = hasActiveFilters ( filters ) ;
189+ const { data : keepIds } = useKeepQuery ( )
168190
169191 return useQuery ( {
170192 queryKey : [ 'cocktails' , 'search' , filters , user ?. id ] ,
171193 queryFn : async ( ) => {
172194 const cocktails = await searchCocktails ( filters ) ;
173- if ( user && cocktails . length > 0 ) {
174- const keepId = await fetchKeep ( ) ;
195+ if ( user && cocktails . length > 0 && keepIds ) {
196+
175197 return cocktails . map ( ( item ) => ( {
176198 ...item ,
177- isKeep : keepId . has ( item . cocktailId ) ,
199+ isKeep : keepIds . has ( item . cocktailId ) ,
178200 } ) ) ;
179201 }
180202 return cocktails ;
181203 } ,
182204 enabled : isActive ,
183205 refetchOnMount : false ,
206+ refetchOnWindowFocus : false ,
207+ staleTime : 5 * 60 * 1000
184208 } ) ;
185209} ;
186210
211+ // 검색모드를 전환하여 어떤 fetch를 하는지 결정
187212export const useCocktails = (
188213 filters : CocktailFilter ,
189214 infiniteScrollSize : number = 20 ,
0 commit comments