@useinsider/guido 3.18.1-beta.fd927f4 → 3.18.1-beta.fefef3c

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 +82 -57
  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 +17 -14
  21. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +70 -69
  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 +104 -58
  25. package/dist/extensions/Blocks/Recommendation/utils/legacyStrategyMigration.js +72 -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 +93 -84
  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 +3 -0
  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 +54 -1
  41. package/dist/src/extensions/Blocks/Recommendation/utils/legacyStrategyMigration.d.ts +44 -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 +7 -29
  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 -5
  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 f } from "./useRecommendation.js";
2
+ import { useToaster as S } from "./useToaster.js";
3
+ import { useTranslations as I } from "./useTranslations.js";
4
+ import { ToasterTypeOptions as C } 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 v } from "../extensions/Blocks/Recommendation/store/recommendation.js";
8
+ import { resolveMigrationTarget as b, buildLegacyMigrationPayload as R } from "../extensions/Blocks/Recommendation/utils/legacyStrategyMigration.js";
9
+ import { commitBlockChangeOutsidePanel as T } from "../extensions/Blocks/Recommendation/utils/nodeConfigWriter.js";
10
+ import { useConfigStore as h } from "../stores/config.js";
11
+ const V = () => {
12
+ const t = v(), o = h(), { buildCampaignUrl: s } = f(), { showToaster: m } = S(), g = I();
13
+ return { convertLegacyStrategy: async () => {
14
+ const e = t.currentRecommendationId;
15
+ if (e === null || !t.isLegacyStrategyBlock || t.legacyConversionLoading)
16
+ return "";
17
+ const { strategy: d, productIds: l, filters: y } = t.recommendationConfigs, i = b({
18
+ campaignId: o.campaignId,
19
+ templateLibraryId: o.templateLibraryId
20
+ }), p = R({
21
+ blockId: e,
22
+ url: s(String(e)),
23
+ campaignId: o.campaignId,
24
+ variationId: o.variationId,
25
+ strategy: d,
26
+ productIds: l,
27
+ filters: y,
28
+ attributes: t.getFilterList,
29
+ target: i
30
+ });
31
+ let r;
32
+ try {
33
+ r = await t.convertLegacyStrategy(p, i);
34
+ } catch (n) {
35
+ return console.error("[useLegacyStrategyConversion] migration failed", n), m({
36
+ type: C.Error,
37
+ message: g("email-editor.legacy-strategy-update-failed")
38
+ }), "";
39
+ }
40
+ const c = t.currentRecommendationId === e;
41
+ if (c)
42
+ try {
43
+ await t.fetchRecommendationProducts();
44
+ } catch (n) {
45
+ console.error("[useLegacyStrategyConversion] product refetch failed", n);
46
+ }
47
+ const a = t.blockStates[e];
48
+ if (!a)
49
+ return r;
50
+ const { size: u } = a.recommendationConfigs;
51
+ return T(
52
+ e,
53
+ { strategyId: r, size: u, configVersion: L },
54
+ a.recommendationProducts,
55
+ "Converted legacy recommendation strategy"
56
+ ), c && t.openLegacyStrategyUpdatedModal(), r;
57
+ } };
58
+ };
59
+ export {
60
+ V as useLegacyStrategyConversion
61
+ };
@@ -4,10 +4,11 @@ const l = {
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"
8
- }, c = {
7
+ RECOMMENDATION_STRATEGIES_PANEL_PATH: "/discovery/recommendation-strategies",
8
+ NEWSLETTER_RECOMMENDATIONS_PATH: "/newsletter/recommendations"
9
+ }, c = "migrate-strategies", d = "template", m = {
9
10
  CLIENT_ID: "clientId"
10
- }, d = () => {
11
+ }, p = () => {
11
12
  const e = r();
12
13
  return [
13
14
  {
@@ -71,14 +72,14 @@ const l = {
71
72
  path: "top-sellers"
72
73
  }
73
74
  ];
74
- }, m = ["discount", "omnibus_price", "omnibus_discount", "price", "original_price"], p = [
75
+ }, v = ["discount", "omnibus_price", "omnibus_discount", "price", "original_price"], h = [
75
76
  { text: "before the amount", value: "0" },
76
77
  { text: "after the amount", value: "1" }
77
- ], v = [
78
+ ], x = [
78
79
  { text: "dot(.)", value: "." },
79
80
  { text: "comma(,)", value: "," },
80
81
  { text: "space( )", value: " " }
81
- ], h = [
82
+ ], E = [
82
83
  { text: "0", value: "0" },
83
84
  { text: "1", value: "1" },
84
85
  { text: "2", value: "2" },
@@ -107,7 +108,7 @@ const l = {
107
108
  ], i = [
108
109
  { text: "true", value: "==" },
109
110
  { text: "false", value: "!=" }
110
- ], x = (e) => {
111
+ ], T = (e) => {
111
112
  if (!e)
112
113
  return t;
113
114
  switch (e) {
@@ -126,15 +127,17 @@ const l = {
126
127
  }
127
128
  };
128
129
  export {
130
+ c as MIGRATE_STRATEGIES_SEGMENT,
129
131
  a as OP_ANY_OF,
130
- m as PriceAttributes,
131
- c as QUERY_PARAMS,
132
+ v as PriceAttributes,
133
+ m as QUERY_PARAMS,
134
+ d as TEMPLATE_MIGRATION_SCOPE_SEGMENT,
132
135
  l as URLS,
133
- h as currencyDecimalCounts,
134
- p as currencyLocationMaps,
135
- v as currencyOperators,
136
- x as getOperatorOptions,
137
- d as getRecommendationFeedSourceMaps,
136
+ E as currencyDecimalCounts,
137
+ h as currencyLocationMaps,
138
+ x as currencyOperators,
139
+ T as getOperatorOptions,
140
+ p as getRecommendationFeedSourceMaps,
138
141
  n as operatorOptionsForArrayOfStrings,
139
142
  i as operatorOptionsForBooleans,
140
143
  s as operatorOptionsForDates,