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