diff --git a/src/constants/mypage/mypageConstant.tsx b/src/constants/mypage/mypageConstant.tsx
index 01e6dd3..b1a2a7c 100644
--- a/src/constants/mypage/mypageConstant.tsx
+++ b/src/constants/mypage/mypageConstant.tsx
@@ -100,3 +100,29 @@ export const LOCATION_OPTIONS = [
{ value: '제주', label: '제주' },
{ value: '선택 안함', label: '선택 안함' },
];
+
+export const MY_MEETING_TAB_LIST = [
+ {
+ label: '내가 만든 모임',
+ value: 'created',
+ url: '/my-meeting/my',
+ },
+ {
+ label: '내가 참여하고 있는 모임',
+ value: 'joined',
+ url: '/my-meeting/my',
+ },
+];
+
+export const MY_COMMENT_TAB_LIST = [
+ {
+ label: '리뷰 작성 가능한 모임',
+ value: 'writable',
+ url: '/my-meeting/comments',
+ },
+ {
+ label: '작성한 리뷰',
+ value: 'written',
+ url: '/my-meeting/comments',
+ },
+];
diff --git a/src/hooks/queries/useMyCommentQueries.ts b/src/hooks/queries/useMyCommentQueries.ts
new file mode 100644
index 0000000..891a4a8
--- /dev/null
+++ b/src/hooks/queries/useMyCommentQueries.ts
@@ -0,0 +1,32 @@
+import { useInfiniteQuery } from '@tanstack/react-query';
+import {
+ getMyMeetingsWritableComments,
+ getMyWrittenComments,
+} from 'service/api/mycomments';
+
+export const MY_COMMENT_KEY = {
+ writable: ['mycomments', 'writable'] as const,
+ written: ['mycomments', 'written'] as const,
+};
+
+export const useInfiniteWrittenMyCommentQueries = () => {
+ return useInfiniteQuery({
+ queryKey: MY_COMMENT_KEY.written,
+ queryFn: ({ pageParam }) => getMyWrittenComments(pageParam),
+ initialPageParam: 0,
+ getNextPageParam: (lastPage) => {
+ return lastPage.nextCursor ?? null;
+ },
+ });
+};
+
+export const useInfiniteWritableMyMeetingsQueries = () => {
+ return useInfiniteQuery({
+ queryKey: MY_COMMENT_KEY.writable,
+ queryFn: ({ pageParam }) => getMyMeetingsWritableComments(pageParam),
+ initialPageParam: 0,
+ getNextPageParam: (lastPage) => {
+ return lastPage.nextCursor ?? null;
+ },
+ });
+};
diff --git a/src/middleware.ts b/src/middleware.ts
index 801e696..177213e 100644
--- a/src/middleware.ts
+++ b/src/middleware.ts
@@ -11,6 +11,14 @@ export async function middleware(request: NextRequest) {
return NextResponse.redirect(new URL('/login', request.url));
}
+ const { pathname, searchParams } = request.nextUrl;
+
+ // /my-meeting/comments' 경로에서 type 쿼리 파라미터가 없으면 writable로 세팅
+ if (pathname === '/my-meeting/comments' && !searchParams.has('type')) {
+ searchParams.set('type', 'writable');
+ return NextResponse.redirect(request.nextUrl);
+ }
+
// 인증된 사용자는 요청을 계속 진행
return NextResponse.next();
}
diff --git a/src/service/api/comment.ts b/src/service/api/comment.ts
index 5375bd7..e8e1888 100644
--- a/src/service/api/comment.ts
+++ b/src/service/api/comment.ts
@@ -14,8 +14,8 @@ export interface Comment {
content: string;
createdAt: string;
meetingId: number;
- userName: string;
- profilePic: string;
+ userName?: string;
+ profilePic?: string;
}
export interface Comments {
diff --git a/src/service/api/endpoints.ts b/src/service/api/endpoints.ts
index cf38d52..6f876d6 100644
--- a/src/service/api/endpoints.ts
+++ b/src/service/api/endpoints.ts
@@ -14,6 +14,7 @@ export const mypageURL = {
contact: `${CURRENT_API_VERSION}/mypage/contact`,
skills: `${CURRENT_API_VERSION}/mypage/skills`,
comments: `${CURRENT_API_VERSION}/mypage/comments`,
+ mettingComments: `${CURRENT_API_VERSION}/mypage/meeting-comment`,
banner: `${CURRENT_API_VERSION}/mypage/banner`,
};
diff --git a/src/service/api/meeting.ts b/src/service/api/meeting.ts
index eb38ff8..8d2d12f 100644
--- a/src/service/api/meeting.ts
+++ b/src/service/api/meeting.ts
@@ -26,7 +26,6 @@ const getMeetings = async (
searchQueryObj: IMeetingSearchCondition,
): Promise
> => {
const newSearchQueryObj = { ...searchQueryObj, lastMeetingId: pageParams };
- const token = await getAccessToken();
const res = await axiosInstance.post(
`/api/v1/meetings/search?categoryTitle=${category}`,
diff --git a/src/service/api/mycomments.ts b/src/service/api/mycomments.ts
new file mode 100644
index 0000000..e07d25b
--- /dev/null
+++ b/src/service/api/mycomments.ts
@@ -0,0 +1,27 @@
+import axiosInstance from '@/lib/axios/axiosInstance';
+import { Paginated } from 'types/meeting';
+import { MyComment } from 'types/myComment';
+
+import { mypageURL } from './endpoints';
+
+const getMyWrittenComments = async (
+ lastCommentId: number,
+): Promise> => {
+ const res = await axiosInstance.get(
+ `${mypageURL.comments}?lastCommentId=${lastCommentId}&size=${3}`,
+ );
+
+ return res.data.data;
+};
+
+const getMyMeetingsWritableComments = async (
+ lastCommentId: number,
+): Promise> => {
+ const res = await axiosInstance.get(
+ `${mypageURL.mettingComments}?lastMeetingId=${lastCommentId}&size=${3}`,
+ );
+
+ return res.data.data;
+};
+
+export { getMyWrittenComments, getMyMeetingsWritableComments };
diff --git a/src/types/myComment.ts b/src/types/myComment.ts
new file mode 100644
index 0000000..c0f3584
--- /dev/null
+++ b/src/types/myComment.ts
@@ -0,0 +1,12 @@
+import type { Comment } from '../service/api/comment';
+
+interface MyComment extends Comment {
+ meetingTitle: string;
+ thumbnail: string;
+ location: string;
+ memberCount: number;
+ maxMember: number;
+ categoryTitle: string;
+}
+
+export type { MyComment };