@liquidcommercedev/rmn-sdk 1.4.3 → 1.4.4-beta.2
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/dist/index.cjs +74 -58
- package/dist/index.esm.js +74 -58
- package/dist/types/modules/spot/html/spot.element.service.d.ts +1 -1
- package/dist/types/modules/spot/html/spot.element.shadow-root.d.ts +2 -1
- package/dist/types/modules/spot/spot.constant.d.ts +1 -0
- package/dist/types/modules/spot/spot.html.service.d.ts +1 -1
- package/dist/types/modules/spot/spot.interface.d.ts +2 -1
- package/dist/types/rmn-client.d.ts +2 -2
- package/package.json +1 -1
- package/umd/liquidcommerce-rmn-sdk.min.js +1 -1
package/dist/index.cjs
CHANGED
@@ -15152,43 +15152,45 @@ class AuthService extends BaseApi {
|
|
15152
15152
|
}
|
15153
15153
|
|
15154
15154
|
const SPOT_ELEMENT_TAG = 'spot-element';
|
15155
|
+
const SPOT_ELEMENT_SLOT_NAME = `${SPOT_ELEMENT_TAG}-custom-content`;
|
15155
15156
|
const SPOTS_SELECTION_API_PATH = '/spots/selection';
|
15156
15157
|
const SPOT_EVENT_API_PATH = '/spots/event';
|
15157
15158
|
|
15158
|
-
const SPOT_ELEMENT_SHADOW_ROOT = (width, height,
|
15159
|
+
const SPOT_ELEMENT_SHADOW_ROOT = (width, height, hasCustomContent) => {
|
15159
15160
|
const style = document.createElement('style');
|
15161
|
+
style.textContent = `
|
15162
|
+
:host {
|
15163
|
+
display: block;
|
15164
|
+
position: relative;
|
15165
|
+
container-type: inline-size;
|
15166
|
+
overflow: hidden;
|
15167
|
+
}
|
15168
|
+
:host([fluid="true"]) {
|
15169
|
+
width: 100%;
|
15170
|
+
height: 100%;
|
15171
|
+
}
|
15172
|
+
:host([fluid="false"]) {
|
15173
|
+
width: ${width}px;
|
15174
|
+
height: ${height}px;
|
15175
|
+
}
|
15176
|
+
`;
|
15160
15177
|
const wrapper = document.createElement('div');
|
15161
15178
|
wrapper.className = 'wrapper';
|
15162
|
-
|
15163
|
-
|
15164
|
-
|
15165
|
-
|
15166
|
-
|
15167
|
-
|
15168
|
-
|
15169
|
-
:
|
15170
|
-
|
15171
|
-
|
15172
|
-
|
15173
|
-
|
15174
|
-
width: ${width}px;
|
15175
|
-
height: ${height}px;
|
15176
|
-
}
|
15179
|
+
const slot = document.createElement('slot');
|
15180
|
+
slot.name = SPOT_ELEMENT_SLOT_NAME;
|
15181
|
+
if (!hasCustomContent) {
|
15182
|
+
style.textContent += `
|
15183
|
+
:host .wrapper {
|
15184
|
+
position: absolute;
|
15185
|
+
top: 0;
|
15186
|
+
left: 0;
|
15187
|
+
width: 100%;
|
15188
|
+
height: 100%;
|
15189
|
+
overflow: hidden;
|
15190
|
+
}
|
15177
15191
|
`;
|
15178
|
-
if (hasCustomHtmlElement) {
|
15179
|
-
return { style, wrapper };
|
15180
15192
|
}
|
15181
|
-
style
|
15182
|
-
.wrapper {
|
15183
|
-
position: absolute;
|
15184
|
-
top: 0;
|
15185
|
-
left: 0;
|
15186
|
-
width: 100%;
|
15187
|
-
height: 100%;
|
15188
|
-
overflow: hidden;
|
15189
|
-
}
|
15190
|
-
`;
|
15191
|
-
return { style, wrapper };
|
15193
|
+
return { style, wrapper, slot };
|
15192
15194
|
};
|
15193
15195
|
|
15194
15196
|
const GFONT_PRECONNECT = () => `
|
@@ -16053,7 +16055,7 @@ function rbCollectionBannerWithoutTextBlockTemplate(spot) {
|
|
16053
16055
|
`;
|
16054
16056
|
}
|
16055
16057
|
|
16056
|
-
const STYLES$6 = ({ textColor = '#
|
16058
|
+
const STYLES$6 = ({ textColor = '#ffffff', ctaTextColor = textColor, ctaBorderColor = ctaTextColor, primaryImage, mobilePrimaryImage = primaryImage, }) => `
|
16057
16059
|
<style>
|
16058
16060
|
:host {
|
16059
16061
|
min-width: 320px;
|
@@ -16496,7 +16498,7 @@ function rbHomepageHeroTwoTileTemplate(spot) {
|
|
16496
16498
|
`;
|
16497
16499
|
}
|
16498
16500
|
|
16499
|
-
const STYLES$3 = ({ textColor = '#
|
16501
|
+
const STYLES$3 = ({ textColor = '#ffffff', ctaTextColor = textColor, ctaBorderColor = ctaTextColor, primaryImage, mobilePrimaryImage = primaryImage, }) => `
|
16500
16502
|
<style>
|
16501
16503
|
:host {
|
16502
16504
|
min-width: 320px;
|
@@ -16617,7 +16619,7 @@ function rbLargeCategoryImageToutTemplate(spot) {
|
|
16617
16619
|
`;
|
16618
16620
|
}
|
16619
16621
|
|
16620
|
-
const STYLES$2 = ({ textColor = '#
|
16622
|
+
const STYLES$2 = ({ textColor = '#ffffff', primaryImage, mobilePrimaryImage = primaryImage, }) => `
|
16621
16623
|
<style>
|
16622
16624
|
:host {
|
16623
16625
|
min-width: 320px;
|
@@ -16686,7 +16688,7 @@ function rbNavigationBannerTemplate(spot) {
|
|
16686
16688
|
`;
|
16687
16689
|
}
|
16688
16690
|
|
16689
|
-
const STYLES$1 = ({ textColor = '#
|
16691
|
+
const STYLES$1 = ({ textColor = '#ffffff', primaryImage, mobilePrimaryImage = primaryImage, }) => `
|
16690
16692
|
<style>
|
16691
16693
|
:host {
|
16692
16694
|
min-width: 165px;
|
@@ -16739,7 +16741,7 @@ function rbSmallCategoryImageToutTemplate(spot) {
|
|
16739
16741
|
`;
|
16740
16742
|
}
|
16741
16743
|
|
16742
|
-
const STYLES = ({ textColor = '#
|
16744
|
+
const STYLES = ({ textColor = '#000000', backgroundColor = 'transparent', primaryImage, mobilePrimaryImage = primaryImage, }) => `
|
16743
16745
|
<style>
|
16744
16746
|
:host {
|
16745
16747
|
min-width: 165px;
|
@@ -16889,16 +16891,20 @@ if (typeof window !== 'undefined' && typeof window.customElements !== 'undefined
|
|
16889
16891
|
class CustomSpotElement extends HTMLElement {
|
16890
16892
|
constructor() {
|
16891
16893
|
super();
|
16894
|
+
this.hasCustomContent = false;
|
16895
|
+
this.handleClick = this.handleClick.bind(this);
|
16892
16896
|
this.attachShadow({ mode: 'open' });
|
16893
16897
|
}
|
16894
16898
|
connectedCallback() {
|
16895
|
-
this.
|
16899
|
+
this.hasCustomContent = Boolean(this.customContent);
|
16900
|
+
this.addEventListener('click', this.handleClick);
|
16896
16901
|
this.setupIntersectionObserver();
|
16897
16902
|
this.render();
|
16898
16903
|
}
|
16899
16904
|
disconnectedCallback() {
|
16900
16905
|
var _a;
|
16901
16906
|
(_a = this.observer) === null || _a === void 0 ? void 0 : _a.disconnect();
|
16907
|
+
this.removeEventListener('click', this.handleClick);
|
16902
16908
|
}
|
16903
16909
|
attributeChangedCallback(_name, oldValue, newValue) {
|
16904
16910
|
if (oldValue !== newValue) {
|
@@ -16908,14 +16914,26 @@ if (typeof window !== 'undefined' && typeof window.customElements !== 'undefined
|
|
16908
16914
|
render() {
|
16909
16915
|
if (!this.shadowRoot || !this.data)
|
16910
16916
|
return;
|
16911
|
-
const { style, wrapper } = SPOT_ELEMENT_SHADOW_ROOT(this.data.width, this.data.height,
|
16912
|
-
|
16913
|
-
|
16917
|
+
const { style, wrapper, slot } = SPOT_ELEMENT_SHADOW_ROOT(this.data.width, this.data.height, this.hasCustomContent);
|
16918
|
+
this.shadowRoot.replaceChildren(style, slot);
|
16919
|
+
if (this.hasCustomContent) {
|
16920
|
+
this.setCustomContent();
|
16914
16921
|
}
|
16915
|
-
|
16922
|
+
if (!this.hasCustomContent) {
|
16916
16923
|
wrapper.innerHTML = GET_SPOT_TEMPLATE_HTML_STRING(this.data);
|
16924
|
+
this.shadowRoot.appendChild(wrapper);
|
16917
16925
|
}
|
16918
|
-
|
16926
|
+
}
|
16927
|
+
setCustomContent() {
|
16928
|
+
const wrapper = document.createElement('div');
|
16929
|
+
wrapper.setAttribute('slot', SPOT_ELEMENT_SLOT_NAME);
|
16930
|
+
if (typeof this.customContent === 'string') {
|
16931
|
+
wrapper.innerHTML = this.customContent;
|
16932
|
+
}
|
16933
|
+
if (this.customContent instanceof HTMLElement) {
|
16934
|
+
wrapper.appendChild(this.customContent);
|
16935
|
+
}
|
16936
|
+
this.appendChild(wrapper);
|
16919
16937
|
}
|
16920
16938
|
setupIntersectionObserver() {
|
16921
16939
|
const options = {
|
@@ -16932,21 +16950,21 @@ if (typeof window !== 'undefined' && typeof window.customElements !== 'undefined
|
|
16932
16950
|
}, options);
|
16933
16951
|
this.observer.observe(this);
|
16934
16952
|
}
|
16953
|
+
handleClick() {
|
16954
|
+
this.registerEvent(exports.RMN_SPOT_EVENT.CLICK);
|
16955
|
+
}
|
16935
16956
|
async registerEvent(event) {
|
16936
16957
|
var _a, _b;
|
16937
16958
|
if (!this.data)
|
16938
16959
|
return;
|
16939
16960
|
const shouldRedirectOnClick = this.getAttribute(ENUM_SPOT_ELEMENT_ATTRIBUTE.REDIRECT_ON_CLICK) === 'true';
|
16940
|
-
const
|
16961
|
+
const eventUrl = (_b = (_a = this.data.events.find((e) => e.event === event)) === null || _a === void 0 ? void 0 : _a.url) !== null && _b !== void 0 ? _b : '';
|
16941
16962
|
try {
|
16942
16963
|
const options = {
|
16943
16964
|
method: 'POST',
|
16944
|
-
redirect: 'manual',
|
16965
|
+
redirect: event === exports.RMN_SPOT_EVENT.CLICK && shouldRedirectOnClick ? 'follow' : 'manual',
|
16945
16966
|
};
|
16946
|
-
|
16947
|
-
options.redirect = 'follow';
|
16948
|
-
}
|
16949
|
-
const normalizedUrl = this.normalizeUrl(url);
|
16967
|
+
const normalizedUrl = this.normalizeUrl(eventUrl);
|
16950
16968
|
const response = await fetch(normalizedUrl, options);
|
16951
16969
|
if (response.ok && event === exports.RMN_SPOT_EVENT.CLICK && shouldRedirectOnClick) {
|
16952
16970
|
window.location.href = this.getRedirectUrlFromPayload(normalizedUrl);
|
@@ -16963,16 +16981,13 @@ if (typeof window !== 'undefined' && typeof window.customElements !== 'undefined
|
|
16963
16981
|
return url.replace(/https?:\/\/[^/]+\/[^?]+/, `${rmnUrl}`);
|
16964
16982
|
}
|
16965
16983
|
getRedirectUrlFromPayload(url) {
|
16966
|
-
var _a;
|
16984
|
+
var _a, _b;
|
16967
16985
|
const base64String = (_a = new URL(url).searchParams.get('e')) !== null && _a !== void 0 ? _a : '';
|
16968
16986
|
try {
|
16969
|
-
const
|
16970
|
-
|
16971
|
-
return obj.ur;
|
16972
|
-
}
|
16973
|
-
return '';
|
16987
|
+
const data = JSON.parse(atob(base64String));
|
16988
|
+
return (_b = data.ur) !== null && _b !== void 0 ? _b : '';
|
16974
16989
|
}
|
16975
|
-
catch (
|
16990
|
+
catch (_c) {
|
16976
16991
|
return '';
|
16977
16992
|
}
|
16978
16993
|
}
|
@@ -16993,7 +17008,7 @@ class SpotHtmlService {
|
|
16993
17008
|
* @param {ISpot} spot - The spot data.
|
16994
17009
|
* @param {ICreateSpotElementConfig} config - The configuration object.
|
16995
17010
|
* @param {ICreateSpotElementConfig.fluid} config.fluid - If the spot should be fluid or not.
|
16996
|
-
* @param {ICreateSpotElementConfig.
|
17011
|
+
* @param {ICreateSpotElementConfig.customContent} config.customContent - Use a custom html element/string.
|
16997
17012
|
* @param {ICreateSpotElementConfig.redirectOnClick} config.redirectOnClick - If the spot should redirect on click.
|
16998
17013
|
*
|
16999
17014
|
* @return {HTMLElement | null} - The spot html element or null if the browser environment is not available.
|
@@ -17012,8 +17027,9 @@ class SpotHtmlService {
|
|
17012
17027
|
element.setAttribute(ENUM_SPOT_ELEMENT_ATTRIBUTE.REDIRECT_ON_CLICK, shouldRedirectOnClick.toString());
|
17013
17028
|
// Share the spot data with the element
|
17014
17029
|
element.data = spot;
|
17015
|
-
|
17016
|
-
|
17030
|
+
// Set custom content
|
17031
|
+
if (config === null || config === void 0 ? void 0 : config.customContent) {
|
17032
|
+
element.customContent = config.customContent;
|
17017
17033
|
}
|
17018
17034
|
return element;
|
17019
17035
|
}
|
@@ -17097,7 +17113,7 @@ class LiquidCommerceRmnClient {
|
|
17097
17113
|
* @param {ISpot} spot - The spot data.
|
17098
17114
|
* @param {ICreateSpotElementConfig} config - The configuration object.
|
17099
17115
|
* @param {ICreateSpotElementConfig.fluid} config.fluid - If the spot should be fluid or not.
|
17100
|
-
* @param {ICreateSpotElementConfig.
|
17116
|
+
* @param {ICreateSpotElementConfig.customContent} config.customContent - Use a custom html element/string.
|
17101
17117
|
* @param {ICreateSpotElementConfig.redirectOnClick} config.redirectOnClick - If the spot should redirect on click.
|
17102
17118
|
*
|
17103
17119
|
* @return {HTMLElement | null} - The spot html element or null if the browser environment is not available.
|
@@ -17129,7 +17145,7 @@ async function RmnClient(apiKey, config) {
|
|
17129
17145
|
* @param {ISpot} spot - The spot data.
|
17130
17146
|
* @param {ICreateSpotElementConfig} config - The configuration object.
|
17131
17147
|
* @param {ICreateSpotElementConfig.fluid} config.fluid - If the spot should be fluid or not.
|
17132
|
-
* @param {ICreateSpotElementConfig.
|
17148
|
+
* @param {ICreateSpotElementConfig.customContent} config.customContent - Use a custom html element/string.
|
17133
17149
|
* @param {ICreateSpotElementConfig.redirectOnClick} config.redirectOnClick - If the spot should redirect on click.
|
17134
17150
|
*
|
17135
17151
|
* @return {HTMLElement | null} - The spot html element or null if the browser environment is not available.
|
package/dist/index.esm.js
CHANGED
@@ -15150,43 +15150,45 @@ class AuthService extends BaseApi {
|
|
15150
15150
|
}
|
15151
15151
|
|
15152
15152
|
const SPOT_ELEMENT_TAG = 'spot-element';
|
15153
|
+
const SPOT_ELEMENT_SLOT_NAME = `${SPOT_ELEMENT_TAG}-custom-content`;
|
15153
15154
|
const SPOTS_SELECTION_API_PATH = '/spots/selection';
|
15154
15155
|
const SPOT_EVENT_API_PATH = '/spots/event';
|
15155
15156
|
|
15156
|
-
const SPOT_ELEMENT_SHADOW_ROOT = (width, height,
|
15157
|
+
const SPOT_ELEMENT_SHADOW_ROOT = (width, height, hasCustomContent) => {
|
15157
15158
|
const style = document.createElement('style');
|
15159
|
+
style.textContent = `
|
15160
|
+
:host {
|
15161
|
+
display: block;
|
15162
|
+
position: relative;
|
15163
|
+
container-type: inline-size;
|
15164
|
+
overflow: hidden;
|
15165
|
+
}
|
15166
|
+
:host([fluid="true"]) {
|
15167
|
+
width: 100%;
|
15168
|
+
height: 100%;
|
15169
|
+
}
|
15170
|
+
:host([fluid="false"]) {
|
15171
|
+
width: ${width}px;
|
15172
|
+
height: ${height}px;
|
15173
|
+
}
|
15174
|
+
`;
|
15158
15175
|
const wrapper = document.createElement('div');
|
15159
15176
|
wrapper.className = 'wrapper';
|
15160
|
-
|
15161
|
-
|
15162
|
-
|
15163
|
-
|
15164
|
-
|
15165
|
-
|
15166
|
-
|
15167
|
-
:
|
15168
|
-
|
15169
|
-
|
15170
|
-
|
15171
|
-
|
15172
|
-
width: ${width}px;
|
15173
|
-
height: ${height}px;
|
15174
|
-
}
|
15177
|
+
const slot = document.createElement('slot');
|
15178
|
+
slot.name = SPOT_ELEMENT_SLOT_NAME;
|
15179
|
+
if (!hasCustomContent) {
|
15180
|
+
style.textContent += `
|
15181
|
+
:host .wrapper {
|
15182
|
+
position: absolute;
|
15183
|
+
top: 0;
|
15184
|
+
left: 0;
|
15185
|
+
width: 100%;
|
15186
|
+
height: 100%;
|
15187
|
+
overflow: hidden;
|
15188
|
+
}
|
15175
15189
|
`;
|
15176
|
-
if (hasCustomHtmlElement) {
|
15177
|
-
return { style, wrapper };
|
15178
15190
|
}
|
15179
|
-
style
|
15180
|
-
.wrapper {
|
15181
|
-
position: absolute;
|
15182
|
-
top: 0;
|
15183
|
-
left: 0;
|
15184
|
-
width: 100%;
|
15185
|
-
height: 100%;
|
15186
|
-
overflow: hidden;
|
15187
|
-
}
|
15188
|
-
`;
|
15189
|
-
return { style, wrapper };
|
15191
|
+
return { style, wrapper, slot };
|
15190
15192
|
};
|
15191
15193
|
|
15192
15194
|
const GFONT_PRECONNECT = () => `
|
@@ -16051,7 +16053,7 @@ function rbCollectionBannerWithoutTextBlockTemplate(spot) {
|
|
16051
16053
|
`;
|
16052
16054
|
}
|
16053
16055
|
|
16054
|
-
const STYLES$6 = ({ textColor = '#
|
16056
|
+
const STYLES$6 = ({ textColor = '#ffffff', ctaTextColor = textColor, ctaBorderColor = ctaTextColor, primaryImage, mobilePrimaryImage = primaryImage, }) => `
|
16055
16057
|
<style>
|
16056
16058
|
:host {
|
16057
16059
|
min-width: 320px;
|
@@ -16494,7 +16496,7 @@ function rbHomepageHeroTwoTileTemplate(spot) {
|
|
16494
16496
|
`;
|
16495
16497
|
}
|
16496
16498
|
|
16497
|
-
const STYLES$3 = ({ textColor = '#
|
16499
|
+
const STYLES$3 = ({ textColor = '#ffffff', ctaTextColor = textColor, ctaBorderColor = ctaTextColor, primaryImage, mobilePrimaryImage = primaryImage, }) => `
|
16498
16500
|
<style>
|
16499
16501
|
:host {
|
16500
16502
|
min-width: 320px;
|
@@ -16615,7 +16617,7 @@ function rbLargeCategoryImageToutTemplate(spot) {
|
|
16615
16617
|
`;
|
16616
16618
|
}
|
16617
16619
|
|
16618
|
-
const STYLES$2 = ({ textColor = '#
|
16620
|
+
const STYLES$2 = ({ textColor = '#ffffff', primaryImage, mobilePrimaryImage = primaryImage, }) => `
|
16619
16621
|
<style>
|
16620
16622
|
:host {
|
16621
16623
|
min-width: 320px;
|
@@ -16684,7 +16686,7 @@ function rbNavigationBannerTemplate(spot) {
|
|
16684
16686
|
`;
|
16685
16687
|
}
|
16686
16688
|
|
16687
|
-
const STYLES$1 = ({ textColor = '#
|
16689
|
+
const STYLES$1 = ({ textColor = '#ffffff', primaryImage, mobilePrimaryImage = primaryImage, }) => `
|
16688
16690
|
<style>
|
16689
16691
|
:host {
|
16690
16692
|
min-width: 165px;
|
@@ -16737,7 +16739,7 @@ function rbSmallCategoryImageToutTemplate(spot) {
|
|
16737
16739
|
`;
|
16738
16740
|
}
|
16739
16741
|
|
16740
|
-
const STYLES = ({ textColor = '#
|
16742
|
+
const STYLES = ({ textColor = '#000000', backgroundColor = 'transparent', primaryImage, mobilePrimaryImage = primaryImage, }) => `
|
16741
16743
|
<style>
|
16742
16744
|
:host {
|
16743
16745
|
min-width: 165px;
|
@@ -16887,16 +16889,20 @@ if (typeof window !== 'undefined' && typeof window.customElements !== 'undefined
|
|
16887
16889
|
class CustomSpotElement extends HTMLElement {
|
16888
16890
|
constructor() {
|
16889
16891
|
super();
|
16892
|
+
this.hasCustomContent = false;
|
16893
|
+
this.handleClick = this.handleClick.bind(this);
|
16890
16894
|
this.attachShadow({ mode: 'open' });
|
16891
16895
|
}
|
16892
16896
|
connectedCallback() {
|
16893
|
-
this.
|
16897
|
+
this.hasCustomContent = Boolean(this.customContent);
|
16898
|
+
this.addEventListener('click', this.handleClick);
|
16894
16899
|
this.setupIntersectionObserver();
|
16895
16900
|
this.render();
|
16896
16901
|
}
|
16897
16902
|
disconnectedCallback() {
|
16898
16903
|
var _a;
|
16899
16904
|
(_a = this.observer) === null || _a === void 0 ? void 0 : _a.disconnect();
|
16905
|
+
this.removeEventListener('click', this.handleClick);
|
16900
16906
|
}
|
16901
16907
|
attributeChangedCallback(_name, oldValue, newValue) {
|
16902
16908
|
if (oldValue !== newValue) {
|
@@ -16906,14 +16912,26 @@ if (typeof window !== 'undefined' && typeof window.customElements !== 'undefined
|
|
16906
16912
|
render() {
|
16907
16913
|
if (!this.shadowRoot || !this.data)
|
16908
16914
|
return;
|
16909
|
-
const { style, wrapper } = SPOT_ELEMENT_SHADOW_ROOT(this.data.width, this.data.height,
|
16910
|
-
|
16911
|
-
|
16915
|
+
const { style, wrapper, slot } = SPOT_ELEMENT_SHADOW_ROOT(this.data.width, this.data.height, this.hasCustomContent);
|
16916
|
+
this.shadowRoot.replaceChildren(style, slot);
|
16917
|
+
if (this.hasCustomContent) {
|
16918
|
+
this.setCustomContent();
|
16912
16919
|
}
|
16913
|
-
|
16920
|
+
if (!this.hasCustomContent) {
|
16914
16921
|
wrapper.innerHTML = GET_SPOT_TEMPLATE_HTML_STRING(this.data);
|
16922
|
+
this.shadowRoot.appendChild(wrapper);
|
16915
16923
|
}
|
16916
|
-
|
16924
|
+
}
|
16925
|
+
setCustomContent() {
|
16926
|
+
const wrapper = document.createElement('div');
|
16927
|
+
wrapper.setAttribute('slot', SPOT_ELEMENT_SLOT_NAME);
|
16928
|
+
if (typeof this.customContent === 'string') {
|
16929
|
+
wrapper.innerHTML = this.customContent;
|
16930
|
+
}
|
16931
|
+
if (this.customContent instanceof HTMLElement) {
|
16932
|
+
wrapper.appendChild(this.customContent);
|
16933
|
+
}
|
16934
|
+
this.appendChild(wrapper);
|
16917
16935
|
}
|
16918
16936
|
setupIntersectionObserver() {
|
16919
16937
|
const options = {
|
@@ -16930,21 +16948,21 @@ if (typeof window !== 'undefined' && typeof window.customElements !== 'undefined
|
|
16930
16948
|
}, options);
|
16931
16949
|
this.observer.observe(this);
|
16932
16950
|
}
|
16951
|
+
handleClick() {
|
16952
|
+
this.registerEvent(RMN_SPOT_EVENT.CLICK);
|
16953
|
+
}
|
16933
16954
|
async registerEvent(event) {
|
16934
16955
|
var _a, _b;
|
16935
16956
|
if (!this.data)
|
16936
16957
|
return;
|
16937
16958
|
const shouldRedirectOnClick = this.getAttribute(ENUM_SPOT_ELEMENT_ATTRIBUTE.REDIRECT_ON_CLICK) === 'true';
|
16938
|
-
const
|
16959
|
+
const eventUrl = (_b = (_a = this.data.events.find((e) => e.event === event)) === null || _a === void 0 ? void 0 : _a.url) !== null && _b !== void 0 ? _b : '';
|
16939
16960
|
try {
|
16940
16961
|
const options = {
|
16941
16962
|
method: 'POST',
|
16942
|
-
redirect: 'manual',
|
16963
|
+
redirect: event === RMN_SPOT_EVENT.CLICK && shouldRedirectOnClick ? 'follow' : 'manual',
|
16943
16964
|
};
|
16944
|
-
|
16945
|
-
options.redirect = 'follow';
|
16946
|
-
}
|
16947
|
-
const normalizedUrl = this.normalizeUrl(url);
|
16965
|
+
const normalizedUrl = this.normalizeUrl(eventUrl);
|
16948
16966
|
const response = await fetch(normalizedUrl, options);
|
16949
16967
|
if (response.ok && event === RMN_SPOT_EVENT.CLICK && shouldRedirectOnClick) {
|
16950
16968
|
window.location.href = this.getRedirectUrlFromPayload(normalizedUrl);
|
@@ -16961,16 +16979,13 @@ if (typeof window !== 'undefined' && typeof window.customElements !== 'undefined
|
|
16961
16979
|
return url.replace(/https?:\/\/[^/]+\/[^?]+/, `${rmnUrl}`);
|
16962
16980
|
}
|
16963
16981
|
getRedirectUrlFromPayload(url) {
|
16964
|
-
var _a;
|
16982
|
+
var _a, _b;
|
16965
16983
|
const base64String = (_a = new URL(url).searchParams.get('e')) !== null && _a !== void 0 ? _a : '';
|
16966
16984
|
try {
|
16967
|
-
const
|
16968
|
-
|
16969
|
-
return obj.ur;
|
16970
|
-
}
|
16971
|
-
return '';
|
16985
|
+
const data = JSON.parse(atob(base64String));
|
16986
|
+
return (_b = data.ur) !== null && _b !== void 0 ? _b : '';
|
16972
16987
|
}
|
16973
|
-
catch (
|
16988
|
+
catch (_c) {
|
16974
16989
|
return '';
|
16975
16990
|
}
|
16976
16991
|
}
|
@@ -16991,7 +17006,7 @@ class SpotHtmlService {
|
|
16991
17006
|
* @param {ISpot} spot - The spot data.
|
16992
17007
|
* @param {ICreateSpotElementConfig} config - The configuration object.
|
16993
17008
|
* @param {ICreateSpotElementConfig.fluid} config.fluid - If the spot should be fluid or not.
|
16994
|
-
* @param {ICreateSpotElementConfig.
|
17009
|
+
* @param {ICreateSpotElementConfig.customContent} config.customContent - Use a custom html element/string.
|
16995
17010
|
* @param {ICreateSpotElementConfig.redirectOnClick} config.redirectOnClick - If the spot should redirect on click.
|
16996
17011
|
*
|
16997
17012
|
* @return {HTMLElement | null} - The spot html element or null if the browser environment is not available.
|
@@ -17010,8 +17025,9 @@ class SpotHtmlService {
|
|
17010
17025
|
element.setAttribute(ENUM_SPOT_ELEMENT_ATTRIBUTE.REDIRECT_ON_CLICK, shouldRedirectOnClick.toString());
|
17011
17026
|
// Share the spot data with the element
|
17012
17027
|
element.data = spot;
|
17013
|
-
|
17014
|
-
|
17028
|
+
// Set custom content
|
17029
|
+
if (config === null || config === void 0 ? void 0 : config.customContent) {
|
17030
|
+
element.customContent = config.customContent;
|
17015
17031
|
}
|
17016
17032
|
return element;
|
17017
17033
|
}
|
@@ -17095,7 +17111,7 @@ class LiquidCommerceRmnClient {
|
|
17095
17111
|
* @param {ISpot} spot - The spot data.
|
17096
17112
|
* @param {ICreateSpotElementConfig} config - The configuration object.
|
17097
17113
|
* @param {ICreateSpotElementConfig.fluid} config.fluid - If the spot should be fluid or not.
|
17098
|
-
* @param {ICreateSpotElementConfig.
|
17114
|
+
* @param {ICreateSpotElementConfig.customContent} config.customContent - Use a custom html element/string.
|
17099
17115
|
* @param {ICreateSpotElementConfig.redirectOnClick} config.redirectOnClick - If the spot should redirect on click.
|
17100
17116
|
*
|
17101
17117
|
* @return {HTMLElement | null} - The spot html element or null if the browser environment is not available.
|
@@ -17127,7 +17143,7 @@ async function RmnClient(apiKey, config) {
|
|
17127
17143
|
* @param {ISpot} spot - The spot data.
|
17128
17144
|
* @param {ICreateSpotElementConfig} config - The configuration object.
|
17129
17145
|
* @param {ICreateSpotElementConfig.fluid} config.fluid - If the spot should be fluid or not.
|
17130
|
-
* @param {ICreateSpotElementConfig.
|
17146
|
+
* @param {ICreateSpotElementConfig.customContent} config.customContent - Use a custom html element/string.
|
17131
17147
|
* @param {ICreateSpotElementConfig.redirectOnClick} config.redirectOnClick - If the spot should redirect on click.
|
17132
17148
|
*
|
17133
17149
|
* @return {HTMLElement | null} - The spot html element or null if the browser environment is not available.
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import type { ISpot } from 'types';
|
2
2
|
export interface ICustomSpotElement extends HTMLElement {
|
3
3
|
data?: ISpot;
|
4
|
-
|
4
|
+
customContent?: HTMLElement | string;
|
5
5
|
}
|
6
6
|
declare let SpotElement: new () => HTMLElement;
|
7
7
|
export { SpotElement };
|
@@ -1,4 +1,5 @@
|
|
1
|
-
export declare const SPOT_ELEMENT_SHADOW_ROOT: (width: number, height: number,
|
1
|
+
export declare const SPOT_ELEMENT_SHADOW_ROOT: (width: number, height: number, hasCustomContent: boolean) => {
|
2
2
|
style: HTMLStyleElement;
|
3
3
|
wrapper: HTMLDivElement;
|
4
|
+
slot: HTMLSlotElement;
|
4
5
|
};
|
@@ -9,7 +9,7 @@ export declare class SpotHtmlService implements ISpotHtmlService {
|
|
9
9
|
* @param {ISpot} spot - The spot data.
|
10
10
|
* @param {ICreateSpotElementConfig} config - The configuration object.
|
11
11
|
* @param {ICreateSpotElementConfig.fluid} config.fluid - If the spot should be fluid or not.
|
12
|
-
* @param {ICreateSpotElementConfig.
|
12
|
+
* @param {ICreateSpotElementConfig.customContent} config.customContent - Use a custom html element/string.
|
13
13
|
* @param {ICreateSpotElementConfig.redirectOnClick} config.redirectOnClick - If the spot should redirect on click.
|
14
14
|
*
|
15
15
|
* @return {HTMLElement | null} - The spot html element or null if the browser environment is not available.
|
@@ -2,6 +2,7 @@ import type { RMN_ENV } from './../../enums';
|
|
2
2
|
import type { RMN_SPOT_EVENT, RMN_SPOT_TYPE } from './spot.enum';
|
3
3
|
import type { RmnFilterType, RmnSpotType, SpotIdentifierType, SpotVariantType } from './spot.type';
|
4
4
|
export interface ISpotSelectionParams {
|
5
|
+
url?: string;
|
5
6
|
spots: RmnSpotType[];
|
6
7
|
filter?: Partial<RmnFilterType>;
|
7
8
|
}
|
@@ -32,7 +33,7 @@ export interface ISpot {
|
|
32
33
|
}
|
33
34
|
export interface ICreateSpotElementConfig {
|
34
35
|
fluid?: boolean;
|
35
|
-
|
36
|
+
customContent?: HTMLElement | string;
|
36
37
|
redirectOnClick?: boolean;
|
37
38
|
}
|
38
39
|
export type ISpots = Record<SpotIdentifierType, ISpot[]>;
|
@@ -23,7 +23,7 @@ export declare class LiquidCommerceRmnClient implements IRmnClient {
|
|
23
23
|
* @param {ISpot} spot - The spot data.
|
24
24
|
* @param {ICreateSpotElementConfig} config - The configuration object.
|
25
25
|
* @param {ICreateSpotElementConfig.fluid} config.fluid - If the spot should be fluid or not.
|
26
|
-
* @param {ICreateSpotElementConfig.
|
26
|
+
* @param {ICreateSpotElementConfig.customContent} config.customContent - Use a custom html element/string.
|
27
27
|
* @param {ICreateSpotElementConfig.redirectOnClick} config.redirectOnClick - If the spot should redirect on click.
|
28
28
|
*
|
29
29
|
* @return {HTMLElement | null} - The spot html element or null if the browser environment is not available.
|
@@ -49,7 +49,7 @@ declare function RmnClient(apiKey: string, config: IRmnConfig): Promise<IRmnClie
|
|
49
49
|
* @param {ISpot} spot - The spot data.
|
50
50
|
* @param {ICreateSpotElementConfig} config - The configuration object.
|
51
51
|
* @param {ICreateSpotElementConfig.fluid} config.fluid - If the spot should be fluid or not.
|
52
|
-
* @param {ICreateSpotElementConfig.
|
52
|
+
* @param {ICreateSpotElementConfig.customContent} config.customContent - Use a custom html element/string.
|
53
53
|
* @param {ICreateSpotElementConfig.redirectOnClick} config.redirectOnClick - If the spot should redirect on click.
|
54
54
|
*
|
55
55
|
* @return {HTMLElement | null} - The spot html element or null if the browser environment is not available.
|
package/package.json
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
"name": "@liquidcommercedev/rmn-sdk",
|
3
3
|
"description": "LiquidCommerce RMN SDK",
|
4
4
|
"author": "LiquidCommerce Tech",
|
5
|
-
"version": "1.4.
|
5
|
+
"version": "1.4.4-beta.2",
|
6
6
|
"homepage": "https://docs.liquidcommerce.co/rmn-sdk",
|
7
7
|
"main": "./dist/index.cjs",
|
8
8
|
"module": "./dist/index.esm.js",
|