@lvble/core 2.0.60 → 3.0.0
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 +0 -9
- package/dist/_bundles/core.js +1 -1
- package/dist/_bundles/core.js.map +1 -1
- package/dist/_bundles/core.min.js +1 -1
- package/dist/_bundles/core.min.js.map +1 -1
- package/dist/lib/lvble.d.ts +4 -27
- package/dist/lib/lvble.d.ts.map +1 -1
- package/dist/lib/lvble.js +120 -184
- package/dist/lib/lvble.js.map +1 -1
- package/dist/lib-esm/lvble.d.ts +4 -27
- package/dist/lib-esm/lvble.d.ts.map +1 -1
- package/dist/lib-esm/lvble.js +120 -184
- package/dist/lib-esm/lvble.js.map +1 -1
- package/package.json +2 -1
package/dist/lib-esm/lvble.js
CHANGED
|
@@ -6,18 +6,21 @@ export var Environment;
|
|
|
6
6
|
Environment["Sandbox"] = "sandbox";
|
|
7
7
|
Environment["Production"] = "production";
|
|
8
8
|
})(Environment || (Environment = {}));
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
9
|
+
const envToBaseUrlMap = {
|
|
10
|
+
widget: {
|
|
11
|
+
[Environment.Local]: "http://localhost:3001",
|
|
12
|
+
[Environment.Dev]: "https://v2.widget.pms.development.nowlvble.com",
|
|
13
|
+
[Environment.Sandbox]: "https://v2.widget.pms.sandbox.nowlvble.com",
|
|
14
|
+
[Environment.Production]: "https://v2.widget.pms.production.nowlvble.com",
|
|
15
|
+
},
|
|
16
|
+
experience: {
|
|
17
|
+
[Environment.Local]: "http://localhost:3001",
|
|
18
|
+
[Environment.Dev]: "https://v2.experience.pms.development.nowlvble.com",
|
|
19
|
+
[Environment.Sandbox]: "https://v2.experience.pms.sandbox.nowlvble.com",
|
|
20
|
+
[Environment.Production]: "https://v2.experience.pms.production.nowlvble.com",
|
|
21
|
+
},
|
|
20
22
|
};
|
|
23
|
+
const MIXPANEL_TOKEN = "9ad1530a57a977ab9d4005e2ba11ab4a";
|
|
21
24
|
class LvbleWidget extends HTMLElement {
|
|
22
25
|
constructor() {
|
|
23
26
|
super();
|
|
@@ -34,31 +37,20 @@ class LvbleWidget extends HTMLElement {
|
|
|
34
37
|
return this.getAttribute("environment");
|
|
35
38
|
}
|
|
36
39
|
set environment(val) {
|
|
37
|
-
|
|
38
|
-
this.setAttribute("environment", val)
|
|
39
|
-
|
|
40
|
-
else {
|
|
41
|
-
this.removeAttribute("environment");
|
|
42
|
-
}
|
|
40
|
+
val
|
|
41
|
+
? this.setAttribute("environment", val)
|
|
42
|
+
: this.removeAttribute("environment");
|
|
43
43
|
}
|
|
44
44
|
get token() {
|
|
45
|
-
return this.getAttribute("token");
|
|
45
|
+
return this.getAttribute("token") || "";
|
|
46
46
|
}
|
|
47
47
|
set token(val) {
|
|
48
|
-
|
|
49
|
-
this.setAttribute("token", val);
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
this.removeAttribute("token");
|
|
53
|
-
}
|
|
48
|
+
val ? this.setAttribute("token", val) : this.removeAttribute("token");
|
|
54
49
|
}
|
|
55
50
|
get customApiUrlParam() {
|
|
56
|
-
// This api url will be used in the widget and the experience instead of the existing url
|
|
57
51
|
return this.getAttribute("custom-api-url-param") || "";
|
|
58
52
|
}
|
|
59
53
|
set customApiUrlParam(value) {
|
|
60
|
-
// This api url will be used in the widget and the experience instead of the existing url
|
|
61
|
-
// Only allow setting the custom url if this is dev environment
|
|
62
54
|
if (value && this.environment === Environment.Dev) {
|
|
63
55
|
this.setAttribute("custom-api-url-param", value);
|
|
64
56
|
}
|
|
@@ -68,15 +60,15 @@ class LvbleWidget extends HTMLElement {
|
|
|
68
60
|
}
|
|
69
61
|
connectedCallback() {
|
|
70
62
|
var _a;
|
|
71
|
-
const iframeSrc = `${envToBaseUrlMapWidget[this.environment]}?token=${this.token}&environment=${this.environment}${this.customApiUrlParam}`;
|
|
72
63
|
const iframe = document.createElement("iframe");
|
|
73
|
-
iframe.src =
|
|
74
|
-
iframe.
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
64
|
+
iframe.src = `${envToBaseUrlMap.widget[this.environment]}?token=${this.token}&environment=${this.environment}${this.customApiUrlParam}`;
|
|
65
|
+
iframe.style.cssText = `
|
|
66
|
+
width: 100%;
|
|
67
|
+
height: 100%;
|
|
68
|
+
border: solid transparent;
|
|
69
|
+
border-radius: 10px;
|
|
70
|
+
min-height: inherit;
|
|
71
|
+
`;
|
|
80
72
|
this._iframe = iframe;
|
|
81
73
|
(_a = this.shadowRoot) === null || _a === void 0 ? void 0 : _a.appendChild(iframe);
|
|
82
74
|
}
|
|
@@ -86,164 +78,108 @@ class LvbleWidget extends HTMLElement {
|
|
|
86
78
|
}
|
|
87
79
|
}
|
|
88
80
|
customElements.define("lvble-widget", LvbleWidget);
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
81
|
+
const createModalElements = ({ modal }) => {
|
|
82
|
+
const iframe = document.createElement("iframe");
|
|
83
|
+
iframe.style.cssText = `
|
|
84
|
+
position: absolute;
|
|
85
|
+
top: calc(50dvh);
|
|
86
|
+
left: 50vw;
|
|
87
|
+
transform: translate(-50%, -50%);
|
|
88
|
+
width: min(95dvw, 360px);
|
|
89
|
+
height: clamp(min(75dvh, 750px), ${(modal === null || modal === void 0 ? void 0 : modal.height) || "95dvh"}, min(95dvh, 750px));
|
|
90
|
+
background-color: white;
|
|
91
|
+
border: solid transparent 1px;
|
|
92
|
+
border-radius: 10px;
|
|
93
|
+
`;
|
|
94
|
+
const background = document.createElement("div");
|
|
95
|
+
background.style.cssText = `
|
|
96
|
+
position: fixed;
|
|
97
|
+
top: 0;
|
|
98
|
+
left: 0;
|
|
99
|
+
width: 100%;
|
|
100
|
+
height: 100%;
|
|
101
|
+
background-color: rgba(0, 0, 0, 0.5);
|
|
102
|
+
z-index: 2147483647;
|
|
103
|
+
`;
|
|
104
|
+
background.hidden = true;
|
|
105
|
+
background.appendChild(iframe);
|
|
106
|
+
return { background, iframe };
|
|
107
|
+
};
|
|
108
|
+
const createWidget = (initOptions, modalElements, eventListenersAdded, customApiUrlParam, token) => {
|
|
109
|
+
const widget = new LvbleWidget();
|
|
110
|
+
widget.environment = initOptions.environment;
|
|
111
|
+
widget.token = token;
|
|
112
|
+
widget.customApiUrlParam = customApiUrlParam;
|
|
113
|
+
modalElements.iframe.src = `${envToBaseUrlMap.experience[initOptions.environment]}?token=${token}${customApiUrlParam}`;
|
|
114
|
+
document.body.appendChild(modalElements.background);
|
|
115
|
+
const handleWidgetMessage = (message) => {
|
|
116
|
+
if (message.origin !== envToBaseUrlMap.widget[initOptions.environment])
|
|
117
|
+
return;
|
|
118
|
+
const { eventType, data } = message.data;
|
|
119
|
+
if (!eventType)
|
|
120
|
+
return;
|
|
121
|
+
if (eventType === "OPEN_EXPERIENCE_REQUEST") {
|
|
122
|
+
openExperience(initOptions, modalElements, customApiUrlParam, token);
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
if (!eventListenersAdded.lvble) {
|
|
126
|
+
window.addEventListener("message", handleWidgetMessage);
|
|
127
|
+
eventListenersAdded.lvble = true;
|
|
128
|
+
mixpanel.init(MIXPANEL_TOKEN, { debug: false });
|
|
129
|
+
}
|
|
130
|
+
return widget;
|
|
131
|
+
};
|
|
132
|
+
const openExperience = (initOptions, modalElements, customApiUrlParam, token) => {
|
|
133
|
+
if (!modalElements.iframe.src) {
|
|
134
|
+
modalElements.iframe.src = `${envToBaseUrlMap.experience[initOptions.environment]}?token=${token}${customApiUrlParam}`;
|
|
135
|
+
document.body.appendChild(modalElements.background);
|
|
136
|
+
}
|
|
137
|
+
modalElements.background.hidden = false;
|
|
138
|
+
const handleModalMessage = (message) => {
|
|
139
|
+
if (message.origin !== envToBaseUrlMap.experience[initOptions.environment])
|
|
140
|
+
return;
|
|
141
|
+
const { eventType, data } = message.data;
|
|
142
|
+
if (!eventType)
|
|
143
|
+
return;
|
|
144
|
+
if (eventType === "CLOSE_EXPERIENCE_REQUEST") {
|
|
145
|
+
modalElements.background.hidden = true;
|
|
146
|
+
initOptions.onEvent("EXPERIENCE_CLOSED", {});
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
document.querySelectorAll("lvble-widget").forEach((widget) => {
|
|
150
|
+
var _a, _b;
|
|
151
|
+
const iframe = (_a = widget.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector("iframe");
|
|
152
|
+
(_b = iframe.contentWindow) === null || _b === void 0 ? void 0 : _b.postMessage(message.data, "*");
|
|
153
|
+
});
|
|
154
|
+
mixpanel.track("BEFORE_INVOKE_ON_EVENT", message.data);
|
|
155
|
+
initOptions.onEvent(eventType, data);
|
|
156
|
+
mixpanel.track("AFTER_INVOKE_ON_EVENT", message.data);
|
|
157
|
+
};
|
|
158
|
+
if (!modalElements.background.hidden) {
|
|
159
|
+
window.addEventListener("message", handleModalMessage);
|
|
160
|
+
}
|
|
126
161
|
};
|
|
127
162
|
const lvble = (initOptions) => {
|
|
128
|
-
|
|
129
|
-
* Note: you can only register for onEvent once.
|
|
130
|
-
*/
|
|
131
|
-
if (!initOptions.onEvent) {
|
|
163
|
+
if (!initOptions.onEvent)
|
|
132
164
|
throw new Error("onEvent callback is required");
|
|
133
|
-
|
|
134
|
-
if (!initOptions.environment) {
|
|
165
|
+
if (!initOptions.environment)
|
|
135
166
|
throw new Error("environment is required");
|
|
136
|
-
|
|
167
|
+
let lvbleInitialized = false;
|
|
168
|
+
let eventListenersAdded = { lvble: false, open: false };
|
|
169
|
+
let modalElements = {};
|
|
137
170
|
if (!lvbleInitialized) {
|
|
138
|
-
|
|
139
|
-
modal: initOptions.modal,
|
|
140
|
-
});
|
|
141
|
-
modalBackground = result.modalBackground;
|
|
142
|
-
modalIframe = result.modalIframe;
|
|
171
|
+
modalElements = createModalElements({ modal: initOptions.modal });
|
|
143
172
|
lvbleInitialized = true;
|
|
144
173
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
174
|
+
const customApiUrlParam = initOptions.customApiUrl
|
|
175
|
+
? `&customApiUrl=${initOptions.customApiUrl}`
|
|
176
|
+
: "";
|
|
177
|
+
const lvbleInstance = {
|
|
149
178
|
isModalBuilt: false,
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
*
|
|
153
|
-
* @returns A lvble widget. Note that it detects mode automatically.
|
|
154
|
-
*/
|
|
155
|
-
createWidget: (widgetOptions) => {
|
|
156
|
-
const widget = new LvbleWidget();
|
|
157
|
-
widget.environment = initOptions.environment;
|
|
158
|
-
widget.token = widgetOptions.token;
|
|
159
|
-
widget.customApiUrlParam = customApiUrlParam; // Order matters, customApiUrlParam expects environment is set.
|
|
160
|
-
/** The iframe is created and rendered upon widget initialization! (Eager Loading)
|
|
161
|
-
* Since the "hidden" attribute is used, we control only the modal's VISIBILITY upon opening / closing
|
|
162
|
-
*/
|
|
163
|
-
modalIframe.src = `${envToBaseUrlMapExperience[initOptions.environment]}?token=${widgetOptions.token}${customApiUrlParam}`;
|
|
164
|
-
document.body.appendChild(modalBackground);
|
|
165
|
-
l.isModalBuilt = true;
|
|
166
|
-
const messageListener = (message) => {
|
|
167
|
-
// Verify we got a valid message from the iframe.
|
|
168
|
-
if (message.origin != envToBaseUrlMapWidget[initOptions.environment]) {
|
|
169
|
-
console.debug(`Received message from unknown origin: ${message.origin}`);
|
|
170
|
-
return;
|
|
171
|
-
}
|
|
172
|
-
const eventData = message.data;
|
|
173
|
-
if (!eventData.eventType) {
|
|
174
|
-
console.debug(`Received message without eventType: ${JSON.stringify(eventData)}`);
|
|
175
|
-
return;
|
|
176
|
-
}
|
|
177
|
-
if (eventData.eventType === "OPEN_EXPERIENCE_REQUEST") {
|
|
178
|
-
l.open({ token: widgetOptions.token });
|
|
179
|
-
}
|
|
180
|
-
};
|
|
181
|
-
if (!eventListenerLvbleAdded) {
|
|
182
|
-
window.addEventListener("message", messageListener);
|
|
183
|
-
eventListenerLvbleAdded = true;
|
|
184
|
-
mixpanel.init("9ad1530a57a977ab9d4005e2ba11ab4a", { debug: true });
|
|
185
|
-
}
|
|
186
|
-
return widget;
|
|
187
|
-
},
|
|
188
|
-
/**
|
|
189
|
-
* This function opens a modal with the relevant mode.
|
|
190
|
-
* @param openOptions The options for opening the modal. See `OpenOptions` for more information.
|
|
191
|
-
*/
|
|
192
|
-
open: (openOptions) => {
|
|
193
|
-
const modeUrlMap = {
|
|
194
|
-
onboarding: `${envToBaseUrlMapExperience[initOptions.environment]}?token=${openOptions.token}${customApiUrlParam}`,
|
|
195
|
-
offboarding: `${envToBaseUrlMapExperience[initOptions.environment]}?token=${openOptions.token}${customApiUrlParam}`,
|
|
196
|
-
split: `${envToBaseUrlMapExperience[initOptions.environment]}?token=${openOptions.token}${customApiUrlParam}`,
|
|
197
|
-
repay: `${envToBaseUrlMapExperience[initOptions.environment]}?token=${openOptions.token}${customApiUrlParam}`,
|
|
198
|
-
};
|
|
199
|
-
/** Modal's iframe is given src and rendered ONLY in case the Livble widget is not present
|
|
200
|
-
* (Otherwise it is already initialized upon widget creation)
|
|
201
|
-
*/
|
|
202
|
-
if (!l.isModalBuilt) {
|
|
203
|
-
const modeUrl = openOptions.mode
|
|
204
|
-
? modeUrlMap[openOptions.mode]
|
|
205
|
-
: `${envToBaseUrlMapExperience[initOptions.environment]}?token=${openOptions.token}${customApiUrlParam}`;
|
|
206
|
-
modalIframe.src = modeUrl;
|
|
207
|
-
document.body.appendChild(modalBackground);
|
|
208
|
-
l.isModalBuilt = true;
|
|
209
|
-
}
|
|
210
|
-
// Display modal by switching off the "hidden" attribute
|
|
211
|
-
modalBackground.hidden = false;
|
|
212
|
-
const messageListener = (message) => {
|
|
213
|
-
// Verify we got a valid message from the iframe.
|
|
214
|
-
if (message.origin != envToBaseUrlMapExperience[initOptions.environment]) {
|
|
215
|
-
console.debug(`Received message from unknown origin: ${message.origin} Expecting only ${envToBaseUrlMapExperience[initOptions.environment]}`);
|
|
216
|
-
return;
|
|
217
|
-
}
|
|
218
|
-
const eventData = message.data;
|
|
219
|
-
if (!eventData.eventType) {
|
|
220
|
-
console.debug(`Received message without eventType: ${JSON.stringify(eventData)}`);
|
|
221
|
-
return;
|
|
222
|
-
}
|
|
223
|
-
if (eventData.eventType === "CLOSE_EXPERIENCE_REQUEST") {
|
|
224
|
-
// Modal visibility is switched off (but the modal itself is not removed from the DOM)
|
|
225
|
-
modalBackground.hidden = true;
|
|
226
|
-
initOptions.onEvent("EXPERIENCE_CLOSED", {});
|
|
227
|
-
return;
|
|
228
|
-
}
|
|
229
|
-
// TODO: Consider using websocket in iframes instead of posting messages to them.
|
|
230
|
-
const iframes = document.querySelectorAll("lvble-widget");
|
|
231
|
-
iframes.forEach((w) => {
|
|
232
|
-
var _a, _b;
|
|
233
|
-
(_b = ((_a = w.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector("iframe")).contentWindow) === null || _b === void 0 ? void 0 : _b.postMessage(eventData, "*");
|
|
234
|
-
});
|
|
235
|
-
mixpanel.track("BEFORE_INVOKE_ON_EVENT", eventData);
|
|
236
|
-
initOptions.onEvent(eventData.eventType, eventData.data);
|
|
237
|
-
mixpanel.track("AFTER_INVOKE_ON_EVENT", eventData);
|
|
238
|
-
};
|
|
239
|
-
if (!eventListenerOpenAdded) {
|
|
240
|
-
window.addEventListener("message", messageListener);
|
|
241
|
-
eventListenerOpenAdded = true;
|
|
242
|
-
mixpanel.init("9ad1530a57a977ab9d4005e2ba11ab4a", { debug: true });
|
|
243
|
-
}
|
|
244
|
-
},
|
|
179
|
+
createWidget: ({ token }) => createWidget(initOptions, modalElements, eventListenersAdded, customApiUrlParam, token),
|
|
180
|
+
open: (token) => openExperience(initOptions, modalElements, customApiUrlParam, token),
|
|
245
181
|
};
|
|
246
|
-
return
|
|
182
|
+
return lvbleInstance;
|
|
247
183
|
};
|
|
248
184
|
export const Lvble = lvble;
|
|
249
185
|
//# sourceMappingURL=lvble.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lvble.js","sourceRoot":"","sources":["../../src/lib/lvble.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,kBAAkB,CAAC;AAExC,MAAM,CAAN,IAAY,WAKX;AALD,WAAY,WAAW;IACrB,8BAAe,CAAA;IACf,kCAAmB,CAAA;IACnB,kCAAmB,CAAA;IACnB,wCAAyB,CAAA;AAC3B,CAAC,EALW,WAAW,KAAX,WAAW,QAKtB;
|
|
1
|
+
{"version":3,"file":"lvble.js","sourceRoot":"","sources":["../../src/lib/lvble.ts"],"names":[],"mappings":"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"}
|