kupos-ui-components-lib 9.1.6 → 9.1.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.
- package/README copy.md +67 -223
- package/dist/assets/images/anims/service_list/directo.json +1 -1
- package/dist/components/FilterBar/FilterBarDesktop.d.ts +1 -1
- package/dist/components/FilterBar/FilterBarDesktop.js +39 -3
- package/dist/components/FilterBar/tyoes.d.ts +1 -0
- package/dist/components/ServiceItem/PeruServiceItemDesktop.js +1 -1
- package/dist/components/ServiceItem/RatingHover.js +33 -32
- package/dist/components/ServiceItem/ServiceItemDesktop.d.ts +1 -1
- package/dist/components/ServiceItem/ServiceItemDesktop.js +266 -173
- package/dist/components/ServiceItem/ServiceItemMobile.d.ts +1 -1
- package/dist/components/ServiceItem/ServiceItemMobile.js +287 -136
- package/dist/components/ServiceItem/mobileTypes.d.ts +0 -13
- package/dist/components/ServiceItem/types.d.ts +0 -15
- package/dist/styles.css +41 -132
- package/dist/ui/AmenitiesBlock.js +31 -24
- package/dist/ui/DurationBlock.js +4 -4
- package/dist/ui/FlexibleBlock.js +6 -5
- package/dist/ui/PetBlock.js +3 -1
- package/dist/ui/RatingBlock.d.ts +1 -9
- package/dist/ui/RatingBlock.js +3 -7
- package/dist/utils/CommonService.d.ts +1 -1
- package/dist/utils/CommonService.js +0 -2
- package/package.json +1 -2
- package/src/assets/images/anims/service_list/directo.json +1 -1
- package/src/components/FilterBar/FilterBarDesktop.tsx +53 -3
- package/src/components/FilterBar/tyoes.ts +1 -0
- package/src/components/ServiceItem/PeruServiceItemDesktop.tsx +0 -1
- package/src/components/ServiceItem/RatingHover.tsx +45 -44
- package/src/components/ServiceItem/ServiceItemDesktop.tsx +540 -354
- package/src/components/ServiceItem/ServiceItemMobile.tsx +552 -269
- package/src/components/ServiceItem/mobileTypes.ts +0 -13
- package/src/components/ServiceItem/types.ts +0 -15
- package/src/ui/AmenitiesBlock.tsx +30 -51
- package/src/ui/DurationBlock.tsx +4 -4
- package/src/ui/FlexibleBlock.tsx +5 -6
- package/src/ui/PetBlock.tsx +2 -2
- package/src/ui/RatingBlock.tsx +6 -18
- package/src/utils/CommonService.ts +0 -2
- package/src/assets/images/anims/service_list/bomb.json +0 -1
- package/src/ui/BottomAmenities/BottomAmenities.tsx +0 -110
- package/src/ui/DateTimeSection/DateTimeSection.tsx +0 -207
- package/src/ui/DirectoBlock.tsx +0 -31
- package/src/ui/ExpendedDropDown/ExpandedDropdown.tsx +0 -103
- package/src/ui/KuposButton/KuposButton.tsx +0 -48
- package/src/ui/SeatSection/SeatSection.tsx +0 -217
- package/src/ui/TopAmenities/TopAmenities.tsx +0 -127
- package/src/ui/mobileweb/BottomAmenitiesMobile.tsx +0 -169
- package/src/ui/mobileweb/DateTimeSectionMobile.tsx +0 -192
- package/src/ui/mobileweb/ExpandedDropdownMobile.tsx +0 -56
- package/src/ui/mobileweb/SeatSectionMobile.tsx +0 -256
- 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,71 +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
|
|
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
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
const getRandom = () => Math.floor(Math.random() * (max - min + 1)) + min;
|
|
74
|
-
node.textContent = String(getRandom());
|
|
75
|
-
const id = setInterval(() => {
|
|
76
|
-
node.textContent = String(getRandom());
|
|
77
|
-
}, interval);
|
|
78
|
-
node.dataset.viewerId = String(id);
|
|
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
|
+
},
|
|
79
78
|
};
|
|
80
79
|
const getAnimationIcon = (icon) => {
|
|
81
80
|
var _a;
|
|
82
|
-
const animation =
|
|
81
|
+
const animation = animationMap[icon];
|
|
83
82
|
if (!animation)
|
|
84
83
|
return null;
|
|
85
84
|
return (_a = animation[siteType]) !== null && _a !== void 0 ? _a : animation.kupos;
|
|
@@ -98,7 +97,7 @@ function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, child
|
|
|
98
97
|
const iconPath = getIconPath();
|
|
99
98
|
return (React.createElement("img", { src: iconPath, alt: name, style: {
|
|
100
99
|
filter: color === "white" ? "brightness(0) invert(1)" : "",
|
|
101
|
-
}, className:
|
|
100
|
+
}, className: `object-contain ${moreAnemities ? "w-[16px] h-[16px]" : "w-[16px] h-[16px]"}` }));
|
|
102
101
|
};
|
|
103
102
|
const labelId = typeof serviceItem.boarding_stages === "string"
|
|
104
103
|
? serviceItem.boarding_stages.split("|")[0]
|
|
@@ -108,22 +107,98 @@ function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, child
|
|
|
108
107
|
busStage[labelId].split("|")[1] === "true" &&
|
|
109
108
|
busStage[labelId].split("|")[0];
|
|
110
109
|
let isSoldOut = serviceItem.available_seats <= 0;
|
|
111
|
-
const showPromo = Math.random() > 0.5;
|
|
112
|
-
const isItemExpanded = serviceItem.id === isExpand || isExpand === true;
|
|
113
|
-
const grayscaleClass = isSoldOut ? "grayscale" : "";
|
|
114
110
|
const renderIcon = (iconKey, size = "14px") => {
|
|
115
111
|
var _a;
|
|
116
112
|
const iconValue = (_a = serviceItem.icons) === null || _a === void 0 ? void 0 : _a[iconKey];
|
|
117
113
|
if (iconValue) {
|
|
118
114
|
if (typeof iconValue === "string") {
|
|
119
|
-
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]` }));
|
|
120
116
|
}
|
|
121
117
|
}
|
|
122
118
|
return null;
|
|
123
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
|
+
};
|
|
124
200
|
const checkMidnight = () => {
|
|
125
201
|
var _a, _b;
|
|
126
|
-
setIsExpand === null || setIsExpand === void 0 ? void 0 : setIsExpand(null);
|
|
127
202
|
if ((cityOrigin === null || cityOrigin === void 0 ? void 0 : cityOrigin.label) &&
|
|
128
203
|
(cityDestination === null || cityDestination === void 0 ? void 0 : cityDestination.label) &&
|
|
129
204
|
((cityOrigin.label.toLowerCase().includes("argentina") &&
|
|
@@ -194,52 +269,45 @@ function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, child
|
|
|
194
269
|
});
|
|
195
270
|
return;
|
|
196
271
|
}
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
const startCountdown = (node) => {
|
|
201
|
-
if (!node)
|
|
202
|
-
return;
|
|
203
|
-
const prevId = node.dataset.countdownId;
|
|
204
|
-
if (prevId)
|
|
205
|
-
clearInterval(Number(prevId));
|
|
206
|
-
let remaining = countdownSeconds;
|
|
207
|
-
const formatTime = (totalSecs) => {
|
|
208
|
-
const h = Math.floor(totalSecs / 3600);
|
|
209
|
-
const m = Math.floor((totalSecs % 3600) / 60);
|
|
210
|
-
const s = totalSecs % 60;
|
|
211
|
-
return `${String(h).padStart(2, "0")}:${String(m).padStart(2, "0")}:${String(s).padStart(2, "0")}`;
|
|
212
|
-
};
|
|
213
|
-
node.textContent = formatTime(remaining);
|
|
214
|
-
const id = setInterval(() => {
|
|
215
|
-
remaining -= 1;
|
|
216
|
-
if (remaining <= 0) {
|
|
217
|
-
remaining = 0;
|
|
218
|
-
clearInterval(id);
|
|
219
|
-
}
|
|
220
|
-
node.textContent = formatTime(remaining);
|
|
221
|
-
}, 1000);
|
|
222
|
-
node.dataset.countdownId = String(id);
|
|
272
|
+
else {
|
|
273
|
+
onBookButtonPress();
|
|
274
|
+
}
|
|
223
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
|
+
}
|
|
224
299
|
const items = [
|
|
225
300
|
{
|
|
226
|
-
key: "
|
|
227
|
-
width: "
|
|
228
|
-
|
|
229
|
-
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 })),
|
|
230
304
|
},
|
|
231
305
|
{
|
|
232
306
|
key: "duration",
|
|
233
|
-
width: "
|
|
307
|
+
width: "20%",
|
|
234
308
|
condition: serviceItem.duration,
|
|
235
309
|
render: (React.createElement(DurationBlock, { serviceItem: serviceItem, translation: translation, renderIcon: renderIcon, isSoldOut: isSoldOut, colors: colors })),
|
|
236
310
|
},
|
|
237
|
-
{
|
|
238
|
-
key: "directo",
|
|
239
|
-
width: "12%",
|
|
240
|
-
condition: (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.is_direct_trip) === true,
|
|
241
|
-
render: (React.createElement(DirectoBlock, { translation: translation, getAnimationIcon: getAnimationIcon, colors: colors, isSoldOut: isSoldOut })),
|
|
242
|
-
},
|
|
243
311
|
{
|
|
244
312
|
key: "pet",
|
|
245
313
|
width: "20%",
|
|
@@ -253,100 +321,116 @@ function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, child
|
|
|
253
321
|
condition: serviceItem.is_change_ticket === true,
|
|
254
322
|
render: (React.createElement(FlexibleBlock, { translation: translation, getAnimationIcon: getAnimationIcon, colors: colors, serviceItem: serviceItem, isSoldOut: isSoldOut })),
|
|
255
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
|
+
},
|
|
256
329
|
];
|
|
257
|
-
const
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
// serviceItem.offer_text ? "mb-[55px]" : "mb-[10px]"
|
|
261
|
-
// } mt-[14px]`}
|
|
262
|
-
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) ||
|
|
263
333
|
(serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.train_type_label) === "Tren Express (Nuevo)" ||
|
|
264
334
|
showTopLabel
|
|
265
335
|
? "mt-[24px]"
|
|
266
336
|
: "mt-[20px]"} ` },
|
|
267
|
-
React.createElement("div", {
|
|
268
|
-
React.createElement("div", {
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
: "
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
// className="grid text-[#464647] w-full [grid-template-columns:18%_28%_2.5%_28%_15.5%] gap-x-[2%] items-center"
|
|
277
|
-
className: "grid text-[#464647] w-full [grid-template-columns:22%_28%_2.5%_24%_15.5%] gap-x-[2%] items-center" },
|
|
278
|
-
React.createElement("div", { style: {
|
|
279
|
-
display: "flex",
|
|
280
|
-
flexDirection: "column",
|
|
281
|
-
// 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",
|
|
282
346
|
} },
|
|
283
|
-
React.createElement("div", {
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
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))))),
|
|
290
377
|
React.createElement("div", { style: {
|
|
291
378
|
width: "1px",
|
|
292
379
|
height: "2.5rem",
|
|
293
380
|
backgroundColor: "#ccc",
|
|
294
381
|
} }),
|
|
295
382
|
React.createElement("div", { className: "content-center" },
|
|
296
|
-
React.createElement(
|
|
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()))),
|
|
297
399
|
React.createElement("div", null,
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
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)))),
|
|
317
423
|
children,
|
|
318
|
-
(serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.offer_text) && (React.createElement("div", { className:
|
|
319
|
-
backgroundColor:
|
|
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,
|
|
320
428
|
opacity: isSoldOut ? 0.5 : 1,
|
|
321
429
|
} },
|
|
322
|
-
React.createElement(
|
|
323
|
-
|
|
324
|
-
React.createElement("div", { className: "flex items-center" },
|
|
325
|
-
React.createElement(LottiePlayer, { animationData: getAnimationIcon("bombAnimation"), width: "18px", height: "18px" }),
|
|
326
|
-
React.createElement("div", { className: "flex items-center mt-[2px]" },
|
|
327
|
-
React.createElement("span", { className: "bold-text ml-[6px]" },
|
|
328
|
-
(serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.offer_text) || "",
|
|
329
|
-
"\u00A0"),
|
|
330
|
-
" ",
|
|
331
|
-
"| Termina en\u00A0",
|
|
332
|
-
React.createElement("span", { className: "bold-text text-end", ref: startCountdown, style: {
|
|
333
|
-
fontVariantNumeric: "tabular-nums",
|
|
334
|
-
display: "inline-block",
|
|
335
|
-
// minWidth: "70px",
|
|
336
|
-
} })))),
|
|
337
|
-
React.createElement("div", { className: "flex items-center" },
|
|
338
|
-
renderIcon("personIcon", "16px"),
|
|
339
|
-
"\u00A0",
|
|
340
|
-
React.createElement("span", { className: "ml-[6px]" },
|
|
341
|
-
React.createElement("span", { className: "bold-text", ref: startViewerCount, style: { fontVariantNumeric: "tabular-nums" } }),
|
|
342
|
-
" ",
|
|
343
|
-
React.createElement("span", { className: "bold-text" }, "personas"),
|
|
344
|
-
" ",
|
|
345
|
-
React.createElement("span", null,
|
|
346
|
-
" ",
|
|
347
|
-
viewersConfig.label || " están viendo este viaje")))))),
|
|
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))),
|
|
348
432
|
React.createElement("div", { className: "absolute -top-[11px] left-0 w-full flex items-center justify-end gap-[12px] pr-[15px] z-10 " },
|
|
349
|
-
showTopLabel && (React.createElement("div", { className: `flex items-center gap-[10px] py-[4px] px-[14px] rounded-[38px] text-[12.5px] z-
|
|
433
|
+
showTopLabel && (React.createElement("div", { className: `flex items-center gap-[10px] py-[4px] px-[14px] rounded-[38px] text-[12.5px] z-20`, style: {
|
|
350
434
|
backgroundColor: isSoldOut
|
|
351
435
|
? "#ddd"
|
|
352
436
|
: colors.ratingBottomColor,
|
|
@@ -365,6 +449,15 @@ function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, child
|
|
|
365
449
|
// animationData={getAnimationIcon(connectingServiceIcon)}
|
|
366
450
|
width: "14px", height: "14px" }),
|
|
367
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))),
|
|
368
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: {
|
|
369
462
|
backgroundColor: isSoldOut ? "#ddd" : colors.tooltipColor,
|
|
370
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,
|
|
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;
|