@pisell/private-materials 6.3.131 → 6.3.132

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.
Files changed (75) hide show
  1. package/build/lowcode/assets-daily.json +11 -11
  2. package/build/lowcode/assets-dev.json +2 -2
  3. package/build/lowcode/assets-prod.json +11 -11
  4. package/build/lowcode/meta.js +1 -1
  5. package/build/lowcode/render/default/view.js +6 -6
  6. package/build/lowcode/view.js +6 -6
  7. package/es/components/booking/info/clientVariant/hooks/useIsLowSpeedNetwork.d.ts +1 -0
  8. package/es/components/booking/info/service2/utils.d.ts +1 -1
  9. package/es/components/booking/utils.d.ts +2 -2
  10. package/es/components/ecocup/components/CupStatusModal/hooks.d.ts +1 -1
  11. package/es/components/eftposPay/amount.d.ts +1 -1
  12. package/es/components/eftposPay/device.d.ts +1 -1
  13. package/es/components/eftposPay/hooks.d.ts +2 -2
  14. package/es/components/eftposPay/store/index.d.ts +5 -5
  15. package/es/components/eftposPay/tyro/hooks.d.ts +1 -0
  16. package/es/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/CalenDateStatus/index.d.ts +1 -0
  17. package/es/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/Item/DayItem/index.d.ts +1 -0
  18. package/es/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/Item/index.d.ts +1 -0
  19. package/es/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/Status/index.d.ts +1 -0
  20. package/es/components/pay/toC/PaymentMethods/StripePay/Stripe/StripeSDK/index.d.ts +1 -0
  21. package/es/components/shoppingCart/components/Empty/index.d.ts +1 -0
  22. package/es/components/venueBooking/components/Cart/index.js +7 -7
  23. package/es/components/venueBooking/components/Checkout/index.js +2 -12
  24. package/es/components/venueBooking/components/Content/index.js +8 -7
  25. package/es/components/venueBooking/components/Footer/index.js +2 -8
  26. package/es/components/venueBooking/components/Header/index.js +37 -16
  27. package/es/components/venueBooking/components/VenueSelection/components/TimeGrid.js +52 -8
  28. package/es/components/venueBooking/components/VenueSelection/index.js +1 -5
  29. package/es/components/venueBooking/context.js +46 -24
  30. package/es/components/venueBooking/hooks.d.ts +1 -0
  31. package/es/components/venueBooking/hooks.js +8 -2
  32. package/es/components/venueBooking/index.js +30 -2
  33. package/es/components/venueBooking/locales.d.ts +15 -0
  34. package/es/components/venueBooking/locales.js +20 -5
  35. package/es/components/venueBooking/utils.d.ts +8 -0
  36. package/es/components/venueBooking/utils.js +12 -2
  37. package/es/hooks/usePaymentLogger.d.ts +1 -0
  38. package/es/plus/pisellSalesManagement/config/booking.d.ts +6 -6
  39. package/es/plus/pisellSalesManagement/hooks/useSalesGridData.d.ts +1 -0
  40. package/es/plus/walletEditor/components/ImageUpload/index.d.ts +1 -1
  41. package/lib/components/booking/info/clientVariant/hooks/useIsLowSpeedNetwork.d.ts +1 -0
  42. package/lib/components/booking/info/service2/utils.d.ts +1 -1
  43. package/lib/components/booking/utils.d.ts +2 -2
  44. package/lib/components/ecocup/components/CupStatusModal/hooks.d.ts +1 -1
  45. package/lib/components/eftposPay/amount.d.ts +1 -1
  46. package/lib/components/eftposPay/device.d.ts +1 -1
  47. package/lib/components/eftposPay/hooks.d.ts +2 -2
  48. package/lib/components/eftposPay/store/index.d.ts +5 -5
  49. package/lib/components/eftposPay/tyro/hooks.d.ts +1 -0
  50. package/lib/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/CalenDateStatus/index.d.ts +1 -0
  51. package/lib/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/Item/DayItem/index.d.ts +1 -0
  52. package/lib/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/Item/index.d.ts +1 -0
  53. package/lib/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/Status/index.d.ts +1 -0
  54. package/lib/components/pay/toC/PaymentMethods/StripePay/Stripe/StripeSDK/index.d.ts +1 -0
  55. package/lib/components/shoppingCart/components/Empty/index.d.ts +1 -0
  56. package/lib/components/venueBooking/components/Cart/index.js +3 -8
  57. package/lib/components/venueBooking/components/Checkout/index.js +1 -5
  58. package/lib/components/venueBooking/components/Content/index.js +20 -15
  59. package/lib/components/venueBooking/components/Footer/index.js +1 -9
  60. package/lib/components/venueBooking/components/Header/index.js +11 -5
  61. package/lib/components/venueBooking/components/VenueSelection/components/TimeGrid.js +21 -3
  62. package/lib/components/venueBooking/components/VenueSelection/index.js +1 -2
  63. package/lib/components/venueBooking/context.js +32 -20
  64. package/lib/components/venueBooking/hooks.d.ts +1 -0
  65. package/lib/components/venueBooking/hooks.js +6 -1
  66. package/lib/components/venueBooking/index.js +19 -1
  67. package/lib/components/venueBooking/locales.d.ts +15 -0
  68. package/lib/components/venueBooking/locales.js +20 -5
  69. package/lib/components/venueBooking/utils.d.ts +8 -0
  70. package/lib/components/venueBooking/utils.js +3 -2
  71. package/lib/hooks/usePaymentLogger.d.ts +1 -0
  72. package/lib/plus/pisellSalesManagement/config/booking.d.ts +6 -6
  73. package/lib/plus/pisellSalesManagement/hooks/useSalesGridData.d.ts +1 -0
  74. package/lib/plus/walletEditor/components/ImageUpload/index.d.ts +1 -1
  75. package/package.json +18 -18
@@ -60,10 +60,6 @@ function Checkout() {
60
60
  ((_a = viewModel.summary) == null ? void 0 : _a.total_amount) ?? ((_b = viewModel.summary) == null ? void 0 : _b.expect_amount) ?? 0
61
61
  );
62
62
  }, [viewModel.summary]);
63
- const taxFee = (0, import_react.useMemo)(() => {
64
- var _a;
65
- return Number(((_a = viewModel.summary) == null ? void 0 : _a.tax_fee) ?? 0);
66
- }, [viewModel.summary]);
67
63
  const venueCartItems = (0, import_react.useMemo)(() => {
68
64
  return (viewModel.cartItems || []).filter((item) => Boolean((item == null ? void 0 : item.start_date) && (item == null ? void 0 : item.end_date)));
69
65
  }, [viewModel.cartItems]);
@@ -125,7 +121,7 @@ function Checkout() {
125
121
  setNoteValue(nextNote);
126
122
  lastNoteRef.current = nextNote;
127
123
  }, [viewModel.note]);
128
- return /* @__PURE__ */ import_react.default.createElement("div", { className: "space-y-3 md:space-y-5" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "grid gap-3 md:gap-4" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "rounded-[22px] bg-white p-4 shadow-[0_10px_40px_rgba(20,20,20,0.06)] ring-1 ring-black/6 md:rounded-[28px] md:p-6" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "flex items-center justify-between gap-3" }, /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("div", { className: "text-xs font-bold uppercase tracking-[0.24em] text-[#b39a8b]" }, import_utils.locales.getText("pisell2.venue.checkout.booking.details") || "预订详情"), /* @__PURE__ */ import_react.default.createElement("div", { className: "mt-3 text-[22px] font-extrabold text-zinc-900" }, import_utils.locales.getText("pisell2.venue.checkout.court.summary") || "场地预订摘要"))), /* @__PURE__ */ import_react.default.createElement("div", { className: "mt-5 grid gap-4 md:grid-cols-2" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "rounded-[22px] bg-[#faf7f4] p-4 ring-1 ring-black/6 md:col-span-2" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "text-sm font-semibold text-[#a69183]" }, import_utils.locales.getText("pisell2.venue.checkout.selected.courts") || "已选场地"), /* @__PURE__ */ import_react.default.createElement("div", { className: "mt-3 space-y-2 text-[15px] font-semibold text-zinc-900" }, mergedCourtSessionLines.length ? mergedCourtSessionLines.map((line, idx) => /* @__PURE__ */ import_react.default.createElement("div", { key: `venue-session-line-${idx}` }, line)) : /* @__PURE__ */ import_react.default.createElement("div", null, import_utils.locales.getText("pisell2.venue.checkout.sessions.empty") || "-"))), addonCartItems.length > 0 ? /* @__PURE__ */ import_react.default.createElement("div", { className: "rounded-[22px] bg-[#faf7f4] p-4 ring-1 ring-black/6" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "text-sm font-semibold text-[#a69183]" }, import_utils.locales.getText("pisell2.venue.checkout.addons") || "附加项"), /* @__PURE__ */ import_react.default.createElement("div", { className: "mt-3 text-[15px] font-semibold text-zinc-900" }, addonCartItems.map((item, idx) => /* @__PURE__ */ import_react.default.createElement("div", { key: `addon-${item.id || idx}` }, item.title || item.name || "-"))), /* @__PURE__ */ import_react.default.createElement("div", { className: "mt-2 text-[15px] text-zinc-500" }, import_utils.locales.getText("pisell2.venue.checkout.addons.total") || "附加项合计", ": ", symbol, addonTotal.toFixed(2))) : null, /* @__PURE__ */ import_react.default.createElement("div", { className: "rounded-[22px] bg-[#faf7f4] p-4 ring-1 ring-black/6" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "text-sm font-semibold text-[#a69183]" }, import_utils.locales.getText("pisell2.venue.checkout.subtotal") || "预订小计"), /* @__PURE__ */ import_react.default.createElement("div", { className: "mt-3 text-[30px] font-extrabold text-zinc-900" }, symbol, Number.isNaN(bookingSubtotal) ? "0.00" : bookingSubtotal.toFixed(2))), taxFee > 0 ? /* @__PURE__ */ import_react.default.createElement("div", { className: "rounded-[22px] bg-[#faf7f4] p-4 ring-1 ring-black/6" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "text-sm font-semibold text-[#a69183]" }, import_utils.locales.getText("pisell2.venue.checkout.tax") || "税费"), /* @__PURE__ */ import_react.default.createElement("div", { className: "mt-3 text-[15px] font-semibold text-zinc-900" }, symbol, Number.isNaN(taxFee) ? "0.00" : taxFee.toFixed(2))) : null)), /* @__PURE__ */ import_react.default.createElement("div", { className: "space-y-4" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "rounded-[28px] bg-white p-5 shadow-[0_10px_40px_rgba(20,20,20,0.06)] ring-1 ring-black/6 md:p-6" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "flex items-start justify-between gap-3" }), /* @__PURE__ */ import_react.default.createElement("div", { className: "mt-5 rounded-[22px] bg-[#faf7f4] p-4 ring-1 ring-black/6" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "text-lg font-bold text-zinc-900" }, import_utils.locales.getText("pisell2.venue.checkout.notice") || "备注"), /* @__PURE__ */ import_react.default.createElement(
124
+ return /* @__PURE__ */ import_react.default.createElement("div", { className: "space-y-3 md:space-y-5" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "grid gap-3 md:gap-4" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "rounded-[22px] bg-white p-4 shadow-[0_10px_40px_rgba(20,20,20,0.06)] ring-1 ring-black/6 md:rounded-[28px] md:p-6" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "flex items-center justify-between gap-3" }, /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("div", { className: "text-xs font-bold uppercase tracking-[0.24em] text-[#b39a8b]" }, import_utils.locales.getText("pisell2.venue.checkout.booking.details") || "预订详情"), /* @__PURE__ */ import_react.default.createElement("div", { className: "mt-3 text-[22px] font-extrabold text-zinc-900" }, import_utils.locales.getText("pisell2.venue.checkout.court.summary") || "场地预订摘要"))), /* @__PURE__ */ import_react.default.createElement("div", { className: "mt-5 grid gap-4 md:grid-cols-2" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "rounded-[22px] bg-[#faf7f4] p-4 ring-1 ring-black/6 md:col-span-2" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "text-sm font-semibold text-[#a69183]" }, import_utils.locales.getText("pisell2.venue.checkout.selected.courts") || "已选场地"), /* @__PURE__ */ import_react.default.createElement("div", { className: "mt-3 space-y-2 text-[15px] font-semibold text-zinc-900" }, mergedCourtSessionLines.length ? mergedCourtSessionLines.map((line, idx) => /* @__PURE__ */ import_react.default.createElement("div", { key: `venue-session-line-${idx}` }, line)) : /* @__PURE__ */ import_react.default.createElement("div", null, import_utils.locales.getText("pisell2.venue.checkout.sessions.empty") || "-"))), addonCartItems.length > 0 ? /* @__PURE__ */ import_react.default.createElement("div", { className: "rounded-[22px] bg-[#faf7f4] p-4 ring-1 ring-black/6" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "text-sm font-semibold text-[#a69183]" }, import_utils.locales.getText("pisell2.venue.checkout.addons") || "附加项"), /* @__PURE__ */ import_react.default.createElement("div", { className: "mt-3 text-[15px] font-semibold text-zinc-900" }, addonCartItems.map((item, idx) => /* @__PURE__ */ import_react.default.createElement("div", { key: `addon-${item.id || idx}` }, item.title || item.name || "-"))), /* @__PURE__ */ import_react.default.createElement("div", { className: "mt-2 text-[15px] text-zinc-500" }, import_utils.locales.getText("pisell2.venue.checkout.addons.total") || "附加项合计", ": ", symbol, addonTotal.toFixed(2))) : null, /* @__PURE__ */ import_react.default.createElement("div", { className: "rounded-[22px] bg-[#faf7f4] p-4 ring-1 ring-black/6 md:col-span-2" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "text-sm font-semibold text-[#a69183]" }, import_utils.locales.getText("pisell2.venue.checkout.subtotal") || "预订小计"), /* @__PURE__ */ import_react.default.createElement("div", { className: "mt-3 text-[30px] font-extrabold text-zinc-900" }, symbol, Number.isNaN(bookingSubtotal) ? "0.00" : bookingSubtotal.toFixed(2))))), /* @__PURE__ */ import_react.default.createElement("div", { className: "space-y-4" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "rounded-[28px] bg-white p-5 shadow-[0_10px_40px_rgba(20,20,20,0.06)] ring-1 ring-black/6 md:p-6" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "flex items-start justify-between gap-3" }), /* @__PURE__ */ import_react.default.createElement("div", { className: "mt-5 rounded-[22px] bg-[#faf7f4] p-4 ring-1 ring-black/6" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "text-lg font-bold text-zinc-900" }, import_utils.locales.getText("pisell2.venue.checkout.notice") || "备注"), /* @__PURE__ */ import_react.default.createElement(
129
125
  "textarea",
130
126
  {
131
127
  className: "mt-4 min-h-[120px] w-full rounded-[20px] border border-black/10 bg-white px-4 py-4 text-sm outline-none placeholder:text-zinc-400",
@@ -55,9 +55,7 @@ function Content() {
55
55
  if (!scope) return void 0;
56
56
  function update() {
57
57
  if (!wrap) return;
58
- const isSticky = typeof window !== "undefined" && window.getComputedStyle(wrap).position === "sticky";
59
- const value = isSticky ? `${wrap.offsetHeight}px` : "0px";
60
- scope == null ? void 0 : scope.style.setProperty("--vb-grid-sticky-top", value);
58
+ scope == null ? void 0 : scope.style.setProperty("--vb-grid-sticky-top", `${wrap.offsetHeight}px`);
61
59
  }
62
60
  update();
63
61
  const ro = typeof ResizeObserver !== "undefined" ? new ResizeObserver(update) : null;
@@ -133,17 +131,24 @@ function Content() {
133
131
  background: #fff;
134
132
  border-radius: 0 0 28px 28px;
135
133
  }
136
- `), /* @__PURE__ */ import_react.default.createElement("main", { className: "mx-auto max-w-[1500px] px-3 pt-3 md:px-6 md:pt-6 lg:pb-12 h-full overscroll-none" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "space-y-2 md:space-y-4", style: { minHeight: "100%" } }, /* @__PURE__ */ import_react.default.createElement("div", { ref: stepHeaderRef, className: "sticky top-0 z-30 lg:static lg:z-auto" }, /* @__PURE__ */ import_react.default.createElement(import_Header.default, null)), /* @__PURE__ */ import_react.default.createElement("div", { className: "grid max-w-full gap-2 md:gap-4 lg:grid-cols-[minmax(0,1fr)_390px] xl:grid-cols-[minmax(0,1fr)_420px]" }, /* @__PURE__ */ import_react.default.createElement("section", { className: "min-w-0 space-y-3 overscroll-none md:space-y-5" }, stepRegistry[currentStep]), /* @__PURE__ */ import_react.default.createElement("aside", { className: "hidden lg:block sticky top-6 self-start rounded-[28px] bg-white shadow-[0_10px_40px_rgba(20,20,20,0.06)] ring-1 ring-black/6" }, /* @__PURE__ */ import_react.default.createElement(
137
- import_Cart.default,
134
+ `), /* @__PURE__ */ import_react.default.createElement("main", { className: "mx-auto max-w-[1500px] px-3 pt-3 md:px-6 md:pt-6 lg:pb-12 h-full overscroll-none" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "space-y-2 md:space-y-4", style: { minHeight: "100%" } }, /* @__PURE__ */ import_react.default.createElement("div", { ref: stepHeaderRef, className: "sticky top-0 z-40" }, /* @__PURE__ */ import_react.default.createElement(import_Header.default, null)), /* @__PURE__ */ import_react.default.createElement("div", { className: "grid max-w-full gap-2 md:gap-4 lg:grid-cols-[minmax(0,1fr)_390px] xl:grid-cols-[minmax(0,1fr)_420px]" }, /* @__PURE__ */ import_react.default.createElement("section", { className: "min-w-0 space-y-3 overscroll-none md:space-y-5" }, stepRegistry[currentStep]), /* @__PURE__ */ import_react.default.createElement(
135
+ "aside",
138
136
  {
139
- embedded: true,
140
- open: true,
141
- items: viewModel.cartItems,
142
- summary: viewModel.summary,
143
- onCancel: () => {
144
- },
145
- onNext: handlePrimaryAction,
146
- confirmLoading: isSubmittingOrder
147
- }
148
- )))), /* @__PURE__ */ import_react.default.createElement("div", { className: "sticky bottom-0 z-30 block lg:hidden" }, /* @__PURE__ */ import_react.default.createElement(import_Footer.default, null))));
137
+ className: "hidden lg:block sticky self-start z-10 rounded-[28px] bg-white shadow-[0_10px_40px_rgba(20,20,20,0.06)] ring-1 ring-black/6",
138
+ style: { top: "calc(var(--vb-grid-sticky-top, 0px) + 1.5rem)" }
139
+ },
140
+ /* @__PURE__ */ import_react.default.createElement(
141
+ import_Cart.default,
142
+ {
143
+ embedded: true,
144
+ open: true,
145
+ items: viewModel.cartItems,
146
+ summary: viewModel.summary,
147
+ onCancel: () => {
148
+ },
149
+ onNext: handlePrimaryAction,
150
+ confirmLoading: isSubmittingOrder
151
+ }
152
+ )
153
+ ))), /* @__PURE__ */ import_react.default.createElement("div", { className: "sticky bottom-0 z-30 block lg:hidden" }, /* @__PURE__ */ import_react.default.createElement(import_Footer.default, null))));
149
154
  }
@@ -57,15 +57,7 @@ function Footer() {
57
57
  if (Number.isNaN(parsedAmount)) return "0.00";
58
58
  return parsedAmount.toFixed(2);
59
59
  }, [viewModel.summary]);
60
- const actionText = (0, import_react.useMemo)(() => {
61
- if (currentStep === "select-venue") {
62
- return String(import_utils.locales.getText("pisell2.venue.action.next.addons") || "下一步:附加项");
63
- }
64
- if (currentStep === "addons") {
65
- return String(import_utils.locales.getText("pisell2.venue.action.review.pay") || "确认 & 支付");
66
- }
67
- return String(import_utils.locales.getText("pisell2.venue.action.pay.now") || "立即支付");
68
- }, [currentStep]);
60
+ const actionText = (0, import_react.useMemo)(() => currentStep === "checkout" ? String(import_utils.locales.getText("pisell2.venue.action.pay.now") || "立即支付") : String(import_utils.locales.getText("pisell2.venue.action.next") || "下一步"), [currentStep]);
69
61
  return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("div", { className: "pisell-venue-booking-footer" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "pisell-venue-booking-footer-left" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "pisell-venue-booking-footer-total-label" }, import_utils.locales.getText("pisell2.event.total") || "合计"), /* @__PURE__ */ import_react.default.createElement("div", { className: "pisell-venue-booking-footer-total-amount" }, symbol, totalAmount)), /* @__PURE__ */ import_react.default.createElement("div", { className: "pisell-venue-booking-footer-right" }, /* @__PURE__ */ import_react.default.createElement(import_materials.Badge, { count: ((_a = viewModel.cartItems) == null ? void 0 : _a.length) || 0, id: "venue-booking-cart-btn" }, /* @__PURE__ */ import_react.default.createElement(
70
62
  import_materials.Button,
71
63
  {
@@ -37,16 +37,22 @@ var import_antd = require("antd");
37
37
  var import_utils = require("@pisell/utils");
38
38
  var import_materials = require("@pisell/materials");
39
39
  var import_context = require("../../context");
40
- var STEP_ITEMS = [
41
- { n: 1, key: "select-venue", titleKey: "pisell2.venue.step.select" },
42
- { n: 2, key: "addons", titleKey: "pisell2.venue.step.addons" },
43
- { n: 3, key: "checkout", titleKey: "pisell2.venue.step.checkout" }
44
- ];
45
40
  function Header() {
41
+ var _a;
46
42
  const { currentStep, canNext, viewModel, goToStep, prevStep } = (0, import_context.useVenueBookingContext)();
47
43
  const [popupOpen, setPopupOpen] = (0, import_react.useState)(false);
48
44
  const [confirmOpen, setConfirmOpen] = (0, import_react.useState)(false);
49
45
  const cardRef = (0, import_react.useRef)(null);
46
+ const STEP_ITEMS = (0, import_react.useMemo)(() => {
47
+ var _a2;
48
+ const hasAddons = (((_a2 = viewModel.addonProductList) == null ? void 0 : _a2.length) || 0) > 0;
49
+ const base = [
50
+ { key: "select-venue", titleKey: "pisell2.venue.step.select" },
51
+ ...hasAddons ? [{ key: "addons", titleKey: "pisell2.venue.step.addons" }] : [],
52
+ { key: "checkout", titleKey: "pisell2.venue.step.checkout" }
53
+ ];
54
+ return base.map((item, idx) => ({ ...item, n: idx + 1 }));
55
+ }, [(_a = viewModel.addonProductList) == null ? void 0 : _a.length]);
50
56
  const currentStepIndex = STEP_ITEMS.findIndex((item) => item.key === currentStep);
51
57
  const currentStepItem = STEP_ITEMS[currentStepIndex] || STEP_ITEMS[0];
52
58
  const isFirstStep = currentStepIndex <= 0;
@@ -53,6 +53,11 @@ function TimeGrid() {
53
53
  const resources = (grid == null ? void 0 : grid.resources) || [];
54
54
  const hourGroups = (0, import_react.useMemo)(() => (0, import_utils2.buildHourGroups)(timeLabels), [timeLabels]);
55
55
  const tableGridStyle = (0, import_react.useMemo)(() => (0, import_utils2.getTableGridStyle)(timeLabels.length), [timeLabels.length]);
56
+ const isIosDevice = (0, import_react.useMemo)(() => {
57
+ if (typeof navigator === "undefined") return false;
58
+ return (0, import_utils.isIos)();
59
+ }, []);
60
+ const scrollerOverscrollStyle = (0, import_react.useMemo)(() => isIosDevice ? { overscrollBehavior: "none" } : { overscrollBehaviorX: "none", overscrollBehaviorY: "auto" }, [isIosDevice]);
56
61
  const visibleResources = (0, import_react.useMemo)(() => resources.filter((resource) => {
57
62
  const hitType = filter === "ALL" || resource.productTitle === filter;
58
63
  const hitSearch = !search || resource.resourceName.toLowerCase().includes(search.toLowerCase());
@@ -81,6 +86,7 @@ function TimeGrid() {
81
86
  applyHeaderTransform(e.currentTarget.scrollLeft);
82
87
  }
83
88
  (0, import_react.useEffect)(() => {
89
+ if (isGridLoading) return;
84
90
  const scroller = scrollTableRef.current;
85
91
  if (!scroller || !timeLabels.length || !grid) return;
86
92
  const firstAvailableIndex = (0, import_utils2.getFirstAvailableSlotIndex)(grid);
@@ -94,7 +100,7 @@ function TimeGrid() {
94
100
  const targetLeft = Math.max(0, scrollToIndex * slotWidth);
95
101
  scroller.scrollTo({ left: targetLeft, behavior: "smooth" });
96
102
  applyHeaderTransform(targetLeft);
97
- }, [grid == null ? void 0 : grid.date, timeLabels.length, applyHeaderTransform]);
103
+ }, [grid == null ? void 0 : grid.date, timeLabels.length, isGridLoading, applyHeaderTransform]);
98
104
  (0, import_react.useEffect)(() => {
99
105
  const scroller = scrollTableRef.current;
100
106
  if (!scroller) return void 0;
@@ -147,6 +153,18 @@ function TimeGrid() {
147
153
  scroller.removeEventListener("pointercancel", endDrag);
148
154
  };
149
155
  }, [applyHeaderTransform]);
156
+ (0, import_react.useEffect)(() => {
157
+ const scroller = scrollTableRef.current;
158
+ if (!scroller) return void 0;
159
+ function onWheel(e) {
160
+ if (Math.abs(e.deltaY) > Math.abs(e.deltaX)) {
161
+ e.preventDefault();
162
+ window.scrollBy({ top: e.deltaY, behavior: "instant" });
163
+ }
164
+ }
165
+ scroller.addEventListener("wheel", onWheel, { passive: false });
166
+ return () => scroller.removeEventListener("wheel", onWheel);
167
+ }, []);
150
168
  function handleSlotClick(resourceId, slot) {
151
169
  if (dragStateRef.current.moved) {
152
170
  dragStateRef.current.moved = false;
@@ -222,8 +240,8 @@ function TimeGrid() {
222
240
  {
223
241
  ref: scrollTableRef,
224
242
  onScroll: syncHeader,
225
- className: "max-w-full overflow-x-auto cursor-grab select-none touch-pan-y overscroll-none active:cursor-grabbing",
226
- style: { WebkitOverflowScrolling: "touch", overscrollBehaviorX: "none" }
243
+ className: "max-w-full overflow-x-auto cursor-grab select-none touch-pan-y active:cursor-grabbing",
244
+ style: { WebkitOverflowScrolling: "touch", ...scrollerOverscrollStyle }
227
245
  },
228
246
  /* @__PURE__ */ import_react.default.createElement("div", { className: "w-full", key: grid.date }, visibleResources.map((resource) => {
229
247
  const courtMeta = (0, import_utils2.getResourceCourtMeta)(resource);
@@ -61,8 +61,7 @@ function VenueSelection() {
61
61
  "div",
62
62
  {
63
63
  ref: tableSectionRef,
64
- className: "w-full max-w-full isolate rounded-[28px] bg-white shadow-[0_10px_40px_rgba(20,20,20,0.06)] ring-1 ring-black/6",
65
- style: { overflowX: "clip", overflowY: "visible" }
64
+ className: "w-full max-w-full isolate rounded-[28px] bg-white shadow-[0_10px_40px_rgba(20,20,20,0.06)] ring-1 ring-black/6"
66
65
  },
67
66
  /* @__PURE__ */ import_react.default.createElement(import_TimeGrid.default, null)
68
67
  ));
@@ -52,6 +52,7 @@ var INITIAL_VIEW_MODEL = {
52
52
  venueProducts: [],
53
53
  addonProductList: []
54
54
  };
55
+ var EMPTY_UTILS = {};
55
56
  function getWeekRange(anchor) {
56
57
  const days = (0, import_utils2.getWeekDays)(anchor);
57
58
  return {
@@ -78,12 +79,16 @@ function findNearestAvailableDate(params) {
78
79
  return availableDates.sort((a, b) => b.valueOf() - a.valueOf())[0];
79
80
  }
80
81
  function VenueBookingProvider({ entryContext, children }) {
81
- var _a, _b;
82
+ var _a, _b, _c;
82
83
  const pisellOS = (0, import_useEngineContext.usePisellOS)();
83
84
  const venueBookingModule = (0, import_hooks.useVenueBookingModule)();
84
85
  const [currentStep, setCurrentStep] = (0, import_react.useState)("select-venue");
85
- const stepList = [...import_hooks.VENUE_BOOKING_STEPS];
86
86
  const [viewModel, setViewModel] = (0, import_react.useState)(INITIAL_VIEW_MODEL);
87
+ const stepList = (0, import_react.useMemo)(() => {
88
+ var _a2;
89
+ const hasAddons = (((_a2 = viewModel.addonProductList) == null ? void 0 : _a2.length) || 0) > 0;
90
+ return hasAddons ? ["select-venue", "addons", "checkout"] : ["select-venue", "checkout"];
91
+ }, [(_a = viewModel.addonProductList) == null ? void 0 : _a.length]);
87
92
  const [isLoading, setIsLoading] = (0, import_react.useState)(true);
88
93
  const [isWeekLoading, setIsWeekLoading] = (0, import_react.useState)(true);
89
94
  const [isGridTransition, setIsGridTransition] = (0, import_react.useState)(true);
@@ -97,7 +102,7 @@ function VenueBookingProvider({ entryContext, children }) {
97
102
  const [monthCursor, setMonthCursor] = (0, import_react.useState)((0, import_dayjs.default)().startOf("month"));
98
103
  const { isLogin, openLoginModal } = (0, import_hooks.useVenueBookingLogin)();
99
104
  const engineContext = (0, import_useEngineContext2.default)();
100
- const utils = ((_a = engineContext == null ? void 0 : engineContext.appHelper) == null ? void 0 : _a.utils) || {};
105
+ const utils = ((_b = engineContext == null ? void 0 : engineContext.appHelper) == null ? void 0 : _b.utils) || EMPTY_UTILS;
101
106
  const [discountList, setDiscountList] = (0, import_react.useState)([]);
102
107
  const [isAgreeDepositPolicy, setIsAgreeDepositPolicy] = (0, import_react.useState)(false);
103
108
  const [cartValidation, setCartValidation] = (0, import_react.useState)({ passed: null, failures: [] });
@@ -217,11 +222,11 @@ function VenueBookingProvider({ entryContext, children }) {
217
222
  return (0, import_hooks.safeRunModuleAction)(venueBookingModule, actionName, ...args);
218
223
  }, [venueBookingModule]);
219
224
  const syncCustomerLoginToModule = (0, import_react.useCallback)(async () => {
220
- var _a2, _b2, _c, _d;
225
+ var _a2, _b2, _c2, _d;
221
226
  try {
222
227
  const hasToken = !!((_b2 = (_a2 = utils == null ? void 0 : utils.token) == null ? void 0 : _a2.get) == null ? void 0 : _b2.call(_a2));
223
228
  if (!hasToken) return;
224
- const rawCustomer = (_d = (_c = utils == null ? void 0 : utils.storage) == null ? void 0 : _c.get) == null ? void 0 : _d.call(_c, "customer");
229
+ const rawCustomer = (_d = (_c2 = utils == null ? void 0 : utils.storage) == null ? void 0 : _c2.get) == null ? void 0 : _d.call(_c2, "customer");
225
230
  const customer = typeof rawCustomer === "string" ? JSON.parse(rawCustomer || "{}") : rawCustomer || {};
226
231
  const customerId = customer == null ? void 0 : customer.id;
227
232
  if (!customerId) return;
@@ -260,7 +265,7 @@ function VenueBookingProvider({ entryContext, children }) {
260
265
  }
261
266
  }, [syncCustomerLoginToModule, venueBookingModule, refreshViewModel]);
262
267
  const submitOrder = (0, import_react.useCallback)(async () => {
263
- var _a2, _b2, _c;
268
+ var _a2, _b2, _c2;
264
269
  if (isSubmittingOrder) return;
265
270
  try {
266
271
  setIsSubmittingOrder(true);
@@ -278,7 +283,7 @@ function VenueBookingProvider({ entryContext, children }) {
278
283
  }
279
284
  if (typeof (utils == null ? void 0 : utils.action) === "function") {
280
285
  const otherParams = (0, import_hooks.getOtherParams)(venueBookingModule);
281
- if (totalAmount === 0 || ((_c = otherParams == null ? void 0 : otherParams.openData["checkout.checkout_options"]) == null ? void 0 : _c.length) === 0) {
286
+ if (totalAmount === 0 || ((_c2 = otherParams == null ? void 0 : otherParams.openData["checkout.checkout_options"]) == null ? void 0 : _c2.length) === 0) {
282
287
  return location.replace(`/payment-finish/success?amount=${totalAmount}&order_id=${orderId}`);
283
288
  }
284
289
  utils.action({
@@ -300,7 +305,7 @@ function VenueBookingProvider({ entryContext, children }) {
300
305
  } finally {
301
306
  setIsSubmittingOrder(false);
302
307
  }
303
- }, [isSubmittingOrder, venueBookingModule, refreshViewModel, utils, (_b = viewModel == null ? void 0 : viewModel.summary) == null ? void 0 : _b.total_amount]);
308
+ }, [isSubmittingOrder, venueBookingModule, refreshViewModel, utils, (_c = viewModel == null ? void 0 : viewModel.summary) == null ? void 0 : _c.total_amount]);
304
309
  const handleSubmitOrder = (0, import_react.useCallback)(async () => {
305
310
  if (isLogin) {
306
311
  await submitOrder();
@@ -315,6 +320,19 @@ function VenueBookingProvider({ entryContext, children }) {
315
320
  }
316
321
  });
317
322
  }, [isLogin, openLoginModal, handleLoginSuccess, submitOrder]);
323
+ const proceedToCheckout = (0, import_react.useCallback)(() => {
324
+ if (!isLogin) {
325
+ openLoginModal({
326
+ callback: (status) => {
327
+ if (status === "success") {
328
+ handleLoginSuccess().then(() => goToStep("checkout"));
329
+ }
330
+ }
331
+ });
332
+ return;
333
+ }
334
+ goToStep("checkout");
335
+ }, [isLogin, openLoginModal, handleLoginSuccess, goToStep]);
318
336
  const handlePrimaryAction = (0, import_react.useCallback)(() => {
319
337
  var _a2, _b2;
320
338
  if (currentStep === "select-venue") {
@@ -325,21 +343,15 @@ function VenueBookingProvider({ entryContext, children }) {
325
343
  });
326
344
  return;
327
345
  }
346
+ if (stepList[1] === "checkout") {
347
+ proceedToCheckout();
348
+ return;
349
+ }
328
350
  goToStep("addons");
329
351
  return;
330
352
  }
331
353
  if (currentStep === "addons") {
332
- if (!isLogin) {
333
- openLoginModal({
334
- callback: (status) => {
335
- if (status === "success") {
336
- handleLoginSuccess().then(() => goToStep("checkout"));
337
- }
338
- }
339
- });
340
- return;
341
- }
342
- goToStep("checkout");
354
+ proceedToCheckout();
343
355
  return;
344
356
  }
345
357
  const deposit = (_a2 = viewModel.summary) == null ? void 0 : _a2.deposit;
@@ -348,7 +360,7 @@ function VenueBookingProvider({ entryContext, children }) {
348
360
  return;
349
361
  }
350
362
  void handleSubmitOrder();
351
- }, [currentStep, canNext, isLogin, isAgreeDepositPolicy, viewModel.summary, goToStep, openLoginModal, handleLoginSuccess, handleSubmitOrder]);
363
+ }, [currentStep, canNext, isAgreeDepositPolicy, viewModel.summary, stepList, proceedToCheckout, goToStep, handleSubmitOrder]);
352
364
  (0, import_react.useEffect)(() => {
353
365
  var _a2;
354
366
  const pubsub = utils == null ? void 0 : utils.pubsub;
@@ -5,6 +5,7 @@ export declare const VENUE_BOOKING_STEPS: readonly ["select-venue", "addons", "c
5
5
  export declare const VENUE_PRODUCT_IDS: number[];
6
6
  /**
7
7
  * 获取 PisellOS venueBooking 业务模块
8
+ * 使用 useRef 稳定模块引用,防止 getModule 返回值每次渲染变化时触发 bootstrap useEffect 重跑
8
9
  */
9
10
  export declare function useVenueBookingModule(): any;
10
11
  /** 统一获取货币前缀(优先引擎配置,兜底 '$') */
@@ -49,6 +49,7 @@ __export(hooks_exports, {
49
49
  useVenueBookingSymbol: () => useVenueBookingSymbol
50
50
  });
51
51
  module.exports = __toCommonJS(hooks_exports);
52
+ var import_react = require("react");
52
53
  var import_useEngineContext = require("../../hooks/useEngineContext");
53
54
  var import_useEngineContext2 = __toESM(require("../../hooks/useEngineContext"));
54
55
  var import_toShoppingCartProducts = require("../scanOrder/utils/toShoppingCartProducts");
@@ -57,7 +58,11 @@ var VENUE_PRODUCT_IDS = [61947, 61948];
57
58
  function useVenueBookingModule() {
58
59
  var _a;
59
60
  const pisellOS = (0, import_useEngineContext.usePisellOS)();
60
- return (_a = pisellOS == null ? void 0 : pisellOS.getModule) == null ? void 0 : _a.call(pisellOS, "venueBooking");
61
+ const moduleRef = (0, import_react.useRef)(null);
62
+ if (!moduleRef.current) {
63
+ moduleRef.current = ((_a = pisellOS == null ? void 0 : pisellOS.getModule) == null ? void 0 : _a.call(pisellOS, "venueBooking")) ?? null;
64
+ }
65
+ return moduleRef.current;
61
66
  }
62
67
  function useVenueBookingSymbol() {
63
68
  var _a;
@@ -44,6 +44,24 @@ function VenueBooking(props) {
44
44
  const context = (0, import_useEngineContext.default)();
45
45
  const entryContext = (0, import_hooks.normalizeEntryContext)((_a = context == null ? void 0 : context.engine) == null ? void 0 : _a.props);
46
46
  import_utils.locales.init(import_locales.default, ((_c = (_b = context == null ? void 0 : context.engine) == null ? void 0 : _b.props) == null ? void 0 : _c.locale) || "en");
47
- return /* @__PURE__ */ import_react.default.createElement("div", { className: "venue-booking-scope h-full overflow-x-hidden overscroll-none bg-[#f5f5f3] text-zinc-900" }, /* @__PURE__ */ import_react.default.createElement(import_context.VenueBookingProvider, { entryContext }, /* @__PURE__ */ import_react.default.createElement(import_Content.default, null)));
47
+ const [viewportHeight, setViewportHeight] = (0, import_react.useState)(
48
+ typeof window !== "undefined" ? window.innerHeight : void 0
49
+ );
50
+ (0, import_react.useEffect)(() => {
51
+ function onResize() {
52
+ setViewportHeight(window.innerHeight);
53
+ }
54
+ setViewportHeight(window.innerHeight);
55
+ window.addEventListener("resize", onResize);
56
+ return () => window.removeEventListener("resize", onResize);
57
+ }, []);
58
+ return /* @__PURE__ */ import_react.default.createElement(
59
+ "div",
60
+ {
61
+ className: "venue-booking-scope overflow-x-hidden overscroll-none bg-[#f5f5f3] text-zinc-900",
62
+ style: viewportHeight !== void 0 ? { height: viewportHeight } : { height: "100vh" }
63
+ },
64
+ /* @__PURE__ */ import_react.default.createElement(import_context.VenueBookingProvider, { entryContext }, /* @__PURE__ */ import_react.default.createElement(import_Content.default, null))
65
+ );
48
66
  }
49
67
  var venueBooking_default = VenueBooking;
@@ -23,6 +23,7 @@ declare const _default: {
23
23
  'pisell2.venue.cart.delete.venue.only.step1': string;
24
24
  'pisell2.venue.cart.addons.ready': string;
25
25
  'pisell2.venue.cart.review.all': string;
26
+ 'pisell2.venue.action.next': string;
26
27
  'pisell2.venue.action.next.addons': string;
27
28
  'pisell2.venue.action.review.pay': string;
28
29
  'pisell2.venue.action.pay.now': string;
@@ -91,6 +92,7 @@ declare const _default: {
91
92
  'pisell2.venue.calendar.weekday.short.sun': string;
92
93
  'pisell2.venue.time.am': string;
93
94
  'pisell2.venue.time.pm': string;
95
+ 'pisell2.venue.time.hour.format': string;
94
96
  'pisell2.venue.limit.message': string;
95
97
  'pisell2.text.goodpass': string;
96
98
  'pisell2.text.goodpass.product-vouchers': string;
@@ -119,6 +121,7 @@ declare const _default: {
119
121
  'pisell2.appointment.policy': string;
120
122
  'pisell2.appointment.policy.confirm': string;
121
123
  'pisell2.appointment.booking.empty.data': string;
124
+ 'pisell2.product-select.search': string;
122
125
  };
123
126
  'zh-CN': {
124
127
  'pisell2.venue.step.select': string;
@@ -140,6 +143,7 @@ declare const _default: {
140
143
  'pisell2.venue.cart.delete.venue.only.step1': string;
141
144
  'pisell2.venue.cart.addons.ready': string;
142
145
  'pisell2.venue.cart.review.all': string;
146
+ 'pisell2.venue.action.next': string;
143
147
  'pisell2.venue.action.next.addons': string;
144
148
  'pisell2.venue.action.review.pay': string;
145
149
  'pisell2.venue.action.pay.now': string;
@@ -208,6 +212,7 @@ declare const _default: {
208
212
  'pisell2.venue.calendar.weekday.short.sun': string;
209
213
  'pisell2.venue.time.am': string;
210
214
  'pisell2.venue.time.pm': string;
215
+ 'pisell2.venue.time.hour.format': string;
211
216
  'pisell2.venue.limit.message': string;
212
217
  'pisell2.text.goodpass': string;
213
218
  'pisell2.text.goodpass.product-vouchers': string;
@@ -236,6 +241,7 @@ declare const _default: {
236
241
  'pisell2.appointment.policy': string;
237
242
  'pisell2.appointment.policy.confirm': string;
238
243
  'pisell2.appointment.booking.empty.data': string;
244
+ 'pisell2.product-select.search': string;
239
245
  };
240
246
  'zh-HK': {
241
247
  'pisell2.venue.step.select': string;
@@ -257,6 +263,7 @@ declare const _default: {
257
263
  'pisell2.venue.cart.delete.venue.only.step1': string;
258
264
  'pisell2.venue.cart.addons.ready': string;
259
265
  'pisell2.venue.cart.review.all': string;
266
+ 'pisell2.venue.action.next': string;
260
267
  'pisell2.venue.action.next.addons': string;
261
268
  'pisell2.venue.action.review.pay': string;
262
269
  'pisell2.venue.action.pay.now': string;
@@ -325,6 +332,7 @@ declare const _default: {
325
332
  'pisell2.venue.calendar.weekday.short.sun': string;
326
333
  'pisell2.venue.time.am': string;
327
334
  'pisell2.venue.time.pm': string;
335
+ 'pisell2.venue.time.hour.format': string;
328
336
  'pisell2.venue.limit.message': string;
329
337
  'pisell2.text.goodpass': string;
330
338
  'pisell2.text.goodpass.product-vouchers': string;
@@ -353,6 +361,7 @@ declare const _default: {
353
361
  'pisell2.appointment.policy': string;
354
362
  'pisell2.appointment.policy.confirm': string;
355
363
  'pisell2.appointment.booking.empty.data': string;
364
+ 'pisell2.product-select.search': string;
356
365
  };
357
366
  ja: {
358
367
  'pisell2.venue.step.select': string;
@@ -374,6 +383,7 @@ declare const _default: {
374
383
  'pisell2.venue.cart.delete.venue.only.step1': string;
375
384
  'pisell2.venue.cart.addons.ready': string;
376
385
  'pisell2.venue.cart.review.all': string;
386
+ 'pisell2.venue.action.next': string;
377
387
  'pisell2.venue.action.next.addons': string;
378
388
  'pisell2.venue.action.review.pay': string;
379
389
  'pisell2.venue.action.pay.now': string;
@@ -442,6 +452,7 @@ declare const _default: {
442
452
  'pisell2.venue.calendar.weekday.short.sun': string;
443
453
  'pisell2.venue.time.am': string;
444
454
  'pisell2.venue.time.pm': string;
455
+ 'pisell2.venue.time.hour.format': string;
445
456
  'pisell2.venue.limit.message': string;
446
457
  'pisell2.text.goodpass': string;
447
458
  'pisell2.text.goodpass.product-vouchers': string;
@@ -470,6 +481,7 @@ declare const _default: {
470
481
  'pisell2.appointment.policy': string;
471
482
  'pisell2.appointment.policy.confirm': string;
472
483
  'pisell2.appointment.booking.empty.data': string;
484
+ 'pisell2.product-select.search': string;
473
485
  };
474
486
  pt: {
475
487
  'pisell2.venue.step.select': string;
@@ -491,6 +503,7 @@ declare const _default: {
491
503
  'pisell2.venue.cart.delete.venue.only.step1': string;
492
504
  'pisell2.venue.cart.addons.ready': string;
493
505
  'pisell2.venue.cart.review.all': string;
506
+ 'pisell2.venue.action.next': string;
494
507
  'pisell2.venue.action.next.addons': string;
495
508
  'pisell2.venue.action.review.pay': string;
496
509
  'pisell2.venue.action.pay.now': string;
@@ -559,6 +572,7 @@ declare const _default: {
559
572
  'pisell2.venue.calendar.weekday.short.sun': string;
560
573
  'pisell2.venue.time.am': string;
561
574
  'pisell2.venue.time.pm': string;
575
+ 'pisell2.venue.time.hour.format': string;
562
576
  'pisell2.venue.limit.message': string;
563
577
  'pisell2.text.goodpass': string;
564
578
  'pisell2.text.goodpass.product-vouchers': string;
@@ -587,6 +601,7 @@ declare const _default: {
587
601
  'pisell2.appointment.policy': string;
588
602
  'pisell2.appointment.policy.confirm': string;
589
603
  'pisell2.appointment.booking.empty.data': string;
604
+ 'pisell2.product-select.search': string;
590
605
  };
591
606
  };
592
607
  export default _default;
@@ -43,6 +43,7 @@ var locales_default = {
43
43
  "pisell2.venue.cart.delete.venue.only.step1": "Please return to Step 1 before removing court bookings",
44
44
  "pisell2.venue.cart.addons.ready": "Add-ons are ready below.",
45
45
  "pisell2.venue.cart.review.all": "Review everything before payment.",
46
+ "pisell2.venue.action.next": "Next",
46
47
  "pisell2.venue.action.next.addons": "Next: Add-ons",
47
48
  "pisell2.venue.action.review.pay": "Review & Pay",
48
49
  "pisell2.venue.action.pay.now": "Pay now",
@@ -111,6 +112,7 @@ var locales_default = {
111
112
  "pisell2.venue.calendar.weekday.short.sun": "Sun",
112
113
  "pisell2.venue.time.am": "am",
113
114
  "pisell2.venue.time.pm": "pm",
115
+ "pisell2.venue.time.hour.format": "{hour}{suffix}",
114
116
  "pisell2.venue.limit.message": "You can book up to 4 bookings or max 8 hours.",
115
117
  "pisell2.text.goodpass": "Promotion",
116
118
  "pisell2.text.goodpass.product-vouchers": "Product Vouchers",
@@ -138,7 +140,8 @@ var locales_default = {
138
140
  "pisell2.appointment.deposit.close": "Close",
139
141
  "pisell2.appointment.policy": "You have read and agreed to this policy",
140
142
  "pisell2.appointment.policy.confirm": "Confirm",
141
- "pisell2.appointment.booking.empty.data": "No data"
143
+ "pisell2.appointment.booking.empty.data": "No data",
144
+ "pisell2.product-select.search": "Search"
142
145
  },
143
146
  "zh-CN": {
144
147
  "pisell2.venue.step.select": "选择场地",
@@ -160,6 +163,7 @@ var locales_default = {
160
163
  "pisell2.venue.cart.delete.venue.only.step1": "请返回第一步后再删除场地商品",
161
164
  "pisell2.venue.cart.addons.ready": "附加项已准备就绪。",
162
165
  "pisell2.venue.cart.review.all": "请在支付前检查所有信息。",
166
+ "pisell2.venue.action.next": "下一步",
163
167
  "pisell2.venue.action.next.addons": "下一步:附加项",
164
168
  "pisell2.venue.action.review.pay": "确认 & 支付",
165
169
  "pisell2.venue.action.pay.now": "立即支付",
@@ -228,6 +232,7 @@ var locales_default = {
228
232
  "pisell2.venue.calendar.weekday.short.sun": "周日",
229
233
  "pisell2.venue.time.am": "上午",
230
234
  "pisell2.venue.time.pm": "下午",
235
+ "pisell2.venue.time.hour.format": "{suffix}{hour}点",
231
236
  "pisell2.venue.limit.message": "最多可预订 4 个场次或 8 小时。",
232
237
  "pisell2.text.goodpass": "促销",
233
238
  "pisell2.text.goodpass.product-vouchers": "商品兑换券",
@@ -255,7 +260,8 @@ var locales_default = {
255
260
  "pisell2.appointment.deposit.close": "关闭",
256
261
  "pisell2.appointment.policy": "您已仔细阅读并同意此协议",
257
262
  "pisell2.appointment.policy.confirm": "确定",
258
- "pisell2.appointment.booking.empty.data": "暂无数据"
263
+ "pisell2.appointment.booking.empty.data": "暂无数据",
264
+ "pisell2.product-select.search": "搜索"
259
265
  },
260
266
  "zh-HK": {
261
267
  "pisell2.venue.step.select": "選擇場地",
@@ -277,6 +283,7 @@ var locales_default = {
277
283
  "pisell2.venue.cart.delete.venue.only.step1": "請返回第一步後再刪除場地商品",
278
284
  "pisell2.venue.cart.addons.ready": "附加項已準備就緒。",
279
285
  "pisell2.venue.cart.review.all": "請在支付前檢查所有資訊。",
286
+ "pisell2.venue.action.next": "下一步",
280
287
  "pisell2.venue.action.next.addons": "下一步:附加項",
281
288
  "pisell2.venue.action.review.pay": "確認 & 支付",
282
289
  "pisell2.venue.action.pay.now": "立即支付",
@@ -345,6 +352,7 @@ var locales_default = {
345
352
  "pisell2.venue.calendar.weekday.short.sun": "週日",
346
353
  "pisell2.venue.time.am": "上午",
347
354
  "pisell2.venue.time.pm": "下午",
355
+ "pisell2.venue.time.hour.format": "{suffix}{hour}點",
348
356
  "pisell2.venue.limit.message": "最多可預訂 4 個場次或 8 小時。",
349
357
  "pisell2.text.goodpass": "促銷",
350
358
  "pisell2.text.goodpass.product-vouchers": "商品兌換券",
@@ -372,7 +380,8 @@ var locales_default = {
372
380
  "pisell2.appointment.deposit.close": "關閉",
373
381
  "pisell2.appointment.policy": "您已仔細閱讀並同意此協議",
374
382
  "pisell2.appointment.policy.confirm": "確定",
375
- "pisell2.appointment.booking.empty.data": "暫無數據"
383
+ "pisell2.appointment.booking.empty.data": "暫無數據",
384
+ "pisell2.product-select.search": "搜索"
376
385
  },
377
386
  ja: {
378
387
  "pisell2.venue.step.select": "コートを選択",
@@ -394,6 +403,7 @@ var locales_default = {
394
403
  "pisell2.venue.cart.delete.venue.only.step1": "コート予約を削除するには、ステップ1に戻ってください",
395
404
  "pisell2.venue.cart.addons.ready": "追加オプションを下から選択できます。",
396
405
  "pisell2.venue.cart.review.all": "支払い前に内容を確認してください。",
406
+ "pisell2.venue.action.next": "次へ",
397
407
  "pisell2.venue.action.next.addons": "次へ:追加オプション",
398
408
  "pisell2.venue.action.review.pay": "確認して支払う",
399
409
  "pisell2.venue.action.pay.now": "今すぐ支払う",
@@ -462,6 +472,7 @@ var locales_default = {
462
472
  "pisell2.venue.calendar.weekday.short.sun": "日",
463
473
  "pisell2.venue.time.am": "午前",
464
474
  "pisell2.venue.time.pm": "午後",
475
+ "pisell2.venue.time.hour.format": "{suffix}{hour}時",
465
476
  "pisell2.venue.limit.message": "最大 4 件の予約、または合計 8 時間まで予約できます。",
466
477
  "pisell2.text.goodpass": "プロモーション",
467
478
  "pisell2.text.goodpass.product-vouchers": "商品バウチャー",
@@ -489,7 +500,8 @@ var locales_default = {
489
500
  "pisell2.appointment.deposit.close": "閉じる",
490
501
  "pisell2.appointment.policy": "このポリシーを読み、同意しました",
491
502
  "pisell2.appointment.policy.confirm": "確認",
492
- "pisell2.appointment.booking.empty.data": "データなし"
503
+ "pisell2.appointment.booking.empty.data": "データなし",
504
+ "pisell2.product-select.search": "検索"
493
505
  },
494
506
  pt: {
495
507
  "pisell2.venue.step.select": "Escolher quadra",
@@ -511,6 +523,7 @@ var locales_default = {
511
523
  "pisell2.venue.cart.delete.venue.only.step1": "Volte para a Etapa 1 antes de remover reservas de quadra",
512
524
  "pisell2.venue.cart.addons.ready": "Os adicionais estão prontos abaixo.",
513
525
  "pisell2.venue.cart.review.all": "Revise tudo antes do pagamento.",
526
+ "pisell2.venue.action.next": "Próximo",
514
527
  "pisell2.venue.action.next.addons": "Próximo: adicionais",
515
528
  "pisell2.venue.action.review.pay": "Revisar e pagar",
516
529
  "pisell2.venue.action.pay.now": "Pagar agora",
@@ -579,6 +592,7 @@ var locales_default = {
579
592
  "pisell2.venue.calendar.weekday.short.sun": "Dom",
580
593
  "pisell2.venue.time.am": "am",
581
594
  "pisell2.venue.time.pm": "pm",
595
+ "pisell2.venue.time.hour.format": "{hour}{suffix}",
582
596
  "pisell2.venue.limit.message": "Você pode reservar até 4 reservas ou no máximo 8 horas.",
583
597
  "pisell2.text.goodpass": "Promoção",
584
598
  "pisell2.text.goodpass.product-vouchers": "Vales de Produto",
@@ -606,6 +620,7 @@ var locales_default = {
606
620
  "pisell2.appointment.deposit.close": "Fechar",
607
621
  "pisell2.appointment.policy": "Você leu e concordou com esta política",
608
622
  "pisell2.appointment.policy.confirm": "Confirmar",
609
- "pisell2.appointment.booking.empty.data": "Sem dados"
623
+ "pisell2.appointment.booking.empty.data": "Sem dados",
624
+ "pisell2.product-select.search": "Pesquisar"
610
625
  }
611
626
  };