@mobilizehub/payload-plugin 0.0.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/access/authenticated.d.ts +4 -0
- package/dist/access/authenticated.js +5 -0
- package/dist/access/authenticated.js.map +1 -0
- package/dist/access/authenticated.spec.d.ts +1 -0
- package/dist/access/authenticated.spec.js +33 -0
- package/dist/access/authenticated.spec.js.map +1 -0
- package/dist/adapters/index.d.ts +1 -0
- package/dist/adapters/index.js +3 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/resend-adapter.d.ts +34 -0
- package/dist/adapters/resend-adapter.js +219 -0
- package/dist/adapters/resend-adapter.js.map +1 -0
- package/dist/collections/broadcasts/generateBroadcastsCollection.d.ts +3 -0
- package/dist/collections/broadcasts/generateBroadcastsCollection.js +241 -0
- package/dist/collections/broadcasts/generateBroadcastsCollection.js.map +1 -0
- package/dist/collections/contacts/generateContactsCollection.d.ts +22 -0
- package/dist/collections/contacts/generateContactsCollection.js +124 -0
- package/dist/collections/contacts/generateContactsCollection.js.map +1 -0
- package/dist/collections/emails/generateEmailsCollection.d.ts +3 -0
- package/dist/collections/emails/generateEmailsCollection.js +204 -0
- package/dist/collections/emails/generateEmailsCollection.js.map +1 -0
- package/dist/collections/emails/hooks/sync-status-from-activity.d.ts +5 -0
- package/dist/collections/emails/hooks/sync-status-from-activity.js +64 -0
- package/dist/collections/emails/hooks/sync-status-from-activity.js.map +1 -0
- package/dist/collections/tags/generateTagsCollection.d.ts +3 -0
- package/dist/collections/tags/generateTagsCollection.js +29 -0
- package/dist/collections/tags/generateTagsCollection.js.map +1 -0
- package/dist/collections/unsubscribe-tokens/generateUnsubscribeTokens.d.ts +2 -0
- package/dist/collections/unsubscribe-tokens/generateUnsubscribeTokens.js +48 -0
- package/dist/collections/unsubscribe-tokens/generateUnsubscribeTokens.js.map +1 -0
- package/dist/components/broadcast-metrics-card.d.ts +7 -0
- package/dist/components/broadcast-metrics-card.js +159 -0
- package/dist/components/broadcast-metrics-card.js.map +1 -0
- package/dist/components/broadcast-send-modal.d.ts +9 -0
- package/dist/components/broadcast-send-modal.js +51 -0
- package/dist/components/broadcast-send-modal.js.map +1 -0
- package/dist/components/broadcast-send-test-drawer.d.ts +7 -0
- package/dist/components/broadcast-send-test-drawer.js +154 -0
- package/dist/components/broadcast-send-test-drawer.js.map +1 -0
- package/dist/components/email-activity.d.ts +4 -0
- package/dist/components/email-activity.js +359 -0
- package/dist/components/email-activity.js.map +1 -0
- package/dist/components/email-preview.d.ts +2 -0
- package/dist/components/email-preview.js +95 -0
- package/dist/components/email-preview.js.map +1 -0
- package/dist/endpoints/sendBroadcastHandler.d.ts +9 -0
- package/dist/endpoints/sendBroadcastHandler.js +107 -0
- package/dist/endpoints/sendBroadcastHandler.js.map +1 -0
- package/dist/endpoints/sendTestBroadcastHandler.d.ts +10 -0
- package/dist/endpoints/sendTestBroadcastHandler.js +143 -0
- package/dist/endpoints/sendTestBroadcastHandler.js.map +1 -0
- package/dist/endpoints/unsubscribeHandler.d.ts +9 -0
- package/dist/endpoints/unsubscribeHandler.js +153 -0
- package/dist/endpoints/unsubscribeHandler.js.map +1 -0
- package/dist/exports/client.d.ts +3 -1
- package/dist/exports/client.js +3 -0
- package/dist/exports/client.js.map +1 -1
- package/dist/exports/rsc.d.ts +2 -1
- package/dist/exports/rsc.js +2 -0
- package/dist/exports/rsc.js.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.js +51 -2
- package/dist/index.js.map +1 -1
- package/dist/react/index.d.ts +1 -0
- package/dist/react/index.js +3 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/unsubscribe.d.ts +6 -0
- package/dist/react/unsubscribe.js +16 -0
- package/dist/react/unsubscribe.js.map +1 -0
- package/dist/tasks/sendBroadcastsTask.d.ts +11 -0
- package/dist/tasks/sendBroadcastsTask.js +196 -0
- package/dist/tasks/sendBroadcastsTask.js.map +1 -0
- package/dist/tasks/sendEmailTask.d.ts +9 -0
- package/dist/tasks/sendEmailTask.js +167 -0
- package/dist/tasks/sendEmailTask.js.map +1 -0
- package/dist/types/index.d.ts +135 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/api-response.d.ts +72 -0
- package/dist/utils/api-response.js +66 -0
- package/dist/utils/api-response.js.map +1 -0
- package/dist/utils/email.d.ts +36 -0
- package/dist/utils/email.js +40 -0
- package/dist/utils/email.js.map +1 -0
- package/dist/utils/lexical.d.ts +13 -0
- package/dist/utils/lexical.js +27 -0
- package/dist/utils/lexical.js.map +1 -0
- package/dist/utils/unsubscribe-token.d.ts +67 -0
- package/dist/utils/unsubscribe-token.js +103 -0
- package/dist/utils/unsubscribe-token.js.map +1 -0
- package/package.json +25 -9
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
function getIconForEventType(type) {
|
|
4
|
+
switch(type){
|
|
5
|
+
case 'bounced':
|
|
6
|
+
return /*#__PURE__*/ _jsxs("svg", {
|
|
7
|
+
fill: "none",
|
|
8
|
+
height: "14",
|
|
9
|
+
stroke: "var(--theme-elevation-500)",
|
|
10
|
+
strokeLinecap: "round",
|
|
11
|
+
strokeLinejoin: "round",
|
|
12
|
+
strokeWidth: "2",
|
|
13
|
+
viewBox: "0 0 24 24",
|
|
14
|
+
width: "14",
|
|
15
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
16
|
+
children: [
|
|
17
|
+
/*#__PURE__*/ _jsx("path", {
|
|
18
|
+
d: "M11.1 7.1a16.55 16.55 0 0 1 10.9 4"
|
|
19
|
+
}),
|
|
20
|
+
/*#__PURE__*/ _jsx("path", {
|
|
21
|
+
d: "M12 12a12.6 12.6 0 0 1-8.7 5"
|
|
22
|
+
}),
|
|
23
|
+
/*#__PURE__*/ _jsx("path", {
|
|
24
|
+
d: "M16.8 13.6a16.55 16.55 0 0 1-9 7.5"
|
|
25
|
+
}),
|
|
26
|
+
/*#__PURE__*/ _jsx("path", {
|
|
27
|
+
d: "M20.7 17a12.8 12.8 0 0 0-8.7-5 13.3 13.3 0 0 1 0-10"
|
|
28
|
+
}),
|
|
29
|
+
/*#__PURE__*/ _jsx("path", {
|
|
30
|
+
d: "M6.3 3.8a16.55 16.55 0 0 0 1.9 11.5"
|
|
31
|
+
}),
|
|
32
|
+
/*#__PURE__*/ _jsx("circle", {
|
|
33
|
+
cx: "12",
|
|
34
|
+
cy: "12",
|
|
35
|
+
r: "10"
|
|
36
|
+
})
|
|
37
|
+
]
|
|
38
|
+
});
|
|
39
|
+
case 'canceled':
|
|
40
|
+
return /*#__PURE__*/ _jsxs("svg", {
|
|
41
|
+
fill: "none",
|
|
42
|
+
height: "14",
|
|
43
|
+
stroke: "var(--theme-elevation-500)",
|
|
44
|
+
strokeLinecap: "round",
|
|
45
|
+
strokeLinejoin: "round",
|
|
46
|
+
strokeWidth: "2",
|
|
47
|
+
viewBox: "0 0 24 24",
|
|
48
|
+
width: "14",
|
|
49
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
50
|
+
children: [
|
|
51
|
+
/*#__PURE__*/ _jsx("circle", {
|
|
52
|
+
cx: "12",
|
|
53
|
+
cy: "12",
|
|
54
|
+
r: "10"
|
|
55
|
+
}),
|
|
56
|
+
/*#__PURE__*/ _jsx("line", {
|
|
57
|
+
x1: "15",
|
|
58
|
+
x2: "9",
|
|
59
|
+
y1: "9",
|
|
60
|
+
y2: "15"
|
|
61
|
+
}),
|
|
62
|
+
/*#__PURE__*/ _jsx("line", {
|
|
63
|
+
x1: "9",
|
|
64
|
+
x2: "15",
|
|
65
|
+
y1: "9",
|
|
66
|
+
y2: "15"
|
|
67
|
+
})
|
|
68
|
+
]
|
|
69
|
+
});
|
|
70
|
+
case 'clicked':
|
|
71
|
+
return /*#__PURE__*/ _jsx("svg", {
|
|
72
|
+
fill: "none",
|
|
73
|
+
height: "14",
|
|
74
|
+
stroke: "var(--theme-elevation-500)",
|
|
75
|
+
strokeLinecap: "round",
|
|
76
|
+
strokeLinejoin: "round",
|
|
77
|
+
strokeWidth: "2",
|
|
78
|
+
viewBox: "0 0 24 24",
|
|
79
|
+
width: "14",
|
|
80
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
81
|
+
children: /*#__PURE__*/ _jsx("path", {
|
|
82
|
+
d: "M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z"
|
|
83
|
+
})
|
|
84
|
+
});
|
|
85
|
+
case 'complained':
|
|
86
|
+
return /*#__PURE__*/ _jsxs("svg", {
|
|
87
|
+
fill: "none",
|
|
88
|
+
height: "14",
|
|
89
|
+
stroke: "var(--theme-elevation-500)",
|
|
90
|
+
strokeLinecap: "round",
|
|
91
|
+
strokeLinejoin: "round",
|
|
92
|
+
strokeWidth: "2",
|
|
93
|
+
viewBox: "0 0 24 24",
|
|
94
|
+
width: "14",
|
|
95
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
96
|
+
children: [
|
|
97
|
+
/*#__PURE__*/ _jsx("path", {
|
|
98
|
+
d: "M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719"
|
|
99
|
+
}),
|
|
100
|
+
/*#__PURE__*/ _jsx("path", {
|
|
101
|
+
d: "M12 8v4"
|
|
102
|
+
}),
|
|
103
|
+
/*#__PURE__*/ _jsx("path", {
|
|
104
|
+
d: "M12 16h.01"
|
|
105
|
+
})
|
|
106
|
+
]
|
|
107
|
+
});
|
|
108
|
+
case 'delivered':
|
|
109
|
+
return /*#__PURE__*/ _jsxs("svg", {
|
|
110
|
+
fill: "none",
|
|
111
|
+
height: "14",
|
|
112
|
+
stroke: "var(--theme-elevation-500)",
|
|
113
|
+
strokeLinecap: "round",
|
|
114
|
+
strokeLinejoin: "round",
|
|
115
|
+
strokeWidth: "2",
|
|
116
|
+
viewBox: "0 0 24 24",
|
|
117
|
+
width: "14",
|
|
118
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
119
|
+
children: [
|
|
120
|
+
/*#__PURE__*/ _jsx("path", {
|
|
121
|
+
d: "M22 17a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9.5C2 7 4 5 6.5 5H18c2.2 0 4 1.8 4 4v8Z"
|
|
122
|
+
}),
|
|
123
|
+
/*#__PURE__*/ _jsx("polyline", {
|
|
124
|
+
points: "15,9 18,9 18,11"
|
|
125
|
+
}),
|
|
126
|
+
/*#__PURE__*/ _jsx("path", {
|
|
127
|
+
d: "M6.5 5C9 5 11 7 11 9.5V17a2 2 0 0 1-2 2"
|
|
128
|
+
}),
|
|
129
|
+
/*#__PURE__*/ _jsx("line", {
|
|
130
|
+
x1: "6",
|
|
131
|
+
x2: "7",
|
|
132
|
+
y1: "10",
|
|
133
|
+
y2: "10"
|
|
134
|
+
})
|
|
135
|
+
]
|
|
136
|
+
});
|
|
137
|
+
case 'delivery_delayed':
|
|
138
|
+
return /*#__PURE__*/ _jsxs("svg", {
|
|
139
|
+
fill: "none",
|
|
140
|
+
height: "14",
|
|
141
|
+
stroke: "var(--theme-elevation-500)",
|
|
142
|
+
strokeLinecap: "round",
|
|
143
|
+
strokeLinejoin: "round",
|
|
144
|
+
strokeWidth: "2",
|
|
145
|
+
viewBox: "0 0 24 24",
|
|
146
|
+
width: "14",
|
|
147
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
148
|
+
children: [
|
|
149
|
+
/*#__PURE__*/ _jsx("path", {
|
|
150
|
+
d: "M12 6v6l4 2"
|
|
151
|
+
}),
|
|
152
|
+
/*#__PURE__*/ _jsx("path", {
|
|
153
|
+
d: "M20 12v5"
|
|
154
|
+
}),
|
|
155
|
+
/*#__PURE__*/ _jsx("path", {
|
|
156
|
+
d: "M20 21h.01"
|
|
157
|
+
}),
|
|
158
|
+
/*#__PURE__*/ _jsx("path", {
|
|
159
|
+
d: "M21.25 8.2A10 10 0 1 0 16 21.16"
|
|
160
|
+
})
|
|
161
|
+
]
|
|
162
|
+
});
|
|
163
|
+
case 'failed':
|
|
164
|
+
return /*#__PURE__*/ _jsxs("svg", {
|
|
165
|
+
fill: "none",
|
|
166
|
+
height: "14",
|
|
167
|
+
stroke: "var(--theme-elevation-500)",
|
|
168
|
+
strokeLinecap: "round",
|
|
169
|
+
strokeLinejoin: "round",
|
|
170
|
+
strokeWidth: "2",
|
|
171
|
+
viewBox: "0 0 24 24",
|
|
172
|
+
width: "14",
|
|
173
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
174
|
+
children: [
|
|
175
|
+
/*#__PURE__*/ _jsx("path", {
|
|
176
|
+
d: "m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"
|
|
177
|
+
}),
|
|
178
|
+
/*#__PURE__*/ _jsx("path", {
|
|
179
|
+
d: "M12 9v4"
|
|
180
|
+
}),
|
|
181
|
+
/*#__PURE__*/ _jsx("path", {
|
|
182
|
+
d: "M12 17h.01"
|
|
183
|
+
})
|
|
184
|
+
]
|
|
185
|
+
});
|
|
186
|
+
case 'opened':
|
|
187
|
+
return /*#__PURE__*/ _jsxs("svg", {
|
|
188
|
+
fill: "none",
|
|
189
|
+
height: "14",
|
|
190
|
+
stroke: "var(--theme-elevation-500)",
|
|
191
|
+
strokeLinecap: "round",
|
|
192
|
+
strokeLinejoin: "round",
|
|
193
|
+
strokeWidth: "2",
|
|
194
|
+
viewBox: "0 0 24 24",
|
|
195
|
+
width: "14",
|
|
196
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
197
|
+
children: [
|
|
198
|
+
/*#__PURE__*/ _jsx("path", {
|
|
199
|
+
d: "M21.2 8.4c.5.38.8.97.8 1.6v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V10a2 2 0 0 1 .8-1.6l8-6a2 2 0 0 1 2.4 0l8 6Z"
|
|
200
|
+
}),
|
|
201
|
+
/*#__PURE__*/ _jsx("path", {
|
|
202
|
+
d: "m22 10-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 10"
|
|
203
|
+
})
|
|
204
|
+
]
|
|
205
|
+
});
|
|
206
|
+
case 'queued':
|
|
207
|
+
return /*#__PURE__*/ _jsxs("svg", {
|
|
208
|
+
fill: "none",
|
|
209
|
+
height: "14",
|
|
210
|
+
stroke: "var(--theme-elevation-500)",
|
|
211
|
+
strokeLinecap: "round",
|
|
212
|
+
strokeLinejoin: "round",
|
|
213
|
+
strokeWidth: "2",
|
|
214
|
+
viewBox: "0 0 24 24",
|
|
215
|
+
width: "14",
|
|
216
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
217
|
+
children: [
|
|
218
|
+
/*#__PURE__*/ _jsx("path", {
|
|
219
|
+
d: "M3 5h.01"
|
|
220
|
+
}),
|
|
221
|
+
/*#__PURE__*/ _jsx("path", {
|
|
222
|
+
d: "M3 12h.01"
|
|
223
|
+
}),
|
|
224
|
+
/*#__PURE__*/ _jsx("path", {
|
|
225
|
+
d: "M3 19h.01"
|
|
226
|
+
}),
|
|
227
|
+
/*#__PURE__*/ _jsx("path", {
|
|
228
|
+
d: "M8 5h13"
|
|
229
|
+
}),
|
|
230
|
+
/*#__PURE__*/ _jsx("path", {
|
|
231
|
+
d: "M8 12h13"
|
|
232
|
+
}),
|
|
233
|
+
/*#__PURE__*/ _jsx("path", {
|
|
234
|
+
d: "M8 19h13"
|
|
235
|
+
})
|
|
236
|
+
]
|
|
237
|
+
});
|
|
238
|
+
case 'sent':
|
|
239
|
+
return /*#__PURE__*/ _jsxs("svg", {
|
|
240
|
+
fill: "none",
|
|
241
|
+
height: "14",
|
|
242
|
+
stroke: "var(--theme-elevation-500)",
|
|
243
|
+
strokeLinecap: "round",
|
|
244
|
+
strokeLinejoin: "round",
|
|
245
|
+
strokeWidth: "2",
|
|
246
|
+
viewBox: "0 0 24 24",
|
|
247
|
+
width: "14",
|
|
248
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
249
|
+
children: [
|
|
250
|
+
/*#__PURE__*/ _jsx("path", {
|
|
251
|
+
d: "M3.714 3.048a.498.498 0 0 0-.683.627l2.843 7.627a2 2 0 0 1 0 1.396l-2.842 7.627a.498.498 0 0 0 .682.627l18-8.5a.5.5 0 0 0 0-.904z"
|
|
252
|
+
}),
|
|
253
|
+
/*#__PURE__*/ _jsx("path", {
|
|
254
|
+
d: "M6 12h16"
|
|
255
|
+
})
|
|
256
|
+
]
|
|
257
|
+
});
|
|
258
|
+
default:
|
|
259
|
+
return null;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
export const EmailActivityField = ({ data })=>{
|
|
263
|
+
const activity = data.activity;
|
|
264
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
265
|
+
style: {
|
|
266
|
+
paddingTop: '1rem'
|
|
267
|
+
},
|
|
268
|
+
children: [
|
|
269
|
+
/*#__PURE__*/ _jsx("div", {
|
|
270
|
+
style: {
|
|
271
|
+
marginBottom: '1.5rem'
|
|
272
|
+
},
|
|
273
|
+
children: /*#__PURE__*/ _jsx("p", {
|
|
274
|
+
children: "Email Events"
|
|
275
|
+
})
|
|
276
|
+
}),
|
|
277
|
+
(!activity || activity.length === 0) && /*#__PURE__*/ _jsx("div", {
|
|
278
|
+
children: /*#__PURE__*/ _jsx("p", {
|
|
279
|
+
style: {
|
|
280
|
+
color: 'var(--theme-text-secondary-color)',
|
|
281
|
+
fontSize: '12px'
|
|
282
|
+
},
|
|
283
|
+
children: "No email events recorded."
|
|
284
|
+
})
|
|
285
|
+
}),
|
|
286
|
+
activity?.map((event, index)=>/*#__PURE__*/ _jsxs("div", {
|
|
287
|
+
style: {
|
|
288
|
+
alignItems: 'flex-start',
|
|
289
|
+
display: 'flex',
|
|
290
|
+
position: 'relative'
|
|
291
|
+
},
|
|
292
|
+
children: [
|
|
293
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
294
|
+
style: {
|
|
295
|
+
alignItems: 'center',
|
|
296
|
+
display: 'flex',
|
|
297
|
+
flexDirection: 'column',
|
|
298
|
+
marginRight: '16px'
|
|
299
|
+
},
|
|
300
|
+
children: [
|
|
301
|
+
/*#__PURE__*/ _jsx("div", {
|
|
302
|
+
style: {
|
|
303
|
+
alignItems: 'center',
|
|
304
|
+
border: '1px solid var(--theme-border-color)',
|
|
305
|
+
borderRadius: 'var(--style-radius-m)',
|
|
306
|
+
display: 'flex',
|
|
307
|
+
fontSize: '10px',
|
|
308
|
+
height: '34px',
|
|
309
|
+
justifyContent: 'center',
|
|
310
|
+
width: '34px',
|
|
311
|
+
zIndex: 1
|
|
312
|
+
},
|
|
313
|
+
children: getIconForEventType(event.type)
|
|
314
|
+
}),
|
|
315
|
+
index < activity.length - 1 && /*#__PURE__*/ _jsx("div", {
|
|
316
|
+
style: {
|
|
317
|
+
backgroundColor: 'var(--theme-border-color)',
|
|
318
|
+
height: '40px',
|
|
319
|
+
width: '1px'
|
|
320
|
+
}
|
|
321
|
+
})
|
|
322
|
+
]
|
|
323
|
+
}),
|
|
324
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
325
|
+
style: {
|
|
326
|
+
marginTop: '-2px',
|
|
327
|
+
paddingBottom: '16px'
|
|
328
|
+
},
|
|
329
|
+
children: [
|
|
330
|
+
/*#__PURE__*/ _jsx("p", {
|
|
331
|
+
style: {
|
|
332
|
+
fontSize: '12px',
|
|
333
|
+
fontWeight: 'bold',
|
|
334
|
+
textTransform: 'capitalize'
|
|
335
|
+
},
|
|
336
|
+
children: event.type.replace('_', ' ')
|
|
337
|
+
}),
|
|
338
|
+
/*#__PURE__*/ _jsx("p", {
|
|
339
|
+
style: {
|
|
340
|
+
color: 'var(--theme-text-secondary-color)',
|
|
341
|
+
fontSize: '12px'
|
|
342
|
+
},
|
|
343
|
+
children: new Date(event.timestamp).toLocaleString('en-US', {
|
|
344
|
+
day: 'numeric',
|
|
345
|
+
hour: '2-digit',
|
|
346
|
+
minute: '2-digit',
|
|
347
|
+
month: 'long',
|
|
348
|
+
year: 'numeric'
|
|
349
|
+
})
|
|
350
|
+
})
|
|
351
|
+
]
|
|
352
|
+
})
|
|
353
|
+
]
|
|
354
|
+
}, event.id ?? index))
|
|
355
|
+
]
|
|
356
|
+
});
|
|
357
|
+
};
|
|
358
|
+
|
|
359
|
+
//# sourceMappingURL=email-activity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/email-activity.tsx"],"sourcesContent":["import React from 'react'\n\ninterface EmailEvent {\n id?: string\n timestamp: string\n type:\n | 'bounced'\n | 'canceled'\n | 'clicked'\n | 'complained'\n | 'delivered'\n | 'delivery_delayed'\n | 'failed'\n | 'opened'\n | 'queued'\n | 'sent'\n}\n\nfunction getIconForEventType(type: EmailEvent['type']): React.ReactNode {\n switch (type) {\n case 'bounced':\n return (\n <svg\n fill=\"none\"\n height=\"14\"\n stroke=\"var(--theme-elevation-500)\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width=\"14\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M11.1 7.1a16.55 16.55 0 0 1 10.9 4\" />\n <path d=\"M12 12a12.6 12.6 0 0 1-8.7 5\" />\n <path d=\"M16.8 13.6a16.55 16.55 0 0 1-9 7.5\" />\n <path d=\"M20.7 17a12.8 12.8 0 0 0-8.7-5 13.3 13.3 0 0 1 0-10\" />\n <path d=\"M6.3 3.8a16.55 16.55 0 0 0 1.9 11.5\" />\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n </svg>\n )\n case 'canceled':\n return (\n <svg\n fill=\"none\"\n height=\"14\"\n stroke=\"var(--theme-elevation-500)\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width=\"14\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"15\" x2=\"9\" y1=\"9\" y2=\"15\" />\n <line x1=\"9\" x2=\"15\" y1=\"9\" y2=\"15\" />\n </svg>\n )\n case 'clicked':\n return (\n <svg\n fill=\"none\"\n height=\"14\"\n stroke=\"var(--theme-elevation-500)\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width=\"14\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z\" />\n </svg>\n )\n case 'complained':\n return (\n <svg\n fill=\"none\"\n height=\"14\"\n stroke=\"var(--theme-elevation-500)\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width=\"14\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719\" />\n <path d=\"M12 8v4\" />\n <path d=\"M12 16h.01\" />\n </svg>\n )\n case 'delivered':\n return (\n <svg\n fill=\"none\"\n height=\"14\"\n stroke=\"var(--theme-elevation-500)\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width=\"14\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M22 17a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9.5C2 7 4 5 6.5 5H18c2.2 0 4 1.8 4 4v8Z\" />\n <polyline points=\"15,9 18,9 18,11\" />\n <path d=\"M6.5 5C9 5 11 7 11 9.5V17a2 2 0 0 1-2 2\" />\n <line x1=\"6\" x2=\"7\" y1=\"10\" y2=\"10\" />\n </svg>\n )\n case 'delivery_delayed':\n return (\n <svg\n fill=\"none\"\n height=\"14\"\n stroke=\"var(--theme-elevation-500)\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width=\"14\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M12 6v6l4 2\" />\n <path d=\"M20 12v5\" />\n <path d=\"M20 21h.01\" />\n <path d=\"M21.25 8.2A10 10 0 1 0 16 21.16\" />\n </svg>\n )\n case 'failed':\n return (\n <svg\n fill=\"none\"\n height=\"14\"\n stroke=\"var(--theme-elevation-500)\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width=\"14\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" />\n <path d=\"M12 9v4\" />\n <path d=\"M12 17h.01\" />\n </svg>\n )\n case 'opened':\n return (\n <svg\n fill=\"none\"\n height=\"14\"\n stroke=\"var(--theme-elevation-500)\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width=\"14\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M21.2 8.4c.5.38.8.97.8 1.6v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V10a2 2 0 0 1 .8-1.6l8-6a2 2 0 0 1 2.4 0l8 6Z\" />\n <path d=\"m22 10-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 10\" />\n </svg>\n )\n case 'queued':\n return (\n <svg\n fill=\"none\"\n height=\"14\"\n stroke=\"var(--theme-elevation-500)\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width=\"14\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M3 5h.01\" />\n <path d=\"M3 12h.01\" />\n <path d=\"M3 19h.01\" />\n <path d=\"M8 5h13\" />\n <path d=\"M8 12h13\" />\n <path d=\"M8 19h13\" />\n </svg>\n )\n case 'sent':\n return (\n <svg\n fill=\"none\"\n height=\"14\"\n stroke=\"var(--theme-elevation-500)\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width=\"14\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M3.714 3.048a.498.498 0 0 0-.683.627l2.843 7.627a2 2 0 0 1 0 1.396l-2.842 7.627a.498.498 0 0 0 .682.627l18-8.5a.5.5 0 0 0 0-.904z\" />\n <path d=\"M6 12h16\" />\n </svg>\n )\n default:\n return null\n }\n}\n\nexport const EmailActivityField = ({ data }: { data: Record<string, unknown> }) => {\n const activity = data.activity as EmailEvent[] | undefined\n\n return (\n <div style={{ paddingTop: '1rem' }}>\n <div style={{ marginBottom: '1.5rem' }}>\n <p>Email Events</p>\n </div>\n {(!activity || activity.length === 0) && (\n <div>\n <p style={{ color: 'var(--theme-text-secondary-color)', fontSize: '12px' }}>\n No email events recorded.\n </p>\n </div>\n )}\n {activity?.map((event, index) => (\n <div\n key={event.id ?? index}\n style={{ alignItems: 'flex-start', display: 'flex', position: 'relative' }}\n >\n <div\n style={{\n alignItems: 'center',\n display: 'flex',\n flexDirection: 'column',\n marginRight: '16px',\n }}\n >\n <div\n style={{\n alignItems: 'center',\n border: '1px solid var(--theme-border-color)',\n borderRadius: 'var(--style-radius-m)',\n display: 'flex',\n fontSize: '10px',\n height: '34px',\n justifyContent: 'center',\n width: '34px',\n zIndex: 1,\n }}\n >\n {getIconForEventType(event.type)}\n </div>\n {index < activity.length - 1 && (\n <div\n style={{\n backgroundColor: 'var(--theme-border-color)',\n height: '40px',\n width: '1px',\n }}\n />\n )}\n </div>\n <div style={{ marginTop: '-2px', paddingBottom: '16px' }}>\n <p style={{ fontSize: '12px', fontWeight: 'bold', textTransform: 'capitalize' }}>\n {event.type.replace('_', ' ')}\n </p>\n <p style={{ color: 'var(--theme-text-secondary-color)', fontSize: '12px' }}>\n {new Date(event.timestamp).toLocaleString('en-US', {\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n month: 'long',\n year: 'numeric',\n })}\n </p>\n </div>\n </div>\n ))}\n </div>\n )\n}\n"],"names":["React","getIconForEventType","type","svg","fill","height","stroke","strokeLinecap","strokeLinejoin","strokeWidth","viewBox","width","xmlns","path","d","circle","cx","cy","r","line","x1","x2","y1","y2","polyline","points","EmailActivityField","data","activity","div","style","paddingTop","marginBottom","p","length","color","fontSize","map","event","index","alignItems","display","position","flexDirection","marginRight","border","borderRadius","justifyContent","zIndex","backgroundColor","marginTop","paddingBottom","fontWeight","textTransform","replace","Date","timestamp","toLocaleString","day","hour","minute","month","year","id"],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useFormFields } from '@payloadcms/ui';
|
|
4
|
+
import React from 'react';
|
|
5
|
+
export const EmailPreviewField = ()=>{
|
|
6
|
+
const htmlField = useFormFields(([fields])=>{
|
|
7
|
+
return fields['html'];
|
|
8
|
+
});
|
|
9
|
+
const value = htmlField?.value;
|
|
10
|
+
if (!value) {
|
|
11
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
12
|
+
className: "field-type text",
|
|
13
|
+
style: {
|
|
14
|
+
flex: '1 1 auto'
|
|
15
|
+
},
|
|
16
|
+
children: [
|
|
17
|
+
/*#__PURE__*/ _jsxs("label", {
|
|
18
|
+
className: "field-label",
|
|
19
|
+
htmlFor: "email-preview",
|
|
20
|
+
children: [
|
|
21
|
+
"Email Preview ",
|
|
22
|
+
/*#__PURE__*/ _jsx("span", {
|
|
23
|
+
className: "required",
|
|
24
|
+
children: "*"
|
|
25
|
+
})
|
|
26
|
+
]
|
|
27
|
+
}),
|
|
28
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
29
|
+
className: "field-type__wrap",
|
|
30
|
+
children: [
|
|
31
|
+
/*#__PURE__*/ _jsx("input", {
|
|
32
|
+
id: "email-preview",
|
|
33
|
+
type: "hidden"
|
|
34
|
+
}),
|
|
35
|
+
/*#__PURE__*/ _jsx("div", {
|
|
36
|
+
style: {
|
|
37
|
+
backgroundColor: 'var(--theme-input-bg)',
|
|
38
|
+
border: '1px solid var(--theme-elevation-150)',
|
|
39
|
+
borderRadius: 'var(--style-radius-s)',
|
|
40
|
+
display: 'block',
|
|
41
|
+
minHeight: '400px',
|
|
42
|
+
width: '100%'
|
|
43
|
+
},
|
|
44
|
+
title: "Email Preview",
|
|
45
|
+
children: "No email content available"
|
|
46
|
+
})
|
|
47
|
+
]
|
|
48
|
+
})
|
|
49
|
+
]
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
53
|
+
className: "field-type text",
|
|
54
|
+
style: {
|
|
55
|
+
flex: '1 1 auto'
|
|
56
|
+
},
|
|
57
|
+
children: [
|
|
58
|
+
/*#__PURE__*/ _jsxs("label", {
|
|
59
|
+
className: "field-label",
|
|
60
|
+
htmlFor: "email-preview",
|
|
61
|
+
children: [
|
|
62
|
+
"Email Preview ",
|
|
63
|
+
/*#__PURE__*/ _jsx("span", {
|
|
64
|
+
className: "required",
|
|
65
|
+
children: "*"
|
|
66
|
+
})
|
|
67
|
+
]
|
|
68
|
+
}),
|
|
69
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
70
|
+
className: "field-type__wrap",
|
|
71
|
+
children: [
|
|
72
|
+
/*#__PURE__*/ _jsx("input", {
|
|
73
|
+
id: "email-preview",
|
|
74
|
+
type: "hidden"
|
|
75
|
+
}),
|
|
76
|
+
/*#__PURE__*/ _jsx("iframe", {
|
|
77
|
+
sandbox: "allow-same-origin",
|
|
78
|
+
srcDoc: value,
|
|
79
|
+
style: {
|
|
80
|
+
backgroundColor: 'var(--theme-input-bg)',
|
|
81
|
+
border: '1px solid var(--theme-elevation-150)',
|
|
82
|
+
borderRadius: 'var(--style-radius-s)',
|
|
83
|
+
display: 'block',
|
|
84
|
+
height: '100vh',
|
|
85
|
+
width: '100%'
|
|
86
|
+
},
|
|
87
|
+
title: "Email Preview"
|
|
88
|
+
})
|
|
89
|
+
]
|
|
90
|
+
})
|
|
91
|
+
]
|
|
92
|
+
});
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
//# sourceMappingURL=email-preview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/email-preview.tsx"],"sourcesContent":["'use client'\nimport { useFormFields } from '@payloadcms/ui'\nimport React from 'react'\n\nexport const EmailPreviewField: React.FC = () => {\n const htmlField = useFormFields(([fields]) => {\n return fields['html']\n })\n const value = htmlField?.value as string\n\n if (!value) {\n return (\n <div\n className=\"field-type text\"\n style={{\n flex: '1 1 auto',\n }}\n >\n <label className=\"field-label\" htmlFor=\"email-preview\">\n Email Preview <span className=\"required\">*</span>\n </label>\n <div className=\"field-type__wrap\">\n <input id=\"email-preview\" type=\"hidden\" />\n <div\n style={{\n backgroundColor: 'var(--theme-input-bg)',\n border: '1px solid var(--theme-elevation-150)',\n borderRadius: 'var(--style-radius-s)',\n display: 'block',\n minHeight: '400px',\n width: '100%',\n }}\n title=\"Email Preview\"\n >\n No email content available\n </div>\n </div>\n </div>\n )\n }\n\n return (\n <div\n className=\"field-type text\"\n style={{\n flex: '1 1 auto',\n }}\n >\n <label className=\"field-label\" htmlFor=\"email-preview\">\n Email Preview <span className=\"required\">*</span>\n </label>\n <div className=\"field-type__wrap\">\n <input id=\"email-preview\" type=\"hidden\" />\n <iframe\n sandbox=\"allow-same-origin\"\n srcDoc={value}\n style={{\n backgroundColor: 'var(--theme-input-bg)',\n border: '1px solid var(--theme-elevation-150)',\n borderRadius: 'var(--style-radius-s)',\n display: 'block',\n height: '100vh',\n width: '100%',\n }}\n title=\"Email Preview\"\n />\n </div>\n </div>\n )\n}\n"],"names":["useFormFields","React","EmailPreviewField","htmlField","fields","value","div","className","style","flex","label","htmlFor","span","input","id","type","backgroundColor","border","borderRadius","display","minHeight","width","title","iframe","sandbox","srcDoc","height"],"mappings":"AAAA;;AACA,SAASA,aAAa,QAAQ,iBAAgB;AAC9C,OAAOC,WAAW,QAAO;AAEzB,OAAO,MAAMC,oBAA8B;IACzC,MAAMC,YAAYH,cAAc,CAAC,CAACI,OAAO;QACvC,OAAOA,MAAM,CAAC,OAAO;IACvB;IACA,MAAMC,QAAQF,WAAWE;IAEzB,IAAI,CAACA,OAAO;QACV,qBACE,MAACC;YACCC,WAAU;YACVC,OAAO;gBACLC,MAAM;YACR;;8BAEA,MAACC;oBAAMH,WAAU;oBAAcI,SAAQ;;wBAAgB;sCACvC,KAACC;4BAAKL,WAAU;sCAAW;;;;8BAE3C,MAACD;oBAAIC,WAAU;;sCACb,KAACM;4BAAMC,IAAG;4BAAgBC,MAAK;;sCAC/B,KAACT;4BACCE,OAAO;gCACLQ,iBAAiB;gCACjBC,QAAQ;gCACRC,cAAc;gCACdC,SAAS;gCACTC,WAAW;gCACXC,OAAO;4BACT;4BACAC,OAAM;sCACP;;;;;;IAMT;IAEA,qBACE,MAAChB;QACCC,WAAU;QACVC,OAAO;YACLC,MAAM;QACR;;0BAEA,MAACC;gBAAMH,WAAU;gBAAcI,SAAQ;;oBAAgB;kCACvC,KAACC;wBAAKL,WAAU;kCAAW;;;;0BAE3C,MAACD;gBAAIC,WAAU;;kCACb,KAACM;wBAAMC,IAAG;wBAAgBC,MAAK;;kCAC/B,KAACQ;wBACCC,SAAQ;wBACRC,QAAQpB;wBACRG,OAAO;4BACLQ,iBAAiB;4BACjBC,QAAQ;4BACRC,cAAc;4BACdC,SAAS;4BACTO,QAAQ;4BACRL,OAAO;wBACT;wBACAC,OAAM;;;;;;AAKhB,EAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { PayloadHandler } from 'payload';
|
|
2
|
+
/**
|
|
3
|
+
* Creates the send-broadcast endpoint handler.
|
|
4
|
+
*
|
|
5
|
+
* Initiates sending a broadcast by validating the broadcast is in draft status,
|
|
6
|
+
* counting eligible contacts, and updating the status to 'sending'. The actual
|
|
7
|
+
* email delivery is handled by the send-broadcasts scheduled task.
|
|
8
|
+
*/
|
|
9
|
+
export declare const sendBroadcastHandler: () => PayloadHandler;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { ErrorCodes, errorResponse, successResponse } from '../utils/api-response.js';
|
|
2
|
+
/**
|
|
3
|
+
* Validates the request body contains a valid broadcastId.
|
|
4
|
+
*/ function validateRequestBody(body) {
|
|
5
|
+
if (!body.broadcastId) {
|
|
6
|
+
return {
|
|
7
|
+
error: 'broadcastId is required',
|
|
8
|
+
success: false
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
return {
|
|
12
|
+
broadcastId: body.broadcastId,
|
|
13
|
+
success: true
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Fetches a broadcast by ID.
|
|
18
|
+
* Returns null if the broadcast doesn't exist.
|
|
19
|
+
*/ async function findBroadcastById(payload, broadcastId) {
|
|
20
|
+
try {
|
|
21
|
+
const broadcast = await payload.findByID({
|
|
22
|
+
id: broadcastId,
|
|
23
|
+
collection: 'broadcasts'
|
|
24
|
+
});
|
|
25
|
+
return broadcast;
|
|
26
|
+
} catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Builds the where clause for counting eligible contacts.
|
|
32
|
+
* Adds tag filtering if the broadcast targets specific tags.
|
|
33
|
+
*/ function buildContactsWhereClause(broadcast) {
|
|
34
|
+
const whereClause = {
|
|
35
|
+
emailOptIn: {
|
|
36
|
+
equals: true
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
if (broadcast.to === 'tags' && Array.isArray(broadcast.tags) && broadcast.tags.length > 0) {
|
|
40
|
+
const tagIds = broadcast.tags.map((t)=>typeof t === 'object' ? t.id : t);
|
|
41
|
+
whereClause.tags = {
|
|
42
|
+
in: tagIds
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return whereClause;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Creates the send-broadcast endpoint handler.
|
|
49
|
+
*
|
|
50
|
+
* Initiates sending a broadcast by validating the broadcast is in draft status,
|
|
51
|
+
* counting eligible contacts, and updating the status to 'sending'. The actual
|
|
52
|
+
* email delivery is handled by the send-broadcasts scheduled task.
|
|
53
|
+
*/ export const sendBroadcastHandler = ()=>{
|
|
54
|
+
return async (req)=>{
|
|
55
|
+
const { payload } = req;
|
|
56
|
+
const logger = payload.logger;
|
|
57
|
+
if (!req.json) {
|
|
58
|
+
return errorResponse(ErrorCodes.BAD_REQUEST, 'No JSON body provided', 400);
|
|
59
|
+
}
|
|
60
|
+
if (!req.user) {
|
|
61
|
+
return errorResponse(ErrorCodes.UNAUTHORIZED, 'Unauthorized', 401);
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
const body = await req.json();
|
|
65
|
+
const validation = validateRequestBody(body);
|
|
66
|
+
if (!validation.success) {
|
|
67
|
+
logger.error(validation.error);
|
|
68
|
+
return errorResponse(ErrorCodes.BAD_REQUEST, validation.error, 400);
|
|
69
|
+
}
|
|
70
|
+
const { broadcastId } = validation;
|
|
71
|
+
const broadcast = await findBroadcastById(payload, broadcastId);
|
|
72
|
+
if (!broadcast) {
|
|
73
|
+
logger.error(`Broadcast ${broadcastId} not found`);
|
|
74
|
+
return errorResponse(ErrorCodes.BROADCAST_NOT_FOUND, 'Broadcast not found', 404);
|
|
75
|
+
}
|
|
76
|
+
if (broadcast.status !== 'draft') {
|
|
77
|
+
logger.error(`Broadcast ${broadcastId} is not in draft status (current: ${broadcast.status})`);
|
|
78
|
+
return errorResponse(ErrorCodes.VALIDATION_ERROR, 'Broadcast must be in draft status to send', 400);
|
|
79
|
+
}
|
|
80
|
+
const whereClause = buildContactsWhereClause(broadcast);
|
|
81
|
+
const contactsCount = await payload.db.count({
|
|
82
|
+
collection: 'contacts',
|
|
83
|
+
where: whereClause
|
|
84
|
+
});
|
|
85
|
+
await payload.update({
|
|
86
|
+
id: broadcastId,
|
|
87
|
+
collection: 'broadcasts',
|
|
88
|
+
data: {
|
|
89
|
+
meta: {
|
|
90
|
+
contactsCount: contactsCount.totalDocs,
|
|
91
|
+
processedCount: 0
|
|
92
|
+
},
|
|
93
|
+
status: 'sending'
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
logger.info(`Broadcast ${broadcastId} queued for sending`);
|
|
97
|
+
return successResponse({
|
|
98
|
+
message: 'Broadcast queued for sending'
|
|
99
|
+
}, 200);
|
|
100
|
+
} catch (err) {
|
|
101
|
+
logger.error(err, 'Error occurred while queueing broadcast');
|
|
102
|
+
return errorResponse(ErrorCodes.INTERNAL_ERROR, 'Error queueing broadcast', 500);
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
//# sourceMappingURL=sendBroadcastHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/endpoints/sendBroadcastHandler.ts"],"sourcesContent":["import type { Payload, PayloadHandler, Where } from 'payload'\n\nimport { ErrorCodes, errorResponse, successResponse } from '../utils/api-response.js'\n\ntype SendBroadcastBody = {\n broadcastId?: unknown\n}\n\ntype Broadcast = {\n id: number | string\n status?: string\n tags?: Array<{ id: number | string } | number | string>\n to?: string\n}\n\n/**\n * Validates the request body contains a valid broadcastId.\n */\nfunction validateRequestBody(\n body: SendBroadcastBody,\n): { broadcastId: number | string; success: true } | { error: string; success: false } {\n if (!body.broadcastId) {\n return { error: 'broadcastId is required', success: false }\n }\n return { broadcastId: body.broadcastId as number | string, success: true }\n}\n\n/**\n * Fetches a broadcast by ID.\n * Returns null if the broadcast doesn't exist.\n */\nasync function findBroadcastById(\n payload: Payload,\n broadcastId: number | string,\n): Promise<Broadcast | null> {\n try {\n const broadcast = await payload.findByID({\n id: broadcastId,\n collection: 'broadcasts',\n })\n return broadcast as Broadcast | null\n } catch {\n return null\n }\n}\n\n/**\n * Builds the where clause for counting eligible contacts.\n * Adds tag filtering if the broadcast targets specific tags.\n */\nfunction buildContactsWhereClause(broadcast: Broadcast): Where {\n const whereClause: Where = {\n emailOptIn: { equals: true },\n }\n\n if (broadcast.to === 'tags' && Array.isArray(broadcast.tags) && broadcast.tags.length > 0) {\n const tagIds = broadcast.tags.map((t) => (typeof t === 'object' ? t.id : t))\n whereClause.tags = { in: tagIds }\n }\n\n return whereClause\n}\n\n/**\n * Creates the send-broadcast endpoint handler.\n *\n * Initiates sending a broadcast by validating the broadcast is in draft status,\n * counting eligible contacts, and updating the status to 'sending'. The actual\n * email delivery is handled by the send-broadcasts scheduled task.\n */\nexport const sendBroadcastHandler = (): PayloadHandler => {\n return async (req) => {\n const { payload } = req\n const logger = payload.logger\n\n if (!req.json) {\n return errorResponse(ErrorCodes.BAD_REQUEST, 'No JSON body provided', 400)\n }\n\n if (!req.user) {\n return errorResponse(ErrorCodes.UNAUTHORIZED, 'Unauthorized', 401)\n }\n\n try {\n const body = (await req.json()) as SendBroadcastBody\n\n const validation = validateRequestBody(body)\n if (!validation.success) {\n logger.error(validation.error)\n return errorResponse(ErrorCodes.BAD_REQUEST, validation.error, 400)\n }\n\n const { broadcastId } = validation\n\n const broadcast = await findBroadcastById(payload, broadcastId)\n\n if (!broadcast) {\n logger.error(`Broadcast ${broadcastId} not found`)\n return errorResponse(ErrorCodes.BROADCAST_NOT_FOUND, 'Broadcast not found', 404)\n }\n\n if (broadcast.status !== 'draft') {\n logger.error(`Broadcast ${broadcastId} is not in draft status (current: ${broadcast.status})`)\n return errorResponse(\n ErrorCodes.VALIDATION_ERROR,\n 'Broadcast must be in draft status to send',\n 400,\n )\n }\n\n const whereClause = buildContactsWhereClause(broadcast)\n\n const contactsCount = await payload.db.count({\n collection: 'contacts',\n where: whereClause,\n })\n\n await payload.update({\n id: broadcastId,\n collection: 'broadcasts',\n data: {\n meta: {\n contactsCount: contactsCount.totalDocs,\n processedCount: 0,\n },\n status: 'sending',\n },\n })\n\n logger.info(`Broadcast ${broadcastId} queued for sending`)\n\n return successResponse({ message: 'Broadcast queued for sending' }, 200)\n } catch (err) {\n logger.error(err, 'Error occurred while queueing broadcast')\n return errorResponse(ErrorCodes.INTERNAL_ERROR, 'Error queueing broadcast', 500)\n }\n }\n}\n"],"names":["ErrorCodes","errorResponse","successResponse","validateRequestBody","body","broadcastId","error","success","findBroadcastById","payload","broadcast","findByID","id","collection","buildContactsWhereClause","whereClause","emailOptIn","equals","to","Array","isArray","tags","length","tagIds","map","t","in","sendBroadcastHandler","req","logger","json","BAD_REQUEST","user","UNAUTHORIZED","validation","BROADCAST_NOT_FOUND","status","VALIDATION_ERROR","contactsCount","db","count","where","update","data","meta","totalDocs","processedCount","info","message","err","INTERNAL_ERROR"],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { PayloadHandler } from 'payload';
|
|
2
|
+
import type { MobilizehubPluginConfig } from '../types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Creates the send-test-email endpoint handler.
|
|
5
|
+
*
|
|
6
|
+
* Allows authenticated users to send a test email for a broadcast to a
|
|
7
|
+
* specified email address. Validates the broadcast exists and has all
|
|
8
|
+
* required fields before rendering and sending.
|
|
9
|
+
*/
|
|
10
|
+
export declare const sendTestEmailHandler: (config: Pick<MobilizehubPluginConfig, "email">) => PayloadHandler;
|