1- import React , { useEffect , useRef , useState } from 'react' ;
1+ import React , { useCallback , useEffect , useState } from 'react' ;
22import {
33 X , Calendar , Users ,
44 List , Edit3 , Archive ,
55 // Eye, Paperclip, Copy, Trash2, MessageSquareText
66} from 'lucide-react' ;
77import LoadingContent from '../ui/LoadingContent' ;
8- import type { ItemDetail } from '@/types' ;
8+ import type { ItemDetail , UpdateItemRequest } from '@/types' ;
99import taskService from '@/services/taskService' ;
1010import AssignMembers from './AssignMembers' ;
11+ import { hideTaskModal } from '@/store/slices/taskModalSlice' ;
12+ import { useAppDispatch } from '@/store' ;
13+ import { useSelector } from 'react-redux' ;
14+ import { selectTaskModalState } from '@/store/selectors/modalSelector' ;
15+ import { notify } from '@/services/toastService' ;
1116
12- interface TaskModalProps {
13- onClose : ( ) => void ;
14- itemId : number ;
15- onUpdate : ( itemId : number , updates : any ) => void ;
16- onArchive : ( itemId : number ) => void ;
17- }
18-
19- const TaskDetailModal : React . FC < TaskModalProps > = ( {
20- onClose,
21- itemId,
22- onUpdate,
23- onArchive,
24- } ) => {
17+ const TaskDetailModal : React . FC = ( ) => {
2518 const [ isLoading , setIsLoading ] = useState ( false ) ;
2619 const [ item , setItem ] = useState < ItemDetail > ( null as any ) ;
2720 const [ isEditingTitle , setIsEditingTitle ] = useState ( false ) ;
2821 const [ isEditingDescription , setIsEditingDescription ] = useState ( false ) ;
2922 // const [comment, setComment] = useState('');
3023
24+ const dispatch = useAppDispatch ( ) ;
25+ const { taskId } = useSelector ( selectTaskModalState ) ;
26+
27+ const onModalClose = useCallback ( ( ) => {
28+ dispatch ( hideTaskModal ( ) ) ;
29+ } , [ dispatch ] ) ;
30+
31+ const archiveTask = useCallback (
32+ async ( taskId : number ) => {
33+ try {
34+ const result = await taskService . archiveTask ( taskId ) ;
35+ notify . success ( result . message ) ;
36+ } catch ( error : any ) {
37+ notify . error ( error . response ?. data ?. message || 'Failed to archive task' ) ;
38+ }
39+ } ,
40+ [ ]
41+ ) ;
42+
43+ const updateTask = useCallback (
44+ async ( taskId : number , data : UpdateItemRequest ) => {
45+ try {
46+ const result = await taskService . updateTask ( taskId , data ) ;
47+ notify . success ( result . message ) ;
48+ } catch ( error : any ) {
49+ notify . error ( error . response ?. data ?. message || 'Failed to update task' ) ;
50+ }
51+ } ,
52+ [ ]
53+ ) ;
3154
3255 const handleUpdate = ( ) => {
3356 setIsEditingTitle ( false ) ;
34- onUpdate ( item . id , item ) ;
57+ updateTask ( item . id , { name : item . name , description : item . description as string } ) ;
3558 } ;
3659
3760 const fetchTaskDetail = async ( ) => {
3861 setIsLoading ( true ) ;
3962 try {
40- const response = await taskService . getTaskDetail ( itemId ) ;
63+ const response = await taskService . getTaskDetail ( Number ( taskId ) ) ;
4164 setItem ( response . data ) ;
4265 }
4366 catch ( error ) {
@@ -48,12 +71,20 @@ const TaskDetailModal: React.FC<TaskModalProps> = ({
4871 }
4972 } ;
5073
51- console . log ( "Rendering TaskDetailModal for itemId:" , itemId , item ) ;
74+ // Close modal on Escape key press
75+ useEffect ( ( ) => {
76+ const handleKeyDown = ( e : KeyboardEvent ) => {
77+ if ( e . key === "Escape" ) onModalClose ( ) ;
78+ } ;
79+ document . addEventListener ( "keydown" , handleKeyDown ) ;
80+ return ( ) => document . removeEventListener ( "keydown" , handleKeyDown ) ;
81+ } , [ onModalClose ] ) ;
5282
83+ console . log ( "Rendering TaskDetailModal for taskId:" , taskId , item ) ;
5384
5485 useEffect ( ( ) => {
5586 fetchTaskDetail ( ) ;
56- } , [ itemId ] ) ;
87+ } , [ taskId ] ) ;
5788
5889 return (
5990 < div className = "fixed inset-0 bg-black/50 flex items-start justify-center z-40 pt-8 px-4" >
@@ -88,7 +119,7 @@ const TaskDetailModal: React.FC<TaskModalProps> = ({
88119 </ h1 >
89120 ) }
90121 < button
91- onClick = { onClose }
122+ onClick = { onModalClose }
92123 className = "text-gray-400 hover:text-white p-1 rounded hover:bg-gray-600 hover:bg-opacity-50"
93124 >
94125 < X size = { 18 } />
@@ -117,7 +148,7 @@ const TaskDetailModal: React.FC<TaskModalProps> = ({
117148 < div className = "pl-6 flex flex-wrap gap-2" >
118149
119150 { /* Member section */ }
120- < AssignMembers assignedMembers = { item ?. assignedMembers } taskId = { itemId } />
151+ < AssignMembers assignedMembers = { item ?. assignedMembers } taskId = { Number ( taskId ) } />
121152
122153 { /* Labels Section */ }
123154 < div className = "pb-4" >
@@ -272,8 +303,8 @@ const TaskDetailModal: React.FC<TaskModalProps> = ({
272303 < button
273304 className = "w-full text-left px-2 py-2 text-sm text-gray-300 hover:bg-gray-600 hover:bg-opacity-50 rounded flex items-center gap-2"
274305 onClick = { ( ) => {
275- onArchive ( item . id ) ;
276- onClose ( ) ;
306+ archiveTask ( item . id ) ;
307+ onModalClose ( ) ;
277308 } }
278309 >
279310 < Archive size = { 14 } />
0 commit comments