@mobilizehub/payload-plugin 0.1.0 → 0.3.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/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/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/pages/generatePagesCollection.d.ts +3 -0
- package/dist/collections/pages/generatePagesCollection.js +77 -0
- package/dist/collections/pages/generatePagesCollection.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/fields/name.d.ts +5 -0
- package/dist/fields/name.js +12 -0
- package/dist/fields/name.js.map +1 -0
- package/dist/fields/publishedAt.d.ts +5 -0
- package/dist/fields/publishedAt.js +16 -0
- package/dist/fields/publishedAt.js.map +1 -0
- package/dist/fields/slug.d.ts +7 -0
- package/dist/fields/slug.js +47 -0
- package/dist/fields/slug.js.map +1 -0
- package/dist/fields/status.d.ts +5 -0
- package/dist/fields/status.js +25 -0
- package/dist/fields/status.js.map +1 -0
- package/dist/index.js +48 -3
- 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 +133 -1
- package/dist/types/index.js.map +1 -1
- 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 +20 -9
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { Button, ConfirmationModal, toast, useDocumentInfo, useFormModified, useModal } from '@payloadcms/ui';
|
|
4
|
+
import React from 'react';
|
|
5
|
+
const apiEndpoint = '/api/send-broadcast';
|
|
6
|
+
export const SendBroadcastModal = ({ buttonLabel = 'Send broadcast', modalBody = 'Are you sure you want to send this broadcast?', modalSlug = 'send-broadcast-modal', modalTitle = 'Send Broadcast' })=>{
|
|
7
|
+
const { id, initialData } = useDocumentInfo();
|
|
8
|
+
const modified = useFormModified();
|
|
9
|
+
const isDraft = initialData?.status === 'draft';
|
|
10
|
+
const { toggleModal } = useModal();
|
|
11
|
+
if (!id) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
const handleOpenModal = ()=>{
|
|
15
|
+
toggleModal(modalSlug);
|
|
16
|
+
};
|
|
17
|
+
const handleConfirm = async ()=>{
|
|
18
|
+
await fetch(apiEndpoint, {
|
|
19
|
+
body: JSON.stringify({
|
|
20
|
+
broadcastId: id
|
|
21
|
+
}),
|
|
22
|
+
headers: {
|
|
23
|
+
'Content-Type': 'application/json'
|
|
24
|
+
},
|
|
25
|
+
method: 'POST'
|
|
26
|
+
});
|
|
27
|
+
toast.success('Broadcast queued for sending');
|
|
28
|
+
window.location.reload();
|
|
29
|
+
toggleModal(modalSlug);
|
|
30
|
+
};
|
|
31
|
+
return /*#__PURE__*/ _jsxs(_Fragment, {
|
|
32
|
+
children: [
|
|
33
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
34
|
+
disabled: modified || !isDraft,
|
|
35
|
+
onClick: handleOpenModal,
|
|
36
|
+
size: "medium",
|
|
37
|
+
children: buttonLabel
|
|
38
|
+
}),
|
|
39
|
+
/*#__PURE__*/ _jsx(ConfirmationModal, {
|
|
40
|
+
body: modalBody || /*#__PURE__*/ _jsx("p", {
|
|
41
|
+
children: "Are you sure you want to proceed with this action?"
|
|
42
|
+
}),
|
|
43
|
+
heading: modalTitle,
|
|
44
|
+
modalSlug: modalSlug,
|
|
45
|
+
onConfirm: handleConfirm
|
|
46
|
+
})
|
|
47
|
+
]
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
//# sourceMappingURL=broadcast-send-modal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/broadcast-send-modal.tsx"],"sourcesContent":["'use client'\n\nimport {\n Button,\n ConfirmationModal,\n toast,\n useDocumentInfo,\n useFormModified,\n useModal,\n} from '@payloadcms/ui'\nimport React from 'react'\n\ninterface SendBroadcastModalProps {\n buttonLabel?: string\n modalBody?: string\n modalSlug?: string\n modalTitle?: string\n}\n\nconst apiEndpoint = '/api/send-broadcast'\n\nexport const SendBroadcastModal: React.FC<SendBroadcastModalProps> = ({\n buttonLabel = 'Send broadcast',\n modalBody = 'Are you sure you want to send this broadcast?',\n modalSlug = 'send-broadcast-modal',\n modalTitle = 'Send Broadcast',\n}) => {\n const { id, initialData } = useDocumentInfo()\n const modified = useFormModified()\n\n const isDraft = initialData?.status === 'draft'\n\n const { toggleModal } = useModal()\n if (!id) {\n return null\n }\n\n const handleOpenModal = () => {\n toggleModal(modalSlug)\n }\n\n const handleConfirm = async () => {\n await fetch(apiEndpoint, {\n body: JSON.stringify({ broadcastId: id }),\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n\n toast.success('Broadcast queued for sending')\n window.location.reload()\n toggleModal(modalSlug)\n }\n\n return (\n <>\n <Button disabled={modified || !isDraft} onClick={handleOpenModal} size=\"medium\">\n {buttonLabel}\n </Button>\n\n <ConfirmationModal\n body={modalBody || <p>Are you sure you want to proceed with this action?</p>}\n heading={modalTitle}\n modalSlug={modalSlug}\n onConfirm={handleConfirm}\n />\n </>\n )\n}\n"],"names":["Button","ConfirmationModal","toast","useDocumentInfo","useFormModified","useModal","React","apiEndpoint","SendBroadcastModal","buttonLabel","modalBody","modalSlug","modalTitle","id","initialData","modified","isDraft","status","toggleModal","handleOpenModal","handleConfirm","fetch","body","JSON","stringify","broadcastId","headers","method","success","window","location","reload","disabled","onClick","size","p","heading","onConfirm"],"mappings":"AAAA;;AAEA,SACEA,MAAM,EACNC,iBAAiB,EACjBC,KAAK,EACLC,eAAe,EACfC,eAAe,EACfC,QAAQ,QACH,iBAAgB;AACvB,OAAOC,WAAW,QAAO;AASzB,MAAMC,cAAc;AAEpB,OAAO,MAAMC,qBAAwD,CAAC,EACpEC,cAAc,gBAAgB,EAC9BC,YAAY,+CAA+C,EAC3DC,YAAY,sBAAsB,EAClCC,aAAa,gBAAgB,EAC9B;IACC,MAAM,EAAEC,EAAE,EAAEC,WAAW,EAAE,GAAGX;IAC5B,MAAMY,WAAWX;IAEjB,MAAMY,UAAUF,aAAaG,WAAW;IAExC,MAAM,EAAEC,WAAW,EAAE,GAAGb;IACxB,IAAI,CAACQ,IAAI;QACP,OAAO;IACT;IAEA,MAAMM,kBAAkB;QACtBD,YAAYP;IACd;IAEA,MAAMS,gBAAgB;QACpB,MAAMC,MAAMd,aAAa;YACvBe,MAAMC,KAAKC,SAAS,CAAC;gBAAEC,aAAaZ;YAAG;YACvCa,SAAS;gBACP,gBAAgB;YAClB;YACAC,QAAQ;QACV;QAEAzB,MAAM0B,OAAO,CAAC;QACdC,OAAOC,QAAQ,CAACC,MAAM;QACtBb,YAAYP;IACd;IAEA,qBACE;;0BACE,KAACX;gBAAOgC,UAAUjB,YAAY,CAACC;gBAASiB,SAASd;gBAAiBe,MAAK;0BACpEzB;;0BAGH,KAACR;gBACCqB,MAAMZ,2BAAa,KAACyB;8BAAE;;gBACtBC,SAASxB;gBACTD,WAAWA;gBACX0B,WAAWjB;;;;AAInB,EAAC"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { Button, Drawer, toast, useDocumentInfo, useFormModified, useModal } from '@payloadcms/ui';
|
|
4
|
+
import React, { useCallback, useState } from 'react';
|
|
5
|
+
import { isValidEmail } from '../utils/email.js';
|
|
6
|
+
const apiEndpoint = '/api/send-test-email';
|
|
7
|
+
export const SendTestBroadcastDrawer = ({ buttonLabel = 'Test email' })=>{
|
|
8
|
+
const [email, setEmail] = useState('');
|
|
9
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
10
|
+
const [error, setError] = useState(null);
|
|
11
|
+
const { id, initialData } = useDocumentInfo();
|
|
12
|
+
const { toggleModal } = useModal();
|
|
13
|
+
const modified = useFormModified();
|
|
14
|
+
const isDraft = initialData?.status === 'draft';
|
|
15
|
+
const drawerSlug = 'test-broadcast-drawer';
|
|
16
|
+
const handleSendTest = useCallback(async ()=>{
|
|
17
|
+
setError(null);
|
|
18
|
+
if (!email) {
|
|
19
|
+
setError('Please enter an email address');
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (!isValidEmail(email)) {
|
|
23
|
+
setError('Please enter a valid email address');
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
setIsLoading(true);
|
|
27
|
+
try {
|
|
28
|
+
const response = await fetch(apiEndpoint, {
|
|
29
|
+
body: JSON.stringify({
|
|
30
|
+
broadcastId: id,
|
|
31
|
+
testEmail: email
|
|
32
|
+
}),
|
|
33
|
+
headers: {
|
|
34
|
+
'Content-Type': 'application/json'
|
|
35
|
+
},
|
|
36
|
+
method: 'POST'
|
|
37
|
+
});
|
|
38
|
+
const data = await response.json();
|
|
39
|
+
if (response.ok) {
|
|
40
|
+
setEmail(''); // Clear the input
|
|
41
|
+
toast.success('Test broadcast sent successfully');
|
|
42
|
+
toggleModal(drawerSlug);
|
|
43
|
+
} else {
|
|
44
|
+
toast.error('Failed to send test broadcast');
|
|
45
|
+
setError(data.message || 'Failed to send test broadcast');
|
|
46
|
+
}
|
|
47
|
+
} catch {
|
|
48
|
+
toast.error('Failed to send test broadcast');
|
|
49
|
+
setError('An error occurred while sending the test broadcast');
|
|
50
|
+
} finally{
|
|
51
|
+
setIsLoading(false);
|
|
52
|
+
}
|
|
53
|
+
}, [
|
|
54
|
+
email,
|
|
55
|
+
id,
|
|
56
|
+
toggleModal
|
|
57
|
+
]);
|
|
58
|
+
if (!id) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
return /*#__PURE__*/ _jsxs(_Fragment, {
|
|
62
|
+
children: [
|
|
63
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
64
|
+
disabled: !isDraft || modified,
|
|
65
|
+
onClick: ()=>toggleModal(drawerSlug),
|
|
66
|
+
size: "medium",
|
|
67
|
+
children: buttonLabel
|
|
68
|
+
}),
|
|
69
|
+
/*#__PURE__*/ _jsx(Drawer, {
|
|
70
|
+
slug: drawerSlug,
|
|
71
|
+
title: "Send Test",
|
|
72
|
+
children: /*#__PURE__*/ _jsxs("form", {
|
|
73
|
+
className: "form",
|
|
74
|
+
noValidate: true,
|
|
75
|
+
onSubmit: handleSendTest,
|
|
76
|
+
children: [
|
|
77
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
78
|
+
className: "render-fields",
|
|
79
|
+
children: [
|
|
80
|
+
error && /*#__PURE__*/ _jsx("div", {
|
|
81
|
+
className: "field-type",
|
|
82
|
+
style: {
|
|
83
|
+
backgroundColor: 'var(--theme-error-50)',
|
|
84
|
+
border: '1px solid var(--theme-error-500)',
|
|
85
|
+
borderRadius: '4px',
|
|
86
|
+
color: 'var(--theme-error-900)',
|
|
87
|
+
marginBottom: 'var(--base-unit)',
|
|
88
|
+
padding: '0.75rem'
|
|
89
|
+
},
|
|
90
|
+
children: error
|
|
91
|
+
}),
|
|
92
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
93
|
+
className: "field-type text",
|
|
94
|
+
children: [
|
|
95
|
+
/*#__PURE__*/ _jsxs("label", {
|
|
96
|
+
className: "field-label",
|
|
97
|
+
htmlFor: "field-test-email",
|
|
98
|
+
children: [
|
|
99
|
+
"Email Address",
|
|
100
|
+
/*#__PURE__*/ _jsx("span", {
|
|
101
|
+
className: "required",
|
|
102
|
+
children: "*"
|
|
103
|
+
})
|
|
104
|
+
]
|
|
105
|
+
}),
|
|
106
|
+
/*#__PURE__*/ _jsx("div", {
|
|
107
|
+
className: "field-type__wrap",
|
|
108
|
+
children: /*#__PURE__*/ _jsx("input", {
|
|
109
|
+
"aria-label": "Email address",
|
|
110
|
+
"data-rtl": "false",
|
|
111
|
+
disabled: isLoading,
|
|
112
|
+
id: "field-test-email",
|
|
113
|
+
name: "testEmail",
|
|
114
|
+
onChange: (e)=>{
|
|
115
|
+
setEmail(e.target.value);
|
|
116
|
+
setError(null);
|
|
117
|
+
},
|
|
118
|
+
placeholder: "name@example.com",
|
|
119
|
+
type: "email",
|
|
120
|
+
value: email
|
|
121
|
+
})
|
|
122
|
+
}),
|
|
123
|
+
/*#__PURE__*/ _jsx("div", {
|
|
124
|
+
className: "field-description field-description-testEmail",
|
|
125
|
+
children: "A test version of this broadcast will be sent to the email address above. The test email will be clearly marked as a test."
|
|
126
|
+
})
|
|
127
|
+
]
|
|
128
|
+
})
|
|
129
|
+
]
|
|
130
|
+
}),
|
|
131
|
+
/*#__PURE__*/ _jsx("div", {
|
|
132
|
+
className: "form-submit",
|
|
133
|
+
children: /*#__PURE__*/ _jsx("button", {
|
|
134
|
+
"aria-label": "Send test broadcast",
|
|
135
|
+
className: "btn btn--icon-style-without-border btn--size-medium btn--style-primary",
|
|
136
|
+
disabled: isLoading || !email,
|
|
137
|
+
type: "submit",
|
|
138
|
+
children: /*#__PURE__*/ _jsx("span", {
|
|
139
|
+
className: "btn__content",
|
|
140
|
+
children: /*#__PURE__*/ _jsx("span", {
|
|
141
|
+
className: "btn__label",
|
|
142
|
+
children: isLoading ? 'Sending...' : 'Send Test'
|
|
143
|
+
})
|
|
144
|
+
})
|
|
145
|
+
})
|
|
146
|
+
})
|
|
147
|
+
]
|
|
148
|
+
})
|
|
149
|
+
})
|
|
150
|
+
]
|
|
151
|
+
});
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
//# sourceMappingURL=broadcast-send-test-drawer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/broadcast-send-test-drawer.tsx"],"sourcesContent":["'use client'\n\nimport { Button, Drawer, toast, useDocumentInfo, useFormModified, useModal } from '@payloadcms/ui'\nimport React, { useCallback, useState } from 'react'\n\nimport { isValidEmail } from '../utils/email.js'\n\ninterface TestBroadcastDrawerProps {\n broadcastId?: string\n buttonLabel?: string\n}\n\nconst apiEndpoint = '/api/send-test-email'\n\nexport const SendTestBroadcastDrawer: React.FC<TestBroadcastDrawerProps> = ({\n buttonLabel = 'Test email',\n}) => {\n const [email, setEmail] = useState('')\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<null | string>(null)\n const { id, initialData } = useDocumentInfo()\n const { toggleModal } = useModal()\n const modified = useFormModified()\n\n const isDraft = initialData?.status === 'draft'\n\n const drawerSlug = 'test-broadcast-drawer'\n\n const handleSendTest = useCallback(async () => {\n setError(null)\n\n if (!email) {\n setError('Please enter an email address')\n return\n }\n\n if (!isValidEmail(email)) {\n setError('Please enter a valid email address')\n return\n }\n\n setIsLoading(true)\n\n try {\n const response = await fetch(apiEndpoint, {\n body: JSON.stringify({\n broadcastId: id,\n testEmail: email,\n }),\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n\n const data = await response.json()\n\n if (response.ok) {\n setEmail('') // Clear the input\n toast.success('Test broadcast sent successfully')\n toggleModal(drawerSlug)\n } else {\n toast.error('Failed to send test broadcast')\n setError(data.message || 'Failed to send test broadcast')\n }\n } catch {\n toast.error('Failed to send test broadcast')\n setError('An error occurred while sending the test broadcast')\n } finally {\n setIsLoading(false)\n }\n }, [email, id, toggleModal])\n\n if (!id) {\n return null\n }\n\n return (\n <>\n <Button disabled={!isDraft || modified} onClick={() => toggleModal(drawerSlug)} size=\"medium\">\n {buttonLabel}\n </Button>\n\n <Drawer slug={drawerSlug} title=\"Send Test\">\n <form className=\"form\" noValidate onSubmit={handleSendTest}>\n <div className=\"render-fields\">\n {error && (\n <div\n className=\"field-type\"\n style={{\n backgroundColor: 'var(--theme-error-50)',\n border: '1px solid var(--theme-error-500)',\n borderRadius: '4px',\n color: 'var(--theme-error-900)',\n marginBottom: 'var(--base-unit)',\n padding: '0.75rem',\n }}\n >\n {error}\n </div>\n )}\n\n <div className=\"field-type text\">\n <label className=\"field-label\" htmlFor=\"field-test-email\">\n Email Address\n <span className=\"required\">*</span>\n </label>\n <div className=\"field-type__wrap\">\n <input\n aria-label=\"Email address\"\n data-rtl=\"false\"\n disabled={isLoading}\n id=\"field-test-email\"\n name=\"testEmail\"\n onChange={(e) => {\n setEmail(e.target.value)\n setError(null)\n }}\n placeholder=\"name@example.com\"\n type=\"email\"\n value={email}\n />\n </div>\n <div className=\"field-description field-description-testEmail\">\n A test version of this broadcast will be sent to the email address above. The test\n email will be clearly marked as a test.\n </div>\n </div>\n </div>\n\n <div className=\"form-submit\">\n <button\n aria-label=\"Send test broadcast\"\n className=\"btn btn--icon-style-without-border btn--size-medium btn--style-primary\"\n disabled={isLoading || !email}\n type=\"submit\"\n >\n <span className=\"btn__content\">\n <span className=\"btn__label\">{isLoading ? 'Sending...' : 'Send Test'}</span>\n </span>\n </button>\n </div>\n </form>\n </Drawer>\n </>\n )\n}\n"],"names":["Button","Drawer","toast","useDocumentInfo","useFormModified","useModal","React","useCallback","useState","isValidEmail","apiEndpoint","SendTestBroadcastDrawer","buttonLabel","email","setEmail","isLoading","setIsLoading","error","setError","id","initialData","toggleModal","modified","isDraft","status","drawerSlug","handleSendTest","response","fetch","body","JSON","stringify","broadcastId","testEmail","headers","method","data","json","ok","success","message","disabled","onClick","size","slug","title","form","className","noValidate","onSubmit","div","style","backgroundColor","border","borderRadius","color","marginBottom","padding","label","htmlFor","span","input","aria-label","data-rtl","name","onChange","e","target","value","placeholder","type","button"],"mappings":"AAAA;;AAEA,SAASA,MAAM,EAAEC,MAAM,EAAEC,KAAK,EAAEC,eAAe,EAAEC,eAAe,EAAEC,QAAQ,QAAQ,iBAAgB;AAClG,OAAOC,SAASC,WAAW,EAAEC,QAAQ,QAAQ,QAAO;AAEpD,SAASC,YAAY,QAAQ,oBAAmB;AAOhD,MAAMC,cAAc;AAEpB,OAAO,MAAMC,0BAA8D,CAAC,EAC1EC,cAAc,YAAY,EAC3B;IACC,MAAM,CAACC,OAAOC,SAAS,GAAGN,SAAS;IACnC,MAAM,CAACO,WAAWC,aAAa,GAAGR,SAAS;IAC3C,MAAM,CAACS,OAAOC,SAAS,GAAGV,SAAwB;IAClD,MAAM,EAAEW,EAAE,EAAEC,WAAW,EAAE,GAAGjB;IAC5B,MAAM,EAAEkB,WAAW,EAAE,GAAGhB;IACxB,MAAMiB,WAAWlB;IAEjB,MAAMmB,UAAUH,aAAaI,WAAW;IAExC,MAAMC,aAAa;IAEnB,MAAMC,iBAAiBnB,YAAY;QACjCW,SAAS;QAET,IAAI,CAACL,OAAO;YACVK,SAAS;YACT;QACF;QAEA,IAAI,CAACT,aAAaI,QAAQ;YACxBK,SAAS;YACT;QACF;QAEAF,aAAa;QAEb,IAAI;YACF,MAAMW,WAAW,MAAMC,MAAMlB,aAAa;gBACxCmB,MAAMC,KAAKC,SAAS,CAAC;oBACnBC,aAAab;oBACbc,WAAWpB;gBACb;gBACAqB,SAAS;oBACP,gBAAgB;gBAClB;gBACAC,QAAQ;YACV;YAEA,MAAMC,OAAO,MAAMT,SAASU,IAAI;YAEhC,IAAIV,SAASW,EAAE,EAAE;gBACfxB,SAAS,KAAI,kBAAkB;gBAC/BZ,MAAMqC,OAAO,CAAC;gBACdlB,YAAYI;YACd,OAAO;gBACLvB,MAAMe,KAAK,CAAC;gBACZC,SAASkB,KAAKI,OAAO,IAAI;YAC3B;QACF,EAAE,OAAM;YACNtC,MAAMe,KAAK,CAAC;YACZC,SAAS;QACX,SAAU;YACRF,aAAa;QACf;IACF,GAAG;QAACH;QAAOM;QAAIE;KAAY;IAE3B,IAAI,CAACF,IAAI;QACP,OAAO;IACT;IAEA,qBACE;;0BACE,KAACnB;gBAAOyC,UAAU,CAAClB,WAAWD;gBAAUoB,SAAS,IAAMrB,YAAYI;gBAAakB,MAAK;0BAClF/B;;0BAGH,KAACX;gBAAO2C,MAAMnB;gBAAYoB,OAAM;0BAC9B,cAAA,MAACC;oBAAKC,WAAU;oBAAOC,UAAU;oBAACC,UAAUvB;;sCAC1C,MAACwB;4BAAIH,WAAU;;gCACZ9B,uBACC,KAACiC;oCACCH,WAAU;oCACVI,OAAO;wCACLC,iBAAiB;wCACjBC,QAAQ;wCACRC,cAAc;wCACdC,OAAO;wCACPC,cAAc;wCACdC,SAAS;oCACX;8CAECxC;;8CAIL,MAACiC;oCAAIH,WAAU;;sDACb,MAACW;4CAAMX,WAAU;4CAAcY,SAAQ;;gDAAmB;8DAExD,KAACC;oDAAKb,WAAU;8DAAW;;;;sDAE7B,KAACG;4CAAIH,WAAU;sDACb,cAAA,KAACc;gDACCC,cAAW;gDACXC,YAAS;gDACTtB,UAAU1B;gDACVI,IAAG;gDACH6C,MAAK;gDACLC,UAAU,CAACC;oDACTpD,SAASoD,EAAEC,MAAM,CAACC,KAAK;oDACvBlD,SAAS;gDACX;gDACAmD,aAAY;gDACZC,MAAK;gDACLF,OAAOvD;;;sDAGX,KAACqC;4CAAIH,WAAU;sDAAgD;;;;;;sCAOnE,KAACG;4BAAIH,WAAU;sCACb,cAAA,KAACwB;gCACCT,cAAW;gCACXf,WAAU;gCACVN,UAAU1B,aAAa,CAACF;gCACxByD,MAAK;0CAEL,cAAA,KAACV;oCAAKb,WAAU;8CACd,cAAA,KAACa;wCAAKb,WAAU;kDAAchC,YAAY,eAAe;;;;;;;;;;AAQzE,EAAC"}
|
|
@@ -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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"}
|