@asdp/ferryui 0.1.22-dev.9114 → 0.1.22-dev.9151

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/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  var reactComponents = require('@fluentui/react-components');
4
4
  var jsxRuntime = require('react/jsx-runtime');
5
- var React5 = require('react');
5
+ var React = require('react');
6
6
  var reactIcons = require('@fluentui/react-icons');
7
7
  var reactGridSystem = require('react-grid-system');
8
8
  var react = require('@iconify/react');
@@ -15,7 +15,7 @@ var reactRange = require('react-range');
15
15
 
16
16
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
17
17
 
18
- var React5__default = /*#__PURE__*/_interopDefault(React5);
18
+ var React__default = /*#__PURE__*/_interopDefault(React);
19
19
  var PhoneInputComponent__default = /*#__PURE__*/_interopDefault(PhoneInputComponent);
20
20
  var Select__default = /*#__PURE__*/_interopDefault(Select);
21
21
  var moment__default = /*#__PURE__*/_interopDefault(moment);
@@ -607,11 +607,13 @@ var CarouselWithCustomNav = ({
607
607
  cardFocus = false,
608
608
  showNavButtons = false,
609
609
  showCloseButton = false,
610
- onCloseClick
610
+ onCloseClick,
611
+ autoPlay = false,
612
+ autoPlayInterval = 5e3
611
613
  }) => {
612
614
  const styles = useStyles2();
613
- const [internalIndex, setInternalIndex] = React5.useState(0);
614
- const labels = React5__default.default.useMemo(
615
+ const [internalIndex, setInternalIndex] = React.useState(0);
616
+ const labels = React__default.default.useMemo(
615
617
  () => ({
616
618
  ...DEFAULT_LABELS2[language],
617
619
  ...customLabels,
@@ -620,7 +622,7 @@ var CarouselWithCustomNav = ({
620
622
  [language, customLabels, deprecatedAriaLabel]
621
623
  );
622
624
  const activeIndex = controlledIndex !== void 0 ? controlledIndex : internalIndex;
623
- const handleIndexChange = React5.useCallback(
625
+ const handleIndexChange = React.useCallback(
624
626
  (index) => {
625
627
  if (controlledIndex === void 0) {
626
628
  setInternalIndex(index);
@@ -629,7 +631,33 @@ var CarouselWithCustomNav = ({
629
631
  },
630
632
  [controlledIndex, onActiveIndexChange]
631
633
  );
632
- const defaultAnnouncement = React5.useCallback(
634
+ React__default.default.useEffect(() => {
635
+ if (!autoPlay) return;
636
+ const totalSlides = React__default.default.Children.count(children);
637
+ if (totalSlides <= 1) return;
638
+ const intervalId = setInterval(() => {
639
+ let nextIndex = activeIndex + 1;
640
+ if (nextIndex >= totalSlides) {
641
+ nextIndex = circular ? 0 : activeIndex;
642
+ }
643
+ if (nextIndex !== activeIndex) {
644
+ if (controlledIndex === void 0) {
645
+ setInternalIndex(nextIndex);
646
+ }
647
+ onActiveIndexChange?.(nextIndex);
648
+ }
649
+ }, autoPlayInterval);
650
+ return () => clearInterval(intervalId);
651
+ }, [
652
+ autoPlay,
653
+ autoPlayInterval,
654
+ children,
655
+ circular,
656
+ activeIndex,
657
+ controlledIndex,
658
+ onActiveIndexChange
659
+ ]);
660
+ const defaultAnnouncement = React.useCallback(
633
661
  (index, totalSlides) => {
634
662
  return labels.announcementTemplate.replace("{index}", (index + 1).toString()).replace("{total}", totalSlides.toString());
635
663
  },
@@ -966,12 +994,12 @@ var useStyles4 = reactComponents.makeStyles({
966
994
  padding: 0,
967
995
  backgroundColor: "transparent",
968
996
  border: "none",
969
- height: "450px",
997
+ aspectRatio: "3/1",
970
998
  borderRadius: reactComponents.tokens.borderRadiusXLarge
971
999
  },
972
1000
  bannerImage: {
973
1001
  width: "100%",
974
- height: "auto",
1002
+ aspectRatio: "3/1",
975
1003
  objectFit: "cover",
976
1004
  display: "block",
977
1005
  cursor: "pointer",
@@ -1030,11 +1058,11 @@ var CardBanner = ({
1030
1058
  ) });
1031
1059
  };
1032
1060
  function useWindowSize() {
1033
- const [windowSize, setWindowSize] = React5.useState({
1061
+ const [windowSize, setWindowSize] = React.useState({
1034
1062
  width: 0,
1035
1063
  height: 0
1036
1064
  });
1037
- React5.useEffect(() => {
1065
+ React.useEffect(() => {
1038
1066
  function handleResize() {
1039
1067
  setWindowSize({
1040
1068
  width: window.innerWidth,
@@ -1970,7 +1998,7 @@ var CardServiceMenu = ({
1970
1998
  return reactComponents.mergeClasses(styles.menuItem, isActive && styles.menuItemActive);
1971
1999
  };
1972
2000
  return /* @__PURE__ */ jsxRuntime.jsx(reactComponents.Card, { className: reactComponents.mergeClasses(styles.card, className), children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles.menuList, children: menuItems.map((item, index) => {
1973
- return /* @__PURE__ */ jsxRuntime.jsxs(React5__default.default.Fragment, { children: [
2001
+ return /* @__PURE__ */ jsxRuntime.jsxs(React__default.default.Fragment, { children: [
1974
2002
  /* @__PURE__ */ jsxRuntime.jsxs(
1975
2003
  reactComponents.Button,
1976
2004
  {
@@ -2007,9 +2035,9 @@ var CardServiceMenu = ({
2007
2035
  }) }) });
2008
2036
  };
2009
2037
  function useIsClamped(deps) {
2010
- const ref = React5.useRef(null);
2011
- const [isClamped, setIsClamped] = React5.useState(false);
2012
- React5.useEffect(() => {
2038
+ const ref = React.useRef(null);
2039
+ const [isClamped, setIsClamped] = React.useState(false);
2040
+ React.useEffect(() => {
2013
2041
  const el = ref.current;
2014
2042
  if (!el) return;
2015
2043
  const check = () => setIsClamped(el.scrollHeight > el.clientHeight);
@@ -2040,7 +2068,7 @@ var MenuItemDescription = ({ description, className }) => {
2040
2068
  }
2041
2069
  return /* @__PURE__ */ jsxRuntime.jsx("span", { ref, className, children: description });
2042
2070
  };
2043
- var DatePickerInput = React5.forwardRef(
2071
+ var DatePickerInput = React.forwardRef(
2044
2072
  ({
2045
2073
  field,
2046
2074
  placeholder,
@@ -2053,7 +2081,7 @@ var DatePickerInput = React5.forwardRef(
2053
2081
  max,
2054
2082
  ...restProps
2055
2083
  }, ref) => {
2056
- const [isOpen, setIsOpen] = React5.useState(false);
2084
+ const [isOpen, setIsOpen] = React.useState(false);
2057
2085
  const dateValue = field.value ? new Date(field.value) : void 0;
2058
2086
  const onSelectDate = (date) => {
2059
2087
  if (date) {
@@ -2576,19 +2604,19 @@ var InputDynamic = ({
2576
2604
  }) => {
2577
2605
  const styles = useStyles7();
2578
2606
  const mergedLabels = { ...DEFAULT_LABELS7[language], ...labels };
2579
- const [showPassword, setShowPassword] = React5.useState(false);
2580
- const [isPhoneMode, setIsPhoneMode] = React5.useState(false);
2581
- const [emailOrPhoneType, setEmailOrPhoneType] = React5.useState("none");
2582
- const [identityType, setIdentityType] = React5.useState(
2607
+ const [showPassword, setShowPassword] = React.useState(false);
2608
+ const [isPhoneMode, setIsPhoneMode] = React.useState(false);
2609
+ const [emailOrPhoneType, setEmailOrPhoneType] = React.useState("none");
2610
+ const [identityType, setIdentityType] = React.useState(
2583
2611
  "id"
2584
2612
  );
2585
- const [lastPhoneValue, setLastPhoneValue] = React5.useState("");
2586
- const [lastEmailOrPhoneValue, setLastEmailOrPhoneValue] = React5.useState("");
2587
- const inputRef = React5.useRef(null);
2588
- const phoneInputRef = React5.useRef(null);
2589
- const emailOrPhoneInputRef = React5.useRef(null);
2590
- const shouldFocusRef = React5.useRef(false);
2591
- const isBackspaceNavigationRef = React5.useRef(false);
2613
+ const [lastPhoneValue, setLastPhoneValue] = React.useState("");
2614
+ const [lastEmailOrPhoneValue, setLastEmailOrPhoneValue] = React.useState("");
2615
+ const inputRef = React.useRef(null);
2616
+ const phoneInputRef = React.useRef(null);
2617
+ const emailOrPhoneInputRef = React.useRef(null);
2618
+ const shouldFocusRef = React.useRef(false);
2619
+ const isBackspaceNavigationRef = React.useRef(false);
2592
2620
  const getSelectStyles = (hasError2, selectAppearance) => {
2593
2621
  const currentAppearance = appearance || "outline";
2594
2622
  const getControlStyles = (provided, state) => {
@@ -2708,7 +2736,7 @@ var InputDynamic = ({
2708
2736
  })
2709
2737
  };
2710
2738
  };
2711
- React5.useEffect(() => {
2739
+ React.useEffect(() => {
2712
2740
  if (shouldFocusRef.current) {
2713
2741
  setTimeout(() => {
2714
2742
  if (identityType === "phone" && phoneInputRef.current) {
@@ -2730,7 +2758,7 @@ var InputDynamic = ({
2730
2758
  }, 50);
2731
2759
  }
2732
2760
  }, [identityType]);
2733
- React5.useEffect(() => {
2761
+ React.useEffect(() => {
2734
2762
  if (shouldFocusRef.current && type === "emailOrPhone") {
2735
2763
  setTimeout(() => {
2736
2764
  if (emailOrPhoneType === "phone" && emailOrPhoneInputRef.current) {
@@ -3766,7 +3794,7 @@ var CardTicketSearch = ({
3766
3794
  menuItems
3767
3795
  }) => {
3768
3796
  const styles = useStyles8();
3769
- const labels = React5__default.default.useMemo(
3797
+ const labels = React__default.default.useMemo(
3770
3798
  () => ({ ...DEFAULT_LABELS8[language], ...customLabels }),
3771
3799
  [language, customLabels]
3772
3800
  );
@@ -3787,7 +3815,7 @@ var CardTicketSearch = ({
3787
3815
  name: "roundTrip",
3788
3816
  defaultValue: roundTrip
3789
3817
  });
3790
- React5__default.default.useEffect(() => {
3818
+ React__default.default.useEffect(() => {
3791
3819
  setValue("from", from);
3792
3820
  setValue("to", to);
3793
3821
  setValue("startDate", startDate);
@@ -3807,7 +3835,7 @@ var CardTicketSearch = ({
3807
3835
  passenger,
3808
3836
  setValue
3809
3837
  ]);
3810
- React5__default.default.useEffect(() => {
3838
+ React__default.default.useEffect(() => {
3811
3839
  if (onRoundTripChange) {
3812
3840
  onRoundTripChange(roundTripValue);
3813
3841
  }
@@ -5125,18 +5153,18 @@ var ModalSelectDate = ({
5125
5153
  }) => {
5126
5154
  const styles = useStyles11();
5127
5155
  const mergedLabels = { ...DEFAULT_LABELS11[language], ...labels };
5128
- React5.useEffect(() => {
5156
+ React.useEffect(() => {
5129
5157
  moment__default.default.locale(language === "id" ? "id" : "en");
5130
5158
  }, [language]);
5131
- const [selectedDate, setSelectedDate] = React5.useState(
5159
+ const [selectedDate, setSelectedDate] = React.useState(
5132
5160
  selectedDepartureDate
5133
5161
  );
5134
- const [selectedEndDate, setSelectedEndDate] = React5.useState(
5162
+ const [selectedEndDate, setSelectedEndDate] = React.useState(
5135
5163
  selectedReturnDate
5136
5164
  );
5137
- const [hoveredDate, setHoveredDate] = React5.useState();
5138
- const [activeTab, setActiveTab] = React5.useState(initialTab);
5139
- const previewEndDate = React5.useMemo(() => {
5165
+ const [hoveredDate, setHoveredDate] = React.useState();
5166
+ const [activeTab, setActiveTab] = React.useState(initialTab);
5167
+ const previewEndDate = React.useMemo(() => {
5140
5168
  if (selectedEndDate) return selectedEndDate;
5141
5169
  if (selectedDate && hoveredDate && hoveredDate > selectedDate) {
5142
5170
  return hoveredDate;
@@ -5147,7 +5175,7 @@ var ModalSelectDate = ({
5147
5175
  if (!first || !second) return false;
5148
5176
  return moment__default.default(first).isSame(second, "day");
5149
5177
  };
5150
- React5.useEffect(() => {
5178
+ React.useEffect(() => {
5151
5179
  if (open) {
5152
5180
  setSelectedDate(selectedDepartureDate);
5153
5181
  setSelectedEndDate(selectedReturnDate);
@@ -5199,7 +5227,7 @@ var ModalSelectDate = ({
5199
5227
  handleClose();
5200
5228
  }
5201
5229
  };
5202
- const handleCustomDayCellRef = React5.useCallback(
5230
+ const handleCustomDayCellRef = React.useCallback(
5203
5231
  (element, date, _classNames) => {
5204
5232
  if (!element) return;
5205
5233
  const removeTokens = (className) => {
@@ -5453,8 +5481,8 @@ var ModalService = ({
5453
5481
  const styles = useStyles12();
5454
5482
  const mergedLabels = { ...DEFAULT_LABELS12[language], ...labels };
5455
5483
  const displayTitle = title || mergedLabels.title;
5456
- const [selectedServices, setSelectedServices] = React5.useState(selectedServiceIds);
5457
- React5.useEffect(() => {
5484
+ const [selectedServices, setSelectedServices] = React.useState(selectedServiceIds);
5485
+ React.useEffect(() => {
5458
5486
  if (open) {
5459
5487
  if (selectedServiceIds && selectedServiceIds.length > 0) {
5460
5488
  const validIds = services.filter((s) => selectedServiceIds.includes(s.serviceTypeId)).map((s) => s.serviceTypeId);
@@ -5654,13 +5682,13 @@ var ModalTotalPassengers = ({
5654
5682
  }) => {
5655
5683
  const styles = useStyles13();
5656
5684
  const mergedLabels = { ...DEFAULT_LABELS13[language], ...labels };
5657
- const [passengers, setPassengers] = React5.useState([]);
5658
- const [openItems, setOpenItems] = React5.useState([]);
5685
+ const [passengers, setPassengers] = React.useState([]);
5686
+ const [openItems, setOpenItems] = React.useState([]);
5659
5687
  const defaultInfoMessage = mergedLabels.infoMessage.replace(
5660
5688
  "{maxPassengers}",
5661
5689
  String(maxPassengers)
5662
5690
  );
5663
- React5.useEffect(() => {
5691
+ React.useEffect(() => {
5664
5692
  if (passengerTypes.length === 0) return;
5665
5693
  const defaultPassengers = passengerTypes.map(
5666
5694
  (passengerType) => ({
@@ -6005,10 +6033,10 @@ var ModalTypeOfService = ({
6005
6033
  }) => {
6006
6034
  const styles = useStyles14();
6007
6035
  const mergedLabels = { ...DEFAULT_LABELS14[language], ...labels };
6008
- const [selectedServiceId, setSelectedServiceId] = React5.useState(
6036
+ const [selectedServiceId, setSelectedServiceId] = React.useState(
6009
6037
  selectedService?.id || 0
6010
6038
  );
6011
- const [openItems, setOpenItems] = React5.useState(() => {
6039
+ const [openItems, setOpenItems] = React.useState(() => {
6012
6040
  if (!selectedService) return [];
6013
6041
  for (const item of serviceTypes) {
6014
6042
  if (item.children && item.children.length > 0) {
@@ -6038,7 +6066,7 @@ var ModalTypeOfService = ({
6038
6066
  }
6039
6067
  );
6040
6068
  const imageRenderer = renderImage || defaultRenderImage;
6041
- React5.useEffect(() => {
6069
+ React.useEffect(() => {
6042
6070
  const newId = selectedService?.id || 0;
6043
6071
  if (newId !== selectedServiceId) {
6044
6072
  setSelectedServiceId(newId);
@@ -6321,7 +6349,7 @@ var SortMenu = ({
6321
6349
  clearFiltersText: deprecatedClearFiltersText
6322
6350
  }) => {
6323
6351
  const styles = useStyles15();
6324
- const labels = React5__default.default.useMemo(
6352
+ const labels = React__default.default.useMemo(
6325
6353
  () => ({
6326
6354
  ...DEFAULT_LABELS15[language],
6327
6355
  ...customLabels,
@@ -6344,11 +6372,11 @@ var SortMenu = ({
6344
6372
  deprecatedClearFiltersText
6345
6373
  ]
6346
6374
  );
6347
- const sortOptions = React5__default.default.useMemo(
6375
+ const sortOptions = React__default.default.useMemo(
6348
6376
  () => customSortOptions || getSortOptions(labels),
6349
6377
  [customSortOptions, labels]
6350
6378
  );
6351
- const currentSortLabel = React5__default.default.useMemo(
6379
+ const currentSortLabel = React__default.default.useMemo(
6352
6380
  () => sortOptions.find((opt) => opt.value === value)?.label || labels.recommendation,
6353
6381
  [sortOptions, value, labels.recommendation]
6354
6382
  );
@@ -6607,8 +6635,8 @@ var ModalFilterTicket = ({
6607
6635
  }) => {
6608
6636
  const styles = useStyles16();
6609
6637
  const mergedLabels = { ...DEFAULT_LABELS16[language], ...labels };
6610
- const [rangeReady, setRangeReady] = React5.useState(false);
6611
- React5.useEffect(() => {
6638
+ const [rangeReady, setRangeReady] = React.useState(false);
6639
+ React.useEffect(() => {
6612
6640
  if (open) {
6613
6641
  const timer = setTimeout(() => {
6614
6642
  setRangeReady(true);
@@ -6645,7 +6673,7 @@ var ModalFilterTicket = ({
6645
6673
  price
6646
6674
  );
6647
6675
  };
6648
- const renderPriceTrack = React5.useCallback(
6676
+ const renderPriceTrack = React.useCallback(
6649
6677
  ({ props, children }) => {
6650
6678
  const [value1, value2] = priceRange;
6651
6679
  const percent1 = (value1 - minPrice) / (maxPrice - minPrice) * 100;
@@ -6684,7 +6712,7 @@ var ModalFilterTicket = ({
6684
6712
  },
6685
6713
  [priceRange, minPrice, maxPrice]
6686
6714
  );
6687
- const renderDurationTrack = React5.useCallback(
6715
+ const renderDurationTrack = React.useCallback(
6688
6716
  ({ props, children }) => {
6689
6717
  const [value1, value2] = durationRange;
6690
6718
  const percent1 = (value1 - minDuration) / (maxDuration - minDuration) * 100;
@@ -7012,7 +7040,7 @@ var DateFilter = ({
7012
7040
  labels
7013
7041
  }) => {
7014
7042
  const styles = useStyles17();
7015
- const scrollRef = React5.useRef(null);
7043
+ const scrollRef = React.useRef(null);
7016
7044
  const mergedLabels = {
7017
7045
  ...DEFAULT_LABELS17[language],
7018
7046
  ...labels
@@ -7249,8 +7277,8 @@ var ModalSearchTicket = ({
7249
7277
  name: "roundTrip",
7250
7278
  defaultValue: defaultValues?.roundTrip || false
7251
7279
  });
7252
- const isUpdatingFromProps = React5.useRef(false);
7253
- React5.useEffect(() => {
7280
+ const isUpdatingFromProps = React.useRef(false);
7281
+ React.useEffect(() => {
7254
7282
  if (defaultValues) {
7255
7283
  isUpdatingFromProps.current = true;
7256
7284
  Object.entries(defaultValues).forEach(([key, value]) => {
@@ -7261,7 +7289,7 @@ var ModalSearchTicket = ({
7261
7289
  }, 0);
7262
7290
  }
7263
7291
  }, [defaultValues, setValue]);
7264
- React5.useEffect(() => {
7292
+ React.useEffect(() => {
7265
7293
  if (onRoundTripChange && !isUpdatingFromProps.current) {
7266
7294
  onRoundTripChange(roundTripValue);
7267
7295
  }
@@ -7811,13 +7839,13 @@ var Stepper = ({
7811
7839
  }) => {
7812
7840
  const styles = useStyles19();
7813
7841
  const mergedLabels = { ...DEFAULT_LABELS19[language], ...labels };
7814
- const currentStepIndex = React5.useMemo(() => {
7842
+ const currentStepIndex = React.useMemo(() => {
7815
7843
  if (typeof currentStep === "number") {
7816
7844
  return steps.findIndex((step) => step.number === currentStep);
7817
7845
  }
7818
7846
  return steps.findIndex((step) => step.id === currentStep);
7819
7847
  }, [steps, currentStep]);
7820
- const activeStepNumber = React5.useMemo(() => {
7848
+ const activeStepNumber = React.useMemo(() => {
7821
7849
  return currentStepIndex >= 0 ? steps[currentStepIndex].number : 1;
7822
7850
  }, [currentStepIndex, steps]);
7823
7851
  const getStepStatus = (stepNumber) => {
@@ -7848,7 +7876,7 @@ var Stepper = ({
7848
7876
  className: styles.stepperBackground
7849
7877
  }
7850
7878
  ),
7851
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles.stepsRow, children: steps.map((step, index) => /* @__PURE__ */ jsxRuntime.jsxs(React5.Fragment, { children: [
7879
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles.stepsRow, children: steps.map((step, index) => /* @__PURE__ */ jsxRuntime.jsxs(React.Fragment, { children: [
7852
7880
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles.stepCircleWrapper, children: [
7853
7881
  getStepStatus(step.number) === "active" ? /* @__PURE__ */ jsxRuntime.jsx(
7854
7882
  "img",
@@ -8459,28 +8487,28 @@ var ModalPassengerForm = ({
8459
8487
  };
8460
8488
  const displayTitle = title || mergedLabels.title;
8461
8489
  const idTypes = ["KTP", "SIM", "Paspor"];
8462
- const [isModalSelectIdTypeOpen, setIsModalSelectIdTypeOpen] = React5.useState(false);
8463
- const [isModalScanOpen, setIsModalScanOpen] = React5.useState(false);
8464
- const [scannedIdType, setScannedIdType] = React5.useState(null);
8465
- const [scanStatus, setScanStatus] = React5.useState("idle");
8466
- const [scanStep, setScanStep] = React5.useState(0);
8467
- const [capturedImage, setCapturedImage] = React5.useState(null);
8468
- const [stream, setStream] = React5.useState(null);
8469
- const videoRef = React5.useRef(null);
8490
+ const [isModalSelectIdTypeOpen, setIsModalSelectIdTypeOpen] = React.useState(false);
8491
+ const [isModalScanOpen, setIsModalScanOpen] = React.useState(false);
8492
+ const [scannedIdType, setScannedIdType] = React.useState(null);
8493
+ const [scanStatus, setScanStatus] = React.useState("idle");
8494
+ const [scanStep, setScanStep] = React.useState(0);
8495
+ const [capturedImage, setCapturedImage] = React.useState(null);
8496
+ const [stream, setStream] = React.useState(null);
8497
+ const videoRef = React.useRef(null);
8470
8498
  const { control, handleSubmit, reset, watch, setValue } = reactHookForm.useForm({
8471
8499
  defaultValues
8472
8500
  });
8473
8501
  const idType = watch("idType");
8474
8502
  const watchPassportCountry = watch("country");
8475
- React5.useEffect(() => {
8503
+ React.useEffect(() => {
8476
8504
  reset(defaultValues);
8477
8505
  }, [defaultValues, reset]);
8478
- React5.useEffect(() => {
8506
+ React.useEffect(() => {
8479
8507
  if (idType) {
8480
8508
  setValue("idNumber", "");
8481
8509
  }
8482
8510
  }, [idType, watchPassportCountry, setValue]);
8483
- const stopCamera = React5.useCallback(() => {
8511
+ const stopCamera = React.useCallback(() => {
8484
8512
  if (stream) {
8485
8513
  stream.getTracks().forEach((track) => track.stop());
8486
8514
  setStream(null);
@@ -8490,7 +8518,7 @@ var ModalPassengerForm = ({
8490
8518
  videoRef.current.srcObject = null;
8491
8519
  }
8492
8520
  }, [stream]);
8493
- const startCamera = React5.useCallback(async () => {
8521
+ const startCamera = React.useCallback(async () => {
8494
8522
  try {
8495
8523
  const mediaStream = await navigator.mediaDevices.getUserMedia({
8496
8524
  video: {
@@ -8505,7 +8533,7 @@ var ModalPassengerForm = ({
8505
8533
  alert(mergedLabels.cameraPermissionError);
8506
8534
  }
8507
8535
  }, [mergedLabels.cameraPermissionError]);
8508
- const capturePhoto = React5.useCallback(() => {
8536
+ const capturePhoto = React.useCallback(() => {
8509
8537
  if (videoRef.current) {
8510
8538
  const canvas = document.createElement("canvas");
8511
8539
  canvas.width = videoRef.current.videoWidth;
@@ -8523,12 +8551,12 @@ var ModalPassengerForm = ({
8523
8551
  }
8524
8552
  }
8525
8553
  }, [scannedIdType, stopCamera]);
8526
- React5.useEffect(() => {
8554
+ React.useEffect(() => {
8527
8555
  if (isModalScanOpen && scanStatus === "idle") {
8528
8556
  startCamera();
8529
8557
  }
8530
8558
  }, [isModalScanOpen, scanStatus, startCamera]);
8531
- React5.useEffect(() => {
8559
+ React.useEffect(() => {
8532
8560
  if (isModalScanOpen && scanStatus === "idle" && stream && videoRef.current) {
8533
8561
  if (videoRef.current.srcObject !== stream) {
8534
8562
  videoRef.current.srcObject = stream;
@@ -8543,18 +8571,18 @@ var ModalPassengerForm = ({
8543
8571
  }
8544
8572
  }
8545
8573
  }, [isModalScanOpen, scanStatus, stream]);
8546
- React5.useEffect(() => {
8574
+ React.useEffect(() => {
8547
8575
  if (!isModalScanOpen) {
8548
8576
  stopCamera();
8549
8577
  setScanStep(0);
8550
8578
  }
8551
8579
  }, [isModalScanOpen, stopCamera]);
8552
- React5.useEffect(() => {
8580
+ React.useEffect(() => {
8553
8581
  return () => {
8554
8582
  stopCamera();
8555
8583
  };
8556
8584
  }, [stopCamera]);
8557
- React5.useEffect(() => {
8585
+ React.useEffect(() => {
8558
8586
  if (scanStatus !== "reading" || !capturedImage) return;
8559
8587
  let isCancelled = false;
8560
8588
  const performOCR = async () => {
@@ -10758,44 +10786,44 @@ var DEFAULT_LABELS27 = {
10758
10786
  var DEFAULT_FAQ_ITEMS = {
10759
10787
  id: [
10760
10788
  {
10761
- value: "1",
10789
+ id: 1,
10762
10790
  question: "Bagaimana cara memesan tiket?",
10763
10791
  answer: "Anda dapat memesan tiket melalui halaman pencarian tiket dengan memilih pelabuhan asal, tujuan, dan tanggal keberangkatan."
10764
10792
  },
10765
10793
  {
10766
- value: "2",
10794
+ id: 2,
10767
10795
  question: "Apakah bisa mengajukan refund?",
10768
10796
  answer: "Ya, pengajuan refund dapat dilakukan melalui menu Riwayat Pesanan sesuai dengan syarat dan ketentuan yang berlaku."
10769
10797
  },
10770
10798
  {
10771
- value: "3",
10799
+ id: 3,
10772
10800
  question: "Metode pembayaran apa saja yang tersedia?",
10773
10801
  answer: "Kami mendukung berbagai metode pembayaran termasuk Virtual Account, E-Wallet, dan Kartu Kredit/Debit."
10774
10802
  },
10775
10803
  {
10776
- value: "4",
10804
+ id: 4,
10777
10805
  question: "Apakah tiket perlu dicetak?",
10778
10806
  answer: "Tidak perlu. Anda dapat menunjukkan E-Tiket atau QR Code pada saat check-in di pelabuhan."
10779
10807
  }
10780
10808
  ],
10781
10809
  en: [
10782
10810
  {
10783
- value: "1",
10811
+ id: 1,
10784
10812
  question: "How to book a ticket?",
10785
10813
  answer: "You can book tickets through the ticket search page by selecting origin, destination, and departure date."
10786
10814
  },
10787
10815
  {
10788
- value: "2",
10816
+ id: 2,
10789
10817
  question: "Can I request a refund?",
10790
10818
  answer: "Yes, refund requests can be made via the Order History menu subject to applicable terms and conditions."
10791
10819
  },
10792
10820
  {
10793
- value: "3",
10821
+ id: 3,
10794
10822
  question: "What payment methods are available?",
10795
10823
  answer: "We support various payment methods including Virtual Account, E-Wallet, and Credit/Debit Cards."
10796
10824
  },
10797
10825
  {
10798
- value: "4",
10826
+ id: 4,
10799
10827
  question: "Do I need to print the ticket?",
10800
10828
  answer: "No physically printed ticket needed. You can show your E-Ticket or QR Code during check-in at the port."
10801
10829
  }
@@ -10833,7 +10861,7 @@ var CardFAQ = ({
10833
10861
  /* @__PURE__ */ jsxRuntime.jsx(reactComponents.Accordion, { collapsible: true, children: faqItems.map((item) => /* @__PURE__ */ jsxRuntime.jsxs(
10834
10862
  reactComponents.AccordionItem,
10835
10863
  {
10836
- value: item.value,
10864
+ value: item.id,
10837
10865
  className: styles.accordionItem,
10838
10866
  children: [
10839
10867
  /* @__PURE__ */ jsxRuntime.jsxs(
@@ -10857,7 +10885,7 @@ var CardFAQ = ({
10857
10885
  /* @__PURE__ */ jsxRuntime.jsx(reactComponents.AccordionPanel, { children: item.answer })
10858
10886
  ]
10859
10887
  },
10860
- item.value
10888
+ item.id
10861
10889
  )) })
10862
10890
  ] });
10863
10891
  };
@@ -11607,7 +11635,7 @@ var CardReview = ({
11607
11635
  }
11608
11636
  ) : (
11609
11637
  // Clone element to append className if it's a valid React element
11610
- React5__default.default.isValidElement(item.label) ? React5__default.default.cloneElement(item.label, {
11638
+ React__default.default.isValidElement(item.label) ? React__default.default.cloneElement(item.label, {
11611
11639
  className: `${styles.defaultLabel} ${item.labelClassName || ""}${item.label.props.className ? " " + item.label.props.className : ""}`
11612
11640
  }) : /* @__PURE__ */ jsxRuntime.jsx(
11613
11641
  "div",
@@ -11960,7 +11988,7 @@ var CardPriceDetails = ({
11960
11988
  const renderItem = (item, key) => {
11961
11989
  const variantClass = getVariantClass(item.variant);
11962
11990
  const isTaxLike = item.variant === "danger";
11963
- return /* @__PURE__ */ jsxRuntime.jsxs(React5__default.default.Fragment, { children: [
11991
+ return /* @__PURE__ */ jsxRuntime.jsxs(React__default.default.Fragment, { children: [
11964
11992
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles.row, children: [
11965
11993
  isTaxLike ? /* @__PURE__ */ jsxRuntime.jsx(reactComponents.Body1Strong, { className: variantClass, children: item.name }) : /* @__PURE__ */ jsxRuntime.jsx(reactComponents.Caption1, { className: reactComponents.mergeClasses(styles.label, variantClass), children: item.name }),
11966
11994
  isTaxLike ? /* @__PURE__ */ jsxRuntime.jsxs(reactComponents.Body1Strong, { className: reactComponents.mergeClasses(styles.value, variantClass), children: [
@@ -11987,7 +12015,7 @@ var CardPriceDetails = ({
11987
12015
  section.detail.map((item, i) => renderItem(item, i))
11988
12016
  ] }, index);
11989
12017
  }
11990
- return /* @__PURE__ */ jsxRuntime.jsx(React5__default.default.Fragment, { children: section.detail.map((item, i) => renderItem(item, i)) }, index);
12018
+ return /* @__PURE__ */ jsxRuntime.jsx(React__default.default.Fragment, { children: section.detail.map((item, i) => renderItem(item, i)) }, index);
11991
12019
  }),
11992
12020
  /* @__PURE__ */ jsxRuntime.jsx(reactComponents.Divider, {}),
11993
12021
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles.totalRow, children: [
@@ -12981,7 +13009,7 @@ var uploadStyles = reactComponents.makeStyles({
12981
13009
  objectFit: "contain"
12982
13010
  }
12983
13011
  });
12984
- var FileUpload = React5__default.default.forwardRef(
13012
+ var FileUpload = React__default.default.forwardRef(
12985
13013
  ({
12986
13014
  name,
12987
13015
  control,
@@ -12997,12 +13025,12 @@ var FileUpload = React5__default.default.forwardRef(
12997
13025
  }, ref) => {
12998
13026
  const mergedLabels = { ...DEFAULT_LABELS38[language], ...customLabels };
12999
13027
  const styles = uploadStyles();
13000
- const fileInputRef = React5.useRef(null);
13001
- const [, setIsDragOver] = React5.useState(false);
13002
- const [previewUrl, setPreviewUrl] = React5.useState(null);
13003
- const [sizeError, setSizeError] = React5.useState(null);
13004
- const [currentFile, setCurrentFile] = React5.useState(null);
13005
- const [isPreviewOpen, setIsPreviewOpen] = React5.useState(false);
13028
+ const fileInputRef = React.useRef(null);
13029
+ const [, setIsDragOver] = React.useState(false);
13030
+ const [previewUrl, setPreviewUrl] = React.useState(null);
13031
+ const [sizeError, setSizeError] = React.useState(null);
13032
+ const [currentFile, setCurrentFile] = React.useState(null);
13033
+ const [isPreviewOpen, setIsPreviewOpen] = React.useState(false);
13006
13034
  const formatFileSize = (bytes) => {
13007
13035
  if (bytes < 1024) return `${bytes} B`;
13008
13036
  const kb = bytes / 1024;
@@ -13091,7 +13119,7 @@ var FileUpload = React5__default.default.forwardRef(
13091
13119
  rules: { required: required ? `${label} ${mergedLabels.requiredError}` : false },
13092
13120
  render: ({ field: { onChange, value }, fieldState: { error } }) => {
13093
13121
  const displayFile = currentFile || value;
13094
- React5.useEffect(() => {
13122
+ React.useEffect(() => {
13095
13123
  const fileToPreview = currentFile || value;
13096
13124
  if (fileToPreview instanceof File) {
13097
13125
  if (fileToPreview.type.startsWith("image/")) {