@escapenavigator/utils 2.0.45 → 2.0.46
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.
- package/dist/booking-page-url/index.d.ts +11 -0
- package/dist/booking-page-url/index.js +14 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/resolve-email-sender.d.ts +7 -0
- package/dist/resolve-email-sender.js +15 -0
- package/dist/resolve-email-sender.spec.d.ts +1 -0
- package/dist/resolve-email-sender.spec.js +30 -0
- package/dist/resolve-localized-string.d.ts +8 -0
- package/dist/resolve-localized-string.js +20 -0
- package/dist/role-lead-permissions.d.ts +7 -0
- package/dist/role-lead-permissions.js +9 -0
- package/package.json +3 -3
|
@@ -50,6 +50,17 @@ export declare function appendBookingParamsToUrl(baseUrl: string, options?: {
|
|
|
50
50
|
* `{ordersDomain}/booking/{widgetUuid}` + testMode/lang/tracking/consent.
|
|
51
51
|
*/
|
|
52
52
|
export declare function buildBookingPageUrl(options: BuildBookingPageUrlOptions): string;
|
|
53
|
+
/**
|
|
54
|
+
* Standalone-страница формы заявки: `{ordersDomain}/lead/{formUuid}`.
|
|
55
|
+
* Живёт на том же домене, что и booking-страница, — так QR-код с флаера
|
|
56
|
+
* и ссылка в соцсетях работают без установки виджета на сайт.
|
|
57
|
+
*/
|
|
58
|
+
export declare function buildLeadFormPageUrl(options: {
|
|
59
|
+
ordersDomain: string;
|
|
60
|
+
formUuid: string;
|
|
61
|
+
lang?: string;
|
|
62
|
+
tracking?: BookingTrackingParams;
|
|
63
|
+
}): string;
|
|
53
64
|
/**
|
|
54
65
|
* HTML onclick для кнопки «Записаться»: открывает booking-страницу через
|
|
55
66
|
* `EscapeNavigator.openBookingPage` (декорирует UTM + GA linker).
|
|
@@ -11,6 +11,7 @@ exports.BOOKING_TRACKING_QUERY_PARAMS = void 0;
|
|
|
11
11
|
exports.collectTrackingParamsFromSearch = collectTrackingParamsFromSearch;
|
|
12
12
|
exports.appendBookingParamsToUrl = appendBookingParamsToUrl;
|
|
13
13
|
exports.buildBookingPageUrl = buildBookingPageUrl;
|
|
14
|
+
exports.buildLeadFormPageUrl = buildLeadFormPageUrl;
|
|
14
15
|
exports.buildBookingButtonOnclick = buildBookingButtonOnclick;
|
|
15
16
|
exports.buildAnalyticsBridgeScriptTag = buildAnalyticsBridgeScriptTag;
|
|
16
17
|
exports.BOOKING_TRACKING_QUERY_PARAMS = [
|
|
@@ -84,6 +85,19 @@ function buildBookingPageUrl(options) {
|
|
|
84
85
|
}
|
|
85
86
|
return appendBookingParamsToUrl(url.toString(), { tracking, consent });
|
|
86
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* Standalone-страница формы заявки: `{ordersDomain}/lead/{formUuid}`.
|
|
90
|
+
* Живёт на том же домене, что и booking-страница, — так QR-код с флаера
|
|
91
|
+
* и ссылка в соцсетях работают без установки виджета на сайт.
|
|
92
|
+
*/
|
|
93
|
+
function buildLeadFormPageUrl(options) {
|
|
94
|
+
const base = `${normalizeOrdersDomain(options.ordersDomain)}/lead/${encodeURIComponent(options.formUuid)}`;
|
|
95
|
+
const url = new URL(base);
|
|
96
|
+
if (options.lang) {
|
|
97
|
+
url.searchParams.set('lang', options.lang);
|
|
98
|
+
}
|
|
99
|
+
return appendBookingParamsToUrl(url.toString(), { tracking: options.tracking });
|
|
100
|
+
}
|
|
87
101
|
/**
|
|
88
102
|
* HTML onclick для кнопки «Записаться»: открывает booking-страницу через
|
|
89
103
|
* `EscapeNavigator.openBookingPage` (декорирует UTM + GA linker).
|
package/dist/index.d.ts
CHANGED
|
@@ -29,10 +29,13 @@ export * from './promocode-error-codes';
|
|
|
29
29
|
export * from './promocode-nominal-rules';
|
|
30
30
|
export * from './redirect';
|
|
31
31
|
export * from './resolve-calendar-location-id';
|
|
32
|
+
export * from './resolve-email-sender';
|
|
33
|
+
export * from './resolve-localized-string';
|
|
32
34
|
export * from './role-bonus-permissions';
|
|
33
35
|
export * from './role-chat-permissions';
|
|
34
36
|
export * from './role-comment-permissions';
|
|
35
37
|
export * from './role-export-permissions';
|
|
38
|
+
export * from './role-lead-permissions';
|
|
36
39
|
export * from './role-refund-permissions';
|
|
37
40
|
export * from './serialize-record';
|
|
38
41
|
export * from './serialize-slot';
|
package/dist/index.js
CHANGED
|
@@ -45,10 +45,13 @@ __exportStar(require("./promocode-error-codes"), exports);
|
|
|
45
45
|
__exportStar(require("./promocode-nominal-rules"), exports);
|
|
46
46
|
__exportStar(require("./redirect"), exports);
|
|
47
47
|
__exportStar(require("./resolve-calendar-location-id"), exports);
|
|
48
|
+
__exportStar(require("./resolve-email-sender"), exports);
|
|
49
|
+
__exportStar(require("./resolve-localized-string"), exports);
|
|
48
50
|
__exportStar(require("./role-bonus-permissions"), exports);
|
|
49
51
|
__exportStar(require("./role-chat-permissions"), exports);
|
|
50
52
|
__exportStar(require("./role-comment-permissions"), exports);
|
|
51
53
|
__exportStar(require("./role-export-permissions"), exports);
|
|
54
|
+
__exportStar(require("./role-lead-permissions"), exports);
|
|
52
55
|
__exportStar(require("./role-refund-permissions"), exports);
|
|
53
56
|
__exportStar(require("./serialize-record"), exports);
|
|
54
57
|
__exportStar(require("./serialize-slot"), exports);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Платформенный from/to для текущего деплоя: на RU-окружении
|
|
3
|
+
* `info@escapenavigator.com` → `info@escapenavigator.ru`, иначе без изменений.
|
|
4
|
+
*/
|
|
5
|
+
export declare const resolveEmailSender: (sender: string) => string;
|
|
6
|
+
export declare const getEmailSenderFilters: () => string[];
|
|
7
|
+
export declare const getPlatformDefaultFrom: () => string;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getPlatformDefaultFrom = exports.getEmailSenderFilters = exports.resolveEmailSender = void 0;
|
|
4
|
+
const email_senders_1 = require("@escapenavigator/types/dist/emails/enum/email.senders");
|
|
5
|
+
const is_ru_1 = require("./is-ru");
|
|
6
|
+
/**
|
|
7
|
+
* Платформенный from/to для текущего деплоя: на RU-окружении
|
|
8
|
+
* `info@escapenavigator.com` → `info@escapenavigator.ru`, иначе без изменений.
|
|
9
|
+
*/
|
|
10
|
+
const resolveEmailSender = (sender) => (0, is_ru_1.isRu)() ? (0, email_senders_1.toRuEmailSender)(sender) : sender;
|
|
11
|
+
exports.resolveEmailSender = resolveEmailSender;
|
|
12
|
+
const getEmailSenderFilters = () => Object.values(email_senders_1.EmailSenderEnum).map(exports.resolveEmailSender);
|
|
13
|
+
exports.getEmailSenderFilters = getEmailSenderFilters;
|
|
14
|
+
const getPlatformDefaultFrom = () => `Escape Navigator <${(0, exports.resolveEmailSender)(email_senders_1.EmailSenderEnum.INFO)}>`;
|
|
15
|
+
exports.getPlatformDefaultFrom = getPlatformDefaultFrom;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const email_senders_1 = require("@escapenavigator/types/dist/emails/enum/email.senders");
|
|
4
|
+
const resolve_email_sender_1 = require("./resolve-email-sender");
|
|
5
|
+
describe('resolveEmailSender', () => {
|
|
6
|
+
const prevRegion = process.env.REACT_APP_REGION;
|
|
7
|
+
afterEach(() => {
|
|
8
|
+
process.env.REACT_APP_REGION = prevRegion;
|
|
9
|
+
});
|
|
10
|
+
it('keeps .com addresses on the international deploy', () => {
|
|
11
|
+
process.env.REACT_APP_REGION = 'com';
|
|
12
|
+
expect((0, resolve_email_sender_1.resolveEmailSender)(email_senders_1.EmailSenderEnum.INFO)).toBe('info@escapenavigator.com');
|
|
13
|
+
expect((0, resolve_email_sender_1.getEmailSenderFilters)()).toEqual(Object.values(email_senders_1.EmailSenderEnum));
|
|
14
|
+
expect((0, resolve_email_sender_1.getPlatformDefaultFrom)()).toBe('Escape Navigator <info@escapenavigator.com>');
|
|
15
|
+
});
|
|
16
|
+
it('rewrites platform senders to .ru on the RU deploy', () => {
|
|
17
|
+
process.env.REACT_APP_REGION = 'ru';
|
|
18
|
+
expect((0, resolve_email_sender_1.resolveEmailSender)(email_senders_1.EmailSenderEnum.INFO)).toBe('info@escapenavigator.ru');
|
|
19
|
+
expect((0, resolve_email_sender_1.resolveEmailSender)(email_senders_1.EmailSenderEnum.SALES)).toBe('sales@escapenavigator.ru');
|
|
20
|
+
expect((0, resolve_email_sender_1.resolveEmailSender)(email_senders_1.EmailSenderEnum.SUPPORT)).toBe('support@escapenavigator.ru');
|
|
21
|
+
expect((0, resolve_email_sender_1.getEmailSenderFilters)()).toEqual([
|
|
22
|
+
'info@escapenavigator.ru',
|
|
23
|
+
'sales@escapenavigator.ru',
|
|
24
|
+
'ribitsky.a@escapenavigator.ru',
|
|
25
|
+
'firas@escapenavigator.ru',
|
|
26
|
+
'support@escapenavigator.ru',
|
|
27
|
+
]);
|
|
28
|
+
expect((0, resolve_email_sender_1.getPlatformDefaultFrom)()).toBe('Escape Navigator <info@escapenavigator.ru>');
|
|
29
|
+
});
|
|
30
|
+
});
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Languages } from '@escapenavigator/types/dist/shared/enum/languages.enum';
|
|
2
|
+
import { LocalizedString } from '@escapenavigator/types/dist/shared/localized-string.type';
|
|
3
|
+
/**
|
|
4
|
+
* Достаёт текст на нужном языке: сначала запрошенный, потом английский, потом
|
|
5
|
+
* любой заполненный. Пустые строки считаем отсутствующим переводом, иначе
|
|
6
|
+
* недозаполненная локаль показывалась бы пустым названием.
|
|
7
|
+
*/
|
|
8
|
+
export declare const resolveLocalizedString: (value: LocalizedString | null | undefined, language: Languages | string | undefined, fallback?: string) => string;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveLocalizedString = void 0;
|
|
4
|
+
const languages_enum_1 = require("@escapenavigator/types/dist/shared/enum/languages.enum");
|
|
5
|
+
/**
|
|
6
|
+
* Достаёт текст на нужном языке: сначала запрошенный, потом английский, потом
|
|
7
|
+
* любой заполненный. Пустые строки считаем отсутствующим переводом, иначе
|
|
8
|
+
* недозаполненная локаль показывалась бы пустым названием.
|
|
9
|
+
*/
|
|
10
|
+
const resolveLocalizedString = (value, language, fallback = '') => {
|
|
11
|
+
if (!value)
|
|
12
|
+
return fallback;
|
|
13
|
+
const candidates = [
|
|
14
|
+
language ? value[language] : undefined,
|
|
15
|
+
value[languages_enum_1.Languages.EN],
|
|
16
|
+
...Object.values(value),
|
|
17
|
+
];
|
|
18
|
+
return candidates.find((item) => typeof item === 'string' && item.trim()) ?? fallback;
|
|
19
|
+
};
|
|
20
|
+
exports.resolveLocalizedString = resolveLocalizedString;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { RoleRO } from '@escapenavigator/types/dist/role/role.ro';
|
|
2
|
+
export type RoleLeadPermissions = Pick<RoleRO, 'totalAccess' | 'accessToLeadsSection'>;
|
|
3
|
+
/**
|
|
4
|
+
* Доступ к разделу «Заявки». Владелец (`totalAccess`) — как будто флаг
|
|
5
|
+
* включён. Раздел новый, поэтому у старых ролей флага нет и доступа тоже.
|
|
6
|
+
*/
|
|
7
|
+
export declare const canAccessLeads: (role?: RoleLeadPermissions | null) => boolean;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.canAccessLeads = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Доступ к разделу «Заявки». Владелец (`totalAccess`) — как будто флаг
|
|
6
|
+
* включён. Раздел новый, поэтому у старых ролей флага нет и доступа тоже.
|
|
7
|
+
*/
|
|
8
|
+
const canAccessLeads = (role) => !!role?.totalAccess || !!role?.accessToLeadsSection;
|
|
9
|
+
exports.canAccessLeads = canAccessLeads;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@escapenavigator/utils",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.46",
|
|
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": "^2.0.
|
|
17
|
+
"@escapenavigator/types": "^2.0.44",
|
|
18
18
|
"axios": "^0.21.4",
|
|
19
19
|
"class-transformer": "^0.5.1",
|
|
20
20
|
"class-validator": "^0.13.2",
|
|
@@ -29,5 +29,5 @@
|
|
|
29
29
|
"ts-jest": "^29.1.1",
|
|
30
30
|
"typescript": "^5.6"
|
|
31
31
|
},
|
|
32
|
-
"gitHead": "
|
|
32
|
+
"gitHead": "1a84aa81dd428759ad51821e8095fd0b80b7cc62"
|
|
33
33
|
}
|