@surfside/ads 2.0.0 → 3.6.0-0652b02f.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 +15 -69
- package/lib/cjs/BuildInfo.js +9 -0
- package/lib/cjs/BuildInfo.js.map +1 -0
- package/lib/cjs/Constants.js +5 -0
- package/lib/cjs/Constants.js.map +1 -0
- package/lib/cjs/Init.js +130 -0
- package/lib/cjs/Init.js.map +1 -0
- package/lib/cjs/components/Banner.js +136 -0
- package/lib/cjs/components/Banner.js.map +1 -0
- package/lib/cjs/components/Card.js +170 -0
- package/lib/cjs/components/Card.js.map +1 -0
- package/lib/cjs/components/Carousel.js +249 -0
- package/lib/cjs/components/Carousel.js.map +1 -0
- package/lib/cjs/components/Creative.js +285 -0
- package/lib/cjs/components/Creative.js.map +1 -0
- package/lib/cjs/components/Dynamic.js +310 -0
- package/lib/cjs/components/Dynamic.js.map +1 -0
- package/lib/cjs/components/SimpleCreative.js +81 -0
- package/lib/cjs/components/SimpleCreative.js.map +1 -0
- package/lib/cjs/components/Video.js +144 -0
- package/lib/cjs/components/Video.js.map +1 -0
- package/lib/cjs/demo/test.js +7 -0
- package/lib/cjs/demo/test.js.map +1 -0
- package/lib/cjs/index.module.js +107 -0
- package/lib/cjs/index.module.js.map +1 -0
- package/lib/cjs/index.script.js +102 -0
- package/lib/cjs/index.script.js.map +1 -0
- package/lib/cjs/index.script.mock.js +154 -0
- package/lib/cjs/index.script.mock.js.map +1 -0
- package/lib/cjs/service/Init.js +3 -0
- package/lib/cjs/service/Init.js.map +1 -0
- package/lib/cjs/util/Attributes.js +93 -0
- package/lib/cjs/util/Attributes.js.map +1 -0
- package/lib/cjs/util/Types.js +3 -0
- package/lib/cjs/util/Types.js.map +1 -0
- package/lib/esm/BuildInfo.js +6 -0
- package/lib/esm/BuildInfo.js.map +1 -0
- package/lib/esm/Constants.js +2 -0
- package/lib/esm/Constants.js.map +1 -0
- package/lib/esm/Init.js +92 -0
- package/lib/esm/Init.js.map +1 -0
- package/lib/esm/components/Banner.js +132 -0
- package/lib/esm/components/Banner.js.map +1 -0
- package/lib/esm/components/Card.js +166 -0
- package/lib/esm/components/Card.js.map +1 -0
- package/lib/esm/components/Carousel.js +245 -0
- package/lib/esm/components/Carousel.js.map +1 -0
- package/lib/esm/components/Creative.js +280 -0
- package/lib/esm/components/Creative.js.map +1 -0
- package/lib/esm/components/Dynamic.js +306 -0
- package/lib/esm/components/Dynamic.js.map +1 -0
- package/lib/esm/components/SimpleCreative.js +75 -0
- package/lib/esm/components/SimpleCreative.js.map +1 -0
- package/lib/esm/components/Video.js +140 -0
- package/lib/esm/components/Video.js.map +1 -0
- package/lib/esm/demo/test.js +5 -0
- package/lib/esm/demo/test.js.map +1 -0
- package/lib/esm/index.module.js +67 -0
- package/lib/esm/index.module.js.map +1 -0
- package/lib/esm/index.script.js +100 -0
- package/lib/esm/index.script.js.map +1 -0
- package/lib/esm/index.script.mock.js +152 -0
- package/lib/esm/index.script.mock.js.map +1 -0
- package/lib/esm/service/Init.js +2 -0
- package/lib/esm/service/Init.js.map +1 -0
- package/lib/esm/util/Attributes.js +81 -0
- package/lib/esm/util/Attributes.js.map +1 -0
- package/lib/esm/util/Types.js +2 -0
- package/lib/esm/util/Types.js.map +1 -0
- package/lib/types/BuildInfo.d.ts +5 -0
- package/lib/types/Constants.d.ts +1 -0
- package/lib/types/Init.d.ts +31 -0
- package/lib/types/components/Banner.d.ts +17 -0
- package/lib/types/components/Card.d.ts +18 -0
- package/lib/types/components/Carousel.d.ts +32 -0
- package/lib/types/components/Creative.d.ts +84 -0
- package/lib/types/components/Dynamic.d.ts +24 -0
- package/lib/types/components/SimpleCreative.d.ts +20 -0
- package/lib/types/components/Video.d.ts +23 -0
- package/lib/types/demo/test.d.ts +1 -0
- package/lib/types/index.module.d.ts +12 -0
- package/lib/types/index.script.d.ts +1 -0
- package/lib/types/index.script.mock.d.ts +1 -0
- package/lib/types/service/Init.d.ts +1 -0
- package/lib/types/util/Attributes.d.ts +24 -0
- package/lib/types/util/Types.d.ts +3 -0
- package/package.json +42 -73
- package/lib/index.js +0 -2
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { CancellationToken, WrapValue } from '@surfside/ads-core';
|
|
2
|
+
import { SimpleCreativeComponent } from './SimpleCreative';
|
|
3
|
+
import { DEBOUNCE_THRESHOLD } from './Creative';
|
|
4
|
+
export class SurfsideBanner extends SimpleCreativeComponent {
|
|
5
|
+
_cancellationToken = new CancellationToken();
|
|
6
|
+
_bounce;
|
|
7
|
+
static get observedAttributes() {
|
|
8
|
+
return SimpleCreativeComponent.observedSimpleAttributes;
|
|
9
|
+
}
|
|
10
|
+
constructor(initApi, getUserId, logger) {
|
|
11
|
+
super(initApi, getUserId, logger);
|
|
12
|
+
logger?.info('Building SurfsideBanner', this.instanceId);
|
|
13
|
+
}
|
|
14
|
+
getComponentName() {
|
|
15
|
+
return 'SurfsideBanner';
|
|
16
|
+
}
|
|
17
|
+
async attributeChangedCallback(name, oldValue, newValue) {
|
|
18
|
+
const log = this.log?.with('attributeChangedCallback');
|
|
19
|
+
log?.info('Attribute changed', name, oldValue, newValue);
|
|
20
|
+
await this.handleSimpleAttributeChange(name, oldValue, newValue, log);
|
|
21
|
+
const totem = crypto.randomUUID();
|
|
22
|
+
this.totem = totem;
|
|
23
|
+
log?.debug(name, 'totem', totem);
|
|
24
|
+
if (!this.attributesLoaded()) {
|
|
25
|
+
log?.debug('Attributes not ready yet...');
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
await this.lazyLoadApi();
|
|
29
|
+
if (this.totem !== totem) {
|
|
30
|
+
log?.debug('Totem changed. Deferring rendering of banner until last attribute changed', totem, this.totem);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
log?.debug(`Rendering banner upon [${name}] changed!`);
|
|
34
|
+
if (this.isConnected) {
|
|
35
|
+
if (this._bounce !== undefined) {
|
|
36
|
+
globalThis.clearTimeout(this._bounce);
|
|
37
|
+
}
|
|
38
|
+
this._bounce = globalThis.setTimeout(() => this.render(), DEBOUNCE_THRESHOLD);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async connectedCallback() {
|
|
42
|
+
super.connectedCallback();
|
|
43
|
+
this.log?.info('Banner component callback: connected');
|
|
44
|
+
this.readSimpleAttributes();
|
|
45
|
+
await this.initApi();
|
|
46
|
+
const totem = crypto.randomUUID();
|
|
47
|
+
this.totem = totem;
|
|
48
|
+
if (this.attributesLoaded()) {
|
|
49
|
+
await this.lazyLoadApi();
|
|
50
|
+
if (this.totem !== totem) {
|
|
51
|
+
this.log?.debug('Attributes changed after connectedCallback, waiting to render');
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
this.log?.debug('Rendering upon connectedCallback');
|
|
55
|
+
await this.render();
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
this.log?.warn('ConnectedCallback called before attributes were all ready.');
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
adoptedCallback() {
|
|
62
|
+
this.log?.info('Banner component callback: adopted');
|
|
63
|
+
}
|
|
64
|
+
disconnectedCallback() {
|
|
65
|
+
super.disconnectedCallback();
|
|
66
|
+
this._cancellationToken.cancel();
|
|
67
|
+
if (this._bounce !== undefined) {
|
|
68
|
+
globalThis.clearTimeout(this._bounce);
|
|
69
|
+
this._bounce = undefined;
|
|
70
|
+
}
|
|
71
|
+
this.log?.info('Banner component callback: disconnected', this.instanceId);
|
|
72
|
+
}
|
|
73
|
+
connectedMoveCallback() {
|
|
74
|
+
this.log?.info('Banner component callback: moved', this.instanceId);
|
|
75
|
+
}
|
|
76
|
+
async render() {
|
|
77
|
+
const log = this.log?.with('SurfsideBanner', { zoneId: this.zoneId });
|
|
78
|
+
log?.info('rendering banner web component', this.instanceId);
|
|
79
|
+
log?.debug('width', this.width, 'height', this.height);
|
|
80
|
+
const stopTimer = log?.time?.('render banner');
|
|
81
|
+
this._cancellationToken.cancel();
|
|
82
|
+
this.clearReauction();
|
|
83
|
+
const token = new CancellationToken();
|
|
84
|
+
this._cancellationToken = token;
|
|
85
|
+
const { requestBids, startRequest, buildBannerResponse, renderBanner } = this.api;
|
|
86
|
+
log?.debug('Category:', this.category);
|
|
87
|
+
const response = await requestBids(startRequest(this.zoneId)
|
|
88
|
+
.withSurfCategory(this.category)
|
|
89
|
+
.withKeywords(this.keywords)
|
|
90
|
+
.withImp(this.zoneId)
|
|
91
|
+
.andBanner(this.width, this.height)
|
|
92
|
+
.build());
|
|
93
|
+
if (!response.ok) {
|
|
94
|
+
log?.warn('Failed to get bid response! Got ', response.error);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const bidRes = WrapValue(response.value.seatbid?.[0]?.bid[0]);
|
|
98
|
+
if (!bidRes.ok) {
|
|
99
|
+
log?.warn('Bid response had no bid!', bidRes.error);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const bannerResponse = buildBannerResponse(bidRes.value);
|
|
103
|
+
if (!bannerResponse.ok) {
|
|
104
|
+
log?.warn('Banner failed to build response', bannerResponse.error);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
const bannerRes = renderBanner(bannerResponse.value);
|
|
108
|
+
if (!bannerRes.ok) {
|
|
109
|
+
log?.warn('Failed to render banner', bannerRes.error);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const element = bannerRes.value;
|
|
113
|
+
if (!token.cancelled) {
|
|
114
|
+
this.shadow.innerHTML = '';
|
|
115
|
+
this.shadow.appendChild(element);
|
|
116
|
+
element.classList.add(`surf-zone-${this.zoneId}`);
|
|
117
|
+
stopTimer?.();
|
|
118
|
+
this.restartEndToEndTimer?.();
|
|
119
|
+
/* Reauction */
|
|
120
|
+
log?.debug('Settings ', this.api.configuration.settings);
|
|
121
|
+
if (this.api.configuration.settings.reauctionEnabled && bidRes.value.ext?.takeover !== true) {
|
|
122
|
+
const interval = Math.max(this.api.configuration.settings.reauctionIntervalMs, 10000);
|
|
123
|
+
log?.info('Setting up re-auction in ' + interval + 'ms');
|
|
124
|
+
this.scheduleReauction(() => this.render(), interval);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
log?.info('Not setting up reauction');
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=Banner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Banner.js","sourceRoot":"../@surfside-ads/","sources":["components/Banner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { CancellationToken, ConsumeNAsync, Err, InvalidRecommenderTypeError, TryDoFlat } from '@surfside/ads-core';
|
|
2
|
+
import { CreativeComponent, DEBOUNCE_THRESHOLD, ProductFeedStrategy, RecommenderTypeInputs } from './Creative';
|
|
3
|
+
export class SurfsideProductCard extends CreativeComponent {
|
|
4
|
+
_cancellationToken = new CancellationToken();
|
|
5
|
+
recommend = 'top-products';
|
|
6
|
+
strategy = ProductFeedStrategy.Hybrid;
|
|
7
|
+
_bounce;
|
|
8
|
+
static get observedAttributes() {
|
|
9
|
+
return [
|
|
10
|
+
...CreativeComponent.observedBaseAttributes,
|
|
11
|
+
'recommend',
|
|
12
|
+
'strategy'
|
|
13
|
+
];
|
|
14
|
+
}
|
|
15
|
+
getComponentName() {
|
|
16
|
+
return 'SurfsideProductCard';
|
|
17
|
+
}
|
|
18
|
+
async attributeChangedCallback(name, oldValue, newValue) {
|
|
19
|
+
const log = this.log?.with('attributeChangedCallback');
|
|
20
|
+
log?.info('detected attribute change');
|
|
21
|
+
log?.debug(name, oldValue, newValue);
|
|
22
|
+
switch (name) {
|
|
23
|
+
case 'strategy': {
|
|
24
|
+
const strategy = newValue?.toLowerCase();
|
|
25
|
+
switch (strategy) {
|
|
26
|
+
case ProductFeedStrategy.Sponsored:
|
|
27
|
+
case ProductFeedStrategy.Hybrid:
|
|
28
|
+
case ProductFeedStrategy.Recommended:
|
|
29
|
+
this.strategy = strategy;
|
|
30
|
+
break;
|
|
31
|
+
default:
|
|
32
|
+
log?.warn('Unrecognized or null strategy:', newValue);
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
case 'recommend': {
|
|
38
|
+
const recommend = newValue?.toLowerCase();
|
|
39
|
+
switch (recommend) {
|
|
40
|
+
case RecommenderTypeInputs.TopProducts:
|
|
41
|
+
this.recommend = 'top-products';
|
|
42
|
+
break;
|
|
43
|
+
case RecommenderTypeInputs.ForYou:
|
|
44
|
+
this.recommend = 'for-you';
|
|
45
|
+
break;
|
|
46
|
+
case RecommenderTypeInputs.PastPurchases:
|
|
47
|
+
case RecommenderTypeInputs.BuyAgain:
|
|
48
|
+
this.recommend = 'past-purchases';
|
|
49
|
+
break;
|
|
50
|
+
default:
|
|
51
|
+
log?.warn('Unrecognized or null recommender type:', newValue);
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
default: {
|
|
57
|
+
const baseName = name;
|
|
58
|
+
if (CreativeComponent.observedBaseAttributes.includes(baseName)) {
|
|
59
|
+
await super.baseAttributeChangedCallback(baseName, oldValue, newValue, log);
|
|
60
|
+
}
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const totem = crypto.randomUUID();
|
|
65
|
+
this.totem = totem;
|
|
66
|
+
if (!this.attributesLoaded()) {
|
|
67
|
+
log?.warn('Attributes not ready yet...', this.getBaseAttributeValues());
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
log?.debug('Attributes ready!');
|
|
72
|
+
}
|
|
73
|
+
await this.lazyLoadApi();
|
|
74
|
+
if (totem !== this.totem) {
|
|
75
|
+
log?.debug('Totem changed between attribute callbacks. Deferring product card render until last attribute');
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (this._bounce !== undefined) {
|
|
79
|
+
globalThis.clearTimeout(this._bounce);
|
|
80
|
+
}
|
|
81
|
+
this._bounce = globalThis.setTimeout(() => this.render(), DEBOUNCE_THRESHOLD);
|
|
82
|
+
}
|
|
83
|
+
async connectedCallback() {
|
|
84
|
+
super.connectedCallback();
|
|
85
|
+
const log = this.log?.with('connectedCallback');
|
|
86
|
+
log?.info('connectedCallback');
|
|
87
|
+
await this.initApi();
|
|
88
|
+
const totem = crypto.randomUUID();
|
|
89
|
+
this.totem = totem;
|
|
90
|
+
if (this.attributesLoaded()) {
|
|
91
|
+
await this.lazyLoadApi();
|
|
92
|
+
if (this.totem !== totem) {
|
|
93
|
+
this.log?.debug('Totem changed during connectedCallback. Waiting for attribute callbacks to render');
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (this.isConnected) {
|
|
97
|
+
await this.render();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
disconnectedCallback() {
|
|
102
|
+
super.disconnectedCallback();
|
|
103
|
+
this._cancellationToken.cancel();
|
|
104
|
+
if (this._bounce !== undefined) {
|
|
105
|
+
globalThis.clearTimeout(this._bounce);
|
|
106
|
+
this._bounce = undefined;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
async render() {
|
|
110
|
+
const log = this.log?.with('SurfsideProductCard', { zoneId: this.zoneId });
|
|
111
|
+
log?.info('Rendering carousel', this.api);
|
|
112
|
+
const stopTimer = log?.time?.('render product card');
|
|
113
|
+
this._cancellationToken.cancel();
|
|
114
|
+
const token = new CancellationToken();
|
|
115
|
+
this._cancellationToken = token;
|
|
116
|
+
const { startRequest, defaultNative, buildHybridCarousel, buildSponsoredCarousel, buildRecommendedCarousel, renderProductCard } = this.api;
|
|
117
|
+
const native = defaultNative()
|
|
118
|
+
.withManyMetaProducts(6, 80, false)
|
|
119
|
+
.withMetaBrand(80, false)
|
|
120
|
+
.build();
|
|
121
|
+
const carousel = TryDoFlat(() => {
|
|
122
|
+
const request = startRequest(this.zoneId)
|
|
123
|
+
.withSurfCategory(this.category)
|
|
124
|
+
.withKeywords(this.keywords)
|
|
125
|
+
.withNative(native)
|
|
126
|
+
.build();
|
|
127
|
+
switch (this.strategy) {
|
|
128
|
+
case ProductFeedStrategy.Hybrid:
|
|
129
|
+
return buildHybridCarousel({
|
|
130
|
+
type: this.recommend,
|
|
131
|
+
}, request);
|
|
132
|
+
case ProductFeedStrategy.Sponsored:
|
|
133
|
+
return buildSponsoredCarousel(request);
|
|
134
|
+
case ProductFeedStrategy.Recommended:
|
|
135
|
+
return buildRecommendedCarousel({
|
|
136
|
+
type: this.recommend
|
|
137
|
+
}, this.category?.[0]);
|
|
138
|
+
default:
|
|
139
|
+
return Err(new InvalidRecommenderTypeError(this.strategy));
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
if (!carousel.ok) {
|
|
143
|
+
log?.error(carousel.error);
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const [[builtProductCard]] = await ConsumeNAsync(carousel.value.getProduct(), 1);
|
|
147
|
+
if (this._cancellationToken.cancelled) {
|
|
148
|
+
log?.debug('Render cancelled');
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (builtProductCard === undefined) {
|
|
152
|
+
log?.warn('Built product card was undefined. No inventory available. Check the rest of the logs');
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const container = renderProductCard(builtProductCard);
|
|
156
|
+
if (!container.ok) {
|
|
157
|
+
log?.error('Failed to render product card', container.error);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
stopTimer?.();
|
|
161
|
+
this.shadow.innerHTML = '';
|
|
162
|
+
container.value.classList.add(`surf-zone-${this.zoneId}`);
|
|
163
|
+
this.shadow.appendChild(container.value);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=Card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Card.js","sourceRoot":"../@surfside-ads/","sources":["components/Card.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iBAAiB,EACjB,aAAa,EAEb,GAAG,EACH,2BAA2B,EAC3B,SAAS,EAEZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAGH,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACxB,MAAM,YAAY,CAAC;AAOpB,MAAM,OAAO,mBAAoB,SAAQ,iBAAiB;IAC9C,kBAAkB,GAAsB,IAAI,iBAAiB,EAAE,CAAC;IAE9D,SAAS,GAAoB,cAAc,CAAC;IAC5C,QAAQ,GAAW,mBAAmB,CAAC,MAAM,CAAC;IAEhD,OAAO,CAAwB;IAEhC,MAAM,KAAK,kBAAkB;QAChC,OAAO;YACH,GAAG,iBAAiB,CAAC,sBAAsB;YAC3C,WAAW;YACX,UAAU;SACb,CAAC;IACN,CAAC;IAES,gBAAgB;QACtB,OAAO,qBAAqB,CAAC;IACjC,CAAC;IAEM,KAAK,CAAC,wBAAwB,CACjC,IAAY,EACZ,QAAuB,EACvB,QAAuB;QAEvB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACvD,GAAG,EAAE,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACvC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAErC,QAAQ,IAAI,EAAE,CAAC;YACX,KAAK,UAAU,CAAC,CAAC,CAAC;gBACd,MAAM,QAAQ,GAAG,QAAQ,EAAE,WAAW,EAAE,CAAC;gBACzC,QAAQ,QAAQ,EAAE,CAAC;oBACf,KAAK,mBAAmB,CAAC,SAAS,CAAC;oBACnC,KAAK,mBAAmB,CAAC,MAAM,CAAC;oBAChC,KAAK,mBAAmB,CAAC,WAAW;wBAChC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;wBACzB,MAAM;oBACV;wBACI,GAAG,EAAE,IAAI,CAAC,gCAAgC,EAAE,QAAQ,CAAC,CAAC;wBACtD,MAAM;gBACd,CAAC;gBACD,MAAM;YACV,CAAC;YACD,KAAK,WAAW,CAAC,CAAC,CAAC;gBACf,MAAM,SAAS,GAAG,QAAQ,EAAE,WAAW,EAAE,CAAC;gBAC1C,QAAQ,SAAS,EAAE,CAAC;oBAChB,KAAK,qBAAqB,CAAC,WAAW;wBAClC,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC;wBAChC,MAAM;oBACV,KAAK,qBAAqB,CAAC,MAAM;wBAC7B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;wBAC3B,MAAM;oBACV,KAAK,qBAAqB,CAAC,aAAa,CAAC;oBACzC,KAAK,qBAAqB,CAAC,QAAQ;wBAC/B,IAAI,CAAC,SAAS,GAAG,gBAAgB,CAAC;wBAClC,MAAM;oBACV;wBACI,GAAG,EAAE,IAAI,CAAC,wCAAwC,EAAE,QAAQ,CAAC,CAAC;wBAC9D,MAAM;gBACd,CAAC;gBACD,MAAM;YACV,CAAC;YACD,OAAO,CAAC,CAAC,CAAC;gBACN,MAAM,QAAQ,GAAG,IAA0B,CAAC;gBAC5C,IAAI,iBAAiB,CAAC,sBAAsB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC9D,MAAM,KAAK,CAAC,4BAA4B,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;gBAChF,CAAC;gBACD,MAAM;YACV,CAAC;QACL,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;YAC3B,GAAG,EAAE,IAAI,CAAC,6BAA6B,EAAE,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC;YACxE,OAAO;QACX,CAAC;aAAM,CAAC;YACJ,GAAG,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YACvB,GAAG,EAAE,KAAK,CAAC,+FAA+F,CAAC,CAAC;YAC5G,OAAO;QACX,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC7B,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,UAAU,CAChC,GAAG,EAAE,CAAE,IAAuC,CAAC,MAAM,EAAE,EACvD,kBAAkB,CACrB,CAAC;IAEN,CAAC;IAEM,KAAK,CAAC,iBAAiB;QAC1B,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAChD,GAAG,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC/B,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;YAC1B,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;gBACvB,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,mFAAmF,CAAC,CAAC;gBACrG,OAAO;YACX,CAAC;YACD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACnB,MAAO,IAAuC,CAAC,MAAM,EAAE,CAAC;YAC5D,CAAC;QACL,CAAC;IACL,CAAC;IAEM,oBAAoB;QACvB,KAAK,CAAC,oBAAoB,EAAE,CAAC;QAC7B,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC7B,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QAC7B,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,MAAM;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,qBAAqB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3E,GAAG,EAAE,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,qBAAqB,CAAC,CAAC;QACrD,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACtC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAEhC,MAAM,EACF,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACxB,iBAAiB,EACpB,GAAG,IAAI,CAAC,GAAG,CAAC;QAEb,MAAM,MAAM,GAAG,aAAa,EAAE;aACzB,oBAAoB,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC;aAClC,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC;aACxB,KAAK,EAAE,CAAC;QAEb,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,EAAE;YAC5B,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;iBACpC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC;iBAC/B,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;iBAC3B,UAAU,CAAC,MAAM,CAAC;iBAClB,KAAK,EAAE,CAAC;YACb,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACpB,KAAK,mBAAmB,CAAC,MAAM;oBAC3B,OAAO,mBAAmB,CAAC;wBACvB,IAAI,EAAE,IAAI,CAAC,SAAS;qBACvB,EAAE,OAAO,CAAC,CAAC;gBAChB,KAAK,mBAAmB,CAAC,SAAS;oBAC9B,OAAO,sBAAsB,CAAC,OAAO,CAAC,CAAC;gBAC3C,KAAK,mBAAmB,CAAC,WAAW;oBAChC,OAAO,wBAAwB,CAAC;wBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS;qBACvB,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3B;oBACI,OAAO,GAAG,CAAC,IAAI,2BAA2B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YACnE,CAAC;QACL,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACf,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC3B,OAAO;QACX,CAAC;QACD,MAAM,CAAC,CAAC,gBAAgB,CAAC,CAAC,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;QACjF,IAAI,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,CAAC;YACpC,GAAG,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAC;YAC/B,OAAO;QACX,CAAC;QAED,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACjC,GAAG,EAAE,IAAI,CAAC,sFAAsF,CAAC,CAAC;YAClG,OAAO;QACX,CAAC;QAED,MAAM,SAAS,GAAG,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;QACtD,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;YAChB,GAAG,EAAE,KAAK,CAAC,+BAA+B,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;YAC7D,OAAO;QACX,CAAC;QAED,SAAS,EAAE,EAAE,CAAC;QACd,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,EAAE,CAAC;QAC3B,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;CAEJ"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { CancellationToken, Err, InvalidRecommenderTypeError, TryDoFlat } from '@surfside/ads-core';
|
|
2
|
+
import { CreativeComponent, DEBOUNCE_THRESHOLD, ProductFeedStrategy, RecommenderTypeInputs } from './Creative';
|
|
3
|
+
import { IntValOrThrow } from './SimpleCreative';
|
|
4
|
+
import { DefaultMinCardWidth } from '../Constants';
|
|
5
|
+
export const NextType = {
|
|
6
|
+
Product: 'product',
|
|
7
|
+
Page: 'page'
|
|
8
|
+
};
|
|
9
|
+
export class SurfsideCarousel extends CreativeComponent {
|
|
10
|
+
_cancellationToken = new CancellationToken();
|
|
11
|
+
_renderDebounce;
|
|
12
|
+
maxItems;
|
|
13
|
+
cardMinWidth = DefaultMinCardWidth;
|
|
14
|
+
cardMaxWidth;
|
|
15
|
+
strategy = ProductFeedStrategy.Hybrid;
|
|
16
|
+
recommend = 'top-products';
|
|
17
|
+
nextType = NextType.Page;
|
|
18
|
+
static get observedAttributes() {
|
|
19
|
+
return [
|
|
20
|
+
...CreativeComponent.observedBaseAttributes,
|
|
21
|
+
'max-items',
|
|
22
|
+
'card-min-width',
|
|
23
|
+
'card-max-width',
|
|
24
|
+
'strategy',
|
|
25
|
+
'recommend',
|
|
26
|
+
'next-type'
|
|
27
|
+
];
|
|
28
|
+
}
|
|
29
|
+
constructor(initApi, getUserId, logger) {
|
|
30
|
+
logger?.info('Building carousel');
|
|
31
|
+
super(initApi, getUserId, logger);
|
|
32
|
+
}
|
|
33
|
+
getComponentName() {
|
|
34
|
+
return 'SurfsideCarousel';
|
|
35
|
+
}
|
|
36
|
+
async attributeChangedCallback(name, oldValue, newValue) {
|
|
37
|
+
const log = this.log?.with('attributeChangedCallback');
|
|
38
|
+
log?.info('Carousel attribute changed');
|
|
39
|
+
switch (name) {
|
|
40
|
+
case 'max-items': {
|
|
41
|
+
try {
|
|
42
|
+
this.maxItems = IntValOrThrow(this, 'max-items', newValue);
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
log?.warn('Failed to parse. Got', err);
|
|
46
|
+
}
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
case 'card-min-width': {
|
|
50
|
+
try {
|
|
51
|
+
this.cardMinWidth = IntValOrThrow(this, 'card-min-width', newValue);
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
log?.warn('Failed to parse. Got', err);
|
|
55
|
+
}
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
case 'card-max-width': {
|
|
59
|
+
try {
|
|
60
|
+
this.cardMaxWidth = IntValOrThrow(this, 'card-max-width', newValue);
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
log?.warn('Failed to parse. Got', err);
|
|
64
|
+
}
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
case 'strategy': {
|
|
68
|
+
const strategy = newValue?.toLowerCase();
|
|
69
|
+
switch (strategy) {
|
|
70
|
+
case ProductFeedStrategy.Sponsored:
|
|
71
|
+
case ProductFeedStrategy.Hybrid:
|
|
72
|
+
case ProductFeedStrategy.Recommended:
|
|
73
|
+
this.strategy = strategy;
|
|
74
|
+
break;
|
|
75
|
+
default:
|
|
76
|
+
log?.warn('Unrecognized or null strategy:', newValue);
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
case 'recommend': {
|
|
82
|
+
const recommend = newValue?.toLowerCase();
|
|
83
|
+
switch (recommend) {
|
|
84
|
+
case RecommenderTypeInputs.TopProducts:
|
|
85
|
+
this.recommend = 'top-products';
|
|
86
|
+
break;
|
|
87
|
+
case RecommenderTypeInputs.ForYou:
|
|
88
|
+
this.recommend = 'for-you';
|
|
89
|
+
break;
|
|
90
|
+
case RecommenderTypeInputs.PastPurchases:
|
|
91
|
+
case RecommenderTypeInputs.BuyAgain:
|
|
92
|
+
this.recommend = 'past-purchases';
|
|
93
|
+
break;
|
|
94
|
+
default:
|
|
95
|
+
log?.warn('Unrecognized or null recommender type:', newValue);
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
case 'next-type': {
|
|
101
|
+
const nextType = newValue?.toLowerCase();
|
|
102
|
+
switch (nextType) {
|
|
103
|
+
case NextType.Page:
|
|
104
|
+
case NextType.Product:
|
|
105
|
+
this.nextType = nextType;
|
|
106
|
+
break;
|
|
107
|
+
default:
|
|
108
|
+
log?.warn('Unrecognized or null next-type:', newValue);
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
default: {
|
|
114
|
+
const baseName = name;
|
|
115
|
+
if (CreativeComponent.observedBaseAttributes.includes(baseName)) {
|
|
116
|
+
await super.baseAttributeChangedCallback(baseName, oldValue, newValue, log);
|
|
117
|
+
}
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const totem = crypto.randomUUID();
|
|
122
|
+
this.totem = totem;
|
|
123
|
+
log?.debug(name, 'totem', totem);
|
|
124
|
+
if (!this.attributesLoaded()) {
|
|
125
|
+
log?.debug('Attributes not ready yet...', this.accountId);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
log?.debug('Attributes ready!');
|
|
130
|
+
}
|
|
131
|
+
await this.lazyLoadApi();
|
|
132
|
+
if (this.totem !== totem) {
|
|
133
|
+
log?.debug('Totem changed. Deferring rendering of carousel until last attribute changed', totem, this.totem);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
if (this.isConnected) {
|
|
137
|
+
log?.debug(`Rendering carousel upon [${name}] changed`);
|
|
138
|
+
await this.render();
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
async connectedCallback() {
|
|
142
|
+
super.connectedCallback();
|
|
143
|
+
const log = this.log?.with('connectedCallback');
|
|
144
|
+
log?.info('connectedCallback');
|
|
145
|
+
super.readBaseAttributes();
|
|
146
|
+
await this.initApi();
|
|
147
|
+
const totem = crypto.randomUUID();
|
|
148
|
+
this.totem = totem;
|
|
149
|
+
if (this.attributesLoaded()) {
|
|
150
|
+
await this.lazyLoadApi();
|
|
151
|
+
if (this.totem !== totem) {
|
|
152
|
+
log?.debug('Attributes changed after connectedCallback, waiting to render');
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
log?.debug('Rendering upon connectedCallback');
|
|
156
|
+
await this.render();
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
this.log?.warn('ConnectedCallback called before attributes were all ready.');
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
disconnectedCallback() {
|
|
163
|
+
super.disconnectedCallback();
|
|
164
|
+
this._cancellationToken.cancel();
|
|
165
|
+
if (this._renderDebounce !== undefined) {
|
|
166
|
+
globalThis.clearTimeout(this._renderDebounce);
|
|
167
|
+
this._renderDebounce = undefined;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
async render() {
|
|
171
|
+
const log = this.log?.with('SurfsideCarousel', { zoneId: this.zoneId });
|
|
172
|
+
log?.info('Rendering carousel');
|
|
173
|
+
if (this._renderDebounce !== undefined) {
|
|
174
|
+
log?.debug('Debounce was not undefined');
|
|
175
|
+
globalThis.clearTimeout(this._renderDebounce);
|
|
176
|
+
}
|
|
177
|
+
this._renderDebounce = globalThis.setTimeout(async () => {
|
|
178
|
+
log?.info('Rendering carousel', this.api);
|
|
179
|
+
const stopTimer = log?.time?.('render carousel');
|
|
180
|
+
this._cancellationToken.cancel();
|
|
181
|
+
const token = new CancellationToken();
|
|
182
|
+
this._cancellationToken = token;
|
|
183
|
+
const { startRequest, defaultNative, buildHybridCarousel, buildSponsoredCarousel, buildRecommendedCarousel, renderCarousel } = this.api;
|
|
184
|
+
const carousel = TryDoFlat(() => {
|
|
185
|
+
log?.debug('Starting request');
|
|
186
|
+
const request = startRequest(this.zoneId)
|
|
187
|
+
.withSurfCategory(this.category)
|
|
188
|
+
.withKeywords(this.keywords)
|
|
189
|
+
.withProductCards(defaultNative())
|
|
190
|
+
.build();
|
|
191
|
+
switch (this.strategy) {
|
|
192
|
+
case ProductFeedStrategy.Hybrid:
|
|
193
|
+
log?.debug('building Hybrid carousel');
|
|
194
|
+
return buildHybridCarousel({
|
|
195
|
+
type: this.recommend
|
|
196
|
+
}, request);
|
|
197
|
+
case ProductFeedStrategy.Sponsored:
|
|
198
|
+
log?.debug('Building sponsored carousel');
|
|
199
|
+
return buildSponsoredCarousel(request);
|
|
200
|
+
case ProductFeedStrategy.Recommended:
|
|
201
|
+
log?.debug('Building recommended carousel');
|
|
202
|
+
return buildRecommendedCarousel({
|
|
203
|
+
type: this.recommend
|
|
204
|
+
}, this.category?.[0]);
|
|
205
|
+
default:
|
|
206
|
+
return Err(new InvalidRecommenderTypeError(this.strategy));
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
if (!carousel.ok) {
|
|
210
|
+
log?.error('Failed to build carousel!', carousel.error);
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
log?.info('Rendering carousel');
|
|
214
|
+
const element = await renderCarousel(carousel.value, this.cardMinWidth, this.maxItems === undefined || this.maxItems === 0
|
|
215
|
+
? {
|
|
216
|
+
type: 'infinite'
|
|
217
|
+
}
|
|
218
|
+
: {
|
|
219
|
+
type: 'limited',
|
|
220
|
+
limit: this.maxItems
|
|
221
|
+
}, this.nextType, this.cardMaxWidth);
|
|
222
|
+
log?.info('rendered carousel element');
|
|
223
|
+
if (!element.ok) {
|
|
224
|
+
log?.error(element.error);
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
if (this._cancellationToken.cancelled) {
|
|
228
|
+
log?.info('Cancelled rendering carousel');
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
stopTimer?.();
|
|
232
|
+
element.value.element.classList.add(`surf-zone-${this.zoneId}`);
|
|
233
|
+
this.shadow.innerHTML = '';
|
|
234
|
+
this.shadow.appendChild(element.value.element);
|
|
235
|
+
const elementInitRes = await element.value.init();
|
|
236
|
+
if (!elementInitRes.ok) {
|
|
237
|
+
log?.error('Carousel first page was empty', elementInitRes);
|
|
238
|
+
this.remove();
|
|
239
|
+
}
|
|
240
|
+
log?.info('Appended carousel to DOM');
|
|
241
|
+
this.restartEndToEndTimer();
|
|
242
|
+
}, DEBOUNCE_THRESHOLD);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=Carousel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Carousel.js","sourceRoot":"../@surfside-ads/","sources":["components/Carousel.ts"],"names":[],"mappings":"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"}
|