ads-web-sdkm 2.0.24

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.
Files changed (89) hide show
  1. package/README.md +369 -0
  2. package/dist/AdsCarousel.css +1 -0
  3. package/dist/AdsCarousel.d.ts +1 -0
  4. package/dist/AdsCarousel.js +519 -0
  5. package/dist/AdsCarousel.js.map +1 -0
  6. package/dist/Brandshop.css +1 -0
  7. package/dist/Brandshop.d.ts +1 -0
  8. package/dist/Brandshop.js +918 -0
  9. package/dist/Brandshop.js.map +1 -0
  10. package/dist/Brandshops.css +1 -0
  11. package/dist/Brandshops.d.ts +1 -0
  12. package/dist/Brandshops.js +103 -0
  13. package/dist/Brandshops.js.map +1 -0
  14. package/dist/Image-zvdPHg5N.js +35 -0
  15. package/dist/Image-zvdPHg5N.js.map +1 -0
  16. package/dist/ReactQueryProvider-D__k2BsQ.js +6755 -0
  17. package/dist/ReactQueryProvider-D__k2BsQ.js.map +1 -0
  18. package/dist/ads-CChrT00a.js +4470 -0
  19. package/dist/ads-CChrT00a.js.map +1 -0
  20. package/dist/api/queries/useGetAds.d.ts +16 -0
  21. package/dist/api/queries/useGetBrandshop.d.ts +14 -0
  22. package/dist/api/queries/useGetBrandshopList.d.ts +11 -0
  23. package/dist/api/queries/useGetCollection.d.ts +11 -0
  24. package/dist/api/services/getAds.d.ts +14 -0
  25. package/dist/api/services/getBrandshop.d.ts +13 -0
  26. package/dist/api/services/getBrandshopList.d.ts +11 -0
  27. package/dist/api/services/getCollection.d.ts +4 -0
  28. package/dist/components/Brandshop/Banner.d.ts +6 -0
  29. package/dist/components/Brandshop/BannerSection.d.ts +15 -0
  30. package/dist/components/Brandshop/BannerWithLink.d.ts +8 -0
  31. package/dist/components/Brandshop/Brandshop.d.ts +16 -0
  32. package/dist/components/Brandshop/BrandshopContent.d.ts +3 -0
  33. package/dist/components/Brandshop/BrandshopError.d.ts +6 -0
  34. package/dist/components/Brandshop/BrandshopSection.d.ts +18 -0
  35. package/dist/components/Brandshop/BrandshopSkeleton.d.ts +1 -0
  36. package/dist/components/Brandshop/CategorySection.d.ts +14 -0
  37. package/dist/components/Brandshop/NavigationSection.d.ts +16 -0
  38. package/dist/components/Brandshop/ProductSliderSection.d.ts +18 -0
  39. package/dist/components/Brandshop/index.d.ts +1 -0
  40. package/dist/components/Brandshops/Brandshops.d.ts +11 -0
  41. package/dist/components/Brandshops/BrandshopsList.d.ts +3 -0
  42. package/dist/components/Brandshops/BrandshopsSkeleton.d.ts +6 -0
  43. package/dist/components/Brandshops/index.d.ts +1 -0
  44. package/dist/components/Card/Card.d.ts +8 -0
  45. package/dist/components/Carousel/AdBanner.d.ts +17 -0
  46. package/dist/components/Carousel/AdBanners.d.ts +24 -0
  47. package/dist/components/Carousel/AdCarousel.d.ts +43 -0
  48. package/dist/components/Carousel/AdSkeleton.d.ts +8 -0
  49. package/dist/components/Carousel/AdsCarousel.d.ts +24 -0
  50. package/dist/components/Carousel/index.d.ts +1 -0
  51. package/dist/components/Chip/Chip.d.ts +6 -0
  52. package/dist/components/ErrorBoundary/ErrorBoundary.d.ts +18 -0
  53. package/dist/components/Image/Image.d.ts +13 -0
  54. package/dist/components/ProductsCarousel/CouponBadge.d.ts +8 -0
  55. package/dist/components/ProductsCarousel/DiscountChip.d.ts +12 -0
  56. package/dist/components/ProductsCarousel/PriceDisplay.d.ts +8 -0
  57. package/dist/components/ProductsCarousel/ProductCard.d.ts +15 -0
  58. package/dist/components/ProductsCarousel/ProductCardSkeleton.d.ts +5 -0
  59. package/dist/components/ProductsCarousel/ProductSliderSkeleton.d.ts +5 -0
  60. package/dist/components/ProductsCarousel/ProductTitle.d.ts +5 -0
  61. package/dist/components/ProductsCarousel/ProductsCarousel.d.ts +11 -0
  62. package/dist/hooks/use-async-memo.d.ts +1 -0
  63. package/dist/hooks/use-is-platform.d.ts +8 -0
  64. package/dist/hooks/useDetectScrolledToBottom.d.ts +5 -0
  65. package/dist/hooks/useSwipeThreshold.d.ts +4 -0
  66. package/dist/providers/ReactQueryProvider.d.ts +5 -0
  67. package/dist/types/ads.d.ts +116 -0
  68. package/dist/types/brandshop.d.ts +62 -0
  69. package/dist/types/brandshopsList.d.ts +32 -0
  70. package/dist/types/configTypes.d.ts +16 -0
  71. package/dist/types/enums.d.ts +8 -0
  72. package/dist/types/products.d.ts +72 -0
  73. package/dist/types/tenures.d.ts +11 -0
  74. package/dist/types/types.d.ts +2 -0
  75. package/dist/utils/analytics/trackAdsEvent.d.ts +16 -0
  76. package/dist/utils/analytics/trackBrandshopEvents.d.ts +15 -0
  77. package/dist/utils/helpers/ads.d.ts +3 -0
  78. package/dist/utils/helpers/authToken.d.ts +5 -0
  79. package/dist/utils/helpers/discountChip.d.ts +14 -0
  80. package/dist/utils/helpers/getBaseUrl.d.ts +4 -0
  81. package/dist/utils/helpers/mergeClasses.d.ts +1 -0
  82. package/dist/utils/helpers/price-utils.d.ts +1 -0
  83. package/dist/utils/helpers/productDiscounts.d.ts +3 -0
  84. package/dist/utils/helpers/products.d.ts +4 -0
  85. package/dist/utils/helpers/text.d.ts +1 -0
  86. package/dist/utils/helpers/translate.d.ts +63 -0
  87. package/dist/utils/helpers/utilities.d.ts +1 -0
  88. package/dist/utils/validations/ads.d.ts +7 -0
  89. package/package.json +81 -0
@@ -0,0 +1,519 @@
1
+ import { jsx as g, jsxs as $ } from "react/jsx-runtime";
2
+ import { useState as M, useRef as Y, useEffect as z } from "react";
3
+ import { u as J, a as X, A as F, S as Z, b as ee, c as te, d as ne, e as re, f as oe, g as ae, h as se } from "./ads-CChrT00a.js";
4
+ import { d as ie, g as le, a as ce, u as ue, R as de } from "./ReactQueryProvider-D__k2BsQ.js";
5
+ const pe = {
6
+ active: !0,
7
+ breakpoints: {},
8
+ delay: 4e3,
9
+ jump: !1,
10
+ playOnInit: !0,
11
+ stopOnFocusIn: !0,
12
+ stopOnInteraction: !0,
13
+ stopOnMouseEnter: !1,
14
+ stopOnLastSnap: !1,
15
+ rootNode: null
16
+ };
17
+ function fe(t, n) {
18
+ const e = t.scrollSnapList();
19
+ return typeof n == "number" ? e.map(() => n) : n(e, t);
20
+ }
21
+ function me(t, n) {
22
+ const e = t.rootNode();
23
+ return n && n(e) || e;
24
+ }
25
+ function R(t = {}) {
26
+ let n, e, i, o, a = null, l = 0, s = !1, p = !1, m = !1, f = !1;
27
+ function u(r, w) {
28
+ e = r;
29
+ const {
30
+ mergeOptions: C,
31
+ optionsAtMedia: P
32
+ } = w, Q = C(pe, R.globalOptions), W = C(Q, t);
33
+ if (n = P(W), e.scrollSnapList().length <= 1) return;
34
+ f = n.jump, i = !1, o = fe(e, n.delay);
35
+ const {
36
+ eventStore: I,
37
+ ownerDocument: V
38
+ } = e.internalEngine(), H = !!e.internalEngine().options.watchDrag, j = me(e, n.rootNode);
39
+ I.add(V, "visibilitychange", x), H && e.on("pointerDown", S), H && !n.stopOnInteraction && e.on("pointerUp", A), n.stopOnMouseEnter && I.add(j, "mouseenter", N), n.stopOnMouseEnter && !n.stopOnInteraction && I.add(j, "mouseleave", T), n.stopOnFocusIn && e.on("slideFocusStart", c), n.stopOnFocusIn && !n.stopOnInteraction && I.add(e.containerNode(), "focusout", d), n.playOnInit && d();
40
+ }
41
+ function v() {
42
+ e.off("pointerDown", S).off("pointerUp", A).off("slideFocusStart", c), c(), i = !0, s = !1;
43
+ }
44
+ function h() {
45
+ const {
46
+ ownerWindow: r
47
+ } = e.internalEngine();
48
+ r.clearTimeout(l), l = r.setTimeout(B, o[e.selectedScrollSnap()]), a = (/* @__PURE__ */ new Date()).getTime(), e.emit("autoplay:timerset");
49
+ }
50
+ function b() {
51
+ const {
52
+ ownerWindow: r
53
+ } = e.internalEngine();
54
+ r.clearTimeout(l), l = 0, a = null, e.emit("autoplay:timerstopped");
55
+ }
56
+ function d() {
57
+ if (!i) {
58
+ if (_()) {
59
+ m = !0;
60
+ return;
61
+ }
62
+ s || e.emit("autoplay:play"), h(), s = !0;
63
+ }
64
+ }
65
+ function c() {
66
+ i || (s && e.emit("autoplay:stop"), b(), s = !1);
67
+ }
68
+ function x() {
69
+ if (_())
70
+ return m = s, c();
71
+ m && d();
72
+ }
73
+ function _() {
74
+ const {
75
+ ownerDocument: r
76
+ } = e.internalEngine();
77
+ return r.visibilityState === "hidden";
78
+ }
79
+ function S() {
80
+ p || c();
81
+ }
82
+ function A() {
83
+ p || d();
84
+ }
85
+ function N() {
86
+ p = !0, c();
87
+ }
88
+ function T() {
89
+ p = !1, d();
90
+ }
91
+ function E(r) {
92
+ typeof r < "u" && (f = r), d();
93
+ }
94
+ function y() {
95
+ s && c();
96
+ }
97
+ function O() {
98
+ s && d();
99
+ }
100
+ function L() {
101
+ return s;
102
+ }
103
+ function B() {
104
+ const {
105
+ index: r
106
+ } = e.internalEngine(), w = r.clone().add(1).get(), C = e.scrollSnapList().length - 1, P = n.stopOnLastSnap && w === C;
107
+ if (e.canScrollNext() ? e.scrollNext(f) : e.scrollTo(0, f), e.emit("autoplay:select"), P) return c();
108
+ d();
109
+ }
110
+ function k() {
111
+ if (!a) return null;
112
+ const r = o[e.selectedScrollSnap()], w = (/* @__PURE__ */ new Date()).getTime() - a;
113
+ return r - w;
114
+ }
115
+ return {
116
+ name: "autoplay",
117
+ options: t,
118
+ init: u,
119
+ destroy: v,
120
+ play: E,
121
+ stop: y,
122
+ reset: O,
123
+ isPlaying: L,
124
+ timeUntilNext: k
125
+ };
126
+ }
127
+ R.globalOptions = void 0;
128
+ var q = /* @__PURE__ */ ((t) => (t.Arabic = "ar", t.English = "en", t))(q || {});
129
+ const K = (t, {
130
+ adTitle: n,
131
+ adFriendlyId: e,
132
+ campaignTitle: i,
133
+ campaignFriendlyId: o,
134
+ brandTitle: a,
135
+ brandFriendlyId: l,
136
+ location_id: s,
137
+ slot_number: p,
138
+ platform: m,
139
+ userStatus: f,
140
+ userId: u
141
+ }, v) => {
142
+ v?.(t, {
143
+ ad_title: n,
144
+ ad_friendly_id: e,
145
+ campaign_title: i,
146
+ campaign_friendly_id: o,
147
+ brand_title: a,
148
+ brand_friendly_id: l,
149
+ location_id: s,
150
+ slot_number: p,
151
+ platform: m,
152
+ userStatus: f,
153
+ userId: u
154
+ });
155
+ }, G = ({
156
+ ad: t,
157
+ locationId: n,
158
+ trackAdHandler: e,
159
+ fallback: i,
160
+ plugin: o,
161
+ isLoggedin: a,
162
+ userId: l,
163
+ onClick: s,
164
+ logError: p
165
+ }) => {
166
+ const [m, f] = M(!1), u = t.media, v = t.ad_title ?? t.default_content_title, [h, b] = t.media_aspect_ratio?.split(":") ?? [3, 1], d = Number(h) / Number(b), { ref: c } = J({
167
+ onChange: (_) => {
168
+ _ && K(
169
+ "ads_banner_impression",
170
+ {
171
+ adTitle: t.ad_title,
172
+ adFriendlyId: t.ad_id,
173
+ campaignTitle: t.campaign_title,
174
+ campaignFriendlyId: t.campaign_id,
175
+ brandTitle: t.brand_name,
176
+ brandFriendlyId: t.brand_id,
177
+ location_id: n,
178
+ slot_number: t.ad_slot.toString(),
179
+ platform: "web",
180
+ userStatus: a ? "logged_in" : "guest",
181
+ userId: l ?? ""
182
+ },
183
+ e
184
+ );
185
+ }
186
+ }), x = (_, S, A, N) => {
187
+ p && p(
188
+ new Error(
189
+ `MediaError - ${n === "Green_Home_Top_Banner" ? "Home Banner" : "Category Banner"} AD image failed to load`
190
+ ),
191
+ {
192
+ level: "error",
193
+ tags: { ad_id: JSON.stringify(S), ad_title: A, location_id: N },
194
+ context: { data: { source: "Ad Banner" } }
195
+ }
196
+ ), _.currentTarget.src = i ?? ie, f(!0);
197
+ };
198
+ return /* @__PURE__ */ g(
199
+ "button",
200
+ {
201
+ ref: c,
202
+ onClick: s,
203
+ className: "block w-full cursor-pointer appearance-none p-0 m-0 bg-transparent border-0",
204
+ onMouseEnter: () => o?.stop(),
205
+ onMouseLeave: () => o?.play(),
206
+ children: /* @__PURE__ */ g(
207
+ "img",
208
+ {
209
+ src: u,
210
+ fetchPriority: "high",
211
+ alt: v,
212
+ style: {
213
+ aspectRatio: d,
214
+ ...m && { backgroundColor: "#D2D2D2" }
215
+ },
216
+ className: "w-full object-cover laptop:rounded-[24px] cursor-pointer",
217
+ onError: (_) => x(_, t.ad_id, t.ad_title, n)
218
+ }
219
+ )
220
+ }
221
+ );
222
+ };
223
+ function ge(t) {
224
+ if (![
225
+ "Green_Category_Top_Banner",
226
+ "Green_Home_Top_Banner"
227
+ ].includes(t))
228
+ throw new Error("ClientError - Invalid LocationID");
229
+ }
230
+ function _e(t) {
231
+ if (!["ar", "en"].includes(t))
232
+ throw new Error("ClientError - Invalid LanguageKey");
233
+ }
234
+ function ve(t, n) {
235
+ return (e, i) => {
236
+ try {
237
+ t?.(e, i);
238
+ } catch (o) {
239
+ n?.(new Error(`ClientError - PostHog Error: ${o}`), {
240
+ level: "warning",
241
+ tags: { eventName: e }
242
+ });
243
+ }
244
+ };
245
+ }
246
+ const ye = async ({
247
+ deviceType: t,
248
+ language: n,
249
+ locationId: e,
250
+ environment: i,
251
+ adServerApiKey: o,
252
+ params: a
253
+ }) => {
254
+ const [l, s] = await le(o), p = a ? `?${new URLSearchParams(a).toString()}` : "", m = ce("adServer", i), f = `ServerError - Failed to fetch ${e === "Green_Home_Top_Banner" ? "Home Banner ADS" : "Category Banner ADS"}`;
255
+ try {
256
+ const u = await fetch(
257
+ `${m}/api/v2/ads/${e}${p}`,
258
+ {
259
+ headers: {
260
+ "device-type": t,
261
+ "Accept-Language": n,
262
+ "auth-token": l,
263
+ "auth-timestamp": s
264
+ }
265
+ }
266
+ );
267
+ if (u.status === 401)
268
+ throw new Error("ClientError - Invalid AdServerAPIKey");
269
+ if (u.status === 400)
270
+ throw _e(n), new Error("ClientError - invalid parameters");
271
+ if (!u.ok)
272
+ throw ge(e), new Error(f);
273
+ return await u.json();
274
+ } catch (u) {
275
+ throw new Error(u instanceof Error ? u.message : f);
276
+ }
277
+ }, we = "ads", he = ({
278
+ deviceType: t,
279
+ language: n,
280
+ locationId: e,
281
+ environment: i,
282
+ adServerApiKey: o,
283
+ params: a,
284
+ enabled: l
285
+ }) => ue({
286
+ queryKey: [
287
+ we,
288
+ e,
289
+ t,
290
+ n,
291
+ a
292
+ ],
293
+ queryFn: () => ye({
294
+ deviceType: t,
295
+ language: n,
296
+ locationId: e,
297
+ params: a,
298
+ environment: i,
299
+ adServerApiKey: o
300
+ }),
301
+ enabled: l
302
+ }), be = "_navButtonNext_vq3ll_1", Se = "_navButtonPrev_vq3ll_3", Ee = "_activeDot_vq3ll_13", Ce = "_progressBar_vq3ll_15", Ae = "_inactiveDot_vq3ll_23", De = "_progressContainer_vq3ll_25", D = {
303
+ navButtonNext: be,
304
+ navButtonPrev: Se,
305
+ activeDot: Ee,
306
+ progressBar: Ce,
307
+ inactiveDot: Ae,
308
+ progressContainer: De
309
+ }, xe = ({
310
+ language: t,
311
+ locationId: n,
312
+ environment: e,
313
+ adServerApiKey: i,
314
+ isLoggedin: o,
315
+ userId: a,
316
+ trackAdHandler: l,
317
+ params: s,
318
+ autoplayDelay: p = 4e3,
319
+ fallbackImg: m,
320
+ banners: f,
321
+ swipeThreshold: u,
322
+ transitionDuration: v,
323
+ showProgressBar: h,
324
+ onAdClick: b,
325
+ logError: d
326
+ }) => {
327
+ const [c, x] = M(null), [_, S] = M(0), { isLaptop: A, isDesktop: N } = X(), T = A || N ? F.Web : F.Mobile, E = Y(
328
+ R({
329
+ delay: p,
330
+ stopOnInteraction: T !== F.Mobile
331
+ })
332
+ );
333
+ let y = f;
334
+ const {
335
+ data: O,
336
+ isLoading: L,
337
+ error: B
338
+ } = he({
339
+ deviceType: T,
340
+ language: t,
341
+ locationId: n,
342
+ environment: e,
343
+ adServerApiKey: i,
344
+ params: s,
345
+ enabled: !f?.length
346
+ });
347
+ y?.length || (y = O?.data);
348
+ const k = (r) => {
349
+ if (!r.link?.link_destination) return;
350
+ K(
351
+ "ads_banner_click",
352
+ {
353
+ adTitle: r.ad_title,
354
+ adFriendlyId: r.ad_id,
355
+ campaignTitle: r.campaign_title,
356
+ campaignFriendlyId: r.campaign_id,
357
+ brandTitle: r.brand_name,
358
+ brandFriendlyId: r.brand_id,
359
+ location_id: n,
360
+ slot_number: r.ad_slot.toString(),
361
+ platform: "web",
362
+ userStatus: o ? "logged_in" : "guest",
363
+ userId: a ?? ""
364
+ },
365
+ l
366
+ );
367
+ const C = se(r.link?.link_destination);
368
+ C && b?.(C);
369
+ }, U = (r) => {
370
+ c?.scrollTo(r);
371
+ };
372
+ if (z(() => {
373
+ if (!c) return;
374
+ const r = () => {
375
+ const w = c.selectedScrollSnap();
376
+ S(w);
377
+ };
378
+ return S(c.selectedScrollSnap()), c.on("select", r), () => {
379
+ c.off("select", r);
380
+ };
381
+ }, [c]), L)
382
+ return /* @__PURE__ */ g("div", { className: "laptop:px-2xlarge", children: /* @__PURE__ */ g(
383
+ Z,
384
+ {
385
+ rounded: !0,
386
+ className: "w-full aspect-[720/400] laptop:aspect-[2400/800] object-cover laptop:rounded-[24px]"
387
+ }
388
+ ) });
389
+ if (B)
390
+ throw d?.(B, {
391
+ level: "fatal",
392
+ tags: { locationId: n, language: t },
393
+ context: { data: { source: "Ad Banners" } }
394
+ }), new Error(B?.message || "unknown error");
395
+ return y?.length === 1 ? /* @__PURE__ */ g("div", { className: "laptop:px-2xlarge overflow-hidden", children: /* @__PURE__ */ g(
396
+ G,
397
+ {
398
+ ad: y[0],
399
+ locationId: n,
400
+ trackAdHandler: l,
401
+ onClick: () => k(y[0]),
402
+ fallback: m,
403
+ logError: d,
404
+ isLoggedin: o,
405
+ userId: a
406
+ }
407
+ ) }) : /* @__PURE__ */ $(
408
+ "div",
409
+ {
410
+ className: "flex flex-col gap-large relative laptop:px-2xlarge w-full",
411
+ children: [
412
+ /* @__PURE__ */ $(
413
+ ee,
414
+ {
415
+ className: "p-0 overflow-hidden relative",
416
+ setApi: x,
417
+ opts: {
418
+ direction: t === q.Arabic ? "rtl" : "ltr",
419
+ loop: !0
420
+ },
421
+ plugins: [E.current],
422
+ swipeThresholdPercentage: u,
423
+ transitionDuration: v,
424
+ children: [
425
+ /* @__PURE__ */ g(te, { className: "p-0", children: y?.map((r) => /* @__PURE__ */ g(ne, { className: "p-0", children: /* @__PURE__ */ g(
426
+ G,
427
+ {
428
+ ad: r,
429
+ locationId: n,
430
+ trackAdHandler: l,
431
+ onClick: () => k(r),
432
+ fallback: m,
433
+ logError: d,
434
+ plugin: E.current,
435
+ isLoggedin: o,
436
+ userId: a
437
+ }
438
+ ) }, r.ad_slot)) }),
439
+ /* @__PURE__ */ g(
440
+ re,
441
+ {
442
+ autoplay: E.current,
443
+ className: D.navButtonPrev
444
+ }
445
+ ),
446
+ /* @__PURE__ */ g(
447
+ oe,
448
+ {
449
+ autoplay: E.current,
450
+ className: D.navButtonNext
451
+ }
452
+ )
453
+ ]
454
+ }
455
+ ),
456
+ /* @__PURE__ */ g(
457
+ ae,
458
+ {
459
+ onClick: U,
460
+ currentIndex: _,
461
+ slidesCount: y?.length || 0,
462
+ autoplay: E.current,
463
+ delay: p,
464
+ isRtl: t === q.Arabic,
465
+ showProgress: h,
466
+ activeDotClassName: D.activeDot,
467
+ inactiveDotClassName: D.inactiveDot,
468
+ progressBarClassName: D.progressBar,
469
+ progressContainerClassName: D.progressContainer
470
+ }
471
+ )
472
+ ]
473
+ }
474
+ );
475
+ };
476
+ function Ie({
477
+ locationId: t,
478
+ language: n,
479
+ environment: e,
480
+ adServerApiKey: i,
481
+ isLoggedin: o,
482
+ userId: a,
483
+ trackAdHandler: l,
484
+ params: s,
485
+ autoplayDelay: p,
486
+ fallbackImg: m,
487
+ swipeThreshold: f,
488
+ banners: u,
489
+ transitionDuration: v,
490
+ showProgressBar: h,
491
+ onAdClick: b,
492
+ logError: d
493
+ }) {
494
+ return /* @__PURE__ */ g(de, { children: /* @__PURE__ */ g(
495
+ xe,
496
+ {
497
+ language: n,
498
+ locationId: t,
499
+ params: s,
500
+ adServerApiKey: i,
501
+ environment: e,
502
+ trackAdHandler: ve(l, d),
503
+ onAdClick: b,
504
+ fallbackImg: m,
505
+ autoplayDelay: p,
506
+ swipeThreshold: f,
507
+ transitionDuration: v,
508
+ logError: d,
509
+ showProgressBar: h,
510
+ banners: u,
511
+ isLoggedin: o,
512
+ userId: a
513
+ }
514
+ ) });
515
+ }
516
+ export {
517
+ Ie as AdsCarousel
518
+ };
519
+ //# sourceMappingURL=AdsCarousel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdsCarousel.js","sources":["../node_modules/embla-carousel-autoplay/esm/embla-carousel-autoplay.esm.js","../src/types/enums.ts","../src/utils/analytics/trackAdsEvent.ts","../src/components/Carousel/AdBanner.tsx","../src/utils/validations/ads.ts","../src/api/services/getAds.ts","../src/api/queries/useGetAds.ts","../src/components/Carousel/AdBanners.tsx","../src/components/Carousel/AdsCarousel.tsx"],"sourcesContent":["const defaultOptions = {\n active: true,\n breakpoints: {},\n delay: 4000,\n jump: false,\n playOnInit: true,\n stopOnFocusIn: true,\n stopOnInteraction: true,\n stopOnMouseEnter: false,\n stopOnLastSnap: false,\n rootNode: null\n};\n\nfunction normalizeDelay(emblaApi, delay) {\n const scrollSnaps = emblaApi.scrollSnapList();\n if (typeof delay === 'number') {\n return scrollSnaps.map(() => delay);\n }\n return delay(scrollSnaps, emblaApi);\n}\nfunction getAutoplayRootNode(emblaApi, rootNode) {\n const emblaRootNode = emblaApi.rootNode();\n return rootNode && rootNode(emblaRootNode) || emblaRootNode;\n}\n\nfunction Autoplay(userOptions = {}) {\n let options;\n let emblaApi;\n let destroyed;\n let delay;\n let timerStartTime = null;\n let timerId = 0;\n let autoplayActive = false;\n let mouseIsOver = false;\n let playOnDocumentVisible = false;\n let jump = false;\n function init(emblaApiInstance, optionsHandler) {\n emblaApi = emblaApiInstance;\n const {\n mergeOptions,\n optionsAtMedia\n } = optionsHandler;\n const optionsBase = mergeOptions(defaultOptions, Autoplay.globalOptions);\n const allOptions = mergeOptions(optionsBase, userOptions);\n options = optionsAtMedia(allOptions);\n if (emblaApi.scrollSnapList().length <= 1) return;\n jump = options.jump;\n destroyed = false;\n delay = normalizeDelay(emblaApi, options.delay);\n const {\n eventStore,\n ownerDocument\n } = emblaApi.internalEngine();\n const isDraggable = !!emblaApi.internalEngine().options.watchDrag;\n const root = getAutoplayRootNode(emblaApi, options.rootNode);\n eventStore.add(ownerDocument, 'visibilitychange', visibilityChange);\n if (isDraggable) {\n emblaApi.on('pointerDown', pointerDown);\n }\n if (isDraggable && !options.stopOnInteraction) {\n emblaApi.on('pointerUp', pointerUp);\n }\n if (options.stopOnMouseEnter) {\n eventStore.add(root, 'mouseenter', mouseEnter);\n }\n if (options.stopOnMouseEnter && !options.stopOnInteraction) {\n eventStore.add(root, 'mouseleave', mouseLeave);\n }\n if (options.stopOnFocusIn) {\n emblaApi.on('slideFocusStart', stopAutoplay);\n }\n if (options.stopOnFocusIn && !options.stopOnInteraction) {\n eventStore.add(emblaApi.containerNode(), 'focusout', startAutoplay);\n }\n if (options.playOnInit) startAutoplay();\n }\n function destroy() {\n emblaApi.off('pointerDown', pointerDown).off('pointerUp', pointerUp).off('slideFocusStart', stopAutoplay);\n stopAutoplay();\n destroyed = true;\n autoplayActive = false;\n }\n function setTimer() {\n const {\n ownerWindow\n } = emblaApi.internalEngine();\n ownerWindow.clearTimeout(timerId);\n timerId = ownerWindow.setTimeout(next, delay[emblaApi.selectedScrollSnap()]);\n timerStartTime = new Date().getTime();\n emblaApi.emit('autoplay:timerset');\n }\n function clearTimer() {\n const {\n ownerWindow\n } = emblaApi.internalEngine();\n ownerWindow.clearTimeout(timerId);\n timerId = 0;\n timerStartTime = null;\n emblaApi.emit('autoplay:timerstopped');\n }\n function startAutoplay() {\n if (destroyed) return;\n if (documentIsHidden()) {\n playOnDocumentVisible = true;\n return;\n }\n if (!autoplayActive) emblaApi.emit('autoplay:play');\n setTimer();\n autoplayActive = true;\n }\n function stopAutoplay() {\n if (destroyed) return;\n if (autoplayActive) emblaApi.emit('autoplay:stop');\n clearTimer();\n autoplayActive = false;\n }\n function visibilityChange() {\n if (documentIsHidden()) {\n playOnDocumentVisible = autoplayActive;\n return stopAutoplay();\n }\n if (playOnDocumentVisible) startAutoplay();\n }\n function documentIsHidden() {\n const {\n ownerDocument\n } = emblaApi.internalEngine();\n return ownerDocument.visibilityState === 'hidden';\n }\n function pointerDown() {\n if (!mouseIsOver) stopAutoplay();\n }\n function pointerUp() {\n if (!mouseIsOver) startAutoplay();\n }\n function mouseEnter() {\n mouseIsOver = true;\n stopAutoplay();\n }\n function mouseLeave() {\n mouseIsOver = false;\n startAutoplay();\n }\n function play(jumpOverride) {\n if (typeof jumpOverride !== 'undefined') jump = jumpOverride;\n startAutoplay();\n }\n function stop() {\n if (autoplayActive) stopAutoplay();\n }\n function reset() {\n if (autoplayActive) startAutoplay();\n }\n function isPlaying() {\n return autoplayActive;\n }\n function next() {\n const {\n index\n } = emblaApi.internalEngine();\n const nextIndex = index.clone().add(1).get();\n const lastIndex = emblaApi.scrollSnapList().length - 1;\n const kill = options.stopOnLastSnap && nextIndex === lastIndex;\n if (emblaApi.canScrollNext()) {\n emblaApi.scrollNext(jump);\n } else {\n emblaApi.scrollTo(0, jump);\n }\n emblaApi.emit('autoplay:select');\n if (kill) return stopAutoplay();\n startAutoplay();\n }\n function timeUntilNext() {\n if (!timerStartTime) return null;\n const currentDelay = delay[emblaApi.selectedScrollSnap()];\n const timePastSinceStart = new Date().getTime() - timerStartTime;\n return currentDelay - timePastSinceStart;\n }\n const self = {\n name: 'autoplay',\n options: userOptions,\n init,\n destroy,\n play,\n stop,\n reset,\n isPlaying,\n timeUntilNext\n };\n return self;\n}\nAutoplay.globalOptions = undefined;\n\nexport { Autoplay as default };\n//# sourceMappingURL=embla-carousel-autoplay.esm.js.map\n","export enum Language {\r\n Arabic = 'ar',\r\n English = 'en',\r\n}\r\n\r\nexport enum DeviceType {\r\n Mobile = 'mob',\r\n Web = 'web',\r\n}\r\n","type TAdsEventProperties = {\r\n adTitle: string;\r\n adFriendlyId: number | string;\r\n campaignTitle: string;\r\n campaignFriendlyId: number | string;\r\n brandTitle: string;\r\n brandFriendlyId: number | string;\r\n location_id: string;\r\n slot_number: string;\r\n platform: string;\r\n userStatus: string;\r\n userId: string;\r\n};\r\ntype TAdsEventNamesEnum = 'ads_banner_impression' | 'ads_banner_click';\r\n\r\nexport const trackAdsBannerEvent = (\r\n eventName: TAdsEventNamesEnum,\r\n {\r\n adTitle,\r\n adFriendlyId,\r\n campaignTitle,\r\n campaignFriendlyId,\r\n brandTitle,\r\n brandFriendlyId,\r\n location_id,\r\n slot_number,\r\n platform,\r\n userStatus,\r\n userId,\r\n }: TAdsEventProperties,\r\n trackEvent?: (\r\n eventName: string,\r\n eventProperties: Record<string, unknown>,\r\n ) => void,\r\n) => {\r\n trackEvent?.(eventName, {\r\n ad_title: adTitle,\r\n ad_friendly_id: adFriendlyId,\r\n campaign_title: campaignTitle,\r\n campaign_friendly_id: campaignFriendlyId,\r\n brand_title: brandTitle,\r\n brand_friendly_id: brandFriendlyId,\r\n location_id,\r\n slot_number,\r\n platform,\r\n userStatus,\r\n userId,\r\n });\r\n};\r\n","import { useState } from 'react';\r\nimport { useInView } from 'react-intersection-observer';\r\nimport { type TAdsLocations, type AdData } from '@/types/ads';\r\nimport { trackAdsBannerEvent } from '@/utils/analytics/trackAdsEvent';\r\nimport fallbackImg from '@/assets/fallback-image.svg';\r\nimport { type TLogError } from '@/types/configTypes';\r\nimport Autoplay from 'embla-carousel-autoplay';\r\n\r\ninterface AdBannerProps {\r\n ad: AdData;\r\n locationId: TAdsLocations;\r\n trackAdHandler?: (\r\n eventName: string,\r\n eventProperties: Record<string, unknown>,\r\n ) => void;\r\n plugin?: ReturnType<typeof Autoplay>;\r\n fallback?: string;\r\n isLoggedin?: boolean;\r\n userId?: string;\r\n onClick?: () => void;\r\n logError?: TLogError;\r\n}\r\n\r\nconst AdBanner = ({\r\n ad,\r\n locationId,\r\n trackAdHandler,\r\n fallback,\r\n plugin,\r\n isLoggedin,\r\n userId,\r\n onClick,\r\n logError,\r\n}: AdBannerProps) => {\r\n const [hasError, setHasError] = useState(false);\r\n const imageUrl = ad.media;\r\n const altText = ad.ad_title ?? ad.default_content_title;\r\n const [w, h] = ad.media_aspect_ratio?.split(':') ?? [3, 1];\r\n const aspectRatio = Number(w) / Number(h);\r\n const { ref } = useInView({\r\n onChange: (inView: boolean) => {\r\n if (inView) {\r\n trackAdsBannerEvent(\r\n 'ads_banner_impression',\r\n {\r\n adTitle: ad.ad_title,\r\n adFriendlyId: ad.ad_id,\r\n campaignTitle: ad.campaign_title,\r\n campaignFriendlyId: ad.campaign_id,\r\n brandTitle: ad.brand_name,\r\n brandFriendlyId: ad.brand_id,\r\n location_id: locationId,\r\n slot_number: ad.ad_slot.toString(),\r\n platform: 'web',\r\n userStatus: isLoggedin ? 'logged_in' : 'guest',\r\n userId: userId ?? '',\r\n },\r\n trackAdHandler,\r\n );\r\n }\r\n },\r\n });\r\n const handleImageError = (\r\n event: React.SyntheticEvent<HTMLImageElement, Event>,\r\n ad_id: string | number,\r\n ad_title: string,\r\n location_id: TAdsLocations,\r\n ) => {\r\n if (logError) {\r\n logError(\r\n new Error(\r\n `MediaError - ${locationId === 'Green_Home_Top_Banner' ? 'Home Banner' : 'Category Banner'} AD image failed to load`,\r\n ),\r\n {\r\n level: 'error',\r\n tags: { ad_id: JSON.stringify(ad_id), ad_title, location_id },\r\n context: { data: { source: 'Ad Banner' } },\r\n },\r\n );\r\n }\r\n event.currentTarget.src = fallback ?? fallbackImg;\r\n setHasError(true);\r\n };\r\n return (\r\n <button\r\n ref={ref}\r\n onClick={onClick}\r\n className={\r\n 'block w-full cursor-pointer appearance-none p-0 m-0 bg-transparent border-0'\r\n }\r\n onMouseEnter={() => plugin?.stop()}\r\n onMouseLeave={() => plugin?.play()}\r\n >\r\n <img\r\n src={imageUrl}\r\n fetchPriority=\"high\"\r\n alt={altText}\r\n style={{\r\n aspectRatio,\r\n ...(hasError && { backgroundColor: '#D2D2D2' }),\r\n }}\r\n className={'w-full object-cover laptop:rounded-[24px] cursor-pointer'}\r\n onError={(event) =>\r\n handleImageError(event, ad.ad_id, ad.ad_title, locationId)\r\n }\r\n />\r\n </button>\r\n );\r\n};\r\n\r\nexport default AdBanner;\r\n","import { TAdsLocations } from '@/types/ads';\r\nimport { TLanguage } from '@/types/types';\r\nimport { type TTrackEvents, type TLogError } from '@/types/configTypes';\r\n\r\nexport function validateLocationId(locationId: TAdsLocations) {\r\n const allowedLocations: TAdsLocations[] = [\r\n 'Green_Category_Top_Banner',\r\n 'Green_Home_Top_Banner',\r\n ];\r\n\r\n if (!allowedLocations.includes(locationId)) {\r\n throw new Error(`ClientError - Invalid LocationID`);\r\n }\r\n}\r\n\r\nexport function validateLanguage(language: TLanguage) {\r\n const allowedLanguages: TLanguage[] = ['ar', 'en'];\r\n\r\n if (!allowedLanguages.includes(language)) {\r\n throw new Error(`ClientError - Invalid LanguageKey`);\r\n }\r\n}\r\nexport function validateTrackHandler(\r\n track?: TTrackEvents,\r\n logError?: TLogError,\r\n): TTrackEvents {\r\n return (eventName, eventProps) => {\r\n try {\r\n track?.(eventName, eventProps);\r\n } catch (err) {\r\n logError?.(new Error(`ClientError - PostHog Error: ${err}`), {\r\n level: 'warning',\r\n tags: { eventName },\r\n });\r\n }\r\n };\r\n}\r\n","import { generateAccessToken } from '@/utils/helpers/authToken';\r\nimport { type AdsDeviceType, type TAdsLocations } from '@/types/ads';\r\nimport { type TLanguage } from '@/types/types';\r\nimport { getBaseUrl } from '@/utils/helpers/getBaseUrl';\r\nimport { type TEnvironment } from '@/types/configTypes';\r\nimport { validateLanguage, validateLocationId } from '@/utils/validations/ads';\r\n\r\ntype TGetAdsProps = {\r\n deviceType: AdsDeviceType;\r\n language: TLanguage;\r\n environment: TEnvironment;\r\n locationId: TAdsLocations;\r\n adServerApiKey: string;\r\n params?: Record<string, string>;\r\n};\r\n\r\nexport const getAds = async ({\r\n deviceType,\r\n language,\r\n locationId,\r\n environment,\r\n adServerApiKey,\r\n params,\r\n}: TGetAdsProps) => {\r\n const [token, timestamp] = await generateAccessToken(adServerApiKey);\r\n const query = params ? `?${new URLSearchParams(params).toString()}` : '';\r\n const adServerBaseUrl = getBaseUrl('adServer', environment);\r\n const serverErrorMsg = `ServerError - Failed to fetch ${locationId === 'Green_Home_Top_Banner' ? 'Home Banner ADS' : 'Category Banner ADS'}`;\r\n\r\n try {\r\n const res = await fetch(\r\n `${adServerBaseUrl}/api/v2/ads/${locationId}${query}`,\r\n {\r\n headers: {\r\n 'device-type': deviceType,\r\n 'Accept-Language': language,\r\n 'auth-token': token,\r\n 'auth-timestamp': timestamp,\r\n },\r\n },\r\n );\r\n if (res.status === 401) {\r\n throw new Error('ClientError - Invalid AdServerAPIKey');\r\n } else if (res.status === 400) {\r\n validateLanguage(language);\r\n throw new Error('ClientError - invalid parameters');\r\n } else if (!res.ok) {\r\n validateLocationId(locationId);\r\n throw new Error(serverErrorMsg);\r\n }\r\n return await res.json();\r\n } catch (error) {\r\n throw new Error(error instanceof Error ? error.message : serverErrorMsg);\r\n }\r\n};\r\n","import { getAds } from '@/api/services/getAds';\r\nimport { useQuery } from '@tanstack/react-query';\r\nimport { AdsDeviceType, type TAdsLocations } from '@/types/ads';\r\nimport { type TLanguage } from '@/types/types';\r\nimport { type TEnvironment } from '@/types/configTypes';\r\n\r\ntype TGetAdsProps = {\r\n deviceType: AdsDeviceType;\r\n language: TLanguage;\r\n locationId: TAdsLocations;\r\n environment: TEnvironment;\r\n adServerApiKey: string;\r\n params?: Record<string, string>;\r\n enabled?: boolean;\r\n};\r\nexport const GET_ADS_QUERY_KEY = 'ads';\r\n\r\nexport const useGetAdsQuery = ({\r\n deviceType,\r\n language,\r\n locationId,\r\n environment,\r\n adServerApiKey,\r\n params,\r\n enabled,\r\n}: TGetAdsProps) => {\r\n const adsQueryKey = [\r\n GET_ADS_QUERY_KEY,\r\n locationId,\r\n deviceType,\r\n language,\r\n params,\r\n ];\r\n\r\n return useQuery({\r\n queryKey: adsQueryKey,\r\n queryFn: () =>\r\n getAds({\r\n deviceType,\r\n language,\r\n locationId,\r\n params,\r\n environment,\r\n adServerApiKey,\r\n }),\r\n enabled,\r\n });\r\n};\r\n","import { useEffect, useRef, useState } from 'react';\r\nimport Autoplay from 'embla-carousel-autoplay';\r\nimport { useIsPlatform } from '@/hooks/use-is-platform';\r\nimport {\r\n type TAdsLocations,\r\n type AdData,\r\n AdsDeviceType,\r\n type TLinkClickEvent,\r\n} from '@/types/ads';\r\nimport { Language } from '@/types/enums';\r\nimport { TLanguage } from '@/types/types';\r\nimport {\r\n AdCarouselApi,\r\n AdCarousel,\r\n AdCarouselContent,\r\n AdCarouselItem,\r\n AdCarouselPrevious,\r\n AdCarouselNext,\r\n AdCarouselPagination,\r\n} from './AdCarousel';\r\nimport AdBanner from './AdBanner';\r\nimport Skeleton from './AdSkeleton';\r\nimport { trackAdsBannerEvent } from '@/utils/analytics/trackAdsEvent';\r\nimport { useGetAdsQuery } from '@/api/queries/useGetAds';\r\nimport { type TLogError, type TEnvironment } from '@/types/configTypes';\r\nimport { buildLinkDestination } from '@/utils/helpers/ads';\r\nimport styles from './AdsBanner.module.css';\r\n\r\ninterface AdBannersProps {\r\n language: TLanguage;\r\n locationId: TAdsLocations;\r\n environment: TEnvironment;\r\n adServerApiKey: string;\r\n isLoggedin?: boolean;\r\n userId?: string;\r\n trackAdHandler?: (\r\n eventName: string,\r\n eventProperties: Record<string, unknown>,\r\n ) => void;\r\n params?: Record<string, string>;\r\n autoplayDelay?: number;\r\n fallbackImg?: string;\r\n banners?: AdData[];\r\n swipeThreshold?: number;\r\n transitionDuration?: number;\r\n showProgressBar?: boolean;\r\n onAdClick?: (event: TLinkClickEvent) => void;\r\n logError?: TLogError;\r\n}\r\nconst AdBanners = ({\r\n language,\r\n locationId,\r\n environment,\r\n adServerApiKey,\r\n isLoggedin,\r\n userId,\r\n trackAdHandler,\r\n params,\r\n autoplayDelay = 4000,\r\n fallbackImg,\r\n banners,\r\n swipeThreshold,\r\n transitionDuration,\r\n showProgressBar,\r\n onAdClick,\r\n logError,\r\n}: AdBannersProps) => {\r\n const [api, setApi] = useState<AdCarouselApi | null>(null);\r\n const [currentIndex, setCurrentIndex] = useState<number>(0);\r\n const { isLaptop, isDesktop } = useIsPlatform();\r\n const deviceType =\r\n isLaptop || isDesktop ? AdsDeviceType.Web : AdsDeviceType.Mobile;\r\n const plugin = useRef(\r\n Autoplay({\r\n delay: autoplayDelay,\r\n stopOnInteraction: deviceType !== AdsDeviceType.Mobile,\r\n }),\r\n );\r\n\r\n let data = banners;\r\n\r\n const {\r\n data: adsData,\r\n isLoading,\r\n error,\r\n } = useGetAdsQuery({\r\n deviceType,\r\n language,\r\n locationId,\r\n environment,\r\n adServerApiKey,\r\n params,\r\n enabled: !banners?.length,\r\n });\r\n\r\n if (!data?.length) data = adsData?.data;\r\n\r\n const handleAdClick = (ad: AdData) => {\r\n const destination = ad.link?.link_destination;\r\n if (!destination) return;\r\n\r\n trackAdsBannerEvent(\r\n 'ads_banner_click',\r\n {\r\n adTitle: ad.ad_title,\r\n adFriendlyId: ad.ad_id,\r\n campaignTitle: ad.campaign_title,\r\n campaignFriendlyId: ad.campaign_id,\r\n brandTitle: ad.brand_name,\r\n brandFriendlyId: ad.brand_id,\r\n location_id: locationId,\r\n slot_number: ad.ad_slot.toString(),\r\n platform: 'web',\r\n userStatus: isLoggedin ? 'logged_in' : 'guest',\r\n userId: userId ?? '',\r\n },\r\n trackAdHandler,\r\n );\r\n\r\n const payload = buildLinkDestination(ad.link?.link_destination);\r\n if (payload) onAdClick?.(payload);\r\n };\r\n const handleDotsClick = (index: number) => {\r\n api?.scrollTo(index);\r\n };\r\n\r\n useEffect(() => {\r\n if (!api) return;\r\n\r\n const handleSelect = () => {\r\n const newIndex = api.selectedScrollSnap();\r\n setCurrentIndex(newIndex);\r\n };\r\n\r\n setCurrentIndex(api.selectedScrollSnap());\r\n api.on('select', handleSelect);\r\n\r\n return () => {\r\n api.off('select', handleSelect);\r\n };\r\n }, [api]);\r\n\r\n if (isLoading) {\r\n return (\r\n <div className=\"laptop:px-2xlarge\">\r\n <Skeleton\r\n rounded\r\n className=\"w-full aspect-[720/400] laptop:aspect-[2400/800] object-cover laptop:rounded-[24px]\"\r\n />\r\n </div>\r\n );\r\n }\r\n if (error) {\r\n logError?.(error, {\r\n level: 'fatal',\r\n tags: { locationId, language },\r\n context: { data: { source: 'Ad Banners' } },\r\n });\r\n throw new Error(error?.message || 'unknown error');\r\n }\r\n\r\n // CASE 1: Only one banner (no carousel)\r\n if (data?.length === 1) {\r\n return (\r\n <div className={'laptop:px-2xlarge overflow-hidden'}>\r\n <AdBanner\r\n ad={data[0]}\r\n locationId={locationId}\r\n trackAdHandler={trackAdHandler}\r\n onClick={() => handleAdClick(data[0])}\r\n fallback={fallbackImg}\r\n logError={logError}\r\n isLoggedin={isLoggedin}\r\n userId={userId}\r\n />\r\n </div>\r\n );\r\n }\r\n // CASE 2: Multiple banners (carousel)\r\n return (\r\n <div\r\n className={'flex flex-col gap-large relative laptop:px-2xlarge w-full'}\r\n >\r\n <AdCarousel\r\n className={'p-0 overflow-hidden relative'}\r\n setApi={setApi}\r\n opts={{\r\n direction: language === Language.Arabic ? 'rtl' : 'ltr',\r\n loop: true,\r\n }}\r\n plugins={[plugin.current]}\r\n swipeThresholdPercentage={swipeThreshold}\r\n transitionDuration={transitionDuration}\r\n >\r\n <AdCarouselContent className={'p-0'}>\r\n {data?.map((ad) => (\r\n <AdCarouselItem className={'p-0'} key={ad.ad_slot}>\r\n <AdBanner\r\n ad={ad}\r\n locationId={locationId}\r\n trackAdHandler={trackAdHandler}\r\n onClick={() => handleAdClick(ad)}\r\n fallback={fallbackImg}\r\n logError={logError}\r\n plugin={plugin.current}\r\n isLoggedin={isLoggedin}\r\n userId={userId}\r\n />\r\n </AdCarouselItem>\r\n ))}\r\n </AdCarouselContent>\r\n <AdCarouselPrevious\r\n autoplay={plugin.current}\r\n className={styles.navButtonPrev}\r\n />\r\n <AdCarouselNext\r\n autoplay={plugin.current}\r\n className={styles.navButtonNext}\r\n />\r\n </AdCarousel>\r\n <AdCarouselPagination\r\n onClick={handleDotsClick}\r\n currentIndex={currentIndex}\r\n slidesCount={data?.length || 0}\r\n autoplay={plugin.current}\r\n delay={autoplayDelay}\r\n isRtl={language === Language.Arabic}\r\n showProgress={showProgressBar}\r\n activeDotClassName={styles.activeDot}\r\n inactiveDotClassName={styles.inactiveDot}\r\n progressBarClassName={styles.progressBar}\r\n progressContainerClassName={styles.progressContainer}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport default AdBanners;\r\n","import AdBanners from './AdBanners';\r\nimport {\r\n type TLinkClickEvent,\r\n type TAdsLocations,\r\n type AdData,\r\n} from '@/types/ads';\r\nimport { ReactQueryProvider } from '@/providers/ReactQueryProvider';\r\nimport { type TLanguage } from '@/types/types';\r\nimport {\r\n type TLogError,\r\n type TEnvironment,\r\n type TTrackEvents,\r\n} from '@/types/configTypes';\r\nimport { validateTrackHandler } from '@/utils/validations/ads';\r\nimport './AdsCarousel.css';\r\n\r\ninterface AdsCarouselProps {\r\n locationId: TAdsLocations;\r\n language: TLanguage;\r\n environment: TEnvironment;\r\n adServerApiKey: string;\r\n isLoggedin?: boolean;\r\n userId?: string;\r\n trackAdHandler?: TTrackEvents;\r\n params?: Record<string, string>;\r\n autoplayDelay?: number;\r\n fallbackImg?: string;\r\n swipeThreshold?: number;\r\n banners?: AdData[];\r\n transitionDuration?: number;\r\n showProgressBar?: boolean;\r\n onAdClick?: (event: TLinkClickEvent) => void;\r\n logError?: TLogError;\r\n}\r\nfunction AdsCarousel({\r\n locationId,\r\n language,\r\n environment,\r\n adServerApiKey,\r\n isLoggedin,\r\n userId,\r\n trackAdHandler,\r\n params,\r\n autoplayDelay,\r\n fallbackImg,\r\n swipeThreshold,\r\n banners,\r\n transitionDuration,\r\n showProgressBar,\r\n onAdClick,\r\n logError,\r\n}: Readonly<AdsCarouselProps>) {\r\n return (\r\n <ReactQueryProvider>\r\n <AdBanners\r\n language={language}\r\n locationId={locationId}\r\n params={params}\r\n adServerApiKey={adServerApiKey}\r\n environment={environment}\r\n trackAdHandler={validateTrackHandler(trackAdHandler, logError)}\r\n onAdClick={onAdClick}\r\n fallbackImg={fallbackImg}\r\n autoplayDelay={autoplayDelay}\r\n swipeThreshold={swipeThreshold}\r\n transitionDuration={transitionDuration}\r\n logError={logError}\r\n showProgressBar={showProgressBar}\r\n banners={banners}\r\n isLoggedin={isLoggedin}\r\n userId={userId}\r\n />\r\n </ReactQueryProvider>\r\n );\r\n}\r\nexport default AdsCarousel;\r\n"],"names":["defaultOptions","normalizeDelay","emblaApi","delay","scrollSnaps","getAutoplayRootNode","rootNode","emblaRootNode","Autoplay","userOptions","options","destroyed","timerStartTime","timerId","autoplayActive","mouseIsOver","playOnDocumentVisible","jump","init","emblaApiInstance","optionsHandler","mergeOptions","optionsAtMedia","optionsBase","allOptions","eventStore","ownerDocument","isDraggable","root","visibilityChange","pointerDown","pointerUp","mouseEnter","mouseLeave","stopAutoplay","startAutoplay","destroy","setTimer","ownerWindow","next","clearTimer","documentIsHidden","play","jumpOverride","stop","reset","isPlaying","index","nextIndex","lastIndex","kill","timeUntilNext","currentDelay","timePastSinceStart","Language","trackAdsBannerEvent","eventName","adTitle","adFriendlyId","campaignTitle","campaignFriendlyId","brandTitle","brandFriendlyId","location_id","slot_number","platform","userStatus","userId","trackEvent","AdBanner","ad","locationId","trackAdHandler","fallback","plugin","isLoggedin","onClick","logError","hasError","setHasError","useState","imageUrl","altText","w","h","aspectRatio","ref","useInView","inView","handleImageError","event","ad_id","ad_title","fallbackImg","jsx","validateLocationId","validateLanguage","language","validateTrackHandler","track","eventProps","err","getAds","deviceType","environment","adServerApiKey","params","token","timestamp","generateAccessToken","query","adServerBaseUrl","getBaseUrl","serverErrorMsg","res","error","GET_ADS_QUERY_KEY","useGetAdsQuery","enabled","useQuery","AdBanners","autoplayDelay","banners","swipeThreshold","transitionDuration","showProgressBar","onAdClick","api","setApi","currentIndex","setCurrentIndex","isLaptop","isDesktop","useIsPlatform","AdsDeviceType","useRef","data","adsData","isLoading","handleAdClick","payload","buildLinkDestination","handleDotsClick","useEffect","handleSelect","newIndex","Skeleton","jsxs","AdCarousel","AdCarouselContent","AdCarouselItem","AdCarouselPrevious","styles","AdCarouselNext","AdCarouselPagination","AdsCarousel","ReactQueryProvider"],"mappings":"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","x_google_ignoreList":[0]}
@@ -0,0 +1 @@
1
+ ._brandshopContent_1lmgx_7{display:flex;align-items:center;justify-content:center;flex-direction:column;font-family:Noto sans,sans-serif;padding:32px 0;gap:48px;max-width:1440px;margin:auto}[dir=rtl] ._brandshopContent_1lmgx_7{font-family:Noto Sans Arabic,sans-serif}._sectionContainer_1lmgx_39{width:100%;display:flex;flex-direction:column;gap:32px;padding:0 48px}._sectionTitle_1lmgx_55{color:#000;font-size:24px;font-style:normal;font-weight:600;line-height:36px;text-align:left}[dir=rtl] ._sectionTitle_1lmgx_55{text-align:right}@media (max-width: 1024px){._brandshopContent_1lmgx_7{gap:32px;padding:16px 0}._sectionContainer_1lmgx_39{gap:16px;padding:0 16px}._sectionTitle_1lmgx_55{font-size:20px}}._navigationSection_1lmgx_121{display:flex;align-items:center;gap:24px;justify-content:space-between;width:100%}._navigationLogo_1lmgx_137{width:107px;border-radius:8px}._navigationLinks_1lmgx_147{display:flex;gap:1.5rem}._navigationLink_1lmgx_147{color:#000;font-size:16px;font-style:normal;font-weight:500;line-height:normal;cursor:pointer;text-align:left}[dir=rtl] ._navigationLink_1lmgx_147{text-align:right}@media (max-width: 1024px){._navigationSectionContainer_1lmgx_187{padding:0 0 0 16px}[dir=rtl] ._navigationSectionContainer_1lmgx_187{padding-left:0;padding-right:16px}._navigationSection_1lmgx_121{justify-content:start}._navigationLogo_1lmgx_137{display:none}._navigationLinks_1lmgx_147{display:flex;flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none}._navigationLinks_1lmgx_147::-webkit-scrollbar{display:none}._navigationLink_1lmgx_147{font-weight:600;white-space:nowrap}._navigationLink_1lmgx_147:last-child{padding-right:16px}[dir=rtl] ._navigationLink_1lmgx_147:last-child{padding-right:0;padding-left:16px}}._bannerButton_1lmgx_281,._banner_1lmgx_281{width:100%}._bannerButton_1lmgx_281{cursor:pointer;position:relative}._bannerCta_1lmgx_301{position:absolute;bottom:32px;left:50%;transform:translate(-50%);background-color:#e6e6e6;color:#1a1a1a;padding:12px 32px;border-radius:999px;text-align:center;font-size:16px;font-weight:600}._bannerImage_1lmgx_329{width:100%;object-fit:cover;border-radius:12px}._banner_1lmgx_281 ._bannerImage_1lmgx_329{aspect-ratio:16 / 4}._bannerButton_1lmgx_281 ._bannerImage_1lmgx_329{aspect-ratio:16 / 6}@media (max-width: 1024px){._bannerImage_1lmgx_329{border-radius:8px}._banner_1lmgx_281 ._bannerImage_1lmgx_329{aspect-ratio:2 / 1}._bannerButton_1lmgx_281 ._bannerImage_1lmgx_329{aspect-ratio:1 / 1.5}._bannerCta_1lmgx_301{background-color:#fafafa;border-color:#8d8d8d;padding:9px 40.5px;white-space:nowrap;border-width:2px}}._categoryContainer_1lmgx_409{display:flex;gap:24px;justify-content:space-between;align-items:stretch}._categoryTile_1lmgx_423{flex:1 1 0;display:flex;flex-direction:column;align-items:center;cursor:pointer;border-radius:8px;min-width:0}._categoryImageWrapper_1lmgx_443{width:100%;aspect-ratio:1 / 1;border-radius:8px;overflow:hidden;position:relative;flex-shrink:0}._categoryImage_1lmgx_443{width:100%;height:100%;object-fit:cover}._categoryName_1lmgx_473{padding:12px 24px;color:#000;text-align:center;font-size:20px;font-weight:500;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;overflow:hidden;max-height:75px;flex-shrink:0}._categoryNameShrink_1lmgx_503{padding:12px 20px}._categoryShrinkGap_1lmgx_511{gap:16px}@media (max-width: 1024px){._categoryContainer_1lmgx_409{display:grid;gap:8px;align-items:stretch}._categoryContainer_1lmgx_409._cols3_1lmgx_533{grid-template-columns:repeat(3,1fr)}._categoryContainer_1lmgx_409._cols2_1lmgx_541{grid-template-columns:repeat(2,1fr)}._categoryTile_1lmgx_423{width:100%;min-width:0;height:100%}._categoryImageWrapper_1lmgx_443{width:100%;aspect-ratio:1 / 1;border-radius:8px;overflow:hidden}._categoryImage_1lmgx_443{width:100%;height:100%;object-fit:cover;display:block}._categoryName_1lmgx_473{font-size:14px;padding:4px 8px;-webkit-line-clamp:3;line-clamp:3;max-height:75px}._categoryShrinkGap_1lmgx_511{gap:8px}}._brandshopContainerSkeleton_1lmgx_621{display:flex;flex-direction:column;gap:48px;padding:32px 48px;max-width:1440px;margin:auto}._bannerSkeleton_1lmgx_639{width:100%;aspect-ratio:16 / 4;border-radius:12px}._navContainerSkeleton_1lmgx_651{display:flex;align-items:center;justify-content:end;gap:24px}._navPillSkeleton_1lmgx_665{width:100px;height:19px;border-radius:999px}._categoryGridSkeleton_1lmgx_677{display:grid;grid-template-columns:repeat(2,1fr);gap:24px}._categoryTileSkeleton_1lmgx_689{width:100%;aspect-ratio:1 / 1;border-radius:8px}._promoSkeleton_1lmgx_701{width:100%;aspect-ratio:16 / 6;border-radius:12px}@media (max-width: 1024px){._promoSkeleton_1lmgx_701{aspect-ratio:1 / 1.5}._bannerSkeleton_1lmgx_639{aspect-ratio:2 / 1}._brandshopContainerSkeleton_1lmgx_621{gap:32px;padding:16px}._navContainerSkeleton_1lmgx_651{justify-content:start}._categoryGridSkeleton_1lmgx_677{gap:8px}._promoSkeleton_1lmgx_701,._bannerSkeleton_1lmgx_639{border-radius:8px}}._brandshopError_1lmgx_775{font-family:Noto sans,sans-serif;height:85vh;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:40px}[dir=rtl] ._brandshopError_1lmgx_775{font-family:Noto Sans Arabic,sans-serif}._errorIcon_1lmgx_805{width:40px;height:40px;object-fit:contain}._errorContent_1lmgx_817{display:flex;flex-direction:column;align-items:center;gap:24px;max-width:507px}._errorText_1lmgx_833{display:flex;flex-direction:column;gap:16px;text-align:center}._errorText_1lmgx_833 h2{font-size:20px;font-weight:600;color:#000;text-align:center}._errorText_1lmgx_833 p{font-size:16px;color:#000;text-align:center;font-weight:400}._errorButton_1lmgx_875{width:100%;height:56px;border-radius:999px;background-color:#ff3b00;color:#fff6f2;cursor:pointer;padding:0 12px;text-align:center}@media (max-width: 1024px){._brandshopError_1lmgx_775{padding:24px}}._chip_fqk2t_3{display:inline-flex;align-items:center;padding:4px 8px;border-radius:4px;font-size:12px;font-weight:600;white-space:nowrap}._card_8c2od_3{display:grid;grid-template-rows:auto 1fr;gap:8px;padding:20px;outline-color:#d3d2d5;border-radius:4px;background:#fff;height:100%}._header_8c2od_25{display:grid;position:relative;min-height:220px}._header_8c2od_25>*{grid-row:1 / 2;grid-column:1 / 2}._imageContainer_8c2od_47{display:flex;align-items:center;justify-content:center;width:100%;border-radius:4px}._image_8c2od_47{object-fit:contain;width:100%;height:100%;aspect-ratio:1 / 1}._topControls_8c2od_77{display:flex;align-items:flex-start;justify-content:space-between;align-self:flex-start}._footer_8c2od_91{display:flex;flex-direction:column;gap:8px;align-items:flex-start}._priceSection_8c2od_105{display:flex;flex-direction:column;gap:4px}._priceWrapper_8c2od_117{display:flex;align-items:baseline;gap:2px}._priceCurrency_8c2od_129{font-size:12px;font-weight:600}._priceCurrency_8c2od_129._withPromotion_8c2od_139{font-size:12px;color:#ff3b00;font-weight:600}._priceAmount_8c2od_151{font-weight:600;font-size:20px;color:#111827}._priceAmount_8c2od_151._withPromotion_8c2od_139{font-size:20px;color:#ff3b00;font-weight:700}._priceOriginal_8c2od_175{font-size:12px;color:#000;text-decoration:line-through;font-weight:600}._finalPrice_8c2od_189{font-weight:700;font-size:20px}._finalPrice_8c2od_189._withPromotion_8c2od_139{color:#ff3b00}._originalPrice_8c2od_207{font-size:14px;color:#9ca3af;text-decoration:line-through;font-weight:400}._brand_8c2od_221{font-weight:500;color:#666569;font-size:14px}._ProductTitle_8c2od_233{font-size:14px;color:#000;font-weight:500;cursor:pointer;text-align:start;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;line-height:1.4}._couponBadge_8c2od_261{display:flex;align-items:center;font-size:12px;color:#1aa573;font-weight:500;gap:2px;text-align:start}._discountChipCoupon_8c2od_281{background:#f6fcf8;color:#18a573}._discountChipPromotion_8c2od_291,._discountChipPriceDrop_8c2od_293{background:#fff6f2;color:#ff3b00}._myloContainer_8c2od_303{display:flex;align-items:flex-end;gap:4px;flex-wrap:wrap}._myloText_8c2od_317{font-size:10px;font-weight:500;color:#000}._myloIcon_8c2od_329{height:12px;width:auto}._myloSkeleton_8c2od_339{width:100%;height:16px}._container_8c2od_351 *{user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}._container_8c2od_351 img{pointer-events:none;-webkit-user-drag:none}._container_8c2od_351{display:flex;flex-direction:column;gap:24px;position:relative;align-items:center}._carousel_8c2od_391{width:100%;padding:24px;background:#f9f9fa;position:relative;border-radius:16px}@media (max-width: 639px){._carousel_8c2od_391{border-radius:0;padding:16px}}._carouselContent_8c2od_421{gap:16px}._carouselItem_8c2od_429{flex:0 0 calc(20% - 12.8px);cursor:pointer}@media (max-width: 1023px){._carouselItem_8c2od_429{flex:0 0 calc(33.333% - 10.667px)}}@media (max-width: 639px){._carouselItem_8c2od_429{flex:0 0 calc(66.666% - 8px)}}._navButtonNext_8c2od_467,._navButtonPrev_8c2od_469{width:44px;height:44px;display:flex;align-items:center;justify-content:center;cursor:pointer;background-color:#faf9fa;border:4px solid #fff;transform:translateY(-50%)}[dir=rtl] ._navButtonNext_8c2od_467,[dir=rtl] ._navButtonPrev_8c2od_469{transform:translateY(-50%) scaleX(-1)}._navButtonPrev_8c2od_469{inset-inline-start:8px}._navButtonNext_8c2od_467{inset-inline-end:8px}._navButtonPrevIcon_8c2od_521,._navButtonNextIcon_8c2od_523{width:20px;height:20px}@media (max-width: 1023px){._navButtonPrev_8c2od_469,._navButtonNext_8c2od_467{display:none}}._paginationContainer_8c2od_549{position:static;transform:none}._paginationDot_8c2od_559{background:#e2e2e2;width:4px;height:4px}._paginationActiveDot_8c2od_571{background:#000}._card_15xcs_1{background-color:#fff;padding:16px;display:flex;flex-direction:column;gap:12px}._imageSkeleton_15xcs_17,._titleSkeleton_15xcs_19,._descriptionSkeleton_15xcs_21,._priceSkeleton_15xcs_23,._buttonSkeleton_15xcs_25{border-radius:8px}._imageSkeleton_15xcs_17{width:100%;aspect-ratio:1 / 1}._titleSkeleton_15xcs_19{width:70%;height:30px}._descriptionSkeleton_15xcs_21{width:100%;height:60px}._priceSkeleton_15xcs_23{width:100%;height:24px}._buttonSkeleton_15xcs_25{width:100%;height:12px}._container_gnnm8_1{display:flex;flex-direction:column;gap:24px}._header_gnnm8_13{padding-left:12px;padding-right:12px;display:flex;justify-content:space-between}._titleSkeleton_gnnm8_27{height:32px;width:128px}._carouselWrapper_gnnm8_37{display:flex;flex-direction:column;gap:24px}._carouselContainer_gnnm8_49{display:flex;overflow:hidden;gap:16px;align-items:center;padding:16px;background-color:#f5f5f5}._cardWrapper_gnnm8_67{min-width:250px;flex-grow:1}@media (min-width: 639px){._header_gnnm8_13,._carouselWrapper_gnnm8_37{padding-left:40px;padding-right:40px}._carouselContainer_gnnm8_49{padding:24px;border-radius:16px}}
@@ -0,0 +1 @@
1
+ export * from './components/Brandshop/index'