@pisell/private-materials 6.11.653 → 6.11.655

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.
@@ -619,4 +619,4 @@ function showDiscountScanFailMessage(val, scene = "goodpass", locales) {
619
619
  return scene === "goodpass" ? locales.getText("pisell2.text.goodpass.code-invalid-cart") : locales.getText("pisell2.voucher.code-invalid-cart");
620
620
  }
621
621
  //#endregion
622
- export { deleteCacheParams, findNextDuration, flexibleObj, formatProductListByCategory, formatResource, getCacheParams, getDays, getDiscountTime, getDiscountTimeByDayMinutes, getDuration, getEndDate, getErrorList, getIsEdit, getIsEject, getIsOnlySession, getLastServer, getMainPrice, getNowTime, getProductTotalPrice, getServeStartTime, getServerItemExtend, getServiceTime, getServiceTimes, isNowTime, isSessionProduct, isWalkIn, request, showDiscountScanFailMessage, sliceDayIntoFiveMinutes };
622
+ export { deleteCacheParams, findNextDuration, flexibleObj, formatProductListByCategory, formatResource, getCacheParams, getDays, getDiscountTime, getDiscountTimeByDayMinutes, getDuration, getEndDate, getErrorList, getIsEdit, getIsEject, getIsOnlySession, getLastServer, getMainPrice, getNowTime, getProductTotalPrice, getServeStartTime, getServerItemExtend, getServiceTime, getServiceTimes, getShopOpeningHours, isNowTime, isSessionProduct, isWalkIn, request, showDiscountScanFailMessage, sliceDayIntoFiveMinutes };
@@ -2,7 +2,7 @@ import { _objectSpread2 } from "../../../../../_virtual/_@oxc-project_runtime@0.
2
2
  import { _asyncToGenerator } from "../../../../../_virtual/_@oxc-project_runtime@0.122.0/helpers/asyncToGenerator.js";
3
3
  import { getDurationProps, getTimeObj } from "../../../../../components/booking/info2/service/addService/utils.js";
4
4
  import { isNormalProductByDurationSchedule } from "../../../../../components/booking/info/service2/utils.js";
5
- import { getDiscountTime, getServiceTimes, isSessionProduct } from "../../../../../components/booking/utils.js";
5
+ import { getDiscountTime, getServiceTimes, getShopOpeningHours, isSessionProduct } from "../../../../../components/booking/utils.js";
6
6
  import Duration from "../../../../../components/booking/materiels/duration/index.js";
7
7
  import SkuDetailLoadingPanel from "../../../LoadingPanel.js";
8
8
  import { selectionFlowText } from "../../i18n.js";
@@ -10,7 +10,7 @@ import { buildDraftCacheItem, getModuleOptions, getUnsupportedBookingFlowReason,
10
10
  import TimeResourceSelector from "../../../../../components/eventBooking/components/timeResourceSelector/index.js";
11
11
  import { resolveAvailabilityStatus } from "../../../../../components/eventBooking/components/bookingAvailabilityCalendar/utils.js";
12
12
  import { validateAvailabilityTimeAutoResolution } from "../autoResolution.js";
13
- import { getAvailabilityCandidateDurationMinutes, getPosFlexibleDurationPresetCandidates, getSessionPresetCandidates, isFlexibleDurationValue, isSameAvailabilityCandidateRange, resolvePosCustomTimeBaseMinutes, resolvePosCustomTimeCandidate, resolvePosCustomTimeDefaultDurationMinutes, resolvePosCustomTimeDefaultStartTime, shouldShowPosCustomTimeCandidateCards } from "./posCustomTime.js";
13
+ import { getAvailabilityCandidateDurationMinutes, getPosFlexibleDurationPresetCandidates, getSessionPresetCandidates, isFlexibleDurationValue, isSameAvailabilityCandidateRange, resolvePosCustomTimeBaseMinutes, resolvePosCustomTimeCandidate, resolvePosCustomTimeDefaultDurationMinutes, resolvePosCustomTimeDefaultStartTime, resolvePosFlexibleBusinessDurationMinutes, resolvePosFlexibleDurationInitialCandidate, shouldShowPosCustomTimeCandidateCards } from "./posCustomTime.js";
14
14
  import dayjs from "dayjs";
15
15
  import React, { useEffect, useMemo } from "react";
16
16
  import { Alert, Space } from "antd";
@@ -197,7 +197,7 @@ const refreshAvailabilityTimes = function() {
197
197
  const fallbackSlice = (_moduleOptions$slice = moduleOptions.slice) !== null && _moduleOptions$slice !== void 0 ? _moduleOptions$slice : typeof configuredSlice === "object" ? configuredSlice === null || configuredSlice === void 0 ? void 0 : configuredSlice.value : configuredSlice;
198
198
  const baseDurationMinutes = resolvePosCustomTimeBaseMinutes(group === null || group === void 0 ? void 0 : group.slotStepMinutes, fallbackSlice);
199
199
  const nextStartTime = resolvePosCustomTimeDefaultStartTime(context.draft.booking.startTime, baseDurationMinutes);
200
- const nextDuration = resolvePosCustomTimeDefaultDurationMinutes((_normalizeDurationMin3 = normalizeDurationMinutesValue(context.draft.booking.duration)) !== null && _normalizeDurationMin3 !== void 0 ? _normalizeDurationMin3 : context.draft.booking.duration, baseDurationMinutes);
200
+ const nextDuration = resolvePosCustomTimeDefaultDurationMinutes((_normalizeDurationMin3 = normalizeDurationMinutesValue(context.draft.booking.duration)) !== null && _normalizeDurationMin3 !== void 0 ? _normalizeDurationMin3 : context.draft.booking.duration, baseDurationMinutes, context.services.selectionFlowMode === "edit" ? void 0 : resolvePosFlexibleBusinessDurationMinutes(nextStartTime, getShopOpeningHours()));
201
201
  const changedFields = [];
202
202
  if (nextStartTime !== context.draft.booking.startTime) changedFields.push("booking.startTime");
203
203
  if (nextDuration !== context.draft.booking.duration) changedFields.push("booking.duration");
@@ -217,7 +217,7 @@ const refreshAvailabilityTimes = function() {
217
217
  yield refreshAvailabilityTimes(context, module, {
218
218
  durationOverride: nextDuration,
219
219
  startTimeOverride: nextStartTime,
220
- selectionIntent: "custom"
220
+ selectionIntent: "fallback"
221
221
  });
222
222
  return;
223
223
  }
@@ -279,8 +279,16 @@ const refreshAvailabilityTimes = function() {
279
279
  });
280
280
  const normallySelectableCandidates = times.filter((candidate) => isAvailabilityCandidateSelectable(candidate));
281
281
  const selectableCandidates = normallySelectableCandidates.length > 0 || !allowUnavailable ? normallySelectableCandidates : times;
282
- const initialCandidate = restoredCandidate || (posCustomTimeAvailability && Boolean(requestedPosStartTime && requestedPosDuration) ? void 0 : selectableCandidates[0]);
282
+ const shouldPreserveRequestedPosStart = posCustomTimeAvailability && Boolean(requestedPosStartTime && requestedPosDuration);
283
283
  const displayCandidates = posSessionAvailability ? getSessionPresetCandidates(times) : posDurationAvailability && isFlexibleDurationValue(product === null || product === void 0 ? void 0 : product.duration) ? getPosFlexibleDurationPresetCandidates(times, requestedCustomRange, customSelectionIntent) : times;
284
+ const fallbackCandidate = shouldPreserveRequestedPosStart ? void 0 : selectableCandidates[0];
285
+ const preferPosFlexiblePreset = posDurationAvailability && isFlexibleDurationValue(product === null || product === void 0 ? void 0 : product.duration) && !customSelectionIntent && context.services.selectionFlowMode !== "edit" && (selectionIntent === "fallback" || !existingCandidate || existingCandidate.date !== selectedDate);
286
+ const initialCandidate = posDurationAvailability && isFlexibleDurationValue(product === null || product === void 0 ? void 0 : product.duration) ? resolvePosFlexibleDurationInitialCandidate({
287
+ presetCandidates: displayCandidates,
288
+ restoredCandidate,
289
+ fallbackCandidate,
290
+ preferPreset: preferPosFlexiblePreset
291
+ }) : restoredCandidate || fallbackCandidate;
284
292
  context.setModuleData(module.key, {
285
293
  requestId,
286
294
  slotStepMinutes: group === null || group === void 0 ? void 0 : group.slotStepMinutes,
@@ -28,10 +28,27 @@ const resolvePosCustomTimeDefaultStartTime = (currentValue, sliceMinutes, now) =
28
28
  const minutes = alignedMinute % 60;
29
29
  return `${String(hours).padStart(2, "0")}:${String(minutes).padStart(2, "0")}`;
30
30
  };
31
- const resolvePosCustomTimeDefaultDurationMinutes = (currentValue, baseDurationMinutes) => {
32
- if (typeof currentValue === "string") {
33
- const flexibleMatch = currentValue.trim().toLowerCase().match(/^flexible_(\d+(?:\.\d+)?)$/);
34
- if (flexibleMatch) return Math.max(1, Math.floor(Number(flexibleMatch[1])));
31
+ const resolvePosFlexibleBusinessDurationMinutes = (startTime, closingTime) => {
32
+ const toMinuteOfDay = (value) => {
33
+ if (typeof value !== "string") return null;
34
+ const matched = value.trim().match(/^([01]\d|2[0-3]):([0-5]\d)(?::[0-5]\d)?$/);
35
+ if (!matched) return null;
36
+ return Number(matched[1]) * 60 + Number(matched[2]);
37
+ };
38
+ const startMinute = toMinuteOfDay(startTime);
39
+ const closingMinute = toMinuteOfDay(closingTime);
40
+ if (startMinute === null || closingMinute === null) return null;
41
+ const duration = closingMinute > startMinute ? closingMinute - startMinute : closingMinute < startMinute ? closingMinute + 1440 - startMinute : 0;
42
+ return duration > 0 ? duration : null;
43
+ };
44
+ const resolvePosCustomTimeDefaultDurationMinutes = (currentValue, baseDurationMinutes, flexibleDefaultMinutes) => {
45
+ if (isFlexibleDurationValue(currentValue)) {
46
+ const flexibleMinutes = Number(flexibleDefaultMinutes);
47
+ if (Number.isFinite(flexibleMinutes) && flexibleMinutes > 0) return Math.max(1, Math.floor(flexibleMinutes));
48
+ if (typeof currentValue === "string") {
49
+ const flexibleMatch = currentValue.trim().toLowerCase().match(/^flexible_(\d+(?:\.\d+)?)$/);
50
+ if (flexibleMatch) return Math.max(1, Math.floor(Number(flexibleMatch[1])));
51
+ }
35
52
  }
36
53
  const currentMinutes = Number(currentValue);
37
54
  if (Number.isFinite(currentMinutes) && currentMinutes > 0) return Math.max(1, Math.floor(currentMinutes));
@@ -60,5 +77,10 @@ const getPosFlexibleDurationPresetCandidates = (candidates, requestedCustomRange
60
77
  const presets = candidates.filter((candidate) => !isSameAvailabilityCandidateRange(candidate, requestedCustomRange));
61
78
  return presets.length > 0 || customSelectionIntent ? presets : [...candidates];
62
79
  };
80
+ const resolvePosFlexibleDurationInitialCandidate = (params) => {
81
+ const firstAvailablePreset = params.presetCandidates.find((candidate) => (!candidate.status || candidate.status === "available" || candidate.status === "limited") && !(typeof candidate.maxPartySize === "number" && candidate.maxPartySize <= 0));
82
+ if (params.preferPreset && firstAvailablePreset) return firstAvailablePreset;
83
+ return params.restoredCandidate || params.fallbackCandidate;
84
+ };
63
85
  //#endregion
64
- export { getAvailabilityCandidateDurationMinutes, getPosFlexibleDurationPresetCandidates, getSessionPresetCandidates, isFlexibleDurationValue, isSameAvailabilityCandidateRange, resolvePosCustomTimeBaseMinutes, resolvePosCustomTimeCandidate, resolvePosCustomTimeDefaultDurationMinutes, resolvePosCustomTimeDefaultStartTime, shouldShowPosCustomTimeCandidateCards };
86
+ export { getAvailabilityCandidateDurationMinutes, getPosFlexibleDurationPresetCandidates, getSessionPresetCandidates, isFlexibleDurationValue, isSameAvailabilityCandidateRange, resolvePosCustomTimeBaseMinutes, resolvePosCustomTimeCandidate, resolvePosCustomTimeDefaultDurationMinutes, resolvePosCustomTimeDefaultStartTime, resolvePosFlexibleBusinessDurationMinutes, resolvePosFlexibleDurationInitialCandidate, shouldShowPosCustomTimeCandidateCards };
@@ -645,6 +645,7 @@ exports.getServeStartTime = getServeStartTime;
645
645
  exports.getServerItemExtend = getServerItemExtend;
646
646
  exports.getServiceTime = getServiceTime;
647
647
  exports.getServiceTimes = getServiceTimes;
648
+ exports.getShopOpeningHours = getShopOpeningHours;
648
649
  exports.isNowTime = isNowTime;
649
650
  exports.isSessionProduct = isSessionProduct;
650
651
  exports.isWalkIn = isWalkIn;
@@ -201,7 +201,7 @@ const refreshAvailabilityTimes = function() {
201
201
  const fallbackSlice = (_moduleOptions$slice = moduleOptions.slice) !== null && _moduleOptions$slice !== void 0 ? _moduleOptions$slice : typeof configuredSlice === "object" ? configuredSlice === null || configuredSlice === void 0 ? void 0 : configuredSlice.value : configuredSlice;
202
202
  const baseDurationMinutes = require_posCustomTime.resolvePosCustomTimeBaseMinutes(group === null || group === void 0 ? void 0 : group.slotStepMinutes, fallbackSlice);
203
203
  const nextStartTime = require_posCustomTime.resolvePosCustomTimeDefaultStartTime(context.draft.booking.startTime, baseDurationMinutes);
204
- const nextDuration = require_posCustomTime.resolvePosCustomTimeDefaultDurationMinutes((_normalizeDurationMin3 = normalizeDurationMinutesValue(context.draft.booking.duration)) !== null && _normalizeDurationMin3 !== void 0 ? _normalizeDurationMin3 : context.draft.booking.duration, baseDurationMinutes);
204
+ const nextDuration = require_posCustomTime.resolvePosCustomTimeDefaultDurationMinutes((_normalizeDurationMin3 = normalizeDurationMinutesValue(context.draft.booking.duration)) !== null && _normalizeDurationMin3 !== void 0 ? _normalizeDurationMin3 : context.draft.booking.duration, baseDurationMinutes, context.services.selectionFlowMode === "edit" ? void 0 : require_posCustomTime.resolvePosFlexibleBusinessDurationMinutes(nextStartTime, require_utils$2.getShopOpeningHours()));
205
205
  const changedFields = [];
206
206
  if (nextStartTime !== context.draft.booking.startTime) changedFields.push("booking.startTime");
207
207
  if (nextDuration !== context.draft.booking.duration) changedFields.push("booking.duration");
@@ -221,7 +221,7 @@ const refreshAvailabilityTimes = function() {
221
221
  yield refreshAvailabilityTimes(context, module, {
222
222
  durationOverride: nextDuration,
223
223
  startTimeOverride: nextStartTime,
224
- selectionIntent: "custom"
224
+ selectionIntent: "fallback"
225
225
  });
226
226
  return;
227
227
  }
@@ -283,8 +283,16 @@ const refreshAvailabilityTimes = function() {
283
283
  });
284
284
  const normallySelectableCandidates = times.filter((candidate) => isAvailabilityCandidateSelectable(candidate));
285
285
  const selectableCandidates = normallySelectableCandidates.length > 0 || !allowUnavailable ? normallySelectableCandidates : times;
286
- const initialCandidate = restoredCandidate || (posCustomTimeAvailability && Boolean(requestedPosStartTime && requestedPosDuration) ? void 0 : selectableCandidates[0]);
286
+ const shouldPreserveRequestedPosStart = posCustomTimeAvailability && Boolean(requestedPosStartTime && requestedPosDuration);
287
287
  const displayCandidates = posSessionAvailability ? require_posCustomTime.getSessionPresetCandidates(times) : posDurationAvailability && require_posCustomTime.isFlexibleDurationValue(product === null || product === void 0 ? void 0 : product.duration) ? require_posCustomTime.getPosFlexibleDurationPresetCandidates(times, requestedCustomRange, customSelectionIntent) : times;
288
+ const fallbackCandidate = shouldPreserveRequestedPosStart ? void 0 : selectableCandidates[0];
289
+ const preferPosFlexiblePreset = posDurationAvailability && require_posCustomTime.isFlexibleDurationValue(product === null || product === void 0 ? void 0 : product.duration) && !customSelectionIntent && context.services.selectionFlowMode !== "edit" && (selectionIntent === "fallback" || !existingCandidate || existingCandidate.date !== selectedDate);
290
+ const initialCandidate = posDurationAvailability && require_posCustomTime.isFlexibleDurationValue(product === null || product === void 0 ? void 0 : product.duration) ? require_posCustomTime.resolvePosFlexibleDurationInitialCandidate({
291
+ presetCandidates: displayCandidates,
292
+ restoredCandidate,
293
+ fallbackCandidate,
294
+ preferPreset: preferPosFlexiblePreset
295
+ }) : restoredCandidate || fallbackCandidate;
288
296
  context.setModuleData(module.key, {
289
297
  requestId,
290
298
  slotStepMinutes: group === null || group === void 0 ? void 0 : group.slotStepMinutes,
@@ -30,10 +30,27 @@ const resolvePosCustomTimeDefaultStartTime = (currentValue, sliceMinutes, now) =
30
30
  const minutes = alignedMinute % 60;
31
31
  return `${String(hours).padStart(2, "0")}:${String(minutes).padStart(2, "0")}`;
32
32
  };
33
- const resolvePosCustomTimeDefaultDurationMinutes = (currentValue, baseDurationMinutes) => {
34
- if (typeof currentValue === "string") {
35
- const flexibleMatch = currentValue.trim().toLowerCase().match(/^flexible_(\d+(?:\.\d+)?)$/);
36
- if (flexibleMatch) return Math.max(1, Math.floor(Number(flexibleMatch[1])));
33
+ const resolvePosFlexibleBusinessDurationMinutes = (startTime, closingTime) => {
34
+ const toMinuteOfDay = (value) => {
35
+ if (typeof value !== "string") return null;
36
+ const matched = value.trim().match(/^([01]\d|2[0-3]):([0-5]\d)(?::[0-5]\d)?$/);
37
+ if (!matched) return null;
38
+ return Number(matched[1]) * 60 + Number(matched[2]);
39
+ };
40
+ const startMinute = toMinuteOfDay(startTime);
41
+ const closingMinute = toMinuteOfDay(closingTime);
42
+ if (startMinute === null || closingMinute === null) return null;
43
+ const duration = closingMinute > startMinute ? closingMinute - startMinute : closingMinute < startMinute ? closingMinute + 1440 - startMinute : 0;
44
+ return duration > 0 ? duration : null;
45
+ };
46
+ const resolvePosCustomTimeDefaultDurationMinutes = (currentValue, baseDurationMinutes, flexibleDefaultMinutes) => {
47
+ if (isFlexibleDurationValue(currentValue)) {
48
+ const flexibleMinutes = Number(flexibleDefaultMinutes);
49
+ if (Number.isFinite(flexibleMinutes) && flexibleMinutes > 0) return Math.max(1, Math.floor(flexibleMinutes));
50
+ if (typeof currentValue === "string") {
51
+ const flexibleMatch = currentValue.trim().toLowerCase().match(/^flexible_(\d+(?:\.\d+)?)$/);
52
+ if (flexibleMatch) return Math.max(1, Math.floor(Number(flexibleMatch[1])));
53
+ }
37
54
  }
38
55
  const currentMinutes = Number(currentValue);
39
56
  if (Number.isFinite(currentMinutes) && currentMinutes > 0) return Math.max(1, Math.floor(currentMinutes));
@@ -62,6 +79,11 @@ const getPosFlexibleDurationPresetCandidates = (candidates, requestedCustomRange
62
79
  const presets = candidates.filter((candidate) => !isSameAvailabilityCandidateRange(candidate, requestedCustomRange));
63
80
  return presets.length > 0 || customSelectionIntent ? presets : [...candidates];
64
81
  };
82
+ const resolvePosFlexibleDurationInitialCandidate = (params) => {
83
+ const firstAvailablePreset = params.presetCandidates.find((candidate) => (!candidate.status || candidate.status === "available" || candidate.status === "limited") && !(typeof candidate.maxPartySize === "number" && candidate.maxPartySize <= 0));
84
+ if (params.preferPreset && firstAvailablePreset) return firstAvailablePreset;
85
+ return params.restoredCandidate || params.fallbackCandidate;
86
+ };
65
87
  //#endregion
66
88
  exports.getAvailabilityCandidateDurationMinutes = getAvailabilityCandidateDurationMinutes;
67
89
  exports.getPosFlexibleDurationPresetCandidates = getPosFlexibleDurationPresetCandidates;
@@ -72,4 +94,6 @@ exports.resolvePosCustomTimeBaseMinutes = resolvePosCustomTimeBaseMinutes;
72
94
  exports.resolvePosCustomTimeCandidate = resolvePosCustomTimeCandidate;
73
95
  exports.resolvePosCustomTimeDefaultDurationMinutes = resolvePosCustomTimeDefaultDurationMinutes;
74
96
  exports.resolvePosCustomTimeDefaultStartTime = resolvePosCustomTimeDefaultStartTime;
97
+ exports.resolvePosFlexibleBusinessDurationMinutes = resolvePosFlexibleBusinessDurationMinutes;
98
+ exports.resolvePosFlexibleDurationInitialCandidate = resolvePosFlexibleDurationInitialCandidate;
75
99
  exports.shouldShowPosCustomTimeCandidateCards = shouldShowPosCustomTimeCandidateCards;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pisell/private-materials",
3
- "version": "6.11.653",
3
+ "version": "6.11.655",
4
4
  "main": "./lib/index.js",
5
5
  "module": "./es/index.js",
6
6
  "types": "./lib/index.d.ts",
@@ -69,11 +69,11 @@
69
69
  "react-zoom-pan-pinch": "^3.7.0",
70
70
  "styled-components": "^6.0.0-rc.3",
71
71
  "use-sync-external-store": "^1.6.0",
72
- "@pisell/materials": "6.11.256",
73
- "@pisell/icon": "0.0.11",
72
+ "@pisell/pi-payment-sdk": "0.0.3",
74
73
  "@pisell/utils": "3.0.4",
75
74
  "@pisell/date-picker": "3.0.10",
76
- "@pisell/pi-payment-sdk": "0.0.3"
75
+ "@pisell/materials": "6.11.256",
76
+ "@pisell/icon": "0.0.11"
77
77
  },
78
78
  "peerDependencies": {
79
79
  "react": "^18.0.0",