diff --git a/src/app/api/sprint/sprintApi.js b/src/app/api/sprint/sprintApi.js index 52b761c..2cfa701 100644 --- a/src/app/api/sprint/sprintApi.js +++ b/src/app/api/sprint/sprintApi.js @@ -98,3 +98,22 @@ export const fetchSprintIdTitle = async (projectId) => { throw new Error(message); } }; + +// 스프린트별 참여자 목록 & 피드백 여부 조회 +export const fetchSprintParticipantsFeedback = async (projectId, sprintId) => { + try { + const res = await axiosWithAuthorization.get(`/feedbacks/${sprintId}/participants`, { + params: { + projectId: projectId, + lastProjectParticipantId: null, + size: 10 + } + }); + console.log("스프린트별 참여자 목록 & 피드백 여부 조회:", res.data); + return res.data.data; + } catch (error) { + const message = error?.response?.data?.data?.message ?? "스프린트별 참여자 목록 & 피드백 여부를 조회할 수 없습니다."; + throw new Error(message); + } +}; + diff --git a/src/app/project/project.js b/src/app/project/project.js index f6cc51f..264a91b 100644 --- a/src/app/project/project.js +++ b/src/app/project/project.js @@ -17,7 +17,7 @@ import MeetingModal from "./meeting_modal"; import ProjectModal from "../team/project_modal"; import { fetchProjectData, fetchProjectUser, fetchProjectMemberList, fetchSprintContributions } from "@/app/api/project/projectApi"; -import { fetchSprintTaskData } from "@/app/api/sprint/sprintApi"; +import { fetchSprintTaskData, fetchSprintParticipantsFeedback } from "@/app/api/sprint/sprintApi"; import Image from "next/image"; @@ -60,6 +60,9 @@ export default function Project({projectId}) { // 스프린트별 기여도 랭킹 조회 const [sprintContributions, setSprintContributions] = useState({}); + // 동료평가 상태 + const [feedbackStatusMap, setFeedbackStatusMap] = useState({}); + //meeting const [hasMoreMeetings, setHasMoreMeetings] = useState(false); const [lastMeetingtId, setLastMeetingId] = useState(null); @@ -463,6 +466,27 @@ export default function Project({projectId}) { return null; // 또는 로딩 UI를 보여줄 수도 있음 } + useEffect(() => { + const fetchFeedbackStatuses = async () => { + if (!currentSprint?.sprint_id) return; + try { + const feedbackData = await fetchSprintParticipantsFeedback(ProjectId, currentSprint.sprint_id); + + const map = {}; + feedbackData.content.forEach((participant) => { + map[participant.projectParticipantId] = participant.feedbackStatus; + }); + + setFeedbackStatusMap(map); + } catch (err) { + showAlert("error", err.message); + console.log(err.message); + } + }; + + fetchFeedbackStatuses(); + }, [currentSprint?.sprint_id]); + const fetchMeetingList = async (sprintId, lastId = null) => { try { @@ -559,7 +583,6 @@ export default function Project({projectId}) { const reduceMemberName = (name) => { return name.length > 4 ? name.slice(0, 4) + ".." : name; }; - return ( <> @@ -747,7 +770,10 @@ currentSprint?.sprint_end === today && isExternalUser === true && ( }} > {projectUser.errorClassName !== "PROJECT_PARTICIPATION_REQUIRED" && ( -