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