1- // CardDetailModal.tsx
2- import { useState } from "react" ;
1+ import { useMemo , useRef , useState } from "react" ;
32import { MoreVertical , X } from "lucide-react" ;
43import CardDetail from "./CardDetail" ;
54import CommentList from "./CommentList" ;
65import CardInput from "@/components/modalInput/CardInput" ;
7- import { useMutation , useQueryClient } from "@tanstack/react-query" ;
6+ import { useMutation , useQuery , useQueryClient } from "@tanstack/react-query" ;
87import { createComment } from "@/api/comment" ;
9- import { deleteCard } from "@/api/card" ;
8+ import { deleteCard , EditCard } from "@/api/card" ; // EditCard API 추가
109import type { CardDetailType } from "@/types/cards" ;
1110import TaskModal from "@/components/modalInput/TaskModal" ;
11+ import { useClosePopup } from "@/hooks/useClosePopup" ;
12+ import { getColumn } from "@/api/columns" ;
1213
1314interface CardDetailModalProps {
1415 card : CardDetailType ;
@@ -17,6 +18,12 @@ interface CardDetailModalProps {
1718 onClose : ( ) => void ;
1819}
1920
21+ interface ColumnType {
22+ id : number ;
23+ title : string ;
24+ status : string ;
25+ }
26+
2027export default function CardDetailPage ( {
2128 card,
2229 currentUserId,
@@ -28,6 +35,20 @@ export default function CardDetailPage({
2835 const [ showMenu , setShowMenu ] = useState ( false ) ;
2936 const [ isEditModalOpen , setIsEditModalOpen ] = useState ( false ) ;
3037 const queryClient = useQueryClient ( ) ;
38+ const popupRef = useRef ( null ) ;
39+ useClosePopup ( popupRef , ( ) => setShowMenu ( false ) ) ;
40+
41+ const { data : columns = [ ] } = useQuery < ColumnType [ ] > ( {
42+ queryKey : [ "columns" , dashboardId ] ,
43+ queryFn : ( ) => getColumn ( { dashboardId, columnId : card . columnId } ) ,
44+ } ) ;
45+
46+ const columnName = useMemo ( ( ) => {
47+ return (
48+ columns . find ( ( col ) => String ( col . id ) === String ( cardData . columnId ) )
49+ ?. title || "알 수 없음"
50+ ) ;
51+ } , [ columns , cardData . columnId ] ) ;
3152
3253 const { mutate : createCommentMutate } = useMutation ( {
3354 mutationFn : createComment ,
@@ -55,20 +76,27 @@ export default function CardDetailPage({
5576 } ) ;
5677 } ;
5778
79+ const { mutateAsync : updateCardMutate } = useMutation ( {
80+ mutationFn : ( data : Partial < CardDetailType > ) => EditCard ( cardData . id , data ) ,
81+ onSuccess : ( updatedCard ) => {
82+ setCardData ( updatedCard ) ; // ✅ 서버 응답을 최신 cardData로 설정
83+ queryClient . invalidateQueries ( { queryKey : [ "cards" ] } ) ; // 필요시
84+ } ,
85+ } ) ;
86+
5887 return (
5988 < >
6089 < div className = "fixed inset-0 bg-black/30 z-50 flex items-center justify-center" >
6190 < div
6291 className = "relative bg-white rounded-lg shadow-lg w-[730px] h-[763px] flex flex-col
63- md:w-[678px] lg:w-[730px]
64- "
92+ md:w-[678px] lg:w-[730px]"
6593 >
66- { /* 오른쪽 상단 메뉴 */ }
67- < div className = "absolute top-6 right-10 z-30 flex items-center gap-5 mt-3 " >
94+ < div className = "absolute top-6 right-8.5 z-30 flex items-center gap-3 mt-1" >
95+ { /* 오른쪽 상단 메뉴 */ }
6896 < div className = "relative" >
6997 < button
7098 onClick = { ( ) => setShowMenu ( ( prev ) => ! prev ) }
71- className = "hover:cursor-pointer"
99+ className = "w-7 h-7 flex items-center justify-center hover:cursor-pointer"
72100 title = "수정하기"
73101 type = "button"
74102 >
@@ -96,19 +124,20 @@ export default function CardDetailPage({
96124 </ div >
97125 ) }
98126 </ div >
99- < button onClick = { onClose } title = "메뉴 열기" >
100- < X className = "w-8 h-8 text-black hover:cursor-pointer" />
127+
128+ < button onClick = { onClose } title = "닫기" >
129+ < X className = "w-7 h-7 flex items-center justify-center hover:cursor-pointer" />
101130 </ button >
102131 </ div >
103132
104133 { /* 모달 내부 콘텐츠 */ }
105- < div className = "p-6 flex gap-6 overflow-y-auto flex-1" >
106- < CardDetail card = { cardData } columnName = { "" } />
134+ < div className = "p-6 flex gap-6 overflow-y-auto flex-1 w-[550px] h-[460px] " >
135+ < CardDetail card = { cardData } columnName = { columnName } />
107136 </ div >
108137
109138 { /* 댓글 입력창 */ }
110139 < div className = "px-10 pt-2 pb-2" >
111- < p className = "text-sm font-semibold mb-2" > 댓글</ p >
140+ < p className = "ml-1 text-sm font-semibold mb-2" > 댓글</ p >
112141 < div className = "w-[450px] h-[110px]" >
113142 < CardInput
114143 hasButton
@@ -117,18 +146,19 @@ export default function CardDetailPage({
117146 onTextChange = { setCommentText }
118147 onButtonClick = { handleCommentSubmit }
119148 placeholder = "댓글 작성하기"
120- // buttonClassName="border border-[#D9D9D9] text-[#5534DA] hover:bg-[#F1EFFD]"
121149 />
122150 </ div >
123151 </ div >
124152
125153 { /* 댓글 목록 */ }
126- < div className = "px-6 space-y-4 max-h-[200px] overflow-y-auto" >
127- < CommentList
128- cardId = { card . id }
129- currentUserId = { currentUserId }
130- teamId = { "" }
131- />
154+ < div className = " max-h-[100px] ml-7 text-base overflow-y-auto scrollbar-hidden" >
155+ < div className = " max-h-[50vh]" >
156+ < CommentList
157+ cardId = { card . id }
158+ currentUserId = { currentUserId }
159+ teamId = { "" }
160+ />
161+ </ div >
132162 </ div >
133163 </ div >
134164 </ div >
@@ -137,20 +167,19 @@ export default function CardDetailPage({
137167 { isEditModalOpen && (
138168 < TaskModal
139169 mode = "edit"
140- columnId = { card . columnId } // ✅ 여기 추가!
170+ columnId = { card . columnId } // ✅ 여기에 columnId 추가!
141171 onClose = { ( ) => setIsEditModalOpen ( false ) }
142- onSubmit = { ( data ) => {
143- setCardData ( ( prev ) => ( {
144- ...prev ,
145- status : data . status as "todo" | "in-progress" | "done" ,
146- assignee : { ...prev . assignee , nickname : data . assignee } ,
172+ onSubmit = { async ( data ) => {
173+ await updateCardMutate ( {
174+ status : String ( cardData . columnId ) || cardData . status ,
175+ assignee : { ...cardData . assignee , nickname : data . assignee } ,
147176 title : data . title ,
148177 description : data . description ,
149178 dueDate : data . deadline ,
150179 tags : data . tags ,
151180 imageUrl : data . image ?? "" ,
152- } ) ) ;
153- setIsEditModalOpen ( false ) ;
181+ } ) ;
182+ setIsEditModalOpen ( false ) ; // 수정 후 모달 닫기
154183 } }
155184 initialData = { {
156185 status : cardData . status ,
0 commit comments