kupos-ui-components-lib 10.4.72 → 10.4.73

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.
@@ -107,6 +107,18 @@ function addOperatorLogo(card, service) {
107
107
  { url, name: service.operator_name || ((_f = service.operator_details) === null || _f === void 0 ? void 0 : _f[2]) },
108
108
  ];
109
109
  }
110
+ // savings_percent may be missing or sent as a string; fall back to the deal's prices so
111
+ // Remate still sorts by its real discount instead of dropping to 0%
112
+ function getWowDealPercent(wowDealData) {
113
+ const savings = Number(wowDealData.savings_percent);
114
+ if (savings > 0)
115
+ return savings;
116
+ const original = Number(wowDealData.original_price);
117
+ const final = Number(wowDealData.final_price);
118
+ return original > 0 && final >= 0 && final < original
119
+ ? ((original - final) / original) * 100
120
+ : 0;
121
+ }
110
122
  function toDiscountLabel(discount, currencySign) {
111
123
  if (discount.type === "fixed") {
112
124
  return `${CommonService.currencyRounded(discount.amount, currencySign)} de dcto`;
@@ -118,13 +130,14 @@ export function deriveDiscountCards(services = [], wowDealData, currencySign = "
118
130
  var _a, _b, _c, _d, _e;
119
131
  const cards = new Map();
120
132
  const wowServices = wowDealData === null || wowDealData === void 0 ? void 0 : wowDealData.services;
133
+ const wowDealPercent = wowDealData ? getWowDealPercent(wowDealData) : 0;
121
134
  const hasWowDeal = !!wowDealData &&
122
135
  ((Array.isArray(wowServices) && wowServices.length > 0) ||
123
- !!wowDealData.savings_percent);
136
+ wowDealPercent > 0);
124
137
  if (hasWowDeal) {
125
138
  const remateDiscount = {
126
139
  type: "percentage",
127
- amount: Math.round(wowDealData.savings_percent || 0),
140
+ amount: Math.round(wowDealPercent),
128
141
  };
129
142
  cards.set(REMATE_KEY, {
130
143
  key: REMATE_KEY,
@@ -217,8 +230,9 @@ export function deriveDiscountCards(services = [], wowDealData, currencySign = "
217
230
  return a.name.localeCompare(b.name, "es", { sensitivity: "base" });
218
231
  });
219
232
  }
220
- // Highest discount first. Percentages and fixed amounts can't be compared, so percentages
221
- // lead. The sort is stable, so on a tie Remate stays ahead and the rest keep service order.
233
+ // Highest discount first, Remate included — it takes its place by its percent rather than
234
+ // always leading. Percentages and fixed amounts can't be compared, so percentages lead.
235
+ // The sort is stable, so on a tie Remate stays ahead and the rest keep service order.
222
236
  return Array.from(cards.values()).sort((a, b) => {
223
237
  if (a.discountType !== b.discountType) {
224
238
  return a.discountType === "percentage" ? -1 : 1;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kupos-ui-components-lib",
3
- "version": "10.4.72",
3
+ "version": "10.4.73",
4
4
  "description": "A reusable UI components package",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -148,6 +148,18 @@ function addOperatorLogo(
148
148
  ];
149
149
  }
150
150
 
151
+ // savings_percent may be missing or sent as a string; fall back to the deal's prices so
152
+ // Remate still sorts by its real discount instead of dropping to 0%
153
+ function getWowDealPercent(wowDealData: WowDealData): number {
154
+ const savings = Number(wowDealData.savings_percent);
155
+ if (savings > 0) return savings;
156
+ const original = Number(wowDealData.original_price);
157
+ const final = Number(wowDealData.final_price);
158
+ return original > 0 && final >= 0 && final < original
159
+ ? ((original - final) / original) * 100
160
+ : 0;
161
+ }
162
+
151
163
  function toDiscountLabel(
152
164
  discount: ServiceDiscount,
153
165
  currencySign: string,
@@ -167,15 +179,16 @@ export function deriveDiscountCards(
167
179
  const cards = new Map<string, DiscountBannerCard>();
168
180
 
169
181
  const wowServices = wowDealData?.services;
182
+ const wowDealPercent = wowDealData ? getWowDealPercent(wowDealData) : 0;
170
183
  const hasWowDeal =
171
184
  !!wowDealData &&
172
185
  ((Array.isArray(wowServices) && wowServices.length > 0) ||
173
- !!wowDealData.savings_percent);
186
+ wowDealPercent > 0);
174
187
 
175
188
  if (hasWowDeal) {
176
189
  const remateDiscount: ServiceDiscount = {
177
190
  type: "percentage",
178
- amount: Math.round(wowDealData!.savings_percent || 0),
191
+ amount: Math.round(wowDealPercent),
179
192
  };
180
193
  cards.set(REMATE_KEY, {
181
194
  key: REMATE_KEY,
@@ -276,8 +289,9 @@ export function deriveDiscountCards(
276
289
  });
277
290
  }
278
291
 
279
- // Highest discount first. Percentages and fixed amounts can't be compared, so percentages
280
- // lead. The sort is stable, so on a tie Remate stays ahead and the rest keep service order.
292
+ // Highest discount first, Remate included — it takes its place by its percent rather than
293
+ // always leading. Percentages and fixed amounts can't be compared, so percentages lead.
294
+ // The sort is stable, so on a tie Remate stays ahead and the rest keep service order.
281
295
  return Array.from(cards.values()).sort((a, b) => {
282
296
  if (a.discountType !== b.discountType) {
283
297
  return a.discountType === "percentage" ? -1 : 1;