diff --git a/src/app/home/home.js b/src/app/home/home.js
index 68457f8..6fc0bce 100644
--- a/src/app/home/home.js
+++ b/src/app/home/home.js
@@ -81,8 +81,11 @@ export default function Home() {
setHasMore(false);
} else {
// 기존 목록 + 새로 가져온 목록
- setCards((prev) => [...prev, ...newContent]);
-
+ setCards((prev) => {
+ const existingIds = new Set(prev.map((team) => team.teamId));
+ const uniqueNewContent = newContent.filter((team) => !existingIds.has(team.teamId));
+ return [...prev, ...uniqueNewContent];
+ });
// 마지막 아이템의 teamId를 nextLastId로
const nextLastId = newContent[newContent.length - 1].teamId;
setLastTeamId(nextLastId);
diff --git a/src/app/mypage/approve_modal.js b/src/app/mypage/approve_modal.js
index 9c52b16..cb13142 100644
--- a/src/app/mypage/approve_modal.js
+++ b/src/app/mypage/approve_modal.js
@@ -75,12 +75,6 @@ const RejectButton = styled.button`
cursor: pointer;
`;
-
-// <--------------------여기부터 더미데이터 ------------------------>
-
-
-
-// <--------------------여기까지 더미데이터 ------------------------>
export default function ApproveModal({ isOpen, onClose, projectId }) {
const [projectInfo, setProjectInfo] = useState(null);
const [requestList, setRequestList] = useState([]);
@@ -166,7 +160,11 @@ export default function ApproveModal({ isOpen, onClose, projectId }) {
setHasMore(false);
} else {
//기존 목록 + 새로 가져온 목록
- setRequestList((prev) => [...prev, ...newContent]);
+ setRequestList((prev) => {
+ const existingIds = new Set(prev.map((r) => r.registrationId));
+ const uniqueNew = newContent.filter((r) => !existingIds.has(r.registrationId));
+ return [...prev, ...uniqueNew];
+ });
const nextLastId = newContent[newContent.length - 1].registrationId;
setLastTeamId(nextLastId);
diff --git a/src/app/mypage/leader_modal.js b/src/app/mypage/leader_modal.js
index b762f12..bc06b25 100644
--- a/src/app/mypage/leader_modal.js
+++ b/src/app/mypage/leader_modal.js
@@ -121,7 +121,11 @@ export default function LeaderModal({ isOpen, onClose, projectId, currentMemberI
// 응답 구조: { data: { content: [...], last: true/false, ... } }
const newParticipants = res.data.data.content || [];
// 기존 목록에 합치기
- setParticipants((prev) => [...prev, ...newParticipants]);
+ setParticipants((prev) => {
+ const existingIds = new Set(prev.map((p) => p.projectParticipantId));
+ const uniqueNew = newParticipants.filter((p) => !existingIds.has(p.projectParticipantId));
+ return [...prev, ...uniqueNew];
+ });
if (newParticipants.length > 0) {
const nextLastId = newParticipants[newParticipants.length - 1].projectParticipantId;
setLastParticipantId(nextLastId);
diff --git a/src/app/task/task.js b/src/app/task/task.js
index 462a719..18068cc 100644
--- a/src/app/task/task.js
+++ b/src/app/task/task.js
@@ -59,8 +59,13 @@ export default function Task({ projectId }) {
if (content.length === 0) {
setHasMore(false);
} else {
- setTasks((prev) => [...prev, ...content]);
- setLastTaskId(content[content.length - 1].taskId);
+ setTasks((prev) => {
+ const existingIds = new Set(prev.map((t) => t.taskId));
+ const uniqueNew = content.filter((t) => !existingIds.has(t.taskId));
+ return [...prev, ...uniqueNew];
+ });
+
+ setLastTaskId(content[content.length - 1].taskId);
}
if (data.last || content.length < TASK_PAGE_SIZE) {
@@ -258,6 +263,11 @@ export default function Task({ projectId }) {
)}
+ {isCompleted && (
+
+ {task.dueDt}
+
+ )}
{isNotStarted && (
{
diff --git a/src/app/task/task_s.js b/src/app/task/task_s.js
index 6f63866..ed3e0e2 100644
--- a/src/app/task/task_s.js
+++ b/src/app/task/task_s.js
@@ -286,5 +286,13 @@ export const SButton = styled.button`
}
`;
+export const CompletedDate = styled.p`
+ font-size: 13px;
+ color: #666;
+ text-align: right;
+ margin-right: 10px;
+ margin-top: 4px;
+`;
+
diff --git a/src/app/team/team.js b/src/app/team/team.js
index d9e2e8d..efa5fea 100644
--- a/src/app/team/team.js
+++ b/src/app/team/team.js
@@ -183,8 +183,17 @@ export default function Team({ teamId }) {
role: "member",
}));
- setTeamMembers((prev) => [...prev, ...formattedMembers]);
- setDisplayedMembers((prev) => [...prev, ...formattedMembers]);
+ setTeamMembers((prev) => {
+ const existingIds = new Set(prev.map((m) => m.id));
+ const uniqueNew = formattedMembers.filter((m) => !existingIds.has(m.id));
+ return [...prev, ...uniqueNew];
+ });
+
+ setDisplayedMembers((prev) => {
+ const existingIds = new Set(prev.map((m) => m.id));
+ const uniqueNew = formattedMembers.filter((m) => !existingIds.has(m.id));
+ return [...prev, ...uniqueNew];
+ });
if (formattedMembers.length > 0) {
const nextLastId = formattedMembers[formattedMembers.length - 1].id;
@@ -264,8 +273,17 @@ export default function Team({ teamId }) {
}
});
- setMyProjects(prev => [...prev, ...newMyProjects]);
- setOtherProjects(prev => [...prev, ...newOtherProjects]);
+ setMyProjects((prev) => {
+ const existingIds = new Set(prev.map(p => p.projectInfo.projectId));
+ const uniqueNew = newMyProjects.filter(p => !existingIds.has(p.projectInfo.projectId));
+ return [...prev, ...uniqueNew];
+ });
+
+ setOtherProjects((prev) => {
+ const existingIds = new Set(prev.map(p => p.projectInfo.projectId));
+ const uniqueNew = newOtherProjects.filter(p => !existingIds.has(p.projectInfo.projectId));
+ return [...prev, ...uniqueNew];
+ });
const last = content[content.length - 1];
setLastProjectId(last.projectInfo.projectId);