@useinsider/guido 3.21.2-beta.b6f3ef8 → 3.21.2-beta.d9d48aa
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.
- package/README.md +13 -34
- package/dist/@types/config/schemas.js +35 -33
- package/dist/components/Guido.vue.js +6 -6
- package/dist/components/Guido.vue2.js +115 -121
- package/dist/components/organisms/unsubscribe/LegacyUnsubscribeConvertedModal.vue.js +17 -0
- package/dist/components/organisms/unsubscribe/LegacyUnsubscribeConvertedModal.vue2.js +30 -0
- package/dist/composables/useModuleRepair.js +32 -23
- package/dist/composables/useStripo.js +82 -94
- package/dist/config/migrator/index.js +10 -9
- package/dist/config/migrator/legacyUnsubscribeTextMigrator.js +16 -0
- package/dist/enums/academy.js +2 -1
- package/dist/guido.css +1 -1
- package/dist/library.js +10 -12
- package/dist/package.json.js +4 -6
- package/dist/src/@types/config/schemas.d.ts +4 -0
- package/dist/src/components/organisms/unsubscribe/LegacyUnsubscribeConvertedModal.vue.d.ts +2 -0
- package/dist/src/composables/useConfig.d.ts +2 -0
- package/dist/src/composables/useModuleRepair.d.ts +2 -11
- package/dist/src/config/migrator/legacyUnsubscribeTextMigrator.d.ts +1 -0
- package/dist/src/enums/academy.d.ts +1 -0
- package/dist/src/library.d.ts +0 -1
- package/dist/src/stores/config.d.ts +20 -0
- package/dist/src/stores/editor.d.ts +25 -0
- package/dist/src/utils/legacyUnsubscribeConversion.d.ts +10 -0
- package/dist/stores/editor.js +15 -14
- package/dist/utils/legacyUnsubscribeConversion.js +49 -0
- package/package.json +1 -6
- package/dist/composables/useEditorOpenMetrics.js +0 -164
- package/dist/public/prefetchRuntime.js +0 -4
- package/dist/src/composables/useEditorOpenMetrics.d.ts +0 -27
- package/dist/src/public/prefetchRuntime.d.ts +0 -1
- package/dist/src/utils/runtimePrefetch.d.ts +0 -4
- package/dist/src/utils/stripoRuntime.d.ts +0 -2
- package/dist/static/stripo-runtime-manifest.json.js +0 -9
- package/dist/utils/runtimePrefetch.js +0 -26
- package/dist/utils/stripoRuntime.js +0 -9
package/README.md
CHANGED
|
@@ -166,6 +166,7 @@ const config: GuidoConfigInput = {
|
|
|
166
166
|
allowlistEnabled?: boolean, // Default: false - Pre-save domain-allowlist check (opt-in). Guido self-serves the block toaster (role lookup, deep-link, copy from window.trans).
|
|
167
167
|
allowSaveWithErrors?: boolean, // Default: true - Allow the validation drawer's "Save and Continue" soft-save. Set false to hard-block invalid saves (transactional + unsubscribe pages).
|
|
168
168
|
reusableRecommendationStrategy?: boolean, // Default: false - Assign an RRS strategy to recommendation blocks instead of per-block algorithm/filters/shuffle/product-count settings.
|
|
169
|
+
legacyUnsubscribeConversion?: boolean, // Default: false - Convert legacy unsubscribe blocks that have no unsubscribe link into text blocks (on load and on module drop/copy) and show a warning modal.
|
|
169
170
|
},
|
|
170
171
|
|
|
171
172
|
// Optional: Callbacks
|
|
@@ -582,9 +583,9 @@ import '@useinsider/guido/style';
|
|
|
582
583
|
|
|
583
584
|
### Subpath entries
|
|
584
585
|
|
|
585
|
-
|
|
586
|
-
own dependencies, so a consumer that needs the store
|
|
587
|
-
|
|
586
|
+
Two surfaces also ship as their own entry points. Importing one pulls in only its
|
|
587
|
+
own dependencies, so a consumer that needs the store or the tracking-id helpers
|
|
588
|
+
never loads the editor:
|
|
588
589
|
|
|
589
590
|
```typescript
|
|
590
591
|
// Live editor state, published by the editor into the host's shared Pinia instance.
|
|
@@ -595,41 +596,11 @@ import type { GuidoEmailEditorState } from '@useinsider/guido/editor-state';
|
|
|
595
596
|
// Persistent link ids for the click heatmap.
|
|
596
597
|
import { assignTrackingIds, TRACK_ID_ATTRIBUTE } from '@useinsider/guido/tracking-ids';
|
|
597
598
|
import type { TrackingIdResult } from '@useinsider/guido/tracking-ids';
|
|
598
|
-
|
|
599
|
-
// Start downloading the Stripo editor runtime before the editor opens.
|
|
600
|
-
import { prefetchGuidoRuntime } from '@useinsider/guido/prefetch';
|
|
601
599
|
```
|
|
602
600
|
|
|
603
|
-
|
|
601
|
+
Both are re-exported from the root barrel as well; the subpath is what keeps the
|
|
604
602
|
editor out of the consumer's module graph.
|
|
605
603
|
|
|
606
|
-
### Runtime prefetch
|
|
607
|
-
|
|
608
|
-
```typescript
|
|
609
|
-
import { prefetchGuidoRuntime } from '@useinsider/guido/prefetch';
|
|
610
|
-
|
|
611
|
-
prefetchGuidoRuntime(); // e.g. when the user lands on the page that opens the editor
|
|
612
|
-
```
|
|
613
|
-
|
|
614
|
-
Call it as early as the host knows an editor is likely to open. It appends one
|
|
615
|
-
`<link rel="prefetch" data-guido-prefetch>` per file of the pinned Stripo runtime
|
|
616
|
-
(`src/static/stripo-runtime-manifest.json`) from
|
|
617
|
-
`https://email-static.useinsider.com/guido/<stripo version>/`, so the files are in the
|
|
618
|
-
HTTP cache when `<Guido>` mounts. It only downloads: no Stripo code runs and the
|
|
619
|
-
editor's startup order does not change.
|
|
620
|
-
|
|
621
|
-
- Returns `void` and never throws.
|
|
622
|
-
- Idempotent: later calls add nothing.
|
|
623
|
-
- Adds nothing when the runtime is already loading or loaded (`#UiEditorScript` exists
|
|
624
|
-
or `window.UIEditor` is defined), when `navigator.connection.saveData` is on, or when
|
|
625
|
-
`navigator.connection.effectiveType` is `slow-2g` or `2g`.
|
|
626
|
-
- The `guido_editor_open` metric reports it as `runtime_prefetch`: `none` (not called
|
|
627
|
-
before Guido's setup), `pending` (some files still downloading) or `done`.
|
|
628
|
-
|
|
629
|
-
After bumping `guido.stripo.version`, regenerate the file list with
|
|
630
|
-
`npm run stripo:manifest`; a unit test fails while the manifest's version differs from
|
|
631
|
-
the pinned one.
|
|
632
|
-
|
|
633
604
|
---
|
|
634
605
|
|
|
635
606
|
## Constants
|
|
@@ -697,6 +668,14 @@ multiple partners (e.g. architect) should key by partner and place the active pa
|
|
|
697
668
|
first. Omit the prop and the repair is a safe no-op — nothing is rewritten and no
|
|
698
669
|
toaster fires (useful before the host has wired the catalog).
|
|
699
670
|
|
|
671
|
+
With `features.legacyUnsubscribeConversion: true`, a dropped or copied module's legacy
|
|
672
|
+
unsubscribe block that has no unsubscribe link (the old editor reused it as plain text,
|
|
673
|
+
e.g. a company address) becomes a plain text block that keeps its content, and a warning
|
|
674
|
+
modal explains it. The same conversion runs when a template is opened. Register these
|
|
675
|
+
keys host-side: `email-editor.legacy-unsubscribe-converted-modal-title`,
|
|
676
|
+
`email-editor.legacy-unsubscribe-converted-modal-message` and
|
|
677
|
+
`email-editor.legacy-unsubscribe-converted-modal-visit-academy` (OK reuses `action-builder.ok`).
|
|
678
|
+
|
|
700
679
|
---
|
|
701
680
|
|
|
702
681
|
## Development
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ModuleFolderDefaults as
|
|
2
|
-
import { object as a, number as s, optional as e, string as t, picklist as m, pipe as i, minLength as b, custom as k, boolean as o, array as
|
|
1
|
+
import { ModuleFolderDefaults as S } from "../../enums/defaults.js";
|
|
2
|
+
import { object as a, number as s, optional as e, string as t, picklist as m, pipe as i, minLength as b, custom as k, boolean as o, array as n, transform as y, unknown as r, record as g, fallback as R, literal as u, looseObject as C, variant as I, union as h, lazy as T } from "../../node_modules/valibot/dist/index.js";
|
|
3
3
|
const p = {
|
|
4
4
|
/** Promotional/marketing emails */
|
|
5
5
|
PROMOTIONAL: 1,
|
|
@@ -76,30 +76,30 @@ const p = {
|
|
|
76
76
|
value: t()
|
|
77
77
|
})
|
|
78
78
|
)
|
|
79
|
-
}),
|
|
79
|
+
}), f = T(() => C({
|
|
80
80
|
text: e(t()),
|
|
81
81
|
// eslint-disable-next-line camelcase -- backend field name
|
|
82
82
|
tag_text: e(t()),
|
|
83
83
|
value: e(t()),
|
|
84
|
-
children: e(
|
|
84
|
+
children: e(n(f)),
|
|
85
85
|
// eslint-disable-next-line camelcase -- backend field name
|
|
86
|
-
select_items: e(
|
|
87
|
-
})),
|
|
86
|
+
select_items: e(n(f))
|
|
87
|
+
})), v = g(
|
|
88
88
|
t(),
|
|
89
|
-
R(
|
|
90
|
-
),
|
|
89
|
+
R(n(f), [])
|
|
90
|
+
), N = C({
|
|
91
91
|
/** Block ID (matches the dictionary key and the legacy HTML element id) */
|
|
92
92
|
id: e(s()),
|
|
93
93
|
/** Decimal places for price display (legacy data may use string or number) */
|
|
94
94
|
decimalCount: e(h([t(), s()])),
|
|
95
95
|
/** Pinned product IDs (empty array when filter-driven) */
|
|
96
|
-
productIds: e(
|
|
96
|
+
productIds: e(n(r())),
|
|
97
97
|
/** Whether the block requested live products at send time */
|
|
98
98
|
sendProductRequestFlag: e(o()),
|
|
99
99
|
/** Whether to randomize product order */
|
|
100
100
|
shuffleProducts: e(o()),
|
|
101
101
|
/** Filter rules driving product selection */
|
|
102
|
-
filters: e(
|
|
102
|
+
filters: e(n(r())),
|
|
103
103
|
/** Currency code (e.g. 'EUR') — sometimes absent in legacy data */
|
|
104
104
|
currency: e(t()),
|
|
105
105
|
/** Currency display settings (separators, alignment, decimals) */
|
|
@@ -109,7 +109,7 @@ const p = {
|
|
|
109
109
|
/** Recommendation strategy key (e.g. 'newArrivals') */
|
|
110
110
|
strategy: e(t()),
|
|
111
111
|
/** Snapshot of products as rendered by the legacy block */
|
|
112
|
-
recommendedProducts: e(
|
|
112
|
+
recommendedProducts: e(n(r())),
|
|
113
113
|
/** Number of product cards per row */
|
|
114
114
|
cardsInRow: e(s()),
|
|
115
115
|
/** Mobile-only padding (right) */
|
|
@@ -132,7 +132,7 @@ const p = {
|
|
|
132
132
|
isPriceMovedToNextLine: e(o()),
|
|
133
133
|
/** Legacy "Hide if same as discounted" / delete-price-for-zero-sale toggle */
|
|
134
134
|
isPriceDeletedForZeroSale: e(o())
|
|
135
|
-
}),
|
|
135
|
+
}), P = a({
|
|
136
136
|
/**
|
|
137
137
|
* Legacy recommendation block configs keyed by block ID.
|
|
138
138
|
* Pass this when loading a template authored with the v1
|
|
@@ -140,7 +140,7 @@ const p = {
|
|
|
140
140
|
* strategy, currency, locale, and layout data.
|
|
141
141
|
*/
|
|
142
142
|
recommendationConfigs: e(
|
|
143
|
-
g(t(),
|
|
143
|
+
g(t(), N),
|
|
144
144
|
{}
|
|
145
145
|
)
|
|
146
146
|
}), x = a({
|
|
@@ -150,7 +150,7 @@ const p = {
|
|
|
150
150
|
css: e(t(), ""),
|
|
151
151
|
/** Preselected dynamic content items */
|
|
152
152
|
preselectedDynamicContent: e(
|
|
153
|
-
|
|
153
|
+
n(M),
|
|
154
154
|
[]
|
|
155
155
|
),
|
|
156
156
|
/**
|
|
@@ -159,11 +159,11 @@ const p = {
|
|
|
159
159
|
* (first) partner's leaf attributes into the label→token map that repairs
|
|
160
160
|
* label-form placeholders (`{{ Phone Number }}`) in dropped saved modules.
|
|
161
161
|
*/
|
|
162
|
-
dynamicContentList: e(
|
|
162
|
+
dynamicContentList: e(v, {}),
|
|
163
163
|
/** Valid custom field attribute names from the partner's categorized fields */
|
|
164
|
-
customFieldAttributes: e(
|
|
164
|
+
customFieldAttributes: e(n(t()), []),
|
|
165
165
|
/** Selected unsubscribe page IDs */
|
|
166
|
-
selectedUnsubscribePages: e(
|
|
166
|
+
selectedUnsubscribePages: e(n(s()), []),
|
|
167
167
|
/** Force recreate template in Stripo storage (use true when updating externally modified templates) */
|
|
168
168
|
forceRecreate: e(o(), !1),
|
|
169
169
|
/**
|
|
@@ -176,7 +176,7 @@ const p = {
|
|
|
176
176
|
trackIdCounter: e(
|
|
177
177
|
i(
|
|
178
178
|
s(),
|
|
179
|
-
y((
|
|
179
|
+
y((c) => Number.isFinite(c) ? Math.max(0, Math.floor(c)) : 0)
|
|
180
180
|
),
|
|
181
181
|
0
|
|
182
182
|
),
|
|
@@ -190,11 +190,11 @@ const p = {
|
|
|
190
190
|
recommendationCampaignUrls: e(
|
|
191
191
|
i(
|
|
192
192
|
r(),
|
|
193
|
-
y((
|
|
193
|
+
y((c) => c && typeof c == "object" ? { ...c } : void 0)
|
|
194
194
|
)
|
|
195
195
|
),
|
|
196
196
|
/** Migration-only inputs (legacy block configs) */
|
|
197
|
-
migration: e(
|
|
197
|
+
migration: e(P, {})
|
|
198
198
|
}), D = a({
|
|
199
199
|
/** Sender display name */
|
|
200
200
|
senderName: e(t(), ""),
|
|
@@ -210,9 +210,9 @@ const p = {
|
|
|
210
210
|
/** Email header settings */
|
|
211
211
|
emailHeader: e(D, { senderName: "", subject: "" }),
|
|
212
212
|
/** Folder name for user-saved modules (used by Stripo plugin panel for path construction) */
|
|
213
|
-
savedModulesFolderName: e(t(),
|
|
213
|
+
savedModulesFolderName: e(t(), S.SAVED_MODULES),
|
|
214
214
|
/** Folder name for default/prebuilt modules (used by Stripo plugin panel for path construction) */
|
|
215
|
-
defaultModulesFolderName: e(t(),
|
|
215
|
+
defaultModulesFolderName: e(t(), S.DEFAULT_MODULES)
|
|
216
216
|
}), F = a({
|
|
217
217
|
/** Whether to show the header bar */
|
|
218
218
|
showHeader: e(o(), !0),
|
|
@@ -243,7 +243,9 @@ const p = {
|
|
|
243
243
|
linkTrackingIds: e(o(), !1),
|
|
244
244
|
/** Allow persisting a template that still has validation errors (drawer "Save and Continue" soft-save). Host sets false for transactional + unsubscribe. */
|
|
245
245
|
allowSaveWithErrors: e(o(), !0),
|
|
246
|
-
reusableRecommendationStrategy: e(o(), !1)
|
|
246
|
+
reusableRecommendationStrategy: e(o(), !1),
|
|
247
|
+
/** Convert linkless legacy unsubscribe blocks into text blocks and warn with a modal (opt-in) */
|
|
248
|
+
legacyUnsubscribeConversion: e(o(), !1)
|
|
247
249
|
}), w = m([
|
|
248
250
|
"amp-accordion",
|
|
249
251
|
"amp-carousel",
|
|
@@ -269,12 +271,12 @@ const p = {
|
|
|
269
271
|
]), j = a({
|
|
270
272
|
/** Default blocks to exclude from the editor */
|
|
271
273
|
excludeDefaults: e(
|
|
272
|
-
|
|
274
|
+
n(w),
|
|
273
275
|
[]
|
|
274
276
|
),
|
|
275
277
|
/** Custom blocks to include in the editor */
|
|
276
278
|
includeCustoms: e(
|
|
277
|
-
|
|
279
|
+
n(B),
|
|
278
280
|
[]
|
|
279
281
|
)
|
|
280
282
|
}), d = a({
|
|
@@ -306,13 +308,13 @@ const p = {
|
|
|
306
308
|
...d.entries,
|
|
307
309
|
type: u("remove"),
|
|
308
310
|
/** Strings or patterns to remove */
|
|
309
|
-
targets:
|
|
311
|
+
targets: n(t())
|
|
310
312
|
}), G = a({
|
|
311
313
|
...d.entries,
|
|
312
314
|
type: u("custom"),
|
|
313
315
|
/** Custom processor function */
|
|
314
316
|
processor: k(
|
|
315
|
-
(
|
|
317
|
+
(c) => typeof c == "function",
|
|
316
318
|
"processor must be a function"
|
|
317
319
|
)
|
|
318
320
|
}), V = I("type", [
|
|
@@ -322,7 +324,7 @@ const p = {
|
|
|
322
324
|
G
|
|
323
325
|
]), z = a({
|
|
324
326
|
/** Custom compiler rules to apply */
|
|
325
|
-
customRules: e(
|
|
327
|
+
customRules: e(n(V), []),
|
|
326
328
|
/** Skip default compiler rules */
|
|
327
329
|
ignoreDefaultRules: e(o(), !1)
|
|
328
330
|
}), W = a({
|
|
@@ -332,7 +334,7 @@ const p = {
|
|
|
332
334
|
*/
|
|
333
335
|
externalValidation: e(
|
|
334
336
|
k(
|
|
335
|
-
(
|
|
337
|
+
(c) => typeof c == "function",
|
|
336
338
|
"externalValidation must be a function"
|
|
337
339
|
)
|
|
338
340
|
)
|
|
@@ -366,8 +368,8 @@ export {
|
|
|
366
368
|
B as CustomBlockTypeSchema,
|
|
367
369
|
G as CustomRuleSchema,
|
|
368
370
|
w as DefaultBlockTypeSchema,
|
|
369
|
-
|
|
370
|
-
|
|
371
|
+
v as DynamicContentListSchema,
|
|
372
|
+
f as DynamicContentNodeSchema,
|
|
371
373
|
M as DynamicContentSchema,
|
|
372
374
|
O as EditorSchema,
|
|
373
375
|
D as EmailHeaderSchema,
|
|
@@ -375,14 +377,14 @@ export {
|
|
|
375
377
|
U as FeaturesSchema,
|
|
376
378
|
K as GuidoConfigSchema,
|
|
377
379
|
A as IdentitySchema,
|
|
378
|
-
|
|
380
|
+
N as LegacyRecommendationConfigSchema,
|
|
379
381
|
p as MessageType,
|
|
380
382
|
E as PartnerSchema,
|
|
381
383
|
l as ProductType,
|
|
382
384
|
_ as RegexRuleSchema,
|
|
383
385
|
q as RemoveRuleSchema,
|
|
384
386
|
H as ReplaceRuleSchema,
|
|
385
|
-
|
|
387
|
+
P as TemplateMigrationSchema,
|
|
386
388
|
x as TemplateSchema,
|
|
387
389
|
F as UISchema
|
|
388
390
|
};
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import o from "./Guido.vue2.js";
|
|
2
2
|
/* empty css */
|
|
3
3
|
import i from "../_virtual/_plugin-vue2_normalizer.js";
|
|
4
|
-
var
|
|
4
|
+
var s = function() {
|
|
5
5
|
var a = this, r = a._self._c, e = a._self._setupProxy;
|
|
6
|
-
return r("div", { ref: "wrapperRef", staticClass: "guido-editor__wrapper", class: { "guido-editor__no-header": e.noHeader } }, [r(e.HeaderWrapper, { ref: "headerWrapperRef" }), r(e.AutoSaveController), e.editorStore.isPreviewModeOpen ? r(e.PreviewContainer) : a._e(), r("div", { directives: [{ name: "show", rawName: "v-show", value: !e.previewStore.isLoaded, expression: "!previewStore.isLoaded" }], staticClass: "guido-editor__container", class: { "guido-editor__no-header": e.noHeader }, attrs: { id: "guido-editor" } }), r(e.Toaster), r(e.AuthErrorModal), r(e.FilterSelectionDrawer), e.isRrsEnabled || e.hasAssignedStrategy ? r(e.AssignStrategyDrawer) : a._e(), e.isRrsEnabled || e.hasAssignedStrategy ? r(e.RemoveStrategyModal) : a._e(), e.isRrsEnabled ? r(e.LegacyStrategyUpdatedModal) : a._e(), r(e.SaveAsTemplateDrawer), e.isSaveValidationEnabled ? r(e.ValidationErrorDrawer) : a._e(), e.isTestPartner() ? a._e() : r(e.OnboardingWrapper, { on: { "onboarding-finished": function(_) {
|
|
6
|
+
return r("div", { ref: "wrapperRef", staticClass: "guido-editor__wrapper", class: { "guido-editor__no-header": e.noHeader } }, [r(e.HeaderWrapper, { ref: "headerWrapperRef" }), r(e.AutoSaveController), e.editorStore.isPreviewModeOpen ? r(e.PreviewContainer) : a._e(), r("div", { directives: [{ name: "show", rawName: "v-show", value: !e.previewStore.isLoaded, expression: "!previewStore.isLoaded" }], staticClass: "guido-editor__container", class: { "guido-editor__no-header": e.noHeader }, attrs: { id: "guido-editor" } }), r(e.Toaster), r(e.AuthErrorModal), r(e.FilterSelectionDrawer), e.isRrsEnabled || e.hasAssignedStrategy ? r(e.AssignStrategyDrawer) : a._e(), e.isRrsEnabled || e.hasAssignedStrategy ? r(e.RemoveStrategyModal) : a._e(), e.isRrsEnabled ? r(e.LegacyStrategyUpdatedModal) : a._e(), e.isLegacyUnsubscribeConversionEnabled ? r(e.LegacyUnsubscribeConvertedModal) : a._e(), r(e.SaveAsTemplateDrawer), e.isSaveValidationEnabled ? r(e.ValidationErrorDrawer) : a._e(), e.isTestPartner() ? a._e() : r(e.OnboardingWrapper, { on: { "onboarding-finished": function(_) {
|
|
7
7
|
return e.emit("onboarding:finished");
|
|
8
8
|
} } }), r(e.UnsubscribeWrapper), r(e.LoadingWrapper)], 1);
|
|
9
|
-
},
|
|
9
|
+
}, t = [], n = /* @__PURE__ */ i(
|
|
10
10
|
o,
|
|
11
|
-
t,
|
|
12
11
|
s,
|
|
12
|
+
t,
|
|
13
13
|
!1,
|
|
14
14
|
null,
|
|
15
|
-
"
|
|
15
|
+
"6cdd5182"
|
|
16
16
|
);
|
|
17
|
-
const v =
|
|
17
|
+
const v = n.exports;
|
|
18
18
|
export {
|
|
19
19
|
v as default
|
|
20
20
|
};
|
|
@@ -1,189 +1,183 @@
|
|
|
1
|
-
import { defineComponent as de, defineAsyncComponent as
|
|
1
|
+
import { defineComponent as de, defineAsyncComponent as c, ref as W, computed as l, watch as G, onMounted as me, onUnmounted as le } from "vue";
|
|
2
2
|
import { useCortexBlueprintBridge as ue } from "../composables/useCortexBlueprintBridge.js";
|
|
3
3
|
import { useEditorLock as pe } from "../composables/useEditorLock.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import
|
|
16
|
-
import De from "./organisms/
|
|
17
|
-
import
|
|
18
|
-
import Fe from "./organisms/
|
|
19
|
-
import
|
|
20
|
-
import Re from "./organisms/
|
|
21
|
-
import
|
|
22
|
-
import Le from "./organisms/save-as-template/SaveAsTemplateDrawer.vue.js";
|
|
4
|
+
import { provideGuidoActions as fe } from "../composables/useGuidoActions.js";
|
|
5
|
+
import { useGuidoStateBridge as ye } from "../composables/useGuidoStateBridge.js";
|
|
6
|
+
import { usePartner as ge } from "../composables/usePartner.js";
|
|
7
|
+
import { useSaveValidationRollout as be } from "../composables/useSaveValidationRollout.js";
|
|
8
|
+
import { useStripo as ve } from "../composables/useStripo.js";
|
|
9
|
+
import { useTimerClone as Se } from "../composables/useTimerClone.js";
|
|
10
|
+
import { migrate as V } from "../config/migrator/index.js";
|
|
11
|
+
import { ModuleFolderDefaults as $ } from "../enums/defaults.js";
|
|
12
|
+
import { RIBBON_SELECTOR as he } from "../enums/onboarding.js";
|
|
13
|
+
import { useRecommendationExtensionStore as z, disposeStrategyPageReturnListeners as Ee } from "../extensions/Blocks/Recommendation/store/recommendation.js";
|
|
14
|
+
import { disposeUnsubscribeListeners as we } from "../extensions/Blocks/Unsubscribe/block.js";
|
|
15
|
+
import Ce from "./organisms/AutoSaveController.vue.js";
|
|
16
|
+
import De from "./organisms/base/AuthErrorModal.vue.js";
|
|
17
|
+
import ke from "./organisms/base/Toaster.vue.js";
|
|
18
|
+
import Fe from "./organisms/extensions/recommendation/FilterSelectionDrawer.vue.js";
|
|
19
|
+
import Le from "./organisms/header/HeaderWrapper.vue.js";
|
|
20
|
+
import Re from "./organisms/LoadingWrapper.vue.js";
|
|
21
|
+
import Me from "./organisms/save-as-template/SaveAsTemplateDrawer.vue.js";
|
|
23
22
|
import Ue from "./organisms/unsubscribe/UnsubscribeWrapper.vue.js";
|
|
24
|
-
import
|
|
25
|
-
import { useStripoApi as
|
|
23
|
+
import Te from "./organisms/validation/ValidationErrorDrawer.vue.js";
|
|
24
|
+
import { useStripoApi as Ie } from "../services/stripoApi.js";
|
|
26
25
|
import { useConfigStore as Ae } from "../stores/config.js";
|
|
27
26
|
import { useDynamicContentStore as Be } from "../stores/dynamic-content.js";
|
|
28
|
-
import { useEditorStore as
|
|
29
|
-
import { usePreviewStore as
|
|
27
|
+
import { useEditorStore as E } from "../stores/editor.js";
|
|
28
|
+
import { usePreviewStore as Ne } from "../stores/preview.js";
|
|
30
29
|
import { useSaveValidationStore as Pe } from "../stores/save-validation.js";
|
|
31
|
-
import { useTemplateStore as
|
|
32
|
-
import { useUnsubscribeStore as
|
|
33
|
-
import { readTrackFloor as
|
|
34
|
-
const
|
|
30
|
+
import { useTemplateStore as _e } from "../stores/template.js";
|
|
31
|
+
import { useUnsubscribeStore as Oe } from "../stores/unsubscribe.js";
|
|
32
|
+
import { readTrackFloor as H } from "../utils/linkTrackingIds.js";
|
|
33
|
+
const vo = /* @__PURE__ */ de({
|
|
35
34
|
__name: "Guido",
|
|
36
35
|
props: {
|
|
37
36
|
config: null,
|
|
38
37
|
ready: { type: Boolean, default: !0 }
|
|
39
38
|
},
|
|
40
39
|
emits: ["dynamic-content:open", "back", "save:start", "save:complete", "on-change", "ready", "onboarding:finished", "test-email:click"],
|
|
41
|
-
setup(
|
|
42
|
-
const
|
|
40
|
+
setup(q, { expose: K, emit: r }) {
|
|
41
|
+
const a = q, j = c(
|
|
43
42
|
() => import("./organisms/email-preview/PreviewContainer.vue.js")
|
|
44
|
-
),
|
|
43
|
+
), J = c(
|
|
45
44
|
() => import("./organisms/onboarding/OnboardingWrapper.vue.js")
|
|
46
|
-
),
|
|
45
|
+
), Q = c(
|
|
47
46
|
() => import("./organisms/extensions/recommendation/AssignStrategyDrawer.vue.js")
|
|
48
|
-
),
|
|
47
|
+
), X = c(
|
|
49
48
|
() => import("./organisms/extensions/recommendation/RemoveStrategyModal.vue.js")
|
|
50
|
-
),
|
|
49
|
+
), Y = c(
|
|
51
50
|
() => import("./organisms/extensions/recommendation/LegacyStrategyUpdatedModal.vue.js")
|
|
52
|
-
),
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
51
|
+
), Z = c(
|
|
52
|
+
() => import("./organisms/unsubscribe/LegacyUnsubscribeConvertedModal.vue.js")
|
|
53
|
+
), w = W(), f = W(), y = Be(), C = Oe(), t = Ae();
|
|
54
|
+
a.ready && t.init(a.config);
|
|
55
|
+
const d = E(), ee = Ne(), u = l(() => d.hasChanges), { isTestPartner: oe } = ge(), { isEnabled: te, loadRollout: D } = be(), k = () => {
|
|
56
|
+
var o;
|
|
57
|
+
return (o = w.value) == null ? void 0 : o.handleSave(!0);
|
|
58
|
+
}, F = (o) => {
|
|
59
|
+
d.loadingStatus = o;
|
|
59
60
|
};
|
|
60
|
-
ue(),
|
|
61
|
-
const
|
|
62
|
-
var
|
|
61
|
+
ue(), ye();
|
|
62
|
+
const g = () => {
|
|
63
|
+
var o, e;
|
|
63
64
|
return {
|
|
64
|
-
emailId:
|
|
65
|
-
userId:
|
|
66
|
-
username:
|
|
67
|
-
partnerName:
|
|
68
|
-
savedModulesFolderName: ((
|
|
69
|
-
defaultModulesFolderName: ((e =
|
|
65
|
+
emailId: t.templateId,
|
|
66
|
+
userId: t.userId,
|
|
67
|
+
username: t.username,
|
|
68
|
+
partnerName: t.partnerName,
|
|
69
|
+
savedModulesFolderName: ((o = t.editor) == null ? void 0 : o.savedModulesFolderName) || $.SAVED_MODULES,
|
|
70
|
+
defaultModulesFolderName: ((e = t.editor) == null ? void 0 : e.defaultModulesFolderName) || $.DEFAULT_MODULES
|
|
70
71
|
};
|
|
71
|
-
}, { initPlugin:
|
|
72
|
+
}, { initPlugin: L, preloadRuntime: R } = ve(), { runExclusive: M, beginMount: U, isCurrentMount: b } = pe();
|
|
72
73
|
let p = 0;
|
|
73
|
-
const { getDefaultTemplate:
|
|
74
|
-
var
|
|
75
|
-
return !((
|
|
76
|
-
}),
|
|
77
|
-
() =>
|
|
74
|
+
const { getDefaultTemplate: T } = Ie(), { cloneTimersOnSave: I, hasTimerBlocks: A } = Se(), ne = l(() => {
|
|
75
|
+
var o;
|
|
76
|
+
return !((o = t.ui) != null && o.showHeader);
|
|
77
|
+
}), re = l(() => t.isFeatureEnabled("reusableRecommendationStrategy")), se = l(
|
|
78
|
+
() => t.isFeatureEnabled("legacyUnsubscribeConversion")
|
|
79
|
+
), ae = l(
|
|
80
|
+
() => !!z().recommendationConfigs.strategyId
|
|
78
81
|
);
|
|
79
|
-
|
|
82
|
+
fe({
|
|
80
83
|
onBack: () => {
|
|
81
|
-
console.debug("guido:back"),
|
|
84
|
+
console.debug("guido:back"), r("back");
|
|
82
85
|
},
|
|
83
86
|
onSaveStart: () => {
|
|
84
|
-
console.debug("guido:save:start"),
|
|
87
|
+
console.debug("guido:save:start"), r("save:start");
|
|
85
88
|
},
|
|
86
|
-
onSaveComplete: (
|
|
87
|
-
const e = { ...
|
|
88
|
-
console.debug("guido:save:complete", e),
|
|
89
|
+
onSaveComplete: (o) => {
|
|
90
|
+
const e = { ...o, metadata: g() };
|
|
91
|
+
console.debug("guido:save:complete", e), r("save:complete", e);
|
|
89
92
|
},
|
|
90
93
|
onTestEmailClick: () => {
|
|
91
|
-
console.debug("guido:test-email:click"),
|
|
94
|
+
console.debug("guido:test-email:click"), r("test-email:click");
|
|
92
95
|
}
|
|
93
96
|
});
|
|
94
|
-
const
|
|
95
|
-
console.debug("dynamic-content:close",
|
|
96
|
-
},
|
|
97
|
+
const B = (o) => {
|
|
98
|
+
console.debug("dynamic-content:close", o), y.setSelectedDynamicContent(o), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: o }));
|
|
99
|
+
}, N = () => {
|
|
97
100
|
console.debug("dynamic-content:close", "Without Data"), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: { text: "", value: "" } }));
|
|
98
101
|
};
|
|
99
102
|
G(() => u.value, () => {
|
|
100
|
-
|
|
103
|
+
r("on-change", u.value);
|
|
101
104
|
});
|
|
102
|
-
const
|
|
103
|
-
const e =
|
|
104
|
-
console.debug("dynamic-content:open", e.detail),
|
|
105
|
+
const v = (o) => {
|
|
106
|
+
const e = o, { attribute: s, position: m } = e.detail;
|
|
107
|
+
console.debug("dynamic-content:open", e.detail), r("dynamic-content:open", s, m);
|
|
105
108
|
};
|
|
106
|
-
let
|
|
107
|
-
const
|
|
109
|
+
let i = null;
|
|
110
|
+
const S = () => {
|
|
108
111
|
var e;
|
|
109
|
-
const
|
|
110
|
-
(e =
|
|
111
|
-
},
|
|
112
|
-
var
|
|
113
|
-
a.mark("host_ready");
|
|
112
|
+
const o = document.querySelector(he);
|
|
113
|
+
(e = f.value) == null || e.style.setProperty("--ribbon-offset", `${(o == null ? void 0 : o.offsetHeight) ?? 0}px`);
|
|
114
|
+
}, h = async () => {
|
|
115
|
+
var o;
|
|
114
116
|
try {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
productType: o.productType,
|
|
118
|
-
templateId: o.templateId,
|
|
119
|
-
variationId: o.variationId
|
|
120
|
-
});
|
|
121
|
-
const e = o.template, i = (e == null ? void 0 : e.html) || "", m = (e == null ? void 0 : e.css) || "", O = (e == null ? void 0 : e.preselectedDynamicContent) || [];
|
|
117
|
+
t.initialized || t.init(a.config), d.templateId = t.templateId;
|
|
118
|
+
const e = t.template, s = (e == null ? void 0 : e.html) || "", m = (e == null ? void 0 : e.css) || "", P = (e == null ? void 0 : e.preselectedDynamicContent) || [];
|
|
122
119
|
C.selectedUnsubscribePages = (e == null ? void 0 : e.selectedUnsubscribePages) || [];
|
|
123
|
-
const
|
|
124
|
-
partnerName:
|
|
120
|
+
const _ = ((o = e == null ? void 0 : e.migration) == null ? void 0 : o.recommendationConfigs) ?? {}, O = t.isFeatureEnabled("linkTrackingIds"), x = {
|
|
121
|
+
partnerName: t.partnerName,
|
|
125
122
|
campaignUrls: e == null ? void 0 : e.recommendationCampaignUrls,
|
|
126
|
-
rrsEnabled:
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
);
|
|
131
|
-
let r = {
|
|
132
|
-
html: i && await x(i),
|
|
123
|
+
rrsEnabled: t.isFeatureEnabled("reusableRecommendationStrategy")
|
|
124
|
+
};
|
|
125
|
+
let n = {
|
|
126
|
+
html: s && await V(s, _, x),
|
|
133
127
|
css: m
|
|
134
128
|
};
|
|
135
|
-
|
|
136
|
-
const ie =
|
|
137
|
-
|
|
138
|
-
const
|
|
139
|
-
preselectedDynamicContentList:
|
|
129
|
+
n.html || (n = await T(), n.html = await V(n.html, _, x));
|
|
130
|
+
const ie = O ? H(n.html, (e == null ? void 0 : e.trackIdCounter) || 0) : 0;
|
|
131
|
+
A(n.html) && (n.html = await I(n.html)), O && (d.trackIdSessionFloor = Math.max(ie, H(n.html)));
|
|
132
|
+
const ce = {
|
|
133
|
+
preselectedDynamicContentList: P,
|
|
140
134
|
onReady: () => {
|
|
141
|
-
console.debug("guido:ready"),
|
|
135
|
+
console.debug("guido:ready"), r("ready");
|
|
142
136
|
}
|
|
143
137
|
};
|
|
144
|
-
p =
|
|
138
|
+
p = U(), await L(n, g(), ce), y.selectedDynamicContentList = P;
|
|
145
139
|
} catch (e) {
|
|
146
|
-
console.error("Failed to initialize Stripo editor:", e)
|
|
140
|
+
console.error("Failed to initialize Stripo editor:", e);
|
|
147
141
|
}
|
|
148
142
|
};
|
|
149
143
|
return me(async () => {
|
|
150
144
|
var e;
|
|
151
|
-
console.debug("Guido says happy coding 🎉"), console.debug("🚗 Ka-Chow"),
|
|
152
|
-
const
|
|
153
|
-
if (
|
|
154
|
-
await
|
|
145
|
+
console.debug("Guido says happy coding 🎉"), console.debug("🚗 Ka-Chow"), z().$reset(), E().$reset(), _e().$reset(), Pe().$reset(), D(), S();
|
|
146
|
+
const o = (e = f.value) == null ? void 0 : e.parentElement;
|
|
147
|
+
if (o && (i = new ResizeObserver(S), i.observe(o)), R(), a.ready)
|
|
148
|
+
await h();
|
|
155
149
|
else {
|
|
156
|
-
const
|
|
157
|
-
m && (
|
|
150
|
+
const s = G(() => a.ready, (m) => {
|
|
151
|
+
m && (s(), h());
|
|
158
152
|
});
|
|
159
153
|
}
|
|
160
|
-
document.addEventListener("dynamic-content:open",
|
|
154
|
+
document.addEventListener("dynamic-content:open", v);
|
|
161
155
|
}), le(() => {
|
|
162
|
-
if (
|
|
156
|
+
if (we(), Ee(), i == null || i.disconnect(), document.removeEventListener("dynamic-content:open", v), b(p))
|
|
163
157
|
try {
|
|
164
|
-
|
|
165
|
-
} catch (
|
|
166
|
-
console.debug("Failed to close the editor readiness gate on unmount",
|
|
158
|
+
E().isStripoInitialized = !1;
|
|
159
|
+
} catch (o) {
|
|
160
|
+
console.debug("Failed to close the editor readiness gate on unmount", o);
|
|
167
161
|
}
|
|
168
|
-
|
|
169
|
-
if (
|
|
162
|
+
M(async () => {
|
|
163
|
+
if (b(p))
|
|
170
164
|
try {
|
|
171
165
|
window.UIEditor.removeEditor();
|
|
172
166
|
} catch {
|
|
173
167
|
console.debug("Failed to remove Stripo editor: No editor found");
|
|
174
168
|
}
|
|
175
|
-
}),
|
|
176
|
-
}),
|
|
169
|
+
}), t.reset();
|
|
170
|
+
}), K({
|
|
177
171
|
dynamicContent: {
|
|
178
|
-
insert:
|
|
179
|
-
close:
|
|
172
|
+
insert: B,
|
|
173
|
+
close: N
|
|
180
174
|
},
|
|
181
175
|
hasChanges: u,
|
|
182
|
-
saveSilent:
|
|
176
|
+
saveSilent: k,
|
|
183
177
|
setLoading: F
|
|
184
|
-
}), { __sfc: !0,
|
|
178
|
+
}), { __sfc: !0, PreviewContainer: j, OnboardingWrapper: J, AssignStrategyDrawer: Q, RemoveStrategyModal: X, LegacyStrategyUpdatedModal: Y, LegacyUnsubscribeConvertedModal: Z, headerWrapperRef: w, wrapperRef: f, dynamicContentStore: y, unsubscribeStore: C, props: a, configStore: t, editorStore: d, previewStore: ee, hasChanges: u, isTestPartner: oe, isSaveValidationEnabled: te, loadRollout: D, saveSilent: k, setLoading: F, emit: r, buildMetadata: g, initPlugin: L, preloadRuntime: R, runExclusive: M, beginMount: U, isCurrentMount: b, mountGeneration: p, getDefaultTemplate: T, cloneTimersOnSave: I, hasTimerBlocks: A, noHeader: ne, isRrsEnabled: re, isLegacyUnsubscribeConversionEnabled: se, hasAssignedStrategy: ae, insertDynamicContent: B, closeDynamicContent: N, handleDynamicContentOpen: v, ribbonObserver: i, updateRibbonOffset: S, startEditor: h, AutoSaveController: Ce, AuthErrorModal: De, Toaster: ke, FilterSelectionDrawer: Fe, HeaderWrapper: Le, LoadingWrapper: Re, SaveAsTemplateDrawer: Me, UnsubscribeWrapper: Ue, ValidationErrorDrawer: Te };
|
|
185
179
|
}
|
|
186
180
|
});
|
|
187
181
|
export {
|
|
188
|
-
|
|
182
|
+
vo as default
|
|
189
183
|
};
|