@useinsider/guido 3.19.0-beta.5355c3f → 3.19.0-beta.f02eaa1

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 (52) hide show
  1. package/README.md +21 -3
  2. package/dist/@types/config/schemas.js +59 -51
  3. package/dist/components/Guido.vue.js +4 -4
  4. package/dist/components/Guido.vue2.js +83 -87
  5. package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue.js +7 -7
  6. package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue2.js +53 -49
  7. package/dist/components/organisms/extensions/recommendation/LegacyStrategyUpdatedModal.vue.js +18 -0
  8. package/dist/components/organisms/extensions/recommendation/LegacyStrategyUpdatedModal.vue2.js +25 -0
  9. package/dist/components/organisms/extensions/recommendation/RemoveStrategyModal.vue2.js +24 -22
  10. package/dist/components/organisms/onboarding/OnboardingWrapper.vue2.js +28 -24
  11. package/dist/components/organisms/onboarding/RecommendationLegacyStrategyOnboarding.vue.js +21 -0
  12. package/dist/components/organisms/onboarding/RecommendationLegacyStrategyOnboarding.vue2.js +46 -0
  13. package/dist/components/organisms/onboarding/RecommendationStrategyOnboarding.vue.js +21 -0
  14. package/dist/components/organisms/onboarding/RecommendationStrategyOnboarding.vue2.js +46 -0
  15. package/dist/composables/useActionsApi.js +20 -24
  16. package/dist/composables/useCortexBlueprintBridge.js +54 -115
  17. package/dist/composables/useCustomInterfaceAppearance.js +46 -42
  18. package/dist/composables/useEmailTemplateApplier.js +50 -93
  19. package/dist/composables/useLegacyStrategyConversion.js +61 -0
  20. package/dist/enums/extensions/recommendationBlock.js +40 -31
  21. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +77 -76
  22. package/dist/extensions/Blocks/Recommendation/controls/main/strategy.js +72 -28
  23. package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +45 -44
  24. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +110 -46
  25. package/dist/extensions/Blocks/Recommendation/utils/legacyStrategyMigration.js +42 -0
  26. package/dist/extensions/Blocks/Recommendation/utils/nodeConfigWriter.js +7 -7
  27. package/dist/guido.css +1 -1
  28. package/dist/services/recommendationApi.js +46 -37
  29. package/dist/src/@types/config/schemas.d.ts +16 -0
  30. package/dist/src/components/organisms/extensions/recommendation/LegacyStrategyUpdatedModal.vue.d.ts +2 -0
  31. package/dist/src/components/organisms/onboarding/RecommendationLegacyStrategyOnboarding.vue.d.ts +2 -0
  32. package/dist/src/components/organisms/onboarding/RecommendationStrategyOnboarding.vue.d.ts +2 -0
  33. package/dist/src/composables/useConfig.d.ts +4 -0
  34. package/dist/src/composables/useCortexBlueprintBridge.d.ts +3 -4
  35. package/dist/src/composables/useEmailTemplateApplier.d.ts +2 -22
  36. package/dist/src/composables/useLegacyStrategyConversion.d.ts +3 -0
  37. package/dist/src/enums/extensions/recommendationBlock.d.ts +5 -1
  38. package/dist/src/extensions/Blocks/Recommendation/controls/main/strategy.d.ts +2 -0
  39. package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.d.ts +4 -0
  40. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +70 -1
  41. package/dist/src/extensions/Blocks/Recommendation/utils/legacyStrategyMigration.d.ts +32 -0
  42. package/dist/src/services/recommendationApi.d.ts +2 -1
  43. package/dist/src/stores/config.d.ts +322 -0
  44. package/dist/src/stores/guido-email-editor.d.ts +10 -32
  45. package/dist/src/stores/onboarding.d.ts +808 -10
  46. package/dist/static/assets/icons/filled-arrow-rising.svg.js +5 -0
  47. package/dist/static/assets/icons/line-info.svg.js +5 -0
  48. package/dist/static/styles/components/recommendation-strategy.css.js +70 -5
  49. package/dist/stores/config.js +74 -60
  50. package/dist/stores/guido-email-editor.js +1 -3
  51. package/dist/stores/onboarding.js +46 -36
  52. package/package.json +1 -1
@@ -1,131 +1,70 @@
1
- import { useEmailTemplateApplier as k, resetEmailTemplateApplier as N } from "./useEmailTemplateApplier.js";
2
- import { useToaster as X } from "./useToaster.js";
3
- import { useTranslations as j } from "./useTranslations.js";
4
- import { ToasterTypeOptions as z } from "../enums/toaster.js";
5
- import { useGuidoEmailEditorStore as J } from "../stores/guido-email-editor.js";
6
- import { getActivePinia as Q } from "pinia";
7
- import { onUnmounted as V, watch as Z } from "vue";
8
- const W = "email_template", tt = "chat", et = "guido:debug:ai", rt = 2, nt = 500, ot = (A, p) => `${A}:${p ?? 1}`;
9
- let v = null;
10
- const it = () => {
1
+ import { useEmailTemplateApplier as w, resetEmailTemplateApplier as _ } from "./useEmailTemplateApplier.js";
2
+ import { useToaster as I } from "./useToaster.js";
3
+ import { useTranslations as P } from "./useTranslations.js";
4
+ import { ToasterTypeOptions as S } from "../enums/toaster.js";
5
+ import { getActivePinia as v } from "pinia";
6
+ import { watch as B, onUnmounted as D } from "vue";
7
+ const x = "email_template", L = "chat", M = "guido:debug:ai", R = () => {
11
8
  if (typeof window > "u")
12
9
  return !1;
13
10
  try {
14
- return window.localStorage.getItem(et) === "1";
11
+ return window.localStorage.getItem(M) === "1";
15
12
  } catch {
16
13
  return !1;
17
14
  }
18
- }, ft = () => {
19
- const A = Q();
20
- if (!A)
15
+ }, H = () => {
16
+ const c = v();
17
+ if (!c)
21
18
  return;
22
- const p = J(), y = Symbol("cortexBlueprintBridge");
23
- v = y, p.$patch((t) => {
24
- t.bridgeActive = !0;
25
- });
26
- const { markPending: x, applyTemplate: F, applyTemplateDebounced: I } = k(), { showToaster: C } = X(), H = j(), h = /* @__PURE__ */ new Map(), S = /* @__PURE__ */ new Map(), u = /* @__PURE__ */ new Map(), d = /* @__PURE__ */ new Map(), E = /* @__PURE__ */ new Map(), _ = /* @__PURE__ */ new Set(), M = it();
27
- let T = null, b = null, f;
28
- const O = (t, e) => {
29
- M && console.debug(`[guido:cortex] msg=${t ?? "?"} type=${(e == null ? void 0 : e.type) ?? "?"}`, e);
30
- }, G = () => new Set((f == null ? void 0 : f.appliedBlueprintKeys) ?? []), K = (t) => t instanceof Error ? t.message : String(t), D = (t, e, o, r) => {
31
- if (v !== y)
32
- return;
33
- const n = p.applyAcks[t], l = Math.max(Date.now(), ((n == null ? void 0 : n.ackAt) ?? 0) + 1), c = { status: e, requestedAt: o, ackAt: l };
34
- r !== void 0 && (c.error = K(r)), p.$patch((a) => {
35
- a.applyAcks = { ...a.applyAcks, [t]: c };
36
- });
37
- }, B = (t) => (d.get(t) ?? 0) > 0, w = async (t, e, o, r) => {
38
- var a, i, q;
39
- const n = ((a = o.blueprintData) == null ? void 0 : a.html) ?? "", l = ((i = o.blueprintData) == null ? void 0 : i.css) ?? "", c = o.applyRequestedAt ?? 0;
40
- d.set(t, (d.get(t) ?? 0) + 1);
41
- try {
42
- const s = r === "debounced" ? await I(e, { html: n, css: l }) : await F(e, { html: n, css: l });
43
- if (s.status === "superseded")
44
- return;
45
- if (s.status === "applied") {
46
- h.set(e, n), u.delete(t), D(t, "applied", c);
47
- return;
48
- }
49
- const m = u.get(t);
50
- u.set(t, { html: n, count: (m == null ? void 0 : m.html) === n ? m.count + 1 : 1 }), D(t, "failed", c, s.error);
51
- } finally {
52
- d.set(t, (d.get(t) ?? 1) - 1);
53
- const s = E.get(t);
54
- s && !B(t) && (E.delete(t), (((q = s.blueprintData) == null ? void 0 : q.html) ?? "") !== n && w(t, e, s, r));
55
- }
56
- }, U = (t) => {
57
- var a;
58
- if (t.blueprintType !== W)
59
- return;
60
- const { blueprintId: e } = t, o = (a = t.blueprintData) == null ? void 0 : a.html;
61
- if (!e || !o)
19
+ const l = c._s, p = l == null ? void 0 : l.get(L);
20
+ if (!p)
21
+ return;
22
+ const { markPending: d, applyTemplate: f, applyTemplateDebounced: T } = w(), { showToaster: E } = I(), h = P(), y = (r, t) => {
23
+ const e = h(r);
24
+ return e === r ? t : e;
25
+ }, i = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Set(), u = R(), A = (r, t) => {
26
+ u && console.debug(`[guido:cortex] msg=${r ?? "?"} type=${(t == null ? void 0 : t.type) ?? "?"}`, t);
27
+ }, b = (r) => {
28
+ if (r.blueprintType !== x)
62
29
  return;
63
- if (!t.applyRequested) {
64
- x(e);
30
+ const t = r.blueprintId, e = r.blueprintData;
31
+ if (!t || !(e != null && e.html))
65
32
  return;
66
- }
67
- const r = ot(e, t.version), n = t.applyRequestedAt ?? 0, l = S.get(r);
68
- if (l === void 0 || n > l) {
69
- const i = l === void 0;
70
- if (S.set(r, n), u.delete(r), i && G().has(r)) {
71
- h.set(e, o);
72
- return;
73
- }
74
- w(r, e, t, "immediate");
33
+ if (!r.applyRequested) {
34
+ d(t);
75
35
  return;
76
36
  }
77
- const c = h.get(e);
78
- if (c !== o) {
79
- if (c === void 0) {
80
- if (B(r)) {
81
- E.set(r, t);
82
- return;
83
- }
84
- const i = u.get(r);
85
- if ((i == null ? void 0 : i.html) === o && i.count >= rt)
86
- return;
87
- w(r, e, t, "immediate");
88
- return;
89
- }
90
- w(r, e, t, "debounced");
91
- }
92
- }, g = (t) => t === void 0 || _.has(t) ? !1 : (_.add(t), C({
93
- type: z.Error,
94
- message: H("newsletter.ai-template-failed")
95
- }), !0), Y = (t) => {
96
- Array.isArray(t) && t.forEach((e) => {
97
- const o = e == null ? void 0 : e.id;
98
- (e == null ? void 0 : e.isError) === !0 && g(o) && M && console.debug(`[guido:cortex] message-level error id=${o}`, e);
99
- const r = e == null ? void 0 : e.segments;
100
- Array.isArray(r) && r.forEach((n) => {
101
- if (n)
102
- switch (O(o, n), n.type) {
103
- case "blueprint":
104
- U(n);
105
- break;
106
- case "error":
107
- g(o);
108
- break;
109
- }
37
+ const o = i.get(t);
38
+ o === void 0 ? (i.set(t, e.html), f(t, e)) : o !== e.html && (i.set(t, e.html), T(t, e));
39
+ }, s = (r) => r === void 0 || a.has(r) ? !1 : (a.add(r), E({
40
+ type: S.Error,
41
+ message: y("newsletter.ai-template-failed", "AI couldn't generate the template. Please try again.")
42
+ }), !0), m = B(
43
+ () => p.messages,
44
+ (r) => {
45
+ Array.isArray(r) && r.forEach((t) => {
46
+ const e = t == null ? void 0 : t.id;
47
+ (t == null ? void 0 : t.isError) === !0 && s(e) && u && console.debug(`[guido:cortex] message-level error id=${e}`, t);
48
+ const o = t == null ? void 0 : t.segments;
49
+ Array.isArray(o) && o.forEach((n) => {
50
+ if (n)
51
+ switch (A(e, n), n.type) {
52
+ case "blueprint":
53
+ b(n);
54
+ break;
55
+ case "error":
56
+ s(e);
57
+ break;
58
+ }
59
+ });
110
60
  });
111
- });
112
- }, P = () => {
113
- T !== null && (clearInterval(T), T = null);
114
- }, $ = () => {
115
- var t;
116
- return (t = A._s) == null ? void 0 : t.get(tt);
117
- }, L = (t) => {
118
- f = t, b = Z(() => t.messages, Y, { deep: !0, immediate: !0 });
119
- }, R = $();
120
- R ? L(R) : T = setInterval(() => {
121
- const t = $();
122
- t && (P(), L(t));
123
- }, nt), V(() => {
124
- P(), b == null || b(), f = void 0, h.clear(), S.clear(), u.clear(), d.clear(), E.clear(), _.clear(), v === y && (v = null, p.$patch((t) => {
125
- t.bridgeActive = !1, t.applyAcks = {};
126
- }), N());
61
+ },
62
+ { deep: !0, immediate: !0 }
63
+ );
64
+ D(() => {
65
+ m(), i.clear(), a.clear(), _();
127
66
  });
128
67
  };
129
68
  export {
130
- ft as useCortexBlueprintBridge
69
+ H as useCortexBlueprintBridge
131
70
  };
@@ -1,67 +1,71 @@
1
- import S from "../static/assets/icons/line-change.svg.js";
2
- import i from "../static/assets/icons/line-delete.svg.js";
3
- import n from "../static/assets/icons/line-plus.svg.js";
4
- import p from "../static/styles/base.css.js";
5
- import s from "../static/styles/components/alert-message.css.js";
6
- import C from "../static/styles/components/amp-block.css.js";
7
- import a from "../static/styles/components/base-input.css.js";
8
- import f from "../static/styles/components/button-group.css.js";
9
- import c from "../static/styles/components/button.css.js";
10
- import u from "../static/styles/components/combobox.css.js";
11
- import l from "../static/styles/components/counter.css.js";
12
- import d from "../static/styles/components/dropdown-menu.css.js";
1
+ import i from "../static/assets/icons/filled-arrow-rising.svg.js";
2
+ import n from "../static/assets/icons/line-change.svg.js";
3
+ import S from "../static/assets/icons/line-delete.svg.js";
4
+ import p from "../static/assets/icons/line-info.svg.js";
5
+ import s from "../static/assets/icons/line-plus.svg.js";
6
+ import f from "../static/styles/base.css.js";
7
+ import C from "../static/styles/components/alert-message.css.js";
8
+ import a from "../static/styles/components/amp-block.css.js";
9
+ import c from "../static/styles/components/base-input.css.js";
10
+ import l from "../static/styles/components/button-group.css.js";
11
+ import u from "../static/styles/components/button.css.js";
12
+ import d from "../static/styles/components/combobox.css.js";
13
+ import I from "../static/styles/components/counter.css.js";
14
+ import g from "../static/styles/components/dropdown-menu.css.js";
13
15
  import h from "../static/styles/components/loader.css.js";
14
- import g from "../static/styles/components/narrow-panel.css.js";
15
- import I from "../static/styles/components/popup.css.js";
16
- import w from "../static/styles/components/recommendation-strategy.css.js";
17
- import y from "../static/styles/components/switcher.css.js";
18
- import b from "../static/styles/components/tabs.css.js";
19
- import B from "../static/styles/components/tools.css.js";
20
- import $ from "../static/styles/components/version-history.css.js";
21
- import P from "../static/styles/components/wide-panel.css.js";
16
+ import w from "../static/styles/components/narrow-panel.css.js";
17
+ import $ from "../static/styles/components/popup.css.js";
18
+ import y from "../static/styles/components/recommendation-strategy.css.js";
19
+ import b from "../static/styles/components/switcher.css.js";
20
+ import B from "../static/styles/components/tabs.css.js";
21
+ import A from "../static/styles/components/tools.css.js";
22
+ import P from "../static/styles/components/version-history.css.js";
23
+ import R from "../static/styles/components/wide-panel.css.js";
22
24
  import x from "../static/styles/variables.css.js";
23
- function r(t, o) {
24
- return `--guido-icon-${t}: url("data:image/svg+xml,${encodeURIComponent(o.trim())}");`;
25
+ function o(t, r) {
26
+ return `--guido-icon-${t}: url("data:image/svg+xml,${encodeURIComponent(r.trim())}");`;
25
27
  }
26
- const A = `:host {
27
- ${r("line-change", S)}
28
- ${r("line-delete", i)}
29
- ${r("line-plus", n)}
30
- }`, R = [
28
+ const V = `:host {
29
+ ${o("line-change", n)}
30
+ ${o("line-delete", S)}
31
+ ${o("filled-arrow-rising", i)}
32
+ ${o("line-info", p)}
33
+ ${o("line-plus", s)}
34
+ }`, D = [
31
35
  x,
32
36
  // Must be on top
33
- A,
34
- p,
37
+ V,
38
+ f,
35
39
  // Must be on top
36
- s,
37
40
  C,
38
41
  a,
39
- f,
40
42
  c,
41
- u,
42
43
  l,
44
+ u,
43
45
  d,
44
- h,
45
- g,
46
46
  I,
47
- y,
47
+ g,
48
+ h,
49
+ w,
50
+ $,
48
51
  b,
49
52
  B,
50
- $,
53
+ A,
51
54
  P,
52
- w
55
+ R,
56
+ y
53
57
  // Last: overrides button.css / wide-panel.css defaults
54
58
  ].join(`
55
59
 
56
- `), Y = () => ({ importCss: () => {
57
- const o = new CSSStyleSheet();
58
- o.replaceSync(R);
60
+ `), ro = () => ({ importCss: () => {
61
+ const r = new CSSStyleSheet();
62
+ r.replaceSync(D);
59
63
  const e = document.querySelector("ui-editor");
60
64
  if (!e)
61
65
  return;
62
66
  const m = e.shadowRoot;
63
- m && (m.adoptedStyleSheets = [o]);
67
+ m && (m.adoptedStyleSheets = [r]);
64
68
  } });
65
69
  export {
66
- Y as useCustomInterfaceAppearance
70
+ ro as useCustomInterfaceAppearance
67
71
  };
@@ -1,102 +1,59 @@
1
- import { useActionsApi as Q } from "./useActionsApi.js";
2
- import { useConfig as x } from "./useConfig.js";
3
- import { useEditorLock as z } from "./useEditorLock.js";
4
- import { useToaster as N } from "./useToaster.js";
5
- import { useTranslations as q } from "./useTranslations.js";
6
- import { ToasterTypeOptions as D } from "../enums/toaster.js";
7
- import { useDynamicContentStore as R } from "../stores/dynamic-content.js";
8
- import { useEditorStore as F } from "../stores/editor.js";
9
- import { flattenDynamicContentList as G } from "../utils/genericUtil.js";
10
- import { extractUsedDynamicContent as $ } from "../utils/registerUsedDynamicContent.js";
11
- import { ref as j, watch as J } from "vue";
12
- const K = 250, S = 12e4, c = { status: "superseded" }, h = { status: "failed", error: new Error("Blueprint has no html to apply") }, i = j({}), v = /* @__PURE__ */ new Map(), u = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map(), p = /* @__PURE__ */ new Map(), l = /* @__PURE__ */ new Map(), ie = () => {
13
- const { updateHtmlAndCss: a } = Q(), { runExclusive: M } = z(), { showToaster: d } = N(), y = q(), { template: U } = x(), A = R(), E = F(), T = (e, t) => {
14
- u.get(e) !== t && (u.set(e, t), d({
15
- type: D.Error,
16
- message: y("newsletter.ai-template-failed-apply")
17
- }));
18
- }, O = () => {
19
- var e, t;
20
- return E.isStripoInitialized && typeof ((t = (e = window.StripoEditorApi) == null ? void 0 : e.actionsApi) == null ? void 0 : t.updateHtmlAndCss) == "function";
21
- }, P = (e) => {
22
- i.value[e] === void 0 && (i.value = { ...i.value, [e]: "pending" });
23
- }, m = (e, t) => {
24
- i.value = { ...i.value, [e]: t };
25
- }, _ = (e) => {
26
- var t;
1
+ import { useActionsApi as C } from "./useActionsApi.js";
2
+ import { useConfig as h } from "./useConfig.js";
3
+ import { useToaster as D } from "./useToaster.js";
4
+ import { useTranslations as E } from "./useTranslations.js";
5
+ import { ToasterTypeOptions as f } from "../enums/toaster.js";
6
+ import { useDynamicContentStore as A } from "../stores/dynamic-content.js";
7
+ import { flattenDynamicContentList as w } from "../utils/genericUtil.js";
8
+ import { extractUsedDynamicContent as S } from "../utils/registerUsedDynamicContent.js";
9
+ import { ref as O } from "vue";
10
+ const U = 250, o = O({}), s = {}, u = /* @__PURE__ */ new Map(), z = () => {
11
+ const { updateHtmlAndCss: r } = C(), { showToaster: m } = D(), y = E(), { template: T } = h(), d = A(), g = (e, t) => {
12
+ const a = y(e);
13
+ return a === e ? t : a;
14
+ }, v = (e) => {
15
+ o.value[e] === void 0 && (o.value = { ...o.value, [e]: "pending" });
16
+ }, l = (e, t, a) => {
17
+ var c;
18
+ o.value = { ...o.value, [e]: "applying" };
27
19
  try {
28
- const o = G((t = U.value) == null ? void 0 : t.dynamicContentList), s = $(e, o);
29
- s.length > 0 && A.registerDynamicContent(s);
30
- } catch {
31
- }
32
- }, H = (e, t) => {
33
- u.delete(e), v.get(e) !== t && (v.set(e, t), d({
34
- type: D.Success,
35
- message: y("newsletter.ai-template-applied")
36
- }));
37
- }, g = async (e, t, o) => {
38
- const s = (l.get(e) ?? 0) + 1;
39
- l.set(e, s), m(e, "applying");
40
- try {
41
- await M(() => a(t, o));
20
+ r(t, a).catch((n) => {
21
+ console.warn("Editor did not acknowledge the template apply.", n);
22
+ }), o.value = { ...o.value, [e]: "applied" };
23
+ try {
24
+ const n = w((c = T.value) == null ? void 0 : c.dynamicContentList), i = S(t, n);
25
+ i.length > 0 && d.registerDynamicContent(i);
26
+ } catch {
27
+ }
28
+ u.get(e) !== t && (u.set(e, t), m({
29
+ type: f.Success,
30
+ message: g("newsletter.ai-template-applied", "Template applied to the editor")
31
+ }));
42
32
  } catch (n) {
43
- return l.get(e) !== s ? c : (console.error("[guido:apply] editor did not acknowledge the template apply", n), m(e, "failed"), T(e, t), { status: "failed", error: n });
44
- }
45
- return l.get(e) !== s ? c : (m(e, "applied"), _(t), H(e, t), { status: "applied" });
46
- }, k = (e) => {
47
- const t = r.get(e);
48
- t && (clearTimeout(t.timer), r.delete(e), t.settle(c));
49
- }, w = (e) => {
50
- const t = p.get(e);
51
- t && (clearTimeout(t.timer), p.delete(e), t.settle(c));
52
- }, B = (e, t, o) => new Promise((s) => {
53
- k(e);
54
- const n = setTimeout(() => {
55
- r.delete(e), m(e, "failed"), T(e, t), s({
56
- status: "failed",
57
- error: new Error(`Editor did not become ready within ${S}ms`)
33
+ o.value = { ...o.value, [e]: "failed" }, m({
34
+ type: f.Error,
35
+ message: n instanceof Error ? n.message : "Failed to apply template"
58
36
  });
59
- }, S);
60
- r.set(e, { html: t, css: o, timer: n, settle: s }), m(e, "applying");
61
- }), C = (e, t, o) => O() ? g(e, t, o) : B(e, t, o), L = async () => {
62
- if (r.size === 0)
63
- return;
64
- const e = [...r.entries()];
65
- r.clear(), e.forEach(([, n]) => clearTimeout(n.timer));
66
- const t = e.pop();
67
- if (e.forEach(([n, f]) => {
68
- m(n, "pending"), f.settle(c);
69
- }), !t)
70
- return;
71
- const [o, s] = t;
72
- s.settle(await g(o, s.html, s.css));
37
+ }
38
+ }, p = (e) => {
39
+ const t = s[e];
40
+ t && (clearTimeout(t), delete s[e]);
73
41
  };
74
- return J(() => E.isStripoInitialized, (e) => {
75
- e && L();
76
- }, { immediate: !0 }), { applyStatus: i, markPending: P, applyTemplate: (e, t) => {
77
- const { html: o } = t;
78
- return o ? (w(e), C(e, o, t.css ?? "")) : Promise.resolve(h);
42
+ return { applyStatus: o, markPending: v, applyTemplate: (e, t) => {
43
+ t.html && (p(e), l(e, t.html, t.css ?? ""));
79
44
  }, applyTemplateDebounced: (e, t) => {
80
- const { html: o } = t;
81
- if (!o)
82
- return Promise.resolve(h);
83
- const s = t.css ?? "";
84
- return new Promise((n) => {
85
- w(e);
86
- const f = setTimeout(() => {
87
- p.delete(e), C(e, o, s).then(n);
88
- }, K);
89
- p.set(e, { timer: f, settle: n });
90
- });
45
+ if (!t.html)
46
+ return;
47
+ p(e);
48
+ const { html: a } = t, c = t.css ?? "";
49
+ s[e] = setTimeout(() => {
50
+ delete s[e], l(e, a, c);
51
+ }, U);
91
52
  } };
92
- }, ce = () => {
93
- p.forEach((a) => {
94
- clearTimeout(a.timer), a.settle(c);
95
- }), p.clear(), r.forEach((a) => {
96
- clearTimeout(a.timer), a.settle(c);
97
- }), r.clear(), l.clear(), u.clear(), i.value = {};
53
+ }, G = () => {
54
+ Object.values(s).forEach(clearTimeout), Object.keys(s).forEach((r) => delete s[r]), o.value = {};
98
55
  };
99
56
  export {
100
- ce as resetEmailTemplateApplier,
101
- ie as useEmailTemplateApplier
57
+ G as resetEmailTemplateApplier,
58
+ z as useEmailTemplateApplier
102
59
  };
@@ -0,0 +1,61 @@
1
+ import { useRecommendation as I } from "./useRecommendation.js";
2
+ import { useToaster as C } from "./useToaster.js";
3
+ import { useTranslations as v } from "./useTranslations.js";
4
+ import { ToasterTypeOptions as g } from "../enums/toaster.js";
5
+ import "../extensions/Blocks/Recommendation/constants/selectors.js";
6
+ import { CURRENT_CONFIG_VERSION as L } from "../extensions/Blocks/Recommendation/constants/defaultConfig.js";
7
+ import { useRecommendationExtensionStore as b } from "../extensions/Blocks/Recommendation/store/recommendation.js";
8
+ import { resolveMigrationTarget as R, buildLegacyMigrationPayload as T } from "../extensions/Blocks/Recommendation/utils/legacyStrategyMigration.js";
9
+ import { commitBlockChangeOutsidePanel as h } from "../extensions/Blocks/Recommendation/utils/nodeConfigWriter.js";
10
+ import { useConfigStore as k } from "../stores/config.js";
11
+ const F = () => {
12
+ const e = b(), r = k(), { buildCampaignUrl: m } = I(), { showToaster: i } = C(), c = v();
13
+ return { convertLegacyStrategy: async () => {
14
+ const t = e.currentRecommendationId;
15
+ if (t === null || !e.isLegacyStrategyBlock || e.legacyConversionLoading)
16
+ return "";
17
+ const { strategy: d, productIds: y, size: l, strategyId: p, nodeConfigVersion: u } = e.recommendationConfigs, f = { strategyId: p, size: l, nodeConfigVersion: u }, s = R({
18
+ campaignId: r.campaignId,
19
+ templateLibraryId: r.templateLibraryId
20
+ }), S = T({
21
+ blockId: t,
22
+ url: m(String(t)),
23
+ campaignId: r.campaignId,
24
+ variationId: r.variationId,
25
+ strategy: d,
26
+ productIds: y,
27
+ target: s
28
+ });
29
+ let o;
30
+ try {
31
+ o = await e.convertLegacyStrategy(S, s);
32
+ } catch (n) {
33
+ return console.error("[useLegacyStrategyConversion] migration failed", n), i({
34
+ type: g.Error,
35
+ message: c("email-editor.legacy-strategy-update-failed")
36
+ }), "";
37
+ }
38
+ try {
39
+ await e.fetchStrategyProductsForBlock(t);
40
+ } catch (n) {
41
+ console.error("[useLegacyStrategyConversion] product refetch failed", n);
42
+ }
43
+ const a = e.blockStates[t];
44
+ return a ? h(
45
+ t,
46
+ {
47
+ strategyId: o,
48
+ size: a.recommendationConfigs.size,
49
+ configVersion: L
50
+ },
51
+ a.recommendationProducts,
52
+ "Converted legacy recommendation strategy"
53
+ ) ? (e.currentRecommendationId === t && e.openLegacyStrategyUpdatedModal(), o) : (console.error("[useLegacyStrategyConversion] node write failed", t), e.revertLegacyConversion(t, f), i({
54
+ type: g.Error,
55
+ message: c("email-editor.legacy-strategy-update-failed")
56
+ }), "") : o;
57
+ } };
58
+ };
59
+ export {
60
+ F as useLegacyStrategyConversion
61
+ };
@@ -1,14 +1,22 @@
1
- import { useTranslations as r } from "../../composables/useTranslations.js";
2
- const l = {
1
+ import { useTranslations as n } from "../../composables/useTranslations.js";
2
+ const a = {
3
3
  RECOMMENDATION_API_URL: "https://recommendationv2.api.useinsider.com",
4
4
  // Relative path → same-origin as the embedding inone dashboard.
5
5
  PRODUCT_ATTRIBUTES_PATH: "/product-attributes/get-attributes",
6
6
  RECOMMENDATION_STRATEGIES_PATH: "/api/recommendation-strategies",
7
- RECOMMENDATION_STRATEGIES_PANEL_PATH: "/discovery/recommendation-strategies"
7
+ RECOMMENDATION_STRATEGIES_PANEL_PATH: "/discovery/recommendation-strategies",
8
+ NEWSLETTER_RECOMMENDATIONS_PATH: "/newsletter/recommendations",
9
+ MIGRATE_STRATEGIES_PATH: "/newsletter/recommendations/migrate-strategies",
10
+ // The template route narrows the recommendations resource before the action: the id
11
+ // travels in the body, not the path.
12
+ TEMPLATE_MIGRATE_STRATEGIES_PATH: "/newsletter/recommendations/template/migrate-strategies"
8
13
  }, c = {
14
+ campaign: a.MIGRATE_STRATEGIES_PATH,
15
+ template: a.TEMPLATE_MIGRATE_STRATEGIES_PATH
16
+ }, d = {
9
17
  CLIENT_ID: "clientId"
10
- }, d = () => {
11
- const e = r();
18
+ }, m = () => {
19
+ const e = n();
12
20
  return [
13
21
  {
14
22
  id: 11,
@@ -71,73 +79,74 @@ const l = {
71
79
  path: "top-sellers"
72
80
  }
73
81
  ];
74
- }, m = ["discount", "omnibus_price", "omnibus_discount", "price", "original_price"], p = [
82
+ }, p = ["discount", "omnibus_price", "omnibus_discount", "price", "original_price"], T = [
75
83
  { text: "before the amount", value: "0" },
76
84
  { text: "after the amount", value: "1" }
77
85
  ], v = [
78
86
  { text: "dot(.)", value: "." },
79
87
  { text: "comma(,)", value: "," },
80
88
  { text: "space( )", value: " " }
81
- ], h = [
89
+ ], A = [
82
90
  { text: "0", value: "0" },
83
91
  { text: "1", value: "1" },
84
92
  { text: "2", value: "2" },
85
93
  { text: "3", value: "3" },
86
94
  { text: "4", value: "4" },
87
95
  { text: "5", value: "5" }
88
- ], a = "||", t = [
96
+ ], r = "||", t = [
89
97
  { text: "is exactly", value: "=" },
90
98
  { text: "contains", value: "~" },
91
99
  { text: "does not contain", value: "!~" },
92
- { text: "any of", value: a }
93
- ], n = [
100
+ { text: "any of", value: r }
101
+ ], o = [
94
102
  { text: "is exactly", value: "=" },
95
103
  { text: "is not exactly", value: "!==" },
96
104
  { text: "contains", value: "~" },
97
105
  { text: "does not contain", value: "!~" },
98
- { text: "any of", value: a }
99
- ], o = [
106
+ { text: "any of", value: r }
107
+ ], s = [
100
108
  { text: "is equal to", value: "=" },
101
109
  { text: "is greater than", value: ">" },
102
110
  { text: "is less than", value: "<" }
103
- ], s = [
111
+ ], i = [
104
112
  { text: "is equal to", value: "=" },
105
113
  { text: "after", value: ">" },
106
114
  { text: "before", value: "<" }
107
- ], i = [
115
+ ], u = [
108
116
  { text: "true", value: "==" },
109
117
  { text: "false", value: "!=" }
110
- ], x = (e) => {
118
+ ], E = (e) => {
111
119
  if (!e)
112
120
  return t;
113
121
  switch (e) {
114
122
  case "Boolean":
115
- return i;
123
+ return u;
116
124
  case "Date":
117
- return s;
125
+ return i;
118
126
  case "Number":
119
- return o;
127
+ return s;
120
128
  case "String":
121
129
  return t;
122
130
  case "Strings":
123
- return n;
131
+ return o;
124
132
  default:
125
133
  return t;
126
134
  }
127
135
  };
128
136
  export {
129
- a as OP_ANY_OF,
130
- m as PriceAttributes,
131
- c as QUERY_PARAMS,
132
- l as URLS,
133
- h as currencyDecimalCounts,
134
- p as currencyLocationMaps,
137
+ c as MIGRATION_PATHS,
138
+ r as OP_ANY_OF,
139
+ p as PriceAttributes,
140
+ d as QUERY_PARAMS,
141
+ a as URLS,
142
+ A as currencyDecimalCounts,
143
+ T as currencyLocationMaps,
135
144
  v as currencyOperators,
136
- x as getOperatorOptions,
137
- d as getRecommendationFeedSourceMaps,
138
- n as operatorOptionsForArrayOfStrings,
139
- i as operatorOptionsForBooleans,
140
- s as operatorOptionsForDates,
141
- o as operatorOptionsForNumbers,
145
+ E as getOperatorOptions,
146
+ m as getRecommendationFeedSourceMaps,
147
+ o as operatorOptionsForArrayOfStrings,
148
+ u as operatorOptionsForBooleans,
149
+ i as operatorOptionsForDates,
150
+ s as operatorOptionsForNumbers,
142
151
  t as operatorOptionsForStrings
143
152
  };