kupos-ui-components-lib 9.1.7 → 9.1.9

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 (54) hide show
  1. package/README copy.md +223 -67
  2. package/dist/components/FilterBar/FilterBarDesktop.js +27 -28
  3. package/dist/components/ServiceItem/PeruServiceItemDesktop.js +1 -1
  4. package/dist/components/ServiceItem/RatingHover.js +61 -56
  5. package/dist/components/ServiceItem/RatingItem.js +3 -22
  6. package/dist/components/ServiceItem/ServiceItemDesktop.d.ts +1 -1
  7. package/dist/components/ServiceItem/ServiceItemDesktop.js +183 -257
  8. package/dist/components/ServiceItem/ServiceItemMobile.d.ts +1 -1
  9. package/dist/components/ServiceItem/ServiceItemMobile.js +145 -287
  10. package/dist/components/ServiceItem/mobileTypes.d.ts +13 -0
  11. package/dist/components/ServiceItem/types.d.ts +15 -0
  12. package/dist/styles.css +202 -49
  13. package/dist/ui/AmenitiesBlock.js +24 -31
  14. package/dist/ui/DurationBlock.js +4 -4
  15. package/dist/ui/FlexibleBlock.js +5 -6
  16. package/dist/ui/PetBlock.js +1 -3
  17. package/dist/ui/RatingBlock.js +6 -2
  18. package/dist/ui/SeatSection/SeatSection.d.ts +2 -1
  19. package/dist/ui/SeatSection/SeatSection.js +24 -7
  20. package/dist/ui/mobileweb/BottomAmenitiesMobile.js +1 -7
  21. package/dist/ui/mobileweb/DateTimeSectionMobile.d.ts +2 -1
  22. package/dist/ui/mobileweb/DateTimeSectionMobile.js +2 -2
  23. package/dist/ui/mobileweb/SeatSectionMobile.d.ts +2 -1
  24. package/dist/ui/mobileweb/SeatSectionMobile.js +18 -8
  25. package/dist/utils/CommonService.d.ts +9 -1
  26. package/dist/utils/CommonService.js +19 -0
  27. package/package.json +2 -1
  28. package/src/assets/images/anims/service_list/bomb.json +1 -0
  29. package/src/components/FilterBar/FilterBarDesktop.tsx +28 -35
  30. package/src/components/ServiceItem/PeruServiceItemDesktop.tsx +1 -0
  31. package/src/components/ServiceItem/RatingHover.tsx +137 -156
  32. package/src/components/ServiceItem/RatingItem.tsx +5 -27
  33. package/src/components/ServiceItem/ServiceItemDesktop.tsx +357 -538
  34. package/src/components/ServiceItem/ServiceItemMobile.tsx +289 -551
  35. package/src/components/ServiceItem/mobileTypes.ts +13 -0
  36. package/src/components/ServiceItem/types.ts +15 -0
  37. package/src/ui/AmenitiesBlock.tsx +51 -30
  38. package/src/ui/BottomAmenities/BottomAmenities.tsx +110 -0
  39. package/src/ui/DateTimeSection/DateTimeSection.tsx +207 -0
  40. package/src/ui/DirectoBlock.tsx +31 -0
  41. package/src/ui/DurationBlock.tsx +4 -4
  42. package/src/ui/ExpendedDropDown/ExpandedDropdown.tsx +103 -0
  43. package/src/ui/FlexibleBlock.tsx +6 -5
  44. package/src/ui/KuposButton/KuposButton.tsx +48 -0
  45. package/src/ui/PetBlock.tsx +2 -2
  46. package/src/ui/RatingBlock.tsx +16 -4
  47. package/src/ui/SeatSection/SeatSection.tsx +263 -0
  48. package/src/ui/TopAmenities/TopAmenities.tsx +127 -0
  49. package/src/ui/mobileweb/BottomAmenitiesMobile.tsx +169 -0
  50. package/src/ui/mobileweb/DateTimeSectionMobile.tsx +195 -0
  51. package/src/ui/mobileweb/ExpandedDropdownMobile.tsx +56 -0
  52. package/src/ui/mobileweb/SeatSectionMobile.tsx +285 -0
  53. package/src/ui/mobileweb/TopAmenitieMobile.tsx +126 -0
  54. package/src/utils/CommonService.ts +36 -0
@@ -1,10 +1,10 @@
1
1
  import React from "react";
2
- import DateService from "../../utils/DateService";
3
2
  import CommonService from "../../utils/CommonService";
4
3
  import ModalEventManager from "../../utils/ModalEventManager";
5
4
  import InternationalServicePopupBody from "../InternationalServicePopupBody";
6
5
  import LottiePlayer from "../../assets/LottiePlayer";
7
6
  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,70 +15,75 @@ 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";
20
18
  import opsitesFlexibleAnimation from "../../assets/images/anims/service_list/opsitesFlexible.json";
21
19
  import opsitesPetFriendlyAnimation from "../../assets/images/anims/service_list/opsitesPetFriendly.json";
22
20
  import opsitesLocationAnimation from "../../assets/images/anims/service_list/opsitesLocation.json";
23
21
  import opsitesPriorityStageAnimation from "../../assets/images/anims/service_list/opsitesPriorityStage.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";
22
+ import bombAnimation from "../../assets/images/anims/service_list/bomb.json";
32
23
  import RatingBlock from "../../ui/RatingBlock";
33
24
  import DurationBlock from "../../ui/DurationBlock";
34
25
  import PetBlock from "../../ui/PetBlock";
35
26
  import FlexibleBlock from "../../ui/FlexibleBlock";
36
27
  import AmenitiesBlock from "../../ui/AmenitiesBlock";
37
- import StageTooltip from "../../ui/StagesTooltip";
28
+ import KuposButton from "../../ui/KuposButton/KuposButton";
29
+ import BottomAmenities from "../../ui/BottomAmenities/BottomAmenities";
30
+ import SeatSection from "../../ui/SeatSection/SeatSection";
31
+ import DateTimeSection from "../../ui/DateTimeSection/DateTimeSection";
38
32
  const SEAT_EXCEPTIONS = ["Asiento mascota"];
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
- },
33
+ const ANIMATION_MAP = {
34
+ promoAnim: {
35
+ kupos: promoAnimation,
36
+ },
37
+ locationAnim: {
38
+ kupos: locationAnimation,
39
+ pullman: pullmanLocationAnimation,
40
+ opsites: opsitesLocationAnimation,
41
+ },
42
+ directoAnim: {
43
+ kupos: directoAnimation,
44
+ },
45
+ petFriendlyAnim: {
46
+ kupos: petFriendlyAnimation,
47
+ pullman: pullmanPetFriendlyAnimation,
48
+ opsites: opsitesPetFriendlyAnimation,
49
+ },
50
+ priorityStageAnim: {
51
+ kupos: priorityStageAnimation,
52
+ pullman: pullmanPriorityStageAnimation,
53
+ opsites: opsitesPriorityStageAnimation,
54
+ },
55
+ flexibleIcon: {
56
+ kupos: flexibleAnimation,
57
+ pullman: pullmanFlexibleAnimation,
58
+ opsites: opsitesFlexibleAnimation,
59
+ },
60
+ bombAnimation: {
61
+ kupos: bombAnimation,
62
+ },
63
+ };
64
+ 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, viewersConfig, }) {
65
+ console.log("🚀 ~ ServiceItemPB ~ serviceItem:", serviceItem);
66
+ const startViewerCount = (node) => {
67
+ if (!node || !viewersConfig)
68
+ return;
69
+ const prevId = node.dataset.viewerId;
70
+ if (prevId)
71
+ clearInterval(Number(prevId));
72
+ const { min, max, interval = 5000 } = viewersConfig;
73
+ const clamp = (v) => Math.min(max, Math.max(min, v));
74
+ const initialValue = Math.floor(Math.random() * (max - min + 1)) + min;
75
+ node.textContent = String(initialValue);
76
+ const id = setInterval(() => {
77
+ const current = Number(node.textContent) || initialValue;
78
+ const delta = Math.ceil(current * 0.2);
79
+ const next = current + Math.floor(Math.random() * (2 * delta + 1)) - delta;
80
+ node.textContent = String(clamp(Math.round(next)));
81
+ }, interval);
82
+ node.dataset.viewerId = String(id);
78
83
  };
79
84
  const getAnimationIcon = (icon) => {
80
85
  var _a;
81
- const animation = animationMap[icon];
86
+ const animation = ANIMATION_MAP[icon];
82
87
  if (!animation)
83
88
  return null;
84
89
  return (_a = animation[siteType]) !== null && _a !== void 0 ? _a : animation.kupos;
@@ -97,7 +102,7 @@ function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, child
97
102
  const iconPath = getIconPath();
98
103
  return (React.createElement("img", { src: iconPath, alt: name, style: {
99
104
  filter: color === "white" ? "brightness(0) invert(1)" : "",
100
- }, className: `object-contain ${moreAnemities ? "w-[16px] h-[16px]" : "w-[16px] h-[16px]"}` }));
105
+ }, className: "object-contain w-[16px] h-[16px]" }));
101
106
  };
102
107
  const labelId = typeof serviceItem.boarding_stages === "string"
103
108
  ? serviceItem.boarding_stages.split("|")[0]
@@ -107,98 +112,22 @@ function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, child
107
112
  busStage[labelId].split("|")[1] === "true" &&
108
113
  busStage[labelId].split("|")[0];
109
114
  let isSoldOut = serviceItem.available_seats <= 0;
115
+ const showPromo = Math.random() > 0.5;
116
+ const isItemExpanded = serviceItem.id === isExpand || isExpand === true;
117
+ const grayscaleClass = isSoldOut ? "grayscale" : "";
110
118
  const renderIcon = (iconKey, size = "14px") => {
111
119
  var _a;
112
120
  const iconValue = (_a = serviceItem.icons) === null || _a === void 0 ? void 0 : _a[iconKey];
113
121
  if (iconValue) {
114
122
  if (typeof iconValue === "string") {
115
- return (React.createElement("img", { src: iconValue, alt: iconKey, className: `${`w-[${size}] h-[${size}]`} mr-[5px]` }));
123
+ return (React.createElement("img", { src: iconValue, alt: iconKey, className: `${`w-[${size}] h-[${size}]`} ` }));
116
124
  }
117
125
  }
118
126
  return null;
119
127
  };
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
- };
200
128
  const checkMidnight = () => {
201
129
  var _a, _b;
130
+ setIsExpand === null || setIsExpand === void 0 ? void 0 : setIsExpand(null);
202
131
  if ((cityOrigin === null || cityOrigin === void 0 ? void 0 : cityOrigin.label) &&
203
132
  (cityDestination === null || cityDestination === void 0 ? void 0 : cityDestination.label) &&
204
133
  ((cityOrigin.label.toLowerCase().includes("argentina") &&
@@ -269,45 +198,58 @@ function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, child
269
198
  });
270
199
  return;
271
200
  }
272
- else {
273
- onBookButtonPress();
274
- }
201
+ onBookButtonPress();
202
+ };
203
+ const countdownSeconds = 599;
204
+ const startCountdown = (node) => {
205
+ if (!node)
206
+ return;
207
+ const prevId = node.dataset.countdownId;
208
+ if (prevId)
209
+ clearInterval(Number(prevId));
210
+ let remaining = countdownSeconds;
211
+ const formatTime = (totalSecs) => {
212
+ const m = Math.floor(totalSecs / 60);
213
+ const s = totalSecs % 60;
214
+ return `${String(m).padStart(2, "0")}:${String(s).padStart(2, "0")}`;
215
+ };
216
+ node.textContent = formatTime(remaining);
217
+ const id = setInterval(() => {
218
+ remaining -= 1;
219
+ if (remaining <= 0) {
220
+ remaining = 0;
221
+ clearInterval(id);
222
+ }
223
+ node.textContent = formatTime(remaining);
224
+ }, 1000);
225
+ node.dataset.countdownId = String(id);
275
226
  };
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
- }
299
227
  const items = [
300
228
  {
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 })),
229
+ key: "amenities",
230
+ width: "20%",
231
+ condition: true,
232
+ render: (React.createElement(AmenitiesBlock, { serviceItem: serviceItem, metaData: metaData, isSoldOut: isSoldOut, colors: colors, getAnimationIcon: getAnimationIcon, getAmenityName: CommonService.getAmenityName, SvgAmenities: SvgAmenities, isPeru: isPeru })),
304
233
  },
305
234
  {
306
235
  key: "duration",
307
- width: "20%",
236
+ width: "12%",
308
237
  condition: serviceItem.duration,
309
238
  render: (React.createElement(DurationBlock, { serviceItem: serviceItem, translation: translation, renderIcon: renderIcon, isSoldOut: isSoldOut, colors: colors })),
310
239
  },
240
+ // {
241
+ // key: "directo",
242
+ // width: "12%",
243
+ // condition: serviceItem?.is_direct_trip === true,
244
+ // render: (
245
+ // <DirectoBlock
246
+ // translation={translation}
247
+ // getAnimationIcon={getAnimationIcon}
248
+ // colors={colors}
249
+ // isSoldOut={isSoldOut}
250
+ // />
251
+ // ),
252
+ // },
311
253
  {
312
254
  key: "pet",
313
255
  width: "20%",
@@ -321,116 +263,100 @@ function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, child
321
263
  condition: serviceItem.is_change_ticket === true,
322
264
  render: (React.createElement(FlexibleBlock, { translation: translation, getAnimationIcon: getAnimationIcon, colors: colors, serviceItem: serviceItem, isSoldOut: isSoldOut })),
323
265
  },
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
- },
329
266
  ];
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) ||
267
+ const otherItems = items.filter((i) => i.key !== "pet" && i.key !== "flexible" && !!i.condition);
268
+ 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", {
269
+ // className={`relative ${
270
+ // serviceItem.offer_text ? "mb-[55px]" : "mb-[10px]"
271
+ // } mt-[14px]`}
272
+ className: `relative ${serviceItem.offer_text ? "mb-[55px]" : "mb-[10px]"} ${(serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.is_direct_trip) ||
333
273
  (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.train_type_label) === "Tren Express (Nuevo)" ||
334
274
  showTopLabel
335
275
  ? "mt-[24px]"
336
276
  : "mt-[20px]"} ` },
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",
277
+ React.createElement("div", { id: `service-card-${serviceItem.id}`, className: "bg-white mx-auto relative rounded-[10px] border border-[#ccc]" },
278
+ React.createElement("div", {
279
+ // className="p-[15px] pt-[20px]"
280
+ className: " pt-[20px]", style: {
281
+ padding: coachKey
282
+ ? "15px 15px 20px 15px"
283
+ : "20px 15px 11px 15px",
284
+ } },
285
+ React.createElement("div", {
286
+ // className="grid text-[#464647] w-full [grid-template-columns:18%_28%_2.5%_28%_15.5%] gap-x-[2%] items-center"
287
+ className: "grid text-[#464647] w-full [grid-template-columns:22%_28%_2.5%_24%_15.5%] gap-x-[2%] items-center" },
288
+ React.createElement("div", { style: {
289
+ display: "flex",
290
+ flexDirection: "column",
291
+ // gap: "5px",
346
292
  } },
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))))),
293
+ React.createElement("div", {
294
+ // className="flex items-center justify-center m-[auto]"
295
+ className: "" },
296
+ React.createElement("img", { src: serviceItem.operator_details[0], alt: "service logo", className: `h-[30px] w-[150px] ${isSoldOut ? "grayscale" : ""}` }),
297
+ isCiva ? (React.createElement("div", { className: "text-[13.33px] black-text ml-2" }, serviceItem.operator_details[2])) : null),
298
+ React.createElement(RatingBlock, { showRating: showRating, serviceItem: serviceItem, isSoldOut: isSoldOut, colors: colors, t: t, translation: translation, isPeru: isPeru })),
299
+ React.createElement(DateTimeSection, { serviceItem: serviceItem, isSoldOut: isSoldOut, isCiva: isCiva, isLinatal: isLinatal, removeArrivalTime: removeArrivalTime, orignLabel: orignLabel, destinationLabel: destinationLabel, busStage: busStage, metaData: metaData, colors: colors }),
377
300
  React.createElement("div", { style: {
378
301
  width: "1px",
379
302
  height: "2.5rem",
380
303
  backgroundColor: "#ccc",
381
304
  } }),
382
305
  React.createElement("div", { className: "content-center" },
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()))),
306
+ React.createElement(SeatSection, { seatTypes: serviceItem.seat_types, serviceItem: serviceItem, availableSeats: serviceItem.available_seats, isSoldOut: isSoldOut, priceColor: colors.priceColor, currencySign: currencySign, removeDuplicateSeats: removeDuplicateSeats, isPeru: isPeru })),
399
307
  React.createElement("div", null,
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)))),
308
+ showLastSeats ? (React.createElement("div", { className: "flex justify-end mr-[11px] ", style: {
309
+ position: "absolute",
310
+ top: "8px",
311
+ right: "16px",
312
+ } }, (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.available_seats) < 10 &&
313
+ (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.available_seats) > 0 && (React.createElement("div", { className: "text-[12px] text-[#464647] mt-1 text-center" }, "\u00A1\u00DAltimos Asientos!")))) : null,
314
+ 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 }))),
315
+ 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 &&
316
+ setIsExpand(isItemExpanded ? null : serviceItem.id) }))),
317
+ React.createElement("div", { style: {
318
+ display: "grid",
319
+ gridTemplateRows: isItemExpanded ? "1fr" : "0fr",
320
+ opacity: isItemExpanded ? 1 : 0,
321
+ transition: "grid-template-rows 0.3s ease-in-out, opacity 0.25s ease-in-out",
322
+ position: "relative",
323
+ zIndex: -1,
324
+ } },
325
+ React.createElement("div", { style: { overflow: "hidden", minHeight: 0, marginTop: "-10px" } },
326
+ React.createElement(ExpandedDropdown, { serviceItem: serviceItem }))),
423
327
  children,
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,
328
+ (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: {
329
+ backgroundColor: colors === null || colors === void 0 ? void 0 : colors.bottomStripColor,
428
330
  opacity: isSoldOut ? 0.5 : 1,
429
331
  } },
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))),
332
+ React.createElement("div", { className: "flex justify-between items-center w-full" },
333
+ React.createElement("div", { className: "flex items-center " },
334
+ React.createElement("div", { className: "flex items-center" },
335
+ React.createElement(LottiePlayer, { animationData: getAnimationIcon("bombAnimation"), width: "18px", height: "18px" }),
336
+ React.createElement("div", { className: "flex items-center mt-[2px]" },
337
+ React.createElement("span", { className: "bold-text ml-[6px]" },
338
+ (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.offer_text) || "",
339
+ "\u00A0"),
340
+ " ",
341
+ "| Termina en\u00A0",
342
+ React.createElement("span", { className: "bold-text text-end", ref: startCountdown, style: {
343
+ fontVariantNumeric: "tabular-nums",
344
+ display: "inline-block",
345
+ // minWidth: "70px",
346
+ } })))),
347
+ React.createElement("div", { className: "flex items-center" },
348
+ renderIcon("personIcon", "16px"),
349
+ "\u00A0",
350
+ React.createElement("span", { className: "ml-[6px]" },
351
+ React.createElement("span", { className: "bold-text", ref: startViewerCount, style: { fontVariantNumeric: "tabular-nums" } }),
352
+ " ",
353
+ React.createElement("span", { className: "bold-text" }, "personas"),
354
+ " ",
355
+ React.createElement("span", null,
356
+ " ",
357
+ (viewersConfig === null || viewersConfig === void 0 ? void 0 : viewersConfig.label) || " están viendo este viaje")))))),
432
358
  React.createElement("div", { className: "absolute -top-[11px] left-0 w-full flex items-center justify-end gap-[12px] pr-[15px] z-10 " },
433
- showTopLabel && (React.createElement("div", { className: `flex items-center gap-[10px] py-[4px] px-[14px] rounded-[38px] text-[12.5px] z-20`, style: {
359
+ showTopLabel && (React.createElement("div", { className: `flex items-center gap-[10px] py-[4px] px-[14px] rounded-[38px] text-[12.5px] z-10`, style: {
434
360
  backgroundColor: isSoldOut
435
361
  ? "#ddd"
436
362
  : colors.ratingBottomColor,
@@ -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, setAmenetiesAtomValue, isCiva, currencySign, isPeru, showRating, showLastSeats, removeDuplicateSeats, isLinatal, }: MobileServiceItemProps): React.ReactElement;
3
+ declare function ServiceItemMobile({ serviceItem, onBookButtonPress, colors, busStage, orignLabel, destinationLabel, amenitiesData, setShowDropdown, showDropdown, isExpanded, setIsExpanded, setAmenetiesAtomValue, isCiva, currencySign, isPeru, showRating, showLastSeats, removeDuplicateSeats, isLinatal, viewersConfig, }: MobileServiceItemProps): React.ReactElement;
4
4
  export default ServiceItemMobile;