@escapenavigator/utils 1.10.152 → 1.10.154
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.
|
@@ -62,10 +62,14 @@ export type PromocodeError = {
|
|
|
62
62
|
payload: ErrorPayloadMap[K];
|
|
63
63
|
};
|
|
64
64
|
}[PromocodeErrorCode];
|
|
65
|
+
/** Единый namespace для текстов ошибок промокода (widget, app, orders). */
|
|
66
|
+
export declare const PROMOCODE_ERROR_I18N_NS = "common";
|
|
67
|
+
export declare const getPromocodeErrorI18nKey: (code: PromocodeErrorCode | string) => string;
|
|
68
|
+
export declare function translatePromocodeError(t: (key: string, options?: Record<string, unknown>) => string, error: PromocodeError): string;
|
|
65
69
|
/**
|
|
66
70
|
* Английский fallback для отображения кода ошибки промокода вне i18n-контекста.
|
|
67
|
-
* Для пользовательского UI нужно
|
|
68
|
-
* `errors.promocode.<CODE>` с подстановкой `payload`. Эта функция — последний
|
|
71
|
+
* Для пользовательского UI нужно `translatePromocodeError(t, error)` или ключ
|
|
72
|
+
* `common:errors.promocode.<CODE>` с подстановкой `payload`. Эта функция — последний
|
|
69
73
|
* рубеж, чтобы при ошибке всегда было что показать.
|
|
70
74
|
*/
|
|
71
75
|
export declare function formatPromocodeErrorFallback(error: PromocodeError): string;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PromocodeErrorCode = void 0;
|
|
3
|
+
exports.getPromocodeErrorI18nKey = exports.PROMOCODE_ERROR_I18N_NS = exports.PromocodeErrorCode = void 0;
|
|
4
|
+
exports.translatePromocodeError = translatePromocodeError;
|
|
4
5
|
exports.formatPromocodeErrorFallback = formatPromocodeErrorFallback;
|
|
5
6
|
var PromocodeErrorCode;
|
|
6
7
|
(function (PromocodeErrorCode) {
|
|
@@ -23,6 +24,15 @@ var PromocodeErrorCode;
|
|
|
23
24
|
PromocodeErrorCode["MIN_PLAYERS"] = "MIN_PLAYERS";
|
|
24
25
|
PromocodeErrorCode["MAX_PLAYERS"] = "MAX_PLAYERS";
|
|
25
26
|
})(PromocodeErrorCode || (exports.PromocodeErrorCode = PromocodeErrorCode = {}));
|
|
27
|
+
/** Единый namespace для текстов ошибок промокода (widget, app, orders). */
|
|
28
|
+
exports.PROMOCODE_ERROR_I18N_NS = 'common';
|
|
29
|
+
const getPromocodeErrorI18nKey = (code) => `${exports.PROMOCODE_ERROR_I18N_NS}:errors.promocode.${code}`;
|
|
30
|
+
exports.getPromocodeErrorI18nKey = getPromocodeErrorI18nKey;
|
|
31
|
+
function translatePromocodeError(t, error) {
|
|
32
|
+
return t((0, exports.getPromocodeErrorI18nKey)(error.code), {
|
|
33
|
+
...('payload' in error ? error.payload : {}),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
26
36
|
const FALLBACK_TEXT = {
|
|
27
37
|
[PromocodeErrorCode.NOT_AVAILABLE_FOR_CERTIFICATES]: "The promocode can't be applied for certificates.",
|
|
28
38
|
[PromocodeErrorCode.NOT_AVAILABLE_FOR_BOOKINGS]: "The promocode can't be applied for bookings.",
|
|
@@ -45,8 +55,8 @@ const FALLBACK_TEXT = {
|
|
|
45
55
|
};
|
|
46
56
|
/**
|
|
47
57
|
* Английский fallback для отображения кода ошибки промокода вне i18n-контекста.
|
|
48
|
-
* Для пользовательского UI нужно
|
|
49
|
-
* `errors.promocode.<CODE>` с подстановкой `payload`. Эта функция — последний
|
|
58
|
+
* Для пользовательского UI нужно `translatePromocodeError(t, error)` или ключ
|
|
59
|
+
* `common:errors.promocode.<CODE>` с подстановкой `payload`. Эта функция — последний
|
|
50
60
|
* рубеж, чтобы при ошибке всегда было что показать.
|
|
51
61
|
*/
|
|
52
62
|
function formatPromocodeErrorFallback(error) {
|
|
@@ -3,6 +3,11 @@ type SlotPriceSource = {
|
|
|
3
3
|
basePrice?: number;
|
|
4
4
|
discount?: number;
|
|
5
5
|
};
|
|
6
|
+
/**
|
|
7
|
+
* Плоская карта цен из тарифа слота.
|
|
8
|
+
* Принимает и `{ id, price: { "2": 1500 } }` (листинг), и `{ "2": 1500 }` (/slots/details).
|
|
9
|
+
*/
|
|
10
|
+
export declare const getTariffPriceMap: (tariff: unknown) => Record<string, number>;
|
|
6
11
|
/** Минимальная положительная цена из тарифа (без скидки слота). */
|
|
7
12
|
export declare const getTariffBasePrice: (tariff: unknown) => number | null;
|
|
8
13
|
/** Цена «от» для слота в расписании (с учётом скидки слота). */
|
|
@@ -1,20 +1,29 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getSlotRepresentativePrice = exports.getTariffBasePrice = void 0;
|
|
3
|
+
exports.getSlotRepresentativePrice = exports.getTariffBasePrice = exports.getTariffPriceMap = void 0;
|
|
4
4
|
const applySlotDiscount = (base, discount) => {
|
|
5
5
|
const value = discount || 0;
|
|
6
6
|
if (!value)
|
|
7
7
|
return base;
|
|
8
8
|
return base - Math.floor((base / 10000) * value);
|
|
9
9
|
};
|
|
10
|
-
/**
|
|
11
|
-
|
|
10
|
+
/**
|
|
11
|
+
* Плоская карта цен из тарифа слота.
|
|
12
|
+
* Принимает и `{ id, price: { "2": 1500 } }` (листинг), и `{ "2": 1500 }` (/slots/details).
|
|
13
|
+
*/
|
|
14
|
+
const getTariffPriceMap = (tariff) => {
|
|
12
15
|
if (!tariff || typeof tariff !== 'object')
|
|
13
|
-
return
|
|
16
|
+
return {};
|
|
14
17
|
const raw = tariff;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
+
if (raw.price && typeof raw.price === 'object' && raw.price !== null) {
|
|
19
|
+
return raw.price;
|
|
20
|
+
}
|
|
21
|
+
return raw;
|
|
22
|
+
};
|
|
23
|
+
exports.getTariffPriceMap = getTariffPriceMap;
|
|
24
|
+
/** Минимальная положительная цена из тарифа (без скидки слота). */
|
|
25
|
+
const getTariffBasePrice = (tariff) => {
|
|
26
|
+
const priceMap = (0, exports.getTariffPriceMap)(tariff);
|
|
18
27
|
const keys = Object.keys(priceMap)
|
|
19
28
|
.filter((k) => k !== 'child' && !Number.isNaN(Number(k)))
|
|
20
29
|
.map(Number)
|
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const slot_representative_price_1 = require("./slot-representative-price");
|
|
4
4
|
describe('slot-representative-price', () => {
|
|
5
|
+
it('unwraps nested tariff.price map', () => {
|
|
6
|
+
expect((0, slot_representative_price_1.getTariffPriceMap)({
|
|
7
|
+
id: 1,
|
|
8
|
+
price: { 2: 10000, 3: 8000 },
|
|
9
|
+
})).toEqual({ 2: 10000, 3: 8000 });
|
|
10
|
+
});
|
|
11
|
+
it('returns plain price map as-is', () => {
|
|
12
|
+
expect((0, slot_representative_price_1.getTariffPriceMap)({ 2: 5000, 4: 4000 })).toEqual({ 2: 5000, 4: 4000 });
|
|
13
|
+
});
|
|
5
14
|
it('reads price from tariff.price map', () => {
|
|
6
15
|
expect((0, slot_representative_price_1.getTariffBasePrice)({
|
|
7
16
|
id: 1,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@escapenavigator/utils",
|
|
3
|
-
"version": "1.10.
|
|
3
|
+
"version": "1.10.154",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"test": "jest"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@escapenavigator/types": "^1.10.
|
|
17
|
+
"@escapenavigator/types": "^1.10.148",
|
|
18
18
|
"axios": "^0.21.4",
|
|
19
19
|
"class-transformer": "^0.5.1",
|
|
20
20
|
"class-validator": "^0.13.2",
|
|
@@ -28,5 +28,5 @@
|
|
|
28
28
|
"ts-jest": "^29.1.1",
|
|
29
29
|
"typescript": "^5.6"
|
|
30
30
|
},
|
|
31
|
-
"gitHead": "
|
|
31
|
+
"gitHead": "8ac9c90c5d3971794408544fc837167b6495d246"
|
|
32
32
|
}
|