From 92f7567766d739ac28966bf711dce33dda79c3a8 Mon Sep 17 00:00:00 2001 From: Jeong Ha Seung <88266129+HA-SEUNG-JEONG@users.noreply.github.com> Date: Mon, 9 Feb 2026 11:12:11 +0900 Subject: [PATCH 1/5] =?UTF-8?q?fix=20:=20=EA=B3=BC=EC=A0=9C=20=EC=A0=9C?= =?UTF-8?q?=EC=B6=9C/=ED=94=BC=EC=96=B4=EB=A6=AC=EB=B7=B0=20=EB=A6=AC?= =?UTF-8?q?=EB=8D=94-=EC=B0=B8=EA=B0=80=EC=9E=90=20=EC=83=81=ED=98=B8=20?= =?UTF-8?q?=EA=B0=80=EB=8A=A5=ED=95=98=EA=B2=8C=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?=EB=B0=8F=20=EB=A6=AC=EB=8D=94=20=ED=8F=89=EA=B0=80=20UI=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 과제 제출: 리더/참가자 모두 가능하도록 !isLeader guard 제거 - 피어 리뷰: 리더/참가자 모두 작성 가능 (자기 과제 제외 guard 유지) - 리더 평가 UI 전체 제거 (LeaderEvaluationSection, CreateEvaluationModal 참조 삭제) - MissionDetailContent에서 불필요한 groupStudyId prop 제거 Co-Authored-By: Claude Opus 4.6 --- .../contents/homework-detail-content.tsx | 84 +------------------ src/components/section/mission-section.tsx | 5 +- 2 files changed, 4 insertions(+), 85 deletions(-) diff --git a/src/components/contents/homework-detail-content.tsx b/src/components/contents/homework-detail-content.tsx index 85cb1b43..7ffb2e9b 100644 --- a/src/components/contents/homework-detail-content.tsx +++ b/src/components/contents/homework-detail-content.tsx @@ -3,10 +3,7 @@ import { useRouter, useSearchParams } from 'next/navigation'; import { useState } from 'react'; -import type { - EvaluationResponse, - PeerReviewResponse, -} from '@/api/openapi/models'; +import type { PeerReviewResponse } from '@/api/openapi/models'; import Avatar from '@/components/ui/avatar'; import Button from '@/components/ui/button'; import MoreMenu from '@/components/ui/dropdown/more-menu'; @@ -18,9 +15,7 @@ import { useDeletePeerReview, useUpdatePeerReview, } from '@/hooks/queries/peer-review-api'; -import { useIsLeader } from '@/stores/useLeaderStore'; import { useUserStore } from '@/stores/useUserStore'; -import CreateEvaluationModal from '../modals/create-evaluation-modal'; import DeleteHomeworkModal from '../modals/delete-homework-modal'; import EditHomeworkModal from '../modals/edit-homework-modal'; @@ -37,7 +32,6 @@ export default function HomeworkDetailContent({ const router = useRouter(); const searchParams = useSearchParams(); const currentUserId = useUserStore((state) => state.memberId); - const isLeader = useIsLeader(currentUserId); const { data: homework, isLoading: isHomeworkLoading } = useGetHomework(homeworkId); const { @@ -137,100 +131,28 @@ export default function HomeworkDetailContent({ )} - {/* 리더 평가 */} - - {/* 피어 리뷰 */} ); } -interface LeaderEvaluationSectionProps { - evaluation?: EvaluationResponse; - isLeader: boolean; - homeworkId: number; -} - -function LeaderEvaluationSection({ - evaluation, - isLeader, - homeworkId, -}: LeaderEvaluationSectionProps) { - return ( -
- 리더 평가 - -
- {evaluation ? ( - - ) : ( - - )} -
-
- ); -} - -function EvaluationResult({ evaluation }: { evaluation: EvaluationResponse }) { - return ( -
-
- 평가 등급 - - {evaluation.grade?.gradeLabel ?? '-'} - -
-
- 평가 코멘트 -

- {evaluation.comment} -

-
-
- ); -} - -function EvaluationPending({ - isLeader, - homeworkId, -}: { - isLeader: boolean; - homeworkId: number; -}) { - return ( - <> - - 아직 평가하지 않은 과제입니다. - - {isLeader && } - - ); -} - interface PeerReviewSectionProps { homeworkId: number; peerReviews: PeerReviewResponse[]; - isLeader: boolean; isMyHomework: boolean; } function PeerReviewSection({ homeworkId, peerReviews, - isLeader, isMyHomework, }: PeerReviewSectionProps) { - const canWriteReview = !isLeader && !isMyHomework; + const canWriteReview = !isMyHomework; const [reviewText, setReviewText] = useState(''); const { mutate: createPeerReview, isPending } = useCreatePeerReview(); @@ -273,7 +195,7 @@ function PeerReviewSection({ )} - {/* 리뷰 입력 - 리더가 아니고 자기 과제가 아닌 경우에만 표시 */} + {/* 리뷰 입력 - 자기 과제가 아닌 경우에만 표시 */} {canWriteReview && ( - + ); } From 45a16c3dde8eec94e705f272c95247f84aafdae6 Mon Sep 17 00:00:00 2001 From: Jeong Ha Seung <88266129+HA-SEUNG-JEONG@users.noreply.github.com> Date: Mon, 9 Feb 2026 11:12:21 +0900 Subject: [PATCH 2/5] =?UTF-8?q?refactor=20:=20MyHomeworkStatusCard=20props?= =?UTF-8?q?=205=EA=B0=9C=20=E2=86=92=201=EA=B0=9C(missionId)=EB=A1=9C=20?= =?UTF-8?q?=EC=B6=95=EC=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MyHomeworkStatusCard에서 useGetMission, useUserStore, useRouter로 데이터 자체 조달 - TanStack Query 캐시 공유를 활용하여 네트워크 요청 중복 없이 동작 - useSubmitHomework onSuccess에 mission 캐시 invalidation 추가 (onRefetch prop 대체) - MissionDetailContent에서 myHomework useMemo, isMissionClosed 등 제거 Co-Authored-By: Claude Opus 4.6 --- .../card/my-homework-status-card.tsx | 42 +++++++++++++------ .../contents/mission-detail-content.tsx | 30 ++----------- src/hooks/queries/group-study-homework-api.ts | 5 ++- 3 files changed, 37 insertions(+), 40 deletions(-) diff --git a/src/components/card/my-homework-status-card.tsx b/src/components/card/my-homework-status-card.tsx index c2b7d4bd..6b8f70f4 100644 --- a/src/components/card/my-homework-status-card.tsx +++ b/src/components/card/my-homework-status-card.tsx @@ -1,24 +1,40 @@ 'use client'; -import type { HomeworkDetailResponseDto } from '@/api/openapi/models'; +import { useRouter, useSearchParams } from 'next/navigation'; +import { useMemo } from 'react'; + import Button from '@/components/ui/button'; +import { useGetMission } from '@/hooks/queries/mission-api'; +import { useUserStore } from '@/stores/useUserStore'; import SubmitHomeworkModal from '../modals/submit-homework-modal'; interface MyHomeworkStatusProps { missionId: number; - myHomework?: HomeworkDetailResponseDto; - isMissionClosed?: boolean; - onSelectHomework: (homeworkId: number) => void; - onRefetch?: () => void; } export default function MyHomeworkStatusCard({ missionId, - myHomework, - isMissionClosed = false, - onSelectHomework, - onRefetch, }: MyHomeworkStatusProps) { + const router = useRouter(); + const searchParams = useSearchParams(); + const memberId = useUserStore((state) => state.memberId); + + const { data: mission } = useGetMission(missionId); + + const myHomework = useMemo(() => { + if (!mission?.homeworks || !memberId) return null; + + return mission.homeworks.find((hw) => hw.submitterId === memberId) ?? null; + }, [mission?.homeworks, memberId]); + + const isMissionClosed = mission?.status === 'ENDED'; + + const handleSelectHomework = (homeworkId: number) => { + const params = new URLSearchParams(searchParams.toString()); + params.set('homeworkId', String(homeworkId)); + router.push(`?${params.toString()}`); + }; + // 미제출 상태 if (!myHomework || myHomework.homeworkStatus === 'NOT_SUBMITTED') { return ( @@ -30,7 +46,7 @@ export default function MyHomeworkStatusCard({ 아직 과제를 제출하지 않았습니다. - + ); @@ -55,7 +71,8 @@ export default function MyHomeworkStatusCard({ color="outlined" className="mt-100" onClick={() => - myHomework.homeworkId && onSelectHomework(myHomework.homeworkId) + myHomework.homeworkId && + handleSelectHomework(myHomework.homeworkId) } > 과제 상세 보기 @@ -105,7 +122,8 @@ export default function MyHomeworkStatusCard({