@pisell/private-materials 6.12.238 → 6.12.240

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.
@@ -1,17 +1,13 @@
1
+ const require_runtime = require("../../_virtual/_rolldown/runtime.js");
2
+ let dayjs = require("dayjs");
3
+ dayjs = require_runtime.__toESM(dayjs);
4
+ let _pisell_utils = require("@pisell/utils");
1
5
  //#region src/components/wallet/utils.ts
2
6
  function formatDateTime(dateTime, isAll = false, locale = "zh-CN") {
3
- const date = new Date(dateTime);
4
- const year = date.getFullYear();
5
- const month = String(date.getMonth() + 1).padStart(2, "0");
6
- const day = String(date.getDate()).padStart(2, "0");
7
- const hours = date.getHours();
8
- const minutes = String(date.getMinutes()).padStart(2, "0");
9
- if (isAll) if (locale === "en") return `${day}/${month}/${year}`;
10
- else return `${year}-${month}-${day}`;
11
- if (locale === "en") {
12
- const period = hours >= 12 ? "PM" : "AM";
13
- return `${day}/${month}/${year} ${hours === 0 ? 12 : hours > 12 ? hours - 12 : hours}:${minutes} ${period}`;
14
- } else return `${year}-${month}-${day} ${String(hours).padStart(2, "0")}:${minutes}`;
7
+ const date = (0, dayjs.default)(dateTime);
8
+ if (!date.isValid()) return "";
9
+ const dateFormat = locale === "en" ? "DD/MM/YYYY" : "YYYY-MM-DD";
10
+ return date.format(isAll ? dateFormat : `${dateFormat} ${locale === "en" ? "h:mm A" : "HH:mm"}`);
15
11
  }
16
12
  const textConfig = {
17
13
  "zh-HK": {
@@ -36,6 +32,7 @@ const textConfig = {
36
32
  year: "年",
37
33
  available: "可用",
38
34
  unlimited: "无限期",
35
+ noAvailableDates: "無可用日期",
39
36
  weekPrefix: "周"
40
37
  },
41
38
  "zh-CN": {
@@ -60,6 +57,7 @@ const textConfig = {
60
57
  year: "年",
61
58
  available: "可用",
62
59
  unlimited: "无限期",
60
+ noAvailableDates: "无可用日期",
63
61
  weekPrefix: "周"
64
62
  },
65
63
  "en": {
@@ -84,12 +82,13 @@ const textConfig = {
84
82
  year: "year",
85
83
  available: "available",
86
84
  unlimited: "unlimited",
85
+ noAvailableDates: "No available dates",
87
86
  weekPrefix: ""
88
87
  }
89
88
  };
90
89
  function getWeekdayText(dayNumbers, locale) {
91
90
  const config = textConfig[locale];
92
- return dayNumbers.map((day) => config.weekdays[day]).join(config.separator);
91
+ return [...new Set(dayNumbers)].sort((a, b) => a - b).map((day) => config.weekdays[day]).join(config.separator);
93
92
  }
94
93
  function getRepeatFrequencyText(repeatType, frequency, locale) {
95
94
  const config = textConfig[locale];
@@ -108,124 +107,84 @@ function getRepeatFrequencyText(repeatType, frequency, locale) {
108
107
  }
109
108
  }
110
109
  /**
111
- * 根据scheduleList格式化文案展示
112
- * @param scheduleList 日程列表
113
- * @returns 格式化后的文案结果数组,每个日程对应一个结果
110
+ * 格式化日程与卡有效期的交集。仅生成展示文案,不修改原日程。
114
111
  */
115
- function formatScheduleText(scheduleList, locale = "en") {
116
- const results = [];
117
- const config = textConfig[locale];
118
- scheduleList.forEach((schedule) => {
112
+ function formatScheduleText(scheduleList, locale = "en", validity) {
113
+ const displayLocale = locale === "zh-CN" || locale === "zh-HK" ? locale : "en";
114
+ const config = textConfig[displayLocale];
115
+ if (!Array.isArray(scheduleList) || !scheduleList.length) return [];
116
+ const formatRange = (start, end, isAllDay = true, collapseSingleDate = false) => {
117
+ const range = (0, _pisell_utils.getWalletValidityRange)(start, end, validity);
118
+ if (range.isEmpty) return "";
119
+ const effectiveStart = range.startDate === (0, _pisell_utils.getWalletValidityRange)(start).startDate ? start : `${range.startDate} 00:00:00`;
120
+ const effectiveEnd = range.endDate === (0, _pisell_utils.getWalletValidityRange)(null, end).endDate ? end : `${range.endDate} 23:59:59`;
121
+ const startText = range.startDate ? formatDateTime(effectiveStart, isAllDay, displayLocale) : "";
122
+ const endText = range.endDate ? formatDateTime(effectiveEnd, isAllDay, displayLocale) : config.unlimited;
123
+ if (!startText) return endText;
124
+ if (collapseSingleDate && startText === endText) return startText;
125
+ return `${startText}${config.rangeSeparator}${endText}`;
126
+ };
127
+ const formatExceptions = (dates = []) => dates.filter((item) => {
128
+ const range = (0, _pisell_utils.getWalletValidityRange)(item.start, item.end);
129
+ return range.startDate && range.endDate;
130
+ }).map((item) => formatRange(item.start, item.end, true, true)).filter(Boolean);
131
+ const results = scheduleList.map((schedule) => {
119
132
  var _schedule$repeat_rule, _schedule$repeat_rule2;
120
133
  const validityTexts = [];
121
- const excluded_date = [];
122
- const included_date = [];
123
- if ((_schedule$repeat_rule = schedule.repeat_rule) === null || _schedule$repeat_rule === void 0 ? void 0 : _schedule$repeat_rule.excluded_date) schedule.repeat_rule.excluded_date.forEach((excludeItem) => {
124
- const startDate = formatDateTime(excludeItem.start, true, locale);
125
- const endDate = formatDateTime(excludeItem.end, true, locale);
126
- if (excludeItem.start === excludeItem.end) excluded_date.push(startDate);
127
- else excluded_date.push(`${startDate}${config.rangeSeparator}${endDate}`);
128
- });
129
- if ((_schedule$repeat_rule2 = schedule.repeat_rule) === null || _schedule$repeat_rule2 === void 0 ? void 0 : _schedule$repeat_rule2.included_date) schedule.repeat_rule.included_date.forEach((includeItem) => {
130
- const startDate = formatDateTime(includeItem.start, true, locale);
131
- const endDate = formatDateTime(includeItem.end, true, locale);
132
- if (includeItem.start === includeItem.end) included_date.push(startDate);
133
- else included_date.push(`${startDate}${config.rangeSeparator}${endDate}`);
134
- });
134
+ const excluded_date = formatExceptions(((_schedule$repeat_rule = schedule.repeat_rule) === null || _schedule$repeat_rule === void 0 ? void 0 : _schedule$repeat_rule.excluded_date) || []);
135
+ const included_date = formatExceptions(((_schedule$repeat_rule2 = schedule.repeat_rule) === null || _schedule$repeat_rule2 === void 0 ? void 0 : _schedule$repeat_rule2.included_date) || []);
135
136
  const isAllDay = schedule.is_all === 1;
136
- let validityText = "";
137
- if (schedule.repeat_type === "none") {
137
+ if (schedule.type === "designation" && schedule.designation) schedule.designation.forEach((item) => {
138
+ const allDay = isAllDay || item.start_time === "00:00" && item.end_time === "23:59";
139
+ const text = formatRange(`${item.start_date} ${item.start_time}`, `${item.end_date} ${item.end_time}`, allDay);
140
+ if (text) validityTexts.push(text);
141
+ });
142
+ else if (schedule.repeat_type === "none") {
143
+ var _schedule$time_slot;
138
144
  if (schedule.type === "standard") {
139
- const startDateTime = formatDateTime(schedule.start_time, isAllDay, locale);
140
- const endDateTime = formatDateTime(schedule.end_time, isAllDay, locale);
141
- validityText = `${startDateTime}${config.rangeSeparator}${endDateTime}`;
142
- } else if (schedule.type === "time-slots" && schedule.time_slot.length > 0) {
143
- const baseDate = formatDateTime(schedule.start_time, true, locale);
144
- if (isAllDay) validityText = `${baseDate}`;
145
- else validityText = `${baseDate} ${schedule.time_slot.map((slot) => `${slot.start_time}${config.timeSeparator}${slot.end_time}`).join(config.timeSlotSeparator)}`;
146
- } else if (schedule.type === "designation" && schedule.designation) {
147
- const designationTexts = schedule.designation.map((item) => {
148
- if (isAllDay || item.start_time === "00:00" && item.end_time === "23:59") {
149
- const startDate = formatDateTime(item.start_date, true, locale);
150
- const endDate = formatDateTime(item.end_date, true, locale);
151
- return `${startDate}${config.rangeSeparator}${endDate}`;
152
- } else return `${formatDateTime(item.start_date, true, locale)} ${item.start_time}${config.timeSeparator}${item.end_time}`;
153
- });
154
- validityTexts.push(...designationTexts);
145
+ const text = formatRange(schedule.start_time, schedule.end_time, isAllDay);
146
+ if (text) validityTexts.push(text);
147
+ } else if (schedule.type === "time-slots" && ((_schedule$time_slot = schedule.time_slot) === null || _schedule$time_slot === void 0 ? void 0 : _schedule$time_slot.length)) {
148
+ const dateText = formatRange(schedule.start_time, schedule.start_time, true, true);
149
+ if (dateText) {
150
+ const slots = isAllDay ? "" : schedule.time_slot.map((slot) => `${slot.start_time}${config.timeSeparator}${slot.end_time}`).join(config.timeSlotSeparator);
151
+ validityTexts.push([dateText, slots].filter(Boolean).join(" "));
152
+ }
155
153
  }
156
154
  } else if (schedule.repeat_rule) {
157
- const { frequency, frequency_date } = schedule.repeat_rule;
158
- const startText = isAllDay ? formatDateTime(schedule.start_time, true, locale) : formatDateTime(schedule.start_time, false, locale);
159
- let endDateText = "";
160
- if (schedule.repeat_rule.end.type === "never") endDateText = config.unlimited;
161
- else if (schedule.repeat_rule.end.end_date) endDateText = formatDateTime(schedule.repeat_rule.end.end_date, true, locale);
162
- if (schedule.type === "standard") {
163
- if (schedule.repeat_type === "daily") if (isAllDay) {
164
- const frequencyText = getRepeatFrequencyText("daily", frequency, locale);
165
- if (locale === "en") validityText = `${startText}${config.rangeSeparator}${endDateText}, ${config.available} ${frequencyText}`;
166
- else validityText = `${startText}${config.rangeSeparator}${endDateText},${frequencyText}${config.available}`;
167
- } else {
168
- const startTime = formatDateTime(schedule.start_time, false, locale);
169
- const endTime = formatDateTime(schedule.end_time, false, locale);
170
- const timeRange = locale === "en" ? `${startTime.split(" ")[1]} ${startTime.split(" ")[2]}${config.timeSeparator}${endTime.split(" ")[1]} ${endTime.split(" ")[2]}` : `${startTime.split(" ")[1]}${config.timeSeparator}${endTime.split(" ")[1]}`;
171
- const frequencyText = getRepeatFrequencyText("daily", frequency, locale);
172
- const dateRange = locale === "en" ? `${startTime.split(" ")[0]}${config.rangeSeparator}${endDateText}` : `${startText.split(" ")[0]}${config.rangeSeparator}${endDateText}`;
173
- if (locale === "en") validityText = `${dateRange}, ${config.available} ${frequencyText} ${timeRange}`;
174
- else validityText = `${dateRange},${frequencyText} ${timeRange} ${config.available}`;
175
- }
176
- else if (schedule.repeat_type === "weekly") {
177
- const weekdaysText = getWeekdayText(frequency_date, locale);
178
- if (isAllDay) if (locale === "en") {
179
- const frequencyText = frequency === 1 ? "every week" : `every ${frequency} weeks`;
180
- validityText = `${startText}${config.rangeSeparator}${endDateText}, ${frequencyText} on ${weekdaysText} `;
181
- } else {
182
- const frequencyText = frequency === 1 ? "每周" : `每${frequency}周的`;
183
- validityText = `${startText}${config.rangeSeparator}${endDateText},${frequencyText}${config.weekPrefix}${weekdaysText}${config.available}`;
184
- }
185
- else {
186
- const startTime = formatDateTime(schedule.start_time, false, locale);
187
- const endTime = formatDateTime(schedule.end_time, false, locale);
188
- const timeRange = locale === "en" ? `${startTime.split(" ")[1]} ${startTime.split(" ")[2]}${config.timeSeparator}${endTime.split(" ")[1]} ${endTime.split(" ")[2]}` : `${startTime.split(" ")[1]}${config.timeSeparator}${endTime.split(" ")[1]}`;
189
- const dateRange = locale === "en" ? `${startTime.split(" ")[0]}${config.rangeSeparator}${endDateText}` : `${startText.split(" ")[0]}${config.rangeSeparator}${endDateText}`;
190
- if (locale === "en") validityText = `${dateRange}, ${frequency === 1 ? "every week" : `every ${frequency} weeks`} on ${weekdaysText} ${timeRange}`;
191
- else validityText = `${dateRange},${frequency === 1 ? "每周" : `每${frequency}周的`}${config.weekPrefix}${weekdaysText} ${timeRange}`;
155
+ const { frequency, frequency_date, end } = schedule.repeat_rule;
156
+ const dateText = formatRange(schedule.start_time, end.type === "never" ? null : end.end_date);
157
+ if (dateText) {
158
+ let timeText = "";
159
+ if (!isAllDay) {
160
+ if (schedule.type === "time-slots") timeText = (schedule.time_slot || []).map((slot) => `${slot.start_time}${config.timeSeparator}${slot.end_time}`).join(config.timeSlotSeparator);
161
+ else if (schedule.start_time && schedule.end_time) {
162
+ const timeFormat = displayLocale === "en" ? "h:mm A" : "HH:mm";
163
+ timeText = `${(0, dayjs.default)(schedule.start_time).format(timeFormat)}${config.timeSeparator}${(0, dayjs.default)(schedule.end_time).format(timeFormat)}`;
192
164
  }
193
165
  }
194
- } else if (schedule.type === "time-slots" && schedule.time_slot.length > 0) {
195
- const baseDate = formatDateTime(schedule.start_time, true, locale);
196
- const timeSlotsText = schedule.time_slot.map((slot) => `${slot.start_time}${config.timeSeparator}${slot.end_time}`).join(config.timeSlotSeparator);
197
- if (schedule.repeat_type === "daily") {
198
- const frequencyText = getRepeatFrequencyText("daily", frequency, locale);
199
- if (locale === "en") validityText = `${baseDate}${config.rangeSeparator}${endDateText}, ${config.available} ${frequencyText} ${timeSlotsText}`;
200
- else validityText = `${baseDate}${config.rangeSeparator}${endDateText},${frequencyText} ${timeSlotsText} ${config.available}`;
201
- } else if (schedule.repeat_type === "weekly") {
202
- const weekdaysText = getWeekdayText(frequency_date, locale);
203
- if (locale === "en") {
204
- const frequencyText = frequency === 1 ? "every week" : `every ${frequency} weeks`;
205
- validityText = `${baseDate}${config.rangeSeparator}${endDateText}, ${frequencyText} on ${weekdaysText} ${timeSlotsText}`;
206
- } else {
207
- const frequencyText = frequency === 1 ? "每周" : `每${frequency}周的`;
208
- validityText = `${baseDate}${config.rangeSeparator}${endDateText},${frequencyText}${config.weekPrefix}${weekdaysText} ${timeSlotsText} ${config.available}`;
209
- }
166
+ const frequencyText = getRepeatFrequencyText(schedule.repeat_type, frequency, displayLocale);
167
+ if (schedule.repeat_type === "weekly") {
168
+ const weekdays = getWeekdayText(frequency_date, displayLocale);
169
+ const repeatText = displayLocale === "en" ? `${frequencyText} on ${weekdays}` : `${frequencyText}${weekdays}${config.available}`;
170
+ validityTexts.push(`${dateText}${config.timeSlotSeparator}${[repeatText, timeText].filter(Boolean).join(" ")}`);
171
+ } else if (schedule.repeat_type === "daily") {
172
+ const repeatText = displayLocale === "en" ? `${config.available} ${frequencyText}` : `${frequencyText}${config.available}`;
173
+ validityTexts.push(`${dateText}${config.timeSlotSeparator}${[repeatText, timeText].filter(Boolean).join(" ")}`);
210
174
  }
211
175
  }
212
- } else if (schedule.type === "designation" && schedule.designation) {
213
- const designationTexts = schedule.designation.map((item) => {
214
- if (isAllDay || item.start_time === "00:00" && item.end_time === "23:59") {
215
- const startDate = formatDateTime(item.start_date, true, locale);
216
- const endDate = formatDateTime(item.end_date, true, locale);
217
- return `${startDate}${config.rangeSeparator}${endDate}`;
218
- } else return `${formatDateTime(item.start_date, true, locale)} ${item.start_time}${config.timeSeparator}${item.end_time}`;
219
- });
220
- validityTexts.push(...designationTexts);
221
176
  }
222
- if (validityText) validityTexts.push(validityText);
223
- results.push({
177
+ return {
224
178
  validityTexts,
225
179
  excluded_date,
226
180
  included_date
227
- });
181
+ };
228
182
  });
183
+ if (!results.some((item) => item.validityTexts.length || item.included_date.length)) return [{
184
+ validityTexts: [config.noAvailableDates],
185
+ excluded_date: [],
186
+ included_date: []
187
+ }];
229
188
  return results;
230
189
  }
231
190
  //#endregion
@@ -54,7 +54,7 @@ const PassDetail = (props) => {
54
54
  var _context$appHelper4;
55
55
  require_index$1.request.setRequest((_context$appHelper4 = context.appHelper) === null || _context$appHelper4 === void 0 || (_context$appHelper4 = _context$appHelper4.utils) === null || _context$appHelper4 === void 0 ? void 0 : _context$appHelper4.request);
56
56
  }
57
- const { id = "", code = "", tag = "", product_title = "", product_name = "", encoded = "", balance, expire_date = "", product = {}, custom_schedule_snapshot, customer_id, limit_status } = dataSource || {};
57
+ const { id = "", code = "", tag = "", product_title = "", product_name = "", encoded = "", balance, start_date, expire_date = "", expire_time, product = {}, custom_schedule_snapshot, customer_id, limit_status } = dataSource || {};
58
58
  const mobileWalletPassType = require_capability.normalizeMobileWalletPassType(tag);
59
59
  const { description = "", extension_data = [], customer_order_behavior_count = 0 } = product || {};
60
60
  const _getDetail = (0, ahooks.useRequest)(() => require_serve.getDetailApi({
@@ -112,8 +112,16 @@ const PassDetail = (props) => {
112
112
  }, []);
113
113
  const descs = (0, react.useMemo)(() => {
114
114
  var _context$engine2;
115
- const detail = require_utils$4.formatScheduleText(scheduleList, context === null || context === void 0 || (_context$engine2 = context.engine) === null || _context$engine2 === void 0 || (_context$engine2 = _context$engine2.props) === null || _context$engine2 === void 0 ? void 0 : _context$engine2.locale);
116
- let expireText = expire_date ? expire_date : _pisell_utils.locales.getText("wallet-pass-gallery.expireDate");
115
+ const detail = require_utils$4.formatScheduleText(scheduleList, context === null || context === void 0 || (_context$engine2 = context.engine) === null || _context$engine2 === void 0 || (_context$engine2 = _context$engine2.props) === null || _context$engine2 === void 0 ? void 0 : _context$engine2.locale, {
116
+ start_date,
117
+ expire_date,
118
+ expire_time
119
+ });
120
+ const { endDate } = (0, _pisell_utils.getWalletValidityRange)(null, null, {
121
+ expire_date,
122
+ expire_time
123
+ });
124
+ let expireText = endDate ? (0, dayjs.default)(endDate).format(locale === "en" ? "DD/MM/YYYY" : "YYYY-MM-DD") : _pisell_utils.locales.getText("wallet-pass-gallery.expireDate");
117
125
  if (scheduleList.length > 0) {
118
126
  let validityTexts = "";
119
127
  let excludedText = "";
@@ -19,7 +19,6 @@ const _excluded = [
19
19
  "balance",
20
20
  "code",
21
21
  "encoded",
22
- "expire_date",
23
22
  "shop",
24
23
  "limit_status",
25
24
  "product_cover",
@@ -55,7 +54,8 @@ const PassList = (props) => {
55
54
  loadMore: _loadMore,
56
55
  loading,
57
56
  renderItem: (item, index) => {
58
- const { id, tag, product_title = "", product_name = "", balance = 0, code = "", encoded = "", expire_date = "", shop = { name: "" }, limit_status, product_cover = "", par_value = "", unified_available_status, unified_messages = {}, holder, currency_display, virtual_currency_display } = item, rest = require_objectWithoutProperties._objectWithoutProperties(item, _excluded);
57
+ var _item$custom_schedule, _item$custom_schedule2;
58
+ const { id, tag, product_title = "", product_name = "", balance = 0, code = "", encoded = "", shop = { name: "" }, limit_status, product_cover = "", par_value = "", unified_available_status, unified_messages = {}, holder, currency_display, virtual_currency_display } = item, rest = require_objectWithoutProperties._objectWithoutProperties(item, _excluded);
59
59
  const itemValue = item === null || item === void 0 ? void 0 : item[valuePropName];
60
60
  const { title: disabledReason = "" } = unified_messages;
61
61
  const { name: storeName = "" } = shop;
@@ -113,7 +113,10 @@ const PassList = (props) => {
113
113
  discount: isDiscountCard ? Number(par_value) : void 0,
114
114
  showDiscount: isDiscountCard,
115
115
  code: encoded,
116
- validDate: expire_date,
116
+ validDate: (0, _pisell_utils.getWalletValidityRange)(null, null, item).endDate || "",
117
+ validDateBySchedule: Boolean((_item$custom_schedule = item.custom_schedule_snapshot) === null || _item$custom_schedule === void 0 || (_item$custom_schedule = _item$custom_schedule.data) === null || _item$custom_schedule === void 0 ? void 0 : _item$custom_schedule.length),
118
+ scheduleList: ((_item$custom_schedule2 = item.custom_schedule_snapshot) === null || _item$custom_schedule2 === void 0 ? void 0 : _item$custom_schedule2.data) || [],
119
+ walletValidity: item,
117
120
  holder,
118
121
  onSetHolder: isTerminalEnv ? void 0 : () => {
119
122
  var _holder$metadata;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pisell/private-materials",
3
- "version": "6.12.238",
3
+ "version": "6.12.240",
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/pi-payment-sdk": "0.0.3",
72
+ "@pisell/utils": "3.0.6",
73
73
  "@pisell/icon": "0.0.11",
74
- "@pisell/date-picker": "3.0.10",
75
- "@pisell/utils": "3.0.4",
76
- "@pisell/materials": "6.12.65"
74
+ "@pisell/materials": "6.12.67",
75
+ "@pisell/pi-payment-sdk": "0.0.3",
76
+ "@pisell/date-picker": "3.0.12"
77
77
  },
78
78
  "peerDependencies": {
79
79
  "react": "^18.0.0",