@aglyn/plugins-outreach 1.0.0-beta.143

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.
Files changed (282) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +93 -0
  3. package/package.json +52 -0
  4. package/src/index.d.ts +22 -0
  5. package/src/index.js +29 -0
  6. package/src/index.js.map +1 -0
  7. package/src/lib/components/compliance-section.d.ts +20 -0
  8. package/src/lib/components/compliance-section.js +291 -0
  9. package/src/lib/components/compliance-section.js.map +1 -0
  10. package/src/lib/components/enroll-dialog.d.ts +36 -0
  11. package/src/lib/components/enroll-dialog.js +656 -0
  12. package/src/lib/components/enroll-dialog.js.map +1 -0
  13. package/src/lib/components/enrollments-table.d.ts +28 -0
  14. package/src/lib/components/enrollments-table.js +375 -0
  15. package/src/lib/components/enrollments-table.js.map +1 -0
  16. package/src/lib/components/mailbox-card.d.ts +46 -0
  17. package/src/lib/components/mailbox-card.js +517 -0
  18. package/src/lib/components/mailbox-card.js.map +1 -0
  19. package/src/lib/components/mailboxes-section.d.ts +24 -0
  20. package/src/lib/components/mailboxes-section.js +258 -0
  21. package/src/lib/components/mailboxes-section.js.map +1 -0
  22. package/src/lib/components/outreach-console-page.d.ts +17 -0
  23. package/src/lib/components/outreach-console-page.js +81 -0
  24. package/src/lib/components/outreach-console-page.js.map +1 -0
  25. package/src/lib/components/outreach-console-sections.d.ts +43 -0
  26. package/src/lib/components/outreach-console-sections.js +55 -0
  27. package/src/lib/components/outreach-console-sections.js.map +1 -0
  28. package/src/lib/components/outreach-ui.d.ts +51 -0
  29. package/src/lib/components/outreach-ui.js +171 -0
  30. package/src/lib/components/outreach-ui.js.map +1 -0
  31. package/src/lib/components/send-window-fields.d.ts +25 -0
  32. package/src/lib/components/send-window-fields.js +178 -0
  33. package/src/lib/components/send-window-fields.js.map +1 -0
  34. package/src/lib/components/sequence-detail.d.ts +54 -0
  35. package/src/lib/components/sequence-detail.js +435 -0
  36. package/src/lib/components/sequence-detail.js.map +1 -0
  37. package/src/lib/components/sequence-editor.d.ts +37 -0
  38. package/src/lib/components/sequence-editor.js +485 -0
  39. package/src/lib/components/sequence-editor.js.map +1 -0
  40. package/src/lib/components/sequence-mailbox-picker.d.ts +44 -0
  41. package/src/lib/components/sequence-mailbox-picker.js +137 -0
  42. package/src/lib/components/sequence-mailbox-picker.js.map +1 -0
  43. package/src/lib/components/sequence-preview.d.ts +27 -0
  44. package/src/lib/components/sequence-preview.js +146 -0
  45. package/src/lib/components/sequence-preview.js.map +1 -0
  46. package/src/lib/components/sequence-step-card.d.ts +31 -0
  47. package/src/lib/components/sequence-step-card.js +326 -0
  48. package/src/lib/components/sequence-step-card.js.map +1 -0
  49. package/src/lib/components/sequences-section.d.ts +40 -0
  50. package/src/lib/components/sequences-section.js +310 -0
  51. package/src/lib/components/sequences-section.js.map +1 -0
  52. package/src/lib/components/use-outreach-api.d.ts +38 -0
  53. package/src/lib/components/use-outreach-api.js +139 -0
  54. package/src/lib/components/use-outreach-api.js.map +1 -0
  55. package/src/lib/components/use-outreach-crm.d.ts +50 -0
  56. package/src/lib/components/use-outreach-crm.js +200 -0
  57. package/src/lib/components/use-outreach-crm.js.map +1 -0
  58. package/src/lib/components/use-outreach-data.d.ts +55 -0
  59. package/src/lib/components/use-outreach-data.js +199 -0
  60. package/src/lib/components/use-outreach-data.js.map +1 -0
  61. package/src/lib/components/use-outreach-mailbox-api.d.ts +30 -0
  62. package/src/lib/components/use-outreach-mailbox-api.js +101 -0
  63. package/src/lib/components/use-outreach-mailbox-api.js.map +1 -0
  64. package/src/lib/components/use-outreach-mailboxes.d.ts +22 -0
  65. package/src/lib/components/use-outreach-mailboxes.js +68 -0
  66. package/src/lib/components/use-outreach-mailboxes.js.map +1 -0
  67. package/src/lib/components/use-outreach-settings.d.ts +17 -0
  68. package/src/lib/components/use-outreach-settings.js +64 -0
  69. package/src/lib/components/use-outreach-settings.js.map +1 -0
  70. package/src/lib/constants/api-routes.d.ts +68 -0
  71. package/src/lib/constants/api-routes.js +57 -0
  72. package/src/lib/constants/api-routes.js.map +1 -0
  73. package/src/lib/constants/bundle-common.d.ts +46 -0
  74. package/src/lib/constants/bundle-common.js +55 -0
  75. package/src/lib/constants/bundle-common.js.map +1 -0
  76. package/src/lib/constants/runtime-jobs.d.ts +24 -0
  77. package/src/lib/constants/runtime-jobs.js +24 -0
  78. package/src/lib/constants/runtime-jobs.js.map +1 -0
  79. package/src/lib/declarations.console-server.d.ts +38 -0
  80. package/src/lib/declarations.console-server.js +99 -0
  81. package/src/lib/declarations.console-server.js.map +1 -0
  82. package/src/lib/engine/compose.d.ts +86 -0
  83. package/src/lib/engine/compose.js +212 -0
  84. package/src/lib/engine/compose.js.map +1 -0
  85. package/src/lib/engine/delivery-status.d.ts +53 -0
  86. package/src/lib/engine/delivery-status.js +184 -0
  87. package/src/lib/engine/delivery-status.js.map +1 -0
  88. package/src/lib/engine/do-not-contact.d.ts +18 -0
  89. package/src/lib/engine/do-not-contact.js +34 -0
  90. package/src/lib/engine/do-not-contact.js.map +1 -0
  91. package/src/lib/engine/enrollment-state.d.ts +156 -0
  92. package/src/lib/engine/enrollment-state.js +303 -0
  93. package/src/lib/engine/enrollment-state.js.map +1 -0
  94. package/src/lib/engine/gates.d.ts +125 -0
  95. package/src/lib/engine/gates.js +232 -0
  96. package/src/lib/engine/gates.js.map +1 -0
  97. package/src/lib/engine/index.d.ts +28 -0
  98. package/src/lib/engine/index.js +33 -0
  99. package/src/lib/engine/index.js.map +1 -0
  100. package/src/lib/engine/mailbox-health.d.ts +49 -0
  101. package/src/lib/engine/mailbox-health.js +83 -0
  102. package/src/lib/engine/mailbox-health.js.map +1 -0
  103. package/src/lib/engine/opt-out-intent.d.ts +41 -0
  104. package/src/lib/engine/opt-out-intent.js +220 -0
  105. package/src/lib/engine/opt-out-intent.js.map +1 -0
  106. package/src/lib/engine/recipient-country.d.ts +41 -0
  107. package/src/lib/engine/recipient-country.js +171 -0
  108. package/src/lib/engine/recipient-country.js.map +1 -0
  109. package/src/lib/engine/schedule.d.ts +70 -0
  110. package/src/lib/engine/schedule.js +115 -0
  111. package/src/lib/engine/schedule.js.map +1 -0
  112. package/src/lib/engine/sending-capacity.d.ts +96 -0
  113. package/src/lib/engine/sending-capacity.js +172 -0
  114. package/src/lib/engine/sending-capacity.js.map +1 -0
  115. package/src/lib/engine/sequence-validation.d.ts +90 -0
  116. package/src/lib/engine/sequence-validation.js +291 -0
  117. package/src/lib/engine/sequence-validation.js.map +1 -0
  118. package/src/lib/engine/thread-classification.d.ts +78 -0
  119. package/src/lib/engine/thread-classification.js +224 -0
  120. package/src/lib/engine/thread-classification.js.map +1 -0
  121. package/src/lib/engine/thread-message.d.ts +80 -0
  122. package/src/lib/engine/thread-message.js +143 -0
  123. package/src/lib/engine/thread-message.js.map +1 -0
  124. package/src/lib/enrollment/enroll-people.d.ts +81 -0
  125. package/src/lib/enrollment/enroll-people.js +250 -0
  126. package/src/lib/enrollment/enroll-people.js.map +1 -0
  127. package/src/lib/enrollment/gate-lookups.d.ts +32 -0
  128. package/src/lib/enrollment/gate-lookups.js +154 -0
  129. package/src/lib/enrollment/gate-lookups.js.map +1 -0
  130. package/src/lib/mailboxes/mailbox-api.d.ts +126 -0
  131. package/src/lib/mailboxes/mailbox-api.js +66 -0
  132. package/src/lib/mailboxes/mailbox-api.js.map +1 -0
  133. package/src/lib/mailboxes/mailbox-credentials.d.ts +95 -0
  134. package/src/lib/mailboxes/mailbox-credentials.js +102 -0
  135. package/src/lib/mailboxes/mailbox-credentials.js.map +1 -0
  136. package/src/lib/mailboxes/mailbox-erasure.d.ts +69 -0
  137. package/src/lib/mailboxes/mailbox-erasure.js +148 -0
  138. package/src/lib/mailboxes/mailbox-erasure.js.map +1 -0
  139. package/src/lib/mailboxes/mailbox-gate.d.ts +75 -0
  140. package/src/lib/mailboxes/mailbox-gate.js +98 -0
  141. package/src/lib/mailboxes/mailbox-gate.js.map +1 -0
  142. package/src/lib/mailboxes/mailbox-revoke.d.ts +59 -0
  143. package/src/lib/mailboxes/mailbox-revoke.js +41 -0
  144. package/src/lib/mailboxes/mailbox-revoke.js.map +1 -0
  145. package/src/lib/mailboxes/mailbox-routes.d.ts +119 -0
  146. package/src/lib/mailboxes/mailbox-routes.js +605 -0
  147. package/src/lib/mailboxes/mailbox-routes.js.map +1 -0
  148. package/src/lib/mailboxes/mailbox-settings.d.ts +110 -0
  149. package/src/lib/mailboxes/mailbox-settings.js +212 -0
  150. package/src/lib/mailboxes/mailbox-settings.js.map +1 -0
  151. package/src/lib/mailboxes/mailbox-transport.d.ts +64 -0
  152. package/src/lib/mailboxes/mailbox-transport.js +94 -0
  153. package/src/lib/mailboxes/mailbox-transport.js.map +1 -0
  154. package/src/lib/mailboxes/oauth-redirect.d.ts +41 -0
  155. package/src/lib/mailboxes/oauth-redirect.js +63 -0
  156. package/src/lib/mailboxes/oauth-redirect.js.map +1 -0
  157. package/src/lib/mailboxes/oauth-state.d.ts +152 -0
  158. package/src/lib/mailboxes/oauth-state.js +212 -0
  159. package/src/lib/mailboxes/oauth-state.js.map +1 -0
  160. package/src/lib/mailboxes/outreach-config.d.ts +64 -0
  161. package/src/lib/mailboxes/outreach-config.js +77 -0
  162. package/src/lib/mailboxes/outreach-config.js.map +1 -0
  163. package/src/lib/mailboxes/register-mailbox-routes.d.ts +47 -0
  164. package/src/lib/mailboxes/register-mailbox-routes.js +135 -0
  165. package/src/lib/mailboxes/register-mailbox-routes.js.map +1 -0
  166. package/src/lib/model/compliance-settings.d.ts +78 -0
  167. package/src/lib/model/compliance-settings.js +155 -0
  168. package/src/lib/model/compliance-settings.js.map +1 -0
  169. package/src/lib/model/outreach-api.d.ts +210 -0
  170. package/src/lib/model/outreach-api.js +28 -0
  171. package/src/lib/model/outreach-api.js.map +1 -0
  172. package/src/lib/model/outreach.types.d.ts +563 -0
  173. package/src/lib/model/outreach.types.js +225 -0
  174. package/src/lib/model/outreach.types.js.map +1 -0
  175. package/src/lib/model/sequence-draft.d.ts +84 -0
  176. package/src/lib/model/sequence-draft.js +239 -0
  177. package/src/lib/model/sequence-draft.js.map +1 -0
  178. package/src/lib/model/step-preview.d.ts +45 -0
  179. package/src/lib/model/step-preview.js +98 -0
  180. package/src/lib/model/step-preview.js.map +1 -0
  181. package/src/lib/model/stored-records.d.ts +23 -0
  182. package/src/lib/model/stored-records.js +84 -0
  183. package/src/lib/model/stored-records.js.map +1 -0
  184. package/src/lib/plugin.d.ts +46 -0
  185. package/src/lib/plugin.js +86 -0
  186. package/src/lib/plugin.js.map +1 -0
  187. package/src/lib/routes/enroll-routes.d.ts +64 -0
  188. package/src/lib/routes/enroll-routes.js +350 -0
  189. package/src/lib/routes/enroll-routes.js.map +1 -0
  190. package/src/lib/routes/enrollment-routes.d.ts +19 -0
  191. package/src/lib/routes/enrollment-routes.js +171 -0
  192. package/src/lib/routes/enrollment-routes.js.map +1 -0
  193. package/src/lib/routes/platform-deps.d.ts +51 -0
  194. package/src/lib/routes/platform-deps.js +66 -0
  195. package/src/lib/routes/platform-deps.js.map +1 -0
  196. package/src/lib/routes/preview-routes.d.ts +33 -0
  197. package/src/lib/routes/preview-routes.js +117 -0
  198. package/src/lib/routes/preview-routes.js.map +1 -0
  199. package/src/lib/routes/register-routes.d.ts +22 -0
  200. package/src/lib/routes/register-routes.js +92 -0
  201. package/src/lib/routes/register-routes.js.map +1 -0
  202. package/src/lib/routes/route-deps.d.ts +49 -0
  203. package/src/lib/routes/route-deps.js +27 -0
  204. package/src/lib/routes/route-deps.js.map +1 -0
  205. package/src/lib/routes/route-gate.d.ts +94 -0
  206. package/src/lib/routes/route-gate.js +87 -0
  207. package/src/lib/routes/route-gate.js.map +1 -0
  208. package/src/lib/routes/route-http.d.ts +32 -0
  209. package/src/lib/routes/route-http.js +62 -0
  210. package/src/lib/routes/route-http.js.map +1 -0
  211. package/src/lib/routes/sequence-routes.d.ts +32 -0
  212. package/src/lib/routes/sequence-routes.js +359 -0
  213. package/src/lib/routes/sequence-routes.js.map +1 -0
  214. package/src/lib/routes/settings-routes.d.ts +30 -0
  215. package/src/lib/routes/settings-routes.js +73 -0
  216. package/src/lib/routes/settings-routes.js.map +1 -0
  217. package/src/lib/runtime/enrollment-events.d.ts +86 -0
  218. package/src/lib/runtime/enrollment-events.js +141 -0
  219. package/src/lib/runtime/enrollment-events.js.map +1 -0
  220. package/src/lib/runtime/fixtures/fake-gmail.d.ts +121 -0
  221. package/src/lib/runtime/fixtures/fake-gmail.js +312 -0
  222. package/src/lib/runtime/fixtures/fake-gmail.js.map +1 -0
  223. package/src/lib/runtime/mailbox-health-store.d.ts +47 -0
  224. package/src/lib/runtime/mailbox-health-store.js +168 -0
  225. package/src/lib/runtime/mailbox-health-store.js.map +1 -0
  226. package/src/lib/runtime/person-erasure.d.ts +39 -0
  227. package/src/lib/runtime/person-erasure.js +57 -0
  228. package/src/lib/runtime/person-erasure.js.map +1 -0
  229. package/src/lib/runtime/platform-runtime-deps.d.ts +29 -0
  230. package/src/lib/runtime/platform-runtime-deps.js +98 -0
  231. package/src/lib/runtime/platform-runtime-deps.js.map +1 -0
  232. package/src/lib/runtime/runtime-deps.d.ts +77 -0
  233. package/src/lib/runtime/runtime-deps.js +18 -0
  234. package/src/lib/runtime/runtime-deps.js.map +1 -0
  235. package/src/lib/runtime/send-job.d.ts +42 -0
  236. package/src/lib/runtime/send-job.js +780 -0
  237. package/src/lib/runtime/send-job.js.map +1 -0
  238. package/src/lib/runtime/sync-job.d.ts +41 -0
  239. package/src/lib/runtime/sync-job.js +480 -0
  240. package/src/lib/runtime/sync-job.js.map +1 -0
  241. package/src/lib/runtime/timeline.d.ts +67 -0
  242. package/src/lib/runtime/timeline.js +93 -0
  243. package/src/lib/runtime/timeline.js.map +1 -0
  244. package/src/lib/runtime/unsubscribe-link.d.ts +75 -0
  245. package/src/lib/runtime/unsubscribe-link.js +121 -0
  246. package/src/lib/runtime/unsubscribe-link.js.map +1 -0
  247. package/src/lib/runtime/unsubscribe-route.d.ts +24 -0
  248. package/src/lib/runtime/unsubscribe-route.js +103 -0
  249. package/src/lib/runtime/unsubscribe-route.js.map +1 -0
  250. package/src/lib/server.d.ts +53 -0
  251. package/src/lib/server.js +94 -0
  252. package/src/lib/server.js.map +1 -0
  253. package/src/lib/storage/compliance-settings-store.d.ts +44 -0
  254. package/src/lib/storage/compliance-settings-store.js +78 -0
  255. package/src/lib/storage/compliance-settings-store.js.map +1 -0
  256. package/src/lib/storage/do-not-contact-store.d.ts +60 -0
  257. package/src/lib/storage/do-not-contact-store.js +168 -0
  258. package/src/lib/storage/do-not-contact-store.js.map +1 -0
  259. package/src/lib/storage/outreach-records.d.ts +33 -0
  260. package/src/lib/storage/outreach-records.js +35 -0
  261. package/src/lib/storage/outreach-records.js.map +1 -0
  262. package/src/lib/subprocessors.d.ts +48 -0
  263. package/src/lib/subprocessors.js +70 -0
  264. package/src/lib/subprocessors.js.map +1 -0
  265. package/src/lib/transport/gmail-client.d.ts +145 -0
  266. package/src/lib/transport/gmail-client.js +229 -0
  267. package/src/lib/transport/gmail-client.js.map +1 -0
  268. package/src/lib/transport/gmail-errors.d.ts +84 -0
  269. package/src/lib/transport/gmail-errors.js +138 -0
  270. package/src/lib/transport/gmail-errors.js.map +1 -0
  271. package/src/lib/transport/google-oauth.d.ts +138 -0
  272. package/src/lib/transport/google-oauth.js +247 -0
  273. package/src/lib/transport/google-oauth.js.map +1 -0
  274. package/src/lib/transport/http.d.ts +53 -0
  275. package/src/lib/transport/http.js +79 -0
  276. package/src/lib/transport/http.js.map +1 -0
  277. package/src/lib/transport/rfc5322.d.ts +116 -0
  278. package/src/lib/transport/rfc5322.js +330 -0
  279. package/src/lib/transport/rfc5322.js.map +1 -0
  280. package/src/lib/transport/send-message.d.ts +69 -0
  281. package/src/lib/transport/send-message.js +77 -0
  282. package/src/lib/transport/send-message.js.map +1 -0
@@ -0,0 +1,137 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ 'use client';
17
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
18
+ import { Alert, MenuItem, Stack, TextField, Typography } from "@mui/material";
19
+ import { useEffect, useState } from "react";
20
+ import { OUTREACH_MAILBOX_STATUS_LABELS } from "../mailboxes/mailbox-settings.js";
21
+ import { outreachMailboxActivationIssue } from "../model/sequence-draft.js";
22
+ import { OutreachLink } from "./outreach-ui.js";
23
+ import { useOutreachMailboxApi } from "./use-outreach-mailbox-api.js";
24
+ /** A mailbox as its line in the menu reads: who mail is from, and any status that stops it sending. */ export function outreachMailboxOptionLabel(mailbox) {
25
+ var _OUTREACH_MAILBOX_STATUS_LABELS_mailbox_status;
26
+ var _mailbox_displayName;
27
+ const address = mailbox.sendAs || mailbox.email;
28
+ const name = (_mailbox_displayName = mailbox.displayName) == null ? void 0 : _mailbox_displayName.trim();
29
+ const from = name ? `${name} <${address}>` : address;
30
+ return mailbox.status === 'connected' ? from : `${from} — ${(_OUTREACH_MAILBOX_STATUS_LABELS_mailbox_status = OUTREACH_MAILBOX_STATUS_LABELS[mailbox.status]) != null ? _OUTREACH_MAILBOX_STATUS_LABELS_mailbox_status : mailbox.status}`;
31
+ }
32
+ /**
33
+ * The mailboxes a member may choose for a sequence: their own, or every
34
+ * one for an organization owner or admin — the two the save route lets
35
+ * send from a mailbox — never a disconnected one. The mailbox a sequence
36
+ * already names stays in the list whoever connected it, so the field never
37
+ * reads as empty.
38
+ */ export function outreachOfferedMailboxes(mailboxes, input) {
39
+ return mailboxes.filter((mailbox)=>mailbox.id === input.value || mailbox.status !== 'disconnected' && (input.canManageAll || input.uid !== null && mailbox.connectedByUid === input.uid));
40
+ }
41
+ /**
42
+ * The mailbox a sequence sends from (AGL-2980), chosen from the Mailboxes
43
+ * section's own listener and route (AGL-2978).
44
+ *
45
+ * Whether the member may choose a colleague's mailbox is the mailbox
46
+ * routes' answer (`availability().canManageAll`); until it arrives, or when
47
+ * it cannot be had, the member is offered their own, which is always
48
+ * allowed. A chosen mailbox that is paused or waiting to be reconnected can
49
+ * hold a draft, and the field says what activating will need.
50
+ */ export function OutreachSequenceMailboxPicker(props) {
51
+ var _offered_find, _ref, _props_error;
52
+ const { mailboxes, uid, value } = props;
53
+ const api = useOutreachMailboxApi(props.orgId);
54
+ const [canManageAll, setCanManageAll] = useState(false);
55
+ useEffect(()=>{
56
+ let current = true;
57
+ api.availability().then((answer)=>{
58
+ if (current) setCanManageAll(answer.canManageAll);
59
+ }).catch(()=>undefined);
60
+ return ()=>{
61
+ current = false;
62
+ };
63
+ }, [
64
+ api
65
+ ]);
66
+ if (mailboxes.status === 'loading') {
67
+ return /*#__PURE__*/ _jsx(TextField, {
68
+ label: "Mailbox",
69
+ value: "",
70
+ disabled: true,
71
+ helperText: "Loading mailboxes…",
72
+ fullWidth: true
73
+ });
74
+ }
75
+ if (mailboxes.status === 'error') {
76
+ return /*#__PURE__*/ _jsx(Alert, {
77
+ severity: "error",
78
+ children: "The mailboxes could not be loaded. Reload the page to try again."
79
+ });
80
+ }
81
+ const offered = outreachOfferedMailboxes(mailboxes.mailboxes, {
82
+ uid,
83
+ canManageAll,
84
+ value
85
+ });
86
+ if (!offered.length) {
87
+ return /*#__PURE__*/ _jsxs(Stack, {
88
+ spacing: 0.5,
89
+ children: [
90
+ /*#__PURE__*/ _jsx(Typography, {
91
+ variant: "subtitle2",
92
+ component: "p",
93
+ children: "Mailbox"
94
+ }),
95
+ /*#__PURE__*/ _jsx(Typography, {
96
+ variant: "body2",
97
+ color: "text.secondary",
98
+ children: "A sequence sends from your own connected mailbox, and you haven’t connected one yet."
99
+ }),
100
+ /*#__PURE__*/ _jsx(Typography, {
101
+ variant: "body2",
102
+ children: /*#__PURE__*/ _jsx(OutreachLink, {
103
+ href: props.mailboxesPath,
104
+ children: "Connect a mailbox in Mailboxes"
105
+ })
106
+ }),
107
+ props.error ? /*#__PURE__*/ _jsx(Typography, {
108
+ variant: "body2",
109
+ color: "error",
110
+ children: props.error
111
+ }) : null
112
+ ]
113
+ });
114
+ }
115
+ const chosen = (_offered_find = offered.find((mailbox)=>mailbox.id === value)) != null ? _offered_find : null;
116
+ // A chosen mailbox that cannot send, or one that no longer exists, says
117
+ // what activating the sequence will need.
118
+ const standing = value ? outreachMailboxActivationIssue(value, chosen) : null;
119
+ return /*#__PURE__*/ _jsx(TextField, {
120
+ select: true,
121
+ label: "Mailbox",
122
+ value: chosen ? value : '',
123
+ onChange: (event)=>props.onChange(event.target.value),
124
+ disabled: props.disabled,
125
+ error: Boolean(props.error),
126
+ helperText: (_ref = (_props_error = props.error) != null ? _props_error : standing == null ? void 0 : standing.message) != null ? _ref : 'Every email in the sequence is sent from it, in its sending hours and timezone.',
127
+ fullWidth: true,
128
+ children: offered.map((mailbox)=>/*#__PURE__*/ _jsx(MenuItem, {
129
+ value: mailbox.id,
130
+ children: outreachMailboxOptionLabel(mailbox)
131
+ }, mailbox.id))
132
+ });
133
+ }
134
+ OutreachSequenceMailboxPicker.displayName = 'OutreachSequenceMailboxPicker';
135
+ export default OutreachSequenceMailboxPicker;
136
+
137
+ //# sourceMappingURL=sequence-mailbox-picker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/outreach/src/lib/components/sequence-mailbox-picker.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport { Alert, MenuItem, Stack, TextField, Typography } from '@mui/material'\nimport { useEffect, useState } from 'react'\nimport { OUTREACH_MAILBOX_STATUS_LABELS } from '../mailboxes/mailbox-settings'\nimport type { OutreachMailbox } from '../model/outreach.types'\nimport { outreachMailboxActivationIssue } from '../model/sequence-draft'\nimport { OutreachLink } from './outreach-ui'\nimport { useOutreachMailboxApi } from './use-outreach-mailbox-api'\nimport type { OutreachMailboxesResult } from './use-outreach-mailboxes'\n\nexport interface OutreachSequenceMailboxPickerProps {\n orgId: string\n /** The member choosing, whose own mailboxes are offered. */\n uid: string | null\n /** The organization's mailboxes, from the Mailboxes section's own listener. */\n mailboxes: OutreachMailboxesResult\n /** The Mailboxes section, where a mailbox is connected, resumed or reconnected. */\n mailboxesPath: string\n value: string\n onChange(mailboxId: string): void\n error?: string\n disabled?: boolean\n}\n\n/** A mailbox as its line in the menu reads: who mail is from, and any status that stops it sending. */\nexport function outreachMailboxOptionLabel(mailbox: OutreachMailbox): string {\n const address = mailbox.sendAs || mailbox.email\n const name = mailbox.displayName?.trim()\n const from = name ? `${name} <${address}>` : address\n return mailbox.status === 'connected'\n ? from\n : `${from} — ${OUTREACH_MAILBOX_STATUS_LABELS[mailbox.status] ?? mailbox.status}`\n}\n\n/**\n * The mailboxes a member may choose for a sequence: their own, or every\n * one for an organization owner or admin — the two the save route lets\n * send from a mailbox — never a disconnected one. The mailbox a sequence\n * already names stays in the list whoever connected it, so the field never\n * reads as empty.\n */\nexport function outreachOfferedMailboxes(\n mailboxes: readonly OutreachMailbox[],\n input: { uid: string | null; canManageAll: boolean; value: string },\n): OutreachMailbox[] {\n return mailboxes.filter(\n (mailbox) =>\n mailbox.id === input.value ||\n (mailbox.status !== 'disconnected' &&\n (input.canManageAll || (input.uid !== null && mailbox.connectedByUid === input.uid))),\n )\n}\n\n/**\n * The mailbox a sequence sends from (AGL-2980), chosen from the Mailboxes\n * section's own listener and route (AGL-2978).\n *\n * Whether the member may choose a colleague's mailbox is the mailbox\n * routes' answer (`availability().canManageAll`); until it arrives, or when\n * it cannot be had, the member is offered their own, which is always\n * allowed. A chosen mailbox that is paused or waiting to be reconnected can\n * hold a draft, and the field says what activating will need.\n */\nexport function OutreachSequenceMailboxPicker(props: OutreachSequenceMailboxPickerProps) {\n const { mailboxes, uid, value } = props\n const api = useOutreachMailboxApi(props.orgId)\n const [canManageAll, setCanManageAll] = useState(false)\n\n useEffect(() => {\n let current = true\n api\n .availability()\n .then((answer) => {\n if (current) setCanManageAll(answer.canManageAll)\n })\n .catch(() => undefined)\n return () => {\n current = false\n }\n }, [api])\n\n if (mailboxes.status === 'loading') {\n return <TextField label=\"Mailbox\" value=\"\" disabled helperText=\"Loading mailboxes…\" fullWidth />\n }\n if (mailboxes.status === 'error') {\n return (\n <Alert severity=\"error\">The mailboxes could not be loaded. Reload the page to try again.</Alert>\n )\n }\n\n const offered = outreachOfferedMailboxes(mailboxes.mailboxes, { uid, canManageAll, value })\n if (!offered.length) {\n return (\n <Stack spacing={0.5}>\n <Typography variant=\"subtitle2\" component=\"p\">\n Mailbox\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n A sequence sends from your own connected mailbox, and you haven’t connected one yet.\n </Typography>\n <Typography variant=\"body2\">\n <OutreachLink href={props.mailboxesPath}>Connect a mailbox in Mailboxes</OutreachLink>\n </Typography>\n {props.error ? (\n <Typography variant=\"body2\" color=\"error\">\n {props.error}\n </Typography>\n ) : null}\n </Stack>\n )\n }\n\n const chosen = offered.find((mailbox) => mailbox.id === value) ?? null\n // A chosen mailbox that cannot send, or one that no longer exists, says\n // what activating the sequence will need.\n const standing = value ? outreachMailboxActivationIssue(value, chosen) : null\n return (\n <TextField\n select\n label=\"Mailbox\"\n value={chosen ? value : ''}\n onChange={(event) => props.onChange(event.target.value)}\n disabled={props.disabled}\n error={Boolean(props.error)}\n helperText={\n props.error ??\n standing?.message ??\n 'Every email in the sequence is sent from it, in its sending hours and timezone.'\n }\n fullWidth\n >\n {offered.map((mailbox) => (\n <MenuItem key={mailbox.id} value={mailbox.id}>\n {outreachMailboxOptionLabel(mailbox)}\n </MenuItem>\n ))}\n </TextField>\n )\n}\nOutreachSequenceMailboxPicker.displayName = 'OutreachSequenceMailboxPicker'\n\nexport default OutreachSequenceMailboxPicker\n"],"names":["Alert","MenuItem","Stack","TextField","Typography","useEffect","useState","OUTREACH_MAILBOX_STATUS_LABELS","outreachMailboxActivationIssue","OutreachLink","useOutreachMailboxApi","outreachMailboxOptionLabel","mailbox","address","sendAs","email","name","displayName","trim","from","status","outreachOfferedMailboxes","mailboxes","input","filter","id","value","canManageAll","uid","connectedByUid","OutreachSequenceMailboxPicker","props","offered","api","orgId","setCanManageAll","current","availability","then","answer","catch","undefined","label","disabled","helperText","fullWidth","severity","length","spacing","variant","component","color","href","mailboxesPath","error","chosen","find","standing","select","onChange","event","target","Boolean","message","map"],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { OutreachComplianceSettingsDocument, OutreachSequenceStep } from '../model/outreach.types';
2
+ import type { OutreachTemplateOption } from './use-outreach-crm';
3
+ import type { OutreachLoadStatus } from './use-outreach-data';
4
+ export interface OutreachSequencePreviewProps {
5
+ steps: readonly OutreachSequenceStep[];
6
+ /** The organization's footer fields; `null` until they are read. */
7
+ orgSettings: OutreachComplianceSettingsDocument | null;
8
+ orgSettingsStatus: OutreachLoadStatus;
9
+ templates: readonly OutreachTemplateOption[];
10
+ /** Who the email is from, as the mailbox says it. */
11
+ sender: {
12
+ name: string;
13
+ email: string;
14
+ } | null;
15
+ siteName: string;
16
+ }
17
+ /**
18
+ * The editor's live preview (AGL-2980): each email as it would reach a
19
+ * sample contact, written by the engine's own composer as the rep types —
20
+ * merge fields filled, the sample's personal line in place, and the real
21
+ * footer from the organization's compliance settings at the end.
22
+ */
23
+ export declare function OutreachSequencePreview(props: OutreachSequencePreviewProps): import("react").JSX.Element;
24
+ export declare namespace OutreachSequencePreview {
25
+ var displayName: string;
26
+ }
27
+ export default OutreachSequencePreview;
@@ -0,0 +1,146 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ 'use client';
17
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
18
+ import { pluginDocsHelp } from "@aglyn/aglyn";
19
+ import { crmMergeUnresolvedMessage } from "@aglyn/aglyn/app-utils/crm-email-templates";
20
+ import { CardDisplay } from "@aglyn/shared-ui-jsx";
21
+ import { Alert, Divider, MenuItem, Paper, Stack, TextField, Typography } from "@mui/material";
22
+ import { useMemo, useState } from "react";
23
+ import { OUTREACH_SAMPLE_PERSON, outreachSampleMergeContext, previewOutreachStep } from "../model/step-preview.js";
24
+ import { OutreachLoading } from "./outreach-ui.js";
25
+ /**
26
+ * The editor's live preview (AGL-2980): each email as it would reach a
27
+ * sample contact, written by the engine's own composer as the rep types —
28
+ * merge fields filled, the sample's personal line in place, and the real
29
+ * footer from the organization's compliance settings at the end.
30
+ */ export function OutreachSequencePreview(props) {
31
+ var _ref;
32
+ var _result_error;
33
+ const emails = props.steps.map((step, index)=>({
34
+ step,
35
+ index
36
+ })).filter(({ step })=>step.kind === 'email');
37
+ const [chosen, setChosen] = useState(0);
38
+ const selected = emails[Math.min(chosen, emails.length - 1)];
39
+ const result = useMemo(()=>{
40
+ var _ref;
41
+ var _props_templates_find;
42
+ if (!selected) return null;
43
+ const step = selected.step;
44
+ return previewOutreachStep({
45
+ steps: props.steps,
46
+ stepIndex: selected.index,
47
+ orgSettings: props.orgSettings,
48
+ merge: outreachSampleMergeContext({
49
+ sender: props.sender,
50
+ siteName: props.siteName
51
+ }),
52
+ email: OUTREACH_SAMPLE_PERSON.email,
53
+ personalLine: OUTREACH_SAMPLE_PERSON.personalLine,
54
+ templateBody: step.kind === 'email' && step.templateId ? (_ref = (_props_templates_find = props.templates.find((template)=>template.id === step.templateId)) == null ? void 0 : _props_templates_find.body) != null ? _ref : null : null
55
+ });
56
+ }, [
57
+ selected,
58
+ props.steps,
59
+ props.orgSettings,
60
+ props.sender,
61
+ props.siteName,
62
+ props.templates
63
+ ]);
64
+ return /*#__PURE__*/ _jsx(CardDisplay, {
65
+ header: "Preview",
66
+ subheader: `As ${OUTREACH_SAMPLE_PERSON.name} of ${OUTREACH_SAMPLE_PERSON.companyName} would get it`,
67
+ help: pluginDocsHelp('sequences', {
68
+ anchor: '#build-a-sequence'
69
+ }),
70
+ contentGutterX: true,
71
+ contentGutterY: true,
72
+ children: !selected ? /*#__PURE__*/ _jsx(Typography, {
73
+ variant: "body2",
74
+ color: "text.secondary",
75
+ children: "Add an email step to preview it."
76
+ }) : props.orgSettingsStatus === 'loading' ? /*#__PURE__*/ _jsx(OutreachLoading, {
77
+ label: "Loading your footer…"
78
+ }) : props.orgSettingsStatus !== 'ready' ? /*#__PURE__*/ _jsx(Alert, {
79
+ severity: "info",
80
+ children: "The preview needs your compliance settings, which couldn’t be read. It shows once they can be."
81
+ }) : /*#__PURE__*/ _jsxs(Stack, {
82
+ spacing: 1.5,
83
+ children: [
84
+ emails.length > 1 ? /*#__PURE__*/ _jsx(TextField, {
85
+ select: true,
86
+ size: "small",
87
+ label: "Email",
88
+ value: Math.min(chosen, emails.length - 1),
89
+ onChange: (event)=>setChosen(Number(event.target.value)),
90
+ children: emails.map((entry, position)=>/*#__PURE__*/ _jsx(MenuItem, {
91
+ value: position,
92
+ children: `Email ${position + 1} · step ${entry.index + 1}`
93
+ }, entry.step.id))
94
+ }) : null,
95
+ (result == null ? void 0 : result.email) ? /*#__PURE__*/ _jsx(Paper, {
96
+ variant: "outlined",
97
+ sx: {
98
+ p: 1.5
99
+ },
100
+ "aria-label": "Email preview",
101
+ children: /*#__PURE__*/ _jsxs(Stack, {
102
+ spacing: 1,
103
+ children: [
104
+ /*#__PURE__*/ _jsxs(Typography, {
105
+ variant: "body2",
106
+ children: [
107
+ /*#__PURE__*/ _jsxs(Typography, {
108
+ component: "span",
109
+ variant: "body2",
110
+ color: "text.secondary",
111
+ children: [
112
+ "Subject:",
113
+ ' '
114
+ ]
115
+ }),
116
+ result.email.subject
117
+ ]
118
+ }),
119
+ /*#__PURE__*/ _jsx(Divider, {}),
120
+ /*#__PURE__*/ _jsx(Typography, {
121
+ variant: "body2",
122
+ sx: {
123
+ whiteSpace: 'pre-wrap',
124
+ wordBreak: 'break-word'
125
+ },
126
+ children: result.email.text
127
+ })
128
+ ]
129
+ })
130
+ }) : /*#__PURE__*/ _jsx(Alert, {
131
+ severity: "info",
132
+ children: (_ref = result == null ? void 0 : (_result_error = result.error) == null ? void 0 : _result_error.message) != null ? _ref : 'This email can’t be previewed yet.'
133
+ }),
134
+ (result == null ? void 0 : result.email) && result.unresolvedFields.length ? /*#__PURE__*/ _jsx(Typography, {
135
+ variant: "caption",
136
+ color: "text.secondary",
137
+ children: `${crmMergeUnresolvedMessage(result.unresolvedFields)}. They're sent empty.`
138
+ }) : null
139
+ ]
140
+ })
141
+ });
142
+ }
143
+ OutreachSequencePreview.displayName = 'OutreachSequencePreview';
144
+ export default OutreachSequencePreview;
145
+
146
+ //# sourceMappingURL=sequence-preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/outreach/src/lib/components/sequence-preview.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport { pluginDocsHelp } from '@aglyn/aglyn'\nimport { crmMergeUnresolvedMessage } from '@aglyn/aglyn/app-utils/crm-email-templates'\nimport { CardDisplay } from '@aglyn/shared-ui-jsx'\nimport {\n Alert,\n Divider,\n MenuItem,\n Paper,\n Stack,\n TextField,\n Typography,\n} from '@mui/material'\nimport { useMemo, useState } from 'react'\nimport type {\n OutreachComplianceSettingsDocument,\n OutreachSequenceStep,\n} from '../model/outreach.types'\nimport {\n OUTREACH_SAMPLE_PERSON,\n outreachSampleMergeContext,\n previewOutreachStep,\n} from '../model/step-preview'\nimport { OutreachLoading } from './outreach-ui'\nimport type { OutreachTemplateOption } from './use-outreach-crm'\nimport type { OutreachLoadStatus } from './use-outreach-data'\n\nexport interface OutreachSequencePreviewProps {\n steps: readonly OutreachSequenceStep[]\n /** The organization's footer fields; `null` until they are read. */\n orgSettings: OutreachComplianceSettingsDocument | null\n orgSettingsStatus: OutreachLoadStatus\n templates: readonly OutreachTemplateOption[]\n /** Who the email is from, as the mailbox says it. */\n sender: { name: string; email: string } | null\n siteName: string\n}\n\n/**\n * The editor's live preview (AGL-2980): each email as it would reach a\n * sample contact, written by the engine's own composer as the rep types —\n * merge fields filled, the sample's personal line in place, and the real\n * footer from the organization's compliance settings at the end.\n */\nexport function OutreachSequencePreview(props: OutreachSequencePreviewProps) {\n const emails = props.steps\n .map((step, index) => ({ step, index }))\n .filter(({ step }) => step.kind === 'email')\n const [chosen, setChosen] = useState(0)\n const selected = emails[Math.min(chosen, emails.length - 1)]\n\n const result = useMemo(() => {\n if (!selected) return null\n const step = selected.step\n return previewOutreachStep({\n steps: props.steps,\n stepIndex: selected.index,\n orgSettings: props.orgSettings,\n merge: outreachSampleMergeContext({\n sender: props.sender,\n siteName: props.siteName,\n }),\n email: OUTREACH_SAMPLE_PERSON.email,\n personalLine: OUTREACH_SAMPLE_PERSON.personalLine,\n templateBody:\n step.kind === 'email' && step.templateId\n ? (props.templates.find((template) => template.id === step.templateId)\n ?.body ?? null)\n : null,\n })\n }, [\n selected,\n props.steps,\n props.orgSettings,\n props.sender,\n props.siteName,\n props.templates,\n ])\n\n return (\n <CardDisplay\n header=\"Preview\"\n subheader={`As ${OUTREACH_SAMPLE_PERSON.name} of ${OUTREACH_SAMPLE_PERSON.companyName} would get it`}\n help={pluginDocsHelp('sequences', { anchor: '#build-a-sequence' })}\n contentGutterX\n contentGutterY\n >\n {!selected ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n Add an email step to preview it.\n </Typography>\n ) : props.orgSettingsStatus === 'loading' ? (\n <OutreachLoading label=\"Loading your footer…\" />\n ) : props.orgSettingsStatus !== 'ready' ? (\n <Alert severity=\"info\">\n The preview needs your compliance settings, which couldn’t be read. It\n shows once they can be.\n </Alert>\n ) : (\n <Stack spacing={1.5}>\n {emails.length > 1 ? (\n <TextField\n select\n size=\"small\"\n label=\"Email\"\n value={Math.min(chosen, emails.length - 1)}\n onChange={(event) => setChosen(Number(event.target.value))}\n >\n {emails.map((entry, position) => (\n <MenuItem key={entry.step.id} value={position}>\n {`Email ${position + 1} · step ${entry.index + 1}`}\n </MenuItem>\n ))}\n </TextField>\n ) : null}\n {result?.email ? (\n <Paper\n variant=\"outlined\"\n sx={{ p: 1.5 }}\n aria-label=\"Email preview\"\n >\n <Stack spacing={1}>\n <Typography variant=\"body2\">\n <Typography\n component=\"span\"\n variant=\"body2\"\n color=\"text.secondary\"\n >\n Subject:{' '}\n </Typography>\n {result.email.subject}\n </Typography>\n <Divider />\n <Typography\n variant=\"body2\"\n sx={{ whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}\n >\n {result.email.text}\n </Typography>\n </Stack>\n </Paper>\n ) : (\n <Alert severity=\"info\">\n {result?.error?.message ?? 'This email can’t be previewed yet.'}\n </Alert>\n )}\n {result?.email && result.unresolvedFields.length ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {`${crmMergeUnresolvedMessage(result.unresolvedFields)}. They're sent empty.`}\n </Typography>\n ) : null}\n </Stack>\n )}\n </CardDisplay>\n )\n}\nOutreachSequencePreview.displayName = 'OutreachSequencePreview'\n\nexport default OutreachSequencePreview\n"],"names":["pluginDocsHelp","crmMergeUnresolvedMessage","CardDisplay","Alert","Divider","MenuItem","Paper","Stack","TextField","Typography","useMemo","useState","OUTREACH_SAMPLE_PERSON","outreachSampleMergeContext","previewOutreachStep","OutreachLoading","OutreachSequencePreview","props","result","emails","steps","map","step","index","filter","kind","chosen","setChosen","selected","Math","min","length","stepIndex","orgSettings","merge","sender","siteName","email","personalLine","templateBody","templateId","templates","find","template","id","body","header","subheader","name","companyName","help","anchor","contentGutterX","contentGutterY","variant","color","orgSettingsStatus","label","severity","spacing","select","size","value","onChange","event","Number","target","entry","position","sx","p","aria-label","component","subject","whiteSpace","wordBreak","text","error","message","unresolvedFields","displayName"],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { type OutreachSequenceStep } from '../model/outreach.types';
2
+ import type { OutreachTemplateOption } from './use-outreach-crm';
3
+ export interface OutreachStepCardProps {
4
+ step: OutreachSequenceStep;
5
+ /** Its position, from 0. */
6
+ index: number;
7
+ /** How many steps the sequence has, for the move controls. */
8
+ count: number;
9
+ /** Whether it is the sequence's first email, which always starts the thread. */
10
+ firstEmail: boolean;
11
+ /** Whether it is sent as a reply in the thread an earlier email started. */
12
+ inThread: boolean;
13
+ /** The subject the thread was started with, for an in-thread email's note. */
14
+ threadSubject: string;
15
+ templates: readonly OutreachTemplateOption[];
16
+ /** The issue to show beside each field, by the field's own name. */
17
+ issues: Partial<Record<string, string>>;
18
+ disabled?: boolean;
19
+ onChange(step: OutreachSequenceStep): void;
20
+ onMove(direction: -1 | 1): void;
21
+ onRemove(): void;
22
+ }
23
+ /**
24
+ * One step of the sequence editor (AGL-2980): an email — subject, body or a
25
+ * CRM template, merge fields, the wait before it — or a task for the rep.
26
+ */
27
+ export declare function OutreachStepCard(props: OutreachStepCardProps): import("react").JSX.Element;
28
+ export declare namespace OutreachStepCard {
29
+ var displayName: string;
30
+ }
31
+ export default OutreachStepCard;