@@ -4,10 +4,72 @@ import { useEffect, useState } from "react";
4
4
import DataTable from "react-data-table-component" ;
5
5
import { Eye , Trash2 } from "lucide-react" ;
6
6
7
+ interface ModalProps {
8
+ isOpen : boolean ;
9
+ title : string ;
10
+ children : React . ReactNode ;
11
+ onClose : ( ) => void ;
12
+ onConfirm ?: ( ) => void ;
13
+ confirmText ?: string ;
14
+ confirmVariant ?: "danger" | "primary" ;
15
+ }
16
+
17
+ function Modal ( {
18
+ isOpen,
19
+ title,
20
+ children,
21
+ onClose,
22
+ onConfirm,
23
+ confirmText = "OK" ,
24
+ confirmVariant = "primary" ,
25
+ } : ModalProps ) {
26
+ if ( ! isOpen ) return null ;
27
+
28
+ return (
29
+ < div
30
+ className = "fixed inset-0 z-50 flex items-center justify-center bg-black/40 backdrop-blur-sm"
31
+ onClick = { onClose }
32
+ >
33
+ < div
34
+ className = "bg-white rounded-2xl shadow-xl w-full max-w-md p-6 animate-fadeIn"
35
+ onClick = { ( e ) => e . stopPropagation ( ) }
36
+ >
37
+ < h2 className = "text-lg font-semibold mb-4" > { title } </ h2 >
38
+ < div className = "mb-6 text-gray-700" > { children } </ div >
39
+ < div className = "flex justify-end gap-3" >
40
+ < button
41
+ onClick = { onClose }
42
+ className = "px-4 py-2 rounded-lg border border-gray-300 hover:bg-gray-100"
43
+ >
44
+ Cancel
45
+ </ button >
46
+ { onConfirm && (
47
+ < button
48
+ onClick = { ( ) => {
49
+ onConfirm ( ) ;
50
+ onClose ( ) ;
51
+ } }
52
+ className = { `px-4 py-2 rounded-lg text-white ${
53
+ confirmVariant === "danger"
54
+ ? "bg-red-600 hover:bg-red-700"
55
+ : "bg-blue-600 hover:bg-blue-700"
56
+ } `}
57
+ >
58
+ { confirmText }
59
+ </ button >
60
+ ) }
61
+ </ div >
62
+ </ div >
63
+ </ div >
64
+ ) ;
65
+ }
66
+
7
67
export default function FeedbackList ( ) {
8
68
const [ feedbacks , setFeedbacks ] : any = useState ( [ ] ) ;
9
69
const [ loading , setLoading ] = useState ( false ) ;
70
+
10
71
const [ selectedComment , setSelectedComment ] = useState < string | null > ( null ) ;
72
+ const [ deleteTarget , setDeleteTarget ] = useState < any | null > ( null ) ;
11
73
12
74
const truncate = ( text : string , length : number = 50 ) =>
13
75
text . length > length ? `${ text . slice ( 0 , length ) } ...` : text ;
@@ -43,6 +105,10 @@ export default function FeedbackList() {
43
105
fetchFeedback ( ) ;
44
106
} , [ ] ) ;
45
107
108
+ const handleDelete = ( id : string ) => {
109
+ setFeedbacks ( ( prev : any ) => prev . filter ( ( f : any ) => f . id !== id ) ) ;
110
+ } ;
111
+
46
112
const columns : any = [
47
113
{
48
114
name : "ID" ,
@@ -73,7 +139,7 @@ export default function FeedbackList() {
73
139
} ,
74
140
{
75
141
name : "Date" ,
76
- selector : ( row : any ) => row . date ,
142
+ selector : ( row : any ) => new Date ( row . date ) . toUTCString ( ) ,
77
143
sortable : true ,
78
144
} ,
79
145
{
@@ -89,9 +155,7 @@ export default function FeedbackList() {
89
155
</ button >
90
156
) }
91
157
< button
92
- onClick = { ( ) =>
93
- setFeedbacks ( ( prev : any ) => prev . filter ( ( f : any ) => f . id !== row . id ) )
94
- }
158
+ onClick = { ( ) => setDeleteTarget ( row ) }
95
159
className = "flex items-center gap-1 px-2 py-1 text-sm border border-red-600 text-red-600 rounded hover:bg-red-50"
96
160
>
97
161
< Trash2 size = { 14 } /> Delete
@@ -102,7 +166,7 @@ export default function FeedbackList() {
102
166
] ;
103
167
104
168
return (
105
- < div className = "p-6 w-[160vh ] bg-white rounded shadow" >
169
+ < div className = "p-6 w-[90rem ] bg-white rounded shadow" >
106
170
< h2 className = "text-xl font-semibold mb-6" > User Feedback</ h2 >
107
171
108
172
< DataTable
@@ -120,33 +184,34 @@ export default function FeedbackList() {
120
184
} }
121
185
/>
122
186
123
- { selectedComment && (
124
- < div
125
- className = "fixed inset-0 bg-black bg-opacity-50 flex justify-center items-center"
126
- onClick = { ( ) => setSelectedComment ( null ) }
127
- >
128
- < div
129
- className = "bg-white p-4 rounded shadow max-w-md w-full"
130
- onClick = { ( e ) => e . stopPropagation ( ) }
131
- >
132
- < h3 className = "font-semibold mb-2" > Full Comment</ h3 >
133
- < p > { selectedComment } </ p >
134
- < button
135
- onClick = { ( ) => setSelectedComment ( null ) }
136
- className = "mt-4 px-4 py-2 bg-blue-600 text-white rounded"
137
- >
138
- Close
139
- </ button >
140
- </ div >
141
- </ div >
142
- ) }
187
+ { /* View Modal */ }
188
+ < Modal
189
+ isOpen = { ! ! selectedComment }
190
+ title = "Full Comment"
191
+ onClose = { ( ) => setSelectedComment ( null ) }
192
+ >
193
+ < p > { selectedComment } </ p >
194
+ </ Modal >
195
+
196
+ { /* Delete Confirmation Modal */ }
197
+ < Modal
198
+ isOpen = { ! ! deleteTarget }
199
+ title = "Delete Feedback"
200
+ onClose = { ( ) => setDeleteTarget ( null ) }
201
+ onConfirm = { ( ) => handleDelete ( deleteTarget ?. id ) }
202
+ confirmText = "Delete"
203
+ confirmVariant = "danger"
204
+ >
205
+ < p >
206
+ Are you sure you want to delete this feedback? This action cannot be
207
+ undone.
208
+ </ p >
209
+ </ Modal >
143
210
</ div >
144
211
) ;
145
-
146
212
}
147
213
148
214
149
-
150
215
// "use client";
151
216
152
217
// import { useState } from "react";
0 commit comments