kupos-ui-components-lib 9.6.2 → 9.6.4

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 (41) hide show
  1. package/dist/assets/images/anims/service_list/female_anim.json +1 -0
  2. package/dist/components/ServiceItem/ServiceItemDesktop.d.ts +1 -1
  3. package/dist/components/ServiceItem/ServiceItemDesktop.js +7 -3
  4. package/dist/components/ServiceItem/ServiceItemMobile.js +9 -6
  5. package/dist/components/ServiceItem/mobileTypes.d.ts +5 -0
  6. package/dist/components/ServiceItem/types.d.ts +7 -3
  7. package/dist/styles.css +2 -2
  8. package/dist/types.d.ts +1 -0
  9. package/dist/ui/BottomAmenities/BottomAmenities.d.ts +2 -0
  10. package/dist/ui/BottomAmenities/BottomAmenities.js +4 -0
  11. package/dist/ui/FemaleBlock.d.ts +9 -0
  12. package/dist/ui/FemaleBlock.js +19 -0
  13. package/dist/ui/OfferBanner.d.ts +2 -1
  14. package/dist/ui/OfferBanner.js +17 -6
  15. package/dist/ui/SeatSection/SeatSection.d.ts +2 -1
  16. package/dist/ui/SeatSection/SeatSection.js +33 -15
  17. package/dist/ui/mobileweb/BottomAmenitiesMobile.d.ts +4 -1
  18. package/dist/ui/mobileweb/BottomAmenitiesMobile.js +8 -1
  19. package/dist/ui/mobileweb/DateTimeSectionMobile.d.ts +2 -1
  20. package/dist/ui/mobileweb/DateTimeSectionMobile.js +2 -2
  21. package/dist/ui/mobileweb/ExpandedDropdownMobile.d.ts +3 -1
  22. package/dist/ui/mobileweb/ExpandedDropdownMobile.js +8 -1
  23. package/dist/ui/mobileweb/SeatSectionMobile.d.ts +2 -1
  24. package/dist/ui/mobileweb/SeatSectionMobile.js +30 -18
  25. package/dist/utils/CommonService.js +4 -2
  26. package/package.json +1 -1
  27. package/src/assets/images/anims/service_list/female_anim.json +1 -0
  28. package/src/components/ServiceItem/ServiceItemDesktop.tsx +7 -0
  29. package/src/components/ServiceItem/ServiceItemMobile.tsx +11 -71
  30. package/src/components/ServiceItem/mobileTypes.ts +5 -0
  31. package/src/components/ServiceItem/types.ts +7 -3
  32. package/src/types.ts +1 -0
  33. package/src/ui/BottomAmenities/BottomAmenities.tsx +14 -0
  34. package/src/ui/FemaleBlock.tsx +45 -0
  35. package/src/ui/OfferBanner.tsx +24 -6
  36. package/src/ui/SeatSection/SeatSection.tsx +38 -14
  37. package/src/ui/mobileweb/BottomAmenitiesMobile.tsx +27 -0
  38. package/src/ui/mobileweb/DateTimeSectionMobile.tsx +3 -0
  39. package/src/ui/mobileweb/ExpandedDropdownMobile.tsx +15 -0
  40. package/src/ui/mobileweb/SeatSectionMobile.tsx +41 -31
  41. package/src/utils/CommonService.ts +7 -2
@@ -11,6 +11,8 @@ interface ExpandedDropdownMobileProps {
11
11
  petFriendlyAnim?: any;
12
12
  isSoldOut?: boolean;
13
13
  isChangeTicket?: boolean;
14
+ ladiesBookedSeats?: string;
15
+ isDpEnabled?: boolean;
14
16
  }
15
- declare function ExpandedDropdownMobile({ serviceItem, isPeru, petSeatInfo, petFriendlyAnim, isSoldOut, isChangeTicket, }: ExpandedDropdownMobileProps): React.ReactElement;
17
+ declare function ExpandedDropdownMobile({ serviceItem, isPeru, petSeatInfo, petFriendlyAnim, isSoldOut, isChangeTicket, ladiesBookedSeats, isDpEnabled, }: ExpandedDropdownMobileProps): React.ReactElement;
16
18
  export default ExpandedDropdownMobile;
@@ -1,6 +1,6 @@
1
1
  import React from "react";
2
2
  import LottiePlayer from "../../assets/LottiePlayer";
3
- function ExpandedDropdownMobile({ serviceItem, isPeru, petSeatInfo, petFriendlyAnim, isSoldOut, isChangeTicket = false, }) {
3
+ function ExpandedDropdownMobile({ serviceItem, isPeru, petSeatInfo, petFriendlyAnim, isSoldOut, isChangeTicket = false, ladiesBookedSeats, isDpEnabled, }) {
4
4
  return (React.createElement("div", { className: "px-[12px] pt-[22px] pb-[12px] relative -z-9", style: {
5
5
  backgroundColor: "#ffefef",
6
6
  borderRadius: "0 0 14px 14px",
@@ -24,6 +24,13 @@ function ExpandedDropdownMobile({ serviceItem, isPeru, petSeatInfo, petFriendlyA
24
24
  React.createElement("span", null,
25
25
  React.createElement("span", { className: "bold-text" }, "Pasaje flexible:"),
26
26
  " Esta empresa no permite cambios de pasajes")))),
27
+ ladiesBookedSeats &&
28
+ String(ladiesBookedSeats).trim() !== "" &&
29
+ isDpEnabled === true && (React.createElement("div", { className: "flex gap-[6px]" },
30
+ React.createElement("span", { style: { marginTop: "2px" } }, "\u2022"),
31
+ React.createElement("span", null,
32
+ React.createElement("span", { className: "bold-text" }, "Asientos para damas:"),
33
+ " Esta empresa cuenta con asientos recomendados para mujeres."))),
27
34
  petSeatInfo && Object.keys(petSeatInfo).length > 0 ? (React.createElement("div", { className: "flex items-center" },
28
35
  React.createElement("div", { className: `relative group cursor-default ` },
29
36
  React.createElement("div", { className: "flex items-center" },
@@ -15,6 +15,7 @@ interface SeatSectionMobileProps {
15
15
  serviceItem?: any;
16
16
  tooltipBgColor?: string;
17
17
  showLastSeats?: boolean;
18
+ discountSeatPriceColor?: string;
18
19
  }
19
- declare function SeatSectionMobile({ seatTypes: seatTypesData, isSoldOut, isPeru, seatPriceColor, currencySign, availableSeats, removeDuplicateSeats, serviceItem, tooltipBgColor, showLastSeats, }: SeatSectionMobileProps): React.ReactElement;
20
+ declare function SeatSectionMobile({ seatTypes: seatTypesData, isSoldOut, isPeru, seatPriceColor, currencySign, availableSeats, removeDuplicateSeats, serviceItem, tooltipBgColor, showLastSeats, discountSeatPriceColor, }: SeatSectionMobileProps): React.ReactElement;
20
21
  export default SeatSectionMobile;
@@ -42,7 +42,7 @@ const getUniqueSeats = (data, limit) => {
42
42
  .sort((a, b) => a.fare - b.fare)
43
43
  .slice(0, limit);
44
44
  };
45
- function SeatSectionMobile({ seatTypes: seatTypesData, isSoldOut, isPeru, seatPriceColor, currencySign, availableSeats, removeDuplicateSeats, serviceItem, tooltipBgColor, showLastSeats, }) {
45
+ function SeatSectionMobile({ seatTypes: seatTypesData, isSoldOut, isPeru, seatPriceColor, currencySign, availableSeats, removeDuplicateSeats, serviceItem, tooltipBgColor, showLastSeats, discountSeatPriceColor, }) {
46
46
  var _a, _b, _c, _d, _e, _f, _g, _h, _j;
47
47
  const hasMultipleTypes = ((_a = seatTypesData === null || seatTypesData === void 0 ? void 0 : seatTypesData.length) !== null && _a !== void 0 ? _a : 0) > 2;
48
48
  const getFare = (fare) => {
@@ -97,10 +97,6 @@ function SeatSectionMobile({ seatTypes: seatTypesData, isSoldOut, isPeru, seatPr
97
97
  React.createElement("span", { className: "flex items-center gap-[4px] min-[420]:text-[13px] text-[14px] bold-text", style: { color: priceColor } },
98
98
  ((_a = serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.icons) === null || _a === void 0 ? void 0 : _a.fireIcon) ? (React.createElement("img", { src: serviceItem.icons.fireIcon, alt: "dp", className: "h-[14px] w-[14px] object-contain", style: { filter: isSoldOut ? "grayscale(1)" : "" } })) : null,
99
99
  commonService.currency(discountedPrice, currencySign))),
100
- showLastSeats ? (React.createElement("div", { className: "flex justify-end" }, (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.available_seats) < 10 &&
101
- (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.available_seats) > 0 && (React.createElement("div", { className: "text-[10px] text-center mt-[3px]", style: {
102
- color: tooltipBgColor,
103
- } }, "\u00A1\u00DAltimos Asientos!")))) : null,
104
100
  isSoldOut ? (React.createElement("div", { className: "flex justify-end" },
105
101
  React.createElement("span", { className: "min-[420]:text-[13px] text-[12px] text-[#464647]", style: { opacity: isSoldOut ? 0.5 : 1 } }, "Agotado"))) : null));
106
102
  };
@@ -129,17 +125,29 @@ function SeatSectionMobile({ seatTypes: seatTypesData, isSoldOut, isPeru, seatPr
129
125
  : discountedSeats === null || discountedSeats === void 0 ? void 0 : discountedSeats.some((s) => s.originalPrice !== s.discountedPrice);
130
126
  const discountSeat = isPeru && peruDiscountCalc
131
127
  ? Object.assign({ label: "", fare: peruLowestFare }, peruDiscountCalc) : (_d = discountedSeats === null || discountedSeats === void 0 ? void 0 : discountedSeats.filter((seat) => !EXCEPTIONS.includes(seat.label))) === null || _d === void 0 ? void 0 : _d.sort((a, b) => a.discountedPrice - b.discountedPrice)[0];
132
- const discountValue = (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.discount_type) === "percentage" &&
133
- typeof (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.discount_value) === "number"
134
- ? Math.round(serviceItem.discount_value)
135
- : null;
136
- const originalDpPrice = Array.isArray(serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.original_dp_price)
137
- ? serviceItem.original_dp_price[0]
138
- : Object.values((serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.original_dp_price) || {})[0];
139
- const dpDiscountPercent = Array.isArray(serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.dp_discount_percents)
140
- ? serviceItem.dp_discount_percents[0]
141
- : Object.values((serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.dp_discount_percents) || {})[0];
142
- const firstSeatFare = (_f = (_e = seatTypesData === null || seatTypesData === void 0 ? void 0 : seatTypesData.filter((item) => getFilteredSeats(item.label) && !EXCEPTIONS.includes(item.label))) === null || _e === void 0 ? void 0 : _e[0]) === null || _f === void 0 ? void 0 : _f.fare;
128
+ const discountValue = (() => {
129
+ if ((serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.discount_type) === "percentage" &&
130
+ typeof (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.discount_value) === "number") {
131
+ return Math.round(serviceItem.discount_value);
132
+ }
133
+ if ((serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.discount_type) === "fixed" && discountSeat) {
134
+ const { originalPrice, discountedPrice } = discountSeat;
135
+ if (originalPrice > 0 && originalPrice !== discountedPrice) {
136
+ return Math.round(((originalPrice - discountedPrice) / originalPrice) * 100);
137
+ }
138
+ }
139
+ return null;
140
+ })();
141
+ const getMinValue = (data) => {
142
+ const vals = (Array.isArray(data) ? data : Object.values(data || {})).map(Number);
143
+ if (!vals.length)
144
+ return undefined;
145
+ const min = Math.min(...vals);
146
+ return isFinite(min) ? min : undefined;
147
+ };
148
+ const originalDpPrice = getMinValue(serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.original_dp_price);
149
+ const dpDiscountPercent = getMinValue(serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.dp_discount_percents);
150
+ const firstSeatFare = (_f = (_e = seatTypesData === null || seatTypesData === void 0 ? void 0 : seatTypesData.filter((item) => getFilteredSeats(item.label) && !EXCEPTIONS.includes(item.label))) === null || _e === void 0 ? void 0 : _e.sort((a, b) => a.fare - b.fare)[0]) === null || _f === void 0 ? void 0 : _f.fare;
143
151
  const hasDpDiscount = (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.dp_discounted_seats) &&
144
152
  (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.dp_discount_percents) &&
145
153
  originalDpPrice != null &&
@@ -175,7 +183,9 @@ function SeatSectionMobile({ seatTypes: seatTypesData, isSoldOut, isPeru, seatPr
175
183
  transformOrigin: "center",
176
184
  } })),
177
185
  React.createElement("span", { className: "min-[420]:text-[13px] text-[12px] leading-[24px]", style: { color: isSoldOut ? "#bbb" : "#464647" } }, "Desde"),
178
- React.createElement("span", { className: "flex items-center justify-end gap-[4px] text-[14px] bold-text leading-[24px]", style: { color: isSoldOut ? "#bbb" : "#ff5964" } },
186
+ React.createElement("span", { className: "flex items-center justify-end gap-[4px] text-[14px] bold-text leading-[24px]", style: {
187
+ color: isSoldOut ? "#bbb" : discountSeatPriceColor || "#ff5964",
188
+ } },
179
189
  ((_h = serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.icons) === null || _h === void 0 ? void 0 : _h.fireIcon) ? (React.createElement("img", { src: serviceItem.icons.fireIcon, alt: "discount", className: "h-[16px] w-[16px] object-contain", style: { filter: isSoldOut ? "grayscale" : "" } })) : null,
180
190
  commonService.discountedCurrency(Number(firstSeatFare), currencySign)),
181
191
  isSoldOut ? (React.createElement("span", { className: "col-span-2 min-[420]:text-[13px] text-right text-[12px] text-[#ccc]" }, "Agotado")) : null)) : hasDiscount && discountSeat ? (React.createElement("div", null,
@@ -207,7 +217,9 @@ function SeatSectionMobile({ seatTypes: seatTypesData, isSoldOut, isPeru, seatPr
207
217
  transformOrigin: "center",
208
218
  } })),
209
219
  React.createElement("span", { className: "min-[420]:text-[13px] text-[12px] leading-[24px]", style: { color: isSoldOut ? "#bbb" : "#464647" } }, "Desde"),
210
- React.createElement("span", { className: "flex items-center justify-end gap-[4px] text-[14px] bold-text leading-[24px]", style: { color: isSoldOut ? "#bbb" : "#ff5964" } },
220
+ React.createElement("span", { className: "flex items-center justify-end gap-[4px] text-[14px] bold-text leading-[24px]", style: {
221
+ color: isSoldOut ? "#bbb" : discountSeatPriceColor || "#ff5964",
222
+ } },
211
223
  ((_j = serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.icons) === null || _j === void 0 ? void 0 : _j.fireIcon) ? (React.createElement("img", { src: serviceItem.icons.fireIcon, alt: "discount", className: "h-[16px] w-[16px] object-contain", style: { opacity: isSoldOut ? 0.5 : 1 } })) : null,
212
224
  commonService.discountedCurrency(discountSeat.discountedPrice, currencySign))))) : (React.createElement("div", { className: "flex flex-col justify-between h-[2.5rem] ", style: {
213
225
  gap: isSoldOut ? "0px" : "5px",
@@ -282,12 +282,14 @@ const commonService = {
282
282
  return { originalPrice: price, discountedPrice: price };
283
283
  }
284
284
  const { discount_type, discount_value, max_discount } = serviceItem;
285
+ const fixedDiscount = discount_type === "fixed" && discount_value != null ? discount_value : 0;
285
286
  const percentageDiscount = discount_type === "percentage" && discount_value != null
286
287
  ? (price * discount_value) / 100
287
288
  : 0;
289
+ const rawDiscount = fixedDiscount || percentageDiscount;
288
290
  const finalDiscount = max_discount != null && max_discount > 0
289
- ? Math.min(percentageDiscount, max_discount)
290
- : percentageDiscount;
291
+ ? Math.min(rawDiscount, max_discount)
292
+ : rawDiscount;
291
293
  const discountedPrice = Math.max(0, price - finalDiscount);
292
294
  return { originalPrice: price, discountedPrice };
293
295
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kupos-ui-components-lib",
3
- "version": "9.6.2",
3
+ "version": "9.6.4",
4
4
  "description": "A reusable UI components package",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -0,0 +1 @@
1
+ {"nm":"Main Scene","h":389.908,"w":378.169,"meta":{"g":"@lottiefiles/creator@1.90.1"},"layers":[{"ty":0,"nm":"Precomp Layer Main Scene_1","sr":1,"st":0,"op":180,"ip":0,"tt":1,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[189,195]},"s":{"a":0,"k":[104.157,104.157]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[189.084,236.954]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"w":378,"h":390,"refId":"precomp_Main Scene_jM9TeYrW1Y_3d99d97a-abbe-4c5f-99bc-d6c3a9ec0397_6ced1adb-81c6-4f2a-81fe-41ec223cce28","ind":1,"tp":2},{"ty":4,"nm":"Ellipse 2","sr":1,"st":0,"op":180,"ip":0,"hasMask":false,"td":1,"ao":0,"ks":{"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[106.977,106.977]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[189.084,194.954]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[{"ty":"el","nm":"Ellipse Shape 1","d":1,"p":{"a":0,"k":[0,0]},"s":{"a":0,"k":[348.546,348.546]}},{"ty":"fl","nm":"Fill","c":{"a":0,"k":[1,0.937,0.937]},"r":1,"o":{"a":0,"k":100}}],"ind":2},{"ty":4,"nm":"Ellipse 1","sr":1,"st":0,"op":180,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[106.977,106.977]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[189.084,194.954]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[{"ty":"el","nm":"Ellipse Shape 1","d":1,"p":{"a":0,"k":[0,0]},"s":{"a":0,"k":[348.546,348.546]}},{"ty":"fl","nm":"Fill","c":{"a":0,"k":[1,0.937,0.937]},"r":1,"o":{"a":0,"k":100}}],"ind":3},{"ty":0,"nm":"Nested Scene 2","sr":1,"st":0,"op":0,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"w":378,"h":390,"refId":"precomp_newScene_pAg4ss2wXg_138db0d9-ba9c-43eb-990d-ed6033f0b644_471ef448-e667-4911-b181-2b927ec28255","ind":4}],"v":"5.7.0","fr":60,"op":180,"ip":0,"assets":[{"nm":"Nested Scene 1","id":"precomp_newScene_eEKvnUyRwM_1e5c472e-e670-4951-b2be-c78f3b3c23a8_936e2ff8-1715-4d83-ac9b-e003a62870fb","fr":60,"layers":[]},{"nm":"Nested Scene 2","id":"precomp_newScene_pAg4ss2wXg_138db0d9-ba9c-43eb-990d-ed6033f0b644_471ef448-e667-4911-b181-2b927ec28255","fr":60,"layers":[]},{"nm":"Main Scene_1","id":"precomp_Main Scene_jM9TeYrW1Y_3d99d97a-abbe-4c5f-99bc-d6c3a9ec0397_6ced1adb-81c6-4f2a-81fe-41ec223cce28","fr":60,"layers":[{"ty":3,"nm":"Main Stroke width - Color Ctrl","sr":1,"st":0,"op":180,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[50,50,0]},"s":{"a":0,"k":[100,100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[0,0,0]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":0}},"ef":[{"ty":5,"nm":"Stroke width","en":1,"ef":[{"ty":0,"nm":"Slider","v":{"a":0,"k":16}}]},{"ty":5,"nm":"Highlight width","en":1,"ef":[{"ty":0,"nm":"Slider","v":{"a":0,"k":18}}]},{"ty":5,"nm":"Base Color","en":1,"ef":[{"ty":2,"nm":"Color","v":{"a":0,"k":[1,0.361,0.377]}}]},{"ty":5,"nm":"Highlight","en":1,"ef":[{"ty":2,"nm":"Color","v":{"a":0,"k":[1,0.361,0.377]}}]}],"ind":1,"parent":8},{"ty":4,"nm":"bubble","sr":1,"st":0,"op":10798.799,"ip":0,"hd":true,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[272.075,245.691,0]},"s":{"a":0,"k":[100,100,100]},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[272.207,146.933],"t":0},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[307.207,110.933],"t":57.018,"ti":[0,0,0],"to":[0,0,0]},{"s":[272.207,146.933],"t":123.158}]},"r":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.489,"y":1},"s":[0],"t":6.842},{"o":{"x":0.494,"y":0},"i":{"x":0.519,"y":1},"s":[-16.557],"t":41.93},{"o":{"x":0.547,"y":0},"i":{"x":0.551,"y":1},"s":[8.915],"t":77.018},{"o":{"x":0.385,"y":0},"i":{"x":0.43,"y":1.633},"s":[-3.821],"t":103.334},{"s":[0],"t":130}]},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[{"ty":"gr","nm":"Group 1","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[44.97,0],[0,-44.97],[-12.308,-14.265],[0,0],[0,0],[-10.847,0],[0,44.969]],"o":[[-44.97,0],[0,20.319],[0,0],[0,0],[9.464,3.85],[44.97,0],[0,-44.97]],"v":[[0,-83.691],[-81.425,-2.266],[-61.672,50.898],[-68.116,83.691],[-30.66,73.182],[0,79.158],[81.425,-2.266]]}}},{"ty":"st","nm":"Stroke 1","lc":1,"lj":2,"ml":1,"o":{"a":0,"k":100},"w":{"a":0,"k":14},"c":{"a":0,"k":[1,0.361,0.377]}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[340.075,162.191]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 2","it":[{"ty":"gr","nm":"Group 2","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[328.207,192.589],[351.944,192.589]]}}},{"ty":"st","nm":"Stroke 1","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":100},"w":{"a":0,"k":14},"c":{"a":0,"k":[1,0.361,0.377]}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 3","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[340.075,169.05],[340.075,206.849]]}}},{"ty":"st","nm":"Stroke 1","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":100},"w":{"a":0,"k":14},"c":{"a":0,"k":[1,0.361,0.377]}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 4","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-15.567],[15.641,0],[0,15.567],[-15.641,0]],"o":[[0,15.567],[-15.641,0],[0,-15.567],[15.641,0]],"v":[[28.321,0],[0,28.187],[-28.321,0],[0,-28.187]]}}},{"ty":"st","nm":"Stroke 1","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":100},"w":{"a":0,"k":14},"c":{"a":0,"k":[1,0.361,0.377]}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[340.075,140.863]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"tr","a":{"a":0,"k":[340.075,141.762]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[340.075,141.762]},"r":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.489,"y":1},"s":[0],"t":11},{"o":{"x":0.494,"y":0},"i":{"x":0.519,"y":1},"s":[-16.557],"t":46.088},{"o":{"x":0.547,"y":0},"i":{"x":0.551,"y":1},"s":[8.915],"t":81.176},{"o":{"x":0.385,"y":0},"i":{"x":0.43,"y":1.633},"s":[-3.821],"t":107.492},{"s":[0],"t":134.158}]},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":2},{"ty":4,"nm":"Head","sr":1,"st":0,"op":10798.799,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[191.364,297.865,0]},"s":{"a":0,"k":[100,100,100]},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[191.514,200.095],"t":0},{"o":{"x":0.333,"y":0},"i":{"x":0.189,"y":1},"s":[191.514,212.095],"t":30,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.651,"y":0},"i":{"x":0.667,"y":1},"s":[191.514,194.095],"t":60,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[191.514,212.095],"t":90,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[191.514,199.095],"t":114,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[191.514,199.095],"t":138.42},{"s":[191.514,202.095],"t":155}]},"r":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.475,"y":1},"s":[0],"t":4.838},{"o":{"x":0.426,"y":0},"i":{"x":0.339,"y":1},"s":[-8],"t":34},{"o":{"x":0.582,"y":0},"i":{"x":0.525,"y":1},"s":[5],"t":64},{"o":{"x":0.603,"y":0},"i":{"x":0.601,"y":1},"s":[-5],"t":94},{"o":{"x":0.422,"y":0},"i":{"x":0.681,"y":1.31},"s":[3],"t":118.193},{"s":[0],"t":142.58}]},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[{"ty":"gr","nm":"Group 1","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[{"c":false,"i":[[0,0],[4.662,4.662]],"o":[[-4.662,4.662],[0,0]],"v":[[8.441,-2.331],[-8.441,-2.331]]}],"t":0},{"o":{"x":0.167,"y":0},"i":{"x":0.667,"y":1},"s":[{"c":false,"i":[[0,0],[2.38,1.849]],"o":[[-2.38,1.849],[0,0]],"v":[[4.308,-0.924],[-4.308,-0.924]]}],"t":60},{"s":[{"c":false,"i":[[0,0],[4.662,4.662]],"o":[[-4.662,4.662],[0,0]],"v":[[8.441,-2.331],[-8.441,-2.331]]}],"t":120}]}},{"ty":"st","nm":"Stroke 1","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":100},"w":{"a":0,"k":11},"c":{"a":0,"k":[1,0.361,0.377]}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[191.364,260.977]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 2","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.157,16.6],[25.37,0],[0,0],[-27.113,0],[0,27.113]],"o":[[-17.187,0],[-15.163,17.991],[0,0],[0,27.113],[27.114,0],[0,0]],"v":[[49.092,-24.529],[14.136,-53.952],[-49.092,-24.529],[-49.092,4.859],[-0.001,53.952],[49.092,4.859]]}}},{"ty":"st","nm":"Stroke 1","lc":1,"lj":2,"ml":1,"o":{"a":0,"k":100},"w":{"a":0,"k":11},"c":{"a":0,"k":[1,0.361,0.377]}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[191.364,243.365]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":3},{"ty":4,"nm":"Head 2","sr":1,"st":0,"op":10798.799,"ip":0,"hasMask":false,"td":1,"ao":0,"ks":{"a":{"a":0,"k":[191.364,297.865,0]},"s":{"a":0,"k":[100,100,100]},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[191.514,199.095],"t":0},{"o":{"x":0.333,"y":0},"i":{"x":0.189,"y":1},"s":[191.514,212.095],"t":30,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.651,"y":0},"i":{"x":0.667,"y":1},"s":[191.514,194.095],"t":60,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[191.514,212.095],"t":90,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[191.514,199.095],"t":114,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[191.514,199.095],"t":138.42},{"s":[191.514,202.095],"t":155}]},"r":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.475,"y":1},"s":[0],"t":4.838},{"o":{"x":0.426,"y":0},"i":{"x":0.339,"y":1},"s":[-8],"t":34},{"o":{"x":0.582,"y":0},"i":{"x":0.525,"y":1},"s":[5],"t":64},{"o":{"x":0.603,"y":0},"i":{"x":0.601,"y":1},"s":[-5],"t":94},{"o":{"x":0.422,"y":0},"i":{"x":0.681,"y":1.31},"s":[3],"t":118.193},{"s":[0],"t":142.58}]},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[{"ty":"gr","nm":"Group 2","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.157,16.6],[25.37,0],[0,0],[-27.113,0],[0,27.113]],"o":[[-17.187,0],[-15.163,17.991],[0,0],[0,27.113],[27.114,0],[0,0]],"v":[[49.092,-24.529],[14.136,-53.952],[-49.092,-24.529],[-49.092,4.859],[-0.001,53.952],[49.092,4.859]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[1,0.361,0.377]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[191.364,243.365]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":4},{"ty":4,"nm":"Body","sr":1,"st":0,"op":10798.799,"ip":0,"tt":2,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[191.364,352.25,0]},"s":{"a":0,"k":[100,100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[191.364,257.295]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[{"ty":"gr","nm":"Group 1","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0],[-12.718,0],[0,12.719],[0,0]],"o":[[0,0],[0,12.719],[12.719,0],[0,0],[0,0]],"v":[[-23.029,-26.591],[-23.029,3.561],[-0.001,26.591],[23.029,3.561],[23.029,-26.591]]}}},{"ty":"st","nm":"Stroke 1","lc":1,"lj":2,"ml":1,"o":{"a":0,"k":100},"w":{"a":0,"k":11},"c":{"a":0,"k":[1,0.361,0.377]}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[191.364,309.591]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 2","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0],[0,-18.119],[0,0],[0,0],[0,0],[17.629,4.186],[0,0]],"o":[[0,0],[-17.63,4.186],[0,0],[0,0],[0,0],[0,-18.119],[0,0],[0,0]],"v":[[-22.669,-52.154],[-82.788,-37.88],[-112.864,0.172],[-113.136,75.974],[114.717,76.586],[112.864,0.172],[82.789,-37.88],[22.669,-52.154]]}}},{"ty":"st","nm":"Stroke 1","lc":1,"lj":2,"ml":1,"o":{"a":0,"k":100},"w":{"a":0,"k":11},"c":{"a":0,"k":[1,0.361,0.377]}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[191.364,369.345]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":5,"tp":4},{"ty":4,"nm":"Mask","sr":1,"st":0,"op":10798.799,"ip":0,"hasMask":false,"td":1,"ao":0,"ks":{"a":{"a":0,"k":[250.066,250.098,0]},"s":{"a":0,"k":[100,100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[250.066,154.143]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[{"ty":"gr","nm":"Body 2","it":[{"ty":"gr","nm":"Group 2","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[{"c":false,"i":[[0,0],[0,0],[0,-18.119],[0,0],[0,0],[0,0],[17.629,4.186],[0,0]],"o":[[0,0],[-17.63,4.186],[0,0],[0,0],[0,0],[0,-18.119],[0,0],[0,0]],"v":[[-22.669,-52.154],[-82.788,-37.88],[-112.864,0.172],[-112.864,52.155],[112.864,52.155],[112.864,0.172],[82.789,-37.88],[22.669,-52.154]]}],"t":0},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[{"c":false,"i":[[0,0],[0,0],[0,-18.119],[0,0],[0,0],[0,0],[17.629,4.186],[0,0]],"o":[[0,0],[-17.63,4.186],[0,0],[0,0],[0,0],[0,-18.119],[0,0],[0,0]],"v":[[-22.669,-52.154],[-82.652,-46.38],[-112.728,-8.328],[-112.864,52.155],[112.864,52.155],[113,-8.328],[82.925,-46.38],[22.669,-52.154]]}],"t":30},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[{"c":false,"i":[[0,0],[0,0],[0,-18.119],[0,0],[0,0],[0,0],[17.629,4.186],[0,0]],"o":[[0,0],[-17.63,4.186],[0,0],[0,0],[0,0],[0,-18.119],[0,0],[0,0]],"v":[[-22.669,-52.154],[-82.788,-37.88],[-112.864,0.172],[-112.864,52.155],[112.864,52.155],[112.864,0.172],[82.789,-37.88],[22.669,-52.154]]}],"t":60},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[{"c":false,"i":[[0,0],[0,0],[0,-18.119],[0,0],[0,0],[0,0],[17.629,4.186],[0,0]],"o":[[0,0],[-17.63,4.186],[0,0],[0,0],[0,0],[0,-18.119],[0,0],[0,0]],"v":[[-22.669,-52.154],[-82.652,-46.38],[-112.728,-8.328],[-112.864,52.155],[112.864,52.155],[113,-8.328],[82.925,-46.38],[22.669,-52.154]]}],"t":90},{"s":[{"c":false,"i":[[0,0],[0,0],[0,-18.119],[0,0],[0,0],[0,0],[17.629,4.186],[0,0]],"o":[[0,0],[-17.63,4.186],[0,0],[0,0],[0,0],[0,-18.119],[0,0],[0,0]],"v":[[-22.669,-52.154],[-82.788,-37.88],[-112.864,0.172],[-112.864,52.155],[112.864,52.155],[112.864,0.172],[82.789,-37.88],[22.669,-52.154]]}],"t":120}]}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[1,0.361,0.377]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[191.364,369.345]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"tr","a":{"a":0,"k":[191.364,352.25]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[191.364,352.25]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":6},{"ty":4,"nm":"Hair","sr":1,"st":0,"op":10798.799,"ip":0,"tt":2,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[191.364,175.258,0]},"s":{"a":0,"k":[100,100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[191.364,179.258]},"r":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.475,"y":1},"s":[0],"t":16},{"o":{"x":0.426,"y":0},"i":{"x":0.339,"y":1},"s":[-8],"t":45.162},{"o":{"x":0.582,"y":0},"i":{"x":0.525,"y":1},"s":[5],"t":75.162},{"o":{"x":0.603,"y":0},"i":{"x":0.601,"y":1},"s":[-5],"t":105.162},{"o":{"x":0.422,"y":0},"i":{"x":0.681,"y":1.31},"s":[3],"t":129.355},{"s":[0],"t":153.742}]},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[{"ty":"gr","nm":"Group 1","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[60.022,27.729],[0,13.706],[-3.82,6.033],[0,0],[0,20.738],[-47.742,0],[0,-47.741],[-11.095,-17.52],[0,0],[0,-7.141],[10.939,-6.599]],"o":[[-10.939,-6.599],[0,-7.141],[0,0],[11.095,-17.52],[0,-47.741],[47.741,0],[0,20.738],[0,0],[3.821,6.033],[0,13.706],[-60.022,27.729]],"v":[[-94.604,87.706],[-112.864,55.413],[-107.015,35.244],[-103.428,29.579],[-86.443,-28.992],[0.001,-115.436],[86.444,-28.992],[103.428,29.579],[107.016,35.244],[112.865,55.413],[94.604,87.706]]}}},{"ty":"st","nm":"Stroke 1","lc":1,"lj":2,"ml":1,"o":{"a":0,"k":100},"w":{"a":0,"k":11},"c":{"a":0,"k":[1,0.361,0.377]}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[191.364,248.725]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":7,"parent":3,"tp":6},{"ty":3,"nm":"Zero | troke width - Color Ctrl","sr":1,"st":0,"op":180,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[250,151.045]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":0}},"ind":8}]}]}
@@ -26,6 +26,7 @@ import opsitesPriorityStageAnimation from "../../assets/images/anims/service_lis
26
26
  import bombAnimation from "../../assets/images/anims/service_list/bomb.json";
27
27
  import dotAnimation from "../../assets/images/anims/service_list/dot_animation.json";
28
28
  import starAnimation from "../../assets/images/anims/service_list/star_anim.json";
29
+ import femaleAnimation from "../../assets/images/anims/service_list/female_anim.json";
29
30
 
30
31
  import RatingBlock from "../../ui/RatingBlock";
31
32
  import DurationBlock from "../../ui/DurationBlock";
@@ -76,6 +77,9 @@ const ANIMATION_MAP: Record<string, Record<string, any>> = {
76
77
  starAnimation: {
77
78
  kupos: starAnimation,
78
79
  },
80
+ femaaleAnimation: {
81
+ kupos: femaleAnimation,
82
+ },
79
83
  };
80
84
 
81
85
  function ServiceItemPB({
@@ -111,6 +115,7 @@ function ServiceItemPB({
111
115
  viewersConfig,
112
116
  showLoginModal,
113
117
  isLoggedIn,
118
+ showLoginOption
114
119
  }: ServiceItemProps & { currencySign?: string }): React.ReactElement {
115
120
  const getAnimationIcon = (icon: string) => {
116
121
  const animation = ANIMATION_MAP[icon];
@@ -430,6 +435,7 @@ function ServiceItemPB({
430
435
  showLoginModal={showLoginModal}
431
436
  viewersConfig={viewersConfig}
432
437
  getAnimationIcon={getAnimationIcon}
438
+ showLoginOption={showLoginOption}
433
439
  />
434
440
  )}
435
441
  <div
@@ -518,6 +524,7 @@ function ServiceItemPB({
518
524
  removeDuplicateSeats={removeDuplicateSeats}
519
525
  isPeru={isPeru}
520
526
  renderIcon={renderIcon}
527
+ discountSeatPriceColor={colors.discountSeatPriceColor}
521
528
  />
522
529
  </div>
523
530
 
@@ -247,6 +247,7 @@ function ServiceItemMobile({
247
247
  removeDuplicateSeats={removeDuplicateSeats}
248
248
  serviceItem={serviceItem}
249
249
  showLastSeats={showLastSeats}
250
+ discountSeatPriceColor={colors.discountSeatPriceColor}
250
251
  />
251
252
 
252
253
  {hasDiscount && (
@@ -269,7 +270,7 @@ function ServiceItemMobile({
269
270
  color: colors.tooltipBgColor,
270
271
  }}
271
272
  >
272
- ¡ Últimos Asientos!
273
+ ¡Últimos Asientos!
273
274
  </div>
274
275
  )}
275
276
  </div>
@@ -302,6 +303,9 @@ function ServiceItemMobile({
302
303
  setIsExpanded(isItemExpanded ? null : serviceItem.id);
303
304
  }}
304
305
  isPeru={isPeru}
306
+ femaleAnim={serviceItem.icons.femaleAnim}
307
+ ladiesBookedSeats={serviceItem.ladies_booked_seats}
308
+ isDpEnabled={serviceItem.is_dp_enabled}
305
309
  />
306
310
  </div>
307
311
 
@@ -332,7 +336,10 @@ function ServiceItemMobile({
332
336
  style={{ lineHeight: 1.6 }}
333
337
  >
334
338
  <div className="flex justify-between items-center">
335
- {serviceItem?.is_dp_enabled ? (
339
+ {serviceItem?.is_dp_enabled &&
340
+ Object.keys(serviceItem?.dp_discount_percents ?? {}).length ===
341
+ 0 &&
342
+ (serviceItem?.dp_discounted_seats ?? []).length === 0 ? (
336
343
  <div className="flex items-center gap-[6px]">
337
344
  {/* {renderIcon("whiteFireIcon", "14px")} */}
338
345
  <LottiePlayer
@@ -414,77 +421,8 @@ function ServiceItemMobile({
414
421
  </span>
415
422
  </span>
416
423
  </div>
417
- {/* <div className="flex items-center">
418
- <span className="whitespace-nowrap">
419
- {serviceItem?.is_dp_enabled ? null : "Quedan pocos • "}
420
- <span
421
- className="bold-text"
422
- ref={(node) =>
423
- commonService.startComprandoCount(node, 4, 16)
424
- }
425
- style={{ fontVariantNumeric: "tabular-nums" }}
426
- />{" "}
427
- comprando
428
- </span>
429
- </div> */}
430
424
  </div>
431
425
  </div>
432
- {/* <div className="flex flex-col gap-[4px]">
433
- <div
434
- className={`flex ${isLongOfferText ? "items-start" : "items-center"}`}
435
- >
436
- <div className={isLongOfferText ? "mt-[2px]" : ""}>
437
- <LottiePlayer
438
- animationData={serviceItem.icons.bombAnim}
439
- width="12px"
440
- height="12px"
441
- />
442
- </div>
443
- <div
444
- className={`ml-[6px] flex-1 outline-none ${isLongOfferText ? "mt-[2px]" : ""}`}
445
- style={{
446
- color: "#fff",
447
- lineHeight: 1.4,
448
- }}
449
- >
450
- <span className="min-[380px]:text-[12px] bold-text">
451
- {serviceItem?.offer_text || ""}
452
- </span>{" "}
453
- <span className="min-[380px]:text-[12px]">|</span>{" "}
454
- <span className="whitespace-nowrap min-[380px]:text-[12px]">
455
- Termina en&nbsp;
456
- <span
457
- className="bold-text"
458
- ref={(node) => commonService.startCountdown(node, 599)}
459
- style={{
460
- fontVariantNumeric: "tabular-nums",
461
- display: "inline-block",
462
- }}
463
- />
464
- </span>
465
- </div>
466
- </div>
467
- <div
468
- className="flex items-start"
469
- style={{
470
- color: "#fff",
471
- }}
472
- >
473
- <div>{renderIcon("personIcon", "16px")}</div>
474
- <span className="flex-1" style={{ lineHeight: 1.4 }}>
475
- <span
476
- className="bold-text"
477
- ref={(node) => commonService.startViewerCount(node, viewersConfig)}
478
- style={{ fontVariantNumeric: "tabular-nums" }}
479
- />{" "}
480
- <span className="bold-text">personas</span>{" "}
481
- <span>
482
- {" "}
483
- {viewersConfig.label || " están viendo este viaje"}
484
- </span>
485
- </span>
486
- </div>
487
- </div> */}
488
426
  </div>
489
427
  </div>
490
428
  )}
@@ -516,6 +454,8 @@ function ServiceItemMobile({
516
454
  petFriendlyAnim={serviceItem.icons.petFriendlyAnim}
517
455
  isSoldOut={isSoldOut}
518
456
  isChangeTicket={serviceItem.is_change_ticket === true}
457
+ ladiesBookedSeats={serviceItem.ladies_booked_seats}
458
+ isDpEnabled={serviceItem.is_dp_enabled}
519
459
  />
520
460
  </div>
521
461
  </div>
@@ -37,11 +37,14 @@ export interface MobileServiceItemProps {
37
37
  change_ticket_hours?: number;
38
38
  duration?: number;
39
39
  train_type_label?: string;
40
+ ladies_booked_seats?: string;
40
41
  is_dp_enabled?: boolean;
41
42
  offer_text?: string;
42
43
  is_direct_trip?: boolean;
43
44
  is_train_type?: boolean;
44
45
  operator_service_name?: string;
46
+ dp_discount_percents?: Record<string, number>;
47
+ dp_discounted_seats?: string[];
45
48
  dep_validation_text?: string;
46
49
  metaData?: {};
47
50
  is_tracking_enabled?: boolean;
@@ -123,6 +126,7 @@ export interface MobileServiceItemProps {
123
126
  fireIcon?: string;
124
127
  directoIcon?: string;
125
128
  whiteFireIcon?: string
129
+ femaleAnim?:string
126
130
  [key: string]: string | Record<string, string | undefined> | undefined;
127
131
  };
128
132
  useLottieFor?: string[];
@@ -171,6 +175,7 @@ export interface MobileServiceItemProps {
171
175
  seatPriceColor?: string;
172
176
  rightGradiantColor?: string;
173
177
  leftGradiantColor?: string;
178
+ discountSeatPriceColor?: string
174
179
  };
175
180
  isCiva?: boolean;
176
181
  currencySign?: string;
@@ -41,15 +41,16 @@ export interface ServiceItemProps {
41
41
  offer_text?: string;
42
42
  is_direct_trip?: boolean;
43
43
  is_dp_enabled?: boolean;
44
- dp_discount_percents?: Record<string, number | string> | Array<number | string>;
45
- dp_discounted_seats?: Array<string | number>;
46
- original_dp_price?: Record<string, number | string> | Array<number | string>;
44
+ dp_discount_percents?: any;
45
+ dp_discounted_seats?: any;
46
+ original_dp_price?: any;
47
47
  discount_type?: string;
48
48
  discount_value?: number;
49
49
  max_discount?: number;
50
50
  is_transpordo?: boolean;
51
51
  is_train_type?: boolean;
52
52
  operator_service_name?: string;
53
+ ladies_booked_seats?: string;
53
54
  dep_validation_text?: string;
54
55
  metaData?: {};
55
56
  is_tracking_enabled?: boolean;
@@ -129,6 +130,7 @@ export interface ServiceItemProps {
129
130
  downArrow?:string
130
131
  personIcon?: string
131
132
  whiteFireIcon?: string
133
+ fireIcon?: string
132
134
 
133
135
  [key: string]: string | Record<string, string | undefined> | undefined;
134
136
  };
@@ -159,6 +161,7 @@ export interface ServiceItemProps {
159
161
  seatPriceColor?: string;
160
162
  rightGradiantColor?: string;
161
163
  leftGradiantColor?: string;
164
+ discountSeatPriceColor?: string
162
165
  };
163
166
  cityOrigin?: { value: number; label: string };
164
167
  cityDestination?: { value: number; label: string };
@@ -222,5 +225,6 @@ export interface ServiceItemProps {
222
225
  };
223
226
  showLoginModal?: any
224
227
  isLoggedIn?: any
228
+ showLoginOption?: boolean
225
229
 
226
230
  }
package/src/types.ts CHANGED
@@ -57,6 +57,7 @@ export interface ServiceItemProps {
57
57
  is_direct_trip?: boolean;
58
58
  is_transpordo?: boolean;
59
59
  is_train_type?: boolean;
60
+ ladies_booked_seats?: any
60
61
  operator_service_name?: string;
61
62
  dep_validation_text?: string;
62
63
  metaData?: {};
@@ -2,6 +2,7 @@ import React from "react";
2
2
  import LottiePlayer from "../../assets/LottiePlayer";
3
3
  import FlexibleBlock from "../FlexibleBlock";
4
4
  import PetBlock from "../PetBlock";
5
+ import FemaleBlock from "../FemaleBlock";
5
6
 
6
7
  interface ItemEntry {
7
8
  key: string;
@@ -15,6 +16,8 @@ interface BottomAmenitiesProps {
15
16
  is_tracking_enabled?: boolean;
16
17
  is_change_ticket?: boolean;
17
18
  pet_seat_info?: Record<string, any>;
19
+ ladies_booked_seats?: any;
20
+ is_dp_enabled?: boolean;
18
21
  };
19
22
  grayscaleClass: string;
20
23
  isSoldOut: boolean;
@@ -86,6 +89,17 @@ function BottomAmenities({
86
89
  isSoldOut={isSoldOut}
87
90
  />
88
91
  )}
92
+ {serviceItem.ladies_booked_seats &&
93
+ String(serviceItem.ladies_booked_seats).trim() !== "" &&
94
+ serviceItem?.is_dp_enabled === true && (
95
+ <FemaleBlock
96
+ translation={translation}
97
+ getAnimationIcon={getAnimationIcon}
98
+ colors={colors}
99
+ serviceItem={serviceItem}
100
+ isSoldOut={isSoldOut}
101
+ />
102
+ )}
89
103
  {hasPetInfo && (
90
104
  <PetBlock
91
105
  translation={translation}
@@ -0,0 +1,45 @@
1
+ import React from "react";
2
+ import LottiePlayer from "../assets/LottiePlayer";
3
+
4
+ const FemaleBlock = ({
5
+ translation,
6
+ getAnimationIcon,
7
+ colors,
8
+ serviceItem,
9
+ isSoldOut,
10
+ }) => (
11
+ <div className="flex items-center">
12
+ <div className="relative group cursor-pointer">
13
+ <div className="flex items-center">
14
+ <div className={`mr-[5px] ${isSoldOut ? "grayscale" : ""}`}>
15
+ <LottiePlayer
16
+ // animationData={serviceItem.icons.flexibleAnim}
17
+ animationData={getAnimationIcon("femaaleAnimation")}
18
+ width="20px"
19
+ height="20px"
20
+ />
21
+ </div>
22
+ {/* <div className="h-auto mr-[4px] text-[13px] text-[#464647]">
23
+ <span>{translation?.flexible}</span>
24
+ </div> */}
25
+ </div>
26
+ <div
27
+ className="hidden group-hover:block absolute top-[24px] left-1/2 -translate-x-1/2 text-white p-3 rounded-[14px] whitespace-normal z-10 mt-2.5 w-[230px] text-center break-normal shadow-service text-[12px]"
28
+ style={{
29
+ backgroundColor: colors.bottomStripColor,
30
+ lineHeight: "1.5",
31
+ zIndex: "1000",
32
+ }}
33
+ >
34
+ {/* Tooltip arrow */}
35
+ <div
36
+ className="tooltip-arrow absolute -top-[7px] left-1/2 -translate-x-1/2 w-0 h-0 border-l-8 border-r-8 border-b-8 border-l-transparent border-r-transparent "
37
+ style={{ borderBottomColor: colors.bottomStripColor }}
38
+ ></div>
39
+ Esta empresa cuenta con asientos recomendados para mujeres.
40
+ </div>
41
+ </div>
42
+ </div>
43
+ );
44
+
45
+ export default FemaleBlock;
@@ -8,13 +8,17 @@ interface OfferBannerProps {
8
8
  isSoldOut: boolean;
9
9
  serviceItem: Pick<
10
10
  ServiceItemProps["serviceItem"],
11
- "is_dp_enabled" | "offer_text"
11
+ | "is_dp_enabled"
12
+ | "offer_text"
13
+ | "dp_discount_percents"
14
+ | "dp_discounted_seats"
12
15
  >;
13
16
  renderIcon: (name: string, size: string) => React.ReactNode;
14
17
  isLoggedIn: any;
15
18
  showLoginModal: any;
16
19
  viewersConfig: ServiceItemProps["viewersConfig"];
17
20
  getAnimationIcon: (name: string) => any;
21
+ showLoginOption?: boolean
18
22
  }
19
23
 
20
24
  const OfferBanner: React.FC<OfferBannerProps> = ({
@@ -26,6 +30,7 @@ const OfferBanner: React.FC<OfferBannerProps> = ({
26
30
  showLoginModal,
27
31
  viewersConfig,
28
32
  getAnimationIcon,
33
+ showLoginOption
29
34
  }) => {
30
35
  return (
31
36
  <div
@@ -38,7 +43,9 @@ const OfferBanner: React.FC<OfferBannerProps> = ({
38
43
  >
39
44
  <div className="flex justify-between items-center w-full">
40
45
  <div className="flex items-center ">
41
- {serviceItem?.is_dp_enabled ? (
46
+ {serviceItem?.is_dp_enabled &&
47
+ Object.keys(serviceItem?.dp_discount_percents ?? {}).length === 0 &&
48
+ (serviceItem?.dp_discounted_seats ?? []).length === 0 ? (
42
49
  <div className="flex items-center gap-[5px]">
43
50
  {/* {renderIcon("whiteFireIcon", "14px")} */}
44
51
  <LottiePlayer
@@ -57,18 +64,24 @@ const OfferBanner: React.FC<OfferBannerProps> = ({
57
64
  height="18px"
58
65
  />
59
66
  <div className="flex items-center mt-[2px]">
60
- <span className="bold-text ml-[6px]">
67
+ <span
68
+ className="bold-text"
69
+ style={{
70
+ marginLeft: serviceItem?.offer_text ? "6px" : "3px",
71
+ }}
72
+ >
61
73
  {(serviceItem?.offer_text || "").length > 30
62
74
  ? (serviceItem?.offer_text || "").slice(0, 30) + "..."
63
75
  : serviceItem?.offer_text || ""}{" "}
64
- {isLoggedIn ? null : (
76
+ {isLoggedIn && showLoginOption ? null : (
65
77
  <span onClick={showLoginModal} className="cursor-pointer">
66
78
  - registro
67
79
  </span>
68
80
  )}{" "}
69
81
  &nbsp;
70
82
  </span>{" "}
71
- | Termina en&nbsp;
83
+ {serviceItem?.offer_text ? "|" : ""}
84
+ Termina en&nbsp;
72
85
  <span
73
86
  className="bold-text text-end"
74
87
  ref={(node) => CommonService.startCountdown(node, 599)}
@@ -102,7 +115,12 @@ const OfferBanner: React.FC<OfferBannerProps> = ({
102
115
  {" "}
103
116
  {viewersConfig?.label || " viendo"} |{" "}
104
117
  <span className="">
105
- {serviceItem?.is_dp_enabled ? null : "Quedan pocos • "}
118
+ {serviceItem?.is_dp_enabled &&
119
+ Object.keys(serviceItem?.dp_discount_percents ?? {}).length ===
120
+ 0 &&
121
+ (serviceItem?.dp_discounted_seats ?? []).length === 0
122
+ ? null
123
+ : "Quedan pocos • "}
106
124
  <span
107
125
  className="bold-text"
108
126
  ref={(node) => CommonService.startComprandoCount(node, 4, 16)}