@contentgrowth/content-emailing 0.7.9 → 0.8.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.
@@ -41,6 +41,10 @@ interface TemplateTesterProps {
41
41
  onSendTest: (data: TestEmailData) => Promise<void>;
42
42
  onCancel: () => void;
43
43
  sending?: boolean;
44
+ defaultValues?: {
45
+ to?: string;
46
+ variables?: Record<string, string>;
47
+ };
44
48
  }
45
49
  declare const TemplateTester: React.FC<TemplateTesterProps>;
46
50
 
@@ -71,6 +75,11 @@ interface TemplateManagerProps {
71
75
  description?: string;
72
76
  /** Template types for filtering and editor */
73
77
  templateTypes?: string[];
78
+ /** Default values for tester */
79
+ defaultTestValues?: {
80
+ to?: string;
81
+ variables?: Record<string, string>;
82
+ };
74
83
  }
75
84
  declare const TemplateManager: React.FC<TemplateManagerProps>;
76
85
 
@@ -41,6 +41,10 @@ interface TemplateTesterProps {
41
41
  onSendTest: (data: TestEmailData) => Promise<void>;
42
42
  onCancel: () => void;
43
43
  sending?: boolean;
44
+ defaultValues?: {
45
+ to?: string;
46
+ variables?: Record<string, string>;
47
+ };
44
48
  }
45
49
  declare const TemplateTester: React.FC<TemplateTesterProps>;
46
50
 
@@ -71,6 +75,11 @@ interface TemplateManagerProps {
71
75
  description?: string;
72
76
  /** Template types for filtering and editor */
73
77
  templateTypes?: string[];
78
+ /** Default values for tester */
79
+ defaultTestValues?: {
80
+ to?: string;
81
+ variables?: Record<string, string>;
82
+ };
74
83
  }
75
84
  declare const TemplateManager: React.FC<TemplateManagerProps>;
76
85
 
@@ -191,9 +191,10 @@ var TemplateTester = ({
191
191
  template,
192
192
  onSendTest,
193
193
  onCancel,
194
- sending = false
194
+ sending = false,
195
+ defaultValues = {}
195
196
  }) => {
196
- const [toEmail, setToEmail] = (0, import_react2.useState)("");
197
+ const [toEmail, setToEmail] = (0, import_react2.useState)(defaultValues.to || "");
197
198
  const [variables, setVariables] = (0, import_react2.useState)({});
198
199
  const [detectedVariables, setDetectedVariables] = (0, import_react2.useState)([]);
199
200
  const [error, setError] = (0, import_react2.useState)(null);
@@ -205,11 +206,18 @@ var TemplateTester = ({
205
206
  const uniqueVars = Array.from(/* @__PURE__ */ new Set([...subjectVars, ...bodyVars]));
206
207
  setDetectedVariables(uniqueVars);
207
208
  const initialValues = {};
209
+ const defaults = defaultValues.variables || {};
208
210
  uniqueVars.forEach((v) => {
209
- initialValues[v] = "";
211
+ if (defaults[v]) {
212
+ initialValues[v] = defaults[v];
213
+ } else if (v === "email" && toEmail) {
214
+ initialValues[v] = toEmail;
215
+ } else {
216
+ initialValues[v] = "";
217
+ }
210
218
  });
211
219
  setVariables(initialValues);
212
- }, [template]);
220
+ }, [template, defaultValues]);
213
221
  const handleSubmit = async (e) => {
214
222
  e.preventDefault();
215
223
  setError(null);
@@ -231,7 +239,13 @@ var TemplateTester = ({
231
239
  type: "email",
232
240
  required: true,
233
241
  value: toEmail,
234
- onChange: (e) => setToEmail(e.target.value),
242
+ onChange: (e) => {
243
+ const val = e.target.value;
244
+ setToEmail(val);
245
+ if (variables["email"] !== void 0) {
246
+ setVariables((prev) => ({ ...prev, email: val }));
247
+ }
248
+ },
235
249
  className: "w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",
236
250
  placeholder: "recipient@example.com"
237
251
  }
@@ -284,8 +298,10 @@ var TemplateManager = ({
284
298
  onSendTestEmail,
285
299
  title = "Email Templates",
286
300
  description = "Manage system email templates",
287
- templateTypes
301
+ templateTypes,
302
+ defaultTestValues
288
303
  }) => {
304
+ const props = { defaultTestValues };
289
305
  const [templates, setTemplates] = (0, import_react3.useState)([]);
290
306
  const [loading, setLoading] = (0, import_react3.useState)(true);
291
307
  const [error, setError] = (0, import_react3.useState)(null);
@@ -492,7 +508,8 @@ var TemplateManager = ({
492
508
  template: testingTemplate,
493
509
  onSendTest: handleTest,
494
510
  onCancel: () => setShowTester(false),
495
- sending: saving
511
+ sending: saving,
512
+ defaultValues: props.defaultTestValues
496
513
  }
497
514
  ), deleteConfirm && /* @__PURE__ */ import_react3.default.createElement("div", { className: "fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 p-4" }, /* @__PURE__ */ import_react3.default.createElement("div", { className: "bg-white rounded-lg shadow-xl max-w-sm w-full p-6" }, /* @__PURE__ */ import_react3.default.createElement("h3", { className: "text-lg font-semibold mb-2" }, "Delete Template?"), /* @__PURE__ */ import_react3.default.createElement("p", { className: "text-gray-600 mb-4" }, "This action cannot be undone."), /* @__PURE__ */ import_react3.default.createElement("div", { className: "flex justify-end gap-3" }, /* @__PURE__ */ import_react3.default.createElement(
498
515
  "button",
@@ -577,13 +594,22 @@ var EmailSettings = ({
577
594
  if (loading) {
578
595
  return /* @__PURE__ */ import_react4.default.createElement("div", { className: "flex items-center justify-center p-12" }, /* @__PURE__ */ import_react4.default.createElement("div", { className: "animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600" }));
579
596
  }
580
- return /* @__PURE__ */ import_react4.default.createElement("div", { className: "max-w-4xl p-6 space-y-8" }, /* @__PURE__ */ import_react4.default.createElement("div", null, /* @__PURE__ */ import_react4.default.createElement("h2", { className: "text-2xl font-bold text-gray-900" }, title), /* @__PURE__ */ import_react4.default.createElement("p", { className: "text-gray-500 mt-1" }, description)), /* @__PURE__ */ import_react4.default.createElement("div", { className: "bg-white rounded-lg border border-gray-200 shadow-sm overflow-hidden" }, /* @__PURE__ */ import_react4.default.createElement("div", { className: "px-6 py-4 border-b border-gray-100 bg-gray-50" }, /* @__PURE__ */ import_react4.default.createElement("h3", { className: "text-lg font-medium text-gray-900" }, "Global Configuration"), /* @__PURE__ */ import_react4.default.createElement("p", { className: "text-sm text-gray-500" }, "Default sender identity and delivery provider.")), /* @__PURE__ */ import_react4.default.createElement("div", { className: "p-6 space-y-6" }, /* @__PURE__ */ import_react4.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6" }, /* @__PURE__ */ import_react4.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ import_react4.default.createElement("label", { className: "block text-sm font-medium text-gray-700" }, "From Name"), /* @__PURE__ */ import_react4.default.createElement(
597
+ return /* @__PURE__ */ import_react4.default.createElement("div", { className: "max-w-4xl p-6 space-y-8" }, /* @__PURE__ */ import_react4.default.createElement("div", null, /* @__PURE__ */ import_react4.default.createElement("h2", { className: "text-2xl font-bold text-gray-900" }, title), /* @__PURE__ */ import_react4.default.createElement("p", { className: "text-gray-500 mt-1" }, description)), /* @__PURE__ */ import_react4.default.createElement("div", { className: "bg-white rounded-lg border border-gray-200 shadow-sm overflow-hidden" }, /* @__PURE__ */ import_react4.default.createElement("div", { className: "px-6 py-4 border-b border-gray-100 bg-gray-50" }, /* @__PURE__ */ import_react4.default.createElement("h3", { className: "text-lg font-medium text-gray-900" }, "Global Configuration"), /* @__PURE__ */ import_react4.default.createElement("p", { className: "text-sm text-gray-500" }, "Default sender identity and delivery provider.")), /* @__PURE__ */ import_react4.default.createElement("div", { className: "p-6 space-y-6" }, /* @__PURE__ */ import_react4.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6" }, /* @__PURE__ */ import_react4.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ import_react4.default.createElement("label", { className: "block text-sm font-medium text-gray-700" }, "Brand Name"), /* @__PURE__ */ import_react4.default.createElement(
598
+ "input",
599
+ {
600
+ type: "text",
601
+ value: settings.brandName || "",
602
+ onChange: (e) => handleChange("brandName", e.target.value),
603
+ placeholder: "e.g. Content Growth",
604
+ className: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
605
+ }
606
+ ), /* @__PURE__ */ import_react4.default.createElement("p", { className: "text-xs text-gray-500" }, "Used in email templates as ", "{{brandName}}")), /* @__PURE__ */ import_react4.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ import_react4.default.createElement("label", { className: "block text-sm font-medium text-gray-700" }, "From Name"), /* @__PURE__ */ import_react4.default.createElement(
581
607
  "input",
582
608
  {
583
609
  type: "text",
584
610
  value: settings.fromName,
585
611
  onChange: (e) => handleChange("fromName", e.target.value),
586
- placeholder: "e.g. Acme System",
612
+ placeholder: "e.g. Support Team",
587
613
  className: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
588
614
  }
589
615
  )), /* @__PURE__ */ import_react4.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ import_react4.default.createElement("label", { className: "block text-sm font-medium text-gray-700" }, "From Address"), /* @__PURE__ */ import_react4.default.createElement(
@@ -592,7 +618,7 @@ var EmailSettings = ({
592
618
  type: "email",
593
619
  value: settings.fromAddress,
594
620
  onChange: (e) => handleChange("fromAddress", e.target.value),
595
- placeholder: "e.g. noreply@acme.com",
621
+ placeholder: "e.g. noreply@example.com",
596
622
  className: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
597
623
  }
598
624
  ))), /* @__PURE__ */ import_react4.default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ import_react4.default.createElement("label", { className: "block text-sm font-medium text-gray-700" }, "Email Provider"), /* @__PURE__ */ import_react4.default.createElement("div", { className: "relative" }, /* @__PURE__ */ import_react4.default.createElement(