kupos-ui-components-lib 9.1.4 → 9.1.6
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 +223 -67
- 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 +3 -38
- package/dist/components/FilterBar/tyoes.d.ts +0 -1
- package/dist/components/ServiceItem/PeruServiceItemDesktop.js +1 -1
- package/dist/components/ServiceItem/RatingHover.js +32 -33
- package/dist/components/ServiceItem/ServiceItemDesktop.d.ts +1 -1
- package/dist/components/ServiceItem/ServiceItemDesktop.js +173 -266
- package/dist/components/ServiceItem/ServiceItemMobile.d.ts +1 -1
- package/dist/components/ServiceItem/ServiceItemMobile.js +136 -287
- package/dist/components/ServiceItem/mobileTypes.d.ts +13 -0
- package/dist/components/ServiceItem/types.d.ts +15 -0
- package/dist/styles.css +132 -41
- package/dist/ui/AmenitiesBlock.js +24 -31
- package/dist/ui/DateTimeSection/DateTimeSection.js +2 -2
- package/dist/ui/DurationBlock.js +4 -4
- package/dist/ui/ExpendedDropDown/ExpandedDropdown.js +4 -3
- package/dist/ui/FlexibleBlock.js +5 -6
- package/dist/ui/PetBlock.js +1 -3
- package/dist/ui/RatingBlock.d.ts +9 -1
- package/dist/ui/RatingBlock.js +7 -3
- package/dist/ui/SeatSection/SeatSection.js +5 -0
- package/dist/ui/mobileweb/ExpandedDropdownMobile.js +4 -3
- package/dist/utils/CommonService.d.ts +1 -1
- package/dist/utils/CommonService.js +2 -0
- package/package.json +2 -1
- package/src/assets/images/anims/service_list/bomb.json +1 -0
- package/src/assets/images/anims/service_list/directo.json +1 -1
- package/src/components/FilterBar/FilterBarDesktop.tsx +3 -46
- package/src/components/FilterBar/tyoes.ts +0 -1
- package/src/components/ServiceItem/PeruServiceItemDesktop.tsx +1 -0
- package/src/components/ServiceItem/RatingHover.tsx +44 -45
- package/src/components/ServiceItem/ServiceItemDesktop.tsx +354 -540
- package/src/components/ServiceItem/ServiceItemMobile.tsx +269 -552
- package/src/components/ServiceItem/mobileTypes.ts +13 -0
- package/src/components/ServiceItem/types.ts +15 -0
- package/src/ui/AmenitiesBlock.tsx +51 -30
- package/src/ui/BottomAmenities/BottomAmenities.tsx +110 -0
- package/src/ui/DateTimeSection/DateTimeSection.tsx +207 -0
- package/src/ui/DirectoBlock.tsx +31 -0
- package/src/ui/DurationBlock.tsx +4 -4
- package/src/ui/ExpendedDropDown/ExpandedDropdown.tsx +103 -0
- package/src/ui/FlexibleBlock.tsx +6 -5
- package/src/ui/KuposButton/KuposButton.tsx +48 -0
- package/src/ui/PetBlock.tsx +2 -2
- package/src/ui/RatingBlock.tsx +18 -6
- package/src/ui/SeatSection/SeatSection.tsx +217 -0
- package/src/ui/TopAmenities/TopAmenities.tsx +127 -0
- package/src/ui/mobileweb/BottomAmenitiesMobile.tsx +169 -0
- package/src/ui/mobileweb/DateTimeSectionMobile.tsx +192 -0
- package/src/ui/mobileweb/ExpandedDropdownMobile.tsx +56 -0
- package/src/ui/mobileweb/SeatSectionMobile.tsx +256 -0
- package/src/ui/mobileweb/TopAmenitieMobile.tsx +126 -0
- package/src/utils/CommonService.ts +2 -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,71 @@ 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
|
|
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";
|
|
25
|
+
import DirectoBlock from "../../ui/DirectoBlock";
|
|
34
26
|
import PetBlock from "../../ui/PetBlock";
|
|
35
27
|
import FlexibleBlock from "../../ui/FlexibleBlock";
|
|
36
28
|
import AmenitiesBlock from "../../ui/AmenitiesBlock";
|
|
37
|
-
import
|
|
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";
|
|
38
33
|
const SEAT_EXCEPTIONS = ["Asiento mascota"];
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
}
|
|
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, viewersConfig, }) {
|
|
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 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);
|
|
78
79
|
};
|
|
79
80
|
const getAnimationIcon = (icon) => {
|
|
80
81
|
var _a;
|
|
81
|
-
const animation =
|
|
82
|
+
const animation = ANIMATION_MAP[icon];
|
|
82
83
|
if (!animation)
|
|
83
84
|
return null;
|
|
84
85
|
return (_a = animation[siteType]) !== null && _a !== void 0 ? _a : animation.kupos;
|
|
@@ -97,7 +98,7 @@ function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, child
|
|
|
97
98
|
const iconPath = getIconPath();
|
|
98
99
|
return (React.createElement("img", { src: iconPath, alt: name, style: {
|
|
99
100
|
filter: color === "white" ? "brightness(0) invert(1)" : "",
|
|
100
|
-
}, className:
|
|
101
|
+
}, className: "object-contain w-[16px] h-[16px]" }));
|
|
101
102
|
};
|
|
102
103
|
const labelId = typeof serviceItem.boarding_stages === "string"
|
|
103
104
|
? serviceItem.boarding_stages.split("|")[0]
|
|
@@ -107,98 +108,22 @@ function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, child
|
|
|
107
108
|
busStage[labelId].split("|")[1] === "true" &&
|
|
108
109
|
busStage[labelId].split("|")[0];
|
|
109
110
|
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" : "";
|
|
110
114
|
const renderIcon = (iconKey, size = "14px") => {
|
|
111
115
|
var _a;
|
|
112
116
|
const iconValue = (_a = serviceItem.icons) === null || _a === void 0 ? void 0 : _a[iconKey];
|
|
113
117
|
if (iconValue) {
|
|
114
118
|
if (typeof iconValue === "string") {
|
|
115
|
-
return (React.createElement("img", { src: iconValue, alt: iconKey, className: `${`w-[${size}] h-[${size}]`}
|
|
119
|
+
return (React.createElement("img", { src: iconValue, alt: iconKey, className: `${`w-[${size}] h-[${size}]`} ` }));
|
|
116
120
|
}
|
|
117
121
|
}
|
|
118
122
|
return null;
|
|
119
123
|
};
|
|
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
124
|
const checkMidnight = () => {
|
|
201
125
|
var _a, _b;
|
|
126
|
+
setIsExpand === null || setIsExpand === void 0 ? void 0 : setIsExpand(null);
|
|
202
127
|
if ((cityOrigin === null || cityOrigin === void 0 ? void 0 : cityOrigin.label) &&
|
|
203
128
|
(cityDestination === null || cityDestination === void 0 ? void 0 : cityDestination.label) &&
|
|
204
129
|
((cityOrigin.label.toLowerCase().includes("argentina") &&
|
|
@@ -269,45 +194,52 @@ function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, child
|
|
|
269
194
|
});
|
|
270
195
|
return;
|
|
271
196
|
}
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
197
|
+
onBookButtonPress();
|
|
198
|
+
};
|
|
199
|
+
const countdownSeconds = 7830;
|
|
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);
|
|
275
223
|
};
|
|
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
224
|
const items = [
|
|
300
225
|
{
|
|
301
|
-
key: "
|
|
302
|
-
width: "
|
|
303
|
-
|
|
226
|
+
key: "amenities",
|
|
227
|
+
width: "20%",
|
|
228
|
+
condition: true,
|
|
229
|
+
render: (React.createElement(AmenitiesBlock, { serviceItem: serviceItem, metaData: metaData, isSoldOut: isSoldOut, colors: colors, isPeru: isPeru, getAnimationIcon: getAnimationIcon, getAmenityName: CommonService.getAmenityName, SvgAmenities: SvgAmenities })),
|
|
304
230
|
},
|
|
305
231
|
{
|
|
306
232
|
key: "duration",
|
|
307
|
-
width: "
|
|
233
|
+
width: "12%",
|
|
308
234
|
condition: serviceItem.duration,
|
|
309
235
|
render: (React.createElement(DurationBlock, { serviceItem: serviceItem, translation: translation, renderIcon: renderIcon, isSoldOut: isSoldOut, colors: colors })),
|
|
310
236
|
},
|
|
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
|
+
},
|
|
311
243
|
{
|
|
312
244
|
key: "pet",
|
|
313
245
|
width: "20%",
|
|
@@ -321,116 +253,100 @@ function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, child
|
|
|
321
253
|
condition: serviceItem.is_change_ticket === true,
|
|
322
254
|
render: (React.createElement(FlexibleBlock, { translation: translation, getAnimationIcon: getAnimationIcon, colors: colors, serviceItem: serviceItem, isSoldOut: isSoldOut })),
|
|
323
255
|
},
|
|
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
256
|
];
|
|
330
|
-
const
|
|
331
|
-
|
|
332
|
-
|
|
257
|
+
const otherItems = items.filter((i) => i.key !== "pet" && i.key !== "flexible" && !!i.condition);
|
|
258
|
+
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", {
|
|
259
|
+
// className={`relative ${
|
|
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) ||
|
|
333
263
|
(serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.train_type_label) === "Tren Express (Nuevo)" ||
|
|
334
264
|
showTopLabel
|
|
335
265
|
? "mt-[24px]"
|
|
336
266
|
: "mt-[20px]"} ` },
|
|
337
|
-
React.createElement("div", { className: "bg-white rounded-[
|
|
338
|
-
React.createElement("div", {
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
267
|
+
React.createElement("div", { id: `service-card-${serviceItem.id}`, className: "bg-white mx-auto relative rounded-[10px] border border-[#ccc]" },
|
|
268
|
+
React.createElement("div", {
|
|
269
|
+
// className="p-[15px] pt-[20px]"
|
|
270
|
+
className: " pt-[20px]", style: {
|
|
271
|
+
padding: coachKey
|
|
272
|
+
? "15px 15px 20px 15px"
|
|
273
|
+
: "20px 15px 11px 15px",
|
|
274
|
+
} },
|
|
275
|
+
React.createElement("div", {
|
|
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",
|
|
346
282
|
} },
|
|
347
|
-
React.createElement("div", {
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
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))))),
|
|
283
|
+
React.createElement("div", {
|
|
284
|
+
// className="flex items-center justify-center m-[auto]"
|
|
285
|
+
className: "" },
|
|
286
|
+
React.createElement("img", { src: serviceItem.operator_details[0], alt: "service logo", className: `h-auto w-[150px] object-contain ${isSoldOut ? "grayscale" : ""}` }),
|
|
287
|
+
isCiva ? (React.createElement("div", { className: "text-[13.33px] black-text ml-2" }, serviceItem.operator_details[2])) : null),
|
|
288
|
+
React.createElement(RatingBlock, { showRating: showRating, serviceItem: serviceItem, isSoldOut: isSoldOut, colors: colors, t: t, translation: translation, isPeru: isPeru })),
|
|
289
|
+
React.createElement(DateTimeSection, { serviceItem: serviceItem, isSoldOut: isSoldOut, isCiva: isCiva, isLinatal: isLinatal, removeArrivalTime: removeArrivalTime, orignLabel: orignLabel, destinationLabel: destinationLabel, busStage: busStage, metaData: metaData, colors: colors }),
|
|
377
290
|
React.createElement("div", { style: {
|
|
378
291
|
width: "1px",
|
|
379
292
|
height: "2.5rem",
|
|
380
293
|
backgroundColor: "#ccc",
|
|
381
294
|
} }),
|
|
382
295
|
React.createElement("div", { className: "content-center" },
|
|
383
|
-
React.createElement(
|
|
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()))),
|
|
296
|
+
React.createElement(SeatSection, { seatTypes: serviceItem.seat_types, availableSeats: serviceItem.available_seats, isSoldOut: isSoldOut, priceColor: colors.priceColor, currencySign: currencySign, removeDuplicateSeats: removeDuplicateSeats, isPeru: isPeru })),
|
|
399
297
|
React.createElement("div", null,
|
|
400
|
-
React.createElement("
|
|
401
|
-
|
|
402
|
-
: "
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
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)))),
|
|
298
|
+
showLastSeats ? (React.createElement("div", { className: "flex justify-end mr-[11px] ", style: {
|
|
299
|
+
position: "absolute",
|
|
300
|
+
top: "8px",
|
|
301
|
+
right: "16px",
|
|
302
|
+
} }, (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.available_seats) < 10 &&
|
|
303
|
+
(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,
|
|
304
|
+
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 }))),
|
|
305
|
+
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 &&
|
|
306
|
+
setIsExpand(isItemExpanded ? null : serviceItem.id) }))),
|
|
307
|
+
React.createElement("div", { style: {
|
|
308
|
+
display: "grid",
|
|
309
|
+
gridTemplateRows: isItemExpanded ? "1fr" : "0fr",
|
|
310
|
+
opacity: isItemExpanded ? 1 : 0,
|
|
311
|
+
transition: "grid-template-rows 0.3s ease-in-out, opacity 0.25s ease-in-out",
|
|
312
|
+
position: "relative",
|
|
313
|
+
zIndex: -1,
|
|
314
|
+
} },
|
|
315
|
+
React.createElement("div", { style: { overflow: "hidden", minHeight: 0, marginTop: "-10px" } },
|
|
316
|
+
React.createElement(ExpandedDropdown, { serviceItem: serviceItem }))),
|
|
423
317
|
children,
|
|
424
|
-
(serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.offer_text) && (React.createElement("div", { className:
|
|
425
|
-
backgroundColor:
|
|
426
|
-
? colors === null || colors === void 0 ? void 0 : colors.bottomStripColor
|
|
427
|
-
: colors === null || colors === void 0 ? void 0 : colors.bottomStripColor,
|
|
318
|
+
(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: {
|
|
319
|
+
backgroundColor: colors === null || colors === void 0 ? void 0 : colors.bottomStripColor,
|
|
428
320
|
opacity: isSoldOut ? 0.5 : 1,
|
|
429
321
|
} },
|
|
430
|
-
React.createElement(
|
|
431
|
-
|
|
322
|
+
React.createElement("div", { className: "flex justify-between items-center w-full" },
|
|
323
|
+
React.createElement("div", { className: "flex items-center " },
|
|
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")))))),
|
|
432
348
|
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-
|
|
349
|
+
showTopLabel && (React.createElement("div", { className: `flex items-center gap-[10px] py-[4px] px-[14px] rounded-[38px] text-[12.5px] z-10`, style: {
|
|
434
350
|
backgroundColor: isSoldOut
|
|
435
351
|
? "#ddd"
|
|
436
352
|
: colors.ratingBottomColor,
|
|
@@ -449,15 +365,6 @@ function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, child
|
|
|
449
365
|
// animationData={getAnimationIcon(connectingServiceIcon)}
|
|
450
366
|
width: "14px", height: "14px" }),
|
|
451
367
|
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))),
|
|
461
368
|
(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: {
|
|
462
369
|
backgroundColor: isSoldOut ? "#ddd" : colors.tooltipColor,
|
|
463
370
|
} },
|
|
@@ -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;
|