@steroidsjs/core 3.0.0-beta.51 → 3.0.0-beta.53
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/components/ResourceComponent.d.ts +88 -6
- package/components/ResourceComponent.js +11 -11
- package/hooks/index.d.ts +2 -1
- package/hooks/index.js +3 -1
- package/hooks/useTheme.d.ts +8 -0
- package/hooks/useTheme.js +40 -0
- package/package.json +1 -1
- package/providers/ComponentsProvider.d.ts +2 -1
- package/ui/content/Card/Card.d.ts +17 -4
- package/ui/form/InputField/InputField.d.ts +1 -1
- package/ui/form/InputField/InputField.js +13 -1
- package/ui/form/ReCaptchaField/ReCaptchaField.d.ts +66 -0
- package/ui/form/ReCaptchaField/ReCaptchaField.js +22 -1
- package/ui/layout/Tooltip/Tooltip.js +3 -0
- package/ui/layout/Tooltip/calculate.js +3 -0
|
@@ -6,21 +6,103 @@ declare global {
|
|
|
6
6
|
};
|
|
7
7
|
}
|
|
8
8
|
}
|
|
9
|
+
export interface IResourceComponent {
|
|
10
|
+
/**
|
|
11
|
+
* Свойство для хранения обратных вызовов.
|
|
12
|
+
*/
|
|
13
|
+
_callbacks: any;
|
|
14
|
+
/**
|
|
15
|
+
* Свойство для хранения компонентов.
|
|
16
|
+
*/
|
|
17
|
+
_components: any;
|
|
18
|
+
/**
|
|
19
|
+
* API-ключ Google для использования Google Maps и других сервисов.
|
|
20
|
+
*/
|
|
21
|
+
googleApiKey: string;
|
|
22
|
+
/**
|
|
23
|
+
* Ключ сайта Google reCAPTCHA.
|
|
24
|
+
*/
|
|
25
|
+
googleCaptchaSiteKey: string;
|
|
26
|
+
/**
|
|
27
|
+
* Языковой код, используемый для загрузки ресурсов.
|
|
28
|
+
*/
|
|
29
|
+
language: string;
|
|
30
|
+
/**
|
|
31
|
+
* URL для загрузки Google Maps API.
|
|
32
|
+
*/
|
|
33
|
+
readonly RESOURCE_GOOGLE_MAP_API: string;
|
|
34
|
+
/**
|
|
35
|
+
* URL для загрузки Yandex Maps API.
|
|
36
|
+
*/
|
|
37
|
+
readonly RESOURCE_YANDEX_MAP_API: string;
|
|
38
|
+
/**
|
|
39
|
+
* URL для загрузки Twitter виджетов.
|
|
40
|
+
*/
|
|
41
|
+
readonly RESOURCE_TWITTER_WIDGET: string;
|
|
42
|
+
/**
|
|
43
|
+
* URL для загрузки Geetest.
|
|
44
|
+
*/
|
|
45
|
+
readonly RESOURCE_GEETEST_API: string;
|
|
46
|
+
/**
|
|
47
|
+
* URL для загрузки Google reCAPTCHA.
|
|
48
|
+
*/
|
|
49
|
+
readonly RESOURCE_GOOGLE_CAPTCHA: string;
|
|
50
|
+
/**
|
|
51
|
+
* Метод для загрузки Google reCAPTCHA.
|
|
52
|
+
* @returns Промис, который разрешается с объектом window.grecaptcha.
|
|
53
|
+
*/
|
|
54
|
+
loadGoogleCaptcha(): Promise<any>;
|
|
55
|
+
/**
|
|
56
|
+
* Метод для загрузки Google Maps API.
|
|
57
|
+
* @returns Промис, который разрешается с объектом window.google.maps.
|
|
58
|
+
*/
|
|
59
|
+
loadGoogleMapApi(): Promise<any>;
|
|
60
|
+
/**
|
|
61
|
+
* Метод для загрузки Yandex Maps API.
|
|
62
|
+
* @returns Промис, который разрешается с объектом window.ymaps.
|
|
63
|
+
*/
|
|
64
|
+
loadYandexMap(): Promise<any>;
|
|
65
|
+
/**
|
|
66
|
+
* Метод для загрузки Twitter виджетов.
|
|
67
|
+
* @returns Промис, который разрешается с объектом window.twttr.
|
|
68
|
+
*/
|
|
69
|
+
loadTwitterWidget(): Promise<any>;
|
|
70
|
+
/**
|
|
71
|
+
* Метод для загрузки Geetest.
|
|
72
|
+
* @returns Промис, который разрешается с объектом window.initGeetest.
|
|
73
|
+
*/
|
|
74
|
+
loadGeetest(): Promise<any>;
|
|
75
|
+
/**
|
|
76
|
+
* Метод для загрузки скрипта по указанному URL.
|
|
77
|
+
* @param url URL скрипта для загрузки.
|
|
78
|
+
* @param params Параметры запроса для URL скрипта.
|
|
79
|
+
* @param firstResolver Функция, которая возвращает объект, разрешающий промис.
|
|
80
|
+
* @returns Промис, который разрешается с результатом первого разрешенного промиса.
|
|
81
|
+
*/
|
|
82
|
+
loadScript(url: string, params: any, firstResolver: () => any): Promise<any>;
|
|
83
|
+
/**
|
|
84
|
+
* Метод для ожидания выполнения определенного условия.
|
|
85
|
+
* @param condition Условие, которое должно быть выполнено.
|
|
86
|
+
* @param timeout (Необязательный) Таймаут ожидания в миллисекундах (по умолчанию 5000 мс).
|
|
87
|
+
* @returns Промис, который разрешается с результатом выполнения условия.
|
|
88
|
+
*/
|
|
89
|
+
wait(condition: () => boolean, timeout?: number): Promise<any>;
|
|
90
|
+
}
|
|
9
91
|
/**
|
|
10
92
|
* Resource Component
|
|
11
93
|
* Компонент для подгрузки внешних API: Google Maps, Yandex Maps, Twitter, ...
|
|
12
94
|
*/
|
|
13
|
-
export default class ResourceComponent {
|
|
95
|
+
export default class ResourceComponent implements IResourceComponent {
|
|
14
96
|
_callbacks: any;
|
|
15
97
|
_components: any;
|
|
16
98
|
googleApiKey: string;
|
|
17
99
|
googleCaptchaSiteKey: string;
|
|
18
100
|
language: string;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
101
|
+
readonly RESOURCE_GOOGLE_MAP_API = "//maps.googleapis.com/maps/api/js";
|
|
102
|
+
readonly RESOURCE_YANDEX_MAP_API = "https://api-maps.yandex.ru/2.1/";
|
|
103
|
+
readonly RESOURCE_TWITTER_WIDGET = "https://platform.twitter.com/widgets.js";
|
|
104
|
+
readonly RESOURCE_GEETEST_API = "//static.geetest.com/static/tools/gt.js";
|
|
105
|
+
readonly RESOURCE_GOOGLE_CAPTCHA = "https://www.google.com/recaptcha/api.js";
|
|
24
106
|
constructor(components: any, config: any);
|
|
25
107
|
loadGoogleCaptcha(): Promise<any>;
|
|
26
108
|
loadGoogleMapApi(): Promise<any>;
|
|
@@ -35,8 +35,13 @@ var isArray_1 = __importDefault(require("lodash-es/isArray"));
|
|
|
35
35
|
*/
|
|
36
36
|
var ResourceComponent = /** @class */ (function () {
|
|
37
37
|
function ResourceComponent(components, config) {
|
|
38
|
+
this.RESOURCE_GOOGLE_MAP_API = '//maps.googleapis.com/maps/api/js';
|
|
39
|
+
this.RESOURCE_YANDEX_MAP_API = 'https://api-maps.yandex.ru/2.1/';
|
|
40
|
+
this.RESOURCE_TWITTER_WIDGET = 'https://platform.twitter.com/widgets.js';
|
|
41
|
+
this.RESOURCE_GEETEST_API = '//static.geetest.com/static/tools/gt.js';
|
|
42
|
+
this.RESOURCE_GOOGLE_CAPTCHA = 'https://www.google.com/recaptcha/api.js';
|
|
38
43
|
this.googleApiKey = config.googleApiKey || '';
|
|
39
|
-
this.googleCaptchaSiteKey =
|
|
44
|
+
this.googleCaptchaSiteKey = process.env.APP_RECAPTCHA_SITE_KEY || '';
|
|
40
45
|
this.language = config.language || '';
|
|
41
46
|
this._callbacks = {};
|
|
42
47
|
this._components = components;
|
|
@@ -45,7 +50,7 @@ var ResourceComponent = /** @class */ (function () {
|
|
|
45
50
|
if (window.grecaptcha) {
|
|
46
51
|
return Promise.resolve(window.grecaptcha);
|
|
47
52
|
}
|
|
48
|
-
return this.loadScript(
|
|
53
|
+
return this.loadScript(this.RESOURCE_GOOGLE_CAPTCHA, { render: this.googleCaptchaSiteKey }, function () { return window.grecaptcha; });
|
|
49
54
|
};
|
|
50
55
|
ResourceComponent.prototype.loadGoogleMapApi = function () {
|
|
51
56
|
var locale = this._components.locale;
|
|
@@ -54,7 +59,7 @@ var ResourceComponent = /** @class */ (function () {
|
|
|
54
59
|
// @ts-ignore
|
|
55
60
|
return Promise.resolve(window.google.maps);
|
|
56
61
|
}
|
|
57
|
-
return this.loadScript(
|
|
62
|
+
return this.loadScript(this.RESOURCE_GOOGLE_MAP_API, {
|
|
58
63
|
libraries: 'places,geometry',
|
|
59
64
|
key: this.googleApiKey,
|
|
60
65
|
language: this.language || locale.language
|
|
@@ -72,7 +77,7 @@ var ResourceComponent = /** @class */ (function () {
|
|
|
72
77
|
return window.ymaps.ready(function () { return resolve(window.ymaps); });
|
|
73
78
|
});
|
|
74
79
|
}
|
|
75
|
-
return this.loadScript(
|
|
80
|
+
return this.loadScript(this.RESOURCE_YANDEX_MAP_API, {
|
|
76
81
|
lang: this.language || locale.language
|
|
77
82
|
},
|
|
78
83
|
// @ts-ignore
|
|
@@ -84,7 +89,7 @@ var ResourceComponent = /** @class */ (function () {
|
|
|
84
89
|
// @ts-ignore
|
|
85
90
|
return Promise.resolve(window.twttr);
|
|
86
91
|
}
|
|
87
|
-
return this.loadScript(
|
|
92
|
+
return this.loadScript(this.RESOURCE_TWITTER_WIDGET, {},
|
|
88
93
|
// @ts-ignore
|
|
89
94
|
function () { return new Promise(function (resolve) { return window.twttr.ready(function () { return resolve(window.twttr); }); }); });
|
|
90
95
|
};
|
|
@@ -94,7 +99,7 @@ var ResourceComponent = /** @class */ (function () {
|
|
|
94
99
|
// @ts-ignore
|
|
95
100
|
return Promise.resolve(window.initGeetest);
|
|
96
101
|
}
|
|
97
|
-
return this.loadScript(
|
|
102
|
+
return this.loadScript(this.RESOURCE_GEETEST_API + '?_t=' + new Date().getTime(), {},
|
|
98
103
|
// @ts-ignore
|
|
99
104
|
function () { return window.initGeetest; });
|
|
100
105
|
};
|
|
@@ -147,11 +152,6 @@ var ResourceComponent = /** @class */ (function () {
|
|
|
147
152
|
};
|
|
148
153
|
return new Promise(checker);
|
|
149
154
|
};
|
|
150
|
-
ResourceComponent.RESOURCE_GOOGLE_MAP_API = '//maps.googleapis.com/maps/api/js';
|
|
151
|
-
ResourceComponent.RESOURCE_YANDEX_MAP_API = 'https://api-maps.yandex.ru/2.1/';
|
|
152
|
-
ResourceComponent.RESOURCE_TWITTER_WIDGET = 'https://platform.twitter.com/widgets.js';
|
|
153
|
-
ResourceComponent.RESOURCE_GEETEST_API = '//static.geetest.com/static/tools/gt.js';
|
|
154
|
-
ResourceComponent.RESOURCE_GOOGLE_CAPTCHA = 'https://www.google.com/recaptcha/api.js';
|
|
155
155
|
return ResourceComponent;
|
|
156
156
|
}());
|
|
157
157
|
exports["default"] = ResourceComponent;
|
package/hooks/index.d.ts
CHANGED
|
@@ -17,4 +17,5 @@ import useScreen from './useScreen';
|
|
|
17
17
|
import useSelector from './useSelector';
|
|
18
18
|
import useSsr from './useSsr';
|
|
19
19
|
import useUniqueId from './useUniqueId';
|
|
20
|
-
|
|
20
|
+
import { useTheme } from './useTheme';
|
|
21
|
+
export { useAbsolutePositioning, useAddressBar, useApplication, useBem, useComponents, useDataProvider, useDataSelect, useDispatch, useFetch, useFile, useForm, useInitial, useLayout, useList, useModel, useScreen, useSelector, useSsr, useUniqueId, useTheme, };
|
package/hooks/index.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
exports.__esModule = true;
|
|
6
|
-
exports.useUniqueId = exports.useSsr = exports.useSelector = exports.useScreen = exports.useModel = exports.useList = exports.useLayout = exports.useInitial = exports.useForm = exports.useFile = exports.useFetch = exports.useDispatch = exports.useDataSelect = exports.useDataProvider = exports.useComponents = exports.useBem = exports.useApplication = exports.useAddressBar = exports.useAbsolutePositioning = void 0;
|
|
6
|
+
exports.useTheme = exports.useUniqueId = exports.useSsr = exports.useSelector = exports.useScreen = exports.useModel = exports.useList = exports.useLayout = exports.useInitial = exports.useForm = exports.useFile = exports.useFetch = exports.useDispatch = exports.useDataSelect = exports.useDataProvider = exports.useComponents = exports.useBem = exports.useApplication = exports.useAddressBar = exports.useAbsolutePositioning = void 0;
|
|
7
7
|
var useAbsolutePositioning_1 = __importDefault(require("./useAbsolutePositioning"));
|
|
8
8
|
exports.useAbsolutePositioning = useAbsolutePositioning_1["default"];
|
|
9
9
|
var useAddressBar_1 = __importDefault(require("./useAddressBar"));
|
|
@@ -42,3 +42,5 @@ var useSsr_1 = __importDefault(require("./useSsr"));
|
|
|
42
42
|
exports.useSsr = useSsr_1["default"];
|
|
43
43
|
var useUniqueId_1 = __importDefault(require("./useUniqueId"));
|
|
44
44
|
exports.useUniqueId = useUniqueId_1["default"];
|
|
45
|
+
var useTheme_1 = require("./useTheme");
|
|
46
|
+
exports.useTheme = useTheme_1.useTheme;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export declare const LIGHT_THEME = "light";
|
|
3
|
+
export declare const DARK_THEME = "dark";
|
|
4
|
+
export declare const useTheme: (themes?: string[], themeStorageKey?: string) => {
|
|
5
|
+
theme: any;
|
|
6
|
+
setTheme: React.Dispatch<any>;
|
|
7
|
+
toggleTheme: () => void;
|
|
8
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
exports.__esModule = true;
|
|
6
|
+
exports.useTheme = exports.DARK_THEME = exports.LIGHT_THEME = void 0;
|
|
7
|
+
var react_1 = __importDefault(require("react"));
|
|
8
|
+
var useComponents_1 = __importDefault(require("./useComponents"));
|
|
9
|
+
exports.LIGHT_THEME = 'light';
|
|
10
|
+
exports.DARK_THEME = 'dark';
|
|
11
|
+
var DEFAULT_THEMES = [
|
|
12
|
+
exports.LIGHT_THEME,
|
|
13
|
+
exports.DARK_THEME,
|
|
14
|
+
];
|
|
15
|
+
var DEFAULT_THEME_STORAGE_KEY = 'theme';
|
|
16
|
+
var useTheme = function (themes, themeStorageKey) {
|
|
17
|
+
if (themes === void 0) { themes = DEFAULT_THEMES; }
|
|
18
|
+
if (themeStorageKey === void 0) { themeStorageKey = DEFAULT_THEME_STORAGE_KEY; }
|
|
19
|
+
var clientStorage = (0, useComponents_1["default"])().clientStorage;
|
|
20
|
+
var _a = react_1["default"].useState(clientStorage.get(themeStorageKey) || themes[0]), theme = _a[0], setTheme = _a[1];
|
|
21
|
+
var toggleTheme = react_1["default"].useCallback(function () {
|
|
22
|
+
var themesExpectedCount = 2;
|
|
23
|
+
if (themes.length !== themesExpectedCount) {
|
|
24
|
+
throw new Error('toggleTheme callback can only be used if the number of themes is two');
|
|
25
|
+
}
|
|
26
|
+
var lightTheme = themes[0];
|
|
27
|
+
var darkTheme = themes[1];
|
|
28
|
+
setTheme(theme === lightTheme ? darkTheme : lightTheme);
|
|
29
|
+
}, [themes, theme]);
|
|
30
|
+
react_1["default"].useEffect(function () {
|
|
31
|
+
document.querySelector('html').setAttribute('data-theme', theme);
|
|
32
|
+
clientStorage.set(themeStorageKey, theme);
|
|
33
|
+
}, [theme, clientStorage, themeStorageKey]);
|
|
34
|
+
return {
|
|
35
|
+
theme: theme,
|
|
36
|
+
setTheme: setTheme,
|
|
37
|
+
toggleTheme: toggleTheme
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
exports.useTheme = useTheme;
|
package/package.json
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { PropsWithChildren } from 'react';
|
|
3
|
+
import { IResourceComponent } from '../components/ResourceComponent';
|
|
3
4
|
declare global {
|
|
4
5
|
interface Window {
|
|
5
6
|
SteroidsComponents: IComponents;
|
|
@@ -13,7 +14,7 @@ export interface IComponents {
|
|
|
13
14
|
locale?: any;
|
|
14
15
|
store?: any;
|
|
15
16
|
ui?: any;
|
|
16
|
-
resource?:
|
|
17
|
+
resource?: IResourceComponent;
|
|
17
18
|
ws?: any;
|
|
18
19
|
pushNotification?: any;
|
|
19
20
|
meta?: any;
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { IButtonProps } from 'src/ui/form/Button/Button';
|
|
3
3
|
import { ILinkProps } from 'src/ui/nav/Link/Link';
|
|
4
4
|
import { IAvatarProps } from '../Avatar/Avatar';
|
|
5
|
+
import { IMenuProps } from '../Menu/Menu';
|
|
5
6
|
export interface ICardHeader {
|
|
6
7
|
/**
|
|
7
8
|
* Параметры для аватара
|
|
@@ -13,10 +14,9 @@ export interface ICardHeader {
|
|
|
13
14
|
*/
|
|
14
15
|
avatar?: IAvatarProps;
|
|
15
16
|
/**
|
|
16
|
-
*
|
|
17
|
-
* @example true
|
|
17
|
+
* Свойства для компонента <Menu/>
|
|
18
18
|
*/
|
|
19
|
-
menu?:
|
|
19
|
+
menu?: IMenuProps;
|
|
20
20
|
/**
|
|
21
21
|
* Текст шапки (заголовок)
|
|
22
22
|
* @example 'Steroids.js head'
|
|
@@ -52,7 +52,20 @@ export interface ICardProps extends IUiComponent {
|
|
|
52
52
|
* },
|
|
53
53
|
* head: 'Header',
|
|
54
54
|
* subhead: 'Subhead',
|
|
55
|
-
* menu:
|
|
55
|
+
* menu: {
|
|
56
|
+
* dropDownProps: {
|
|
57
|
+
position: 'bottom',
|
|
58
|
+
closeMode: 'click-any',
|
|
59
|
+
},
|
|
60
|
+
items: [
|
|
61
|
+
{label: 'Вырезать', icon: 'cut', onClick: voidFunction},
|
|
62
|
+
{label: 'Копировать', icon: 'copy', hasBorder: true, onClick: voidFunction},
|
|
63
|
+
{label: 'Показать историю изменений', hasBorder: true, onClick: voidFunction},
|
|
64
|
+
{label: 'Редактировать', icon: 'edit', onClick: voidFunction},
|
|
65
|
+
{label: 'Удалить', icon: 'trash', onClick: voidFunction},
|
|
66
|
+
],
|
|
67
|
+
icon: 'menu_dots',
|
|
68
|
+
* },
|
|
56
69
|
*/
|
|
57
70
|
header?: ICardHeader;
|
|
58
71
|
/**
|
|
@@ -58,7 +58,19 @@ exports.MASK_PRESETS = {
|
|
|
58
58
|
mode: 'dd/mm/yyyy'
|
|
59
59
|
}),
|
|
60
60
|
phone: {
|
|
61
|
-
mask: [
|
|
61
|
+
mask: __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([
|
|
62
|
+
'+',
|
|
63
|
+
'7',
|
|
64
|
+
' ',
|
|
65
|
+
'('
|
|
66
|
+
], Array(3).fill(/\d/), true), [
|
|
67
|
+
')',
|
|
68
|
+
' '
|
|
69
|
+
], false), Array(3).fill(/\d/), true), [
|
|
70
|
+
'-'
|
|
71
|
+
], false), Array(2).fill(/\d/), true), [
|
|
72
|
+
' '
|
|
73
|
+
], false), Array(2).fill(/\d/), true)
|
|
62
74
|
},
|
|
63
75
|
card: {
|
|
64
76
|
mask: __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], Array(4).fill(/\d/), true), [
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
1
2
|
import { IFieldWrapperInputProps, IFieldWrapperOutputProps } from '../Field/fieldWrapper';
|
|
2
3
|
/**
|
|
3
4
|
* ReCaptchaField
|
|
@@ -11,9 +12,74 @@ import { IFieldWrapperInputProps, IFieldWrapperOutputProps } from '../Field/fiel
|
|
|
11
12
|
* Сам компонент отображает ссылки на политику конфиденциальности и условия использования сервисов Google.
|
|
12
13
|
*/
|
|
13
14
|
export interface IReCaptchaFieldProps extends IFieldWrapperInputProps, IUiComponent {
|
|
15
|
+
/**
|
|
16
|
+
* Обработчик события изменения ReCaptcha.
|
|
17
|
+
*/
|
|
18
|
+
onChange?: VoidFunction;
|
|
19
|
+
/**
|
|
20
|
+
* Функция, вызываемая после загрузки асинхронного скрипта.
|
|
21
|
+
*/
|
|
22
|
+
asyncScriptOnLoad?: () => void;
|
|
23
|
+
/**
|
|
24
|
+
* Положение значка ReCaptcha. Может быть 'bottomright' (внизу справа), 'bottomleft' (внизу слева) или 'inline' (встроенный).
|
|
25
|
+
*/
|
|
26
|
+
badge?: 'bottomright' | 'bottomleft' | 'inline';
|
|
27
|
+
/**
|
|
28
|
+
* Тип ReCaptcha. Может быть 'image' (изображение) или 'audio' (аудио).
|
|
29
|
+
*/
|
|
30
|
+
type?: 'image' | 'audio';
|
|
31
|
+
/**
|
|
32
|
+
* Значение tabindex для ReCaptcha.
|
|
33
|
+
*/
|
|
34
|
+
tabindex?: number;
|
|
35
|
+
/**
|
|
36
|
+
* Защищенный токен для ReCaptcha.
|
|
37
|
+
*/
|
|
38
|
+
stoken?: string;
|
|
39
|
+
/**
|
|
40
|
+
* Обработчик события истечения срока действия ReCaptcha.
|
|
41
|
+
*/
|
|
42
|
+
onExpired?: VoidFunction;
|
|
43
|
+
/**
|
|
44
|
+
* Обработчик события ошибки ReCaptcha.
|
|
45
|
+
*/
|
|
46
|
+
onErrored?: VoidFunction;
|
|
47
|
+
/**
|
|
48
|
+
* Флаг, указывающий на изоляцию ReCaptcha.
|
|
49
|
+
*/
|
|
50
|
+
isolated?: boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Языковой код для ReCaptcha.
|
|
53
|
+
*/
|
|
54
|
+
hl?: string;
|
|
55
|
+
/**
|
|
56
|
+
* Ссылка на ref-объект React для ReCaptcha.
|
|
57
|
+
*/
|
|
58
|
+
ref?: React.RefObject<any>;
|
|
59
|
+
/**
|
|
60
|
+
* Ключ сайта ReCaptcha. По умолчанию process.env.APP_RECAPTCHA_SITE_KEY
|
|
61
|
+
*/
|
|
62
|
+
sitekey?: string;
|
|
63
|
+
/**
|
|
64
|
+
* Дополнительные свойства, которые могут быть указаны.
|
|
65
|
+
*/
|
|
14
66
|
[key: string]: any;
|
|
15
67
|
}
|
|
16
68
|
export interface IReCaptchaFieldViewProps extends IReCaptchaFieldProps, IFieldWrapperOutputProps {
|
|
69
|
+
sitekey: string;
|
|
70
|
+
recaptchaOptions: {
|
|
71
|
+
onChange: VoidFunction;
|
|
72
|
+
asyncScriptOnLoad: () => void;
|
|
73
|
+
badge: 'bottomright' | 'bottomleft' | 'inline';
|
|
74
|
+
type: 'image' | 'audio';
|
|
75
|
+
tabindex: number;
|
|
76
|
+
stoken: string;
|
|
77
|
+
onExpired: VoidFunction;
|
|
78
|
+
onErrored: VoidFunction;
|
|
79
|
+
isolated: boolean;
|
|
80
|
+
hl: string;
|
|
81
|
+
ref: React.RefObject<any>;
|
|
82
|
+
};
|
|
17
83
|
}
|
|
18
84
|
declare const _default: import("../Field/fieldWrapper").FieldWrapperComponent<IReCaptchaFieldProps>;
|
|
19
85
|
export default _default;
|
|
@@ -14,10 +14,31 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
14
14
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
15
|
};
|
|
16
16
|
exports.__esModule = true;
|
|
17
|
+
/* eslint-disable max-len */
|
|
18
|
+
var react_1 = require("react");
|
|
17
19
|
var hooks_1 = require("../../../hooks");
|
|
18
20
|
var fieldWrapper_1 = __importDefault(require("../Field/fieldWrapper"));
|
|
19
21
|
function ReCaptchaField(props) {
|
|
20
22
|
var components = (0, hooks_1.useComponents)();
|
|
21
|
-
|
|
23
|
+
var onChange = (0, react_1.useCallback)(function () {
|
|
24
|
+
if (props.onChange) {
|
|
25
|
+
props.onChange();
|
|
26
|
+
}
|
|
27
|
+
}, [props]);
|
|
28
|
+
var recaptchaOptions = (0, react_1.useMemo)(function () { return ({
|
|
29
|
+
onChange: onChange,
|
|
30
|
+
asyncScriptOnLoad: props.asyncScriptOnLoad,
|
|
31
|
+
badge: props.badge,
|
|
32
|
+
type: props.type,
|
|
33
|
+
tabindex: props.tabindex,
|
|
34
|
+
stoken: props.stoken,
|
|
35
|
+
onExpired: props.onExpired,
|
|
36
|
+
onErrored: props.onErrored,
|
|
37
|
+
isolated: props.isolated,
|
|
38
|
+
hl: props.hl,
|
|
39
|
+
ref: props.ref,
|
|
40
|
+
sitekey: props.sitekey || components.resource.googleCaptchaSiteKey
|
|
41
|
+
}); }, [components.resource.googleCaptchaSiteKey, onChange, props.asyncScriptOnLoad, props.badge, props.hl, props.isolated, props.onErrored, props.onExpired, props.ref, props.sitekey, props.stoken, props.tabindex, props.type]);
|
|
42
|
+
return components.ui.renderView(props.view || 'form.ReCaptchaFieldView', __assign(__assign({}, props), { recaptchaOptions: recaptchaOptions }));
|
|
22
43
|
}
|
|
23
44
|
exports["default"] = (0, fieldWrapper_1["default"])('ReCaptchaField', ReCaptchaField);
|
|
@@ -79,6 +79,9 @@ function Tooltip(props) {
|
|
|
79
79
|
// Основная функция расчета позиции
|
|
80
80
|
var calculatePosition = (0, react_1.useCallback)(function (tooltipSize, arrowSize) {
|
|
81
81
|
var result = (0, calculate_1["default"])(props.gap, positionRef.current, childRef.current, tooltipSize, arrowSize);
|
|
82
|
+
if (!result) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
82
85
|
positionRef.current = result.position;
|
|
83
86
|
setStyle(result.style);
|
|
84
87
|
if (result.arrowPosition) {
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
exports.__esModule = true;
|
|
3
3
|
function calculate(gap, position, parentRef, tooltipSize, arrowSize) {
|
|
4
|
+
if (process.env.IS_SSR) {
|
|
5
|
+
return null;
|
|
6
|
+
}
|
|
4
7
|
var style = { left: null, right: null, top: null };
|
|
5
8
|
var arrowPosition = null;
|
|
6
9
|
var _a = parentRef.getBoundingClientRect(), top = _a.top, right = _a.right, left = _a.left, width = _a.width, height = _a.height;
|