@useinsider/guido 3.7.0-beta.b2980d8 → 3.7.0-beta.bd7cb8f

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.
@@ -1,27 +1,29 @@
1
- import { useActionsApi as D } from "./useActionsApi.js";
2
- import { useBlocksConfig as I } from "./useBlocksConfig.js";
3
- import { useConfig as P } from "./useConfig.js";
4
- import { useCustomInterfaceAppearance as U } from "./useCustomInterfaceAppearance.js";
5
- import { useFullStoryBridge as R } from "./useFullStoryBridge.js";
1
+ import { useActionsApi as I } from "./useActionsApi.js";
2
+ import { useBlocksConfig as U } from "./useBlocksConfig.js";
3
+ import { useConfig as R } from "./useConfig.js";
4
+ import { useCustomInterfaceAppearance as x } from "./useCustomInterfaceAppearance.js";
5
+ import { useFullStoryBridge as O } from "./useFullStoryBridge.js";
6
6
  import { useStripoEventHandler as q } from "./useStripoEventHandler.js";
7
- import { useToaster as x } from "./useToaster.js";
8
- import { localePatch as H } from "../config/i18n/index.js";
9
- import { useStripoApi as O } from "../services/stripoApi.js";
10
- import j from "../static/styles/customEditorStyle.css.js";
11
- import { useEditorStore as E } from "../stores/editor.js";
12
- import { dynamicContentToMergeTags as z } from "../utils/genericUtil.js";
13
- import L from "../package.json.js";
14
- const se = (C, l) => {
15
- const { features: c, template: h, isFeatureEnabled: u } = P(), { handleError: m } = x(), { getToken: w, getCustomFonts: b, getSyncModulesStatus: k } = O(), { handleEvent: F } = q(), { getStripoBlocksConfig: B } = I(), T = async (i, r = [], s = !1) => {
7
+ import { useToaster as H } from "./useToaster.js";
8
+ import { localePatch as z } from "../config/i18n/index.js";
9
+ import { en as h } from "../config/i18n/en/index.js";
10
+ import { ToasterTypeOptions as L } from "../enums/toaster.js";
11
+ import { useStripoApi as $ } from "../services/stripoApi.js";
12
+ import G from "../static/styles/customEditorStyle.css.js";
13
+ import { useEditorStore as C } from "../stores/editor.js";
14
+ import { dynamicContentToMergeTags as J } from "../utils/genericUtil.js";
15
+ import N from "../package.json.js";
16
+ const ce = (E, l) => {
17
+ const { features: c, template: w, isFeatureEnabled: u } = R(), { handleError: m, showToaster: b } = H(), { getToken: T, getCustomFonts: k, getSyncModulesStatus: B } = $(), { handleEvent: F } = q(), { getStripoBlocksConfig: v } = U(), V = async (s, r = [], i = !1) => {
16
18
  var g, S, y;
17
- const e = E(), { html: p, css: a } = i, { baseBlocks: o, extensions: d } = await B(), f = ((g = c.value) == null ? void 0 : g.displayConditions) ?? !0, _ = ((S = c.value) == null ? void 0 : S.modulesDisabled) ?? !1, v = ((y = h.value) == null ? void 0 : y.forceRecreate) ?? !1;
18
- window.UIEditor.initEditor(
19
+ const e = C(), { html: p, css: a } = s, { baseBlocks: t, extensions: d } = await v(), f = ((g = c.value) == null ? void 0 : g.displayConditions) ?? !0, A = ((S = c.value) == null ? void 0 : S.modulesDisabled) ?? !1, M = ((y = w.value) == null ? void 0 : y.forceRecreate) ?? !1;
20
+ await window.UIEditor.initEditor(
19
21
  document.querySelector("#guido-editor"),
20
22
  {
21
- metadata: C,
23
+ metadata: E,
22
24
  html: p,
23
25
  css: a,
24
- forceRecreate: v,
26
+ forceRecreate: M,
25
27
  locale: "en",
26
28
  undoButtonSelector: "#guido__undo-button",
27
29
  redoButtonSelector: "#guido__redo-button",
@@ -31,12 +33,12 @@ const se = (C, l) => {
31
33
  customAppearanceMergetags: !u("liquidSyntax"),
32
34
  customAppearanceMergetagsBorderColor: "#f1f3fe",
33
35
  customAppearanceMergetagsBackgroundColor: "#f1f3fe",
34
- customViewStyles: j,
36
+ customViewStyles: G,
35
37
  conditionsEnabled: f,
36
38
  customConditionsEnabled: f,
37
39
  enableXSSSecurity: !0,
38
- modulesDisabled: _,
39
- syncModulesEnabled: s,
40
+ modulesDisabled: A,
41
+ syncModulesEnabled: i,
40
42
  messageSettingsEnabled: !0,
41
43
  displayGmailAnnotations: !0,
42
44
  displayHiddenPreheader: !1,
@@ -45,7 +47,7 @@ const se = (C, l) => {
45
47
  selectElementAfterDrop: !0,
46
48
  sameFontSizeForOutlook: !0,
47
49
  allowedScriptSourceDomains: "https://email-static.useinsider.com https://edge.fullstory.com https://rs.fullstory.com",
48
- ...o ? { baseBlocks: o } : {},
50
+ ...t ? { baseBlocks: t } : {},
49
51
  editorFonts: {
50
52
  showDefaultStandardFonts: !0,
51
53
  showDefaultNotStandardFonts: !0,
@@ -53,38 +55,38 @@ const se = (C, l) => {
53
55
  },
54
56
  mergeTags: [
55
57
  {
56
- entries: z(
58
+ entries: J(
57
59
  l.preselectedDynamicContentList,
58
60
  u("liquidSyntax")
59
61
  )
60
62
  }
61
63
  ],
62
- async onTokenRefreshRequest(t) {
64
+ async onTokenRefreshRequest(o) {
63
65
  try {
64
- const n = await w();
65
- t(n);
66
+ const n = await T();
67
+ o(n);
66
68
  } catch (n) {
67
69
  m(n, "Failed to refresh token");
68
70
  }
69
71
  },
70
72
  onTemplateLoaded() {
71
73
  try {
72
- const { importCss: t } = U(), { activateCustomViewStyles: n, updateTimerInClonedTemplate: M } = D(), { injectFullStory: A } = R();
73
- t(), n(), A(), M(), l.onReady(), e.isStripoInitialized = !0, e.loadingStatus = !1, setTimeout(() => {
74
+ const { importCss: o } = x(), { activateCustomViewStyles: n, updateTimerInClonedTemplate: P } = I(), { injectFullStory: D } = O();
75
+ o(), n(), D(), P(), l.onReady(), e.isStripoInitialized = !0, e.loadingStatus = !1, setTimeout(() => {
74
76
  e.hasChanges = !1;
75
77
  }, 1e3);
76
- } catch (t) {
77
- m(t, "Failed to load custom interface appearance");
78
+ } catch (o) {
79
+ m(o, "Failed to load custom interface appearance");
78
80
  }
79
81
  },
80
- onCodeEditorVisibilityChanged(t) {
81
- e.isCodeEditorOpen = t;
82
+ onCodeEditorVisibilityChanged(o) {
83
+ e.isCodeEditorOpen = o;
82
84
  },
83
- onEditorVisualModeChanged(t) {
84
- e.editorVisualMode = t.toLowerCase();
85
+ onEditorVisualModeChanged(o) {
86
+ e.editorVisualMode = o.toLowerCase();
85
87
  },
86
- onVersionHistoryVisibilityChanged(t) {
87
- e.isVersionHistoryOpen = t;
88
+ onVersionHistoryVisibilityChanged(o) {
89
+ e.isVersionHistoryOpen = o;
88
90
  },
89
91
  onDataChanged() {
90
92
  e.hasChanges = !0;
@@ -96,32 +98,44 @@ const se = (C, l) => {
96
98
  ".in-drawer__container"
97
99
  ],
98
100
  extensions: d,
99
- localePatch: H
101
+ localePatch: z
100
102
  }
101
103
  );
102
- }, V = (i) => new Promise((r, s) => {
104
+ }, _ = (s) => new Promise((r, i) => {
103
105
  var d;
104
106
  if (document.getElementById("UiEditorScript")) {
105
- i(), r();
107
+ Promise.resolve(s()).then(r, i);
106
108
  return;
107
109
  }
108
- const e = L.guido, a = `https://email-static.useinsider.com/guido/${(d = e == null ? void 0 : e.stripo) == null ? void 0 : d.version}/UIEditor.js`, o = document.createElement("script");
109
- o.id = "UiEditorScript", o.type = "module", o.src = a, o.onload = () => {
110
- i(), r();
111
- }, o.onerror = () => {
112
- s(new Error(`Failed to load Stripo UIEditor script from S3: ${a}`));
113
- }, document.body.appendChild(o);
110
+ const e = N.guido, a = `https://email-static.useinsider.com/guido/${(d = e == null ? void 0 : e.stripo) == null ? void 0 : d.version}/UIEditor.js`, t = document.createElement("script");
111
+ t.id = "UiEditorScript", t.type = "module", t.src = a, t.onload = () => {
112
+ Promise.resolve(s()).then(r, i);
113
+ }, t.onerror = () => {
114
+ i(new Error(`Failed to load Stripo UIEditor script from S3: ${a}`));
115
+ }, document.body.appendChild(t);
114
116
  });
115
- return { initPlugin: async (i) => {
116
- await V(async () => {
117
- const r = E(), [s, e] = await Promise.all([
118
- b(),
119
- k()
120
- ]);
121
- r.syncModulesEnabled = e, await T(i, s, e);
122
- });
117
+ return { initPlugin: async (s) => {
118
+ const r = C();
119
+ try {
120
+ await _(async () => {
121
+ const [i, e] = await Promise.all([
122
+ k(),
123
+ B()
124
+ ]);
125
+ r.syncModulesEnabled = e, await V(s, i, e);
126
+ });
127
+ } catch {
128
+ r.loadingStatus = !1, b({
129
+ type: L.Alert,
130
+ message: h["An error has occurred. Please report the error code to support."],
131
+ actionButton: {
132
+ text: h["Reload page"],
133
+ onClick: () => window.location.reload()
134
+ }
135
+ });
136
+ }
123
137
  } };
124
138
  };
125
139
  export {
126
- se as useStripo
140
+ ce as useStripo
127
141
  };
@@ -1,4 +1,5 @@
1
1
  const e = "Your version has been restored successfully.", o = "Restore Image", t = "Cancel", a = {
2
+ "Reload page": "Reload page",
2
3
  "The image has been deleted.": "The image has been deleted successfully.",
3
4
  "Aim for the drop zone!": "Drag and drop your image inside the upload area to continue.",
4
5
  "Image processing": "The image upload is in progress. This may take some time.",
@@ -1,41 +1,39 @@
1
- var S = Object.defineProperty;
2
- var L = (c, o, e) => o in c ? S(c, o, { enumerable: !0, configurable: !0, writable: !0, value: e }) : c[o] = e;
3
- var a = (c, o, e) => L(c, typeof o != "symbol" ? o + "" : o, e);
4
- import { useToaster as f } from "../../../composables/useToaster.js";
5
- import { ToasterTypeOptions as A } from "../../../enums/toaster.js";
6
- import { PAGE_TYPES as h } from "../../../enums/unsubscribe.js";
7
- import { useUnsubscribeStore as u } from "../../../stores/unsubscribe.js";
8
- import { Block as y, BlockCompositionType as T, ContextActionType as k, ModificationDescription as d, BlockType as I } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
9
- import { getDefaultTemplate as v } from "./template.js";
10
- import { DATA_ATTRIBUTES as n, UNSUBSCRIBE_EVENTS as p } from "./utils/constants.js";
11
- import { parsePageList as B } from "./utils/utils.js";
12
- const C = "unsubscribe-block", m = 'a[data-unsubscribe-link="true"]', E = ".unsubscribe-block-v2", N = "{{ins-unsubscribe-link}}", U = "https://academy.insiderone.com/docs/adding-unsubscribe-pages-into-emails", R = "Removing the unsubscribe text leaves an empty block, but an active unsubscribe link is required. Undo your last action to restore the text, or delete the unsubscribe block entirely.", D = {
13
- [h.GLOBAL_UNSUBSCRIBE]: "{{ins-global-unsubscribe-link}}",
14
- [h.SUBSCRIPTION_PREFERENCE_CENTER]: "{{ins-preferences-unsubscribe-link}}"
15
- }, w = 3;
16
- class H extends y {
1
+ var g = Object.defineProperty;
2
+ var k = (c, n, e) => n in c ? g(c, n, { enumerable: !0, configurable: !0, writable: !0, value: e }) : c[n] = e;
3
+ var l = (c, n, e) => k(c, typeof n != "symbol" ? n + "" : n, e);
4
+ import { useToaster as B } from "../../../composables/useToaster.js";
5
+ import { ToasterTypeOptions as S } from "../../../enums/toaster.js";
6
+ import { PAGE_TYPES as E } from "../../../enums/unsubscribe.js";
7
+ import { useUnsubscribeStore as a } from "../../../stores/unsubscribe.js";
8
+ import { Block as L, BlockCompositionType as f, ContextActionType as h, ModificationDescription as b, BlockType as v } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
9
+ import { getDefaultTemplate as A } from "./template.js";
10
+ import { DATA_ATTRIBUTES as i, UNSUBSCRIBE_EVENTS as d } from "./utils/constants.js";
11
+ import { parsePageList as p } from "./utils/utils.js";
12
+ const y = "unsubscribe-block", m = 'a[data-unsubscribe-link="true"]', _ = ".unsubscribe-block-v2", I = "{{ins-unsubscribe-link}}", T = "https://academy.insiderone.com/docs/adding-unsubscribe-pages-into-emails", C = "Removing the unsubscribe text leaves an empty block, but an active unsubscribe link is required. Undo your last action to restore the text, or delete the unsubscribe block entirely.", N = {
13
+ [E.GLOBAL_UNSUBSCRIBE]: "{{ins-global-unsubscribe-link}}",
14
+ [E.SUBSCRIPTION_PREFERENCE_CENTER]: "{{ins-preferences-unsubscribe-link}}"
15
+ };
16
+ class F extends L {
17
17
  constructor() {
18
18
  super();
19
- a(this, "selectEventListener", null);
20
- a(this, "cancelEventListener", null);
21
- a(this, "currentNode");
19
+ l(this, "selectEventListener", null);
20
+ l(this, "cancelEventListener", null);
21
+ l(this, "currentNode");
22
22
  // Per-block "did this instance have a link last time we saw it?" tracking.
23
23
  // Keyed by the stable `data-unsubscribe-block-id` we assign, because
24
24
  // ImmutableHtmlNode instances are recreated on every document mutation and
25
25
  // can't be used as Map keys directly. A singleton boolean here would be
26
26
  // polluted across blocks since Stripo fires onDocumentChanged per-instance.
27
- a(this, "linkStateByBlockId", /* @__PURE__ */ new Map());
28
- // Per-block prepend retry counter for the leading text guard (SD-143097).
29
- a(this, "guardAttemptsByBlockId", /* @__PURE__ */ new Map());
27
+ l(this, "linkStateByBlockId", /* @__PURE__ */ new Map());
30
28
  }
31
29
  getId() {
32
- return C;
30
+ return y;
33
31
  }
34
32
  getIcon() {
35
33
  return "unsubscribe-icon";
36
34
  }
37
35
  getBlockCompositionType() {
38
- return T.BLOCK;
36
+ return f.BLOCK;
39
37
  }
40
38
  getName() {
41
39
  return this.api.translate("Unsubscribe Block");
@@ -44,84 +42,36 @@ class H extends y {
44
42
  return this.api.translate("Unsubscribe Block Description");
45
43
  }
46
44
  getTemplate() {
47
- return v();
45
+ return A();
48
46
  }
49
47
  getContextActionsIds() {
50
- return [k.MOVE, k.REMOVE];
48
+ return [h.MOVE, h.REMOVE];
51
49
  }
52
50
  onSelect(e) {
53
51
  this.currentNode = e;
54
52
  const t = this._getOrAssignBlockId(e);
55
53
  t && this.linkStateByBlockId.set(t, this._hasUnsubscribeLink(e)), !("getAttribute" in e && e.getAttribute("data-migration")) && (this._resetStoreState(), this._loadBlockState(e), this._setupSelectEventListener(), this._setupCancelEventListener(), this._checkExistingBlocks(), this._openDrawer());
56
54
  }
57
- onCreated(e) {
58
- this._ensureLeadingTextGuard(e);
59
- }
60
- onDocumentInit() {
61
- try {
62
- const e = this.api.getDocumentRoot();
63
- e && "querySelectorAll" in e && e.querySelectorAll(E).forEach((t) => {
64
- this._ensureLeadingTextGuard(t);
65
- });
66
- } catch {
67
- }
68
- }
69
55
  onDocumentChanged(e) {
70
- this._ensureLeadingTextGuard(e);
71
56
  const t = this._getOrAssignBlockId(e);
72
57
  if (!t)
73
58
  return;
74
- const s = this._hasUnsubscribeLink(e);
75
- this.linkStateByBlockId.get(t) === !0 && !s && this._warnLinkRemoved(), this.linkStateByBlockId.set(t, s);
59
+ const r = this._hasUnsubscribeLink(e);
60
+ this.linkStateByBlockId.get(t) === !0 && !r && this._warnLinkRemoved(), this.linkStateByBlockId.set(t, r);
76
61
  }
77
62
  onDelete(e) {
78
63
  this._removeEventListeners(), this._removeBlockTemplatesFromStore(e), this._resetStoreState();
79
64
  const t = this._readBlockId(e);
80
- t && (this.linkStateByBlockId.delete(t), this.guardAttemptsByBlockId.delete(t));
65
+ t && this.linkStateByBlockId.delete(t);
81
66
  }
82
67
  onDestroy() {
83
- this._removeEventListeners(), this.currentNode = void 0, this.linkStateByBlockId.clear(), this.guardAttemptsByBlockId.clear();
84
- }
85
- /**
86
- * Guarantees a plain-text node before the link's wrapper inside the <p>.
87
- * Without it the only caret position left of the link is inside the anchor,
88
- * so anything typed there becomes part of the link (SD-143097).
89
- */
90
- _ensureLeadingTextGuard(e) {
91
- if (!("querySelector" in e))
92
- return;
93
- const t = e.querySelector(m);
94
- if (!t)
95
- return;
96
- let s = t, r = s.parent();
97
- for (; r && "getTagName" in r && r.getTagName().toLowerCase() !== "p"; )
98
- s = r, r = r.parent();
99
- if (!r || !("getTagName" in r) || r.getTagName().toLowerCase() !== "p")
100
- return;
101
- const i = s.previousSibling();
102
- if (!!(i && i.getType() === "text" && i.getTextContent())) {
103
- const b = this._readBlockId(e);
104
- b && this.guardAttemptsByBlockId.delete(b);
105
- return;
106
- }
107
- const g = this._getOrAssignBlockId(e);
108
- if (!g)
109
- return;
110
- const _ = this.guardAttemptsByBlockId.get(g) ?? 0;
111
- if (!(_ >= w)) {
112
- this.guardAttemptsByBlockId.set(g, _ + 1);
113
- try {
114
- this.api.getDocumentModifier().modifyHtml(r).prepend("&nbsp;").apply(new d("Ensure unsubscribe link text guard"));
115
- } catch (b) {
116
- console.warn("[UnsubscribeBlock] Failed to ensure link text guard:", b);
117
- }
118
- }
68
+ this._removeEventListeners(), this.currentNode = void 0, this.linkStateByBlockId.clear();
119
69
  }
120
70
  _hasUnsubscribeLink(e) {
121
71
  return "querySelector" in e ? !!e.querySelector(m) : !1;
122
72
  }
123
73
  _readBlockId(e) {
124
- return "getAttribute" in e ? e.getAttribute(n.BLOCK_ID) : null;
74
+ return "getAttribute" in e ? e.getAttribute(i.BLOCK_ID) : null;
125
75
  }
126
76
  /**
127
77
  * Returns the block's stable id, assigning one via the document modifier if
@@ -135,13 +85,13 @@ class H extends y {
135
85
  return t;
136
86
  if (!("getAttribute" in e))
137
87
  return null;
138
- const s = this._generateNextBlockId();
88
+ const r = this._generateNextBlockId();
139
89
  try {
140
- this.api.getDocumentModifier().modifyHtml(e).setAttribute(n.BLOCK_ID, s).apply(new d(`Assign unsubscribe block id ${s}`));
141
- } catch (r) {
142
- return console.warn("[UnsubscribeBlock] Failed to assign block id:", r), null;
90
+ this.api.getDocumentModifier().modifyHtml(e).setAttribute(i.BLOCK_ID, r).apply(new b(`Assign unsubscribe block id ${r}`));
91
+ } catch (s) {
92
+ return console.warn("[UnsubscribeBlock] Failed to assign block id:", s), null;
143
93
  }
144
- return s;
94
+ return r;
145
95
  }
146
96
  /**
147
97
  * Generates a unique id by scanning the document for the highest existing
@@ -152,10 +102,10 @@ class H extends y {
152
102
  let e = 0;
153
103
  try {
154
104
  const t = this.api.getDocumentRoot();
155
- t && "querySelectorAll" in t && t.querySelectorAll(E).forEach((r) => {
156
- if ("getAttribute" in r) {
157
- const i = r.getAttribute(n.BLOCK_ID), l = i ? parseInt(i) : 0;
158
- l > e && (e = l);
105
+ t && "querySelectorAll" in t && t.querySelectorAll(_).forEach((s) => {
106
+ if ("getAttribute" in s) {
107
+ const o = s.getAttribute(i.BLOCK_ID), u = o ? parseInt(o) : 0;
108
+ u > e && (e = u);
159
109
  }
160
110
  });
161
111
  } catch {
@@ -164,14 +114,14 @@ class H extends y {
164
114
  }
165
115
  _warnLinkRemoved() {
166
116
  try {
167
- const { showToaster: e } = f();
117
+ const { showToaster: e } = B();
168
118
  e({
169
- type: A.Warning,
170
- message: this.api.translate(R),
119
+ type: S.Warning,
120
+ message: this.api.translate(C),
171
121
  actionButton: {
172
122
  text: this.api.translate("Visit Academy"),
173
123
  onClick: () => {
174
- window.open(U, "_blank", "noopener,noreferrer");
124
+ window.open(T, "_blank", "noopener,noreferrer");
175
125
  }
176
126
  }
177
127
  });
@@ -181,26 +131,26 @@ class H extends y {
181
131
  }
182
132
  _setupSelectEventListener() {
183
133
  this._removeSelectEventListener(), this.selectEventListener = (e) => {
184
- const t = e, { collectionType: s, selectedPages: r } = t.detail;
185
- this._updateBlock(s, r.join(","));
186
- }, document.addEventListener(p.SELECT, this.selectEventListener);
134
+ const t = e, { collectionType: r, selectedPages: s } = t.detail;
135
+ this._updateBlock(r, s.join(","));
136
+ }, document.addEventListener(d.SELECT, this.selectEventListener);
187
137
  }
188
138
  _removeSelectEventListener() {
189
- this.selectEventListener && (document.removeEventListener(p.SELECT, this.selectEventListener), this.selectEventListener = null);
139
+ this.selectEventListener && (document.removeEventListener(d.SELECT, this.selectEventListener), this.selectEventListener = null);
190
140
  }
191
141
  _setupCancelEventListener() {
192
142
  this._removeCancelEventListener(), this.cancelEventListener = () => {
193
143
  this._handleCancel();
194
- }, document.addEventListener(p.CANCEL, this.cancelEventListener);
144
+ }, document.addEventListener(d.CANCEL, this.cancelEventListener);
195
145
  }
196
146
  _removeCancelEventListener() {
197
- this.cancelEventListener && (document.removeEventListener(p.CANCEL, this.cancelEventListener), this.cancelEventListener = null);
147
+ this.cancelEventListener && (document.removeEventListener(d.CANCEL, this.cancelEventListener), this.cancelEventListener = null);
198
148
  }
199
149
  _handleCancel() {
200
150
  try {
201
151
  if (!this.currentNode)
202
152
  return;
203
- this.api.getDocumentModifier().modifyHtml(this.currentNode).replaceWith(`<${I.EMPTY_CONTAINER}/>`).apply(new d("Removed unsubscribe block due to cancel"));
153
+ this.api.getDocumentModifier().modifyHtml(this.currentNode).replaceWith(`<${v.EMPTY_CONTAINER}/>`).apply(new b("Removed unsubscribe block due to cancel"));
204
154
  } catch (e) {
205
155
  console.warn("[UnsubscribeBlock] Failed to remove unsubscribe block:", e);
206
156
  }
@@ -211,32 +161,32 @@ class H extends y {
211
161
  _updateBlock(e, t) {
212
162
  if (!this.currentNode || !("querySelector" in this.currentNode))
213
163
  return;
214
- const s = this.currentNode.querySelector(m);
215
- if (!s)
164
+ const r = this.currentNode.querySelector(m);
165
+ if (!r)
216
166
  return;
217
- const r = this._getMergeTag(e);
218
- this.api.getDocumentModifier().modifyHtml(s).setAttribute("href", r).apply(new d(`Updated unsubscribe link to ${r}`)), this.api.getDocumentModifier().modifyHtml(this.currentNode).setAttribute(n.PAGE_TYPE, e.toString()).setAttribute(n.PAGE_LIST, t).apply(new d("Updated unsubscribe block metadata"));
167
+ const s = this._getMergeTag(e);
168
+ this.api.getDocumentModifier().modifyHtml(r).setAttribute("href", s).apply(new b(`Updated unsubscribe link to ${s}`)), this.api.getDocumentModifier().modifyHtml(this.currentNode).setAttribute(i.PAGE_TYPE, e.toString()).setAttribute(i.PAGE_LIST, t).apply(new b("Updated unsubscribe block metadata"));
219
169
  }
220
170
  _getMergeTag(e) {
221
- return D[e] ?? N;
171
+ return N[e] ?? I;
222
172
  }
223
173
  _openDrawer() {
224
174
  if (!(this.currentNode && this.currentNode.getAttribute("data-unsubscribe-page-type")))
225
175
  try {
226
- const e = u();
176
+ const e = a();
227
177
  e.typeSelectionDrawerStatus = !0;
228
178
  } catch (e) {
229
179
  console.error("[UnsubscribeBlock] Failed to open drawer:", e);
230
180
  }
231
181
  }
232
182
  _checkExistingBlocks() {
233
- const e = u();
234
- e.isGlobalUnsubscribeDisabled = !1, e.isSubscriptionPreferencesCenterDisabled = !1, this.api.getDocumentRoot().querySelectorAll(E).forEach((s) => {
235
- if ("getAttribute" in s) {
236
- const r = s.getAttribute(n.PAGE_TYPE);
237
- if (r) {
238
- const i = Number(r);
239
- i === h.GLOBAL_UNSUBSCRIBE ? e.isGlobalUnsubscribeDisabled = !0 : i === h.SUBSCRIPTION_PREFERENCE_CENTER && (e.isSubscriptionPreferencesCenterDisabled = !0);
183
+ const e = a();
184
+ e.isGlobalUnsubscribeDisabled = !1, e.isSubscriptionPreferencesCenterDisabled = !1, this.api.getDocumentRoot().querySelectorAll(_).forEach((r) => {
185
+ if ("getAttribute" in r) {
186
+ const s = r.getAttribute(i.PAGE_TYPE);
187
+ if (s) {
188
+ const o = Number(s);
189
+ o === E.GLOBAL_UNSUBSCRIBE ? e.isGlobalUnsubscribeDisabled = !0 : o === E.SUBSCRIPTION_PREFERENCE_CENTER && (e.isSubscriptionPreferencesCenterDisabled = !0);
240
190
  }
241
191
  }
242
192
  });
@@ -244,26 +194,26 @@ class H extends y {
244
194
  async _loadBlockState(e) {
245
195
  if (!("getAttribute" in e))
246
196
  return;
247
- const t = e.getAttribute(n.PAGE_TYPE), s = e.getAttribute(n.PAGE_LIST);
248
- if (!t || !s)
197
+ const t = e.getAttribute(i.PAGE_TYPE), r = e.getAttribute(i.PAGE_LIST);
198
+ if (!t || !r)
249
199
  return;
250
- const r = u(), i = Number(t), l = B(s);
251
- await r.fetchTemplates(), r.setCollectionWithoutAutoSelection(i), r.loadSelectedTemplates(l);
200
+ const s = a(), o = Number(t), u = p(r);
201
+ await s.fetchTemplates(), s.setCollectionWithoutAutoSelection(o), s.loadSelectedTemplates(u);
252
202
  }
253
203
  _resetStoreState() {
254
- u().$reset();
204
+ a().$reset();
255
205
  }
256
206
  _removeBlockTemplatesFromStore(e) {
257
207
  if (!("getAttribute" in e))
258
208
  return;
259
- const t = e.getAttribute(n.PAGE_LIST);
209
+ const t = e.getAttribute(i.PAGE_LIST);
260
210
  if (!t)
261
211
  return;
262
- const s = u(), r = B(t);
263
- s.removeUnsubscribePages(r);
212
+ const r = a(), s = p(t);
213
+ r.removeUnsubscribePages(s);
264
214
  }
265
215
  }
266
216
  export {
267
- C as UNSUBSCRIBE_BLOCK_ID,
268
- H as UnsubscribeBlock
217
+ y as UNSUBSCRIBE_BLOCK_ID,
218
+ F as UnsubscribeBlock
269
219
  };
@@ -1,21 +1,21 @@
1
1
  import { BlockType as s } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
- const e = "unsubscribe", n = "{{ins-unsubscribe-link}}", b = `
2
+ const e = "unsubscribe", n = "{{ins-unsubscribe-link}}", t = `
3
3
  <${s.BLOCK_TEXT}
4
4
  class="unsubscribe-block-v2 esd-block-unsubscribe es-p0"
5
5
  align="center"
6
6
  data-unsubscribe-page-type=""
7
7
  data-unsubscribe-page-list=""
8
8
  >
9
- <p>&nbsp;<a
9
+ <p>&nbsp;<strong><a
10
10
  href="${n}"
11
11
  class="unsubscribe-link"
12
12
  target="_blank"
13
13
  data-unsubscribe-link="true"
14
- >${e}</a></p>
14
+ >${e}</a></strong></p>
15
15
  </${s.BLOCK_TEXT}>
16
16
  `;
17
17
  function u() {
18
- return b;
18
+ return t;
19
19
  }
20
20
  export {
21
21
  u as getDefaultTemplate
@@ -6,7 +6,6 @@ export declare class UnsubscribeBlock extends Block {
6
6
  private cancelEventListener;
7
7
  private currentNode?;
8
8
  private linkStateByBlockId;
9
- private guardAttemptsByBlockId;
10
9
  constructor();
11
10
  getId(): string;
12
11
  getIcon(): string;
@@ -16,17 +15,9 @@ export declare class UnsubscribeBlock extends Block {
16
15
  getTemplate(): string;
17
16
  getContextActionsIds(): string[];
18
17
  onSelect(node: ImmutableHtmlElementNode): void;
19
- onCreated(node: ImmutableHtmlNode): void;
20
- onDocumentInit(): void;
21
18
  onDocumentChanged(node: ImmutableHtmlNode): void;
22
19
  onDelete(node: ImmutableHtmlElementNode): void;
23
20
  onDestroy(): void;
24
- /**
25
- * Guarantees a plain-text node before the link's wrapper inside the <p>.
26
- * Without it the only caret position left of the link is inside the anchor,
27
- * so anything typed there becomes part of the link (SD-143097).
28
- */
29
- private _ensureLeadingTextGuard;
30
21
  private _hasUnsubscribeLink;
31
22
  private _readBlockId;
32
23
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@useinsider/guido",
3
- "version": "3.7.0-beta.b2980d8",
3
+ "version": "3.7.0-beta.bd7cb8f",
4
4
  "description": "Guido is a Vue + TypeScript wrapper for Email Plugin. Easily embed the email editor in your Vue applications.",
5
5
  "main": "./dist/guido.umd.cjs",
6
6
  "module": "./dist/library.js",