@useinsider/guido 1.0.3-beta.c8da346 → 1.0.3-beta.cafee45

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 (199) hide show
  1. package/README.md +3 -0
  2. package/dist/components/Guido.vue.js +3 -3
  3. package/dist/components/Guido.vue2.js +84 -82
  4. package/dist/components/organisms/header/RightSlot.vue.js +1 -1
  5. package/dist/components/organisms/header/RightSlot.vue2.js +23 -22
  6. package/dist/components/organisms/onboarding/ItemsOnboarding.vue.js +21 -0
  7. package/dist/components/organisms/onboarding/ItemsOnboarding.vue2.js +99 -0
  8. package/dist/components/organisms/onboarding/OnboardingWrapper.vue2.js +20 -18
  9. package/dist/composables/useActionsApi.js +33 -24
  10. package/dist/composables/useBlocksConfig.js +1 -2
  11. package/dist/composables/useGuidoActions.js +19 -9
  12. package/dist/composables/useHtmlCompiler.js +15 -13
  13. package/dist/composables/useHtmlValidator.js +36 -35
  14. package/dist/composables/useStripo.js +63 -55
  15. package/dist/composables/useTimerClone.js +67 -0
  16. package/dist/config/compiler/itemsCompilerRules.js +14 -0
  17. package/dist/config/compiler/unsubscribeCompilerRules.js +33 -28
  18. package/dist/enums/defaults.js +2 -1
  19. package/dist/enums/extensions/recommendationBlock.js +2 -2
  20. package/dist/enums/onboarding.js +7 -3
  21. package/dist/enums/unsubscribe.js +27 -25
  22. package/dist/extensions/Blocks/Checkbox/block.js +5 -2
  23. package/dist/extensions/Blocks/Checkbox/control.js +15 -14
  24. package/dist/extensions/Blocks/Checkbox/template.js +14 -9
  25. package/dist/extensions/Blocks/Items/block.js +67 -0
  26. package/dist/extensions/Blocks/Items/controls/button/link.js +68 -0
  27. package/dist/extensions/Blocks/Items/controls/cardComposition.js +193 -0
  28. package/dist/extensions/Blocks/Items/controls/image/link.js +68 -0
  29. package/dist/extensions/Blocks/Items/controls/index.js +217 -0
  30. package/dist/extensions/Blocks/Items/controls/name/trimming.js +70 -0
  31. package/dist/extensions/Blocks/Items/controls/price/currencyLocation.js +107 -0
  32. package/dist/extensions/Blocks/Items/controls/price/currencySymbol.js +123 -0
  33. package/dist/extensions/Blocks/Items/controls/price/formattedPrice.js +76 -0
  34. package/dist/extensions/Blocks/Items/controls/price/hideDiscount.js +61 -0
  35. package/dist/extensions/Blocks/Items/controls/settingsControl.js +312 -0
  36. package/dist/extensions/Blocks/Items/enums/controlEnums.js +5 -0
  37. package/dist/extensions/Blocks/Items/enums/productEnums.js +273 -0
  38. package/dist/extensions/Blocks/Items/enums/settingsEnums.js +76 -0
  39. package/dist/extensions/Blocks/Items/extension.js +19 -0
  40. package/dist/extensions/Blocks/Items/iconsRegistry.js +32 -0
  41. package/dist/extensions/Blocks/Items/items.css.js +23 -0
  42. package/dist/extensions/Blocks/Items/layouts/horizontal.html.js +62 -0
  43. package/dist/extensions/Blocks/Items/layouts/vertical.html.js +60 -0
  44. package/dist/extensions/Blocks/Items/settingsPanel.js +131 -0
  45. package/dist/extensions/Blocks/Items/store/items-block.js +71 -0
  46. package/dist/extensions/Blocks/Items/template.js +189 -0
  47. package/dist/extensions/Blocks/Items/utils/configBlockUtils.js +17 -0
  48. package/dist/extensions/Blocks/Items/utils/syncAttributeFromConfigBlock.js +28 -0
  49. package/dist/extensions/Blocks/Items/utils/syncAttributesFromConfigBlock.js +67 -0
  50. package/dist/extensions/Blocks/Items/utils/updateAttributes.js +44 -0
  51. package/dist/extensions/Blocks/RadioButton/block.js +5 -2
  52. package/dist/extensions/Blocks/RadioButton/control.js +18 -17
  53. package/dist/extensions/Blocks/RadioButton/template.js +18 -9
  54. package/dist/extensions/Blocks/Recommendation/iconsRegistry.js +43 -43
  55. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +1 -1
  56. package/dist/extensions/Blocks/Unsubscribe/block.js +27 -27
  57. package/dist/extensions/Blocks/common-control.js +174 -110
  58. package/dist/extensions/Blocks/controlFactories.js +223 -0
  59. package/dist/extensions/DynamicContent/dynamic-content-modal.js +18 -19
  60. package/dist/extensions/DynamicContent/dynamic-content.js +48 -65
  61. package/dist/guido.css +1 -1
  62. package/dist/node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js +213 -168
  63. package/dist/node_modules/lodash-es/_DataView.js +6 -0
  64. package/dist/node_modules/lodash-es/_Promise.js +6 -0
  65. package/dist/node_modules/lodash-es/_Set.js +6 -0
  66. package/dist/node_modules/lodash-es/_SetCache.js +13 -0
  67. package/dist/node_modules/lodash-es/_WeakMap.js +6 -0
  68. package/dist/node_modules/lodash-es/_arrayFilter.js +10 -0
  69. package/dist/node_modules/lodash-es/_arrayLikeKeys.js +13 -12
  70. package/dist/node_modules/lodash-es/_arrayMap.js +8 -0
  71. package/dist/node_modules/lodash-es/_arrayPush.js +8 -0
  72. package/dist/node_modules/lodash-es/_arraySome.js +9 -0
  73. package/dist/node_modules/lodash-es/_baseEach.js +6 -0
  74. package/dist/node_modules/lodash-es/_baseFlatten.js +13 -0
  75. package/dist/node_modules/lodash-es/_baseForOwn.js +8 -0
  76. package/dist/node_modules/lodash-es/_baseGet.js +11 -0
  77. package/dist/node_modules/lodash-es/_baseGetAllKeys.js +9 -0
  78. package/dist/node_modules/lodash-es/_baseHasIn.js +6 -0
  79. package/dist/node_modules/lodash-es/_baseIsEqual.js +8 -0
  80. package/dist/node_modules/lodash-es/_baseIsEqualDeep.js +32 -0
  81. package/dist/node_modules/lodash-es/_baseIsMatch.js +29 -0
  82. package/dist/node_modules/lodash-es/_baseIteratee.js +11 -0
  83. package/dist/node_modules/lodash-es/_baseKeys.js +14 -0
  84. package/dist/node_modules/lodash-es/_baseMap.js +11 -0
  85. package/dist/node_modules/lodash-es/_baseMatches.js +12 -0
  86. package/dist/node_modules/lodash-es/_baseMatchesProperty.js +17 -0
  87. package/dist/node_modules/lodash-es/_baseProperty.js +8 -0
  88. package/dist/node_modules/lodash-es/_basePropertyDeep.js +9 -0
  89. package/dist/node_modules/lodash-es/_baseRange.js +9 -0
  90. package/dist/node_modules/lodash-es/_baseToString.js +18 -0
  91. package/dist/node_modules/lodash-es/_baseTrim.js +8 -0
  92. package/dist/node_modules/lodash-es/_cacheHas.js +6 -0
  93. package/dist/node_modules/lodash-es/_castPath.js +10 -0
  94. package/dist/node_modules/lodash-es/_createBaseEach.js +15 -0
  95. package/dist/node_modules/lodash-es/_createRange.js +11 -0
  96. package/dist/node_modules/lodash-es/_equalArrays.js +40 -0
  97. package/dist/node_modules/lodash-es/_equalByTag.js +45 -0
  98. package/dist/node_modules/lodash-es/_equalObjects.js +36 -0
  99. package/dist/node_modules/lodash-es/_getAllKeys.js +9 -0
  100. package/dist/node_modules/lodash-es/_getMatchData.js +12 -0
  101. package/dist/node_modules/lodash-es/_getSymbols.js +10 -0
  102. package/dist/node_modules/lodash-es/_getTag.js +28 -0
  103. package/dist/node_modules/lodash-es/_hasPath.js +19 -0
  104. package/dist/node_modules/lodash-es/_isFlattenable.js +10 -0
  105. package/dist/node_modules/lodash-es/_isKey.js +12 -0
  106. package/dist/node_modules/lodash-es/_isStrictComparable.js +7 -0
  107. package/dist/node_modules/lodash-es/_mapToArray.js +9 -0
  108. package/dist/node_modules/lodash-es/_matchesStrictComparable.js +8 -0
  109. package/dist/node_modules/lodash-es/_memoizeCapped.js +11 -0
  110. package/dist/node_modules/lodash-es/_nativeKeys.js +5 -0
  111. package/dist/node_modules/lodash-es/_setCacheAdd.js +7 -0
  112. package/dist/node_modules/lodash-es/_setCacheHas.js +6 -0
  113. package/dist/node_modules/lodash-es/_setToArray.js +9 -0
  114. package/dist/node_modules/lodash-es/_stringToPath.js +10 -0
  115. package/dist/node_modules/lodash-es/_toKey.js +10 -0
  116. package/dist/node_modules/lodash-es/_trimmedEndIndex.js +9 -0
  117. package/dist/node_modules/lodash-es/flatMap.js +8 -0
  118. package/dist/node_modules/lodash-es/get.js +8 -0
  119. package/dist/node_modules/lodash-es/hasIn.js +8 -0
  120. package/dist/node_modules/lodash-es/isSymbol.js +9 -0
  121. package/dist/node_modules/lodash-es/keys.js +9 -0
  122. package/dist/node_modules/lodash-es/keysIn.js +3 -3
  123. package/dist/node_modules/lodash-es/map.js +11 -0
  124. package/dist/node_modules/lodash-es/property.js +10 -0
  125. package/dist/node_modules/lodash-es/range.js +5 -0
  126. package/dist/node_modules/lodash-es/stubArray.js +6 -0
  127. package/dist/node_modules/lodash-es/toFinite.js +14 -0
  128. package/dist/node_modules/lodash-es/toNumber.js +22 -0
  129. package/dist/node_modules/lodash-es/toString.js +7 -0
  130. package/dist/package.json.js +1 -1
  131. package/dist/services/recommendationApi.js +13 -19
  132. package/dist/src/@types/generic.d.ts +2 -1
  133. package/dist/src/components/Guido.vue.d.ts +1 -0
  134. package/dist/src/components/organisms/onboarding/ItemsOnboarding.vue.d.ts +2 -0
  135. package/dist/src/composables/useActionsApi.d.ts +1 -0
  136. package/dist/src/composables/useGuidoActions.d.ts +9 -0
  137. package/dist/src/composables/useTimerClone.d.ts +5 -0
  138. package/dist/src/config/compiler/itemsCompilerRules.d.ts +2 -0
  139. package/dist/src/enums/onboarding.d.ts +4 -0
  140. package/dist/src/extensions/Blocks/Checkbox/block.d.ts +1 -0
  141. package/dist/src/extensions/Blocks/Checkbox/template.d.ts +1 -1
  142. package/dist/src/extensions/Blocks/Items/block.d.ts +27 -0
  143. package/dist/src/extensions/Blocks/Items/controls/button/link.d.ts +14 -0
  144. package/dist/src/extensions/Blocks/Items/controls/cardComposition.d.ts +33 -0
  145. package/dist/src/extensions/Blocks/Items/controls/image/link.d.ts +14 -0
  146. package/dist/src/extensions/Blocks/Items/controls/index.d.ts +501 -0
  147. package/dist/src/extensions/Blocks/Items/controls/name/trimming.d.ts +14 -0
  148. package/dist/src/extensions/Blocks/Items/controls/price/currencyLocation.d.ts +19 -0
  149. package/dist/src/extensions/Blocks/Items/controls/price/currencySymbol.d.ts +21 -0
  150. package/dist/src/extensions/Blocks/Items/controls/price/formattedPrice.d.ts +14 -0
  151. package/dist/src/extensions/Blocks/Items/controls/price/hideDiscount.d.ts +13 -0
  152. package/dist/src/extensions/Blocks/Items/controls/settingsControl.d.ts +48 -0
  153. package/dist/src/extensions/Blocks/Items/enums/controlEnums.d.ts +61 -0
  154. package/dist/src/extensions/Blocks/Items/enums/productEnums.d.ts +162 -0
  155. package/dist/src/extensions/Blocks/Items/enums/settingsEnums.d.ts +49 -0
  156. package/dist/src/extensions/Blocks/Items/extension.d.ts +2 -0
  157. package/dist/src/extensions/Blocks/Items/iconsRegistry.d.ts +4 -0
  158. package/dist/src/extensions/Blocks/Items/settingsPanel.d.ts +4 -0
  159. package/dist/src/extensions/Blocks/Items/store/items-block.d.ts +41 -0
  160. package/dist/src/extensions/Blocks/Items/template.d.ts +24 -0
  161. package/dist/src/extensions/Blocks/Items/utils/configBlockUtils.d.ts +23 -0
  162. package/dist/src/extensions/Blocks/Items/utils/syncAttributeFromConfigBlock.d.ts +32 -0
  163. package/dist/src/extensions/Blocks/Items/utils/syncAttributesFromConfigBlock.d.ts +44 -0
  164. package/dist/src/extensions/Blocks/Items/utils/updateAttributes.d.ts +8 -0
  165. package/dist/src/extensions/Blocks/RadioButton/block.d.ts +1 -0
  166. package/dist/src/extensions/Blocks/RadioButton/template.d.ts +1 -1
  167. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +1 -1
  168. package/dist/src/extensions/Blocks/common-control.d.ts +44 -7
  169. package/dist/src/extensions/Blocks/controlFactories.d.ts +312 -0
  170. package/dist/src/extensions/DynamicContent/dynamic-content-modal.d.ts +1 -0
  171. package/dist/src/extensions/DynamicContent/dynamic-content.d.ts +9 -7
  172. package/dist/src/stores/config.d.ts +2 -1
  173. package/dist/src/stores/dynamic-content.d.ts +1 -1
  174. package/dist/src/stores/editor.d.ts +1 -1
  175. package/dist/src/stores/onboarding.d.ts +335 -1
  176. package/dist/src/stores/preview.d.ts +1 -1
  177. package/dist/src/stores/recommendation.d.ts +1 -1
  178. package/dist/src/stores/save-as-template.d.ts +1 -1
  179. package/dist/src/stores/toaster.d.ts +1 -1
  180. package/dist/src/stores/unsubscribe.d.ts +1 -1
  181. package/dist/src/stores/version-history.d.ts +1 -1
  182. package/dist/src/utils/environmentUtil.d.ts +5 -0
  183. package/dist/src/utils/genericUtil.d.ts +1 -0
  184. package/dist/src/utils/pairProductVariables.d.ts +7 -0
  185. package/dist/static/styles/customEditorStyle.css.js +1 -1
  186. package/dist/stores/config.js +5 -5
  187. package/dist/stores/dynamic-content.js +2 -2
  188. package/dist/stores/editor.js +1 -1
  189. package/dist/stores/onboarding.js +44 -36
  190. package/dist/stores/preview.js +1 -1
  191. package/dist/stores/recommendation.js +3 -3
  192. package/dist/stores/save-as-template.js +2 -2
  193. package/dist/stores/toaster.js +1 -1
  194. package/dist/stores/unsubscribe.js +1 -1
  195. package/dist/stores/version-history.js +4 -4
  196. package/dist/utils/environmentUtil.js +4 -0
  197. package/dist/utils/genericUtil.js +18 -8
  198. package/dist/utils/pairProductVariables.js +136 -0
  199. package/package.json +4 -4
@@ -1,6 +1,6 @@
1
1
  import { provideValue as o, useInjectedValue as t } from "./useProvideInject.js";
2
- const r = Symbol.for("guido.back"), n = Symbol.for("guido.save.start"), a = Symbol.for("guido.save.complete"), s = (e) => {
3
- o(r, e.onBack), o(n, e.onSaveStart), o(a, e.onSaveComplete);
2
+ const r = Symbol.for("guido.back"), n = Symbol.for("guido.save.start"), c = Symbol.for("guido.save.complete"), a = Symbol.for("guido.test.email.click"), i = (e) => {
3
+ o(r, e.onBack), o(n, e.onSaveStart), o(c, e.onSaveComplete), o(a, e.onTestEmailClick);
4
4
  }, u = () => {
5
5
  try {
6
6
  return t(r);
@@ -9,7 +9,7 @@ const r = Symbol.for("guido.back"), n = Symbol.for("guido.save.start"), a = Symb
9
9
  "useBack: No back handler provided. Make sure Guido component is in the component tree."
10
10
  );
11
11
  }
12
- }, d = () => {
12
+ }, l = () => {
13
13
  try {
14
14
  return t(n);
15
15
  } catch {
@@ -17,21 +17,31 @@ const r = Symbol.for("guido.back"), n = Symbol.for("guido.save.start"), a = Symb
17
17
  "useSaveStart: No save start handler provided. Make sure Guido component is in the component tree."
18
18
  );
19
19
  }
20
- }, i = () => {
20
+ }, d = () => {
21
21
  try {
22
- return t(a);
22
+ return t(c);
23
23
  } catch {
24
24
  throw new Error(
25
25
  "useSaveComplete: No save complete handler provided. Make sure Guido component is in the component tree."
26
26
  );
27
27
  }
28
+ }, m = () => {
29
+ try {
30
+ return t(a);
31
+ } catch {
32
+ throw new Error(
33
+ "useTestEmailClick: No test email click handler provided. Make sure Guido component is in the component tree."
34
+ );
35
+ }
28
36
  };
29
37
  export {
30
38
  r as BACK_KEY,
31
- a as SAVE_COMPLETE_KEY,
39
+ c as SAVE_COMPLETE_KEY,
32
40
  n as SAVE_START_KEY,
33
- s as provideGuidoActions,
41
+ a as TEST_EMAIL_CLICK_KEY,
42
+ i as provideGuidoActions,
34
43
  u as useBack,
35
- i as useSaveComplete,
36
- d as useSaveStart
44
+ d as useSaveComplete,
45
+ l as useSaveStart,
46
+ m as useTestEmailClick
37
47
  };
@@ -1,25 +1,27 @@
1
1
  import { defaultHtmlCompilerRules as t } from "../config/compiler/htmlCompilerRules.js";
2
- import { outlookCompilerRules as p } from "../config/compiler/outlookCompilerRules.js";
3
- import { recommendationCompilerRules as s } from "../config/compiler/recommendationCompilerRules.js";
4
- import { socialCompilerRules as u } from "../config/compiler/socialCompilerRules.js";
5
- import { unsubscribeCompilerRules as n } from "../config/compiler/unsubscribeCompilerRules.js";
6
- import { createHtmlCompiler as c } from "../utils/htmlCompiler.js";
7
- import { useConfig as f } from "./useConfig.js";
8
- const h = () => {
9
- const { config: e } = f(), l = e.htmlCompilerRules || [], m = [
2
+ import { itemsCompilerRules as p } from "../config/compiler/itemsCompilerRules.js";
3
+ import { outlookCompilerRules as s } from "../config/compiler/outlookCompilerRules.js";
4
+ import { recommendationCompilerRules as u } from "../config/compiler/recommendationCompilerRules.js";
5
+ import { socialCompilerRules as n } from "../config/compiler/socialCompilerRules.js";
6
+ import { unsubscribeCompilerRules as c } from "../config/compiler/unsubscribeCompilerRules.js";
7
+ import { createHtmlCompiler as f } from "../utils/htmlCompiler.js";
8
+ import { useConfig as R } from "./useConfig.js";
9
+ const x = () => {
10
+ const { config: e } = R(), m = e.htmlCompilerRules || [], l = [
10
11
  ...!!e.ignoreDefaultHtmlCompilerRules ? [] : t,
12
+ ...u,
13
+ ...c,
14
+ ...p,
11
15
  ...s,
12
16
  ...n,
13
- ...p,
14
- ...u,
15
- ...l.map((o, i) => ({
17
+ ...m.map((o, i) => ({
16
18
  ...o,
17
19
  priority: o.priority + 1e3 + i
18
20
  // Ensure additional rules run after default rules
19
21
  }))
20
- ], r = c(m);
22
+ ], r = f(l);
21
23
  return { compileHtml: (o) => r.compile(o) };
22
24
  };
23
25
  export {
24
- h as useHtmlCompiler
26
+ x as useHtmlCompiler
25
27
  };
@@ -1,18 +1,19 @@
1
- import { useConfig as H } from "./useConfig.js";
2
- import { TemplateTypes as V } from "../enums/defaults.js";
3
- import { DISPLAY_CONDITIONS_REGEX as D, DISPLAY_CONDITIONS_EXCEPTIONS_REGEX as P, CampaignCouldNotBeSavedKey as R, CanNotMakeAnyChangesForRunningKey as _ } from "../enums/html-validator.js";
1
+ import { useConfig as V } from "./useConfig.js";
2
+ import { TemplateTypes as D } from "../enums/defaults.js";
3
+ import { DISPLAY_CONDITIONS_REGEX as H, DISPLAY_CONDITIONS_EXCEPTIONS_REGEX as P, CampaignCouldNotBeSavedKey as R, CanNotMakeAnyChangesForRunningKey as _ } from "../enums/html-validator.js";
4
4
  import { ToasterTypeOptions as l } from "../enums/toaster.js";
5
- import { useRecommendationStore as G } from "../stores/recommendation.js";
6
- import { base64EncodeWithSpecialChars as $ } from "../utils/base64.js";
7
- import { useHttp as j } from "./useHttp.js";
8
- import { useToaster as q } from "./useToaster.js";
9
- import { useTranslations as M } from "./useTranslations.js";
10
- const se = () => {
5
+ import { itemsBlockDynamicVariables as G } from "../extensions/Blocks/Items/enums/productEnums.js";
6
+ import { useRecommendationStore as $ } from "../stores/recommendation.js";
7
+ import { base64EncodeWithSpecialChars as j } from "../utils/base64.js";
8
+ import { useHttp as q } from "./useHttp.js";
9
+ import { useToaster as M } from "./useToaster.js";
10
+ import { useTranslations as X } from "./useTranslations.js";
11
+ const ie = () => {
11
12
  var d;
12
- const { showToaster: c } = q(), { post: y } = j(), { config: h } = H(), a = M(), m = G(), u = ((d = h.partner) == null ? void 0 : d.messageType) === V.transactional, v = async (e) => {
13
+ const { showToaster: c } = M(), { post: y } = q(), { config: h } = V(), a = X(), m = $(), u = ((d = h.partner) == null ? void 0 : d.messageType) === D.transactional, v = async (e) => {
13
14
  const t = await y(
14
15
  "/newsletter/template-library/check-template-html-body",
15
- { html: $(e) }
16
+ { html: j(e) }
16
17
  ), { status: n, message: r } = t.data;
17
18
  return n || c({
18
19
  type: l.Alert,
@@ -25,10 +26,10 @@ const se = () => {
25
26
  const t = e.match(/({%(.*?)%})/g);
26
27
  let n = !0;
27
28
  return t !== null && !u && t.forEach((r) => {
28
- const o = r.slice(2, -2).trim().match(/(".*?"|[^"\s]+)(?=\s*|\s*$)/g);
29
- if (o && o.length > 0) {
30
- const [i] = o;
31
- C(i) && !s.includes(i) && (c({
29
+ const i = r.slice(2, -2).trim().match(/(".*?"|[^"\s]+)(?=\s*|\s*$)/g);
30
+ if (i && i.length > 0) {
31
+ const [o] = i;
32
+ C(o) && !s.includes(o) && (c({
32
33
  type: l.Warning,
33
34
  message: a("custom-fields.invalid-custom-fields")
34
35
  }), n = !1);
@@ -58,19 +59,19 @@ const se = () => {
58
59
  }, k = (e, s) => {
59
60
  const t = e.match(/{{([a-zA-Z0-9_\s]*)}}/gm);
60
61
  if (t && !u) {
61
- const n = new Set(s.map((o) => o.toLowerCase())), r = [];
62
- if (t.forEach((o) => {
63
- const i = o.slice(2, -2).trim().toLowerCase();
64
- (!n.has(i) || i === "") && r.push(i);
62
+ const n = new Set(s.map((i) => i.toLowerCase())), r = [];
63
+ if (t.forEach((i) => {
64
+ const o = i.slice(2, -2).trim().toLowerCase();
65
+ (!n.has(o) || o === "") && r.push(o);
65
66
  }), r.length > 0) {
66
- const o = `
67
+ const i = `
67
68
  <ul>
68
- ${r.map((i) => `<li>${i}</li>`).join("")}
69
+ ${r.map((o) => `<li>${o}</li>`).join("")}
69
70
  </ul>
70
71
  `;
71
72
  return c({
72
73
  type: l.Alert,
73
- message: a("custom-fields.invalid-custom-fields") + o
74
+ message: a("custom-fields.invalid-custom-fields") + i
74
75
  }), !1;
75
76
  }
76
77
  }
@@ -79,11 +80,11 @@ const se = () => {
79
80
  const s = e.match(/{%(.*?)%}/g), t = [];
80
81
  let n = !0;
81
82
  if (s && s.forEach((r) => {
82
- const o = r.match(D), i = r.match(P), B = (o == null ? void 0 : o.join("")) || "";
83
- (!o || r !== B) && !i && (c({
83
+ const i = r.match(H), o = r.match(P), B = (i == null ? void 0 : i.join("")) || "";
84
+ (!i || r !== B) && !o && (c({
84
85
  type: l.Alert,
85
86
  message: a("newsletter.display-conditions-invalid-syntax")
86
- }), n = !1), o && o.forEach((f) => {
87
+ }), n = !1), i && i.forEach((f) => {
87
88
  f.trim() === "=" && (c({
88
89
  type: l.Alert,
89
90
  message: a("custom-conditions.wrong-equality-operators")
@@ -94,8 +95,8 @@ const se = () => {
94
95
  });
95
96
  });
96
97
  }), t.length) {
97
- const r = t.filter((i) => i === "if"), o = t.filter((i) => i === "endif");
98
- r.length !== o.length && (c({
98
+ const r = t.filter((o) => o === "if"), i = t.filter((o) => o === "endif");
99
+ r.length !== i.length && (c({
99
100
  type: l.Alert,
100
101
  message: a("custom-conditions.missing-if-endif-tag")
101
102
  }), n = !1);
@@ -121,28 +122,28 @@ const se = () => {
121
122
  }), !1);
122
123
  }, N = (e) => {
123
124
  const n = new DOMParser().parseFromString(e, "text/html").querySelectorAll(".checkbox-block-v2");
124
- return Array.from(n).find((o) => {
125
- var i;
126
- return !((i = o.id) != null && i.trim());
125
+ return Array.from(n).find((i) => {
126
+ var o;
127
+ return !((o = i.id) != null && o.trim());
127
128
  }) ? (c({
128
129
  type: l.Alert,
129
130
  message: a("unsubscribe-templates.select-checkbox-groups")
130
131
  }), !1) : !0;
131
132
  }, O = (e) => {
132
133
  const n = new DOMParser().parseFromString(e, "text/html").querySelectorAll(".radio-button-v2");
133
- return Array.from(n).find((o) => {
134
- var i;
135
- return !((i = o.id) != null && i.trim());
134
+ return Array.from(n).find((i) => {
135
+ var o;
136
+ return !((o = i.id) != null && o.trim());
136
137
  }) ? (c({
137
138
  type: l.Alert,
138
139
  message: a("unsubscribe-templates.select-radio-button-groups")
139
140
  }), !1) : !0;
140
141
  };
141
142
  return { validateHtml: async (e, s, t = !1) => {
142
- const n = s.map((o) => o.value);
143
+ const n = [...s.map((i) => i.value), ...G];
143
144
  return await b(e, n, t) && E(e) && A(e) && x(e) && k(e, n) && T(e) && F(e) && I(e) && W() && L(e) && N(e) && O(e);
144
145
  } };
145
146
  };
146
147
  export {
147
- se as useHtmlValidator
148
+ ie as useHtmlValidator
148
149
  };
@@ -1,23 +1,26 @@
1
- import { useActionsApi as y } from "./useActionsApi.js";
2
- import { useBlocksConfig as E } from "./useBlocksConfig.js";
3
- import { useCustomInterfaceAppearance as w } from "./useCustomInterfaceAppearance.js";
4
- import { useStripoEventHandler as h } from "./useStripoEventHandler.js";
5
- import { useToaster as b } from "./useToaster.js";
6
- import { displayConditions as k } from "../enums/displayConditions.js";
7
- import { useStripoApi as B } from "../services/stripoApi.js";
8
- import V from "../static/styles/customEditorStyle.css.js";
9
- import { useEditorStore as _ } from "../stores/editor.js";
10
- import { dynamicContentToMergeTags as F } from "../utils/genericUtil.js";
11
- import A from "../package.json.js";
12
- const L = (d) => {
13
- const { handleError: u } = b(), { getToken: p, getCustomFonts: m } = B(), { handleEvent: g } = h(), { getStripoBlocksConfig: f } = E(), S = async (r, i = []) => {
14
- const t = _(), { html: n, css: l, forceRecreate: a } = r, { baseBlocks: e, extensions: c } = await f();
1
+ import { useActionsApi as V } from "./useActionsApi.js";
2
+ import { useBlocksConfig as _ } from "./useBlocksConfig.js";
3
+ import { useConfig as A } from "./useConfig.js";
4
+ import { useCustomInterfaceAppearance as B } from "./useCustomInterfaceAppearance.js";
5
+ import { useStripoEventHandler as v } from "./useStripoEventHandler.js";
6
+ import { useTimerClone as F } from "./useTimerClone.js";
7
+ import { useToaster as I } from "./useToaster.js";
8
+ import { displayConditions as M } from "../enums/displayConditions.js";
9
+ import { useStripoApi as U } from "../services/stripoApi.js";
10
+ import D from "../static/styles/customEditorStyle.css.js";
11
+ import { useEditorStore as P } from "../stores/editor.js";
12
+ import { dynamicContentToMergeTags as H } from "../utils/genericUtil.js";
13
+ import O from "../package.json.js";
14
+ const Y = (c) => {
15
+ const { config: u } = A(), { handleError: p } = I(), { getToken: m, getCustomFonts: C } = U(), { handleEvent: S } = v(), { getStripoBlocksConfig: E } = _(), w = async (i, r = []) => {
16
+ var g, y;
17
+ const e = P(), { html: s, css: f, forceRecreate: a } = i, { baseBlocks: t, extensions: d } = await E();
15
18
  window.UIEditor.initEditor(
16
19
  document.querySelector("#guido-editor"),
17
20
  {
18
- metadata: d,
19
- html: n,
20
- css: l,
21
+ metadata: c,
22
+ html: s,
23
+ css: f,
21
24
  forceRecreate: a,
22
25
  locale: "en",
23
26
  undoButtonSelector: "#guido__undo-button",
@@ -28,83 +31,88 @@ const L = (d) => {
28
31
  customAppearanceMergetags: !0,
29
32
  customAppearanceMergetagsBorderColor: "#f1f3fe",
30
33
  customAppearanceMergetagsBackgroundColor: "#f1f3fe",
31
- customViewStyles: V,
32
- conditionsEnabled: !0,
33
- customConditionsEnabled: !0,
34
- conditionCategories: k,
34
+ customViewStyles: D,
35
+ conditionsEnabled: ((g = u.features) == null ? void 0 : g.displayConditions) ?? !0,
36
+ customConditionsEnabled: ((y = u.features) == null ? void 0 : y.displayConditions) ?? !0,
37
+ conditionCategories: M,
35
38
  enableXSSSecurity: !0,
36
- messageSettingsEnabled: !1,
37
- selectBlockAfterDropFromSettingsPanel: !0,
38
- ...e ? { baseBlocks: e } : {},
39
+ messageSettingsEnabled: !0,
40
+ displayGmailAnnotations: !0,
41
+ displayHiddenPreheader: !1,
42
+ displayTitle: !1,
43
+ displayUTM: !1,
44
+ selectElementAfterDrop: !0,
45
+ ...t ? { baseBlocks: t } : {},
39
46
  editorFonts: {
40
47
  showDefaultStandardFonts: !0,
41
48
  showDefaultNotStandardFonts: !0,
42
- customFonts: i
49
+ customFonts: r
43
50
  },
44
51
  mergeTags: [
45
52
  {
46
- entries: F(d.preselectedDynamicContentList)
53
+ entries: H(c.preselectedDynamicContentList)
47
54
  }
48
55
  ],
49
56
  async onTokenRefreshRequest(o) {
50
57
  try {
51
- const s = await p();
52
- o(s);
53
- } catch (s) {
54
- u(s, "Failed to refresh token");
58
+ const n = await m();
59
+ o(n);
60
+ } catch (n) {
61
+ p(n, "Failed to refresh token");
55
62
  }
56
63
  },
57
64
  onTemplateLoaded() {
65
+ var o, n;
58
66
  try {
59
- const { importCss: o } = w(), { activateCustomViewStyles: s } = y();
60
- o(), s(), d.onReady(), t.isStripoInitialized = !0, t.loadingStatus = !1, setTimeout(() => {
61
- t.hasChanges = !1;
67
+ const { importCss: l } = B(), { activateCustomViewStyles: T, updateTimerInClonedTemplate: b } = V(), { updateTimersOnLoad: k } = F();
68
+ l(), T(), typeof ((n = (o = window.StripoEditorApi) == null ? void 0 : o.actionsApi) == null ? void 0 : n.updateTimerInClonedTemplate) == "function" ? b() : k(m), c.onReady(), e.isStripoInitialized = !0, e.loadingStatus = !1, setTimeout(() => {
69
+ e.hasChanges = !1;
62
70
  }, 1e3);
63
- } catch (o) {
64
- u(o, "Failed to load custom interface appearance");
71
+ } catch (l) {
72
+ p(l, "Failed to load custom interface appearance");
65
73
  }
66
74
  },
67
75
  onCodeEditorVisibilityChanged(o) {
68
- t.isCodeEditorOpen = o;
76
+ e.isCodeEditorOpen = o;
69
77
  },
70
78
  onEditorVisualModeChanged(o) {
71
- t.editorVisualMode = o.toLowerCase();
79
+ e.editorVisualMode = o.toLowerCase();
72
80
  },
73
81
  onVersionHistoryVisibilityChanged(o) {
74
- t.isVersionHistoryOpen = o;
82
+ e.isVersionHistoryOpen = o;
75
83
  },
76
84
  onDataChanged() {
77
- t.hasChanges = !0;
85
+ e.hasChanges = !0;
78
86
  },
79
- onEvent: g,
87
+ onEvent: S,
80
88
  ignoreClickOutsideSelectors: [
81
89
  "#guido-dynamic-content-modal",
82
90
  ".in-on-board-wrapper",
83
91
  ".in-drawer__container"
84
92
  ],
85
- extensions: c
93
+ extensions: d
86
94
  }
87
95
  );
88
- }, C = (r) => new Promise((i, t) => {
89
- var c;
96
+ }, h = (i) => new Promise((r, e) => {
97
+ var d;
90
98
  if (document.getElementById("UiEditorScript")) {
91
- r(), i();
99
+ i(), r();
92
100
  return;
93
101
  }
94
- const n = A.guido, a = `https://email-static.useinsider.com/guido/${(c = n == null ? void 0 : n.stripo) == null ? void 0 : c.version}/UIEditor.js`, e = document.createElement("script");
95
- e.id = "UiEditorScript", e.type = "module", e.src = a, e.onload = () => {
96
- r(), i();
97
- }, e.onerror = () => {
98
- t(new Error(`Failed to load Stripo UIEditor script from S3: ${a}`));
99
- }, document.body.appendChild(e);
102
+ const s = O.guido, a = `https://email-static.useinsider.com/guido/${(d = s == null ? void 0 : s.stripo) == null ? void 0 : d.version}/UIEditor.js`, t = document.createElement("script");
103
+ t.id = "UiEditorScript", t.type = "module", t.src = a, t.onload = () => {
104
+ i(), r();
105
+ }, t.onerror = () => {
106
+ e(new Error(`Failed to load Stripo UIEditor script from S3: ${a}`));
107
+ }, document.body.appendChild(t);
100
108
  });
101
- return { initPlugin: async (r) => {
102
- await C(async () => {
103
- const i = await m();
104
- await S(r, i);
109
+ return { initPlugin: async (i) => {
110
+ await h(async () => {
111
+ const r = await C();
112
+ await w(i, r);
105
113
  });
106
114
  } };
107
115
  };
108
116
  export {
109
- L as useStripo
117
+ Y as useStripo
110
118
  };
@@ -0,0 +1,67 @@
1
+ import { useToaster as g } from "./useToaster.js";
2
+ const M = () => {
3
+ const { handleError: l } = g(), a = (r) => /esd-timer-id="(\d+)"/.test(r), c = async (r, n) => {
4
+ try {
5
+ console.log("[TIMER CLONE] Calling Stripo API to clone timers...");
6
+ const e = await fetch("https://plugins.stripo.email/api/v1/timers/clone", {
7
+ method: "POST",
8
+ headers: {
9
+ "ES-PLUGIN-AUTH": `Bearer ${n}`,
10
+ "Content-Type": "application/json"
11
+ },
12
+ body: JSON.stringify({ html: r })
13
+ });
14
+ if (console.log("[TIMER CLONE] API response status:", e.status), !e.ok) {
15
+ const s = await e.text();
16
+ throw console.error("[TIMER CLONE] API error:", s), new Error(`Stripo API error: ${e.status} ${e.statusText}`);
17
+ }
18
+ const t = await e.json();
19
+ return console.log("[TIMER CLONE] Timers cloned successfully. Map:", t.timersMap), console.log("[TIMER CLONE] Old HTML length:", r.length), console.log("[TIMER CLONE] New HTML length:", t.html.length), t.html;
20
+ } catch (e) {
21
+ return console.error("[TIMER CLONE] Error:", e), l(e, "Failed to clone timer IDs"), null;
22
+ }
23
+ };
24
+ return {
25
+ hasTimerBlocks: a,
26
+ cloneTimersInHtml: c,
27
+ updateTimersOnLoad: async (r) => {
28
+ var n, e, t, s, d, E;
29
+ try {
30
+ console.log("[TIMER CLONE] Starting timer update on template load...");
31
+ const o = (e = (n = window.UIEditor) == null ? void 0 : n.getHtml) == null ? void 0 : e.call(n);
32
+ if (!o) {
33
+ console.log("[TIMER CLONE] No HTML found, skipping timer update");
34
+ return;
35
+ }
36
+ const u = a(o);
37
+ if (console.log("[TIMER CLONE] Has timer blocks?", u), !u)
38
+ return;
39
+ const T = o.match(/esd-timer-id="(\d+)"/g);
40
+ console.log("[TIMER CLONE] Current timer IDs:", T), console.log("[TIMER CLONE] Getting auth token...");
41
+ const p = await r();
42
+ if (!p) {
43
+ console.warn("[TIMER CLONE] No auth token available, skipping timer update");
44
+ return;
45
+ }
46
+ const i = await c(o, p);
47
+ if (!i) {
48
+ console.warn("[TIMER CLONE] API returned no updated HTML");
49
+ return;
50
+ }
51
+ if (i === o) {
52
+ console.log("[TIMER CLONE] HTML unchanged, no update needed");
53
+ return;
54
+ }
55
+ const m = i.match(/esd-timer-id="(\d+)"/g);
56
+ console.log("[TIMER CLONE] New timer IDs:", m);
57
+ const I = ((s = (t = window.UIEditor) == null ? void 0 : t.getCss) == null ? void 0 : s.call(t)) || "";
58
+ console.log("[TIMER CLONE] Updating editor with new HTML..."), (E = (d = window.StripoEditorApi) == null ? void 0 : d.actionsApi) != null && E.updateHtmlAndCss ? (window.StripoEditorApi.actionsApi.updateHtmlAndCss(i, I), console.log("[TIMER CLONE] ✅ Editor updated successfully!")) : console.warn("[TIMER CLONE] updateHtmlAndCss method not available");
59
+ } catch (o) {
60
+ console.error("[TIMER CLONE] Error updating timers:", o), l(o, "Failed to update timer blocks");
61
+ }
62
+ }
63
+ };
64
+ };
65
+ export {
66
+ M as useTimerClone
67
+ };
@@ -0,0 +1,14 @@
1
+ import { pairProductVariables as r } from "../../utils/pairProductVariables.js";
2
+ const t = [
3
+ {
4
+ id: "pair-product-variables",
5
+ description: "Replace product default values with template variables",
6
+ type: "custom",
7
+ processor: r,
8
+ priority: 60
9
+ // After recommendation rules (priority 50-53)
10
+ }
11
+ ];
12
+ export {
13
+ t as itemsCompilerRules
14
+ };
@@ -1,36 +1,41 @@
1
- import { usePartner as U } from "../../composables/usePartner.js";
2
- import { LINK_REGEXES as l, LINK_TYPES as b, URLS as f } from "../../enums/unsubscribe.js";
3
- import { parsePageList as B } from "../../extensions/Blocks/Unsubscribe/utils/utils.js";
4
- import { useConfigStore as N } from "../../stores/config.js";
5
- import { useUnsubscribeStore as I } from "../../stores/unsubscribe.js";
6
- const T = [
1
+ import { usePartner as N } from "../../composables/usePartner.js";
2
+ import { LINK_REGEXES as l, LINK_TYPES as g, INSIDER_ID as f, URLS as S } from "../../enums/unsubscribe.js";
3
+ import { parsePageList as U } from "../../extensions/Blocks/Unsubscribe/utils/utils.js";
4
+ import { useConfigStore as B } from "../../stores/config.js";
5
+ import { useDynamicContentStore as y } from "../../stores/dynamic-content.js";
6
+ import { useUnsubscribeStore as L } from "../../stores/unsubscribe.js";
7
+ const D = [
7
8
  {
8
9
  id: "add-unsubscribe-link-values",
9
10
  description: "Adding unsubscribe link values",
10
11
  type: "custom",
11
12
  processor: (t) => {
12
- const { getPartnerName: i } = U(), a = N(), n = I(), u = a.getVariationId;
13
- if (!u)
13
+ const { getPartnerName: i } = N(), c = B(), n = y(), u = L(), a = c.getVariationId;
14
+ if (!a)
14
15
  return t;
15
- let o = t;
16
- const e = `/${i()}/email/${u}?user={{iid}}`;
17
- return new DOMParser().parseFromString(o, "text/html").querySelectorAll(".unsubscribe-block-v2[data-unsubscribe-page-list]").forEach((p) => {
18
- var g;
19
- const d = p.getAttribute("data-unsubscribe-page-list");
20
- if (!d)
16
+ let e = t;
17
+ const r = `/${i()}/email/${a}?user={{iid}}`;
18
+ return new DOMParser().parseFromString(e, "text/html").querySelectorAll(".unsubscribe-block-v2[data-unsubscribe-page-list]").forEach((p) => {
19
+ var b;
20
+ const m = p.getAttribute("data-unsubscribe-page-list");
21
+ if (!m)
21
22
  return;
22
- const S = B(d), m = ((g = n.templates) == null ? void 0 : g.filter(
23
- (c) => S.includes(c.id)
24
- )) ?? [], R = m.some((c) => c.type === b.UNSUBSCRIBE_LINK_TYPE), _ = m.some((c) => c.type === b.PREFERENCES_LINK_TYPE), E = p.outerHTML;
23
+ const R = U(m), d = ((b = u.templates) == null ? void 0 : b.filter(
24
+ (o) => R.includes(o.id)
25
+ )) ?? [], _ = d.some((o) => o.type === g.UNSUBSCRIBE_LINK_TYPE), I = d.some((o) => o.type === g.PREFERENCES_LINK_TYPE), E = p.outerHTML;
25
26
  let s = E;
26
- R && (s = s.replace(
27
+ _ && (n.selectedDynamicContentList.push({
28
+ text: f,
29
+ value: f,
30
+ fallback: ""
31
+ }), s = s.replace(
27
32
  l.GLOBAL_UNSUBSCRIBE_LINK_REGEX,
28
- f.UNSUBSCRIBE_URL + e
29
- )), _ && (s = s.replace(
33
+ S.UNSUBSCRIBE_URL + r
34
+ )), I && (s = s.replace(
30
35
  l.PREFERENCES_UNSUBSCRIBE_LINK_REGEX,
31
- f.PREFERENCES_URL + e
32
- )), s = s.replace(l.UNSUBSCRIBE_LINK_REGEX, ""), o = o.replace(E, s);
33
- }), o;
36
+ S.PREFERENCES_URL + r
37
+ )), s = s.replace(l.UNSUBSCRIBE_LINK_REGEX, ""), e = e.replace(E, s);
38
+ }), e;
34
39
  },
35
40
  priority: 60
36
41
  },
@@ -56,16 +61,16 @@ const T = [
56
61
  type: "custom",
57
62
  processor: (t) => {
58
63
  let i = t;
59
- const a = i.match(/<a[^>]+>(.*?)<\/a>/gm);
60
- return a && a.forEach((n) => {
64
+ const c = i.match(/<a[^>]+>(.*?)<\/a>/gm);
65
+ return c && c.forEach((n) => {
61
66
  if (n.includes("insEmail=1"))
62
67
  return;
63
68
  if (n.match(/<a\s+(?:[^>]*?\s+)?href=(["'`”])(.*?)\1\s+(?:[^>]*?\s+)?universal=(["'`”])true\3/gm)) {
64
- const o = n.replace(/href=(["'`”])(.*?)\1/gm, (e) => {
69
+ const a = n.replace(/href=(["'`”])(.*?)\1/gm, (e) => {
65
70
  const r = e.slice(6, e.length - 1).trim();
66
71
  return e.includes("?") || e.includes("#") ? r.slice(-1) === "&" ? e.replace(r, `${r}insEmail=1`) : e.replace(r, `${r}&insEmail=1`) : e.replace(r, `${r}?insEmail=1`);
67
72
  });
68
- i = i.replace(n, o);
73
+ i = i.replace(n, a);
69
74
  }
70
75
  }), i;
71
76
  },
@@ -73,5 +78,5 @@ const T = [
73
78
  }
74
79
  ];
75
80
  export {
76
- T as unsubscribeCompilerRules
81
+ D as unsubscribeCompilerRules
77
82
  };
@@ -16,7 +16,8 @@ const e = {
16
16
  dynamicContent: !0,
17
17
  saveAsTemplate: !0,
18
18
  versionHistory: !0,
19
- testMessage: !0
19
+ testMessage: !0,
20
+ displayConditions: !0
20
21
  },
21
22
  useHeader: !0
22
23
  }, t = {
@@ -12,8 +12,8 @@ const s = {
12
12
  { id: 61, key: "mostPopular", name: "Most Popular Items", path: "most-popular" },
13
13
  { id: 62, key: "mostPurchased", name: "Top Sellers", path: "top-sellers" }
14
14
  ], u = ["discount", "omnibus_price", "omnibus_discount", "price", "original_price"], l = [
15
- { text: "after the amount", value: "1" },
16
- { text: "before the amount", value: "0" }
15
+ { text: "before the amount", value: "0" },
16
+ { text: "after the amount", value: "1" }
17
17
  ], c = [
18
18
  { text: "dot(.)", value: "." },
19
19
  { text: "comma(,)", value: "," }
@@ -2,8 +2,12 @@ const e = [
2
2
  ".service-element.stacked-panel-item.ng-tns-c1014751574-3.level-bottom-0.ng-star-inserted",
3
3
  ".service-element.stacked-panel-item.ng-tns-c1014751574-3.level-bottom-1.ng-star-inserted",
4
4
  ".service-element.stacked-panel-item.ng-tns-c1014751574-3.level-bottom-2.ng-star-inserted"
5
- ], t = "https://academy.useinsider.com/docs/email-drag-drop-editor";
5
+ ], t = "ui-editor", n = 'button[role="tab"][aria-label="Card Composition"]', s = 'button[role="tab"][aria-label="Settings"]', o = ".in-ribbons-wrapper", a = "https://academy.useinsider.com/docs/email-drag-drop-editor";
6
6
  export {
7
- t as ACADEMY_LINK,
8
- e as SERVICE_HOVER_SELECTORS
7
+ a as ACADEMY_LINK,
8
+ n as CARD_COMPOSITION_TAB_SELECTOR,
9
+ o as RIBBON_SELECTOR,
10
+ e as SERVICE_HOVER_SELECTORS,
11
+ s as SETTINGS_TAB_SELECTOR,
12
+ t as UI_EDITOR_SELECTOR
9
13
  };