Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
b243353
✨[Feat] 로그인시 쿼리 무효화
cloud0406 Jan 3, 2025
71e188b
♻️[Refactor] 쿼리키 팩토리 분리
cloud0406 Jan 3, 2025
5655c8a
♻️[Refactor] My, user 쿼리키 묶기
cloud0406 Jan 3, 2025
d31285e
♻️[Refactor] refetchonMount true로 변경
cloud0406 Jan 3, 2025
1fd6340
♻️[Refactor] 쿼리키 구조 변경
cloud0406 Jan 3, 2025
3de2d18
♻️[Refactor] 내 모임 조회 쿼리키 변경된 이름 적용
cloud0406 Jan 3, 2025
ca0c5bf
♻️[Refactor] 상세 페이지 쿼리키 변경 적용
cloud0406 Jan 3, 2025
e5de376
♻️[Refactor] 리스트 조회 api 리팩
cloud0406 Jan 3, 2025
e388538
♻️[Refactor] 내 모임들 쿼리키 변경
cloud0406 Jan 3, 2025
c31e383
♻️[Refactor] 내 리뷰 리팩토링
cloud0406 Jan 3, 2025
c831d1c
♻️[Refactor] 유저 모임 쿼리키 변경
cloud0406 Jan 3, 2025
877f5ec
♻️[Refactor] 유저 리뷰 쿼리키 변경
cloud0406 Jan 3, 2025
b61fd7c
♻️[Refactor] 상세 조회 쿼리키 변경
cloud0406 Jan 3, 2025
56bde7d
🐛[Fix] 디테일 조회 수정
cloud0406 Jan 3, 2025
ae2960c
🐛[Fix] 쿼리키 무효화안되는거 수정
cloud0406 Jan 3, 2025
7f3cb5d
Merge branch 'develop' into 269-feature-로그인시-캐시-삭제
cloud0406 Jan 3, 2025
f239f98
🐛[Fix] 쿼리키 이름 변경
cloud0406 Jan 3, 2025
7a7aace
🐛[Fix] 북클럽 리스트 12명이상 필터 적용
cloud0406 Jan 3, 2025
38f91ad
💄[Design] 세로 레이아웃 수정
cloud0406 Jan 3, 2025
4ba84dc
♻️[Refactor] 토큰 유효시간 변경
cloud0406 Jan 3, 2025
8f5d2d2
♻️[Refactor] 참여 취소시 전체 무효
cloud0406 Jan 3, 2025
3f6de56
♻️[Refactor] 참여시 북클럽 쿼리 무효
cloud0406 Jan 3, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 27 additions & 2 deletions src/api/book-club/bookClubMainAPI.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import apiClient from '@/lib/utils/apiClient';
import { BookClubParams } from '@/types/bookclubs';
import { BookClubParams, MyProfileParams } from '@/types/bookclubs';

export const bookClubMainAPI = {
//북클럽 삭제
Expand All @@ -10,18 +10,43 @@ 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;
},

//단일 북클럽 조회
getBookClubDetail: async (bookClubId: number) => {
const response = await apiClient.get(`/book-clubs/${bookClubId}`);
return response.data;
},

//유저가 참가한 북클럽 조회
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) => {
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) => {
Expand Down
30 changes: 28 additions & 2 deletions src/api/book-club/bookClubReviewAPI.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,47 @@
import apiClient from '@/lib/utils/apiClient';
import { WriteReviewParams, DetailClubReviewParams } from './types';
import { MyProfileParams } from '@/types/bookclubs';

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,
});
},

//특정 유저의 리뷰 조회
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', {
params,
});
return response.data;
},

//리뷰 작성하기
write: async ({ bookClubId, rating, content }: WriteReviewParams) => {
Expand Down
32 changes: 12 additions & 20 deletions src/api/book-club/react-query/customHooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand All @@ -41,12 +39,9 @@ export function useJoinBookClub() {

return useMutation<void, AxiosError<{ message: string }>, number>({
mutationFn: (id: number) => bookClubMemberAPI.join(id),
onSuccess: (_, id) => {
queryClient.invalidateQueries({
queryKey: bookClubs.detail(id).queryKey,
});
onSuccess: () => {
queryClient.invalidateQueries({
queryKey: bookClubs.myJoined().queryKey,
queryKey: bookClubs._def,
});
},
});
Expand All @@ -57,12 +52,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.myJoined().queryKey,
queryKey: bookClubs._def,
});
},
});
Expand All @@ -84,7 +76,7 @@ export function useWriteReview() {
});

queryClient.invalidateQueries({
queryKey: bookClubs.myReviews().queryKey,
queryKey: bookClubs.my()._ctx.reviews().queryKey,
});
showToast({ message: '리뷰 작성을 완료하였습니다', type: 'success' });
},
Expand All @@ -103,10 +95,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,
});
},
});
Expand All @@ -119,7 +111,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,
Expand All @@ -135,7 +127,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,
Expand Down
125 changes: 36 additions & 89 deletions src/api/book-club/react-query/queries.ts
Original file line number Diff line number Diff line change
@@ -1,116 +1,63 @@
import { createQueryKeys } from '@lukemorales/query-key-factory';
import apiClient from '@/lib/utils/apiClient';
import { BookClubParams, MyProfileParams } from '@/types/bookclubs';

import { ClubDetailReviewFilters } from '@/types/review';
// TODO: 추후 각자 구현하는 api 명세에 맞게 filter 타입 정의해주세요
import { bookClubReviewAPI } from '@/api/book-club/bookClubReviewAPI';
import { bookClubMainAPI } from '@/api/book-club/bookClubMainAPI';

export const bookClubs = createQueryKeys('bookClubs', {
all: (filters?: BookClubParams) => ({
list: (filters?: BookClubParams) => ({
queryKey: [{ filters: filters || {} }],
queryFn: (ctx) =>
apiClient.get('/book-clubs', {
params: {
...filters,
page: ctx.pageParam ?? 1,
size: 10,
},
}),
queryFn: () => bookClubMainAPI.getBookClubs(filters),
}),

detail: (bookClubId: number) => ({
queryKey: [bookClubId],
queryFn: () => apiClient.get(`/book-clubs/${bookClubId}`),
queryFn: () => bookClubMainAPI.getBookClubDetail(bookClubId),
contextQueries: {
reviews: (filters?: ClubDetailReviewFilters) => ({
queryKey: [{ filters: filters || {} }],
queryFn: (ctx) =>
apiClient.get(`/book-clubs/${bookClubId}/reviews`, {
params: {
...filters,
page: ctx.pageParam ?? 1,
size: 10,
},
}),
queryFn: () =>
bookClubReviewAPI.getReviews({ bookClubId, params: filters }),
}),
},
}),

//유저가 참여한 북클럽 조회
userJoined: (userId: number, filters?: MyProfileParams) => ({
queryKey: [userId, { filter: filters || {} }],
queryFn: (ctx) =>
apiClient.get(`/book-clubs/user/${userId}/joined`, {
params: {
...filters,
page: ctx.pageParam ?? 1,
size: 10,
},
my: () => ({
queryKey: [{}],
queryFn: () => ({}),
contextQueries: {
joined: (filters?: MyProfileParams) => ({
queryKey: [{ filters: filters || {} }],
queryFn: () => bookClubMainAPI.myJoined(filters),
}),
}),

//유저가 만든 북클럽 조회
userCreated: (userId: number, filters?: MyProfileParams) => ({
queryKey: [userId, { filter: 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: () => bookClubMainAPI.myCreated(filters),
}),
}),

//유저가 작성한 리뷰 조회
userReviewd: (userId: number, filters?: MyProfileParams) => ({
queryKey: [userId, { filter: 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: () => bookClubReviewAPI.myReviews(filters),
}),
},
}),

//내가 참여한 북클럽 조회
myJoined: (filters?: MyProfileParams) => ({
queryKey: [{ filters: filters || {} }],
queryFn: (ctx) =>
apiClient.get('/book-clubs/my-joined', {
params: {
...filters,
page: ctx.pageParam ?? 1,
size: 10,
},
user: (userId: number) => ({
queryKey: [userId],
queryFn: () => ({}),
contextQueries: {
joined: (filters?: MyProfileParams) => ({
queryKey: [{ filters: filters || {} }],
queryFn: () => bookClubMainAPI.userJoined(userId, filters),
}),
}),

//내가 만든 북클럽 조회
myCreated: (filters?: MyProfileParams) => ({
queryKey: [{ 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: () => bookClubMainAPI.userCreated(userId, filters),
}),
}),

//내가 작성한 리뷰 조회
myReviews: (filters?: MyProfileParams) => ({
queryKey: [{ 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: () =>
bookClubReviewAPI.userReviews({ userId, params: filters }),
}),
},
}),
});
2 changes: 1 addition & 1 deletion src/api/book-club/types.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
export interface DetailClubReviewParams {
bookClubId: number;
// bookClubId: number;
order?: 'DESC' | 'RATE_DESC' | 'RATE_ASC';
size?: number;
page?: number;
Expand Down
5 changes: 5 additions & 0 deletions src/features/auth/api/auth.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
'use client';

import apiClient from '@/lib/utils/apiClient';
import { LoginFormData } from '../types/loginFormSchema';
import { useAuthStore } from '@/store/authStore';
Expand All @@ -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 {
Expand All @@ -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();
Expand Down
2 changes: 1 addition & 1 deletion src/features/bookclub/components/ClubListSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ function ClubListSection({ bookClubs = [] }: ClubListSectionProps) {
};

return (
<main className="flex w-full min-w-[336px] flex-1 flex-col items-center gap-y-[26px] bg-gray-light-01 px-[20px] pt-[18px] sm:justify-between md:px-[24px] lg:px-[102px]">
<main className="flex w-full min-w-[336px] flex-1 flex-col items-center gap-y-[26px] bg-gray-light-01 px-[20px] pt-[18px] md:px-[24px] lg:px-[102px]">
{bookClubs?.length > 0 ? (
bookClubs.map((club) => (
<Card
Expand Down
4 changes: 2 additions & 2 deletions src/features/bookclub/hooks/useFetchBookClubList.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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(() => {
Expand Down
Loading
Loading