kupos-ui-components-lib 9.0.6 → 9.0.7

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 (38) hide show
  1. package/README copy.md +67 -223
  2. package/dist/assets/images/anims/service_list/directo.json +1 -1
  3. package/dist/assets/images/anims/service_list/priority_stage.json +1 -1
  4. package/dist/components/ServiceItem/RatingHover.js +31 -31
  5. package/dist/components/ServiceItem/ServiceItemDesktop.d.ts +1 -1
  6. package/dist/components/ServiceItem/ServiceItemDesktop.js +263 -125
  7. package/dist/components/ServiceItem/ServiceItemMobile.js +291 -44
  8. package/dist/components/ServiceItem/mobileTypes.d.ts +0 -3
  9. package/dist/components/ServiceItem/types.d.ts +0 -7
  10. package/dist/styles.css +17 -66
  11. package/dist/ui/AmenitiesBlock.js +36 -25
  12. package/dist/ui/DurationBlock.js +2 -2
  13. package/dist/ui/FlexibleBlock.js +4 -2
  14. package/dist/ui/PetBlock.js +3 -1
  15. package/dist/ui/RatingBlock.js +2 -6
  16. package/package.json +1 -1
  17. package/src/assets/images/anims/service_list/directo.json +1 -1
  18. package/src/assets/images/anims/service_list/priority_stage.json +1 -1
  19. package/src/components/ServiceItem/RatingHover.tsx +51 -51
  20. package/src/components/ServiceItem/ServiceItemDesktop.tsx +466 -222
  21. package/src/components/ServiceItem/ServiceItemMobile.tsx +501 -120
  22. package/src/components/ServiceItem/mobileTypes.ts +0 -3
  23. package/src/components/ServiceItem/types.ts +0 -7
  24. package/src/ui/AmenitiesBlock.tsx +15 -34
  25. package/src/ui/DurationBlock.tsx +2 -2
  26. package/src/ui/FlexibleBlock.tsx +3 -3
  27. package/src/ui/PetBlock.tsx +2 -2
  28. package/src/ui/RatingBlock.tsx +4 -16
  29. package/src/assets/images/anims/service_list/bomb.json +0 -1
  30. package/src/ui/BottomAmenities/BottomAmenities.tsx +0 -109
  31. package/src/ui/ExpendedDropDown/ExpandedDropdown.tsx +0 -85
  32. package/src/ui/KuposButton/KuposButton.tsx +0 -48
  33. package/src/ui/SeatSection/SeatSection.tsx +0 -187
  34. package/src/ui/TopAmenities/TopAmenities.tsx +0 -82
  35. package/src/ui/mobileweb/BottomAmenitiesMobile.tsx +0 -168
  36. package/src/ui/mobileweb/DateTimeSectionMobile.tsx +0 -192
  37. package/src/ui/mobileweb/SeatSectionMobile.tsx +0 -256
  38. package/src/ui/mobileweb/TopAmenitieMobile.tsx +0 -82
@@ -5,7 +5,6 @@ import ModalEventManager from "../../utils/ModalEventManager";
5
5
  import InternationalServicePopupBody from "../InternationalServicePopupBody";
6
6
  import LottiePlayer from "../../assets/LottiePlayer";
7
7
  import PeruServiceItemDesktop from "./PeruServiceItemDesktop";
8
- import ExpandedDropdown from "../../ui/ExpendedDropDown/ExpandedDropdown";
9
8
  import promoAnimation from "../../assets/images/anims/service_list/promocion.json";
10
9
  import flexibleAnimation from "../../assets/images/anims/service_list/flexible.json";
11
10
  import locationAnimation from "../../assets/images/anims/service_list/location.json";
@@ -16,72 +15,71 @@ import pullmanFlexibleAnimation from "../../assets/images/anims/service_list/pul
16
15
  import pullmanPetFriendlyAnimation from "../../assets/images/anims/service_list/pullmanPetFriendly.json";
17
16
  import pullmanLocationAnimation from "../../assets/images/anims/service_list/pullmanLocation.json";
18
17
  import pullmanPriorityStageAnimation from "../../assets/images/anims/service_list/pullmanPriorityStage.json";
18
+ import pullmanPromoAnimation from "../../assets/images/anims/service_list/promocion.json";
19
+ import pullmanDirectoAnimation from "../../assets/images/anims/service_list/directo.json";
19
20
  import opsitesFlexibleAnimation from "../../assets/images/anims/service_list/opsitesFlexible.json";
20
21
  import opsitesPetFriendlyAnimation from "../../assets/images/anims/service_list/opsitesPetFriendly.json";
21
22
  import opsitesLocationAnimation from "../../assets/images/anims/service_list/opsitesLocation.json";
22
23
  import opsitesPriorityStageAnimation from "../../assets/images/anims/service_list/opsitesPriorityStage.json";
23
- import bombAnimation from "../../assets/images/anims/service_list/bomb.json";
24
+ import opsitesPromoAnimation from "../../assets/images/anims/service_list/promocion.json";
25
+ import opsitesDirectoAnimation from "../../assets/images/anims/service_list/directo.json";
26
+ import linatalFlexibleAnimation from "../../assets/images/anims/service_list/flexible.json";
27
+ import linatalPromoAnimation from "../../assets/images/anims/service_list/promocion.json";
28
+ import linatalDirectoAnimation from "../../assets/images/anims/service_list/directo.json";
29
+ import linatalPriorityStageAnimation from "../../assets/images/anims/service_list/priority_stage.json";
30
+ import linatalPetFriendlyAnimation from "../../assets/images/anims/service_list/pet_friendly.json";
31
+ import linatalLocationAnimation from "../../assets/images/anims/service_list/location.json";
24
32
  import RatingBlock from "../../ui/RatingBlock";
25
33
  import DurationBlock from "../../ui/DurationBlock";
26
34
  import PetBlock from "../../ui/PetBlock";
27
35
  import FlexibleBlock from "../../ui/FlexibleBlock";
28
36
  import AmenitiesBlock from "../../ui/AmenitiesBlock";
29
37
  import StageTooltip from "../../ui/StagesTooltip";
30
- import KuposButton from "../../ui/KuposButton/KuposButton";
31
- import TopAmenities from "../../ui/TopAmenities/TopAmenities";
32
- import BottomAmenities from "../../ui/BottomAmenities/BottomAmenities";
33
- import SeatSection from "../../ui/SeatSection/SeatSection";
34
38
  const SEAT_EXCEPTIONS = ["Asiento mascota"];
35
- const ANIMATION_MAP = {
36
- promoAnim: {
37
- kupos: promoAnimation,
38
- },
39
- locationAnim: {
40
- kupos: locationAnimation,
41
- pullman: pullmanLocationAnimation,
42
- opsites: opsitesLocationAnimation,
43
- },
44
- directoAnim: {
45
- kupos: directoAnimation,
46
- },
47
- petFriendlyAnim: {
48
- kupos: petFriendlyAnimation,
49
- pullman: pullmanPetFriendlyAnimation,
50
- opsites: opsitesPetFriendlyAnimation,
51
- },
52
- priorityStageAnim: {
53
- kupos: priorityStageAnimation,
54
- pullman: pullmanPriorityStageAnimation,
55
- opsites: opsitesPriorityStageAnimation,
56
- },
57
- flexibleIcon: {
58
- kupos: flexibleAnimation,
59
- pullman: pullmanFlexibleAnimation,
60
- opsites: opsitesFlexibleAnimation,
61
- },
62
- bombAnimation: {
63
- kupos: bombAnimation,
64
- },
65
- };
66
- const convertTo24Hour = (depTime) => {
67
- const hasAM = depTime.includes("AM");
68
- const hasPM = depTime.includes("PM");
69
- const [timePart] = depTime.split(/AM|PM/).map((part) => part.trim());
70
- const [hour, minute] = timePart.split(":").map(Number);
71
- const pad = (n) => (n < 10 ? "0" + n : String(n));
72
- if (hasAM) {
73
- return `${pad(hour === 12 ? 0 : hour)}:${pad(minute)}`;
74
- }
75
- if (hasPM) {
76
- return `${hour === 12 ? hour : hour + 12}:${pad(minute)}`;
77
- }
78
- return timePart;
79
- };
80
- function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, children, busStage, serviceDetailsLoading, cityOrigin, cityDestination, translation, orignLabel, destinationLabel, currencySign, isCiva, showRating, showLastSeats, removeArrivalTime, removeDuplicateSeats, isPeruSites, showAvailableSeats, isSeatIcon, isLinatal, isPeru, t = (key) => key, siteType, isAllinBus, isExpand, setIsExpand, coachKey, }) {
39
+ function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, children, busStage, serviceDetailsLoading, cityOrigin, cityDestination, translation, orignLabel, destinationLabel, currencySign, isCiva, showRating, showLastSeats, removeArrivalTime, removeDuplicateSeats, isPeruSites, showAvailableSeats, isSeatIcon, isLinatal, isPeru, t = (key) => key, siteType, isAllinBus, }) {
81
40
  var _a, _b;
41
+ console.log("🚀 ~ ServiceItemPB ~ serviceItem:", serviceItem);
42
+ const animationMap = {
43
+ promoAnim: {
44
+ kupos: promoAnimation,
45
+ pullman: pullmanPromoAnimation,
46
+ opsites: opsitesPromoAnimation,
47
+ linatal: linatalPromoAnimation,
48
+ },
49
+ locationAnim: {
50
+ kupos: locationAnimation,
51
+ pullman: pullmanLocationAnimation,
52
+ opsites: opsitesLocationAnimation,
53
+ linatal: linatalLocationAnimation,
54
+ },
55
+ directoAnim: {
56
+ kupos: directoAnimation,
57
+ pullman: pullmanDirectoAnimation,
58
+ opsites: opsitesDirectoAnimation,
59
+ linatal: linatalDirectoAnimation,
60
+ },
61
+ petFriendlyAnim: {
62
+ kupos: petFriendlyAnimation,
63
+ pullman: pullmanPetFriendlyAnimation,
64
+ opsites: opsitesPetFriendlyAnimation,
65
+ linatal: linatalPetFriendlyAnimation,
66
+ },
67
+ priorityStageAnim: {
68
+ kupos: priorityStageAnimation,
69
+ pullman: pullmanPriorityStageAnimation,
70
+ opsites: opsitesPriorityStageAnimation,
71
+ linatal: linatalPriorityStageAnimation,
72
+ },
73
+ flexibleIcon: {
74
+ kupos: flexibleAnimation,
75
+ pullman: pullmanFlexibleAnimation,
76
+ opsites: opsitesFlexibleAnimation,
77
+ linatal: linatalFlexibleAnimation,
78
+ },
79
+ };
82
80
  const getAnimationIcon = (icon) => {
83
81
  var _a;
84
- const animation = ANIMATION_MAP[icon];
82
+ const animation = animationMap[icon];
85
83
  if (!animation)
86
84
  return null;
87
85
  return (_a = animation[siteType]) !== null && _a !== void 0 ? _a : animation.kupos;
@@ -100,7 +98,7 @@ function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, child
100
98
  const iconPath = getIconPath();
101
99
  return (React.createElement("img", { src: iconPath, alt: name, style: {
102
100
  filter: color === "white" ? "brightness(0) invert(1)" : "",
103
- }, className: "object-contain w-[16px] h-[16px]" }));
101
+ }, className: `object-contain ${moreAnemities ? "w-[16px] h-[16px]" : "w-[16px] h-[16px]"}` }));
104
102
  };
105
103
  const labelId = typeof serviceItem.boarding_stages === "string"
106
104
  ? serviceItem.boarding_stages.split("|")[0]
@@ -110,22 +108,98 @@ function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, child
110
108
  busStage[labelId].split("|")[1] === "true" &&
111
109
  busStage[labelId].split("|")[0];
112
110
  let isSoldOut = serviceItem.available_seats <= 0;
113
- const showPromo = Math.random() > 0.5;
114
- const isItemExpanded = serviceItem.id === isExpand || isExpand === true;
115
- const grayscaleClass = isSoldOut ? "grayscale" : "";
116
111
  const renderIcon = (iconKey, size = "14px") => {
117
112
  var _a;
118
113
  const iconValue = (_a = serviceItem.icons) === null || _a === void 0 ? void 0 : _a[iconKey];
119
114
  if (iconValue) {
120
115
  if (typeof iconValue === "string") {
121
- return (React.createElement("img", { src: iconValue, alt: iconKey, className: `${`w-[${size}] h-[${size}]`} ` }));
116
+ return (React.createElement("img", { src: iconValue, alt: iconKey, className: `${`w-[${size}] h-[${size}]`} mr-[5px]` }));
122
117
  }
123
118
  }
124
119
  return null;
125
120
  };
121
+ const getAllSeatTypes = () => {
122
+ var _a;
123
+ if (!((_a = serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.seat_types) === null || _a === void 0 ? void 0 : _a.length)) {
124
+ return [{ label: "Salon cama", price: 0 }];
125
+ }
126
+ let seatTypesWithPrices = serviceItem.seat_types
127
+ .filter((item) => getFilteredSeats(item))
128
+ .map((val) => ({
129
+ label: val === null || val === void 0 ? void 0 : val.label,
130
+ price: val === null || val === void 0 ? void 0 : val.fare,
131
+ }));
132
+ seatTypesWithPrices.sort((a, b) => a.price - b.price);
133
+ return seatTypesWithPrices;
134
+ };
135
+ const getSortedSeatTypes = () => {
136
+ var _a;
137
+ if (!((_a = serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.seat_types) === null || _a === void 0 ? void 0 : _a.length)) {
138
+ return [{ label: "Salon cama", price: 0 }];
139
+ }
140
+ let seatTypesWithPrices = getAllSeatTypes();
141
+ const premiumIndex = seatTypesWithPrices.findIndex((item) => item.label === "Premium");
142
+ if (premiumIndex >= 3) {
143
+ seatTypesWithPrices[2] = seatTypesWithPrices[premiumIndex];
144
+ }
145
+ seatTypesWithPrices = seatTypesWithPrices.slice(0, 2);
146
+ return seatTypesWithPrices;
147
+ };
148
+ const getUniqueSeats = () => {
149
+ const allSeatTypes = getAllSeatTypes();
150
+ const seatMap = new Map();
151
+ allSeatTypes.forEach((seat) => {
152
+ if (SEAT_EXCEPTIONS.includes(seat.label))
153
+ return;
154
+ // Only check if the label already exists in the map, don't compare prices
155
+ if (!seatMap.has(seat.label)) {
156
+ seatMap.set(seat.label, seat);
157
+ }
158
+ });
159
+ return Array.from(seatMap.values());
160
+ };
161
+ const getNumberOfSeats = () => {
162
+ return serviceItem.seat_types.filter((val) => !SEAT_EXCEPTIONS.includes(val.label)).length;
163
+ };
164
+ const getSeatNames = () => {
165
+ const uniqueSeats = getUniqueSeats();
166
+ const sortedSeatTypes = getSortedSeatTypes();
167
+ if (removeDuplicateSeats) {
168
+ return uniqueSeats.map((val, key) => SEAT_EXCEPTIONS.includes(val.label) ? null : (React.createElement("span", { key: key, className: `flex items-center justify-between text-[13.33px] ${isSoldOut ? "text-[#c0c0c0]" : ""}` }, typeof val.label === "string" || typeof val.label === "number"
169
+ ? isPeru
170
+ ? CommonService.truncateSeatLabel(val.label)
171
+ : val.label
172
+ : null)));
173
+ }
174
+ return sortedSeatTypes.map((val, key) => SEAT_EXCEPTIONS.includes(val.label) ? null : (React.createElement("span", { key: key, className: `flex items-center justify-between text-[13.33px] ${isSoldOut ? "text-[#c0c0c0]" : ""}` }, typeof val.label === "string" || typeof val.label === "number"
175
+ ? val.label
176
+ : null)));
177
+ };
178
+ const getSeatPrice = () => {
179
+ const sortedSeatTypes = getSortedSeatTypes();
180
+ const uniqueSeats = getUniqueSeats();
181
+ if (removeDuplicateSeats) {
182
+ return uniqueSeats.map((val, key) => (React.createElement("span", { key: key }, (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.available_seats) <= 0
183
+ ? CommonService.currency(0, currencySign)
184
+ : CommonService.currency(val.price, currencySign))));
185
+ }
186
+ return sortedSeatTypes.map((val, key) => {
187
+ return SEAT_EXCEPTIONS.includes(val.label) ? null : (React.createElement("span", { key: key, className: "flex items-center text-[13.33px] bold-text" }, typeof val.price === "string"
188
+ ? (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.available_seats) <= 0
189
+ ? CommonService.currency(0, currencySign)
190
+ : CommonService.currency(val.price, currencySign)
191
+ : typeof val.price === "number"
192
+ ? (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.available_seats) <= 0
193
+ ? CommonService.currency(0, currencySign)
194
+ : CommonService.currency(val.price, currencySign)
195
+ : null));
196
+ });
197
+ };
198
+ const getFilteredSeats = (item) => {
199
+ return item;
200
+ };
126
201
  const checkMidnight = () => {
127
202
  var _a, _b;
128
- setIsExpand(null);
129
203
  if ((cityOrigin === null || cityOrigin === void 0 ? void 0 : cityOrigin.label) &&
130
204
  (cityDestination === null || cityDestination === void 0 ? void 0 : cityDestination.label) &&
131
205
  ((cityOrigin.label.toLowerCase().includes("argentina") &&
@@ -196,33 +270,45 @@ function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, child
196
270
  });
197
271
  return;
198
272
  }
199
- onBookButtonPress();
273
+ else {
274
+ onBookButtonPress();
275
+ }
200
276
  };
201
277
  const depTime = serviceItem.dep_time || "";
278
+ // Extract hours and minutes and check for AM/PM
202
279
  const hasAM = depTime.includes("AM");
203
280
  const hasPM = depTime.includes("PM");
204
- const cleanedDepTime = convertTo24Hour(depTime);
281
+ const [timePart] = depTime.split(/AM|PM/).map((part) => part.trim());
282
+ const [hour, minute] = timePart.split(":").map(Number);
283
+ // Convert to 24-hour format
284
+ let cleanedDepTime;
285
+ if (hasAM) {
286
+ cleanedDepTime =
287
+ hour === 12
288
+ ? `00:${minute < 10 ? "0" + minute : minute}`
289
+ : `${hour < 10 ? "0" + hour : hour}:${minute < 10 ? "0" + minute : minute}`;
290
+ }
291
+ else if (hasPM) {
292
+ cleanedDepTime =
293
+ hour === 12
294
+ ? `${hour}:${minute < 10 ? "0" + minute : minute}`
295
+ : `${hour + 12}:${minute < 10 ? "0" + minute : minute}`;
296
+ }
297
+ else {
298
+ cleanedDepTime = timePart;
299
+ }
205
300
  const items = [
206
301
  {
207
- key: "amenities",
208
- width: "20%",
209
- condition: true,
210
- render: (React.createElement(AmenitiesBlock, { serviceItem: serviceItem, metaData: metaData, isSoldOut: isSoldOut, colors: colors, isPeru: isPeru, getAnimationIcon: getAnimationIcon, getAmenityName: CommonService.getAmenityName, SvgAmenities: SvgAmenities })),
302
+ key: "rating",
303
+ width: "30%",
304
+ render: (React.createElement(RatingBlock, { showRating: showRating, serviceItem: serviceItem, isSoldOut: isSoldOut, colors: colors, t: t, translation: translation })),
211
305
  },
212
306
  {
213
307
  key: "duration",
214
- width: "12%",
308
+ width: "20%",
215
309
  condition: serviceItem.duration,
216
310
  render: (React.createElement(DurationBlock, { serviceItem: serviceItem, translation: translation, renderIcon: renderIcon, isSoldOut: isSoldOut, colors: colors })),
217
311
  },
218
- {
219
- key: "directo",
220
- width: "12%",
221
- condition: serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.is_direct_trip,
222
- render: (React.createElement("div", { className: "flex items-center gap-[10px] text-[12.5px] z-10 mt-[6px]" },
223
- React.createElement(LottiePlayer, { animationData: getAnimationIcon("directoAnim"), width: "14px", height: "14px" }),
224
- React.createElement("div", null, translation === null || translation === void 0 ? void 0 : translation.directService))),
225
- },
226
312
  {
227
313
  key: "pet",
228
314
  width: "20%",
@@ -236,50 +322,35 @@ function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, child
236
322
  condition: serviceItem.is_change_ticket,
237
323
  render: (React.createElement(FlexibleBlock, { translation: translation, getAnimationIcon: getAnimationIcon, colors: colors, serviceItem: serviceItem, isSoldOut: isSoldOut })),
238
324
  },
325
+ {
326
+ key: "amenities",
327
+ width: "20%",
328
+ render: (React.createElement(AmenitiesBlock, { serviceItem: serviceItem, metaData: metaData, isSoldOut: isSoldOut, colors: colors, isPeru: isPeru, getAnimationIcon: getAnimationIcon, getAmenityName: CommonService.getAmenityName, SvgAmenities: SvgAmenities })),
329
+ },
239
330
  ];
240
- const otherItems = items.filter((i) => i.key !== "pet" && i.key !== "flexible" && !!i.condition);
241
- return (React.createElement(React.Fragment, null, isPeruSites ? (React.createElement(PeruServiceItemDesktop, { serviceItem: serviceItem, onBookButtonPress: onBookButtonPress, colors: colors, metaData: metaData, children: children, busStage: busStage, serviceDetailsLoading: serviceDetailsLoading, cityOrigin: cityOrigin, cityDestination: cityDestination, translation: translation, orignLabel: orignLabel, destinationLabel: destinationLabel, currencySign: currencySign, isCiva: isCiva, showRating: showRating, showLastSeats: showLastSeats, removeArrivalTime: removeArrivalTime, removeDuplicateSeats: removeDuplicateSeats, isPeruSites: isPeruSites, t: (key) => t(key), showAvailableSeats: showAvailableSeats, isSeatIcon: isSeatIcon, isPeru: isPeru, siteType: siteType, isAllinBus: isAllinBus })) : (React.createElement("div", { className: `relative ${serviceItem.offer_text ? "mb-[55px]" : "mb-[10px]"} mt-[14px]` },
242
- React.createElement(TopAmenities, { showPromo: showPromo, showTopLabel: showTopLabel, isSoldOut: isSoldOut, priceColor: colors.priceColor, buttonColor: colors.kuposButtonColor, boardingIcon: renderIcon("whiteBoardingIcon", "14px"), getAnimationIcon: getAnimationIcon }),
243
- React.createElement("div", { className: "bg-white mx-auto relative", style: {
244
- border: `1px solid ${colors.priceColor}`,
245
- // showPromo
246
- // ? `1px solid ${colors.priceColor}`
247
- // : "1px solid #ccc",
248
- borderRadius:
249
- // showPromo || showTopLabel ?
250
- "10px 0 10px 10px",
251
- // : "10px",
252
- } },
253
- React.createElement("div", {
254
- // className="p-[15px] pt-[20px]"
255
- className: " pt-[20px]", style: {
256
- padding: coachKey
257
- ? "15px 15px 20px 15px"
258
- : "20px 15px 11px 15px",
259
- } },
260
- React.createElement("div", {
261
- // className="grid text-[#464647] w-full [grid-template-columns:18%_28%_2.5%_28%_15.5%] gap-x-[2%] items-center"
262
- className: "grid text-[#464647] w-full [grid-template-columns:22%_28%_2.5%_24%_15.5%] gap-x-[2%] items-center" },
263
- React.createElement("div", { style: {
264
- display: "flex",
265
- flexDirection: "column",
266
- gap: "5px",
267
- } },
268
- React.createElement("div", {
269
- // className="flex items-center justify-center m-[auto]"
270
- className: "" },
271
- React.createElement("img", { src: serviceItem.operator_details[0], alt: "service logo", className: `h-auto w-[150px] object-contain ${isSoldOut ? "grayscale" : ""}` }),
272
- isCiva ? (React.createElement("div", { className: "text-[13.33px] black-text ml-2" }, serviceItem.operator_details[2])) : null),
273
- React.createElement(RatingBlock, { showRating: showRating, serviceItem: serviceItem, isSoldOut: isSoldOut, colors: colors, t: t, translation: translation })),
331
+ const amenitiesItem = items.find((i) => i.key === "amenities");
332
+ const otherItems = items.filter((i) => i.key !== "amenities" && i.condition !== false);
333
+ return (React.createElement(React.Fragment, null, isPeruSites ? (React.createElement(PeruServiceItemDesktop, { serviceItem: serviceItem, onBookButtonPress: onBookButtonPress, colors: colors, metaData: metaData, children: children, busStage: busStage, serviceDetailsLoading: serviceDetailsLoading, cityOrigin: cityOrigin, cityDestination: cityDestination, translation: translation, orignLabel: orignLabel, destinationLabel: destinationLabel, currencySign: currencySign, isCiva: isCiva, showRating: showRating, showLastSeats: showLastSeats, removeArrivalTime: removeArrivalTime, removeDuplicateSeats: removeDuplicateSeats, isPeruSites: isPeruSites, t: (key) => t(key), showAvailableSeats: showAvailableSeats, isSeatIcon: isSeatIcon, isPeru: isPeru, siteType: siteType, isAllinBus: isAllinBus })) : (React.createElement("div", { className: `relative ${serviceItem.offer_text ? "mb-[55px]" : "mb-[10px]"} ${(serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.is_direct_trip) ||
334
+ (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.train_type_label) === "Tren Express (Nuevo)" ||
335
+ showTopLabel
336
+ ? "mt-[24px]"
337
+ : "mt-[20px]"} ` },
338
+ React.createElement("div", { className: "bg-white rounded-[20px] shadow-service mx-auto relative" },
339
+ React.createElement("div", { className: "p-[15px] pt-[20px]" },
340
+ React.createElement("div", { className: "grid text-[#464647] w-full [grid-template-columns:14%_30%_2.5%_30%_15.5%] gap-x-[2%] items-center", style: { marginTop: showTopLabel ? "8px" : "" } },
341
+ React.createElement("div", { className: "flex items-center justify-center m-[auto]" },
342
+ React.createElement("div", { className: " " },
343
+ React.createElement("img", { src: serviceItem.operator_details[0], alt: "service logo", className: ` h-auto object-contain ${isSoldOut ? "grayscale" : ""}` })),
344
+ isCiva ? (React.createElement("div", { className: "text-[13.33px] black-text ml-2" }, serviceItem.operator_details[2])) : null),
274
345
  React.createElement("div", { className: `min-h-[2.5rem] grid grid-cols-[26px_auto_26%_1fr] gap-x-4 items-center text-[13.33px] ${isSoldOut ? "text-[#c0c0c0]" : ""}`, style: {
275
346
  gridTemplateRows: "1fr",
276
347
  } },
277
348
  React.createElement("div", { className: "flex flex-col gap-[6px]" },
278
349
  orignLabel ? (React.createElement("div", { className: "w-[60px] h-[20px] flex items-center" }, orignLabel)) : (React.createElement("div", { className: "h-[20px] flex items-center" },
279
- React.createElement("img", { src: (_a = serviceItem.icons) === null || _a === void 0 ? void 0 : _a.origin, alt: "origin", className: `w-[16px] h-auto mr-[8px] ${isSoldOut ? "grayscale" : ""}` }))),
350
+ React.createElement("img", { src: (_a = serviceItem.icons) === null || _a === void 0 ? void 0 : _a.origin, alt: "origin", className: `w-[18px] h-auto mr-[8px] ${isSoldOut ? "grayscale" : ""}` }))),
280
351
  !isCiva &&
281
352
  (destinationLabel ? (React.createElement("div", { className: "w-[60px] h-[20px] flex items-center" }, destinationLabel)) : (React.createElement("div", { className: "h-[20px] flex items-center" },
282
- React.createElement("img", { src: (_b = serviceItem.icons) === null || _b === void 0 ? void 0 : _b.destination, className: `w-[16px] h-auto mr-[8px] ${isSoldOut ? "grayscale" : ""}`, style: { opacity: isSoldOut ? 0.5 : 1 } }))))),
353
+ React.createElement("img", { src: (_b = serviceItem.icons) === null || _b === void 0 ? void 0 : _b.destination, className: `w-[18px] h-auto mr-[8px] ${isSoldOut ? "grayscale" : ""}`, style: { opacity: isSoldOut ? 0.5 : 1 } }))))),
283
354
  React.createElement("div", { className: "flex flex-col gap-[6px]" },
284
355
  React.createElement(StageTooltip, { stageData: serviceItem.boarding_stages, direction: 1, terminals: busStage, serviceItem: serviceItem, metaData: metaData, colors: colors },
285
356
  React.createElement("span", { className: "cursor-pointer bold-text capitalize" }, DateService.getServiceItemDate(serviceItem.travel_date))),
@@ -310,25 +381,92 @@ function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, child
310
381
  backgroundColor: "#ccc",
311
382
  } }),
312
383
  React.createElement("div", { className: "content-center" },
313
- React.createElement(SeatSection, { seatTypes: serviceItem.seat_types, availableSeats: serviceItem.available_seats, isSoldOut: isSoldOut, priceColor: colors.priceColor, currencySign: currencySign, removeDuplicateSeats: removeDuplicateSeats, isPeru: isPeru })),
384
+ React.createElement("div", { className: `relative flex gap-[10px] text-[13.33px] justify-between min-h-[2.5rem] ${getNumberOfSeats() < 3 ? "" : ""}`, style: getNumberOfSeats() < 2 || removeDuplicateSeats
385
+ ? { alignItems: "center" }
386
+ : {} },
387
+ React.createElement("div", { className: "flex flex-col justify-between", style: { gap: "10px" } }, getSeatNames()),
388
+ React.createElement("div", { className: "flex flex-col justify-between absolute inset-y-0 right-0 left-1/2 h-full", style: {
389
+ color: isSoldOut ? "#c0c0c0" : colors.priceColor,
390
+ top: 0,
391
+ bottom: 0,
392
+ left: "clamp(60%, 65% + (100vw - 1300px) * 0.1, 65%)",
393
+ // left: "68%",
394
+ right: 0,
395
+ justifyContent: getNumberOfSeats() < 2 || removeDuplicateSeats
396
+ ? "center"
397
+ : "",
398
+ gap: "10px",
399
+ } }, getSeatPrice()))),
314
400
  React.createElement("div", null,
315
- showLastSeats ? (React.createElement("div", { className: "flex justify-end mr-[11px] ", style: {
316
- marginBottom: (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.available_seats) < 10 &&
317
- (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.available_seats) > 0
318
- ? "6px"
319
- : "0",
320
- } }, (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.available_seats) < 10 &&
321
- (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.available_seats) > 0 && (React.createElement("div", { className: "text-[12.5px] text-[#464647] mt-1 text-center" }, "\u00A1 \u00DAltimos Asientos!")))) : null,
322
- React.createElement(KuposButton, { isSoldOut: isSoldOut, isLoading: serviceDetailsLoading, buttonColor: colors.kuposButtonColor, buyLabel: translation === null || translation === void 0 ? void 0 : translation.buyButton, soldOutLabel: translation === null || translation === void 0 ? void 0 : translation.soldOutButton, soldOutIcon: renderIcon("soldOutIcon", "14px"), onClick: checkMidnight }))),
323
- React.createElement(BottomAmenities, { otherItems: otherItems, serviceItem: serviceItem, grayscaleClass: grayscaleClass, isSoldOut: isSoldOut, isItemExpanded: isItemExpanded, colors: colors, translation: translation, getAnimationIcon: getAnimationIcon, downArrowIcon: renderIcon("downArrow", "10px"), onToggleExpand: () => setIsExpand &&
324
- setIsExpand(isItemExpanded ? null : serviceItem.id) }))),
325
- isItemExpanded && (React.createElement(ExpandedDropdown, { serviceItem: serviceItem, showPromo: showPromo, colors: colors, grayscaleClass: grayscaleClass, translation: translation, getAnimationIcon: getAnimationIcon })),
401
+ React.createElement("button", { onClick: () => (!isSoldOut ? checkMidnight() : null), disabled: serviceDetailsLoading, className: `w-full ${serviceDetailsLoading || isSoldOut
402
+ ? "py-[12px]"
403
+ : "py-[12px]"} text-[13.33px] font-bold text-white rounded-[10px] border-none px-[20px] flex items-center justify-center`, style: {
404
+ backgroundColor: serviceDetailsLoading || isSoldOut
405
+ ? "lightgray"
406
+ : colors.kuposButtonColor,
407
+ cursor: serviceDetailsLoading || isSoldOut
408
+ ? "not-allowed"
409
+ : "pointer",
410
+ } },
411
+ React.createElement("span", { className: "min-w-[75px] flex justify-center items-center bold-text uppercase" },
412
+ isSoldOut ? renderIcon("soldOutIcon", "14px") : null,
413
+ serviceDetailsLoading ? (React.createElement("span", { className: "loader-circle" })) : !isSoldOut ? (translation === null || translation === void 0 ? void 0 : translation.buyButton) : (translation === null || translation === void 0 ? void 0 : translation.soldOutButton))))),
414
+ showLastSeats ? (React.createElement("div", { className: "flex justify-end mr-[11px]" }, (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.available_seats) < 10 &&
415
+ (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.available_seats) > 0 && (React.createElement("div", { className: "text-[12px] text-[red] mt-1 text-center" }, "\u00A1 \u00DAltimos Asientos!")))) : null,
416
+ React.createElement("div", { className: "flex items-center mt-[15px] border-t border-[#eee] pt-[10px]" },
417
+ React.createElement("div", { className: "grid items-center gap-[2%] flex-1", style: {
418
+ gridTemplateColumns: "40% 18% 23% 23%",
419
+ // otherItems
420
+ // .map((i) => i.width)
421
+ // .join(" "),
422
+ } }, otherItems.map((item) => (React.createElement("div", { key: item.key, className: "flex items-center " }, item.render)))),
423
+ React.createElement("div", { className: "flex items-center ml-[12px] shrink-0 w-[130px] justify-end" }, amenitiesItem === null || amenitiesItem === void 0 ? void 0 : amenitiesItem.render)))),
326
424
  children,
327
- (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.offer_text) && (React.createElement("div", { className: "text-white p-[10px_15px] text-left w-full flex items-center absolute -bottom-[36px] pt-[50px] -z-10 rounded-b-[14px] text-[14px]", style: {
328
- backgroundColor: colors === null || colors === void 0 ? void 0 : colors.bottomStripColor,
425
+ (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.offer_text) && (React.createElement("div", { className: ` text-white p-[10px_15px] text-left w-full flex items-center absolute -bottom-[36px] pt-[50px] -z-10 rounded-b-[14px] text-[14px]`, style: {
426
+ backgroundColor: isSoldOut
427
+ ? colors === null || colors === void 0 ? void 0 : colors.bottomStripColor
428
+ : colors === null || colors === void 0 ? void 0 : colors.bottomStripColor,
329
429
  opacity: isSoldOut ? 0.5 : 1,
330
430
  } },
331
431
  React.createElement(LottiePlayer, { animationData: getAnimationIcon("promoAnim"), width: "18px", height: "18px" }),
332
- React.createElement("span", { className: "ml-[10px]" }, serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.offer_text)))))));
432
+ React.createElement("span", { className: "ml-[10px]" }, serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.offer_text))),
433
+ React.createElement("div", { className: "absolute -top-[11px] left-0 w-full flex items-center justify-end gap-[12px] pr-[15px] z-10 " },
434
+ showTopLabel && (React.createElement("div", { className: `flex items-center gap-[10px] py-[4px] px-[14px] rounded-[38px] text-[12.5px] z-20`, style: {
435
+ backgroundColor: isSoldOut
436
+ ? "#ddd"
437
+ : colors.ratingBottomColor,
438
+ } },
439
+ React.createElement("div", { className: isSoldOut ? "grayscale" : "" },
440
+ React.createElement(LottiePlayer
441
+ // animationData={serviceItem.icons.priorityStageAnim}
442
+ , {
443
+ // animationData={serviceItem.icons.priorityStageAnim}
444
+ animationData: getAnimationIcon("priorityStageAnim"), width: "14px", height: "14px" })),
445
+ React.createElement("div", { className: isSoldOut ? "text-white" : `text-[${colors.topLabelColor}]` }, showTopLabel))),
446
+ (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.is_transpordo) && (React.createElement("div", { className: `flex items-center gap-[10px] py-[4px] text-white px-[14px] rounded-[38px] text-[12.5px] z-20`, style: {
447
+ backgroundColor: isSoldOut ? "#ddd" : colors.tooltipColor,
448
+ } },
449
+ React.createElement(LottiePlayer, { animationData: serviceItem.icons.connectingServiceIcon,
450
+ // animationData={getAnimationIcon(connectingServiceIcon)}
451
+ width: "14px", height: "14px" }),
452
+ React.createElement("div", null, "Conexión"))),
453
+ (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.is_direct_trip) && (React.createElement("div", { className: `flex items-center gap-[10px] py-[4px] text-white px-[14px] rounded-[38px] text-[12.5px] z-20 `, style: {
454
+ backgroundColor: isSoldOut ? "#ddd" : colors.tooltipColor,
455
+ } },
456
+ React.createElement(LottiePlayer
457
+ // animationData={serviceItem.icons.directoAnim}
458
+ , {
459
+ // animationData={serviceItem.icons.directoAnim}
460
+ animationData: getAnimationIcon("directoAnim"), width: "14px", height: "14px" }),
461
+ React.createElement("div", null, translation === null || translation === void 0 ? void 0 : translation.directService))),
462
+ (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.train_type_label) === "Tren Express (Nuevo)" && (React.createElement("div", { className: `flex items-center gap-[10px] py-[4px] text-white px-[14px] rounded-[38px] text-[12.5px] z-20 `, style: {
463
+ backgroundColor: isSoldOut ? "#ddd" : colors.tooltipColor,
464
+ } },
465
+ React.createElement(LottiePlayer
466
+ // animationData={serviceItem.icons.directoAnim}
467
+ , {
468
+ // animationData={serviceItem.icons.directoAnim}
469
+ animationData: getAnimationIcon("directoAnim"), width: "14px", height: "14px" }),
470
+ React.createElement("div", null, "Tren Express"))))))));
333
471
  }
334
472
  export default ServiceItemPB;