studiokit-scaffolding-js 7.0.12-next.1.4 → 7.0.12-next.2.2
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/lib/components/ActionList.js +170 -34
- package/lib/components/AlertDialog.js +133 -9
- package/lib/components/AlertWithIcon.js +92 -25
- package/lib/components/ConnectedModal.js +43 -13
- package/lib/components/Dropdowns/GroupsDropdown.js +69 -44
- package/lib/components/Dropdowns/ManagedNavDropdown.js +100 -67
- package/lib/components/Dropdowns/UserDropdown.js +111 -21
- package/lib/components/Dropdowns/index.js +27 -9
- package/lib/components/EntityOwnerList.js +52 -18
- package/lib/components/Error.js +106 -11
- package/lib/components/ErrorBoundary.js +134 -35
- package/lib/components/ErrorMessage.js +44 -9
- package/lib/components/Forms/DateField.js +61 -42
- package/lib/components/Forms/TimeField.js +81 -42
- package/lib/components/Forms/index.js +27 -4
- package/lib/components/Groups/CreateEditCopySaveButtons.js +114 -11
- package/lib/components/Groups/ExternalGroups/Attach.js +212 -148
- package/lib/components/Groups/ExternalGroups/Table.js +181 -45
- package/lib/components/Groups/GroupCreateOrEditCommonProps.js +5 -1
- package/lib/components/Groups/RosterSyncInfo.js +147 -20
- package/lib/components/HOC/AccessibleAppComponent.js +98 -73
- package/lib/components/HOC/ActivityRequiredComponent.js +92 -49
- package/lib/components/HOC/AsyncComponent.js +54 -39
- package/lib/components/HOC/AuthenticatedComponent.js +58 -38
- package/lib/components/HOC/CollectionComponent.js +170 -110
- package/lib/components/HOC/CollectionFirstItemComponent.js +51 -38
- package/lib/components/HOC/CollectionItemComponent.js +168 -106
- package/lib/components/HOC/ConnectedModalComponent.js +109 -80
- package/lib/components/HOC/DataDependentComponent.js +29 -21
- package/lib/components/HOC/EntityComponent.js +71 -57
- package/lib/components/HOC/FullscreenModalComponent.js +163 -123
- package/lib/components/HOC/GroupActivityRequiredComponent.js +45 -31
- package/lib/components/HOC/GuidComponent.js +29 -22
- package/lib/components/HOC/ModelContextDependencyVerifyComponent.js +41 -31
- package/lib/components/HOC/ModelErrorRedirectComponent.js +51 -47
- package/lib/components/HOC/SearchPersistorComponent.js +240 -166
- package/lib/components/HOC/UnauthenticatedComponent.js +37 -25
- package/lib/components/HOC/UserComponent.js +12 -7
- package/lib/components/Icons/IconAlphaList.js +33 -5
- package/lib/components/Icons/IconExternalUser.js +33 -5
- package/lib/components/Icons/IconImpersonation.js +33 -5
- package/lib/components/Icons/IconStopImpersonating.js +33 -5
- package/lib/components/Icons/IconTable.js +35 -7
- package/lib/components/Icons/IconTableDeleteCol.js +33 -5
- package/lib/components/Icons/IconTableDeleteRow.js +33 -5
- package/lib/components/Icons/IconTableInsertCol.js +33 -5
- package/lib/components/Icons/IconTableInsertRow.js +33 -5
- package/lib/components/Impersonation/Button.js +77 -13
- package/lib/components/Impersonation/Link.js +77 -13
- package/lib/components/Impersonation/UserDetail.js +66 -9
- package/lib/components/Loading.js +26 -4
- package/lib/components/LockDownBrowser/Check.js +194 -49
- package/lib/components/LockDownBrowser/ExitButton.js +26 -9
- package/lib/components/LockDownBrowser/Launch.js +70 -62
- package/lib/components/Lti/Confirm.js +152 -11
- package/lib/components/Lti/CreateNonLtiGroupAlertDialog.js +170 -33
- package/lib/components/Lti/Launch.js +105 -24
- package/lib/components/Lti/LaunchGroup.js +85 -13
- package/lib/components/ManageTable.js +309 -87
- package/lib/components/ManageTableNoDataComponent.js +42 -4
- package/lib/components/NewVersionAlert.js +82 -46
- package/lib/components/NotFound.js +86 -10
- package/lib/components/Notifications.js +185 -126
- package/lib/components/PaginationNextButton.js +33 -6
- package/lib/components/PaginationPreviousButton.js +33 -6
- package/lib/components/Quill/CustomToolbar.js +432 -218
- package/lib/components/Quill/Formats/Image.js +73 -63
- package/lib/components/Quill/Formats/List.js +45 -45
- package/lib/components/Quill/Formats/Video.js +28 -24
- package/lib/components/Quill/ImageDropModule.js +147 -117
- package/lib/components/Quill/ImageWarning.js +47 -9
- package/lib/components/Quill/ImageWithAltTextModal.js +425 -86
- package/lib/components/Quill/Specs/CustomImageSpec.js +42 -34
- package/lib/components/Quill/Specs/CustomVideoSpec.js +34 -28
- package/lib/components/Quill/TableModule/Blots/BaseTableBlot.js +98 -98
- package/lib/components/Quill/TableModule/Blots/TableBlot.js +52 -47
- package/lib/components/Quill/TableModule/Blots/TableBodyBlot.js +53 -48
- package/lib/components/Quill/TableModule/Blots/TableCellBlot.js +224 -221
- package/lib/components/Quill/TableModule/Blots/TableContainer.js +80 -83
- package/lib/components/Quill/TableModule/Blots/TableRowBlot.js +75 -70
- package/lib/components/Quill/TableModule/constants.js +45 -41
- package/lib/components/Quill/TableModule/index.js +362 -301
- package/lib/components/Quill/TableModule/utils.js +42 -38
- package/lib/components/Quill/accessibilityFix.js +234 -232
- package/lib/components/Quill/index.js +34 -28
- package/lib/components/RefreshIndicator/Bordered.js +47 -6
- package/lib/components/RefreshIndicator/Inline.js +47 -8
- package/lib/components/RefreshIndicator/index.js +263 -59
- package/lib/components/SearchControls.js +216 -11
- package/lib/components/SentryRoute.js +11 -6
- package/lib/components/Tables/RoleFilter.js +69 -32
- package/lib/components/Tables/TextFilter.js +62 -13
- package/lib/components/UserRoles/Add.js +199 -96
- package/lib/components/UserRoles/Context.js +11 -7
- package/lib/components/UserRoles/RoleCell.js +181 -72
- package/lib/components/UserRoles/Select.js +157 -17
- package/lib/components/UserRoles/Table.js +221 -80
- package/lib/components/UserRoles/index.js +534 -384
- package/lib/config/eslint/index.js +32 -28
- package/lib/config/eslint/lib/order.js +26 -27
- package/lib/config/eslint/lib/prettier.js +20 -18
- package/lib/config/eslint/lib/typescript.js +93 -112
- package/lib/config/eslint/react.js +24 -14
- package/lib/constants/baseActivity.js +30 -26
- package/lib/constants/baseRole.js +14 -10
- package/lib/constants/configuration.js +33 -29
- package/lib/constants/externalProviderType.js +10 -6
- package/lib/constants/fetchErrorData.js +15 -11
- package/lib/constants/index.js +137 -14
- package/lib/constants/lockDownBrowser.js +28 -24
- package/lib/constants/mockData.js +382 -297
- package/lib/constants/modelStatus.js +15 -11
- package/lib/constants/notificationType.js +12 -8
- package/lib/constants/operatingSystem.js +12 -8
- package/lib/constants/shard.js +11 -7
- package/lib/constants/table.js +21 -21
- package/lib/constants/tier.js +12 -8
- package/lib/constants/userRole.js +15 -5
- package/lib/endpointMappings.js +197 -181
- package/lib/hooks/useCollection.js +82 -62
- package/lib/hooks/useCollectionConfiguration.js +228 -83
- package/lib/hooks/useCollectionItem.js +154 -54
- package/lib/hooks/useGuid.js +20 -8
- package/lib/hooks/usePrevious.js +19 -13
- package/lib/index.js +157 -25
- package/lib/redux/actionCreator.js +50 -28
- package/lib/redux/actions/AuthAction.js +44 -31
- package/lib/redux/actions/ModalAction.js +10 -6
- package/lib/redux/actions/ModelAction.js +77 -39
- package/lib/redux/actions/NotificationAction.js +10 -6
- package/lib/redux/actions/SearchAction.js +9 -5
- package/lib/redux/actions/index.js +60 -7
- package/lib/redux/configureReducers.js +60 -49
- package/lib/redux/configureStore.js +83 -87
- package/lib/redux/helpers.js +6 -2
- package/lib/redux/reducers/authReducer.js +50 -43
- package/lib/redux/reducers/index.js +41 -13
- package/lib/redux/reducers/modalsReducer.js +47 -29
- package/lib/redux/reducers/modelsReducer.js +178 -173
- package/lib/redux/reducers/notificationsReducer.js +24 -18
- package/lib/redux/reducers/searchReducer.js +25 -19
- package/lib/redux/sagas/appInsightsSaga.js +22 -18
- package/lib/redux/sagas/authSaga.js +253 -218
- package/lib/redux/sagas/caliperSaga.js +159 -143
- package/lib/redux/sagas/clockOffsetSaga.js +34 -31
- package/lib/redux/sagas/configurationSaga.js +11 -7
- package/lib/redux/sagas/downtimeApiErrorSaga.js +20 -17
- package/lib/redux/sagas/errorSaga.js +27 -21
- package/lib/redux/sagas/googleAnalyticsSaga.js +28 -24
- package/lib/redux/sagas/identityProviderSaga.js +22 -18
- package/lib/redux/sagas/initialDataLoadSaga.js +37 -28
- package/lib/redux/sagas/lockDownBrowserErrorSaga.js +29 -20
- package/lib/redux/sagas/modelFetchSaga.js +355 -322
- package/lib/redux/sagas/noStoreSaga.js +61 -48
- package/lib/redux/sagas/postLoginDataSaga.js +45 -34
- package/lib/redux/sagas/postLoginRedirectSaga.js +27 -27
- package/lib/redux/sagas/rootSaga.js +82 -57
- package/lib/redux/sagas/sentrySaga.js +29 -25
- package/lib/redux/sagas/userIdSaga.js +16 -12
- package/lib/services/codeProviderService.js +25 -19
- package/lib/services/dateService.js +12 -7
- package/lib/services/documentService.js +17 -12
- package/lib/services/fetchService.js +129 -112
- package/lib/services/persistenceService.js +33 -29
- package/lib/services/ticketProviderService.js +29 -23
- package/lib/services/tokenPersistenceService.js +12 -8
- package/lib/services/windowService.js +18 -14
- package/lib/startup.js +132 -114
- package/lib/types/AppConfiguration.js +5 -1
- package/lib/types/Artifact.js +11 -7
- package/lib/types/BaseReduxState.js +5 -1
- package/lib/types/Client.js +5 -1
- package/lib/types/Collection.js +5 -1
- package/lib/types/Configuration.js +5 -1
- package/lib/types/DeepLinkingResponseRequest.js +5 -1
- package/lib/types/DeletableModel.js +5 -1
- package/lib/types/Event.js +5 -1
- package/lib/types/ExternalGroup.js +5 -1
- package/lib/types/ExternalProvider.js +5 -1
- package/lib/types/ExternalTerm.js +5 -1
- package/lib/types/Group.js +5 -1
- package/lib/types/IdentityProvider.js +5 -1
- package/lib/types/LtiLaunch.js +5 -1
- package/lib/types/NameOnlyEntity.js +5 -1
- package/lib/types/Notification.js +5 -1
- package/lib/types/OptionalRecord.js +5 -1
- package/lib/types/OwnerSchedule.js +5 -1
- package/lib/types/PropertyOfType.js +5 -1
- package/lib/types/Quill.js +5 -1
- package/lib/types/RoleDescription.js +5 -1
- package/lib/types/Search.js +5 -1
- package/lib/types/SimpleLocation.js +5 -1
- package/lib/types/UniTime.js +5 -1
- package/lib/types/User.js +5 -1
- package/lib/types/UserRole.js +5 -1
- package/lib/types/auth/AuthState.js +5 -1
- package/lib/types/auth/CasV1LoginRequestBody.js +5 -1
- package/lib/types/auth/ClientCredentials.js +5 -1
- package/lib/types/auth/CodeProviderService.js +5 -1
- package/lib/types/auth/LocalLoginRequestBody.js +5 -1
- package/lib/types/auth/TicketProviderService.js +5 -1
- package/lib/types/auth/TokenPersistenceService.js +5 -1
- package/lib/types/auth/index.js +82 -9
- package/lib/types/externals.d.js +2 -0
- package/lib/types/index.js +313 -30
- package/lib/types/net/EndpointConfig.js +5 -1
- package/lib/types/net/EndpointMapping.js +5 -1
- package/lib/types/net/EndpointMappings.js +5 -1
- package/lib/types/net/ErrorHandler.js +5 -1
- package/lib/types/net/FetchConfig.js +5 -1
- package/lib/types/net/FetchErrorData.js +10 -6
- package/lib/types/net/FetchResult.js +5 -1
- package/lib/types/net/HTTPMethod.js +5 -1
- package/lib/types/net/HTTPStatusCode.js +16 -12
- package/lib/types/net/Metadata.js +5 -1
- package/lib/types/net/Model.js +5 -1
- package/lib/types/net/ModelCollection.js +5 -1
- package/lib/types/net/ModelsState.js +5 -1
- package/lib/types/net/OAuthToken.js +5 -1
- package/lib/types/net/OAuthTokenOrNull.js +5 -1
- package/lib/types/net/TokenAccessFunction.js +5 -1
- package/lib/types/net/index.js +181 -18
- package/lib/utils/baseActivity.js +133 -123
- package/lib/utils/baseRole.js +37 -33
- package/lib/utils/collection.js +425 -298
- package/lib/utils/cookies.js +22 -19
- package/lib/utils/date.js +303 -279
- package/lib/utils/dom.js +176 -165
- package/lib/utils/domainIdentifier.js +9 -5
- package/lib/utils/entityUserRole.js +6 -2
- package/lib/utils/error.js +17 -15
- package/lib/utils/events.js +40 -31
- package/lib/utils/externalGroup.js +22 -18
- package/lib/utils/externalProviders.js +8 -4
- package/lib/utils/externalTerms.js +10 -3
- package/lib/utils/fetch.js +179 -180
- package/lib/utils/group.js +18 -7
- package/lib/utils/groupDates.js +37 -33
- package/lib/utils/groupRoles.js +25 -21
- package/lib/utils/lockDownBrowser.js +15 -11
- package/lib/utils/logger.js +26 -22
- package/lib/utils/lti.js +9 -4
- package/lib/utils/model.js +36 -41
- package/lib/utils/number.js +21 -18
- package/lib/utils/promise.js +28 -21
- package/lib/utils/quill.js +65 -62
- package/lib/utils/route.js +58 -55
- package/lib/utils/search.js +76 -80
- package/lib/utils/shard.js +37 -37
- package/lib/utils/sort.js +50 -42
- package/lib/utils/string.js +13 -8
- package/lib/utils/table.js +38 -33
- package/lib/utils/timezone.js +10 -6
- package/lib/utils/url.js +142 -142
- package/lib/utils/user.js +58 -55
- package/lib/utils/userAgent.js +10 -10
- package/lib/utils/userRole.js +57 -49
- package/package.json +17 -3
package/lib/utils/dom.js
CHANGED
|
@@ -1,202 +1,213 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.setupMobileEventListeners = exports.isTextInput = exports.isMobileDevice = exports.hasExternalKeyboard = exports.getVerticallyScrollableParent = exports.getFirstParentElementWithClassName = void 0;
|
|
7
|
+
var _logger = require("./logger");
|
|
5
8
|
const KEYBOARD_ANIMATION_MS = 250;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
*
|
|
9
|
-
* @
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Get the nearest vertically scrollable parent of an element
|
|
12
|
+
* @param { HTMLElement } element - The element to start with
|
|
13
|
+
* @returns The nearest vertically scrollable parent element
|
|
10
14
|
*/
|
|
11
|
-
const getVerticallyScrollableParent =
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
22
|
-
return document.scrollingElement;
|
|
15
|
+
const getVerticallyScrollableParent = element => {
|
|
16
|
+
let style = getComputedStyle(element);
|
|
17
|
+
const excludeStaticParent = style.position === 'absolute';
|
|
18
|
+
const overflowRegex = /(auto|scroll|hidden)/;
|
|
19
|
+
for (let parent = element; parent = parent.parentElement;) {
|
|
20
|
+
style = getComputedStyle(parent);
|
|
21
|
+
if (excludeStaticParent && style.position === 'static') continue;
|
|
22
|
+
if (overflowRegex.test(style.overflow + style.overflowY) && parent.scrollHeight > parent.clientHeight) return parent;
|
|
23
|
+
}
|
|
24
|
+
return document.scrollingElement;
|
|
23
25
|
};
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Get the first parent that has the given className in its classList
|
|
27
|
-
* @param element The target element
|
|
28
|
-
* @param className The className to match
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Get the first parent that has the given className in its classList
|
|
29
|
+
* @param element The target element
|
|
30
|
+
* @param className The className to match
|
|
29
31
|
*/
|
|
32
|
+
exports.getVerticallyScrollableParent = getVerticallyScrollableParent;
|
|
30
33
|
const getFirstParentElementWithClassName = (element, className) => {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
return undefined;
|
|
34
|
+
for (let parent = element; parent = parent.parentElement;) {
|
|
35
|
+
if (parent.classList.contains(className)) return parent;
|
|
36
|
+
}
|
|
37
|
+
return undefined;
|
|
36
38
|
};
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Return whether the device being used is one of several mainstream mobile devices
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Return whether the device being used is one of several mainstream mobile devices
|
|
40
42
|
*/
|
|
43
|
+
exports.getFirstParentElementWithClassName = getFirstParentElementWithClassName;
|
|
41
44
|
const isMobileDevice = () => {
|
|
42
|
-
|
|
43
|
-
(/macintosh/i.test(navigator.userAgent) && navigator.maxTouchPoints));
|
|
45
|
+
return /android|ipad|ipod|iphone/i.test(navigator.userAgent) || /macintosh/i.test(navigator.userAgent) && navigator.maxTouchPoints;
|
|
44
46
|
};
|
|
45
|
-
|
|
47
|
+
|
|
46
48
|
/** Return whether the device is using an external keyboard vs. the native on-screen OS keyboard. */
|
|
49
|
+
exports.isMobileDevice = isMobileDevice;
|
|
47
50
|
const hasExternalKeyboard = () => window.hasExternalKeyboard;
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Sets `window.hasExternalKeyboard`, returned by `hasExternalKeyboard`.
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Sets `window.hasExternalKeyboard`, returned by `hasExternalKeyboard`.
|
|
51
54
|
*/
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
55
|
+
exports.hasExternalKeyboard = hasExternalKeyboard;
|
|
56
|
+
const setHasExternalKeyboard = hasExternalKeyboard => {
|
|
57
|
+
(0, _logger.getLogger)().debug('hasExternalKeyboard', hasExternalKeyboard);
|
|
58
|
+
const windowWithoutType = window;
|
|
59
|
+
windowWithoutType.hasExternalKeyboard = hasExternalKeyboard;
|
|
56
60
|
};
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* 100vh is kind of b⊘rked on mobile safari, we have to set it programmatically here
|
|
64
|
+
* so we can calculate device-independent viewport heights
|
|
65
|
+
* https://allthingssmitty.com/2020/05/11/css-fix-for-100vh-in-mobile-webkit/
|
|
66
|
+
*
|
|
67
|
+
* Sets the CSS variable `--visual-viewport-height` on the `documentElement`/<html>.
|
|
68
|
+
*
|
|
64
69
|
*/
|
|
65
70
|
const setVisualViewportHeightVar = () => {
|
|
66
|
-
|
|
67
|
-
|
|
71
|
+
const height = visualViewport ? visualViewport.height : 0;
|
|
72
|
+
document.documentElement.style.setProperty('--visual-viewport-height', `${height}px`);
|
|
68
73
|
};
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
*
|
|
72
|
-
*
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Is the given element capable of text input?
|
|
77
|
+
*
|
|
78
|
+
* @param el An HTML element
|
|
73
79
|
*/
|
|
74
|
-
const isTextInput =
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
return tagName === 'div' && el.className.includes('ql-editor') && el.contentEditable === 'true';
|
|
80
|
+
const isTextInput = el => {
|
|
81
|
+
const tagName = el.tagName && el.tagName.toLowerCase();
|
|
82
|
+
if (tagName === 'textarea') return true;
|
|
83
|
+
if (tagName === 'input') {
|
|
84
|
+
const inputEl = el;
|
|
85
|
+
return inputEl.type !== 'button' && inputEl.type !== 'radio' && inputEl.type !== 'checkbox';
|
|
86
|
+
}
|
|
87
|
+
// Quill editor
|
|
88
|
+
return tagName === 'div' && el.className.includes('ql-editor') && el.contentEditable === 'true';
|
|
84
89
|
};
|
|
85
90
|
exports.isTextInput = isTextInput;
|
|
86
91
|
let updateHasExternalKeyboardAfterFocusTimeout = undefined;
|
|
87
92
|
let scrollToElementAfterFocusTimeout = undefined;
|
|
88
93
|
const updateHasExternalKeyboardAfterFocus = () => {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
}, KEYBOARD_ANIMATION_MS);
|
|
94
|
+
const closedVisualViewportHeight = visualViewport ? visualViewport.height : 0;
|
|
95
|
+
// wait for the keyboard animation
|
|
96
|
+
updateHasExternalKeyboardAfterFocusTimeout = window.setTimeout(() => {
|
|
97
|
+
// find the keyboard height based on the difference in viewport height
|
|
98
|
+
const keyboardHeight = closedVisualViewportHeight - (visualViewport ? visualViewport.height : 0);
|
|
99
|
+
// on first-load the input focus can fail
|
|
100
|
+
// when this happens the height is 0, and this ONLY happens when there is NOT an external keyboard
|
|
101
|
+
if (keyboardHeight === 0 && hasExternalKeyboard() === undefined) {
|
|
102
|
+
setHasExternalKeyboard(false);
|
|
103
|
+
} else {
|
|
104
|
+
// if the keyboard height is greater than 100, that means the full onscreen keyboard displayed
|
|
105
|
+
// otherwise, only the small context menu displayed, meaning there is an external keyboard
|
|
106
|
+
setHasExternalKeyboard(keyboardHeight < 100);
|
|
107
|
+
}
|
|
108
|
+
updateHasExternalKeyboardAfterFocusTimeout = undefined;
|
|
109
|
+
}, KEYBOARD_ANIMATION_MS);
|
|
106
110
|
};
|
|
107
|
-
const scrollToElementAfterFocus =
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
111
|
+
const scrollToElementAfterFocus = el => {
|
|
112
|
+
// wait for the keyboard animation
|
|
113
|
+
scrollToElementAfterFocusTimeout = window.setTimeout(() => {
|
|
114
|
+
// after the keyboard is open, check for the el’s scrollable parent, as it could have just become scrollable
|
|
115
|
+
const scrollParent = getVerticallyScrollableParent(el);
|
|
116
|
+
// if the el has a scrollable parent other than the document, scroll it back into view
|
|
117
|
+
if (scrollParent && scrollParent !== document.documentElement) {
|
|
118
|
+
const scrollRect = scrollParent.getBoundingClientRect();
|
|
119
|
+
const rect = el.getBoundingClientRect();
|
|
120
|
+
// only scroll into view if outside of the scroll parent bounds
|
|
121
|
+
if (rect.bottom < scrollRect.top || rect.top > scrollRect.bottom) {
|
|
122
|
+
const newScrollTop = scrollParent.scrollTop + rect.top - scrollRect.top - 10;
|
|
123
|
+
(0, _logger.getLogger)().debug('scrollToEl', newScrollTop);
|
|
124
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
125
|
+
if (scrollParent.scrollTo) {
|
|
126
|
+
scrollParent.scrollTo({
|
|
127
|
+
top: newScrollTop,
|
|
128
|
+
behavior: 'smooth'
|
|
129
|
+
});
|
|
130
|
+
} else {
|
|
131
|
+
scrollParent.scrollTop = newScrollTop;
|
|
128
132
|
}
|
|
129
|
-
|
|
130
|
-
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
scrollToElementAfterFocusTimeout = undefined;
|
|
136
|
+
}, KEYBOARD_ANIMATION_MS);
|
|
131
137
|
};
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Event handler for "focusin" event.
|
|
141
|
+
*
|
|
142
|
+
* "focusin" bubbles up from all focus events, so uses `isTextInput` to only react to "keyboard" focus events.
|
|
143
|
+
*
|
|
144
|
+
* Checks for external keyboard and scrolls to the focused element after any animations, e.g. keyboard open.
|
|
145
|
+
*
|
|
139
146
|
*/
|
|
140
|
-
const onFocusIn =
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
scrollToElementAfterFocus(e.target);
|
|
147
|
+
const onFocusIn = e => {
|
|
148
|
+
if (!e.target || !isTextInput(e.target)) return;
|
|
149
|
+
updateHasExternalKeyboardAfterFocus();
|
|
150
|
+
scrollToElementAfterFocus(e.target);
|
|
145
151
|
};
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
*
|
|
149
|
-
*
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
*
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Event handler for "focusout" event.
|
|
155
|
+
*
|
|
156
|
+
* "focusout" bubbles up from all focus events, so uses `isTextInput` to only react to "keyboard" focus events.
|
|
157
|
+
*
|
|
158
|
+
* Clears any pending timeouts from "focusin" events.
|
|
159
|
+
*
|
|
153
160
|
*/
|
|
154
|
-
const onFocusOut =
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
}
|
|
161
|
+
const onFocusOut = e => {
|
|
162
|
+
if (!e.target || !isTextInput(e.target)) return;
|
|
163
|
+
if (updateHasExternalKeyboardAfterFocusTimeout) {
|
|
164
|
+
window.clearTimeout(updateHasExternalKeyboardAfterFocusTimeout);
|
|
165
|
+
updateHasExternalKeyboardAfterFocusTimeout = undefined;
|
|
166
|
+
}
|
|
167
|
+
if (scrollToElementAfterFocusTimeout) {
|
|
168
|
+
window.clearTimeout(scrollToElementAfterFocusTimeout);
|
|
169
|
+
scrollToElementAfterFocusTimeout = undefined;
|
|
170
|
+
}
|
|
165
171
|
};
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
*
|
|
169
|
-
*
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Check if the device is using an external keyboard by appending an `input` and focusing it.
|
|
175
|
+
*
|
|
176
|
+
* This will trigger the `onFocusIn` event handler, which updates the `hasExternalKeyboard` global.
|
|
170
177
|
*/
|
|
171
178
|
const checkForExternalKeyboard = () => {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
179
|
+
const el = document.createElement('input');
|
|
180
|
+
el.type = 'text';
|
|
181
|
+
el.autofocus = true;
|
|
182
|
+
el.addEventListener('focusin', () => {
|
|
183
|
+
// remove the input after the keyboard has displayed, plus a small buffer
|
|
184
|
+
window.setTimeout(() => {
|
|
185
|
+
el.blur();
|
|
186
|
+
el.remove();
|
|
187
|
+
}, KEYBOARD_ANIMATION_MS + 100);
|
|
188
|
+
});
|
|
189
|
+
document.documentElement.append(el);
|
|
183
190
|
};
|
|
184
191
|
const setupMobileEventListeners = () => {
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
192
|
+
if (!isMobileDevice() || !visualViewport) return;
|
|
193
|
+
|
|
194
|
+
// set viewport height var at setup
|
|
195
|
+
setVisualViewportHeightVar();
|
|
196
|
+
|
|
197
|
+
// add event listeners
|
|
198
|
+
visualViewport.addEventListener('resize', () => {
|
|
188
199
|
setVisualViewportHeightVar();
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
checkForExternalKeyboard();
|
|
200
|
+
|
|
201
|
+
// keep the document element scrolled to the top if a ReactModal is open
|
|
202
|
+
if (document.body.classList.contains('ReactModal__Body--open')) {
|
|
203
|
+
document.documentElement.scrollTop = 0;
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
window.addEventListener('focusin', onFocusIn);
|
|
207
|
+
window.addEventListener('focusout', onFocusOut);
|
|
208
|
+
|
|
209
|
+
// check for external keyboard at setup
|
|
210
|
+
checkForExternalKeyboard();
|
|
201
211
|
};
|
|
202
212
|
exports.setupMobileEventListeners = setupMobileEventListeners;
|
|
213
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9nZ2VyIiwicmVxdWlyZSIsIktFWUJPQVJEX0FOSU1BVElPTl9NUyIsImdldFZlcnRpY2FsbHlTY3JvbGxhYmxlUGFyZW50IiwiZWxlbWVudCIsInN0eWxlIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImV4Y2x1ZGVTdGF0aWNQYXJlbnQiLCJwb3NpdGlvbiIsIm92ZXJmbG93UmVnZXgiLCJwYXJlbnQiLCJwYXJlbnRFbGVtZW50IiwidGVzdCIsIm92ZXJmbG93Iiwib3ZlcmZsb3dZIiwic2Nyb2xsSGVpZ2h0IiwiY2xpZW50SGVpZ2h0IiwiZG9jdW1lbnQiLCJzY3JvbGxpbmdFbGVtZW50IiwiZXhwb3J0cyIsImdldEZpcnN0UGFyZW50RWxlbWVudFdpdGhDbGFzc05hbWUiLCJjbGFzc05hbWUiLCJjbGFzc0xpc3QiLCJjb250YWlucyIsInVuZGVmaW5lZCIsImlzTW9iaWxlRGV2aWNlIiwibmF2aWdhdG9yIiwidXNlckFnZW50IiwibWF4VG91Y2hQb2ludHMiLCJoYXNFeHRlcm5hbEtleWJvYXJkIiwid2luZG93Iiwic2V0SGFzRXh0ZXJuYWxLZXlib2FyZCIsImdldExvZ2dlciIsImRlYnVnIiwid2luZG93V2l0aG91dFR5cGUiLCJzZXRWaXN1YWxWaWV3cG9ydEhlaWdodFZhciIsImhlaWdodCIsInZpc3VhbFZpZXdwb3J0IiwiZG9jdW1lbnRFbGVtZW50Iiwic2V0UHJvcGVydHkiLCJpc1RleHRJbnB1dCIsImVsIiwidGFnTmFtZSIsInRvTG93ZXJDYXNlIiwiaW5wdXRFbCIsInR5cGUiLCJpbmNsdWRlcyIsImNvbnRlbnRFZGl0YWJsZSIsInVwZGF0ZUhhc0V4dGVybmFsS2V5Ym9hcmRBZnRlckZvY3VzVGltZW91dCIsInNjcm9sbFRvRWxlbWVudEFmdGVyRm9jdXNUaW1lb3V0IiwidXBkYXRlSGFzRXh0ZXJuYWxLZXlib2FyZEFmdGVyRm9jdXMiLCJjbG9zZWRWaXN1YWxWaWV3cG9ydEhlaWdodCIsInNldFRpbWVvdXQiLCJrZXlib2FyZEhlaWdodCIsInNjcm9sbFRvRWxlbWVudEFmdGVyRm9jdXMiLCJzY3JvbGxQYXJlbnQiLCJzY3JvbGxSZWN0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwicmVjdCIsImJvdHRvbSIsInRvcCIsIm5ld1Njcm9sbFRvcCIsInNjcm9sbFRvcCIsInNjcm9sbFRvIiwiYmVoYXZpb3IiLCJvbkZvY3VzSW4iLCJlIiwidGFyZ2V0Iiwib25Gb2N1c091dCIsImNsZWFyVGltZW91dCIsImNoZWNrRm9yRXh0ZXJuYWxLZXlib2FyZCIsImNyZWF0ZUVsZW1lbnQiLCJhdXRvZm9jdXMiLCJhZGRFdmVudExpc3RlbmVyIiwiYmx1ciIsInJlbW92ZSIsImFwcGVuZCIsInNldHVwTW9iaWxlRXZlbnRMaXN0ZW5lcnMiLCJib2R5Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2RvbS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlcidcclxuXHJcbmNvbnN0IEtFWUJPQVJEX0FOSU1BVElPTl9NUyA9IDI1MFxyXG5cclxuLyoqXHJcbiAqIEdldCB0aGUgbmVhcmVzdCB2ZXJ0aWNhbGx5IHNjcm9sbGFibGUgcGFyZW50IG9mIGFuIGVsZW1lbnRcclxuICogQHBhcmFtIHsgSFRNTEVsZW1lbnQgfSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgd2l0aFxyXG4gKiBAcmV0dXJucyBUaGUgbmVhcmVzdCB2ZXJ0aWNhbGx5IHNjcm9sbGFibGUgcGFyZW50IGVsZW1lbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBnZXRWZXJ0aWNhbGx5U2Nyb2xsYWJsZVBhcmVudCA9IChlbGVtZW50OiBIVE1MRWxlbWVudCkgPT4ge1xyXG5cdGxldCBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudClcclxuXHRjb25zdCBleGNsdWRlU3RhdGljUGFyZW50ID0gc3R5bGUucG9zaXRpb24gPT09ICdhYnNvbHV0ZSdcclxuXHRjb25zdCBvdmVyZmxvd1JlZ2V4ID0gLyhhdXRvfHNjcm9sbHxoaWRkZW4pL1xyXG5cclxuXHRmb3IgKGxldCBwYXJlbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IGVsZW1lbnQ7IChwYXJlbnQgPSBwYXJlbnQucGFyZW50RWxlbWVudCk7ICkge1xyXG5cdFx0c3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHBhcmVudClcclxuXHRcdGlmIChleGNsdWRlU3RhdGljUGFyZW50ICYmIHN0eWxlLnBvc2l0aW9uID09PSAnc3RhdGljJykgY29udGludWVcclxuXHRcdGlmIChvdmVyZmxvd1JlZ2V4LnRlc3Qoc3R5bGUub3ZlcmZsb3cgKyBzdHlsZS5vdmVyZmxvd1kpICYmIHBhcmVudC5zY3JvbGxIZWlnaHQgPiBwYXJlbnQuY2xpZW50SGVpZ2h0KVxyXG5cdFx0XHRyZXR1cm4gcGFyZW50XHJcblx0fVxyXG5cdHJldHVybiBkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgdGhlIGZpcnN0IHBhcmVudCB0aGF0IGhhcyB0aGUgZ2l2ZW4gY2xhc3NOYW1lIGluIGl0cyBjbGFzc0xpc3RcclxuICogQHBhcmFtIGVsZW1lbnQgVGhlIHRhcmdldCBlbGVtZW50XHJcbiAqIEBwYXJhbSBjbGFzc05hbWUgVGhlIGNsYXNzTmFtZSB0byBtYXRjaFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdldEZpcnN0UGFyZW50RWxlbWVudFdpdGhDbGFzc05hbWUgPSAoZWxlbWVudDogSFRNTEVsZW1lbnQsIGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XHJcblx0Zm9yIChsZXQgcGFyZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBlbGVtZW50OyAocGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQpOyApIHtcclxuXHRcdGlmIChwYXJlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSkpIHJldHVybiBwYXJlbnRcclxuXHR9XHJcblx0cmV0dXJuIHVuZGVmaW5lZFxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJuIHdoZXRoZXIgdGhlIGRldmljZSBiZWluZyB1c2VkIGlzIG9uZSBvZiBzZXZlcmFsIG1haW5zdHJlYW0gbW9iaWxlIGRldmljZXNcclxuICovXHJcbmV4cG9ydCBjb25zdCBpc01vYmlsZURldmljZSA9ICgpID0+IHtcclxuXHRyZXR1cm4gKFxyXG5cdFx0L2FuZHJvaWR8aXBhZHxpcG9kfGlwaG9uZS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgfHxcclxuXHRcdCgvbWFjaW50b3NoL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMpXHJcblx0KVxyXG59XHJcblxyXG4vKiogUmV0dXJuIHdoZXRoZXIgdGhlIGRldmljZSBpcyB1c2luZyBhbiBleHRlcm5hbCBrZXlib2FyZCB2cy4gdGhlIG5hdGl2ZSBvbi1zY3JlZW4gT1Mga2V5Ym9hcmQuICovXHJcbmV4cG9ydCBjb25zdCBoYXNFeHRlcm5hbEtleWJvYXJkID0gKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQgPT4gKHdpbmRvdyBhcyBhbnkpLmhhc0V4dGVybmFsS2V5Ym9hcmRcclxuXHJcbi8qKlxyXG4gKiBTZXRzIGB3aW5kb3cuaGFzRXh0ZXJuYWxLZXlib2FyZGAsIHJldHVybmVkIGJ5IGBoYXNFeHRlcm5hbEtleWJvYXJkYC5cclxuICovXHJcbmNvbnN0IHNldEhhc0V4dGVybmFsS2V5Ym9hcmQgPSAoaGFzRXh0ZXJuYWxLZXlib2FyZDogYm9vbGVhbikgPT4ge1xyXG5cdGdldExvZ2dlcigpLmRlYnVnKCdoYXNFeHRlcm5hbEtleWJvYXJkJywgaGFzRXh0ZXJuYWxLZXlib2FyZClcclxuXHRjb25zdCB3aW5kb3dXaXRob3V0VHlwZSA9IHdpbmRvdyBhcyBhbnlcclxuXHR3aW5kb3dXaXRob3V0VHlwZS5oYXNFeHRlcm5hbEtleWJvYXJkID0gaGFzRXh0ZXJuYWxLZXlib2FyZFxyXG59XHJcblxyXG4vKipcclxuICogMTAwdmggaXMga2luZCBvZiBi4oqYcmtlZCBvbiBtb2JpbGUgc2FmYXJpLCB3ZSBoYXZlIHRvIHNldCBpdCBwcm9ncmFtbWF0aWNhbGx5IGhlcmVcclxuICogc28gd2UgY2FuIGNhbGN1bGF0ZSBkZXZpY2UtaW5kZXBlbmRlbnQgdmlld3BvcnQgaGVpZ2h0c1xyXG4gKiBodHRwczovL2FsbHRoaW5nc3NtaXR0eS5jb20vMjAyMC8wNS8xMS9jc3MtZml4LWZvci0xMDB2aC1pbi1tb2JpbGUtd2Via2l0L1xyXG4gKlxyXG4gKiBTZXRzIHRoZSBDU1MgdmFyaWFibGUgYC0tdmlzdWFsLXZpZXdwb3J0LWhlaWdodGAgb24gdGhlIGBkb2N1bWVudEVsZW1lbnRgLzxodG1sPi5cclxuICpcclxuICovXHJcbmNvbnN0IHNldFZpc3VhbFZpZXdwb3J0SGVpZ2h0VmFyID0gKCkgPT4ge1xyXG5cdGNvbnN0IGhlaWdodCA9IHZpc3VhbFZpZXdwb3J0ID8gdmlzdWFsVmlld3BvcnQuaGVpZ2h0IDogMFxyXG5cdGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS12aXN1YWwtdmlld3BvcnQtaGVpZ2h0JywgYCR7aGVpZ2h0fXB4YClcclxufVxyXG5cclxuLyoqXHJcbiAqIElzIHRoZSBnaXZlbiBlbGVtZW50IGNhcGFibGUgb2YgdGV4dCBpbnB1dD9cclxuICpcclxuICogQHBhcmFtIGVsIEFuIEhUTUwgZWxlbWVudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGlzVGV4dElucHV0ID0gKGVsOiBIVE1MRWxlbWVudCkgPT4ge1xyXG5cdGNvbnN0IHRhZ05hbWUgPSBlbC50YWdOYW1lICYmIGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKVxyXG5cdGlmICh0YWdOYW1lID09PSAndGV4dGFyZWEnKSByZXR1cm4gdHJ1ZVxyXG5cdGlmICh0YWdOYW1lID09PSAnaW5wdXQnKSB7XHJcblx0XHRjb25zdCBpbnB1dEVsID0gZWwgYXMgSFRNTElucHV0RWxlbWVudFxyXG5cdFx0cmV0dXJuIGlucHV0RWwudHlwZSAhPT0gJ2J1dHRvbicgJiYgaW5wdXRFbC50eXBlICE9PSAncmFkaW8nICYmIGlucHV0RWwudHlwZSAhPT0gJ2NoZWNrYm94J1xyXG5cdH1cclxuXHQvLyBRdWlsbCBlZGl0b3JcclxuXHRyZXR1cm4gdGFnTmFtZSA9PT0gJ2RpdicgJiYgZWwuY2xhc3NOYW1lLmluY2x1ZGVzKCdxbC1lZGl0b3InKSAmJiBlbC5jb250ZW50RWRpdGFibGUgPT09ICd0cnVlJ1xyXG59XHJcblxyXG5sZXQgdXBkYXRlSGFzRXh0ZXJuYWxLZXlib2FyZEFmdGVyRm9jdXNUaW1lb3V0OiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcclxubGV0IHNjcm9sbFRvRWxlbWVudEFmdGVyRm9jdXNUaW1lb3V0OiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcclxuXHJcbmNvbnN0IHVwZGF0ZUhhc0V4dGVybmFsS2V5Ym9hcmRBZnRlckZvY3VzID0gKCkgPT4ge1xyXG5cdGNvbnN0IGNsb3NlZFZpc3VhbFZpZXdwb3J0SGVpZ2h0ID0gdmlzdWFsVmlld3BvcnQgPyB2aXN1YWxWaWV3cG9ydC5oZWlnaHQgOiAwXHJcblx0Ly8gd2FpdCBmb3IgdGhlIGtleWJvYXJkIGFuaW1hdGlvblxyXG5cdHVwZGF0ZUhhc0V4dGVybmFsS2V5Ym9hcmRBZnRlckZvY3VzVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdC8vIGZpbmQgdGhlIGtleWJvYXJkIGhlaWdodCBiYXNlZCBvbiB0aGUgZGlmZmVyZW5jZSBpbiB2aWV3cG9ydCBoZWlnaHRcclxuXHRcdGNvbnN0IGtleWJvYXJkSGVpZ2h0ID0gY2xvc2VkVmlzdWFsVmlld3BvcnRIZWlnaHQgLSAodmlzdWFsVmlld3BvcnQgPyB2aXN1YWxWaWV3cG9ydC5oZWlnaHQgOiAwKVxyXG5cdFx0Ly8gb24gZmlyc3QtbG9hZCB0aGUgaW5wdXQgZm9jdXMgY2FuIGZhaWxcclxuXHRcdC8vIHdoZW4gdGhpcyBoYXBwZW5zIHRoZSBoZWlnaHQgaXMgMCwgYW5kIHRoaXMgT05MWSBoYXBwZW5zIHdoZW4gdGhlcmUgaXMgTk9UIGFuIGV4dGVybmFsIGtleWJvYXJkXHJcblx0XHRpZiAoa2V5Ym9hcmRIZWlnaHQgPT09IDAgJiYgaGFzRXh0ZXJuYWxLZXlib2FyZCgpID09PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0c2V0SGFzRXh0ZXJuYWxLZXlib2FyZChmYWxzZSlcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdC8vIGlmIHRoZSBrZXlib2FyZCBoZWlnaHQgaXMgZ3JlYXRlciB0aGFuIDEwMCwgdGhhdCBtZWFucyB0aGUgZnVsbCBvbnNjcmVlbiBrZXlib2FyZCBkaXNwbGF5ZWRcclxuXHRcdFx0Ly8gb3RoZXJ3aXNlLCBvbmx5IHRoZSBzbWFsbCBjb250ZXh0IG1lbnUgZGlzcGxheWVkLCBtZWFuaW5nIHRoZXJlIGlzIGFuIGV4dGVybmFsIGtleWJvYXJkXHJcblx0XHRcdHNldEhhc0V4dGVybmFsS2V5Ym9hcmQoa2V5Ym9hcmRIZWlnaHQgPCAxMDApXHJcblx0XHR9XHJcblxyXG5cdFx0dXBkYXRlSGFzRXh0ZXJuYWxLZXlib2FyZEFmdGVyRm9jdXNUaW1lb3V0ID0gdW5kZWZpbmVkXHJcblx0fSwgS0VZQk9BUkRfQU5JTUFUSU9OX01TKVxyXG59XHJcblxyXG5jb25zdCBzY3JvbGxUb0VsZW1lbnRBZnRlckZvY3VzID0gKGVsOiBIVE1MRWxlbWVudCkgPT4ge1xyXG5cdC8vIHdhaXQgZm9yIHRoZSBrZXlib2FyZCBhbmltYXRpb25cclxuXHRzY3JvbGxUb0VsZW1lbnRBZnRlckZvY3VzVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdC8vIGFmdGVyIHRoZSBrZXlib2FyZCBpcyBvcGVuLCBjaGVjayBmb3IgdGhlIGVs4oCZcyBzY3JvbGxhYmxlIHBhcmVudCwgYXMgaXQgY291bGQgaGF2ZSBqdXN0IGJlY29tZSBzY3JvbGxhYmxlXHJcblx0XHRjb25zdCBzY3JvbGxQYXJlbnQgPSBnZXRWZXJ0aWNhbGx5U2Nyb2xsYWJsZVBhcmVudChlbClcclxuXHRcdC8vIGlmIHRoZSBlbCBoYXMgYSBzY3JvbGxhYmxlIHBhcmVudCBvdGhlciB0aGFuIHRoZSBkb2N1bWVudCwgc2Nyb2xsIGl0IGJhY2sgaW50byB2aWV3XHJcblx0XHRpZiAoc2Nyb2xsUGFyZW50ICYmIHNjcm9sbFBhcmVudCAhPT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XHJcblx0XHRcdGNvbnN0IHNjcm9sbFJlY3QgPSBzY3JvbGxQYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcclxuXHRcdFx0Y29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXHJcblx0XHRcdC8vIG9ubHkgc2Nyb2xsIGludG8gdmlldyBpZiBvdXRzaWRlIG9mIHRoZSBzY3JvbGwgcGFyZW50IGJvdW5kc1xyXG5cdFx0XHRpZiAocmVjdC5ib3R0b20gPCBzY3JvbGxSZWN0LnRvcCB8fCByZWN0LnRvcCA+IHNjcm9sbFJlY3QuYm90dG9tKSB7XHJcblx0XHRcdFx0Y29uc3QgbmV3U2Nyb2xsVG9wID0gc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCArIHJlY3QudG9wIC0gc2Nyb2xsUmVjdC50b3AgLSAxMFxyXG5cdFx0XHRcdGdldExvZ2dlcigpLmRlYnVnKCdzY3JvbGxUb0VsJywgbmV3U2Nyb2xsVG9wKVxyXG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXHJcblx0XHRcdFx0aWYgKHNjcm9sbFBhcmVudC5zY3JvbGxUbykge1xyXG5cdFx0XHRcdFx0c2Nyb2xsUGFyZW50LnNjcm9sbFRvKHsgdG9wOiBuZXdTY3JvbGxUb3AsIGJlaGF2aW9yOiAnc21vb3RoJyB9KVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRzY3JvbGxQYXJlbnQuc2Nyb2xsVG9wID0gbmV3U2Nyb2xsVG9wXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0c2Nyb2xsVG9FbGVtZW50QWZ0ZXJGb2N1c1RpbWVvdXQgPSB1bmRlZmluZWRcclxuXHR9LCBLRVlCT0FSRF9BTklNQVRJT05fTVMpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFdmVudCBoYW5kbGVyIGZvciBcImZvY3VzaW5cIiBldmVudC5cclxuICpcclxuICogXCJmb2N1c2luXCIgYnViYmxlcyB1cCBmcm9tIGFsbCBmb2N1cyBldmVudHMsIHNvIHVzZXMgYGlzVGV4dElucHV0YCB0byBvbmx5IHJlYWN0IHRvIFwia2V5Ym9hcmRcIiBmb2N1cyBldmVudHMuXHJcbiAqXHJcbiAqIENoZWNrcyBmb3IgZXh0ZXJuYWwga2V5Ym9hcmQgYW5kIHNjcm9sbHMgdG8gdGhlIGZvY3VzZWQgZWxlbWVudCBhZnRlciBhbnkgYW5pbWF0aW9ucywgZS5nLiBrZXlib2FyZCBvcGVuLlxyXG4gKlxyXG4gKi9cclxuY29uc3Qgb25Gb2N1c0luID0gKGU6IEV2ZW50KSA9PiB7XHJcblx0aWYgKCFlLnRhcmdldCB8fCAhaXNUZXh0SW5wdXQoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpKSByZXR1cm5cclxuXHR1cGRhdGVIYXNFeHRlcm5hbEtleWJvYXJkQWZ0ZXJGb2N1cygpXHJcblx0c2Nyb2xsVG9FbGVtZW50QWZ0ZXJGb2N1cyhlLnRhcmdldCBhcyBIVE1MRWxlbWVudClcclxufVxyXG5cclxuLyoqXHJcbiAqIEV2ZW50IGhhbmRsZXIgZm9yIFwiZm9jdXNvdXRcIiBldmVudC5cclxuICpcclxuICogXCJmb2N1c291dFwiIGJ1YmJsZXMgdXAgZnJvbSBhbGwgZm9jdXMgZXZlbnRzLCBzbyB1c2VzIGBpc1RleHRJbnB1dGAgdG8gb25seSByZWFjdCB0byBcImtleWJvYXJkXCIgZm9jdXMgZXZlbnRzLlxyXG4gKlxyXG4gKiBDbGVhcnMgYW55IHBlbmRpbmcgdGltZW91dHMgZnJvbSBcImZvY3VzaW5cIiBldmVudHMuXHJcbiAqXHJcbiAqL1xyXG5jb25zdCBvbkZvY3VzT3V0ID0gKGU6IEV2ZW50KSA9PiB7XHJcblx0aWYgKCFlLnRhcmdldCB8fCAhaXNUZXh0SW5wdXQoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpKSByZXR1cm5cclxuXHRpZiAodXBkYXRlSGFzRXh0ZXJuYWxLZXlib2FyZEFmdGVyRm9jdXNUaW1lb3V0KSB7XHJcblx0XHR3aW5kb3cuY2xlYXJUaW1lb3V0KHVwZGF0ZUhhc0V4dGVybmFsS2V5Ym9hcmRBZnRlckZvY3VzVGltZW91dClcclxuXHRcdHVwZGF0ZUhhc0V4dGVybmFsS2V5Ym9hcmRBZnRlckZvY3VzVGltZW91dCA9IHVuZGVmaW5lZFxyXG5cdH1cclxuXHRpZiAoc2Nyb2xsVG9FbGVtZW50QWZ0ZXJGb2N1c1RpbWVvdXQpIHtcclxuXHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoc2Nyb2xsVG9FbGVtZW50QWZ0ZXJGb2N1c1RpbWVvdXQpXHJcblx0XHRzY3JvbGxUb0VsZW1lbnRBZnRlckZvY3VzVGltZW91dCA9IHVuZGVmaW5lZFxyXG5cdH1cclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrIGlmIHRoZSBkZXZpY2UgaXMgdXNpbmcgYW4gZXh0ZXJuYWwga2V5Ym9hcmQgYnkgYXBwZW5kaW5nIGFuIGBpbnB1dGAgYW5kIGZvY3VzaW5nIGl0LlxyXG4gKlxyXG4gKiBUaGlzIHdpbGwgdHJpZ2dlciB0aGUgYG9uRm9jdXNJbmAgZXZlbnQgaGFuZGxlciwgd2hpY2ggdXBkYXRlcyB0aGUgYGhhc0V4dGVybmFsS2V5Ym9hcmRgIGdsb2JhbC5cclxuICovXHJcbmNvbnN0IGNoZWNrRm9yRXh0ZXJuYWxLZXlib2FyZCA9ICgpID0+IHtcclxuXHRjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JylcclxuXHRlbC50eXBlID0gJ3RleHQnXHJcblx0ZWwuYXV0b2ZvY3VzID0gdHJ1ZVxyXG5cdGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCAoKSA9PiB7XHJcblx0XHQvLyByZW1vdmUgdGhlIGlucHV0IGFmdGVyIHRoZSBrZXlib2FyZCBoYXMgZGlzcGxheWVkLCBwbHVzIGEgc21hbGwgYnVmZmVyXHJcblx0XHR3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdGVsLmJsdXIoKVxyXG5cdFx0XHRlbC5yZW1vdmUoKVxyXG5cdFx0fSwgS0VZQk9BUkRfQU5JTUFUSU9OX01TICsgMTAwKVxyXG5cdH0pXHJcblx0ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZChlbClcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHNldHVwTW9iaWxlRXZlbnRMaXN0ZW5lcnMgPSAoKSA9PiB7XHJcblx0aWYgKCFpc01vYmlsZURldmljZSgpIHx8ICF2aXN1YWxWaWV3cG9ydCkgcmV0dXJuXHJcblxyXG5cdC8vIHNldCB2aWV3cG9ydCBoZWlnaHQgdmFyIGF0IHNldHVwXHJcblx0c2V0VmlzdWFsVmlld3BvcnRIZWlnaHRWYXIoKVxyXG5cclxuXHQvLyBhZGQgZXZlbnQgbGlzdGVuZXJzXHJcblx0dmlzdWFsVmlld3BvcnQuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4ge1xyXG5cdFx0c2V0VmlzdWFsVmlld3BvcnRIZWlnaHRWYXIoKVxyXG5cclxuXHRcdC8vIGtlZXAgdGhlIGRvY3VtZW50IGVsZW1lbnQgc2Nyb2xsZWQgdG8gdGhlIHRvcCBpZiBhIFJlYWN0TW9kYWwgaXMgb3BlblxyXG5cdFx0aWYgKGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCdSZWFjdE1vZGFsX19Cb2R5LS1vcGVuJykpIHtcclxuXHRcdFx0ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA9IDBcclxuXHRcdH1cclxuXHR9KVxyXG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgb25Gb2N1c0luKVxyXG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG9uRm9jdXNPdXQpXHJcblxyXG5cdC8vIGNoZWNrIGZvciBleHRlcm5hbCBrZXlib2FyZCBhdCBzZXR1cFxyXG5cdGNoZWNrRm9yRXh0ZXJuYWxLZXlib2FyZCgpXHJcbn1cclxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxP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
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getDomainIdentifierTypeString = exports.getDomainIdentifierTypePluralString = void 0;
|
|
7
|
+
var _shard = require("./shard");
|
|
8
|
+
const getDomainIdentifierTypeString = () => (0, _shard.isPurdueShard)() ? 'Purdue career account alias or PUID' : 'Email Address';
|
|
6
9
|
exports.getDomainIdentifierTypeString = getDomainIdentifierTypeString;
|
|
7
|
-
const getDomainIdentifierTypePluralString = () => (0,
|
|
10
|
+
const getDomainIdentifierTypePluralString = () => (0, _shard.isPurdueShard)() ? 'Purdue career account aliases or PUIDs' : 'Email Addresses';
|
|
8
11
|
exports.getDomainIdentifierTypePluralString = getDomainIdentifierTypePluralString;
|
|
12
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc2hhcmQiLCJyZXF1aXJlIiwiZ2V0RG9tYWluSWRlbnRpZmllclR5cGVTdHJpbmciLCJpc1B1cmR1ZVNoYXJkIiwiZXhwb3J0cyIsImdldERvbWFpbklkZW50aWZpZXJUeXBlUGx1cmFsU3RyaW5nIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2RvbWFpbklkZW50aWZpZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNQdXJkdWVTaGFyZCB9IGZyb20gJy4vc2hhcmQnXHJcblxyXG5leHBvcnQgY29uc3QgZ2V0RG9tYWluSWRlbnRpZmllclR5cGVTdHJpbmcgPSAoKSA9PlxyXG5cdGlzUHVyZHVlU2hhcmQoKSA/ICdQdXJkdWUgY2FyZWVyIGFjY291bnQgYWxpYXMgb3IgUFVJRCcgOiAnRW1haWwgQWRkcmVzcydcclxuXHJcbmV4cG9ydCBjb25zdCBnZXREb21haW5JZGVudGlmaWVyVHlwZVBsdXJhbFN0cmluZyA9ICgpID0+XHJcblx0aXNQdXJkdWVTaGFyZCgpID8gJ1B1cmR1ZSBjYXJlZXIgYWNjb3VudCBhbGlhc2VzIG9yIFBVSURzJyA6ICdFbWFpbCBBZGRyZXNzZXMnXHJcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBRU8sTUFBTUMsNkJBQTZCLEdBQUdBLENBQUEsS0FDNUMsSUFBQUMsb0JBQWEsRUFBQyxDQUFDLEdBQUcscUNBQXFDLEdBQUcsZUFBZTtBQUFBQyxPQUFBLENBQUFGLDZCQUFBLEdBQUFBLDZCQUFBO0FBRW5FLE1BQU1HLG1DQUFtQyxHQUFHQSxDQUFBLEtBQ2xELElBQUFGLG9CQUFhLEVBQUMsQ0FBQyxHQUFHLHdDQUF3QyxHQUFHLGlCQUFpQjtBQUFBQyxPQUFBLENBQUFDLG1DQUFBLEdBQUFBLG1DQUFBIiwiaWdub3JlTGlzdCI6W119
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
3
6
|
exports.getRootModelName = void 0;
|
|
4
|
-
const getRootModelName =
|
|
7
|
+
const getRootModelName = props => props.modelName.split('.').slice(0, -1).join('.');
|
|
5
8
|
exports.getRootModelName = getRootModelName;
|
|
9
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRSb290TW9kZWxOYW1lIiwicHJvcHMiLCJtb2RlbE5hbWUiLCJzcGxpdCIsInNsaWNlIiwiam9pbiIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvZW50aXR5VXNlclJvbGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IGdldFJvb3RNb2RlbE5hbWUgPSAocHJvcHM6IHsgbW9kZWxOYW1lOiBzdHJpbmcgfSkgPT4gcHJvcHMubW9kZWxOYW1lLnNwbGl0KCcuJykuc2xpY2UoMCwgLTEpLmpvaW4oJy4nKVxyXG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFPLE1BQU1BLGdCQUFnQixHQUFJQyxLQUE0QixJQUFLQSxLQUFLLENBQUNDLFNBQVMsQ0FBQ0MsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUNDLElBQUksQ0FBQyxHQUFHLENBQUM7QUFBQUMsT0FBQSxDQUFBTixnQkFBQSxHQUFBQSxnQkFBQSIsImlnbm9yZUxpc3QiOltdfQ==
|
package/lib/utils/error.js
CHANGED
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
3
6
|
exports.constructErrorFromCaughtError = void 0;
|
|
4
7
|
const constructErrorFromCaughtError = (caughtError, name, message) => {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
return error;
|
|
8
|
+
const error = new Error(message);
|
|
9
|
+
error.name = name;
|
|
10
|
+
if (caughtError instanceof Error) {
|
|
11
|
+
error.message += `${message ? '.\n' : ''}${caughtError.name !== 'Error' ? `${caughtError.name}: ` : ''}${caughtError.message}`;
|
|
12
|
+
error.stack = caughtError.stack;
|
|
13
|
+
// TODO: use `new Error(message, { cause: caughtError })` once we upgrade TS to allow es2022
|
|
14
|
+
} else if (typeof caughtError === 'string') {
|
|
15
|
+
error.message += `${message ? '.\n' : ''}${caughtError}`;
|
|
16
|
+
} else if (caughtError && typeof caughtError === 'object') {
|
|
17
|
+
error.message += `${message ? '.\n' : ''}${JSON.stringify(caughtError)}`;
|
|
18
|
+
}
|
|
19
|
+
return error;
|
|
19
20
|
};
|
|
20
21
|
exports.constructErrorFromCaughtError = constructErrorFromCaughtError;
|
|
22
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb25zdHJ1Y3RFcnJvckZyb21DYXVnaHRFcnJvciIsImNhdWdodEVycm9yIiwibmFtZSIsIm1lc3NhZ2UiLCJlcnJvciIsIkVycm9yIiwic3RhY2siLCJKU09OIiwic3RyaW5naWZ5IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9lcnJvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgY29uc3RydWN0RXJyb3JGcm9tQ2F1Z2h0RXJyb3IgPSAoY2F1Z2h0RXJyb3I6IHVua25vd24sIG5hbWU6IHN0cmluZywgbWVzc2FnZT86IHN0cmluZykgPT4ge1xyXG5cdGNvbnN0IGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpXHJcblx0ZXJyb3IubmFtZSA9IG5hbWVcclxuXHRpZiAoY2F1Z2h0RXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xyXG5cdFx0ZXJyb3IubWVzc2FnZSArPSBgJHttZXNzYWdlID8gJy5cXG4nIDogJyd9JHtjYXVnaHRFcnJvci5uYW1lICE9PSAnRXJyb3InID8gYCR7Y2F1Z2h0RXJyb3IubmFtZX06IGAgOiAnJ30ke1xyXG5cdFx0XHRjYXVnaHRFcnJvci5tZXNzYWdlXHJcblx0XHR9YFxyXG5cdFx0ZXJyb3Iuc3RhY2sgPSBjYXVnaHRFcnJvci5zdGFja1xyXG5cdFx0Ly8gVE9ETzogdXNlIGBuZXcgRXJyb3IobWVzc2FnZSwgeyBjYXVzZTogY2F1Z2h0RXJyb3IgfSlgIG9uY2Ugd2UgdXBncmFkZSBUUyB0byBhbGxvdyBlczIwMjJcclxuXHR9IGVsc2UgaWYgKHR5cGVvZiBjYXVnaHRFcnJvciA9PT0gJ3N0cmluZycpIHtcclxuXHRcdGVycm9yLm1lc3NhZ2UgKz0gYCR7bWVzc2FnZSA/ICcuXFxuJyA6ICcnfSR7Y2F1Z2h0RXJyb3J9YFxyXG5cdH0gZWxzZSBpZiAoY2F1Z2h0RXJyb3IgJiYgdHlwZW9mIGNhdWdodEVycm9yID09PSAnb2JqZWN0Jykge1xyXG5cdFx0ZXJyb3IubWVzc2FnZSArPSBgJHttZXNzYWdlID8gJy5cXG4nIDogJyd9JHtKU09OLnN0cmluZ2lmeShjYXVnaHRFcnJvcil9YFxyXG5cdH1cclxuXHRyZXR1cm4gZXJyb3JcclxufVxyXG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFPLE1BQU1BLDZCQUE2QixHQUFHQSxDQUFDQyxXQUFvQixFQUFFQyxJQUFZLEVBQUVDLE9BQWdCLEtBQUs7RUFDdEcsTUFBTUMsS0FBSyxHQUFHLElBQUlDLEtBQUssQ0FBQ0YsT0FBTyxDQUFDO0VBQ2hDQyxLQUFLLENBQUNGLElBQUksR0FBR0EsSUFBSTtFQUNqQixJQUFJRCxXQUFXLFlBQVlJLEtBQUssRUFBRTtJQUNqQ0QsS0FBSyxDQUFDRCxPQUFPLElBQUksR0FBR0EsT0FBTyxHQUFHLEtBQUssR0FBRyxFQUFFLEdBQUdGLFdBQVcsQ0FBQ0MsSUFBSSxLQUFLLE9BQU8sR0FBRyxHQUFHRCxXQUFXLENBQUNDLElBQUksSUFBSSxHQUFHLEVBQUUsR0FDckdELFdBQVcsQ0FBQ0UsT0FBTyxFQUNsQjtJQUNGQyxLQUFLLENBQUNFLEtBQUssR0FBR0wsV0FBVyxDQUFDSyxLQUFLO0lBQy9CO0VBQ0QsQ0FBQyxNQUFNLElBQUksT0FBT0wsV0FBVyxLQUFLLFFBQVEsRUFBRTtJQUMzQ0csS0FBSyxDQUFDRCxPQUFPLElBQUksR0FBR0EsT0FBTyxHQUFHLEtBQUssR0FBRyxFQUFFLEdBQUdGLFdBQVcsRUFBRTtFQUN6RCxDQUFDLE1BQU0sSUFBSUEsV0FBVyxJQUFJLE9BQU9BLFdBQVcsS0FBSyxRQUFRLEVBQUU7SUFDMURHLEtBQUssQ0FBQ0QsT0FBTyxJQUFJLEdBQUdBLE9BQU8sR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHSSxJQUFJLENBQUNDLFNBQVMsQ0FBQ1AsV0FBVyxDQUFDLEVBQUU7RUFDekU7RUFDQSxPQUFPRyxLQUFLO0FBQ2IsQ0FBQztBQUFBSyxPQUFBLENBQUFULDZCQUFBLEdBQUFBLDZCQUFBIiwiaWdub3JlTGlzdCI6W119
|
package/lib/utils/events.js
CHANGED
|
@@ -1,36 +1,45 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
3
7
|
exports.trackCustomEvent = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
*
|
|
9
|
-
* @param event
|
|
8
|
+
var _reactGa = _interopRequireDefault(require("react-ga4"));
|
|
9
|
+
var _constants = require("../constants");
|
|
10
|
+
/**
|
|
11
|
+
* Send an event to Google Analytics and App Insights
|
|
12
|
+
* @param event
|
|
10
13
|
*/
|
|
11
|
-
const trackCustomEvent =
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
14
|
+
const trackCustomEvent = event => {
|
|
15
|
+
const {
|
|
16
|
+
eventName,
|
|
17
|
+
category,
|
|
18
|
+
action,
|
|
19
|
+
label
|
|
20
|
+
} = event;
|
|
21
|
+
const userId = (0, _constants.getUserId)();
|
|
22
|
+
const appConfig = (0, _constants.getAppConfig)();
|
|
23
|
+
if (appConfig.GOOGLE_ANALYTICS_TRACKING_ID) {
|
|
24
|
+
_reactGa.default.event(eventName, {
|
|
25
|
+
event_category: category,
|
|
26
|
+
action: action,
|
|
27
|
+
event_label: label,
|
|
28
|
+
user_id: userId
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
if (appConfig.APP_INSIGHTS_CONNECTION_STRING) {
|
|
32
|
+
const appInsights = (0, _constants.getAppInsights)();
|
|
33
|
+
appInsights.trackEvent({
|
|
34
|
+
name: eventName,
|
|
35
|
+
properties: {
|
|
36
|
+
category: category,
|
|
37
|
+
action: action,
|
|
38
|
+
label: label,
|
|
39
|
+
userId: userId
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
35
43
|
};
|
|
36
44
|
exports.trackCustomEvent = trackCustomEvent;
|
|
45
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3RHYSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2NvbnN0YW50cyIsInRyYWNrQ3VzdG9tRXZlbnQiLCJldmVudCIsImV2ZW50TmFtZSIsImNhdGVnb3J5IiwiYWN0aW9uIiwibGFiZWwiLCJ1c2VySWQiLCJnZXRVc2VySWQiLCJhcHBDb25maWciLCJnZXRBcHBDb25maWciLCJHT09HTEVfQU5BTFlUSUNTX1RSQUNLSU5HX0lEIiwiZ2EiLCJldmVudF9jYXRlZ29yeSIsImV2ZW50X2xhYmVsIiwidXNlcl9pZCIsIkFQUF9JTlNJR0hUU19DT05ORUNUSU9OX1NUUklORyIsImFwcEluc2lnaHRzIiwiZ2V0QXBwSW5zaWdodHMiLCJ0cmFja0V2ZW50IiwibmFtZSIsInByb3BlcnRpZXMiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2V2ZW50cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZ2EgZnJvbSAncmVhY3QtZ2E0J1xyXG5pbXBvcnQgeyBnZXRBcHBDb25maWcsIGdldEFwcEluc2lnaHRzLCBnZXRVc2VySWQgfSBmcm9tICcuLi9jb25zdGFudHMnXHJcbmltcG9ydCB7IEN1c3RvbUV2ZW50IH0gZnJvbSAnLi4vdHlwZXMvRXZlbnQnXHJcblxyXG4vKipcclxuICogU2VuZCBhbiBldmVudCB0byBHb29nbGUgQW5hbHl0aWNzIGFuZCBBcHAgSW5zaWdodHNcclxuICogQHBhcmFtIGV2ZW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdHJhY2tDdXN0b21FdmVudCA9IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHtcclxuXHRjb25zdCB7IGV2ZW50TmFtZSwgY2F0ZWdvcnksIGFjdGlvbiwgbGFiZWwgfSA9IGV2ZW50XHJcblx0Y29uc3QgdXNlcklkID0gZ2V0VXNlcklkKClcclxuXHRjb25zdCBhcHBDb25maWcgPSBnZXRBcHBDb25maWcoKVxyXG5cdGlmIChhcHBDb25maWcuR09PR0xFX0FOQUxZVElDU19UUkFDS0lOR19JRCkge1xyXG5cdFx0Z2EuZXZlbnQoZXZlbnROYW1lLCB7XHJcblx0XHRcdGV2ZW50X2NhdGVnb3J5OiBjYXRlZ29yeSxcclxuXHRcdFx0YWN0aW9uOiBhY3Rpb24sXHJcblx0XHRcdGV2ZW50X2xhYmVsOiBsYWJlbCxcclxuXHRcdFx0dXNlcl9pZDogdXNlcklkXHJcblx0XHR9KVxyXG5cdH1cclxuXHRpZiAoYXBwQ29uZmlnLkFQUF9JTlNJR0hUU19DT05ORUNUSU9OX1NUUklORykge1xyXG5cdFx0Y29uc3QgYXBwSW5zaWdodHMgPSBnZXRBcHBJbnNpZ2h0cygpXHJcblx0XHRhcHBJbnNpZ2h0cy50cmFja0V2ZW50KHtcclxuXHRcdFx0bmFtZTogZXZlbnROYW1lLFxyXG5cdFx0XHRwcm9wZXJ0aWVzOiB7XHJcblx0XHRcdFx0Y2F0ZWdvcnk6IGNhdGVnb3J5LFxyXG5cdFx0XHRcdGFjdGlvbjogYWN0aW9uLFxyXG5cdFx0XHRcdGxhYmVsOiBsYWJlbCxcclxuXHRcdFx0XHR1c2VySWQ6IHVzZXJJZFxyXG5cdFx0XHR9XHJcblx0XHR9KVxyXG5cdH1cclxufVxyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQSxJQUFBQSxRQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxVQUFBLEdBQUFELE9BQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLE1BQU1FLGdCQUFnQixHQUFJQyxLQUFrQixJQUFLO0VBQ3ZELE1BQU07SUFBRUMsU0FBUztJQUFFQyxRQUFRO0lBQUVDLE1BQU07SUFBRUM7RUFBTSxDQUFDLEdBQUdKLEtBQUs7RUFDcEQsTUFBTUssTUFBTSxHQUFHLElBQUFDLG9CQUFTLEVBQUMsQ0FBQztFQUMxQixNQUFNQyxTQUFTLEdBQUcsSUFBQUMsdUJBQVksRUFBQyxDQUFDO0VBQ2hDLElBQUlELFNBQVMsQ0FBQ0UsNEJBQTRCLEVBQUU7SUFDM0NDLGdCQUFFLENBQUNWLEtBQUssQ0FBQ0MsU0FBUyxFQUFFO01BQ25CVSxjQUFjLEVBQUVULFFBQVE7TUFDeEJDLE1BQU0sRUFBRUEsTUFBTTtNQUNkUyxXQUFXLEVBQUVSLEtBQUs7TUFDbEJTLE9BQU8sRUFBRVI7SUFDVixDQUFDLENBQUM7RUFDSDtFQUNBLElBQUlFLFNBQVMsQ0FBQ08sOEJBQThCLEVBQUU7SUFDN0MsTUFBTUMsV0FBVyxHQUFHLElBQUFDLHlCQUFjLEVBQUMsQ0FBQztJQUNwQ0QsV0FBVyxDQUFDRSxVQUFVLENBQUM7TUFDdEJDLElBQUksRUFBRWpCLFNBQVM7TUFDZmtCLFVBQVUsRUFBRTtRQUNYakIsUUFBUSxFQUFFQSxRQUFRO1FBQ2xCQyxNQUFNLEVBQUVBLE1BQU07UUFDZEMsS0FBSyxFQUFFQSxLQUFLO1FBQ1pDLE1BQU0sRUFBRUE7TUFDVDtJQUNELENBQUMsQ0FBQztFQUNIO0FBQ0QsQ0FBQztBQUFBZSxPQUFBLENBQUFyQixnQkFBQSxHQUFBQSxnQkFBQSIsImlnbm9yZUxpc3QiOltdfQ==
|