kupos-ui-components-lib 9.2.7 → 9.2.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ServiceItem/PeruServiceItemDesktop.d.ts +1 -1
- package/dist/components/ServiceItem/PeruServiceItemDesktop.js +243 -127
- package/dist/components/ServiceItem/ServiceItemDesktop.js +7 -11
- package/dist/styles.css +3 -0
- package/dist/ui/AmenitiesBlock.js +10 -2
- package/dist/ui/RatingBlock.js +3 -3
- package/package.json +1 -1
- package/src/components/ServiceItem/PeruServiceItemDesktop.tsx +404 -92
- package/src/components/ServiceItem/ServiceItemDesktop.tsx +9 -9
- package/src/ui/AmenitiesBlock.tsx +11 -2
- package/src/ui/RatingBlock.tsx +3 -3
|
@@ -34,15 +34,53 @@ import linatalDirectoAnimation from "../../assets/images/anims/service_list/dire
|
|
|
34
34
|
import linatalPriorityStageAnimation from "../../assets/images/anims/service_list/priority_stage.json";
|
|
35
35
|
import linatalPetFriendlyAnimation from "../../assets/images/anims/service_list/pet_friendly.json";
|
|
36
36
|
import linatalLocationAnimation from "../../assets/images/anims/service_list/location.json";
|
|
37
|
+
|
|
38
|
+
import bombAnimation from "../../assets/images/anims/service_list/bomb.json";
|
|
39
|
+
|
|
37
40
|
import StageTooltip from "../../ui/StagesTooltip";
|
|
38
41
|
import RatingBlock from "../../ui/RatingBlock";
|
|
39
42
|
import DurationBlock from "../../ui/DurationBlock";
|
|
40
43
|
import PetBlock from "../../ui/PetBlock";
|
|
41
44
|
import FlexibleBlock from "../../ui/FlexibleBlock";
|
|
42
45
|
import AmenitiesBlock from "../../ui/AmenitiesBlock";
|
|
46
|
+
import SeatSection from "../../ui/SeatSection/SeatSection";
|
|
47
|
+
import KuposButton from "../../ui/KuposButton/KuposButton";
|
|
48
|
+
import BottomAmenities from "../../ui/BottomAmenities/BottomAmenities";
|
|
43
49
|
|
|
44
50
|
const SEAT_EXCEPTIONS = ["Asiento mascota"];
|
|
45
51
|
|
|
52
|
+
const ANIMATION_MAP: Record<string, Record<string, any>> = {
|
|
53
|
+
promoAnim: {
|
|
54
|
+
kupos: promoAnimation,
|
|
55
|
+
},
|
|
56
|
+
locationAnim: {
|
|
57
|
+
kupos: locationAnimation,
|
|
58
|
+
pullman: pullmanLocationAnimation,
|
|
59
|
+
opsites: opsitesLocationAnimation,
|
|
60
|
+
},
|
|
61
|
+
directoAnim: {
|
|
62
|
+
kupos: directoAnimation,
|
|
63
|
+
},
|
|
64
|
+
petFriendlyAnim: {
|
|
65
|
+
kupos: petFriendlyAnimation,
|
|
66
|
+
pullman: pullmanPetFriendlyAnimation,
|
|
67
|
+
opsites: opsitesPetFriendlyAnimation,
|
|
68
|
+
},
|
|
69
|
+
priorityStageAnim: {
|
|
70
|
+
kupos: priorityStageAnimation,
|
|
71
|
+
pullman: pullmanPriorityStageAnimation,
|
|
72
|
+
opsites: opsitesPriorityStageAnimation,
|
|
73
|
+
},
|
|
74
|
+
flexibleIcon: {
|
|
75
|
+
kupos: flexibleAnimation,
|
|
76
|
+
pullman: pullmanFlexibleAnimation,
|
|
77
|
+
opsites: opsitesFlexibleAnimation,
|
|
78
|
+
},
|
|
79
|
+
bombAnimation: {
|
|
80
|
+
kupos: bombAnimation,
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
|
|
46
84
|
function PeruServiceItemDesktop({
|
|
47
85
|
serviceItem,
|
|
48
86
|
onBookButtonPress,
|
|
@@ -67,52 +105,39 @@ function PeruServiceItemDesktop({
|
|
|
67
105
|
isPeru,
|
|
68
106
|
siteType,
|
|
69
107
|
isAllinBus,
|
|
108
|
+
viewersConfig,
|
|
109
|
+
isExpand,
|
|
110
|
+
setIsExpand,
|
|
111
|
+
coachKey,
|
|
70
112
|
t = (key: string) => key,
|
|
71
113
|
}: ServiceItemProps & { currencySign?: string }): React.ReactElement {
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
},
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
pullman: pullmanPetFriendlyAnimation,
|
|
94
|
-
opsites: opsitesPetFriendlyAnimation,
|
|
95
|
-
linatal: linatalPetFriendlyAnimation,
|
|
96
|
-
},
|
|
97
|
-
priorityStageAnim: {
|
|
98
|
-
kupos: priorityStageAnimation,
|
|
99
|
-
pullman: pullmanPriorityStageAnimation,
|
|
100
|
-
opsites: opsitesPriorityStageAnimation,
|
|
101
|
-
linatal: linatalPriorityStageAnimation,
|
|
102
|
-
},
|
|
103
|
-
flexibleIcon: {
|
|
104
|
-
kupos: flexibleAnimation,
|
|
105
|
-
pullman: pullmanFlexibleAnimation,
|
|
106
|
-
opsites: opsitesFlexibleAnimation,
|
|
107
|
-
linatal: linatalFlexibleAnimation,
|
|
108
|
-
},
|
|
114
|
+
const startViewerCount = (node: HTMLSpanElement | null) => {
|
|
115
|
+
if (!node || !viewersConfig) return;
|
|
116
|
+
|
|
117
|
+
const prevId = node.dataset.viewerId;
|
|
118
|
+
if (prevId) clearInterval(Number(prevId));
|
|
119
|
+
|
|
120
|
+
const { min, max, interval = 5000 } = viewersConfig;
|
|
121
|
+
const clamp = (v: number) => Math.min(max, Math.max(min, v));
|
|
122
|
+
const initialValue = Math.floor(Math.random() * (max - min + 1)) + min;
|
|
123
|
+
|
|
124
|
+
node.textContent = String(initialValue);
|
|
125
|
+
|
|
126
|
+
const id = setInterval(() => {
|
|
127
|
+
const current = Number(node.textContent) || initialValue;
|
|
128
|
+
const delta = Math.ceil(current * 0.2);
|
|
129
|
+
const next =
|
|
130
|
+
current + Math.floor(Math.random() * (2 * delta + 1)) - delta;
|
|
131
|
+
node.textContent = String(clamp(Math.round(next)));
|
|
132
|
+
}, interval);
|
|
133
|
+
|
|
134
|
+
node.dataset.viewerId = String(id);
|
|
109
135
|
};
|
|
110
136
|
|
|
111
137
|
const getAnimationIcon = (icon: string) => {
|
|
112
|
-
const animation =
|
|
138
|
+
const animation = ANIMATION_MAP[icon];
|
|
113
139
|
if (!animation) return null;
|
|
114
|
-
|
|
115
|
-
return animation[currentSiteType];
|
|
140
|
+
return animation[siteType] ?? animation.kupos;
|
|
116
141
|
};
|
|
117
142
|
const SvgAmenities = ({
|
|
118
143
|
moreAnemities,
|
|
@@ -450,26 +475,56 @@ function PeruServiceItemDesktop({
|
|
|
450
475
|
? extractStage(serviceItem.stage_details_arr, 1)
|
|
451
476
|
: null;
|
|
452
477
|
|
|
478
|
+
const countdownSeconds = 599;
|
|
479
|
+
|
|
480
|
+
const startCountdown = (node: HTMLSpanElement | null) => {
|
|
481
|
+
if (!node) return;
|
|
482
|
+
|
|
483
|
+
const prevId = node.dataset.countdownId;
|
|
484
|
+
if (prevId) clearInterval(Number(prevId));
|
|
485
|
+
|
|
486
|
+
let remaining = countdownSeconds;
|
|
487
|
+
|
|
488
|
+
const formatTime = (totalSecs: number) => {
|
|
489
|
+
const m = Math.floor(totalSecs / 60);
|
|
490
|
+
const s = totalSecs % 60;
|
|
491
|
+
return `${String(m).padStart(2, "0")}:${String(s).padStart(2, "0")}`;
|
|
492
|
+
};
|
|
493
|
+
|
|
494
|
+
node.textContent = formatTime(remaining);
|
|
495
|
+
|
|
496
|
+
const id = setInterval(() => {
|
|
497
|
+
remaining -= 1;
|
|
498
|
+
if (remaining <= 0) {
|
|
499
|
+
remaining = countdownSeconds;
|
|
500
|
+
}
|
|
501
|
+
node.textContent = formatTime(remaining);
|
|
502
|
+
}, 1000);
|
|
503
|
+
|
|
504
|
+
node.dataset.countdownId = String(id);
|
|
505
|
+
};
|
|
506
|
+
|
|
453
507
|
const items = [
|
|
454
508
|
{
|
|
455
|
-
key: "
|
|
456
|
-
width: "
|
|
509
|
+
key: "amenities",
|
|
510
|
+
width: "20%",
|
|
511
|
+
condition: true,
|
|
457
512
|
render: (
|
|
458
|
-
<
|
|
459
|
-
showRating={showRating}
|
|
513
|
+
<AmenitiesBlock
|
|
460
514
|
serviceItem={serviceItem}
|
|
515
|
+
metaData={metaData}
|
|
461
516
|
isSoldOut={isSoldOut}
|
|
462
517
|
colors={colors}
|
|
463
|
-
|
|
464
|
-
|
|
518
|
+
getAnimationIcon={getAnimationIcon}
|
|
519
|
+
getAmenityName={CommonService.getAmenityName}
|
|
520
|
+
SvgAmenities={SvgAmenities}
|
|
465
521
|
isPeru={isPeru}
|
|
466
522
|
/>
|
|
467
523
|
),
|
|
468
524
|
},
|
|
469
|
-
|
|
470
525
|
{
|
|
471
526
|
key: "duration",
|
|
472
|
-
width: "
|
|
527
|
+
width: "12%",
|
|
473
528
|
condition: serviceItem.duration,
|
|
474
529
|
render: (
|
|
475
530
|
<DurationBlock
|
|
@@ -482,6 +537,20 @@ function PeruServiceItemDesktop({
|
|
|
482
537
|
),
|
|
483
538
|
},
|
|
484
539
|
|
|
540
|
+
// {
|
|
541
|
+
// key: "directo",
|
|
542
|
+
// width: "12%",
|
|
543
|
+
// condition: serviceItem?.is_direct_trip === true,
|
|
544
|
+
// render: (
|
|
545
|
+
// <DirectoBlock
|
|
546
|
+
// translation={translation}
|
|
547
|
+
// getAnimationIcon={getAnimationIcon}
|
|
548
|
+
// colors={colors}
|
|
549
|
+
// isSoldOut={isSoldOut}
|
|
550
|
+
// />
|
|
551
|
+
// ),
|
|
552
|
+
// },
|
|
553
|
+
|
|
485
554
|
{
|
|
486
555
|
key: "pet",
|
|
487
556
|
width: "20%",
|
|
@@ -501,7 +570,7 @@ function PeruServiceItemDesktop({
|
|
|
501
570
|
{
|
|
502
571
|
key: "flexible",
|
|
503
572
|
width: "20%",
|
|
504
|
-
condition:
|
|
573
|
+
condition: serviceItem.is_change_ticket === true,
|
|
505
574
|
render: (
|
|
506
575
|
<FlexibleBlock
|
|
507
576
|
translation={translation}
|
|
@@ -512,30 +581,101 @@ function PeruServiceItemDesktop({
|
|
|
512
581
|
/>
|
|
513
582
|
),
|
|
514
583
|
},
|
|
515
|
-
|
|
516
|
-
{
|
|
517
|
-
key: "amenities",
|
|
518
|
-
width: "20%",
|
|
519
|
-
render: (
|
|
520
|
-
<AmenitiesBlock
|
|
521
|
-
serviceItem={serviceItem}
|
|
522
|
-
metaData={metaData}
|
|
523
|
-
isSoldOut={isSoldOut}
|
|
524
|
-
colors={colors}
|
|
525
|
-
isPeru={isPeru}
|
|
526
|
-
getAnimationIcon={getAnimationIcon}
|
|
527
|
-
getAmenityName={CommonService.getAmenityName}
|
|
528
|
-
SvgAmenities={SvgAmenities}
|
|
529
|
-
/>
|
|
530
|
-
),
|
|
531
|
-
},
|
|
532
584
|
];
|
|
533
585
|
|
|
534
|
-
const amenitiesItem = items.find((i) => i.key === "amenities");
|
|
535
586
|
const otherItems = items.filter(
|
|
536
|
-
(i) => i.key !== "
|
|
587
|
+
(i) => i.key !== "pet" && i.key !== "flexible" && !!i.condition,
|
|
537
588
|
);
|
|
538
589
|
|
|
590
|
+
const isItemExpanded = serviceItem.id === isExpand || isExpand === true;
|
|
591
|
+
const grayscaleClass = isSoldOut ? "grayscale" : "";
|
|
592
|
+
|
|
593
|
+
// const items = [
|
|
594
|
+
// {
|
|
595
|
+
// key: "rating",
|
|
596
|
+
// width: "30%",
|
|
597
|
+
// render: (
|
|
598
|
+
// <RatingBlock
|
|
599
|
+
// showRating={showRating}
|
|
600
|
+
// serviceItem={serviceItem}
|
|
601
|
+
// isSoldOut={isSoldOut}
|
|
602
|
+
// colors={colors}
|
|
603
|
+
// t={t}
|
|
604
|
+
// translation={translation}
|
|
605
|
+
// isPeru={isPeru}
|
|
606
|
+
// />
|
|
607
|
+
// ),
|
|
608
|
+
// },
|
|
609
|
+
|
|
610
|
+
// {
|
|
611
|
+
// key: "duration",
|
|
612
|
+
// width: "20%",
|
|
613
|
+
// condition: serviceItem.duration,
|
|
614
|
+
// render: (
|
|
615
|
+
// <DurationBlock
|
|
616
|
+
// serviceItem={serviceItem}
|
|
617
|
+
// translation={translation}
|
|
618
|
+
// renderIcon={renderIcon}
|
|
619
|
+
// isSoldOut={isSoldOut}
|
|
620
|
+
// colors={colors}
|
|
621
|
+
// />
|
|
622
|
+
// ),
|
|
623
|
+
// },
|
|
624
|
+
|
|
625
|
+
// {
|
|
626
|
+
// key: "pet",
|
|
627
|
+
// width: "20%",
|
|
628
|
+
// condition:
|
|
629
|
+
// serviceItem.pet_seat_info &&
|
|
630
|
+
// Object.keys(serviceItem.pet_seat_info).length > 0,
|
|
631
|
+
// render: (
|
|
632
|
+
// <PetBlock
|
|
633
|
+
// translation={translation}
|
|
634
|
+
// getAnimationIcon={getAnimationIcon}
|
|
635
|
+
// colors={colors}
|
|
636
|
+
// isSoldOut={isSoldOut}
|
|
637
|
+
// />
|
|
638
|
+
// ),
|
|
639
|
+
// },
|
|
640
|
+
|
|
641
|
+
// {
|
|
642
|
+
// key: "flexible",
|
|
643
|
+
// width: "20%",
|
|
644
|
+
// condition: false,
|
|
645
|
+
// render: (
|
|
646
|
+
// <FlexibleBlock
|
|
647
|
+
// translation={translation}
|
|
648
|
+
// getAnimationIcon={getAnimationIcon}
|
|
649
|
+
// colors={colors}
|
|
650
|
+
// serviceItem={serviceItem}
|
|
651
|
+
// isSoldOut={isSoldOut}
|
|
652
|
+
// />
|
|
653
|
+
// ),
|
|
654
|
+
// },
|
|
655
|
+
|
|
656
|
+
// {
|
|
657
|
+
// key: "amenities",
|
|
658
|
+
// width: "20%",
|
|
659
|
+
// render: (
|
|
660
|
+
// <AmenitiesBlock
|
|
661
|
+
// serviceItem={serviceItem}
|
|
662
|
+
// metaData={metaData}
|
|
663
|
+
// isSoldOut={isSoldOut}
|
|
664
|
+
// colors={colors}
|
|
665
|
+
// isPeru={isPeru}
|
|
666
|
+
// getAnimationIcon={getAnimationIcon}
|
|
667
|
+
// getAmenityName={CommonService.getAmenityName}
|
|
668
|
+
// SvgAmenities={SvgAmenities}
|
|
669
|
+
// />
|
|
670
|
+
// ),
|
|
671
|
+
// },
|
|
672
|
+
// ];
|
|
673
|
+
|
|
674
|
+
// const amenitiesItem = items.find((i) => i.key === "amenities");
|
|
675
|
+
// const otherItems = items.filter(
|
|
676
|
+
// (i) => i.key !== "amenities" && i.condition !== false,
|
|
677
|
+
// );
|
|
678
|
+
|
|
539
679
|
return (
|
|
540
680
|
<div
|
|
541
681
|
className={`relative ${
|
|
@@ -549,9 +689,15 @@ function PeruServiceItemDesktop({
|
|
|
549
689
|
} `}
|
|
550
690
|
>
|
|
551
691
|
<div
|
|
552
|
-
|
|
692
|
+
id={`service-card-${serviceItem.id}`}
|
|
693
|
+
className="bg-white mx-auto relative rounded-[10px] border border-[#ccc]"
|
|
553
694
|
>
|
|
554
|
-
<div
|
|
695
|
+
<div
|
|
696
|
+
className=" pt-[20px]"
|
|
697
|
+
style={{
|
|
698
|
+
padding: coachKey ? "15px 15px 20px 15px" : "20px 15px 11px 15px",
|
|
699
|
+
}}
|
|
700
|
+
>
|
|
555
701
|
{/* Header with operator info and favorite */}
|
|
556
702
|
{/* <div className="flex justify-between items-center mb-[15px]">
|
|
557
703
|
<div className="flex items-center justify-between w-[250px]">
|
|
@@ -579,10 +725,48 @@ function PeruServiceItemDesktop({
|
|
|
579
725
|
{/* <div className="grid grid-cols-[1.5fr_1fr_auto] gap-[3rem] sm:gap-[4rem] md:gap-[5rem] lg:gap-[6rem] xl:gap-[5rem] 2xl:gap-[7rem] text-[#464647]"> */}
|
|
580
726
|
<div
|
|
581
727
|
className="grid text-[#464647] w-full [grid-template-columns:14%_40%_0.5%_24%_13.5%] gap-x-[2%] items-center"
|
|
582
|
-
style={{ marginTop: showTopLabel ? "8px" : "" }}
|
|
728
|
+
// style={{ marginTop: showTopLabel ? "8px" : "" }}
|
|
729
|
+
style={{
|
|
730
|
+
marginTop:
|
|
731
|
+
showTopLabel || serviceItem?.is_direct_trip ? "8px" : "",
|
|
732
|
+
}}
|
|
583
733
|
>
|
|
584
734
|
{/* OPERATOR LOGO */}
|
|
585
|
-
<div
|
|
735
|
+
<div
|
|
736
|
+
style={{
|
|
737
|
+
display: "flex",
|
|
738
|
+
flexDirection: "column",
|
|
739
|
+
// gap: "5px",
|
|
740
|
+
}}
|
|
741
|
+
>
|
|
742
|
+
<div
|
|
743
|
+
// className="flex items-center justify-center m-[auto]"
|
|
744
|
+
className=""
|
|
745
|
+
>
|
|
746
|
+
<img
|
|
747
|
+
src={serviceItem.operator_details[0]}
|
|
748
|
+
alt="service logo"
|
|
749
|
+
className={`h-[30px] w-[auto] ${
|
|
750
|
+
isSoldOut ? "grayscale" : ""
|
|
751
|
+
}`}
|
|
752
|
+
/>
|
|
753
|
+
{isCiva ? (
|
|
754
|
+
<div className="text-[13.33px] black-text ml-2">
|
|
755
|
+
{serviceItem.operator_details[2]}
|
|
756
|
+
</div>
|
|
757
|
+
) : null}
|
|
758
|
+
</div>
|
|
759
|
+
<RatingBlock
|
|
760
|
+
showRating={showRating}
|
|
761
|
+
serviceItem={serviceItem}
|
|
762
|
+
isSoldOut={isSoldOut}
|
|
763
|
+
colors={colors}
|
|
764
|
+
t={t}
|
|
765
|
+
translation={translation}
|
|
766
|
+
isPeru={isPeru}
|
|
767
|
+
/>
|
|
768
|
+
</div>
|
|
769
|
+
{/* <div className="flex items-center justify-center m-[auto]">
|
|
586
770
|
<div className=" ">
|
|
587
771
|
<img
|
|
588
772
|
src={serviceItem.operator_details[0]}
|
|
@@ -597,7 +781,7 @@ function PeruServiceItemDesktop({
|
|
|
597
781
|
{serviceItem.operator_details[2]}
|
|
598
782
|
</div>
|
|
599
783
|
) : null}
|
|
600
|
-
</div>
|
|
784
|
+
</div> */}
|
|
601
785
|
|
|
602
786
|
{/* DATE AND TIME - Grid Layout */}
|
|
603
787
|
<div
|
|
@@ -609,7 +793,7 @@ function PeruServiceItemDesktop({
|
|
|
609
793
|
}}
|
|
610
794
|
>
|
|
611
795
|
{/* ICONS COLUMN */}
|
|
612
|
-
<div className="flex flex-col gap-[
|
|
796
|
+
<div className="flex flex-col gap-[4px]">
|
|
613
797
|
{/* Origin Icon */}
|
|
614
798
|
{orignLabel ? (
|
|
615
799
|
<div className="w-[60px] h-[20px] flex items-center bold-text">
|
|
@@ -647,7 +831,7 @@ function PeruServiceItemDesktop({
|
|
|
647
831
|
</div>
|
|
648
832
|
|
|
649
833
|
{/* DATES COLUMN */}
|
|
650
|
-
<div className="flex flex-col gap-[
|
|
834
|
+
<div className="flex flex-col gap-[4px]">
|
|
651
835
|
{/* Departure Date */}
|
|
652
836
|
<StageTooltip
|
|
653
837
|
stageData={serviceItem.boarding_stages}
|
|
@@ -680,7 +864,7 @@ function PeruServiceItemDesktop({
|
|
|
680
864
|
</div>
|
|
681
865
|
|
|
682
866
|
{/* DOTS COLUMN */}
|
|
683
|
-
<div className="flex flex-col gap-[
|
|
867
|
+
<div className="flex flex-col gap-[4px] items-center">
|
|
684
868
|
{/* Departure Dot */}
|
|
685
869
|
<div className="h-[20px] flex items-center justify-center">
|
|
686
870
|
<div>•</div>
|
|
@@ -697,7 +881,7 @@ function PeruServiceItemDesktop({
|
|
|
697
881
|
</div>
|
|
698
882
|
|
|
699
883
|
{/* TIMES COLUMN */}
|
|
700
|
-
<div className="flex flex-col gap-[
|
|
884
|
+
<div className="flex flex-col gap-[4px]">
|
|
701
885
|
{/* Departure Time */}
|
|
702
886
|
<StageTooltip
|
|
703
887
|
stageData={serviceItem.dropoff_stages}
|
|
@@ -743,6 +927,18 @@ function PeruServiceItemDesktop({
|
|
|
743
927
|
></div>
|
|
744
928
|
{/* SEATS */}
|
|
745
929
|
<div className="content-center">
|
|
930
|
+
<SeatSection
|
|
931
|
+
seatTypes={serviceItem.seat_types}
|
|
932
|
+
serviceItem={serviceItem}
|
|
933
|
+
availableSeats={serviceItem.available_seats}
|
|
934
|
+
isSoldOut={isSoldOut}
|
|
935
|
+
priceColor={colors.priceColor}
|
|
936
|
+
currencySign={currencySign}
|
|
937
|
+
removeDuplicateSeats={removeDuplicateSeats}
|
|
938
|
+
isPeru={isPeru}
|
|
939
|
+
/>
|
|
940
|
+
</div>
|
|
941
|
+
{/* <div className="content-center">
|
|
746
942
|
<div
|
|
747
943
|
className={`relative flex gap-[10px] text-[13.33px] justify-between min-h-[2.5rem] ${
|
|
748
944
|
getNumberOfSeats() < 3 ? "" : ""
|
|
@@ -784,10 +980,38 @@ function PeruServiceItemDesktop({
|
|
|
784
980
|
{getSeatPrice()}
|
|
785
981
|
</div>
|
|
786
982
|
</div>
|
|
787
|
-
</div>
|
|
983
|
+
</div> */}
|
|
788
984
|
|
|
789
985
|
{/* BUTTON */}
|
|
790
986
|
<div>
|
|
987
|
+
{showLastSeats ? (
|
|
988
|
+
<div
|
|
989
|
+
className="flex justify-end mr-[11px] "
|
|
990
|
+
style={{
|
|
991
|
+
position: "absolute",
|
|
992
|
+
top: serviceDetailsLoading ? "7px" : "5px",
|
|
993
|
+
right: "16px",
|
|
994
|
+
}}
|
|
995
|
+
>
|
|
996
|
+
{serviceItem?.available_seats < 10 &&
|
|
997
|
+
serviceItem?.available_seats > 0 && (
|
|
998
|
+
<div className="text-[12px] text-[#464647] mt-1 text-center">
|
|
999
|
+
¡Últimos Asientos!
|
|
1000
|
+
</div>
|
|
1001
|
+
)}
|
|
1002
|
+
</div>
|
|
1003
|
+
) : null}
|
|
1004
|
+
<KuposButton
|
|
1005
|
+
isSoldOut={isSoldOut}
|
|
1006
|
+
isLoading={serviceDetailsLoading}
|
|
1007
|
+
buttonColor={colors.kuposButtonColor}
|
|
1008
|
+
buyLabel={translation?.buyButton}
|
|
1009
|
+
soldOutLabel={translation?.soldOutButton}
|
|
1010
|
+
soldOutIcon={renderIcon("soldOutIcon", "14px")}
|
|
1011
|
+
onClick={checkMidnight}
|
|
1012
|
+
/>
|
|
1013
|
+
</div>
|
|
1014
|
+
{/* <div>
|
|
791
1015
|
<button
|
|
792
1016
|
onClick={() => (!isSoldOut ? checkMidnight() : null)}
|
|
793
1017
|
disabled={serviceDetailsLoading}
|
|
@@ -817,9 +1041,24 @@ function PeruServiceItemDesktop({
|
|
|
817
1041
|
)}
|
|
818
1042
|
</span>
|
|
819
1043
|
</button>
|
|
820
|
-
</div>
|
|
1044
|
+
</div> */}
|
|
821
1045
|
</div>
|
|
822
|
-
|
|
1046
|
+
<BottomAmenities
|
|
1047
|
+
otherItems={otherItems}
|
|
1048
|
+
serviceItem={serviceItem}
|
|
1049
|
+
grayscaleClass={grayscaleClass}
|
|
1050
|
+
isSoldOut={isSoldOut}
|
|
1051
|
+
isItemExpanded={isItemExpanded}
|
|
1052
|
+
colors={colors}
|
|
1053
|
+
translation={translation}
|
|
1054
|
+
getAnimationIcon={getAnimationIcon}
|
|
1055
|
+
downArrowIcon={renderIcon("downArrow", "10px")}
|
|
1056
|
+
onToggleExpand={() =>
|
|
1057
|
+
setIsExpand && setIsExpand(isItemExpanded ? null : serviceItem.id)
|
|
1058
|
+
}
|
|
1059
|
+
isPeru={isPeru}
|
|
1060
|
+
/>
|
|
1061
|
+
{/* {showLastSeats ? (
|
|
823
1062
|
<div className="flex justify-end mr-[11px]">
|
|
824
1063
|
{serviceItem?.available_seats < 10 &&
|
|
825
1064
|
serviceItem?.available_seats > 0 && (
|
|
@@ -828,18 +1067,13 @@ function PeruServiceItemDesktop({
|
|
|
828
1067
|
</div>
|
|
829
1068
|
)}
|
|
830
1069
|
</div>
|
|
831
|
-
) : null}
|
|
832
|
-
|
|
1070
|
+
) : null} */}
|
|
1071
|
+
{/*
|
|
833
1072
|
<div className="flex items-center mt-[15px] border-t border-[#eee] pt-[10px]">
|
|
834
|
-
{/* 🔹 LEFT SIDE (GRID ITEMS) */}
|
|
835
1073
|
<div
|
|
836
1074
|
className="grid items-center gap-[2%] flex-1"
|
|
837
1075
|
style={{
|
|
838
1076
|
gridTemplateColumns: "30% 18% 23% 23%",
|
|
839
|
-
|
|
840
|
-
// otherItems
|
|
841
|
-
// .map((i) => i.width)
|
|
842
|
-
// .join(" "),
|
|
843
1077
|
}}
|
|
844
1078
|
>
|
|
845
1079
|
{otherItems.map((item) => (
|
|
@@ -849,17 +1083,16 @@ function PeruServiceItemDesktop({
|
|
|
849
1083
|
))}
|
|
850
1084
|
</div>
|
|
851
1085
|
|
|
852
|
-
{/* 🔹 RIGHT SIDE (ALWAYS END) */}
|
|
853
1086
|
<div className="flex items-center ml-[12px] shrink-0 w-[130px] justify-end">
|
|
854
1087
|
{amenitiesItem?.render}
|
|
855
1088
|
</div>
|
|
856
|
-
</div>
|
|
1089
|
+
</div> */}
|
|
857
1090
|
</div>
|
|
858
1091
|
</div>
|
|
859
1092
|
|
|
860
1093
|
{children}
|
|
861
1094
|
{/* Bottom discount banner */}
|
|
862
|
-
{serviceItem?.offer_text && (
|
|
1095
|
+
{/* {serviceItem?.offer_text && (
|
|
863
1096
|
<div
|
|
864
1097
|
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]`}
|
|
865
1098
|
style={{
|
|
@@ -877,6 +1110,84 @@ function PeruServiceItemDesktop({
|
|
|
877
1110
|
/>
|
|
878
1111
|
<span className="ml-[10px]">{serviceItem?.offer_text}</span>
|
|
879
1112
|
</div>
|
|
1113
|
+
)} */}
|
|
1114
|
+
|
|
1115
|
+
{serviceItem?.offer_text && (
|
|
1116
|
+
<div
|
|
1117
|
+
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]"
|
|
1118
|
+
style={{
|
|
1119
|
+
backgroundColor: colors?.bottomStripColor,
|
|
1120
|
+
opacity: isSoldOut ? 0.5 : 1,
|
|
1121
|
+
}}
|
|
1122
|
+
>
|
|
1123
|
+
{/* <div className="flex justify-between items-center w-full">
|
|
1124
|
+
<div className="flex items-center">
|
|
1125
|
+
<LottiePlayer
|
|
1126
|
+
animationData={getAnimationIcon("bombAnimation")}
|
|
1127
|
+
width="18px"
|
|
1128
|
+
height="18px"
|
|
1129
|
+
/>
|
|
1130
|
+
<span className="bold-text ml-[8px]">
|
|
1131
|
+
{" "}
|
|
1132
|
+
{serviceItem?.offer_text || ""}
|
|
1133
|
+
</span>
|
|
1134
|
+
</div>
|
|
1135
|
+
<div>
|
|
1136
|
+
Termina en
|
|
1137
|
+
<span
|
|
1138
|
+
className="bold-text text-end"
|
|
1139
|
+
ref={startCountdown}
|
|
1140
|
+
style={{
|
|
1141
|
+
fontVariantNumeric: "tabular-nums",
|
|
1142
|
+
display: "inline-block",
|
|
1143
|
+
// minWidth: "70px",
|
|
1144
|
+
}}
|
|
1145
|
+
/>
|
|
1146
|
+
</div>
|
|
1147
|
+
</div> */}
|
|
1148
|
+
<div className="flex justify-between items-center w-full">
|
|
1149
|
+
<div className="flex items-center ">
|
|
1150
|
+
<div className="flex items-center">
|
|
1151
|
+
<LottiePlayer
|
|
1152
|
+
animationData={getAnimationIcon("bombAnimation")}
|
|
1153
|
+
width="18px"
|
|
1154
|
+
height="18px"
|
|
1155
|
+
/>
|
|
1156
|
+
<div className="flex items-center mt-[2px]">
|
|
1157
|
+
<span className="bold-text ml-[6px]">
|
|
1158
|
+
{serviceItem?.offer_text || ""}
|
|
1159
|
+
</span>{" "}
|
|
1160
|
+
| Termina en
|
|
1161
|
+
<span
|
|
1162
|
+
className="bold-text text-end"
|
|
1163
|
+
ref={startCountdown}
|
|
1164
|
+
style={{
|
|
1165
|
+
fontVariantNumeric: "tabular-nums",
|
|
1166
|
+
display: "inline-block",
|
|
1167
|
+
// minWidth: "70px",
|
|
1168
|
+
}}
|
|
1169
|
+
/>
|
|
1170
|
+
</div>
|
|
1171
|
+
</div>
|
|
1172
|
+
</div>
|
|
1173
|
+
<div className="flex items-center">
|
|
1174
|
+
{renderIcon("personIcon", "16px")}
|
|
1175
|
+
|
|
1176
|
+
<span className="ml-[6px]">
|
|
1177
|
+
<span
|
|
1178
|
+
className="bold-text"
|
|
1179
|
+
ref={startViewerCount}
|
|
1180
|
+
style={{ fontVariantNumeric: "tabular-nums" }}
|
|
1181
|
+
/>{" "}
|
|
1182
|
+
<span className="bold-text">personas</span>{" "}
|
|
1183
|
+
<span>
|
|
1184
|
+
{" "}
|
|
1185
|
+
{viewersConfig?.label || " están viendo este viaje"}
|
|
1186
|
+
</span>
|
|
1187
|
+
</span>
|
|
1188
|
+
</div>
|
|
1189
|
+
</div>
|
|
1190
|
+
</div>
|
|
880
1191
|
)}
|
|
881
1192
|
|
|
882
1193
|
<div className="absolute -top-[11px] left-0 w-full flex items-center justify-end gap-[12px] pr-[15px] z-10 ">
|
|
@@ -961,11 +1272,12 @@ function PeruServiceItemDesktop({
|
|
|
961
1272
|
backgroundColor: isSoldOut ? "#ddd" : colors.tooltipColor,
|
|
962
1273
|
}}
|
|
963
1274
|
>
|
|
964
|
-
|
|
1275
|
+
{renderIcon("connectingServiceIcon", "12px")}
|
|
1276
|
+
{/* <LottiePlayer
|
|
965
1277
|
animationData={serviceItem.icons.connectingServiceIcon}
|
|
966
1278
|
width="14px"
|
|
967
1279
|
height="14px"
|
|
968
|
-
/>
|
|
1280
|
+
/> */}
|
|
969
1281
|
<div>{"Conexión"}</div>
|
|
970
1282
|
</div>
|
|
971
1283
|
)}
|