1+ // Column.tsx
12import { useEffect , useState } from "react" ;
23import Image from "next/image" ;
34import { CardType } from "@/types/task" ;
4- import { CardDetailType } from "@/types/cards" ;
5- import Card from "./Card" ;
65import TodoModal from "@/components/modalInput/ToDoModal" ;
76import TodoButton from "@/components/button/TodoButton" ;
87import ColumnManageModal from "@/components/columnCard/ColumnManageModal" ;
98import ColumnDeleteModal from "@/components/columnCard/ColumnDeleteModal" ;
109import { updateColumn , deleteColumn } from "@/api/columns" ;
11- import { getDashboardMembers } from "@/api/card" ;
10+ import { getDashboardMembers , getCardDetail } from "@/api/card" ;
1211import { MemberType } from "@/types/users" ;
13- import CardDetailModal from "../modalDashboard/CardDetailModal" ;
1412import { TEAM_ID } from "@/constants/team" ;
13+ import CardList from "./CardList" ;
14+ import CardDetailModal from "@/components/modalDashboard/CardDetailModal" ;
15+ import { CardDetailType } from "@/types/cards" ;
1516
1617type ColumnProps = {
1718 columnId : number ;
@@ -30,21 +31,17 @@ export default function Column({
3031 const [ isColumnModalOpen , setIsColumnModalOpen ] = useState ( false ) ;
3132 const [ isDeleteModalOpen , setIsDeleteModalOpen ] = useState ( false ) ;
3233 const [ isTodoModalOpen , setIsTodoModalOpen ] = useState ( false ) ;
34+ const [ isCardDetailModalOpen , setIsCardDetailModalOpen ] = useState ( false ) ;
35+ const [ selectedCard , setSelectedCard ] = useState < CardDetailType | null > ( null ) ;
3336 const [ members , setMembers ] = useState <
3437 { id : number ; userId : number ; nickname : string } [ ]
3538 > ( [ ] ) ;
36- const [ selectedCard , setSelectedCard ] = useState < CardDetailType | null > ( null ) ;
37-
38- const handleCloseDetailModal = ( ) => {
39- setSelectedCard ( null ) ;
40- } ;
4139
40+ // ✅ 멤버 불러오기
4241 useEffect ( ( ) => {
4342 const fetchMembers = async ( ) => {
4443 try {
45- const result = await getDashboardMembers ( {
46- dashboardId,
47- } ) ;
44+ const result = await getDashboardMembers ( { dashboardId } ) ;
4845
4946 const parsed = result . map ( ( m : MemberType ) => ( {
5047 id : m . id ,
@@ -89,13 +86,23 @@ export default function Column({
8986 }
9087 } ;
9188
89+ const handleCardClick = async ( cardId : number ) => {
90+ try {
91+ const detail = await getCardDetail ( cardId ) ;
92+ setSelectedCard ( detail ) ;
93+ setIsCardDetailModalOpen ( true ) ;
94+ } catch ( e ) {
95+ console . error ( "카드 상세 불러오기 실패:" , e ) ;
96+ }
97+ } ;
98+
9299 return (
93100 < div
94101 className = { `
95- flex flex-col border-r border-gray-200 bg-gray-50 rounded-md p-4
96- h-auto sm:m-h-screen
97- max-h-[401px] sm:max-h-none
98- ` }
102+ flex flex-col border-r border-[#EEEEEE] bg-gray-50 rounded-md p-4
103+ h-auto sm:m-h-screen
104+ max-h-[401px] sm:max-h-none w-full lg:w-[360px]
105+ ` }
99106 >
100107 { /* 칼럼 헤더 */ }
101108 < div className = "flex items-center justify-between" >
@@ -119,49 +126,19 @@ export default function Column({
119126 </ div >
120127
121128 { /* 카드 영역 */ }
122- < div className = " flex-1 pb-4 flex flex-col items-center gap-3 " >
129+ < div className = "flex-1 pb-4 flex flex-col items-center gap-3" >
123130 < div onClick = { ( ) => setIsTodoModalOpen ( true ) } className = "mb-2" >
124131 < TodoButton />
125132 </ div >
126133
127- { /* 카드 1개만 렌더링 (모바일), 전체 렌더링 (md 이상) */ }
128- < div className = "w-full flex flex-wrap justify-center gap-3" >
129- { tasks . map ( ( task , index ) => {
130- const isMobile =
131- typeof window !== "undefined" && window . innerWidth < 768 ;
132- if ( isMobile && index > 0 ) return null ;
133- return (
134- < div
135- key = { task . id }
136- onClick = { ( ) =>
137- setSelectedCard ( {
138- id : task . id ,
139- title : task . title ,
140- tags : task . tags ,
141- dueDate : task . dueDate ,
142- assignee : {
143- ...task . assignee ,
144- profileImageUrl : task . assignee . profileImageUrl ?? "" ,
145- } ,
146- imageUrl : task . imageUrl ?? null ,
147- description : task . description ?? "" ,
148- columnId : task . columnId ,
149- dashboardId : task . dashboardId ,
150- status : columnTitle ,
151- createdAt : new Date ( ) . toISOString ( ) ,
152- updatedAt : new Date ( ) . toISOString ( ) ,
153- } )
154- }
155- >
156- < Card
157- key = { task . id }
158- { ...task }
159- imageUrl = { task . imageUrl }
160- assignee = { task . assignee }
161- />
162- </ div >
163- ) ;
164- } ) }
134+ { /* 무한스크롤 카드 리스트로 대체 */ }
135+ < div className = "w-full max-h-[800px] overflow-y-auto" >
136+ < CardList
137+ columnId = { columnId }
138+ teamId = { TEAM_ID }
139+ initialTasks = { tasks }
140+ onCardClick = { ( card ) => handleCardClick ( card . id ) }
141+ />
165142 </ div >
166143 </ div >
167144
@@ -195,12 +172,17 @@ export default function Column({
195172 onClose = { ( ) => setIsDeleteModalOpen ( false ) }
196173 onDelete = { handleDeleteColumn }
197174 />
198- { selectedCard && (
175+
176+ { /* 카드 상세 모달 */ }
177+ { isCardDetailModalOpen && selectedCard && (
199178 < CardDetailModal
200179 card = { selectedCard }
201- onClose = { handleCloseDetailModal }
202180 currentUserId = { selectedCard . assignee . id }
203181 dashboardId = { dashboardId }
182+ onClose = { ( ) => {
183+ setIsCardDetailModalOpen ( false ) ;
184+ setSelectedCard ( null ) ;
185+ } }
204186 />
205187 ) }
206188 </ div >
0 commit comments