@pata-app/ui-sponsored-placements 1.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/dist/config/fetch-config.d.ts +6 -0
- package/dist/config/fetch-config.d.ts.map +1 -0
- package/dist/config/placement-registry.d.ts +5 -0
- package/dist/config/placement-registry.d.ts.map +1 -0
- package/dist/config/schema.d.ts +8 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/context/sponsored-placements.context.d.ts +15 -0
- package/dist/context/sponsored-placements.context.d.ts.map +1 -0
- package/dist/hooks/use-breakpoint.d.ts +3 -0
- package/dist/hooks/use-breakpoint.d.ts.map +1 -0
- package/dist/hooks/use-sponsored-placement.d.ts +18 -0
- package/dist/hooks/use-sponsored-placement.d.ts.map +1 -0
- package/dist/index.cjs +444 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +426 -0
- package/dist/index.mjs.map +1 -0
- package/dist/sponsored-placement/sponsored-placement.d.ts +4 -0
- package/dist/sponsored-placement/sponsored-placement.d.ts.map +1 -0
- package/dist/sponsored-placement/sponsored-placement.styled.d.ts +6 -0
- package/dist/sponsored-placement/sponsored-placement.styled.d.ts.map +1 -0
- package/dist/sponsored-placement/sponsored-placement.types.d.ts +17 -0
- package/dist/sponsored-placement/sponsored-placement.types.d.ts.map +1 -0
- package/dist/types/placement.types.d.ts +14 -0
- package/dist/types/placement.types.d.ts.map +1 -0
- package/dist/types/sponsored-config.types.d.ts +23 -0
- package/dist/types/sponsored-config.types.d.ts.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type SponsoredConfig } from "../types/sponsored-config.types";
|
|
2
|
+
export type FetchSponsoredConfigOptions = {
|
|
3
|
+
signal?: AbortSignal;
|
|
4
|
+
};
|
|
5
|
+
export declare function fetchConfig(configUrl: string, options?: FetchSponsoredConfigOptions): Promise<SponsoredConfig | null>;
|
|
6
|
+
//# sourceMappingURL=fetch-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-config.d.ts","sourceRoot":"","sources":["../../src/config/fetch-config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAEvE,MAAM,MAAM,2BAA2B,GAAG;IACxC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAyBjC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type PlacementDefinition, type PlacementKey } from "../types/placement.types";
|
|
2
|
+
export { PLACEMENT_KEYS } from "../types/placement.types";
|
|
3
|
+
export declare const PLACEMENT_REGISTRY: Record<PlacementKey, PlacementDefinition>;
|
|
4
|
+
export declare const isPlacementKey: (value: string) => value is "home.list.sponsored_tile" | "home.section.sponsored_section" | "search.results.sponsored_tile" | "profile.section.sponsored_section" | "checkout.confirmation.sponsored_section";
|
|
5
|
+
//# sourceMappingURL=placement-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"placement-registry.d.ts","sourceRoot":"","sources":["../../src/config/placement-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,YAAY,EAAE,mBAAmB,CA8CxE,CAAC;AAEF,eAAO,MAAM,cAAc,UAAW,MAAM,+LAE3C,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type SponsoredConfig, type SponsoredItem } from "../types/sponsored-config.types";
|
|
2
|
+
export declare const parseSponsoredItem: (value: unknown) => SponsoredItem | null;
|
|
3
|
+
export declare const validateSponsoredItem: (value: unknown) => value is SponsoredItem;
|
|
4
|
+
export declare const parseSponsoredConfig: (value: unknown) => SponsoredConfig | null;
|
|
5
|
+
export declare const validateSponsoredConfig: (value: unknown) => value is SponsoredConfig;
|
|
6
|
+
export type SponsoredItemSchemaType = SponsoredItem;
|
|
7
|
+
export type SponsoredConfigSchemaType = SponsoredConfig;
|
|
8
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EAEpB,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;AAgDzC,eAAO,MAAM,kBAAkB,UAAW,OAAO,KAAG,aAAa,GAAG,IAwDnE,CAAC;AAEF,eAAO,MAAM,qBAAqB,UAAW,OAAO,2BAEnD,CAAC;AAEF,eAAO,MAAM,oBAAoB,UAAW,OAAO,KAAG,eAAe,GAAG,IA6BvE,CAAC;AAEF,eAAO,MAAM,uBAAuB,UAAW,OAAO,6BAErD,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,aAAa,CAAC;AACpD,MAAM,MAAM,yBAAyB,GAAG,eAAe,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import { type SponsoredConfig } from "../types/sponsored-config.types";
|
|
3
|
+
export type SponsoredPlacementsStatus = "idle" | "loading" | "ready" | "error";
|
|
4
|
+
export type SponsoredPlacementsContextValue = {
|
|
5
|
+
status: SponsoredPlacementsStatus;
|
|
6
|
+
config: SponsoredConfig | null;
|
|
7
|
+
};
|
|
8
|
+
type SponsoredPlacementsProviderProps = {
|
|
9
|
+
configUrl: string;
|
|
10
|
+
children: ReactNode;
|
|
11
|
+
};
|
|
12
|
+
export declare const SponsoredPlacementsProvider: ({ configUrl, children, }: SponsoredPlacementsProviderProps) => JSX.Element;
|
|
13
|
+
export declare const useSponsoredPlacementsContext: () => SponsoredPlacementsContextValue | null;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=sponsored-placements.context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sponsored-placements.context.d.ts","sourceRoot":"","sources":["../../src/context/sponsored-placements.context.tsx"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAEvE,MAAM,MAAM,yBAAyB,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAE/E,MAAM,MAAM,+BAA+B,GAAG;IAC5C,MAAM,EAAE,yBAAyB,CAAC;IAClC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;CAChC,CAAC;AAEF,KAAK,gCAAgC,GAAG;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAIF,eAAO,MAAM,2BAA2B,6BAGrC,gCAAgC,KAAG,WAwCrC,CAAC;AAEF,eAAO,MAAM,6BAA6B,QAAO,+BAA+B,GAAG,IAElF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-breakpoint.d.ts","sourceRoot":"","sources":["../../src/hooks/use-breakpoint.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAIpE,eAAO,MAAM,aAAa,QAAO,mBA2BhC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type PlacementKey, type SponsoredBreakpoint } from "../types/placement.types";
|
|
2
|
+
import { type SponsoredItem } from "../types/sponsored-config.types";
|
|
3
|
+
export type UseSponsoredPlacementOptions = {
|
|
4
|
+
now?: Date;
|
|
5
|
+
breakpoint?: SponsoredBreakpoint;
|
|
6
|
+
};
|
|
7
|
+
export type SponsoredSelectedItem = {
|
|
8
|
+
id: string;
|
|
9
|
+
placementKey: PlacementKey;
|
|
10
|
+
image: {
|
|
11
|
+
url: string;
|
|
12
|
+
alt?: string;
|
|
13
|
+
};
|
|
14
|
+
linkUrl: string;
|
|
15
|
+
rawItem?: SponsoredItem;
|
|
16
|
+
};
|
|
17
|
+
export declare const useSponsoredPlacement: (placementKey: PlacementKey, options?: UseSponsoredPlacementOptions) => SponsoredSelectedItem | null;
|
|
18
|
+
//# sourceMappingURL=use-sponsored-placement.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-sponsored-placement.d.ts","sourceRoot":"","sources":["../../src/hooks/use-sponsored-placement.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACzB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAErE,MAAM,MAAM,4BAA4B,GAAG;IACzC,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,UAAU,CAAC,EAAE,mBAAmB,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,YAAY,CAAC;IAC3B,KAAK,EAAE;QACL,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB,CAAC;AAUF,eAAO,MAAM,qBAAqB,iBAClB,YAAY,YACjB,4BAA4B,KACpC,qBAAqB,GAAG,IAkD1B,CAAC"}
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var require$$0 = require('react');
|
|
5
|
+
var styled = require('styled-components');
|
|
6
|
+
|
|
7
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var styled__default = /*#__PURE__*/_interopDefaultCompat(styled);
|
|
10
|
+
|
|
11
|
+
const PLACEMENT_KEYS = ["home.list.sponsored_tile", "home.section.sponsored_section", "search.results.sponsored_tile", "profile.section.sponsored_section", "checkout.confirmation.sponsored_section"];
|
|
12
|
+
|
|
13
|
+
const PLACEMENT_REGISTRY = {
|
|
14
|
+
"home.list.sponsored_tile": {
|
|
15
|
+
key: "home.list.sponsored_tile",
|
|
16
|
+
maxItems: 1,
|
|
17
|
+
requiredBreakpoints: ["desktop", "mobile"],
|
|
18
|
+
type: "tile",
|
|
19
|
+
requiresSponsoredLabel: true,
|
|
20
|
+
creativeTypes: ["image"]
|
|
21
|
+
},
|
|
22
|
+
"home.section.sponsored_section": {
|
|
23
|
+
key: "home.section.sponsored_section",
|
|
24
|
+
maxItems: 1,
|
|
25
|
+
requiredBreakpoints: ["desktop", "mobile"],
|
|
26
|
+
type: "section",
|
|
27
|
+
requiresSponsoredLabel: true,
|
|
28
|
+
creativeTypes: ["image"]
|
|
29
|
+
},
|
|
30
|
+
"search.results.sponsored_tile": {
|
|
31
|
+
key: "search.results.sponsored_tile",
|
|
32
|
+
maxItems: 1,
|
|
33
|
+
requiredBreakpoints: ["desktop", "mobile"],
|
|
34
|
+
type: "tile",
|
|
35
|
+
requiresSponsoredLabel: true,
|
|
36
|
+
creativeTypes: ["image"]
|
|
37
|
+
},
|
|
38
|
+
"profile.section.sponsored_section": {
|
|
39
|
+
key: "profile.section.sponsored_section",
|
|
40
|
+
maxItems: 1,
|
|
41
|
+
requiredBreakpoints: ["desktop", "mobile"],
|
|
42
|
+
type: "section",
|
|
43
|
+
requiresSponsoredLabel: true,
|
|
44
|
+
creativeTypes: ["image"]
|
|
45
|
+
},
|
|
46
|
+
"checkout.confirmation.sponsored_section": {
|
|
47
|
+
key: "checkout.confirmation.sponsored_section",
|
|
48
|
+
maxItems: 1,
|
|
49
|
+
requiredBreakpoints: ["desktop", "mobile"],
|
|
50
|
+
type: "section",
|
|
51
|
+
requiresSponsoredLabel: true,
|
|
52
|
+
creativeTypes: ["image"]
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
const isPlacementKey = value => {
|
|
56
|
+
return value in PLACEMENT_REGISTRY;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const isRecord = value => {
|
|
60
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
61
|
+
};
|
|
62
|
+
const isNonEmptyString = value => {
|
|
63
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
64
|
+
};
|
|
65
|
+
const isValidIsoDateString = value => {
|
|
66
|
+
return typeof value === "string" && !Number.isNaN(Date.parse(value));
|
|
67
|
+
};
|
|
68
|
+
const isValidUrlString = value => {
|
|
69
|
+
if (typeof value !== "string") {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
const url = new URL(value);
|
|
74
|
+
return url.protocol === "http:" || url.protocol === "https:";
|
|
75
|
+
} catch (_a) {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
const parseCreativeImage = value => {
|
|
80
|
+
if (!isRecord(value)) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
const {
|
|
84
|
+
url,
|
|
85
|
+
alt
|
|
86
|
+
} = value;
|
|
87
|
+
if (!isValidUrlString(url)) {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
if (alt !== undefined && typeof alt !== "string") {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
return Object.assign({
|
|
94
|
+
url
|
|
95
|
+
}, typeof alt === "string" ? {
|
|
96
|
+
alt
|
|
97
|
+
} : {});
|
|
98
|
+
};
|
|
99
|
+
const parseSponsoredItem = value => {
|
|
100
|
+
if (!isRecord(value)) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
const {
|
|
104
|
+
id,
|
|
105
|
+
displaySection,
|
|
106
|
+
startAt,
|
|
107
|
+
endAt,
|
|
108
|
+
creative
|
|
109
|
+
} = value;
|
|
110
|
+
if (!isNonEmptyString(id) || !isNonEmptyString(displaySection)) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
if (!isValidIsoDateString(startAt) || !isValidIsoDateString(endAt)) {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
if (Date.parse(startAt) >= Date.parse(endAt)) {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
if (!isRecord(creative)) {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
if (creative.type !== "image") {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
if (!isValidUrlString(creative.linkUrl)) {
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
if (!isRecord(creative.images)) {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
const desktopImage = parseCreativeImage(creative.images.desktop);
|
|
132
|
+
const mobileImage = parseCreativeImage(creative.images.mobile);
|
|
133
|
+
if (!desktopImage || !mobileImage) {
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
id,
|
|
138
|
+
displaySection,
|
|
139
|
+
startAt,
|
|
140
|
+
endAt,
|
|
141
|
+
creative: {
|
|
142
|
+
type: "image",
|
|
143
|
+
images: {
|
|
144
|
+
desktop: desktopImage,
|
|
145
|
+
mobile: mobileImage
|
|
146
|
+
},
|
|
147
|
+
linkUrl: creative.linkUrl
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
};
|
|
151
|
+
const validateSponsoredItem = value => {
|
|
152
|
+
return parseSponsoredItem(value) !== null;
|
|
153
|
+
};
|
|
154
|
+
const parseSponsoredConfig = value => {
|
|
155
|
+
if (!isRecord(value)) {
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
const {
|
|
159
|
+
version,
|
|
160
|
+
updatedAt,
|
|
161
|
+
items
|
|
162
|
+
} = value;
|
|
163
|
+
if (typeof version !== "number" || Number.isNaN(version)) {
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
if (!isValidIsoDateString(updatedAt)) {
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
if (!Array.isArray(items)) {
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
const validItems = items.flatMap(item => {
|
|
173
|
+
const parsedItem = parseSponsoredItem(item);
|
|
174
|
+
return parsedItem ? [parsedItem] : [];
|
|
175
|
+
});
|
|
176
|
+
return {
|
|
177
|
+
version,
|
|
178
|
+
updatedAt,
|
|
179
|
+
items: validItems
|
|
180
|
+
};
|
|
181
|
+
};
|
|
182
|
+
const validateSponsoredConfig = value => {
|
|
183
|
+
return parseSponsoredConfig(value) !== null;
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
/******************************************************************************
|
|
187
|
+
Copyright (c) Microsoft Corporation.
|
|
188
|
+
|
|
189
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
190
|
+
purpose with or without fee is hereby granted.
|
|
191
|
+
|
|
192
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
193
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
194
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
195
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
196
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
197
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
198
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
199
|
+
***************************************************************************** */
|
|
200
|
+
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
function __awaiter(thisArg, _arguments, P, generator) {
|
|
204
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
205
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
206
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
207
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
208
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
209
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
214
|
+
var e = new Error(message);
|
|
215
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
function fetchConfig(configUrl, options = {}) {
|
|
219
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
220
|
+
try {
|
|
221
|
+
const response = yield fetch(configUrl, {
|
|
222
|
+
method: "GET",
|
|
223
|
+
signal: options.signal
|
|
224
|
+
});
|
|
225
|
+
if (!response.ok) {
|
|
226
|
+
return null;
|
|
227
|
+
}
|
|
228
|
+
const json = yield response.json();
|
|
229
|
+
const parsedConfig = parseSponsoredConfig(json);
|
|
230
|
+
if (!parsedConfig) {
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
return Object.assign(Object.assign({}, parsedConfig), {
|
|
234
|
+
items: parsedConfig.items.filter(item => isPlacementKey(item.displaySection))
|
|
235
|
+
});
|
|
236
|
+
} catch (_a) {
|
|
237
|
+
return null;
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
const SponsoredPlacementsContext = require$$0.createContext(null);
|
|
243
|
+
const SponsoredPlacementsProvider = ({
|
|
244
|
+
configUrl,
|
|
245
|
+
children
|
|
246
|
+
}) => {
|
|
247
|
+
const [status, setStatus] = require$$0.useState("idle");
|
|
248
|
+
const [config, setConfig] = require$$0.useState(null);
|
|
249
|
+
require$$0.useEffect(() => {
|
|
250
|
+
const controller = new AbortController();
|
|
251
|
+
const loadConfig = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
252
|
+
setStatus("loading");
|
|
253
|
+
const nextConfig = yield fetchConfig(configUrl, {
|
|
254
|
+
signal: controller.signal
|
|
255
|
+
});
|
|
256
|
+
if (controller.signal.aborted) {
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
setConfig(nextConfig);
|
|
260
|
+
setStatus("ready");
|
|
261
|
+
});
|
|
262
|
+
void loadConfig();
|
|
263
|
+
return () => {
|
|
264
|
+
controller.abort();
|
|
265
|
+
};
|
|
266
|
+
}, [configUrl]);
|
|
267
|
+
const contextValue = require$$0.useMemo(() => ({
|
|
268
|
+
status,
|
|
269
|
+
config
|
|
270
|
+
}), [status, config]);
|
|
271
|
+
return jsxRuntime.jsx(SponsoredPlacementsContext.Provider, {
|
|
272
|
+
value: contextValue,
|
|
273
|
+
children: children
|
|
274
|
+
});
|
|
275
|
+
};
|
|
276
|
+
const useSponsoredPlacementsContext = () => {
|
|
277
|
+
return require$$0.useContext(SponsoredPlacementsContext);
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
const DEFAULT_BREAKPOINT_QUERY = "(min-width: 768px)";
|
|
281
|
+
const useBreakpoint = () => {
|
|
282
|
+
var _a, _b, _c;
|
|
283
|
+
const theme = styled.useTheme();
|
|
284
|
+
const [breakpoint, setBreakpoint] = require$$0.useState("mobile");
|
|
285
|
+
const breakpointQuery = (_c = (_b = (_a = theme === null || theme === void 0 ? void 0 : theme.core) === null || _a === void 0 ? void 0 : _a.breakpoints) === null || _b === void 0 ? void 0 : _b.m) !== null && _c !== void 0 ? _c : DEFAULT_BREAKPOINT_QUERY;
|
|
286
|
+
require$$0.useEffect(() => {
|
|
287
|
+
const mediaQuery = window.matchMedia(breakpointQuery);
|
|
288
|
+
const updateBreakpoint = matches => {
|
|
289
|
+
setBreakpoint(matches ? "desktop" : "mobile");
|
|
290
|
+
};
|
|
291
|
+
updateBreakpoint(mediaQuery.matches);
|
|
292
|
+
const listener = event => {
|
|
293
|
+
updateBreakpoint(event.matches);
|
|
294
|
+
};
|
|
295
|
+
mediaQuery.addEventListener("change", listener);
|
|
296
|
+
return () => {
|
|
297
|
+
mediaQuery.removeEventListener("change", listener);
|
|
298
|
+
};
|
|
299
|
+
}, [breakpointQuery]);
|
|
300
|
+
return breakpoint;
|
|
301
|
+
};
|
|
302
|
+
|
|
303
|
+
const isItemActive = (item, now) => {
|
|
304
|
+
const nowMs = now.getTime();
|
|
305
|
+
const startMs = Date.parse(item.startAt);
|
|
306
|
+
const endMs = Date.parse(item.endAt);
|
|
307
|
+
return startMs <= nowMs && nowMs <= endMs;
|
|
308
|
+
};
|
|
309
|
+
const useSponsoredPlacement = (placementKey, options = {}) => {
|
|
310
|
+
var _a, _b;
|
|
311
|
+
const context = useSponsoredPlacementsContext();
|
|
312
|
+
const detectedBreakpoint = useBreakpoint();
|
|
313
|
+
const defaultNowRef = require$$0.useRef(new Date());
|
|
314
|
+
const now = (_a = options.now) !== null && _a !== void 0 ? _a : defaultNowRef.current;
|
|
315
|
+
const breakpoint = (_b = options.breakpoint) !== null && _b !== void 0 ? _b : detectedBreakpoint;
|
|
316
|
+
const item = require$$0.useMemo(() => {
|
|
317
|
+
if (!context || context.status !== "ready" || !context.config) {
|
|
318
|
+
return null;
|
|
319
|
+
}
|
|
320
|
+
const validItems = context.config.items.filter(item => {
|
|
321
|
+
if (item.displaySection !== placementKey) {
|
|
322
|
+
return false;
|
|
323
|
+
}
|
|
324
|
+
if (!isItemActive(item, now)) {
|
|
325
|
+
return false;
|
|
326
|
+
}
|
|
327
|
+
return true;
|
|
328
|
+
});
|
|
329
|
+
if (validItems.length === 0) {
|
|
330
|
+
return null;
|
|
331
|
+
}
|
|
332
|
+
const selectedItem = validItems.length === 1 ? validItems[0] : validItems[Math.floor(Math.random() * validItems.length)];
|
|
333
|
+
const selectedImage = selectedItem.creative.images[breakpoint];
|
|
334
|
+
return {
|
|
335
|
+
id: selectedItem.id,
|
|
336
|
+
placementKey,
|
|
337
|
+
image: Object.assign({
|
|
338
|
+
url: selectedImage.url
|
|
339
|
+
}, selectedImage.alt ? {
|
|
340
|
+
alt: selectedImage.alt
|
|
341
|
+
} : {}),
|
|
342
|
+
linkUrl: selectedItem.creative.linkUrl,
|
|
343
|
+
rawItem: selectedItem
|
|
344
|
+
};
|
|
345
|
+
}, [breakpoint, context, now, placementKey]);
|
|
346
|
+
return item;
|
|
347
|
+
};
|
|
348
|
+
|
|
349
|
+
const SponsoredPlacementContainer = styled__default.default.div`
|
|
350
|
+
display: flex;
|
|
351
|
+
flex-direction: column;
|
|
352
|
+
gap: ${({
|
|
353
|
+
theme
|
|
354
|
+
}) => theme.core.sizing[1]}px;
|
|
355
|
+
`;
|
|
356
|
+
const SponsoredLabel = styled__default.default.span`
|
|
357
|
+
font-size: ${({
|
|
358
|
+
theme
|
|
359
|
+
}) => theme.core.fontSizes.s}px;
|
|
360
|
+
font-weight: ${({
|
|
361
|
+
theme
|
|
362
|
+
}) => theme.core.fontWeight.medium};
|
|
363
|
+
color: ${({
|
|
364
|
+
theme
|
|
365
|
+
}) => theme.core.colors.greyscale.dark};
|
|
366
|
+
`;
|
|
367
|
+
const SponsoredLink = styled__default.default.a`
|
|
368
|
+
display: block;
|
|
369
|
+
width: 100%;
|
|
370
|
+
`;
|
|
371
|
+
const SponsoredImage = styled__default.default.img`
|
|
372
|
+
display: block;
|
|
373
|
+
width: 100%;
|
|
374
|
+
height: auto;
|
|
375
|
+
border-radius: ${({
|
|
376
|
+
theme
|
|
377
|
+
}) => theme.core.border.element.radius}px;
|
|
378
|
+
`;
|
|
379
|
+
|
|
380
|
+
const SponsoredPlacement = ({
|
|
381
|
+
placementKey,
|
|
382
|
+
className,
|
|
383
|
+
onImpression,
|
|
384
|
+
onClick,
|
|
385
|
+
render
|
|
386
|
+
}) => {
|
|
387
|
+
var _a;
|
|
388
|
+
const item = useSponsoredPlacement(placementKey);
|
|
389
|
+
require$$0.useEffect(() => {
|
|
390
|
+
if (!item || !onImpression) {
|
|
391
|
+
return;
|
|
392
|
+
}
|
|
393
|
+
onImpression({
|
|
394
|
+
id: item.id,
|
|
395
|
+
placementKey: item.placementKey,
|
|
396
|
+
linkUrl: item.linkUrl,
|
|
397
|
+
imageUrl: item.image.url
|
|
398
|
+
});
|
|
399
|
+
}, [item, onImpression]);
|
|
400
|
+
if (!item) {
|
|
401
|
+
return null;
|
|
402
|
+
}
|
|
403
|
+
if (render) {
|
|
404
|
+
return jsxRuntime.jsx(jsxRuntime.Fragment, {
|
|
405
|
+
children: render(item)
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
const handleClick = () => {
|
|
409
|
+
onClick === null || onClick === void 0 ? void 0 : onClick({
|
|
410
|
+
id: item.id,
|
|
411
|
+
placementKey: item.placementKey,
|
|
412
|
+
linkUrl: item.linkUrl,
|
|
413
|
+
imageUrl: item.image.url
|
|
414
|
+
});
|
|
415
|
+
};
|
|
416
|
+
return jsxRuntime.jsxs(SponsoredPlacementContainer, {
|
|
417
|
+
className: className,
|
|
418
|
+
children: [jsxRuntime.jsx(SponsoredLabel, {
|
|
419
|
+
children: "Sponsored"
|
|
420
|
+
}), jsxRuntime.jsx(SponsoredLink, {
|
|
421
|
+
href: item.linkUrl,
|
|
422
|
+
onClick: handleClick,
|
|
423
|
+
children: jsxRuntime.jsx(SponsoredImage, {
|
|
424
|
+
alt: (_a = item.image.alt) !== null && _a !== void 0 ? _a : "Sponsored placement",
|
|
425
|
+
src: item.image.url
|
|
426
|
+
})
|
|
427
|
+
})]
|
|
428
|
+
});
|
|
429
|
+
};
|
|
430
|
+
|
|
431
|
+
exports.PLACEMENT_KEYS = PLACEMENT_KEYS;
|
|
432
|
+
exports.PLACEMENT_REGISTRY = PLACEMENT_REGISTRY;
|
|
433
|
+
exports.SponsoredPlacement = SponsoredPlacement;
|
|
434
|
+
exports.SponsoredPlacementsProvider = SponsoredPlacementsProvider;
|
|
435
|
+
exports.fetchConfig = fetchConfig;
|
|
436
|
+
exports.isPlacementKey = isPlacementKey;
|
|
437
|
+
exports.parseSponsoredConfig = parseSponsoredConfig;
|
|
438
|
+
exports.parseSponsoredItem = parseSponsoredItem;
|
|
439
|
+
exports.useBreakpoint = useBreakpoint;
|
|
440
|
+
exports.useSponsoredPlacement = useSponsoredPlacement;
|
|
441
|
+
exports.useSponsoredPlacementsContext = useSponsoredPlacementsContext;
|
|
442
|
+
exports.validateSponsoredConfig = validateSponsoredConfig;
|
|
443
|
+
exports.validateSponsoredItem = validateSponsoredItem;
|
|
444
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/types/placement.types.ts","../src/config/placement-registry.ts","../src/config/schema.ts","../../../node_modules/.pnpm/node_modules/tslib/tslib.es6.js","../src/config/fetch-config.ts","../src/context/sponsored-placements.context.tsx","../src/hooks/use-breakpoint.ts","../src/hooks/use-sponsored-placement.ts","../src/sponsored-placement/sponsored-placement.styled.tsx","../src/sponsored-placement/sponsored-placement.tsx"],"sourcesContent":["export const PLACEMENT_KEYS = [\n \"home.list.sponsored_tile\",\n \"home.section.sponsored_section\",\n \"search.results.sponsored_tile\",\n \"profile.section.sponsored_section\",\n \"checkout.confirmation.sponsored_section\",\n] as const;\n\nexport type PlacementKey = (typeof PLACEMENT_KEYS)[number];\n\nexport type SponsoredBreakpoint = \"mobile\" | \"desktop\";\n\nexport type SponsoredCreativeType = \"image\";\n\nexport type SponsoredPlacementType = \"tile\" | \"section\";\n\nexport type PlacementDefinition = {\n key: PlacementKey;\n maxItems: 1;\n requiredBreakpoints: readonly SponsoredBreakpoint[];\n type: SponsoredPlacementType;\n requiresSponsoredLabel: true;\n creativeTypes: readonly SponsoredCreativeType[];\n};\n","import { type PlacementDefinition, type PlacementKey } from \"../types/placement.types\";\nexport { PLACEMENT_KEYS } from \"../types/placement.types\";\n\nexport const PLACEMENT_REGISTRY: Record<PlacementKey, PlacementDefinition> = {\n \"home.list.sponsored_tile\": {\n key: \"home.list.sponsored_tile\",\n maxItems: 1,\n requiredBreakpoints: [\"desktop\", \"mobile\"],\n type: \"tile\",\n\n requiresSponsoredLabel: true,\n creativeTypes: [\"image\"],\n },\n \"home.section.sponsored_section\": {\n key: \"home.section.sponsored_section\",\n maxItems: 1,\n requiredBreakpoints: [\"desktop\", \"mobile\"],\n type: \"section\",\n\n requiresSponsoredLabel: true,\n creativeTypes: [\"image\"],\n },\n \"search.results.sponsored_tile\": {\n key: \"search.results.sponsored_tile\",\n maxItems: 1,\n requiredBreakpoints: [\"desktop\", \"mobile\"],\n type: \"tile\",\n\n requiresSponsoredLabel: true,\n creativeTypes: [\"image\"],\n },\n \"profile.section.sponsored_section\": {\n key: \"profile.section.sponsored_section\",\n maxItems: 1,\n requiredBreakpoints: [\"desktop\", \"mobile\"],\n type: \"section\",\n\n requiresSponsoredLabel: true,\n creativeTypes: [\"image\"],\n },\n \"checkout.confirmation.sponsored_section\": {\n key: \"checkout.confirmation.sponsored_section\",\n maxItems: 1,\n requiredBreakpoints: [\"desktop\", \"mobile\"],\n type: \"section\",\n\n requiresSponsoredLabel: true,\n creativeTypes: [\"image\"],\n },\n};\n\nexport const isPlacementKey = (value: string): value is PlacementKey => {\n return value in PLACEMENT_REGISTRY;\n};\n","import {\n type SponsoredConfig,\n type SponsoredCreativeImage,\n type SponsoredItem,\n} from \"../types/sponsored-config.types\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n};\n\nconst isNonEmptyString = (value: unknown): value is string => {\n return typeof value === \"string\" && value.trim().length > 0;\n};\n\nconst isValidIsoDateString = (value: unknown): value is string => {\n return typeof value === \"string\" && !Number.isNaN(Date.parse(value));\n};\n\nconst isValidUrlString = (value: unknown): value is string => {\n if (typeof value !== \"string\") {\n return false;\n }\n\n try {\n const url = new URL(value);\n return url.protocol === \"http:\" || url.protocol === \"https:\";\n } catch {\n return false;\n }\n};\n\nconst parseCreativeImage = (value: unknown): SponsoredCreativeImage | null => {\n if (!isRecord(value)) {\n return null;\n }\n\n const { url, alt } = value;\n\n if (!isValidUrlString(url)) {\n return null;\n }\n\n if (alt !== undefined && typeof alt !== \"string\") {\n return null;\n }\n\n return {\n url,\n ...(typeof alt === \"string\" ? { alt } : {}),\n };\n};\n\nexport const parseSponsoredItem = (value: unknown): SponsoredItem | null => {\n if (!isRecord(value)) {\n return null;\n }\n\n const { id, displaySection, startAt, endAt, creative } = value;\n\n if (!isNonEmptyString(id) || !isNonEmptyString(displaySection)) {\n return null;\n }\n\n if (!isValidIsoDateString(startAt) || !isValidIsoDateString(endAt)) {\n return null;\n }\n\n if (Date.parse(startAt) >= Date.parse(endAt)) {\n return null;\n }\n\n if (!isRecord(creative)) {\n return null;\n }\n\n if (creative.type !== \"image\") {\n return null;\n }\n\n if (!isValidUrlString(creative.linkUrl)) {\n return null;\n }\n\n if (!isRecord(creative.images)) {\n return null;\n }\n\n const desktopImage = parseCreativeImage(creative.images.desktop);\n const mobileImage = parseCreativeImage(creative.images.mobile);\n\n if (!desktopImage || !mobileImage) {\n return null;\n }\n\n return {\n id,\n displaySection,\n startAt,\n endAt,\n creative: {\n type: \"image\",\n images: {\n desktop: desktopImage,\n mobile: mobileImage,\n },\n linkUrl: creative.linkUrl,\n },\n };\n};\n\nexport const validateSponsoredItem = (value: unknown): value is SponsoredItem => {\n return parseSponsoredItem(value) !== null;\n};\n\nexport const parseSponsoredConfig = (value: unknown): SponsoredConfig | null => {\n if (!isRecord(value)) {\n return null;\n }\n\n const { version, updatedAt, items } = value;\n\n if (typeof version !== \"number\" || Number.isNaN(version)) {\n return null;\n }\n\n if (!isValidIsoDateString(updatedAt)) {\n return null;\n }\n\n if (!Array.isArray(items)) {\n return null;\n }\n\n const validItems = items.flatMap((item) => {\n const parsedItem = parseSponsoredItem(item);\n return parsedItem ? [parsedItem] : [];\n });\n\n return {\n version,\n updatedAt,\n items: validItems,\n };\n};\n\nexport const validateSponsoredConfig = (value: unknown): value is SponsoredConfig => {\n return parseSponsoredConfig(value) !== null;\n};\n\nexport type SponsoredItemSchemaType = SponsoredItem;\nexport type SponsoredConfigSchemaType = SponsoredConfig;\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import { isPlacementKey } from \"./placement-registry\";\nimport { parseSponsoredConfig } from \"./schema\";\nimport { type SponsoredConfig } from \"../types/sponsored-config.types\";\n\nexport type FetchSponsoredConfigOptions = {\n signal?: AbortSignal;\n};\n\nexport async function fetchConfig(\n configUrl: string,\n options: FetchSponsoredConfigOptions = {},\n): Promise<SponsoredConfig | null> {\n try {\n const response = await fetch(configUrl, {\n method: \"GET\",\n signal: options.signal,\n });\n\n if (!response.ok) {\n return null;\n }\n\n const json = (await response.json()) as unknown;\n const parsedConfig = parseSponsoredConfig(json);\n\n if (!parsedConfig) {\n return null;\n }\n\n return {\n ...parsedConfig,\n items: parsedConfig.items.filter((item) => isPlacementKey(item.displaySection)),\n };\n } catch {\n return null;\n }\n}\n","import {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactNode,\n} from \"react\";\nimport { fetchConfig } from \"../config/fetch-config\";\nimport { type SponsoredConfig } from \"../types/sponsored-config.types\";\n\nexport type SponsoredPlacementsStatus = \"idle\" | \"loading\" | \"ready\" | \"error\";\n\nexport type SponsoredPlacementsContextValue = {\n status: SponsoredPlacementsStatus;\n config: SponsoredConfig | null;\n};\n\ntype SponsoredPlacementsProviderProps = {\n configUrl: string;\n children: ReactNode;\n};\n\nconst SponsoredPlacementsContext = createContext<SponsoredPlacementsContextValue | null>(null);\n\nexport const SponsoredPlacementsProvider = ({\n configUrl,\n children,\n}: SponsoredPlacementsProviderProps): JSX.Element => {\n const [status, setStatus] = useState<SponsoredPlacementsStatus>(\"idle\");\n const [config, setConfig] = useState<SponsoredConfig | null>(null);\n\n useEffect(() => {\n const controller = new AbortController();\n\n const loadConfig = async () => {\n setStatus(\"loading\");\n\n const nextConfig = await fetchConfig(configUrl, { signal: controller.signal });\n\n if (controller.signal.aborted) {\n return;\n }\n\n setConfig(nextConfig);\n setStatus(\"ready\");\n };\n\n void loadConfig();\n\n return () => {\n controller.abort();\n };\n }, [configUrl]);\n\n const contextValue = useMemo<SponsoredPlacementsContextValue>(\n () => ({\n status,\n config,\n }),\n [status, config],\n );\n\n return (\n <SponsoredPlacementsContext.Provider value={contextValue}>\n {children}\n </SponsoredPlacementsContext.Provider>\n );\n};\n\nexport const useSponsoredPlacementsContext = (): SponsoredPlacementsContextValue | null => {\n return useContext(SponsoredPlacementsContext);\n};\n","import { useEffect, useState } from \"react\";\nimport { useTheme } from \"@pata-app/themes\";\nimport { type SponsoredBreakpoint } from \"../types/placement.types\";\n\nconst DEFAULT_BREAKPOINT_QUERY = \"(min-width: 768px)\";\n\nexport const useBreakpoint = (): SponsoredBreakpoint => {\n const theme = useTheme();\n const [breakpoint, setBreakpoint] = useState<SponsoredBreakpoint>(\"mobile\");\n\n const breakpointQuery = theme?.core?.breakpoints?.m ?? DEFAULT_BREAKPOINT_QUERY;\n\n useEffect(() => {\n const mediaQuery = window.matchMedia(breakpointQuery);\n\n const updateBreakpoint = (matches: boolean) => {\n setBreakpoint(matches ? \"desktop\" : \"mobile\");\n };\n\n updateBreakpoint(mediaQuery.matches);\n\n const listener = (event: MediaQueryListEvent) => {\n updateBreakpoint(event.matches);\n };\n\n mediaQuery.addEventListener(\"change\", listener);\n\n return () => {\n mediaQuery.removeEventListener(\"change\", listener);\n };\n }, [breakpointQuery]);\n\n return breakpoint;\n};\n","import { useMemo, useRef } from \"react\";\nimport { useSponsoredPlacementsContext } from \"../context/sponsored-placements.context\";\nimport { useBreakpoint } from \"./use-breakpoint\";\nimport {\n type PlacementKey,\n type SponsoredBreakpoint,\n} from \"../types/placement.types\";\nimport { type SponsoredItem } from \"../types/sponsored-config.types\";\n\nexport type UseSponsoredPlacementOptions = {\n now?: Date;\n breakpoint?: SponsoredBreakpoint;\n};\n\nexport type SponsoredSelectedItem = {\n id: string;\n placementKey: PlacementKey;\n image: {\n url: string;\n alt?: string;\n };\n linkUrl: string;\n rawItem?: SponsoredItem;\n};\n\nconst isItemActive = (item: SponsoredItem, now: Date) => {\n const nowMs = now.getTime();\n const startMs = Date.parse(item.startAt);\n const endMs = Date.parse(item.endAt);\n\n return startMs <= nowMs && nowMs <= endMs;\n};\n\nexport const useSponsoredPlacement = (\n placementKey: PlacementKey,\n options: UseSponsoredPlacementOptions = {},\n): SponsoredSelectedItem | null => {\n const context = useSponsoredPlacementsContext();\n const detectedBreakpoint = useBreakpoint();\n\n const defaultNowRef = useRef(new Date());\n const now = options.now ?? defaultNowRef.current;\n \n const breakpoint = options.breakpoint ?? detectedBreakpoint;\n\n const item = useMemo(() => {\n if (!context || context.status !== \"ready\" || !context.config) {\n return null;\n }\n\n const validItems = context.config.items.filter((item) => {\n if (item.displaySection !== placementKey) {\n return false;\n }\n\n if (!isItemActive(item, now)) {\n return false;\n }\n\n return true;\n });\n\n if (validItems.length === 0) {\n return null;\n }\n\n const selectedItem =\n validItems.length === 1\n ? validItems[0]\n : validItems[Math.floor(Math.random() * validItems.length)];\n\n const selectedImage = selectedItem.creative.images[breakpoint];\n\n return {\n id: selectedItem.id,\n placementKey,\n image: {\n url: selectedImage.url,\n ...(selectedImage.alt ? { alt: selectedImage.alt } : {}),\n },\n linkUrl: selectedItem.creative.linkUrl,\n rawItem: selectedItem,\n };\n }, [breakpoint, context, now, placementKey]);\n\n return item;\n};\n","import { styled } from \"@pata-app/themes\";\n\nexport const SponsoredPlacementContainer = styled.div`\n display: flex;\n flex-direction: column;\n gap: ${({ theme }) => theme.core.sizing[1]}px;\n`;\n\nexport const SponsoredLabel = styled.span`\n font-size: ${({ theme }) => theme.core.fontSizes.s}px;\n font-weight: ${({ theme }) => theme.core.fontWeight.medium};\n color: ${({ theme }) => theme.core.colors.greyscale.dark};\n`;\n\nexport const SponsoredLink = styled.a`\n display: block;\n width: 100%;\n`;\n\nexport const SponsoredImage = styled.img`\n display: block;\n width: 100%;\n height: auto;\n border-radius: ${({ theme }) => theme.core.border.element.radius}px;\n`;\n","import { useEffect } from \"react\";\nimport { useSponsoredPlacement } from \"../hooks/use-sponsored-placement\";\nimport {\n SponsoredImage,\n SponsoredLabel,\n SponsoredLink,\n SponsoredPlacementContainer,\n} from \"./sponsored-placement.styled\";\nimport { type SponsoredPlacementProps } from \"./sponsored-placement.types\";\n\nexport const SponsoredPlacement = ({\n placementKey,\n className,\n onImpression,\n onClick,\n render,\n}: SponsoredPlacementProps): JSX.Element | null => {\n const item = useSponsoredPlacement(placementKey);\n\n useEffect(() => {\n if (!item || !onImpression) {\n return;\n }\n\n onImpression({\n id: item.id,\n placementKey: item.placementKey,\n linkUrl: item.linkUrl,\n imageUrl: item.image.url,\n });\n }, [item, onImpression]);\n\n if (!item) {\n return null;\n }\n\n if (render) {\n return <>{render(item)}</>;\n }\n\n const handleClick = () => {\n onClick?.({\n id: item.id,\n placementKey: item.placementKey,\n linkUrl: item.linkUrl,\n imageUrl: item.image.url,\n });\n };\n\n return (\n <SponsoredPlacementContainer className={className}>\n <SponsoredLabel>Sponsored</SponsoredLabel>\n <SponsoredLink href={item.linkUrl} onClick={handleClick}>\n <SponsoredImage\n alt={item.image.alt ?? \"Sponsored placement\"}\n src={item.image.url}\n />\n </SponsoredLink>\n </SponsoredPlacementContainer>\n );\n};\n"],"names":["PLACEMENT_KEYS","PLACEMENT_REGISTRY","key","maxItems","requiredBreakpoints","type","requiresSponsoredLabel","creativeTypes","isPlacementKey","value","isRecord","Array","isArray","isNonEmptyString","trim","length","isValidIsoDateString","Number","isNaN","Date","parse","isValidUrlString","url","URL","protocol","_a","parseCreativeImage","alt","undefined","Object","assign","parseSponsoredItem","id","displaySection","startAt","endAt","creative","linkUrl","images","desktopImage","desktop","mobileImage","mobile","validateSponsoredItem","parseSponsoredConfig","version","updatedAt","items","validItems","flatMap","item","parsedItem","validateSponsoredConfig","fetchConfig","configUrl","options","response","fetch","method","signal","ok","json","parsedConfig","filter","SponsoredPlacementsContext","createContext","SponsoredPlacementsProvider","children","status","setStatus","useState","config","setConfig","useEffect","controller","AbortController","loadConfig","__awaiter","nextConfig","aborted","abort","contextValue","useMemo","_jsx","Provider","useSponsoredPlacementsContext","useContext","DEFAULT_BREAKPOINT_QUERY","useBreakpoint","theme","useTheme","breakpoint","setBreakpoint","breakpointQuery","_c","core","breakpoints","m","mediaQuery","window","matchMedia","updateBreakpoint","matches","listener","event","addEventListener","removeEventListener","isItemActive","now","nowMs","getTime","startMs","endMs","useSponsoredPlacement","placementKey","context","detectedBreakpoint","defaultNowRef","useRef","current","_b","selectedItem","Math","floor","random","selectedImage","image","rawItem","SponsoredPlacementContainer","styled","div","sizing","SponsoredLabel","span","fontSizes","s","fontWeight","medium","colors","greyscale","dark","SponsoredLink","a","SponsoredImage","img","border","element","radius","SponsoredPlacement","className","onImpression","onClick","render","imageUrl","handleClick","_jsxs","href","src"],"mappings":"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","x_google_ignoreList":[3]}
|