From b24335328d0691953a0f771731be157d8ad36ad2 Mon Sep 17 00:00:00 2001 From: cloud0406 Date: Fri, 3 Jan 2025 09:14:24 +0900 Subject: [PATCH 01/21] =?UTF-8?q?=E2=9C=A8[Feat]=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=EC=8B=9C=20=EC=BF=BC=EB=A6=AC=20=EB=AC=B4=ED=9A=A8?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/auth/api/auth.ts | 5 +++++ src/lib/utils/reactQueryProvider.tsx | 33 +++++++++++++--------------- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/features/auth/api/auth.ts b/src/features/auth/api/auth.ts index c9577c6d..74799a40 100644 --- a/src/features/auth/api/auth.ts +++ b/src/features/auth/api/auth.ts @@ -1,3 +1,5 @@ +'use client'; + import apiClient from '@/lib/utils/apiClient'; import { LoginFormData } from '../types/loginFormSchema'; import { useAuthStore } from '@/store/authStore'; @@ -6,6 +8,7 @@ import { showToast } from '@/components/toast/toast'; import { getCookie } from '@/features/auth/utils/cookies'; import { SignUpFormData } from '../types/sign-up.schema'; import { User } from '@/types/user'; +import { queryClient } from '@/lib/utils/reactQueryProvider'; export const login = async (data: LoginFormData) => { try { @@ -16,6 +19,8 @@ export const login = async (data: LoginFormData) => { throw new Error(response.error); } + queryClient.clear(); + const { setIsLoggedIn } = useAuthStore.getState(); setIsLoggedIn(true); await getUserInfo(); diff --git a/src/lib/utils/reactQueryProvider.tsx b/src/lib/utils/reactQueryProvider.tsx index 226b947e..7a1f1467 100644 --- a/src/lib/utils/reactQueryProvider.tsx +++ b/src/lib/utils/reactQueryProvider.tsx @@ -1,29 +1,26 @@ 'use client'; import { QueryClientProvider, QueryClient } from '@tanstack/react-query'; import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; -import { useState } from 'react'; + +export const queryClient = new QueryClient({ + defaultOptions: { + queries: { + refetchOnWindowFocus: false, // 윈도우가 다시 포커스될 때 데이터를 다시 가져올지 여부 + refetchOnMount: false, // 컴포넌트가 마운트될 때 데이터를 다시 가져올지 여부 + retry: 0, // 실패한 쿼리 재시도 횟수 + refetchOnReconnect: false, // 네트워크 재연결시 데이터를 다시 가져올지 여부 + retryOnMount: false, // 마운트 시 실패한 쿼리 재시도 여부 + staleTime: 1000 * 60 * 5, // 데이터가 'fresh'한 상태로 유지되는 시간 (5분) + gcTime: 1000 * 60 * 10, // 사용하지 않는 캐시 데이터가 메모리에서 제거되기까지의 시간 (10분) + }, + }, +}); export default function ReactQueryProviders({ children, }: React.PropsWithChildren) { - const [client] = useState( - new QueryClient({ - defaultOptions: { - queries: { - refetchOnWindowFocus: false, // 윈도우 다시 포커스되었을때 데이터 refetch X - refetchOnMount: false, // 컴포넌트 마운트될 때 데이터 refetch X - retry: 0, // API 요청 실패시 재시도 X - refetchOnReconnect: false, // 네트워크가 재연결될 때 데이터를 refetch X - retryOnMount: false, // 컴포넌트가 마운트될 때 실패한 쿼리를 재시도 X - staleTime: 1000 * 60 * 5, - gcTime: 1000 * 60 * 10, - }, - }, - }), - ); - return ( - + {children} From 71e188b312862b0c04bc122df827f01edc69474a Mon Sep 17 00:00:00 2001 From: cloud0406 Date: Fri, 3 Jan 2025 10:49:00 +0900 Subject: [PATCH 02/21] =?UTF-8?q?=E2=99=BB=EF=B8=8F[Refactor]=20=EC=BF=BC?= =?UTF-8?q?=EB=A6=AC=ED=82=A4=20=ED=8C=A9=ED=86=A0=EB=A6=AC=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/book-club/react-query/queries.ts | 58 ++++++++++++------------ 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/src/api/book-club/react-query/queries.ts b/src/api/book-club/react-query/queries.ts index 461ad24c..9de7e2f6 100644 --- a/src/api/book-club/react-query/queries.ts +++ b/src/api/book-club/react-query/queries.ts @@ -1,13 +1,19 @@ import { createQueryKeys } from '@lukemorales/query-key-factory'; import apiClient from '@/lib/utils/apiClient'; -import { BookClubParams, MyProfileParams } from '@/types/bookclubs'; +import { BookClubParams, orderType } from '@/types/bookclubs'; import { ClubDetailReviewFilters } from '@/types/review'; -// TODO: 추후 각자 구현하는 api 명세에 맞게 filter 타입 정의해주세요 +export interface MyProfileParams { + order?: orderType; +} export const bookClubs = createQueryKeys('bookClubs', { - all: (filters?: BookClubParams) => ({ - queryKey: [{ filters: filters || {} }], + // 전체 북클럽 쿼리의 base + all: null, + + // 북클럽 목록 조회 + list: (filters?: BookClubParams) => ({ + queryKey: ['list', { filters: filters || {} }], queryFn: (ctx) => apiClient.get('/book-clubs', { params: { @@ -18,6 +24,7 @@ export const bookClubs = createQueryKeys('bookClubs', { }), }), + // 북클럽 상세 조회 detail: (bookClubId: number) => ({ queryKey: [bookClubId], queryFn: () => apiClient.get(`/book-clubs/${bookClubId}`), @@ -36,11 +43,10 @@ export const bookClubs = createQueryKeys('bookClubs', { }, }), - //유저가 참여한 북클럽 조회 - userJoined: (userId: number, filters?: MyProfileParams) => ({ - queryKey: [userId, { filter: filters || {} }], + myJoined: (filters?: MyProfileParams) => ({ + queryKey: ['my', { filters: filters || {} }], queryFn: (ctx) => - apiClient.get(`/book-clubs/user/${userId}/joined`, { + apiClient.get('/book-clubs/my-joined', { params: { ...filters, page: ctx.pageParam ?? 1, @@ -49,11 +55,10 @@ export const bookClubs = createQueryKeys('bookClubs', { }), }), - //유저가 만든 북클럽 조회 - userCreated: (userId: number, filters?: MyProfileParams) => ({ - queryKey: [userId, { filter: filters || {} }], + myCreated: (filters?: MyProfileParams) => ({ + queryKey: ['my', { filters: filters || {} }], queryFn: (ctx) => - apiClient.get(`/book-clubs/user/${userId}/created`, { + apiClient.get('/book-clubs/my-created', { params: { ...filters, page: ctx.pageParam ?? 1, @@ -62,11 +67,10 @@ export const bookClubs = createQueryKeys('bookClubs', { }), }), - //유저가 작성한 리뷰 조회 - userReviewd: (userId: number, filters?: MyProfileParams) => ({ - queryKey: [userId, { filter: filters || {} }], + myReviews: (filters?: MyProfileParams) => ({ + queryKey: ['my', { filters: filters || {} }], queryFn: (ctx) => - apiClient.get(`/book-clubs/users/${userId}/reviews`, { + apiClient.get('/book-clubs/my-reviews', { params: { ...filters, page: ctx.pageParam ?? 1, @@ -75,11 +79,11 @@ export const bookClubs = createQueryKeys('bookClubs', { }), }), - //내가 참여한 북클럽 조회 - myJoined: (filters?: MyProfileParams) => ({ - queryKey: [{ filters: filters || {} }], + // 특정 유저의 북클럽 관련 + userJoined: (userId: number, filters?: MyProfileParams) => ({ + queryKey: ['user', userId, { filters: filters || {} }], queryFn: (ctx) => - apiClient.get('/book-clubs/my-joined', { + apiClient.get(`/book-clubs/user/${userId}/joined`, { params: { ...filters, page: ctx.pageParam ?? 1, @@ -88,11 +92,10 @@ export const bookClubs = createQueryKeys('bookClubs', { }), }), - //내가 만든 북클럽 조회 - myCreated: (filters?: MyProfileParams) => ({ - queryKey: [{ filters: filters || {} }], + userCreated: (userId: number, filters?: MyProfileParams) => ({ + queryKey: ['user', userId, { filters: filters || {} }], queryFn: (ctx) => - apiClient.get('/book-clubs/my-created', { + apiClient.get(`/book-clubs/user/${userId}/created`, { params: { ...filters, page: ctx.pageParam ?? 1, @@ -101,11 +104,10 @@ export const bookClubs = createQueryKeys('bookClubs', { }), }), - //내가 작성한 리뷰 조회 - myReviews: (filters?: MyProfileParams) => ({ - queryKey: [{ filters: filters || {} }], + userReviews: (userId: number, filters?: MyProfileParams) => ({ + queryKey: ['user', userId, { filters: filters || {} }], queryFn: (ctx) => - apiClient.get('/book-clubs/my-reviews', { + apiClient.get(`/book-clubs/users/${userId}/reviews`, { params: { ...filters, page: ctx.pageParam ?? 1, From 5655c8a6807cb92a3e624ded37f40ff79e782aa9 Mon Sep 17 00:00:00 2001 From: cloud0406 Date: Fri, 3 Jan 2025 11:35:11 +0900 Subject: [PATCH 03/21] =?UTF-8?q?=E2=99=BB=EF=B8=8F[Refactor]=20My,=20user?= =?UTF-8?q?=20=EC=BF=BC=EB=A6=AC=ED=82=A4=20=EB=AC=B6=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/book-club/react-query/queries.ts | 138 ++++++++++++----------- 1 file changed, 71 insertions(+), 67 deletions(-) diff --git a/src/api/book-club/react-query/queries.ts b/src/api/book-club/react-query/queries.ts index 9de7e2f6..f8853282 100644 --- a/src/api/book-club/react-query/queries.ts +++ b/src/api/book-club/react-query/queries.ts @@ -8,12 +8,10 @@ export interface MyProfileParams { } export const bookClubs = createQueryKeys('bookClubs', { - // 전체 북클럽 쿼리의 base all: null, - // 북클럽 목록 조회 list: (filters?: BookClubParams) => ({ - queryKey: ['list', { filters: filters || {} }], + queryKey: [{ filters: filters || {} }], queryFn: (ctx) => apiClient.get('/book-clubs', { params: { @@ -24,7 +22,6 @@ export const bookClubs = createQueryKeys('bookClubs', { }), }), - // 북클럽 상세 조회 detail: (bookClubId: number) => ({ queryKey: [bookClubId], queryFn: () => apiClient.get(`/book-clubs/${bookClubId}`), @@ -43,76 +40,83 @@ export const bookClubs = createQueryKeys('bookClubs', { }, }), - myJoined: (filters?: MyProfileParams) => ({ - queryKey: ['my', { filters: filters || {} }], - queryFn: (ctx) => - apiClient.get('/book-clubs/my-joined', { - params: { - ...filters, - page: ctx.pageParam ?? 1, - size: 10, - }, + my: () => ({ + queryKey: ['my'], + queryFn: () => ({}), + contextQueries: { + joined: (filters?: MyProfileParams) => ({ + queryKey: [{ filters: filters || {} }], + queryFn: (ctx) => + apiClient.get('/book-clubs/my-joined', { + params: { + ...filters, + page: ctx.pageParam ?? 1, + size: 10, + }, + }), }), - }), - - myCreated: (filters?: MyProfileParams) => ({ - queryKey: ['my', { filters: filters || {} }], - queryFn: (ctx) => - apiClient.get('/book-clubs/my-created', { - params: { - ...filters, - page: ctx.pageParam ?? 1, - size: 10, - }, + created: (filters?: MyProfileParams) => ({ + queryKey: [{ filters: filters || {} }], + queryFn: (ctx) => + apiClient.get('/book-clubs/my-created', { + params: { + ...filters, + page: ctx.pageParam ?? 1, + size: 10, + }, + }), }), - }), - - myReviews: (filters?: MyProfileParams) => ({ - queryKey: ['my', { filters: filters || {} }], - queryFn: (ctx) => - apiClient.get('/book-clubs/my-reviews', { - params: { - ...filters, - page: ctx.pageParam ?? 1, - size: 10, - }, + reviews: (filters?: MyProfileParams) => ({ + queryKey: [{ filters: filters || {} }], + queryFn: (ctx) => + apiClient.get('/book-clubs/my-reviews', { + params: { + ...filters, + page: ctx.pageParam ?? 1, + size: 10, + }, + }), }), + }, }), - // 특정 유저의 북클럽 관련 - userJoined: (userId: number, filters?: MyProfileParams) => ({ - queryKey: ['user', userId, { filters: filters || {} }], - queryFn: (ctx) => - apiClient.get(`/book-clubs/user/${userId}/joined`, { - params: { - ...filters, - page: ctx.pageParam ?? 1, - size: 10, - }, + user: (userId: number) => ({ + queryKey: [userId], + queryFn: () => ({}), + contextQueries: { + joined: (filters?: MyProfileParams) => ({ + queryKey: [{ filters: filters || {} }], + queryFn: (ctx) => + apiClient.get(`/book-clubs/user/${userId}/joined`, { + params: { + ...filters, + page: ctx.pageParam ?? 1, + size: 10, + }, + }), }), - }), - - userCreated: (userId: number, filters?: MyProfileParams) => ({ - queryKey: ['user', userId, { filters: filters || {} }], - queryFn: (ctx) => - apiClient.get(`/book-clubs/user/${userId}/created`, { - params: { - ...filters, - page: ctx.pageParam ?? 1, - size: 10, - }, + created: (filters?: MyProfileParams) => ({ + queryKey: [{ filters: filters || {} }], + queryFn: (ctx) => + apiClient.get(`/book-clubs/user/${userId}/created`, { + params: { + ...filters, + page: ctx.pageParam ?? 1, + size: 10, + }, + }), }), - }), - - userReviews: (userId: number, filters?: MyProfileParams) => ({ - queryKey: ['user', userId, { filters: filters || {} }], - queryFn: (ctx) => - apiClient.get(`/book-clubs/users/${userId}/reviews`, { - params: { - ...filters, - page: ctx.pageParam ?? 1, - size: 10, - }, + reviews: (filters?: MyProfileParams) => ({ + queryKey: [{ filters: filters || {} }], + queryFn: (ctx) => + apiClient.get(`/book-clubs/users/${userId}/reviews`, { + params: { + ...filters, + page: ctx.pageParam ?? 1, + size: 10, + }, + }), }), + }, }), }); From d31285e559470907e804970986da0b69fee7733b Mon Sep 17 00:00:00 2001 From: cloud0406 Date: Fri, 3 Jan 2025 13:59:43 +0900 Subject: [PATCH 04/21] =?UTF-8?q?=E2=99=BB=EF=B8=8F[Refactor]=20refetchonM?= =?UTF-8?q?ount=20true=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/utils/reactQueryProvider.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/utils/reactQueryProvider.tsx b/src/lib/utils/reactQueryProvider.tsx index 7a1f1467..28efda55 100644 --- a/src/lib/utils/reactQueryProvider.tsx +++ b/src/lib/utils/reactQueryProvider.tsx @@ -6,7 +6,7 @@ export const queryClient = new QueryClient({ defaultOptions: { queries: { refetchOnWindowFocus: false, // 윈도우가 다시 포커스될 때 데이터를 다시 가져올지 여부 - refetchOnMount: false, // 컴포넌트가 마운트될 때 데이터를 다시 가져올지 여부 + refetchOnMount: true, // 컴포넌트가 마운트될 때 데이터를 다시 가져올지 여부 retry: 0, // 실패한 쿼리 재시도 횟수 refetchOnReconnect: false, // 네트워크 재연결시 데이터를 다시 가져올지 여부 retryOnMount: false, // 마운트 시 실패한 쿼리 재시도 여부 From 1fd63407974ada2f60e420d56b31ab2bd6b3ac38 Mon Sep 17 00:00:00 2001 From: cloud0406 Date: Fri, 3 Jan 2025 15:46:26 +0900 Subject: [PATCH 05/21] =?UTF-8?q?=E2=99=BB=EF=B8=8F[Refactor]=20=EC=BF=BC?= =?UTF-8?q?=EB=A6=AC=ED=82=A4=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/book-club/bookClubReviewAPI.ts | 6 ++++-- src/api/book-club/react-query/customHooks.ts | 22 +++++++++----------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/api/book-club/bookClubReviewAPI.ts b/src/api/book-club/bookClubReviewAPI.ts index 1c73422c..15b40a4d 100644 --- a/src/api/book-club/bookClubReviewAPI.ts +++ b/src/api/book-club/bookClubReviewAPI.ts @@ -7,12 +7,14 @@ export const bookClubReviewAPI = { //단일 북클럽 리뷰 목록 조회 getReviews: async ({ bookClubId, - params, + params = { order: 'DESC' }, }: { bookClubId: number; params?: DetailClubReviewParams; }) => { - await apiClient.get(`book-clubs/${bookClubId}/reviews`, { params }); + return await apiClient.get(`book-clubs/${bookClubId}/reviews`, { + params: { ...params }, + }); }, //내가 작성한 리뷰 조회 diff --git a/src/api/book-club/react-query/customHooks.ts b/src/api/book-club/react-query/customHooks.ts index b9138e33..db6cd170 100644 --- a/src/api/book-club/react-query/customHooks.ts +++ b/src/api/book-club/react-query/customHooks.ts @@ -17,14 +17,12 @@ export function useBookClubCreateMutation() { mutationFn: (formData: FormData) => bookClubMainAPI.create(formData), onSuccess: () => { queryClient.invalidateQueries({ - queryKey: bookClubs.all().queryKey, + queryKey: bookClubs.list().queryKey, }); queryClient.invalidateQueries({ - queryKey: bookClubs.myCreated().queryKey, - }); - queryClient.invalidateQueries({ - queryKey: bookClubs.myJoined().queryKey, + queryKey: bookClubs.my().queryKey, }); + showToast({ message: '북클럽이 성공적으로 생성되었습니다.', type: 'success', @@ -46,7 +44,7 @@ export function useJoinBookClub() { queryKey: bookClubs.detail(id).queryKey, }); queryClient.invalidateQueries({ - queryKey: bookClubs.myJoined().queryKey, + queryKey: bookClubs.my()._ctx.joined().queryKey, }); }, }); @@ -62,7 +60,7 @@ export function useLeaveBookClub() { queryKey: bookClubs.detail(id).queryKey, }); queryClient.invalidateQueries({ - queryKey: bookClubs.myJoined().queryKey, + queryKey: bookClubs.my()._ctx.joined().queryKey, }); }, }); @@ -84,7 +82,7 @@ export function useWriteReview() { }); queryClient.invalidateQueries({ - queryKey: bookClubs.myReviews().queryKey, + queryKey: bookClubs.my()._ctx.reviews().queryKey, }); showToast({ message: '리뷰 작성을 완료하였습니다', type: 'success' }); }, @@ -103,10 +101,10 @@ export function useCancelBookClub() { mutationFn: (id: number) => bookClubMainAPI.cancel(id), onSuccess: () => { queryClient.invalidateQueries({ - queryKey: bookClubs.myCreated().queryKey, + queryKey: bookClubs.my()._ctx.created().queryKey, }); queryClient.invalidateQueries({ - queryKey: bookClubs.myJoined().queryKey, + queryKey: bookClubs.my()._ctx.joined().queryKey, }); }, }); @@ -119,7 +117,7 @@ export function useLikeBookClub() { mutationFn: (id: number) => bookClubLikeAPI.like(id), onSuccess: (_, id) => { queryClient.invalidateQueries({ - queryKey: bookClubs.all().queryKey, + queryKey: bookClubs.list().queryKey, }); queryClient.invalidateQueries({ queryKey: bookClubs.detail(id).queryKey, @@ -135,7 +133,7 @@ export function useUnLikeBookClub() { mutationFn: (id: number) => bookClubLikeAPI.unlike(id), onSuccess: (_, id) => { queryClient.invalidateQueries({ - queryKey: bookClubs.all().queryKey, + queryKey: bookClubs.list().queryKey, }); queryClient.invalidateQueries({ queryKey: bookClubs.detail(id).queryKey, From 3de2d18ccfc09bcfa23d91d26c6fd69bbc5c1164 Mon Sep 17 00:00:00 2001 From: cloud0406 Date: Fri, 3 Jan 2025 15:46:53 +0900 Subject: [PATCH 06/21] =?UTF-8?q?=E2=99=BB=EF=B8=8F[Refactor]=20=EB=82=B4?= =?UTF-8?q?=20=EB=AA=A8=EC=9E=84=20=EC=A1=B0=ED=9A=8C=20=EC=BF=BC=EB=A6=AC?= =?UTF-8?q?=ED=82=A4=20=EB=B3=80=EA=B2=BD=EB=90=9C=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/profile/container/MyCreatedClubList.tsx | 2 +- src/features/profile/container/MyJoinedClubList.tsx | 2 +- src/features/profile/container/MyWrittenReviewList.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/features/profile/container/MyCreatedClubList.tsx b/src/features/profile/container/MyCreatedClubList.tsx index 74173c5c..04b0dce6 100644 --- a/src/features/profile/container/MyCreatedClubList.tsx +++ b/src/features/profile/container/MyCreatedClubList.tsx @@ -15,7 +15,7 @@ import { BookClub } from '@/types/bookclubs'; export default function MyCreatedClubList({ order }: ClubListProps) { const router = useRouter(); - const { queryKey, queryFn } = bookClubs.myCreated({ + const { queryKey, queryFn } = bookClubs.my()._ctx.created({ order: order, }); const { data, isLoading, error } = useQuery({ queryKey, queryFn }); diff --git a/src/features/profile/container/MyJoinedClubList.tsx b/src/features/profile/container/MyJoinedClubList.tsx index 28cb239e..e2abe9a1 100644 --- a/src/features/profile/container/MyJoinedClubList.tsx +++ b/src/features/profile/container/MyJoinedClubList.tsx @@ -28,7 +28,7 @@ export default function MyJoinedClubList({ order }: ClubListProps) { const today = new Date(); - const { queryKey, queryFn } = bookClubs.myJoined({ + const { queryKey, queryFn } = bookClubs.my()._ctx.joined({ order: order, }); const { data, isLoading, error } = useQuery({ diff --git a/src/features/profile/container/MyWrittenReviewList.tsx b/src/features/profile/container/MyWrittenReviewList.tsx index 73d01812..7d6e3267 100644 --- a/src/features/profile/container/MyWrittenReviewList.tsx +++ b/src/features/profile/container/MyWrittenReviewList.tsx @@ -12,7 +12,7 @@ import { Review } from '@/types/review'; export default function MyWrittenReviewList({ order }: ClubListProps) { const router = useRouter(); - const { queryKey, queryFn } = bookClubs.myReviews({ order }); + const { queryKey, queryFn } = bookClubs.my()._ctx.reviews({ order }); const { data, isLoading, error } = useQuery({ queryKey, queryFn, From ca0c5bf350226d1c059ce564478f1e92fd9caaa3 Mon Sep 17 00:00:00 2001 From: cloud0406 Date: Fri, 3 Jan 2025 15:47:24 +0900 Subject: [PATCH 07/21] =?UTF-8?q?=E2=99=BB=EF=B8=8F[Refactor]=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=BF=BC=EB=A6=AC?= =?UTF-8?q?=ED=82=A4=20=EB=B3=80=EA=B2=BD=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/book-club/bookClubMainAPI.ts | 4 +++ src/api/book-club/react-query/queries.ts | 28 ++++++++----------- src/api/book-club/types.ts | 2 +- .../club-details/components/ReviewList.tsx | 7 +++-- 4 files changed, 22 insertions(+), 19 deletions(-) diff --git a/src/api/book-club/bookClubMainAPI.ts b/src/api/book-club/bookClubMainAPI.ts index 5eafb190..e90a4e91 100644 --- a/src/api/book-club/bookClubMainAPI.ts +++ b/src/api/book-club/bookClubMainAPI.ts @@ -14,6 +14,10 @@ export const bookClubMainAPI = { }, //단일 북클럽 조회 + getBookClubDetail: async (bookClubId: number) => { + const response = await apiClient.get(`/book-clubs/${bookClubId}`); + return response.data; + }, //유저가 참가한 북클럽 조회 diff --git a/src/api/book-club/react-query/queries.ts b/src/api/book-club/react-query/queries.ts index f8853282..ad934b49 100644 --- a/src/api/book-club/react-query/queries.ts +++ b/src/api/book-club/react-query/queries.ts @@ -2,16 +2,15 @@ import { createQueryKeys } from '@lukemorales/query-key-factory'; import apiClient from '@/lib/utils/apiClient'; import { BookClubParams, orderType } from '@/types/bookclubs'; import { ClubDetailReviewFilters } from '@/types/review'; +import { bookClubReviewAPI } from '@/api/book-club/bookClubReviewAPI'; export interface MyProfileParams { order?: orderType; } export const bookClubs = createQueryKeys('bookClubs', { - all: null, - list: (filters?: BookClubParams) => ({ - queryKey: [{ filters: filters || {} }], + queryKey: [{ filters }], queryFn: (ctx) => apiClient.get('/book-clubs', { params: { @@ -27,25 +26,22 @@ export const bookClubs = createQueryKeys('bookClubs', { queryFn: () => apiClient.get(`/book-clubs/${bookClubId}`), contextQueries: { reviews: (filters?: ClubDetailReviewFilters) => ({ - queryKey: [{ filters: filters || {} }], - queryFn: (ctx) => - apiClient.get(`/book-clubs/${bookClubId}/reviews`, { - params: { - ...filters, - page: ctx.pageParam ?? 1, - size: 10, - }, + queryKey: [{ filters }], + queryFn: () => + bookClubReviewAPI.getReviews({ + bookClubId, + params: filters, }), }), }, }), my: () => ({ - queryKey: ['my'], + queryKey: [{}], queryFn: () => ({}), contextQueries: { joined: (filters?: MyProfileParams) => ({ - queryKey: [{ filters: filters || {} }], + queryKey: [{ filters }], queryFn: (ctx) => apiClient.get('/book-clubs/my-joined', { params: { @@ -56,7 +52,7 @@ export const bookClubs = createQueryKeys('bookClubs', { }), }), created: (filters?: MyProfileParams) => ({ - queryKey: [{ filters: filters || {} }], + queryKey: [{ filters }], queryFn: (ctx) => apiClient.get('/book-clubs/my-created', { params: { @@ -67,7 +63,7 @@ export const bookClubs = createQueryKeys('bookClubs', { }), }), reviews: (filters?: MyProfileParams) => ({ - queryKey: [{ filters: filters || {} }], + queryKey: [{ filters }], queryFn: (ctx) => apiClient.get('/book-clubs/my-reviews', { params: { @@ -96,7 +92,7 @@ export const bookClubs = createQueryKeys('bookClubs', { }), }), created: (filters?: MyProfileParams) => ({ - queryKey: [{ filters: filters || {} }], + queryKey: [{ filters }], queryFn: (ctx) => apiClient.get(`/book-clubs/user/${userId}/created`, { params: { diff --git a/src/api/book-club/types.ts b/src/api/book-club/types.ts index 7217edbd..7b89d277 100644 --- a/src/api/book-club/types.ts +++ b/src/api/book-club/types.ts @@ -1,5 +1,5 @@ export interface DetailClubReviewParams { - bookClubId: number; + // bookClubId: number; order?: 'DESC' | 'RATE_DESC' | 'RATE_ASC'; size?: number; page?: number; diff --git a/src/features/club-details/components/ReviewList.tsx b/src/features/club-details/components/ReviewList.tsx index 03e44737..8187542d 100644 --- a/src/features/club-details/components/ReviewList.tsx +++ b/src/features/club-details/components/ReviewList.tsx @@ -11,11 +11,14 @@ function ReviewList({ setFilters, }: { reviewInfo: ClubReviewResponse; - setFilters: (newFilters: Partial) => void; + setFilters: React.Dispatch>; }) { const setSortingOrder = (selectedLabel: string | undefined) => { if (['DESC', 'RATE_DESC', 'RATE_ASC'].includes(selectedLabel || '')) { - setFilters({ order: selectedLabel as 'DESC' | 'RATE_DESC' | 'RATE_ASC' }); + setFilters((prev) => ({ + ...prev, + order: selectedLabel as 'DESC' | 'RATE_DESC' | 'RATE_ASC', + })); } }; From e5de3767c9a2f8d48b93ec1793d049651682c239 Mon Sep 17 00:00:00 2001 From: cloud0406 Date: Fri, 3 Jan 2025 16:54:40 +0900 Subject: [PATCH 08/21] =?UTF-8?q?=E2=99=BB=EF=B8=8F[Refactor]=20=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=A1=B0=ED=9A=8C=20api=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/book-club/react-query/queries.ts | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/api/book-club/react-query/queries.ts b/src/api/book-club/react-query/queries.ts index ad934b49..6ec10151 100644 --- a/src/api/book-club/react-query/queries.ts +++ b/src/api/book-club/react-query/queries.ts @@ -3,6 +3,7 @@ import apiClient from '@/lib/utils/apiClient'; import { BookClubParams, orderType } from '@/types/bookclubs'; import { ClubDetailReviewFilters } from '@/types/review'; import { bookClubReviewAPI } from '@/api/book-club/bookClubReviewAPI'; +import { bookClubMainAPI } from '@/api/book-club/bookClubMainAPI'; export interface MyProfileParams { order?: orderType; @@ -11,14 +12,7 @@ export interface MyProfileParams { export const bookClubs = createQueryKeys('bookClubs', { list: (filters?: BookClubParams) => ({ queryKey: [{ filters }], - queryFn: (ctx) => - apiClient.get('/book-clubs', { - params: { - ...filters, - page: ctx.pageParam ?? 1, - size: 10, - }, - }), + queryFn: () => bookClubMainAPI.getBookClubs(filters), }), detail: (bookClubId: number) => ({ From e3885383abf4552cef0ae5f502e818fba86918b1 Mon Sep 17 00:00:00 2001 From: cloud0406 Date: Fri, 3 Jan 2025 17:35:37 +0900 Subject: [PATCH 09/21] =?UTF-8?q?=E2=99=BB=EF=B8=8F[Refactor]=20=EB=82=B4?= =?UTF-8?q?=20=EB=AA=A8=EC=9E=84=EB=93=A4=20=EC=BF=BC=EB=A6=AC=ED=82=A4=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/book-club/bookClubMainAPI.ts | 10 +++++++- src/api/book-club/react-query/queries.ts | 24 +++---------------- .../profile/container/MyCreatedClubList.tsx | 11 ++++----- .../profile/container/MyJoinedClubList.tsx | 13 ++++------ src/types/bookclubs.ts | 2 ++ 5 files changed, 24 insertions(+), 36 deletions(-) diff --git a/src/api/book-club/bookClubMainAPI.ts b/src/api/book-club/bookClubMainAPI.ts index e90a4e91..daf3b6e4 100644 --- a/src/api/book-club/bookClubMainAPI.ts +++ b/src/api/book-club/bookClubMainAPI.ts @@ -1,5 +1,5 @@ import apiClient from '@/lib/utils/apiClient'; -import { BookClubParams } from '@/types/bookclubs'; +import { BookClubParams, MyProfileParams } from '@/types/bookclubs'; export const bookClubMainAPI = { //북클럽 삭제 @@ -24,8 +24,16 @@ export const bookClubMainAPI = { //유저가 만든 북클럽 조회 //내가 참여한 북클럽 조회 + myJoined: async (params?: MyProfileParams) => { + const response = await apiClient.get('/book-clubs/my-joined', { params }); + return response.data; + }, //내가 만든 북클럽 조회 + myCreated: async (params?: MyProfileParams) => { + const response = await apiClient.get('/book-clubs/my-created', { params }); + return response.data; + }, //북클럽 생성 create: async (formData: FormData) => { diff --git a/src/api/book-club/react-query/queries.ts b/src/api/book-club/react-query/queries.ts index 6ec10151..a16dd22a 100644 --- a/src/api/book-club/react-query/queries.ts +++ b/src/api/book-club/react-query/queries.ts @@ -1,14 +1,10 @@ import { createQueryKeys } from '@lukemorales/query-key-factory'; import apiClient from '@/lib/utils/apiClient'; -import { BookClubParams, orderType } from '@/types/bookclubs'; +import { BookClubParams, MyProfileParams } from '@/types/bookclubs'; import { ClubDetailReviewFilters } from '@/types/review'; import { bookClubReviewAPI } from '@/api/book-club/bookClubReviewAPI'; import { bookClubMainAPI } from '@/api/book-club/bookClubMainAPI'; -export interface MyProfileParams { - order?: orderType; -} - export const bookClubs = createQueryKeys('bookClubs', { list: (filters?: BookClubParams) => ({ queryKey: [{ filters }], @@ -36,25 +32,11 @@ export const bookClubs = createQueryKeys('bookClubs', { contextQueries: { joined: (filters?: MyProfileParams) => ({ queryKey: [{ filters }], - queryFn: (ctx) => - apiClient.get('/book-clubs/my-joined', { - params: { - ...filters, - page: ctx.pageParam ?? 1, - size: 10, - }, - }), + queryFn: () => bookClubMainAPI.myJoined(filters), }), created: (filters?: MyProfileParams) => ({ queryKey: [{ filters }], - queryFn: (ctx) => - apiClient.get('/book-clubs/my-created', { - params: { - ...filters, - page: ctx.pageParam ?? 1, - size: 10, - }, - }), + queryFn: () => bookClubMainAPI.myCreated(filters), }), reviews: (filters?: MyProfileParams) => ({ queryKey: [{ filters }], diff --git a/src/features/profile/container/MyCreatedClubList.tsx b/src/features/profile/container/MyCreatedClubList.tsx index 04b0dce6..7da94b85 100644 --- a/src/features/profile/container/MyCreatedClubList.tsx +++ b/src/features/profile/container/MyCreatedClubList.tsx @@ -14,15 +14,14 @@ import { BookClub } from '@/types/bookclubs'; export default function MyCreatedClubList({ order }: ClubListProps) { const router = useRouter(); - - const { queryKey, queryFn } = bookClubs.my()._ctx.created({ - order: order, - }); - const { data, isLoading, error } = useQuery({ queryKey, queryFn }); const { popUpState, onCancel, onConfirmCancel, onClosePopUp } = useCancelClub(); - const myCreatedList: BookClub[] = data?.data?.bookClubs || []; + const { data, isLoading, error } = useQuery( + bookClubs.my()._ctx.created({ order, page: 1, size: 10 }), + ); + + const myCreatedList: BookClub[] = data?.bookClubs || []; const today = new Date(); diff --git a/src/features/profile/container/MyJoinedClubList.tsx b/src/features/profile/container/MyJoinedClubList.tsx index e2abe9a1..b9e1ed62 100644 --- a/src/features/profile/container/MyJoinedClubList.tsx +++ b/src/features/profile/container/MyJoinedClubList.tsx @@ -28,13 +28,10 @@ export default function MyJoinedClubList({ order }: ClubListProps) { const today = new Date(); - const { queryKey, queryFn } = bookClubs.my()._ctx.joined({ - order: order, - }); - const { data, isLoading, error } = useQuery({ - queryKey, - queryFn, - }); + const { data, isLoading, error } = useQuery( + bookClubs.my()._ctx.joined({ order, page: 1, size: 10 }), + ); + const { mutateAsync: leaveClub } = useLeaveBookClub(); const { mutate: writeReview } = useWriteReview(); @@ -49,7 +46,7 @@ export default function MyJoinedClubList({ order }: ClubListProps) { // if (!user) return null; - const myJoinedList: BookClub[] = data?.data?.bookClubs || []; + const myJoinedList: BookClub[] = data?.bookClubs || []; // 카드 클릭 이벤트 const onClick = (clubId: number) => { diff --git a/src/types/bookclubs.ts b/src/types/bookclubs.ts index 8a9c97f1..d858364d 100644 --- a/src/types/bookclubs.ts +++ b/src/types/bookclubs.ts @@ -12,6 +12,8 @@ export interface BookClubParams { export interface MyProfileParams { order?: orderType; + page?: number; + size?: number; } //TODO: imageUrl. isPast, clubStatus, reviewScore 수정 From c31e3838bb86f05717094977533771c79a984a2f Mon Sep 17 00:00:00 2001 From: cloud0406 Date: Fri, 3 Jan 2025 17:45:47 +0900 Subject: [PATCH 10/21] =?UTF-8?q?=E2=99=BB=EF=B8=8F[Refactor]=20=EB=82=B4?= =?UTF-8?q?=20=EB=A6=AC=EB=B7=B0=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/book-club/bookClubReviewAPI.ts | 9 ++++++++- src/api/book-club/react-query/queries.ts | 9 +-------- src/features/profile/container/MyWrittenReviewList.tsx | 10 ++++------ 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/api/book-club/bookClubReviewAPI.ts b/src/api/book-club/bookClubReviewAPI.ts index 15b40a4d..f0bf7516 100644 --- a/src/api/book-club/bookClubReviewAPI.ts +++ b/src/api/book-club/bookClubReviewAPI.ts @@ -1,5 +1,6 @@ import apiClient from '@/lib/utils/apiClient'; import { WriteReviewParams, DetailClubReviewParams } from './types'; +import { MyProfileParams } from '@/types/bookclubs'; export const bookClubReviewAPI = { //리뷰 삭제하기 @@ -13,11 +14,17 @@ export const bookClubReviewAPI = { params?: DetailClubReviewParams; }) => { return await apiClient.get(`book-clubs/${bookClubId}/reviews`, { - params: { ...params }, + params, }); }, //내가 작성한 리뷰 조회 + myReviews: async (params?: MyProfileParams) => { + const response = await apiClient.get('/book-clubs/my-reviews', { + params, + }); + return response.data; + }, //리뷰 작성하기 write: async ({ bookClubId, rating, content }: WriteReviewParams) => { diff --git a/src/api/book-club/react-query/queries.ts b/src/api/book-club/react-query/queries.ts index a16dd22a..1e38fbef 100644 --- a/src/api/book-club/react-query/queries.ts +++ b/src/api/book-club/react-query/queries.ts @@ -40,14 +40,7 @@ export const bookClubs = createQueryKeys('bookClubs', { }), reviews: (filters?: MyProfileParams) => ({ queryKey: [{ filters }], - queryFn: (ctx) => - apiClient.get('/book-clubs/my-reviews', { - params: { - ...filters, - page: ctx.pageParam ?? 1, - size: 10, - }, - }), + queryFn: () => bookClubReviewAPI.myReviews(filters), }), }, }), diff --git a/src/features/profile/container/MyWrittenReviewList.tsx b/src/features/profile/container/MyWrittenReviewList.tsx index 7d6e3267..e94897fa 100644 --- a/src/features/profile/container/MyWrittenReviewList.tsx +++ b/src/features/profile/container/MyWrittenReviewList.tsx @@ -12,13 +12,11 @@ import { Review } from '@/types/review'; export default function MyWrittenReviewList({ order }: ClubListProps) { const router = useRouter(); - const { queryKey, queryFn } = bookClubs.my()._ctx.reviews({ order }); - const { data, isLoading, error } = useQuery({ - queryKey, - queryFn, - }); + const { data, isLoading, error } = useQuery( + bookClubs.my()._ctx.reviews({ order, page: 1, size: 10 }), + ); - const myReviewList: Review[] = data?.data?.reviews || []; + const myReviewList: Review[] = data?.reviews || []; return (
From c831d1c79a7bc7e172940c2473271121c8540470 Mon Sep 17 00:00:00 2001 From: cloud0406 Date: Fri, 3 Jan 2025 18:04:56 +0900 Subject: [PATCH 11/21] =?UTF-8?q?=E2=99=BB=EF=B8=8F[Refactor]=20=EC=9C=A0?= =?UTF-8?q?=EC=A0=80=20=EB=AA=A8=EC=9E=84=20=EC=BF=BC=EB=A6=AC=ED=82=A4=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/book-club/bookClubMainAPI.ts | 12 ++++++++++ src/api/book-club/react-query/queries.ts | 22 ++++--------------- .../profile/container/CreatedClubList.tsx | 12 ++++------ .../profile/container/JoinedClubList.tsx | 12 ++++------ 4 files changed, 24 insertions(+), 34 deletions(-) diff --git a/src/api/book-club/bookClubMainAPI.ts b/src/api/book-club/bookClubMainAPI.ts index daf3b6e4..fdcd79e4 100644 --- a/src/api/book-club/bookClubMainAPI.ts +++ b/src/api/book-club/bookClubMainAPI.ts @@ -20,8 +20,20 @@ export const bookClubMainAPI = { }, //유저가 참가한 북클럽 조회 + userJoined: async (userId: number, params?: MyProfileParams) => { + const response = await apiClient.get(`/book-clubs/user/${userId}/joined`, { + params, + }); + return response.data; + }, //유저가 만든 북클럽 조회 + userCreated: async (userId: number, params?: MyProfileParams) => { + const response = await apiClient.get(`/book-clubs/user/${userId}/created`, { + params, + }); + return response.data; + }, //내가 참여한 북클럽 조회 myJoined: async (params?: MyProfileParams) => { diff --git a/src/api/book-club/react-query/queries.ts b/src/api/book-club/react-query/queries.ts index 1e38fbef..485a697b 100644 --- a/src/api/book-club/react-query/queries.ts +++ b/src/api/book-club/react-query/queries.ts @@ -50,29 +50,15 @@ export const bookClubs = createQueryKeys('bookClubs', { queryFn: () => ({}), contextQueries: { joined: (filters?: MyProfileParams) => ({ - queryKey: [{ filters: filters || {} }], - queryFn: (ctx) => - apiClient.get(`/book-clubs/user/${userId}/joined`, { - params: { - ...filters, - page: ctx.pageParam ?? 1, - size: 10, - }, - }), + queryKey: [{ filters }], + queryFn: () => bookClubMainAPI.userJoined(userId, filters), }), created: (filters?: MyProfileParams) => ({ queryKey: [{ filters }], - queryFn: (ctx) => - apiClient.get(`/book-clubs/user/${userId}/created`, { - params: { - ...filters, - page: ctx.pageParam ?? 1, - size: 10, - }, - }), + queryFn: () => bookClubMainAPI.userCreated(userId, filters), }), reviews: (filters?: MyProfileParams) => ({ - queryKey: [{ filters: filters || {} }], + queryKey: [{ filters }], queryFn: (ctx) => apiClient.get(`/book-clubs/users/${userId}/reviews`, { params: { diff --git a/src/features/profile/container/CreatedClubList.tsx b/src/features/profile/container/CreatedClubList.tsx index 0cf03e9d..beaf387f 100644 --- a/src/features/profile/container/CreatedClubList.tsx +++ b/src/features/profile/container/CreatedClubList.tsx @@ -15,15 +15,11 @@ export default function CreatedClubList({ order }: ClubListProps) { const router = useRouter(); const user = useGetUserByPath(); - const { queryKey, queryFn } = bookClubs.userCreated(user?.id, { - order: order, - }); - const { data, isLoading, error } = useQuery({ - queryKey, - queryFn, - }); + const { data, isLoading, error } = useQuery( + bookClubs.user(user?.id)._ctx.created({ order, page: 1, size: 10 }), + ); - const CreatedList: BookClub[] = data?.data?.bookClubs || []; + const CreatedList: BookClub[] = data?.bookClubs ?? []; const today = new Date(); // 카드 클릭 이벤트 diff --git a/src/features/profile/container/JoinedClubList.tsx b/src/features/profile/container/JoinedClubList.tsx index 6139cbb0..871597b0 100644 --- a/src/features/profile/container/JoinedClubList.tsx +++ b/src/features/profile/container/JoinedClubList.tsx @@ -17,15 +17,11 @@ export default function JoinedClubList({ order }: ClubListProps) { const router = useRouter(); const user = useGetUserByPath(); - const { queryKey, queryFn } = bookClubs.userJoined(user?.id, { - order: order, - }); - const { data, isLoading, isError, error } = useQuery({ - queryKey, - queryFn, - }); + const { data, isLoading, isError, error } = useQuery( + bookClubs.user(user?.id)._ctx.joined({ order, page: 1, size: 10 }), + ); - const JoinedList: BookClub[] = data?.data?.bookClubs || []; + const JoinedList: BookClub[] = data?.bookClubs ?? []; const today = new Date(); From 877f5ec6e9ad2347660379f9169edbf84a596669 Mon Sep 17 00:00:00 2001 From: cloud0406 Date: Fri, 3 Jan 2025 18:13:09 +0900 Subject: [PATCH 12/21] =?UTF-8?q?=E2=99=BB=EF=B8=8F[Refactor]=20=EC=9C=A0?= =?UTF-8?q?=EC=A0=80=20=EB=A6=AC=EB=B7=B0=20=EC=BF=BC=EB=A6=AC=ED=82=A4=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/book-club/bookClubReviewAPI.ts | 17 +++++++++++++++++ src/api/book-club/react-query/queries.ts | 10 ++-------- .../profile/container/WrittenReviewList.tsx | 10 ++++------ 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/api/book-club/bookClubReviewAPI.ts b/src/api/book-club/bookClubReviewAPI.ts index f0bf7516..eca1fffa 100644 --- a/src/api/book-club/bookClubReviewAPI.ts +++ b/src/api/book-club/bookClubReviewAPI.ts @@ -18,6 +18,23 @@ export const bookClubReviewAPI = { }); }, + //특정 유저의 리뷰 조회 + userReviews: async ({ + userId, + params = { order: 'DESC' }, + }: { + userId: number; + params?: MyProfileParams; + }) => { + const response = await apiClient.get( + `/book-clubs/users/${userId}/reviews`, + { + params, + }, + ); + return response.data; + }, + //내가 작성한 리뷰 조회 myReviews: async (params?: MyProfileParams) => { const response = await apiClient.get('/book-clubs/my-reviews', { diff --git a/src/api/book-club/react-query/queries.ts b/src/api/book-club/react-query/queries.ts index 485a697b..2a58219a 100644 --- a/src/api/book-club/react-query/queries.ts +++ b/src/api/book-club/react-query/queries.ts @@ -59,14 +59,8 @@ export const bookClubs = createQueryKeys('bookClubs', { }), reviews: (filters?: MyProfileParams) => ({ queryKey: [{ filters }], - queryFn: (ctx) => - apiClient.get(`/book-clubs/users/${userId}/reviews`, { - params: { - ...filters, - page: ctx.pageParam ?? 1, - size: 10, - }, - }), + queryFn: () => + bookClubReviewAPI.userReviews({ userId, params: filters }), }), }, }), diff --git a/src/features/profile/container/WrittenReviewList.tsx b/src/features/profile/container/WrittenReviewList.tsx index 31849fe5..caba88d3 100644 --- a/src/features/profile/container/WrittenReviewList.tsx +++ b/src/features/profile/container/WrittenReviewList.tsx @@ -14,13 +14,11 @@ export default function WrittenReviewList({ order }: ClubListProps) { const router = useRouter(); const user = useGetUserByPath(); - const { queryKey, queryFn } = bookClubs.userReviewd(user?.id, { order }); - const { data, isLoading, error } = useQuery({ - queryKey, - queryFn, - }); + const { data, isLoading, error } = useQuery( + bookClubs.user(user?.id)._ctx.reviews({ order, page: 1, size: 10 }), + ); - const ReviewList: Review[] = data?.data?.reviews || []; + const ReviewList: Review[] = data?.reviews || []; return (
From b61fd7c45854f5eb7d871d28fa2bf67bf01c75b7 Mon Sep 17 00:00:00 2001 From: cloud0406 Date: Fri, 3 Jan 2025 18:20:55 +0900 Subject: [PATCH 13/21] =?UTF-8?q?=E2=99=BB=EF=B8=8F[Refactor]=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=EC=A1=B0=ED=9A=8C=20=EC=BF=BC=EB=A6=AC=ED=82=A4=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/book-club/react-query/queries.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/api/book-club/react-query/queries.ts b/src/api/book-club/react-query/queries.ts index 2a58219a..f04f4e5f 100644 --- a/src/api/book-club/react-query/queries.ts +++ b/src/api/book-club/react-query/queries.ts @@ -1,5 +1,4 @@ import { createQueryKeys } from '@lukemorales/query-key-factory'; -import apiClient from '@/lib/utils/apiClient'; import { BookClubParams, MyProfileParams } from '@/types/bookclubs'; import { ClubDetailReviewFilters } from '@/types/review'; import { bookClubReviewAPI } from '@/api/book-club/bookClubReviewAPI'; @@ -13,7 +12,7 @@ export const bookClubs = createQueryKeys('bookClubs', { detail: (bookClubId: number) => ({ queryKey: [bookClubId], - queryFn: () => apiClient.get(`/book-clubs/${bookClubId}`), + queryFn: () => bookClubMainAPI.getBookClubDetail(bookClubId), contextQueries: { reviews: (filters?: ClubDetailReviewFilters) => ({ queryKey: [{ filters }], From 56bde7d3109971c808d5680979674828921b8c04 Mon Sep 17 00:00:00 2001 From: cloud0406 Date: Fri, 3 Jan 2025 18:30:58 +0900 Subject: [PATCH 14/21] =?UTF-8?q?=F0=9F=90=9B[Fix]=20=EB=94=94=ED=85=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=A1=B0=ED=9A=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/club-details/hooks/useClubDetails.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/features/club-details/hooks/useClubDetails.ts b/src/features/club-details/hooks/useClubDetails.ts index 2c21f798..72f37a46 100644 --- a/src/features/club-details/hooks/useClubDetails.ts +++ b/src/features/club-details/hooks/useClubDetails.ts @@ -2,11 +2,9 @@ import { bookClubs } from '@/api/book-club/react-query'; import { useQuery } from '@tanstack/react-query'; export function useClubDetails(idAsNumber: number) { - const { data, isLoading, error } = useQuery({ - ...bookClubs.detail(idAsNumber), - }); + const { data, isLoading, error } = useQuery(bookClubs.detail(idAsNumber)); - const clubInfo = data?.data; + const clubInfo = data; return { clubInfo, From ae2960c5b1d11c9c40db041f01c58d0e551356a3 Mon Sep 17 00:00:00 2001 From: cloud0406 Date: Fri, 3 Jan 2025 19:04:00 +0900 Subject: [PATCH 15/21] =?UTF-8?q?=F0=9F=90=9B[Fix]=20=EC=BF=BC=EB=A6=AC?= =?UTF-8?q?=ED=82=A4=20=EB=AC=B4=ED=9A=A8=ED=99=94=EC=95=88=EB=90=98?= =?UTF-8?q?=EB=8A=94=EA=B1=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/book-club/react-query/queries.ts | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/api/book-club/react-query/queries.ts b/src/api/book-club/react-query/queries.ts index f04f4e5f..92f84752 100644 --- a/src/api/book-club/react-query/queries.ts +++ b/src/api/book-club/react-query/queries.ts @@ -6,7 +6,7 @@ import { bookClubMainAPI } from '@/api/book-club/bookClubMainAPI'; export const bookClubs = createQueryKeys('bookClubs', { list: (filters?: BookClubParams) => ({ - queryKey: [{ filters }], + queryKey: [{ filters: filters || {} }], queryFn: () => bookClubMainAPI.getBookClubs(filters), }), @@ -15,12 +15,9 @@ export const bookClubs = createQueryKeys('bookClubs', { queryFn: () => bookClubMainAPI.getBookClubDetail(bookClubId), contextQueries: { reviews: (filters?: ClubDetailReviewFilters) => ({ - queryKey: [{ filters }], + queryKey: [{ filters: filters || {} }], queryFn: () => - bookClubReviewAPI.getReviews({ - bookClubId, - params: filters, - }), + bookClubReviewAPI.getReviews({ bookClubId, params: filters }), }), }, }), @@ -30,15 +27,15 @@ export const bookClubs = createQueryKeys('bookClubs', { queryFn: () => ({}), contextQueries: { joined: (filters?: MyProfileParams) => ({ - queryKey: [{ filters }], + queryKey: [{ filters: filters || {} }], queryFn: () => bookClubMainAPI.myJoined(filters), }), created: (filters?: MyProfileParams) => ({ - queryKey: [{ filters }], + queryKey: [{ filters: filters || {} }], queryFn: () => bookClubMainAPI.myCreated(filters), }), reviews: (filters?: MyProfileParams) => ({ - queryKey: [{ filters }], + queryKey: [{ filters: filters || {} }], queryFn: () => bookClubReviewAPI.myReviews(filters), }), }, @@ -49,15 +46,15 @@ export const bookClubs = createQueryKeys('bookClubs', { queryFn: () => ({}), contextQueries: { joined: (filters?: MyProfileParams) => ({ - queryKey: [{ filters }], + queryKey: [{ filters: filters || {} }], queryFn: () => bookClubMainAPI.userJoined(userId, filters), }), created: (filters?: MyProfileParams) => ({ - queryKey: [{ filters }], + queryKey: [{ filters: filters || {} }], queryFn: () => bookClubMainAPI.userCreated(userId, filters), }), reviews: (filters?: MyProfileParams) => ({ - queryKey: [{ filters }], + queryKey: [{ filters: filters || {} }], queryFn: () => bookClubReviewAPI.userReviews({ userId, params: filters }), }), From f239f9803b0f9da716c9912bbf39572c1468f242 Mon Sep 17 00:00:00 2001 From: cloud0406 Date: Fri, 3 Jan 2025 22:33:26 +0900 Subject: [PATCH 16/21] =?UTF-8?q?=F0=9F=90=9B[Fix]=20=EC=BF=BC=EB=A6=AC?= =?UTF-8?q?=ED=82=A4=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/book-club/bookClubMainAPI.ts | 3 ++- src/features/bookclub/hooks/useFetchBookClubList.ts | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/api/book-club/bookClubMainAPI.ts b/src/api/book-club/bookClubMainAPI.ts index 89d7d640..12ad39cc 100644 --- a/src/api/book-club/bookClubMainAPI.ts +++ b/src/api/book-club/bookClubMainAPI.ts @@ -10,7 +10,8 @@ export const bookClubMainAPI = { //북클럽 목록 조회 getBookClubs: async (params?: BookClubParams) => { - return await apiClient.get('/book-clubs', { params }); + const response = await apiClient.get('/book-clubs', { params }); + return response.data; }, //단일 북클럽 조회 diff --git a/src/features/bookclub/hooks/useFetchBookClubList.ts b/src/features/bookclub/hooks/useFetchBookClubList.ts index 1f150f5d..974374af 100644 --- a/src/features/bookclub/hooks/useFetchBookClubList.ts +++ b/src/features/bookclub/hooks/useFetchBookClubList.ts @@ -17,10 +17,10 @@ const useBookClubList = () => { }); const { data, isLoading, error } = useQuery({ - ...bookClubs.all(filters), + ...bookClubs.list(filters), }); - const clubInfo = data?.data.bookClubs; + const clubInfo = data?.bookClubs; // TODO: param 추가시, useEffect 대신 clubInfo 직접 사용 useEffect(() => { From 7a7aacec75d50e433eeebdfd14d2539cd2043c44 Mon Sep 17 00:00:00 2001 From: cloud0406 Date: Fri, 3 Jan 2025 22:42:58 +0900 Subject: [PATCH 17/21] =?UTF-8?q?=F0=9F=90=9B[Fix]=20=EB=B6=81=ED=81=B4?= =?UTF-8?q?=EB=9F=BD=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=2012=EB=AA=85=EC=9D=B4?= =?UTF-8?q?=EC=83=81=20=ED=95=84=ED=84=B0=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/utils/filterUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/utils/filterUtils.ts b/src/lib/utils/filterUtils.ts index 6e459676..593eacba 100644 --- a/src/lib/utils/filterUtils.ts +++ b/src/lib/utils/filterUtils.ts @@ -8,7 +8,7 @@ export const getMemberLimit = (selectedValue: string | undefined) => { return { min: 6, max: 8 }; case 'NINE_ELEVEN': return { min: 9, max: 11 }; - case 'TWELVE': + case 'OVER_TWELVE': return { min: 12, max: 20 }; default: return { min: 3, max: 20 }; From 38f91ad936e88fcfebf148773ed62735c21636c8 Mon Sep 17 00:00:00 2001 From: cloud0406 Date: Fri, 3 Jan 2025 22:46:05 +0900 Subject: [PATCH 18/21] =?UTF-8?q?=F0=9F=92=84[Design]=20=EC=84=B8=EB=A1=9C?= =?UTF-8?q?=20=EB=A0=88=EC=9D=B4=EC=95=84=EC=9B=83=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/bookclub/components/ClubListSection.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/features/bookclub/components/ClubListSection.tsx b/src/features/bookclub/components/ClubListSection.tsx index 9c7a6ee9..4ea72db9 100644 --- a/src/features/bookclub/components/ClubListSection.tsx +++ b/src/features/bookclub/components/ClubListSection.tsx @@ -25,7 +25,7 @@ function ClubListSection({ bookClubs = [] }: ClubListSectionProps) { }; return ( -
+
{bookClubs?.length > 0 ? ( bookClubs.map((club) => ( Date: Fri, 3 Jan 2025 22:48:12 +0900 Subject: [PATCH 19/21] =?UTF-8?q?=E2=99=BB=EF=B8=8F[Refactor]=20=ED=86=A0?= =?UTF-8?q?=ED=81=B0=20=EC=9C=A0=ED=9A=A8=EC=8B=9C=EA=B0=84=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/middleware.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/middleware.ts b/src/middleware.ts index d311625c..b56b78fc 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -15,7 +15,7 @@ export async function middleware(request: NextRequest) { const data = await refreshAccessToken(refreshToken.value); const nextResponse = NextResponse.next(); nextResponse.cookies.set('auth_token', data.accessToken, { - maxAge: 60 * 15, + maxAge: 60 * 60, }); return nextResponse; } catch (error) { From 8f5d2d226faebe616b5e4c17bdcaa92d45951b49 Mon Sep 17 00:00:00 2001 From: cloud0406 Date: Fri, 3 Jan 2025 22:56:31 +0900 Subject: [PATCH 20/21] =?UTF-8?q?=E2=99=BB=EF=B8=8F[Refactor]=20=EC=B0=B8?= =?UTF-8?q?=EC=97=AC=20=EC=B7=A8=EC=86=8C=EC=8B=9C=20=EC=A0=84=EC=B2=B4=20?= =?UTF-8?q?=EB=AC=B4=ED=9A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/book-club/react-query/customHooks.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/api/book-club/react-query/customHooks.ts b/src/api/book-club/react-query/customHooks.ts index db6cd170..79273e4f 100644 --- a/src/api/book-club/react-query/customHooks.ts +++ b/src/api/book-club/react-query/customHooks.ts @@ -55,12 +55,9 @@ export function useLeaveBookClub() { const queryClient = useQueryClient(); return useMutation({ mutationFn: (id: number) => bookClubMemberAPI.leave(id), - onSuccess: (_, id) => { - queryClient.invalidateQueries({ - queryKey: bookClubs.detail(id).queryKey, - }); + onSuccess: () => { queryClient.invalidateQueries({ - queryKey: bookClubs.my()._ctx.joined().queryKey, + queryKey: bookClubs._def, }); }, }); From 3f6de5655649a4d849894c8d24299c807eec0a18 Mon Sep 17 00:00:00 2001 From: cloud0406 Date: Fri, 3 Jan 2025 22:58:00 +0900 Subject: [PATCH 21/21] =?UTF-8?q?=E2=99=BB=EF=B8=8F[Refactor]=20=EC=B0=B8?= =?UTF-8?q?=EC=97=AC=EC=8B=9C=20=EB=B6=81=ED=81=B4=EB=9F=BD=20=EC=BF=BC?= =?UTF-8?q?=EB=A6=AC=20=EB=AC=B4=ED=9A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/book-club/react-query/customHooks.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/api/book-club/react-query/customHooks.ts b/src/api/book-club/react-query/customHooks.ts index 79273e4f..b3d66f67 100644 --- a/src/api/book-club/react-query/customHooks.ts +++ b/src/api/book-club/react-query/customHooks.ts @@ -39,12 +39,9 @@ export function useJoinBookClub() { return useMutation, number>({ mutationFn: (id: number) => bookClubMemberAPI.join(id), - onSuccess: (_, id) => { - queryClient.invalidateQueries({ - queryKey: bookClubs.detail(id).queryKey, - }); + onSuccess: () => { queryClient.invalidateQueries({ - queryKey: bookClubs.my()._ctx.joined().queryKey, + queryKey: bookClubs._def, }); }, });