1
1
import React , { useState , useEffect } from 'react' ;
2
+ import '../app/css/globals.css' ;
3
+ import Dot from './dot' ;
2
4
3
5
interface Contact {
4
6
email : string ;
@@ -22,6 +24,10 @@ interface EmailEventsDisplayProps {
22
24
campaignId : number ;
23
25
}
24
26
27
+ interface CopiedStatuses {
28
+ [ key : number ] : boolean ;
29
+ }
30
+
25
31
const EmailEventCard : React . FC < EmailEventCardProps > = ( {
26
32
event,
27
33
onSend,
@@ -51,7 +57,7 @@ const EmailEventCard: React.FC<EmailEventCardProps> = ({
51
57
</ div >
52
58
< div className = "text-right" >
53
59
< button
54
- onClick = { handleCopy }
60
+ onClick = { ( ) => navigator . clipboard . writeText ( event . eventContent ) }
55
61
className = "bg-blue-500 hover:bg-blue-700 text-white font-bold py-1 px-4 rounded mr-2"
56
62
>
57
63
Copy
@@ -75,40 +81,39 @@ const EmailEventsDisplay: React.FC<EmailEventsDisplayProps> = ({
75
81
const [ campaign , setCampaign ] = useState < any > ( { } ) ;
76
82
const [ stopFetch , setStopFetch ] = useState ( false ) ;
77
83
useEffect ( ( ) => {
78
-
79
84
const fetchCampaign = async ( ) => {
80
- setIsLoading ( true ) ;
81
- try {
82
- const response = await fetch (
83
- `/api/campaigns?campaignId=${ campaignId } `
84
- ) ;
85
- if ( ! response . ok ) throw new Error ( 'Failed to fetch email events.' ) ;
86
- const data = await response . json ( ) ;
87
- if ( data . length > 0 ) {
88
- setCampaign ( data [ 0 ] ) ;
89
- }
90
- } catch ( error ) {
91
- console . error ( 'Error fetching email events:' , error ) ;
92
- } finally {
93
- setIsLoading ( false ) ;
85
+ setIsLoading ( true ) ;
86
+ try {
87
+ const response = await fetch ( `/api/campaigns?campaignId=${ campaignId } ` ) ;
88
+ if ( ! response . ok ) throw new Error ( 'Failed to fetch email events.' ) ;
89
+ const data = await response . json ( ) ;
90
+ if ( data . length > 0 ) {
91
+ setCampaign ( data [ 0 ] ) ;
94
92
}
95
- } ;
93
+ } catch ( error ) {
94
+ console . error ( 'Error fetching email events:' , error ) ;
95
+ } finally {
96
+ setIsLoading ( false ) ;
97
+ }
98
+ } ;
96
99
97
100
const fetchEmailEvents = async ( ) => {
101
+ if ( stopFetch ) {
102
+ return ;
103
+ }
98
104
setIsLoading ( true ) ;
99
105
try {
100
- if ( stopFetch ) {
101
- return ;
102
- }
103
106
const response = await fetch (
104
107
`/api/email-events?campaignId=${ campaignId } `
105
108
) ;
106
109
if ( ! response . ok ) throw new Error ( 'Failed to fetch email events.' ) ;
107
110
const data = await response . json ( ) ;
108
111
setEmailEvents ( data ) ;
109
- if ( campaign . numUsers === emailEvents . length ) {
112
+ if ( campaign . numUsers === emailEvents . length ) {
110
113
setStopFetch ( true ) ;
111
114
}
115
+ console . log ( 'emailEvents.length:' , emailEvents . length ) ;
116
+ console . log ( 'campaign.numUsers:' , campaign . numUsers ) ;
112
117
} catch ( error ) {
113
118
console . error ( 'Error fetching email events:' , error ) ;
114
119
} finally {
@@ -125,11 +130,38 @@ const EmailEventsDisplay: React.FC<EmailEventsDisplayProps> = ({
125
130
126
131
const handleSendEmail = ( event : EmailEvent ) => {
127
132
console . log ( 'Sending email:' , event ) ;
128
- // Implement sending email logic here
129
133
} ;
130
134
131
- const handleCopyEmailContent = ( event : EmailEvent ) => {
132
- console . log ( 'Email content copied:' , event ) ;
135
+ const [ copiedStatuses , setCopiedStatuses ] = useState < CopiedStatuses > ( { } ) ;
136
+
137
+ // const handleCopy = (event: EmailEvent) => {
138
+ // navigator.clipboard.writeText(event.eventContent)
139
+ // .then(() => {
140
+ // setCopied(true); // Set copied to true when the text is successfully copied
141
+ // setTimeout(() => setCopied(false), 2000); // Reset copied status after 2 seconds
142
+ // })
143
+ // .catch(error => console.error('Copy failed', error));
144
+ // };
145
+
146
+ const handleCopy = ( eventId : number , event : EmailEvent ) => {
147
+ navigator . clipboard
148
+ . writeText ( event . eventContent )
149
+ . then ( ( ) => {
150
+ // Set the copied status for the specific event ID to true
151
+ setCopiedStatuses ( ( prevStatuses ) => ( {
152
+ ...prevStatuses ,
153
+ [ eventId ] : true
154
+ } ) ) ;
155
+
156
+ // Optional: Reset copied status for this event ID after 2 seconds
157
+ setTimeout ( ( ) => {
158
+ setCopiedStatuses ( ( prevStatuses ) => ( {
159
+ ...prevStatuses ,
160
+ [ eventId ] : false
161
+ } ) ) ;
162
+ } , 2000 ) ;
163
+ } )
164
+ . catch ( ( error ) => console . error ( 'Copy failed' , error ) ) ;
133
165
} ;
134
166
135
167
if ( isLoading )
@@ -141,29 +173,56 @@ const EmailEventsDisplay: React.FC<EmailEventsDisplayProps> = ({
141
173
if ( ! emailEvents . length ) {
142
174
return (
143
175
< div className = "text-xl flex justify-center items-center font-semibold text-blue-500 mb-2 mt-2" >
144
- < div className = "animate-spin rounded-full h-12 w-12 border-t-4 border-b-4 border-blue-500" > </ div >
145
- Generating Emails...
176
+ < div className = "text-xl flex justify-center items-center font-semibold text-blue-500 mb-2 mt-2" >
177
+ Generating Emails
178
+ < div className = "flex ml-2" >
179
+ < Dot delay = { 300 } />
180
+ < Dot delay = { 600 } />
181
+ < Dot delay = { 900 } />
182
+ </ div >
183
+ </ div >
146
184
</ div >
147
185
) ;
148
186
}
149
187
return (
150
188
< div className = "max-w-4xl mx-auto mt-2" >
151
- < div className = "text-xl flex justify-center items-center font-semibold text-blue-500 mb-2" >
152
- < div className = "animate-spin rounded-full h-12 w-12 border-t-4 border-b-4 border-blue-500" > </ div >
153
- Generated Emails
154
- < div className = "mt-2 grid grid-cols-4 text-sm" >
155
- < div className = "flex justify-start items-justify-start" >
156
- < div className = "loader" > </ div >
189
+ { emailEvents . map ( ( event ) => (
190
+ < div className = "bg-white p-4 shadow rounded-lg mb-4" >
191
+ < div className = "mb-2 text-gray-900" >
192
+ < strong > To:</ strong > { event . contact . email }
193
+ </ div >
194
+ < div className = "mb-2 text-gray-600" >
195
+ < strong > Subject:</ strong > { event . eventType }
196
+ </ div >
197
+ < div className = "mb-4 text-gray-700" >
198
+ < strong > Message:</ strong >
199
+ < div
200
+ dangerouslySetInnerHTML = { {
201
+ __html : event . eventContent . replace ( / \n \n / g, '<br /><br />' )
202
+ } }
203
+ > </ div >
204
+ </ div >
205
+ < div className = "text-right" >
206
+ < button
207
+ type = "button"
208
+ onClick = { ( ) => handleCopy ( event . id , event ) }
209
+ className = { `bg-blue-500 hover:bg-blue-700 text-white font-bold py-1 px-4 rounded mr-2 ${
210
+ copiedStatuses [ event . id ]
211
+ ? 'bg-green-500 hover:bg-green-600'
212
+ : ''
213
+ } `}
214
+ >
215
+ { copiedStatuses [ event . id ] ? 'Copied' : 'Copy' }
216
+ </ button >
217
+ < button
218
+ type = "button"
219
+ onClick = { ( ) => handleSendEmail ( event ) }
220
+ className = "bg-green-500 hover:bg-green-700 text-white font-bold py-1 px-4 rounded"
221
+ >
222
+ Send
223
+ </ button >
157
224
</ div >
158
225
</ div >
159
- </ div >
160
- { emailEvents . map ( ( event ) => (
161
- < EmailEventCard
162
- key = { event . id }
163
- event = { event }
164
- onSend = { handleSendEmail }
165
- onCopy = { handleCopyEmailContent }
166
- />
167
226
) ) }
168
227
</ div >
169
228
) ;
0 commit comments