kupos-ui-components-lib 9.11.4 → 9.11.5
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/dist/components/ServiceItem/ServiceItemDesktop.d.ts +1 -1
- package/dist/components/ServiceItem/ServiceItemDesktop.js +4 -22
- package/dist/components/ServiceItem/ServiceItemMobile.d.ts +1 -1
- package/dist/components/ServiceItem/ServiceItemMobile.js +1 -1
- package/dist/components/ServiceItem/mobileTypes.d.ts +0 -1
- package/dist/components/ServiceItem/types.d.ts +0 -7
- package/dist/styles.css +0 -6
- package/dist/ui/BottomAmenities/BottomAmenities.d.ts +1 -2
- package/dist/ui/BottomAmenities/BottomAmenities.js +2 -4
- package/dist/ui/DateTimeSection/DateTimeSection.js +4 -4
- package/dist/ui/SeatSection/SeatSection.d.ts +1 -7
- package/dist/ui/SeatSection/SeatSection.js +15 -47
- package/dist/ui/mobileweb/DateTimeSectionMobile.d.ts +1 -2
- package/dist/ui/mobileweb/DateTimeSectionMobile.js +7 -13
- package/dist/ui/mobileweb/SeatSectionMobile.d.ts +1 -2
- package/dist/ui/mobileweb/SeatSectionMobile.js +16 -23
- package/dist/utils/CommonService.d.ts +1 -1
- package/dist/utils/CommonService.js +1 -5
- package/package.json +1 -1
- package/src/components/ServiceItem/ServiceItemDesktop.tsx +1 -47
- package/src/components/ServiceItem/ServiceItemMobile.tsx +1 -2
- package/src/components/ServiceItem/mobileTypes.ts +26 -31
- package/src/components/ServiceItem/types.ts +0 -12
- package/src/ui/BottomAmenities/BottomAmenities.tsx +1 -5
- package/src/ui/DateTimeSection/DateTimeSection.tsx +4 -4
- package/src/ui/SeatSection/SeatSection.tsx +26 -94
- package/src/ui/mobileweb/DateTimeSectionMobile.tsx +34 -47
- package/src/ui/mobileweb/SeatSectionMobile.tsx +14 -28
- package/src/utils/CommonService.ts +1 -7
|
@@ -131,13 +131,6 @@ function ServiceItemPB({
|
|
|
131
131
|
showLoginModal,
|
|
132
132
|
isLoggedIn,
|
|
133
133
|
showLoginOption,
|
|
134
|
-
isTrain,
|
|
135
|
-
selectedSeatKey,
|
|
136
|
-
onSeatSelect,
|
|
137
|
-
onTrainButtonClick,
|
|
138
|
-
showSeatSelectionError,
|
|
139
|
-
onShowSeatSelectionError,
|
|
140
|
-
onClearSeatSelectionError,
|
|
141
134
|
isFeatureDropDownExpand,
|
|
142
135
|
setIsFeatureDropDownExpand,
|
|
143
136
|
ticketQuantity,
|
|
@@ -152,15 +145,6 @@ function ServiceItemPB({
|
|
|
152
145
|
isFlores,
|
|
153
146
|
operatorLabel,
|
|
154
147
|
}: ServiceItemProps & { currencySign?: string }): React.ReactElement {
|
|
155
|
-
const handleSeatSelect = (
|
|
156
|
-
key: any,
|
|
157
|
-
price: number,
|
|
158
|
-
seatKey: string,
|
|
159
|
-
apiSeatType?: string,
|
|
160
|
-
) => {
|
|
161
|
-
onClearSeatSelectionError?.();
|
|
162
|
-
onSeatSelect?.(key, price, seatKey, apiSeatType);
|
|
163
|
-
};
|
|
164
148
|
const getAnimationIcon = (icon: string) => {
|
|
165
149
|
const animation = ANIMATION_MAP[icon];
|
|
166
150
|
if (!animation) return null;
|
|
@@ -382,17 +366,6 @@ function ServiceItemPB({
|
|
|
382
366
|
return;
|
|
383
367
|
}
|
|
384
368
|
|
|
385
|
-
if (isTrain) {
|
|
386
|
-
if (!selectedSeatKey) {
|
|
387
|
-
onShowSeatSelectionError?.(serviceItem.id);
|
|
388
|
-
return;
|
|
389
|
-
}
|
|
390
|
-
if (onTrainButtonClick) {
|
|
391
|
-
onTrainButtonClick();
|
|
392
|
-
return;
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
|
|
396
369
|
onBookButtonPress();
|
|
397
370
|
};
|
|
398
371
|
|
|
@@ -585,9 +558,7 @@ function ServiceItemPB({
|
|
|
585
558
|
: "",
|
|
586
559
|
}}
|
|
587
560
|
>
|
|
588
|
-
<div
|
|
589
|
-
className={`grid text-[#464647] w-full ${isTrain ? "[grid-template-columns:16%_30%_2.5%_28%_15.5%]" : "[grid-template-columns:20%_30%_2.5%_24%_15.5%]"} gap-x-[2%] items-center`}
|
|
590
|
-
>
|
|
561
|
+
<div className="grid text-[#464647] w-full [grid-template-columns:20%_30%_2.5%_24%_15.5%] gap-x-[2%] items-center">
|
|
591
562
|
{/* OPERATOR LOGO */}
|
|
592
563
|
<div className="flex flex-col gap-[5px]">
|
|
593
564
|
<div>
|
|
@@ -649,10 +620,6 @@ function ServiceItemPB({
|
|
|
649
620
|
isPeru={isPeru}
|
|
650
621
|
renderIcon={renderIcon}
|
|
651
622
|
discountSeatPriceColor={colors.discountSeatPriceColor}
|
|
652
|
-
isTrain={isTrain}
|
|
653
|
-
selectedSeatKey={selectedSeatKey}
|
|
654
|
-
onSeatSelect={handleSeatSelect}
|
|
655
|
-
topLabelColor={colors.topLabelColor}
|
|
656
623
|
tooltipColor={colors.tooltipColor}
|
|
657
624
|
/>
|
|
658
625
|
</div>
|
|
@@ -669,18 +636,6 @@ function ServiceItemPB({
|
|
|
669
636
|
soldOutIcon={renderIcon("soldOutIcon", "14px")}
|
|
670
637
|
onClick={checkMidnight}
|
|
671
638
|
/>
|
|
672
|
-
{showSeatSelectionError === serviceItem.id && isTrain && (
|
|
673
|
-
<div className="flex justify-center mr-[11px] w-[100%] right-[0px] absolute left-[0] top-[40px]">
|
|
674
|
-
<div
|
|
675
|
-
className="text-[9px] text-center whitespace-nowrap"
|
|
676
|
-
style={{
|
|
677
|
-
color: colors.seatPriceColor,
|
|
678
|
-
}}
|
|
679
|
-
>
|
|
680
|
-
Selecciona el tipo de servicio
|
|
681
|
-
</div>
|
|
682
|
-
</div>
|
|
683
|
-
)}
|
|
684
639
|
{showLastSeats ? (
|
|
685
640
|
<div className="flex justify-center mr-[11px] w-[100%] right-[0px] absolute left-[0] top-[40px]">
|
|
686
641
|
{serviceItem?.available_seats < 10 &&
|
|
@@ -713,7 +668,6 @@ function ServiceItemPB({
|
|
|
713
668
|
setIsExpand(isItemExpanded ? null : serviceItem.id)
|
|
714
669
|
}
|
|
715
670
|
isPeru={isPeru}
|
|
716
|
-
isTrain={isTrain}
|
|
717
671
|
/>
|
|
718
672
|
</div>
|
|
719
673
|
</div>
|
|
@@ -46,8 +46,6 @@ function ServiceItemMobile({
|
|
|
46
46
|
removeDuplicateSeats,
|
|
47
47
|
isLinatal,
|
|
48
48
|
viewersConfig,
|
|
49
|
-
operatorLabel,
|
|
50
|
-
isTrain,
|
|
51
49
|
isFeatureDropDownExpand,
|
|
52
50
|
setIsFeatureDropDownExpand,
|
|
53
51
|
ticketQuantity,
|
|
@@ -63,6 +61,7 @@ function ServiceItemMobile({
|
|
|
63
61
|
onTimeDropdownToggle,
|
|
64
62
|
wowDealData,
|
|
65
63
|
isFlores,
|
|
64
|
+
operatorLabel
|
|
66
65
|
}: MobileServiceItemProps): React.ReactElement {
|
|
67
66
|
const isItemExpanded = serviceItem.id === isExpanded;
|
|
68
67
|
const isPetSeat = (Object.keys(serviceItem?.pet_seat_info) || []).length > 0;
|
|
@@ -135,36 +135,36 @@ export interface MobileServiceItemProps {
|
|
|
135
135
|
bombAnim?: string;
|
|
136
136
|
whiteBoardingIcon?: string;
|
|
137
137
|
downArrow?: string;
|
|
138
|
-
personIcon?: string
|
|
138
|
+
personIcon?: string
|
|
139
139
|
specialDeparture?: string;
|
|
140
140
|
fireIcon?: string;
|
|
141
141
|
directoIcon?: string;
|
|
142
|
-
whiteFireIcon?: string
|
|
143
|
-
femaleAnim?:
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
whiteDestination?: string
|
|
148
|
-
userIcon?: string
|
|
149
|
-
|
|
150
|
-
sheildIcon?: string
|
|
151
|
-
busIcon?: string
|
|
152
|
-
whiteDownArrow?: string
|
|
153
|
-
empressaIcon?: string
|
|
154
|
-
flexibleIcon?: string
|
|
155
|
-
listoIcon?: string
|
|
156
|
-
precioIcon?: string
|
|
157
|
-
confirmarIcon?: string
|
|
142
|
+
whiteFireIcon?: string
|
|
143
|
+
femaleAnim?:string
|
|
144
|
+
thunderAnim?: string
|
|
145
|
+
personsAnim?: string
|
|
146
|
+
whiteOrigin?: string,
|
|
147
|
+
whiteDestination?: string,
|
|
148
|
+
userIcon?: string,
|
|
149
|
+
|
|
150
|
+
sheildIcon?: string,
|
|
151
|
+
busIcon?: string,
|
|
152
|
+
whiteDownArrow?: string,
|
|
153
|
+
empressaIcon?: string,
|
|
154
|
+
flexibleIcon?: string,
|
|
155
|
+
listoIcon?: string,
|
|
156
|
+
precioIcon?: string,
|
|
157
|
+
confirmarIcon?: string
|
|
158
158
|
cancelTicketIcon?: string;
|
|
159
159
|
changeTicketIcon?: string;
|
|
160
160
|
petFriendlyIcon?: string;
|
|
161
|
-
womenSeatIcon?: string
|
|
161
|
+
womenSeatIcon?: string
|
|
162
162
|
[key: string]: string | Record<string, string | undefined> | undefined;
|
|
163
163
|
};
|
|
164
164
|
useLottieFor?: string[];
|
|
165
165
|
};
|
|
166
166
|
onBookButtonPress?: () => void;
|
|
167
|
-
onRemateUiButtonClick?: ()
|
|
167
|
+
onRemateUiButtonClick?: ()=> void;
|
|
168
168
|
terminals?: any[];
|
|
169
169
|
showDropdown?: boolean;
|
|
170
170
|
setShowDropdown?: (value: boolean) => void;
|
|
@@ -208,7 +208,7 @@ export interface MobileServiceItemProps {
|
|
|
208
208
|
seatPriceColor?: string;
|
|
209
209
|
rightGradiantColor?: string;
|
|
210
210
|
leftGradiantColor?: string;
|
|
211
|
-
discountSeatPriceColor?: string
|
|
211
|
+
discountSeatPriceColor?: string
|
|
212
212
|
};
|
|
213
213
|
isCiva?: boolean;
|
|
214
214
|
currencySign?: string;
|
|
@@ -221,28 +221,23 @@ export interface MobileServiceItemProps {
|
|
|
221
221
|
showLastSeats?: boolean;
|
|
222
222
|
removeDuplicateSeats?: boolean;
|
|
223
223
|
isLinatal?: boolean;
|
|
224
|
-
|
|
224
|
+
viewersConfig?: {
|
|
225
225
|
min: number;
|
|
226
226
|
max: number;
|
|
227
227
|
interval?: number; // ms, default 5000
|
|
228
228
|
label?: string; // e.g. "personas están viendo este viaje"
|
|
229
229
|
icon?: string; // optional icon URL
|
|
230
230
|
};
|
|
231
|
-
|
|
232
|
-
isFeatureDropDownExpand?: any;
|
|
231
|
+
isFeatureDropDownExpand?: any;
|
|
233
232
|
setIsFeatureDropDownExpand?: (value: any) => void;
|
|
234
233
|
ticketQuantity?: number;
|
|
235
|
-
onIncreaseTicketQuantity?: (
|
|
236
|
-
|
|
237
|
-
) => void;
|
|
238
|
-
onDecreaseTicketQuantity?: (
|
|
239
|
-
serviceItem: MobileServiceItemProps["serviceItem"],
|
|
240
|
-
) => void;
|
|
234
|
+
onIncreaseTicketQuantity?: (serviceItem: MobileServiceItemProps["serviceItem"]) => void;
|
|
235
|
+
onDecreaseTicketQuantity?: (serviceItem: MobileServiceItemProps["serviceItem"]) => void;
|
|
241
236
|
cityOrigin?: { value: number; label: string };
|
|
242
237
|
cityDestination?: { value: number; label: string };
|
|
243
|
-
|
|
238
|
+
isNewUi?: boolean
|
|
244
239
|
|
|
245
|
-
|
|
240
|
+
selectedTimeSlot?: string;
|
|
246
241
|
onTimeSlotChange?: (slot: string) => void;
|
|
247
242
|
isTimeDropdownOpen?: string | number | null;
|
|
248
243
|
onTimeDropdownToggle?: (id?: string | number | null) => void;
|
|
@@ -252,18 +252,6 @@ export interface ServiceItemProps {
|
|
|
252
252
|
showLoginModal?: any;
|
|
253
253
|
isLoggedIn?: any;
|
|
254
254
|
showLoginOption?: boolean;
|
|
255
|
-
isTrain?: boolean;
|
|
256
|
-
selectedSeatKey?: any;
|
|
257
|
-
onSeatSelect?: (
|
|
258
|
-
key: any,
|
|
259
|
-
price: number,
|
|
260
|
-
seatKey: string,
|
|
261
|
-
apiSeatType?: string,
|
|
262
|
-
) => void;
|
|
263
|
-
onTrainButtonClick?: any;
|
|
264
|
-
showSeatSelectionError?: string | null;
|
|
265
|
-
onShowSeatSelectionError?: (serviceId: string) => void;
|
|
266
|
-
onClearSeatSelectionError?: () => void;
|
|
267
255
|
selectedTimeSlot?: string;
|
|
268
256
|
onTimeSlotChange?: (slot: string) => void;
|
|
269
257
|
isTimeDropdownOpen?: string | number | null;
|
|
@@ -28,7 +28,6 @@ interface BottomAmenitiesProps {
|
|
|
28
28
|
downArrowIcon?: React.ReactNode;
|
|
29
29
|
onToggleExpand: () => void;
|
|
30
30
|
isPeru?: boolean;
|
|
31
|
-
isTrain?: boolean;
|
|
32
31
|
}
|
|
33
32
|
|
|
34
33
|
function BottomAmenities({
|
|
@@ -43,7 +42,6 @@ function BottomAmenities({
|
|
|
43
42
|
downArrowIcon,
|
|
44
43
|
onToggleExpand,
|
|
45
44
|
isPeru,
|
|
46
|
-
isTrain,
|
|
47
45
|
}: BottomAmenitiesProps): React.ReactElement {
|
|
48
46
|
const hasPetInfo =
|
|
49
47
|
serviceItem.pet_seat_info &&
|
|
@@ -61,9 +59,7 @@ function BottomAmenities({
|
|
|
61
59
|
className="grid items-center gap-[2%] flex-1 "
|
|
62
60
|
style={{
|
|
63
61
|
// gridTemplateColumns: " 28% 21% 23% 23%",
|
|
64
|
-
gridTemplateColumns:
|
|
65
|
-
? "20.6% 17% 23% 23%"
|
|
66
|
-
: "25.3% 17% 23% 23%",
|
|
62
|
+
gridTemplateColumns: "25.3% 17% 23% 23%",
|
|
67
63
|
}}
|
|
68
64
|
>
|
|
69
65
|
{otherItems.map((item) => (
|
|
@@ -119,7 +119,7 @@ function DateTimeSection({
|
|
|
119
119
|
metaData={metaData}
|
|
120
120
|
colors={colors}
|
|
121
121
|
>
|
|
122
|
-
<span className="cursor-pointer bold-text capitalize
|
|
122
|
+
<span className="cursor-pointer bold-text capitalize">
|
|
123
123
|
{DateService.getServiceItemDate(serviceItem.travel_date)}
|
|
124
124
|
</span>
|
|
125
125
|
</StageTooltip>
|
|
@@ -134,7 +134,7 @@ function DateTimeSection({
|
|
|
134
134
|
metaData={metaData}
|
|
135
135
|
colors={colors}
|
|
136
136
|
>
|
|
137
|
-
<span className="cursor-pointer bold-text capitalize
|
|
137
|
+
<span className="cursor-pointer bold-text capitalize">
|
|
138
138
|
{DateService.getServiceItemDate(serviceItem.arrival_date)}
|
|
139
139
|
</span>
|
|
140
140
|
</StageTooltip>
|
|
@@ -169,7 +169,7 @@ function DateTimeSection({
|
|
|
169
169
|
metaData={metaData}
|
|
170
170
|
colors={colors}
|
|
171
171
|
>
|
|
172
|
-
<div className="font-[900] bold-text
|
|
172
|
+
<div className="font-[900] bold-text">
|
|
173
173
|
{isLinatal ? (
|
|
174
174
|
<>
|
|
175
175
|
{cleanedDepTime} <span>{hasPM ? "PM" : hasAM ? "AM" : ""}</span>
|
|
@@ -193,7 +193,7 @@ function DateTimeSection({
|
|
|
193
193
|
metaData={metaData}
|
|
194
194
|
colors={colors}
|
|
195
195
|
>
|
|
196
|
-
<div className="font-[900] bold-text
|
|
196
|
+
<div className="font-[900] bold-text">
|
|
197
197
|
{removeArrivalTime
|
|
198
198
|
? "\u00A0"
|
|
199
199
|
: serviceItem.arr_time
|
|
@@ -7,8 +7,6 @@ interface SeatType {
|
|
|
7
7
|
label: string;
|
|
8
8
|
fare: number;
|
|
9
9
|
key: any;
|
|
10
|
-
apiSeatType?: string;
|
|
11
|
-
api_seat_type?: string;
|
|
12
10
|
}
|
|
13
11
|
|
|
14
12
|
interface SeatSectionProps {
|
|
@@ -23,15 +21,6 @@ interface SeatSectionProps {
|
|
|
23
21
|
serviceItem?: any;
|
|
24
22
|
renderIcon?: (iconKey: string, size?: string) => React.ReactNode;
|
|
25
23
|
discountSeatPriceColor?: string;
|
|
26
|
-
isTrain?: boolean;
|
|
27
|
-
selectedSeatKey?: any;
|
|
28
|
-
onSeatSelect?: (
|
|
29
|
-
key: any,
|
|
30
|
-
price: number,
|
|
31
|
-
seatKey: string,
|
|
32
|
-
apiSeatType?: string,
|
|
33
|
-
) => void;
|
|
34
|
-
topLabelColor?: string;
|
|
35
24
|
tooltipColor?: string;
|
|
36
25
|
}
|
|
37
26
|
|
|
@@ -43,8 +32,6 @@ function getAllSeatTypes(seatTypes: SeatType[]) {
|
|
|
43
32
|
let seatTypesWithPrices = seatTypes.filter(Boolean).map((val) => ({
|
|
44
33
|
label: val?.label,
|
|
45
34
|
price: val?.fare,
|
|
46
|
-
key: val?.key,
|
|
47
|
-
apiSeatType: val?.apiSeatType || val?.api_seat_type,
|
|
48
35
|
}));
|
|
49
36
|
|
|
50
37
|
seatTypesWithPrices.sort((a, b) => a.price - b.price);
|
|
@@ -52,7 +39,7 @@ function getAllSeatTypes(seatTypes: SeatType[]) {
|
|
|
52
39
|
return seatTypesWithPrices;
|
|
53
40
|
}
|
|
54
41
|
|
|
55
|
-
function getSortedSeatTypes(seatTypes: SeatType[]
|
|
42
|
+
function getSortedSeatTypes(seatTypes: SeatType[]) {
|
|
56
43
|
if (!seatTypes?.length) {
|
|
57
44
|
return [{ label: "Salon cama", price: 0 }];
|
|
58
45
|
}
|
|
@@ -66,9 +53,7 @@ function getSortedSeatTypes(seatTypes: SeatType[], isTrain: any) {
|
|
|
66
53
|
seatTypesWithPrices[2] = seatTypesWithPrices[premiumIndex];
|
|
67
54
|
}
|
|
68
55
|
|
|
69
|
-
|
|
70
|
-
seatTypesWithPrices = seatTypesWithPrices.slice(0, 2);
|
|
71
|
-
}
|
|
56
|
+
seatTypesWithPrices = seatTypesWithPrices.slice(0, 2);
|
|
72
57
|
|
|
73
58
|
const seenPrices = new Set<number>();
|
|
74
59
|
seatTypesWithPrices = seatTypesWithPrices.filter((seat) => {
|
|
@@ -113,19 +98,15 @@ function SeatSection({
|
|
|
113
98
|
priceColor,
|
|
114
99
|
currencySign,
|
|
115
100
|
removeDuplicateSeats,
|
|
116
|
-
selectedSeatKey,
|
|
117
|
-
onSeatSelect,
|
|
118
101
|
isPeru,
|
|
119
102
|
serviceItem,
|
|
120
103
|
renderIcon,
|
|
121
104
|
dpSeatColor,
|
|
122
105
|
discountSeatPriceColor,
|
|
123
|
-
isTrain,
|
|
124
|
-
topLabelColor,
|
|
125
106
|
tooltipColor,
|
|
126
107
|
}: SeatSectionProps): React.ReactElement {
|
|
127
108
|
const uniqueSeats = getUniqueSeats(seatTypes);
|
|
128
|
-
const sortedSeatTypes = getSortedSeatTypes(seatTypes
|
|
109
|
+
const sortedSeatTypes = getSortedSeatTypes(seatTypes);
|
|
129
110
|
const numberOfSeats = getNumberOfSeats(seatTypes);
|
|
130
111
|
const isCentered = numberOfSeats < 2 || removeDuplicateSeats;
|
|
131
112
|
|
|
@@ -137,73 +118,28 @@ function SeatSection({
|
|
|
137
118
|
const renderSeatNames = () => {
|
|
138
119
|
const seats = removeDuplicateSeats ? uniqueSeats : sortedSeatTypes;
|
|
139
120
|
|
|
140
|
-
return seats.map((val, key: number) =>
|
|
141
|
-
|
|
142
|
-
<
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
? () =>
|
|
148
|
-
val.label === selectedSeatKey
|
|
149
|
-
? onSeatSelect?.(null, 0, "", "")
|
|
150
|
-
: onSeatSelect?.(
|
|
151
|
-
val.label,
|
|
152
|
-
val.price,
|
|
153
|
-
val.key,
|
|
154
|
-
(val as any).apiSeatType,
|
|
155
|
-
)
|
|
156
|
-
: undefined
|
|
157
|
-
}
|
|
121
|
+
return seats.map((val, key: number) =>
|
|
122
|
+
SEAT_EXCEPTIONS.includes(val.label) ? null : (
|
|
123
|
+
<span
|
|
124
|
+
key={key}
|
|
125
|
+
className={`flex items-center justify-between text-[13.33px] ${
|
|
126
|
+
isSoldOut ? "text-[#c0c0c0]" : ""
|
|
127
|
+
}`}
|
|
158
128
|
>
|
|
159
|
-
{
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
marginRight: "10px",
|
|
168
|
-
display: "flex",
|
|
169
|
-
alignItems: "center",
|
|
170
|
-
justifyContent: "center",
|
|
171
|
-
}}
|
|
172
|
-
>
|
|
173
|
-
{val.label === selectedSeatKey && (
|
|
174
|
-
<div
|
|
175
|
-
style={{
|
|
176
|
-
backgroundColor: topLabelColor,
|
|
177
|
-
borderRadius: "50%",
|
|
178
|
-
width: "7px",
|
|
179
|
-
height: "7px",
|
|
180
|
-
}}
|
|
181
|
-
/>
|
|
182
|
-
)}
|
|
183
|
-
</div>
|
|
184
|
-
)}
|
|
185
|
-
<span
|
|
186
|
-
key={key}
|
|
187
|
-
className={`flex items-center justify-between text-[13.33px] whitespace-nowrap ${
|
|
188
|
-
isSoldOut ? "text-[#c0c0c0]" : ""
|
|
189
|
-
}`}
|
|
190
|
-
>
|
|
191
|
-
{typeof val.label === "string" || typeof val.label === "number"
|
|
192
|
-
? removeDuplicateSeats && isPeru
|
|
193
|
-
? CommonService.truncateSeatLabel(val.label)
|
|
194
|
-
: isTrain
|
|
195
|
-
? CommonService.capitalize(String(val.label))
|
|
196
|
-
: val.label
|
|
197
|
-
: null}
|
|
198
|
-
</span>
|
|
199
|
-
</div>
|
|
200
|
-
);
|
|
201
|
-
});
|
|
129
|
+
{typeof val.label === "string" || typeof val.label === "number"
|
|
130
|
+
? removeDuplicateSeats && isPeru
|
|
131
|
+
? CommonService.truncateSeatLabel(val.label)
|
|
132
|
+
: val.label
|
|
133
|
+
: null}
|
|
134
|
+
</span>
|
|
135
|
+
),
|
|
136
|
+
);
|
|
202
137
|
};
|
|
203
138
|
|
|
204
139
|
const renderSeatPrices = () => {
|
|
205
140
|
if (isPeru) {
|
|
206
|
-
const isMovilBus =
|
|
141
|
+
const isMovilBus =
|
|
142
|
+
serviceItem?.operator_service_name === "MovilBus" || "Movil Bus";
|
|
207
143
|
|
|
208
144
|
// Multiple unique seat types → show a price row for each (MovilBus only)
|
|
209
145
|
if (isMovilBus && uniqueSeats.length > 1) {
|
|
@@ -302,7 +238,6 @@ function SeatSection({
|
|
|
302
238
|
}
|
|
303
239
|
return null;
|
|
304
240
|
})();
|
|
305
|
-
console.log("🚀 ~ SeatSection ~ serviceItem:", serviceItem);
|
|
306
241
|
|
|
307
242
|
// Hide the % OFF badge when max_discount is capping the percentage discount
|
|
308
243
|
// (i.e. both percentage and max_discount exist, and the raw % amount exceeds the cap)
|
|
@@ -324,7 +259,8 @@ function SeatSection({
|
|
|
324
259
|
|
|
325
260
|
const renderLabels = () => {
|
|
326
261
|
if (isPeru) {
|
|
327
|
-
const isMovilBus =
|
|
262
|
+
const isMovilBus =
|
|
263
|
+
serviceItem?.operator_service_name === "MovilBus" || "Movil Bus";
|
|
328
264
|
|
|
329
265
|
// Multiple unique seat types → show a label row for each (MovilBus only)
|
|
330
266
|
if (isMovilBus && uniqueSeats.length > 1) {
|
|
@@ -355,7 +291,7 @@ function SeatSection({
|
|
|
355
291
|
: null;
|
|
356
292
|
|
|
357
293
|
const operatorServiceName =
|
|
358
|
-
serviceItem?.operator_service_name === "MovilBus";
|
|
294
|
+
serviceItem?.operator_service_name === "MovilBus" || "Movil Bus";
|
|
359
295
|
|
|
360
296
|
return (
|
|
361
297
|
<>
|
|
@@ -372,9 +308,7 @@ function SeatSection({
|
|
|
372
308
|
|
|
373
309
|
<span className="text-[13.33px] flex flex-col">
|
|
374
310
|
{operatorServiceName ? (
|
|
375
|
-
<span className="text-[13.33px]
|
|
376
|
-
{seatLabel}
|
|
377
|
-
</span>
|
|
311
|
+
<span className="text-[13.33px]">{seatLabel}</span>
|
|
378
312
|
) : (
|
|
379
313
|
<span className="text-[13.33px]">Desde</span>
|
|
380
314
|
)}
|
|
@@ -597,7 +531,7 @@ function SeatSection({
|
|
|
597
531
|
style={{ textAlign: "center" }}
|
|
598
532
|
>
|
|
599
533
|
<span
|
|
600
|
-
className="text-[13.33px] font-normal leading-[20px] text-[#9f9f9f] relative
|
|
534
|
+
className="text-[13.33px] font-normal leading-[20px] text-[#9f9f9f] relative"
|
|
601
535
|
style={{
|
|
602
536
|
position: "relative",
|
|
603
537
|
}}
|
|
@@ -659,9 +593,7 @@ function SeatSection({
|
|
|
659
593
|
color: isSoldOut ? "#c0c0c0" : priceColor,
|
|
660
594
|
top: 0,
|
|
661
595
|
bottom: 0,
|
|
662
|
-
left:
|
|
663
|
-
? "73%"
|
|
664
|
-
: "clamp(60%, 65% + (100vw - 1300px) * 0.1, 65%)",
|
|
596
|
+
left: "clamp(60%, 65% + (100vw - 1300px) * 0.1, 65%)",
|
|
665
597
|
right: 0,
|
|
666
598
|
justifyContent: isCentered ? "center" : "",
|
|
667
599
|
gap: "10px",
|
|
@@ -25,7 +25,6 @@ interface DateTimeSectionMobileProps {
|
|
|
25
25
|
tooltipBgColor?: string;
|
|
26
26
|
showLastSeats?: boolean;
|
|
27
27
|
discountSeatPriceColor?: string;
|
|
28
|
-
isTrain?: boolean;
|
|
29
28
|
}
|
|
30
29
|
|
|
31
30
|
const pad = (n: number) => (n < 10 ? "0" + n : String(n));
|
|
@@ -68,47 +67,41 @@ const TimeRow: React.FC<TimeRowProps> = ({
|
|
|
68
67
|
isSoldOut,
|
|
69
68
|
}) => {
|
|
70
69
|
const formattedDate = DateService.getServiceItemDate(date);
|
|
71
|
-
const dotPositionClass = formattedDate.includes("dom")
|
|
72
|
-
|
|
73
|
-
:
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
<
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
isSoldOut ? "grayscale" : ""
|
|
92
|
-
}`}
|
|
93
|
-
/>
|
|
94
|
-
</div>
|
|
95
|
-
)}
|
|
96
|
-
</div>
|
|
97
|
-
<div
|
|
98
|
-
className="flex items-center relative capitalize justify-between"
|
|
99
|
-
style={{ flex: 1 }}
|
|
100
|
-
>
|
|
101
|
-
<span className="cursor-pointer black-text whitespace-nowrap">
|
|
102
|
-
{formattedDate}
|
|
103
|
-
</span>
|
|
104
|
-
<div className={`absolute left-[50%] ${dotPositionClass}`}>•</div>
|
|
105
|
-
<div className="font-[900] relative black-text whitespace-nowrap">
|
|
106
|
-
{timeContent}
|
|
70
|
+
const dotPositionClass = formattedDate.includes("dom") ? "max-[399px]:left-[53%]" : "";
|
|
71
|
+
return <div
|
|
72
|
+
className={`flex items-center min-[420]:text-[13px] text-[12px] justify-between ${
|
|
73
|
+
isSoldOut ? "text-[#c0c0c0]" : ""
|
|
74
|
+
}`}
|
|
75
|
+
>
|
|
76
|
+
<div className="flex items-center" style={{ flex: 1 }}>
|
|
77
|
+
<div>
|
|
78
|
+
{" "}
|
|
79
|
+
{label ? (
|
|
80
|
+
<div className="w-[60px]">{label}</div>
|
|
81
|
+
) : (
|
|
82
|
+
<div className="w-[12px] h-auto mr-[5px]">
|
|
83
|
+
<img
|
|
84
|
+
src={icon}
|
|
85
|
+
alt={alt}
|
|
86
|
+
className={`w-[12px] h-auto mr-[5px] ${
|
|
87
|
+
isSoldOut ? "grayscale" : ""
|
|
88
|
+
}`}
|
|
89
|
+
/>
|
|
107
90
|
</div>
|
|
108
|
-
|
|
91
|
+
)}
|
|
92
|
+
</div>
|
|
93
|
+
<div
|
|
94
|
+
className="flex items-center relative capitalize justify-between"
|
|
95
|
+
style={{ flex: 1 }}
|
|
96
|
+
>
|
|
97
|
+
<span className="cursor-pointer black-text">
|
|
98
|
+
{formattedDate}
|
|
99
|
+
</span>
|
|
100
|
+
<div className={`absolute left-[50%] ${dotPositionClass}`}>•</div>
|
|
101
|
+
<div className="font-[900] relative black-text">{timeContent}</div>
|
|
109
102
|
</div>
|
|
110
103
|
</div>
|
|
111
|
-
|
|
104
|
+
</div>;
|
|
112
105
|
};
|
|
113
106
|
|
|
114
107
|
function DateTimeSectionMobile({
|
|
@@ -134,7 +127,6 @@ function DateTimeSectionMobile({
|
|
|
134
127
|
tooltipBgColor,
|
|
135
128
|
showLastSeats,
|
|
136
129
|
discountSeatPriceColor,
|
|
137
|
-
isTrain,
|
|
138
130
|
}: DateTimeSectionMobileProps): React.ReactElement {
|
|
139
131
|
const { cleaned: cleanedDepTime, hasAM, hasPM } = getCleanedDepTime(depTime);
|
|
140
132
|
|
|
@@ -161,12 +153,8 @@ function DateTimeSectionMobile({
|
|
|
161
153
|
>
|
|
162
154
|
{/* DATE AND TIME */}
|
|
163
155
|
<div
|
|
164
|
-
className=
|
|
165
|
-
style={{
|
|
166
|
-
justifyContent: isCiva && "center",
|
|
167
|
-
minHeight: isTrain ? undefined : "2.5rem",
|
|
168
|
-
alignSelf: isTrain ? "stretch" : undefined,
|
|
169
|
-
}}
|
|
156
|
+
className="min-h-[2.5rem] flex flex-col justify-between gap-[4px] w-[50%] "
|
|
157
|
+
style={{ justifyContent: isCiva && "center" }}
|
|
170
158
|
>
|
|
171
159
|
<TimeRow
|
|
172
160
|
label={orignLabel}
|
|
@@ -210,7 +198,6 @@ function DateTimeSectionMobile({
|
|
|
210
198
|
tooltipBgColor={tooltipBgColor}
|
|
211
199
|
showLastSeats={showLastSeats}
|
|
212
200
|
discountSeatPriceColor={discountSeatPriceColor}
|
|
213
|
-
isTrain={isTrain}
|
|
214
201
|
/>
|
|
215
202
|
</div>
|
|
216
203
|
);
|