studiokit-scaffolding-js 7.0.12-next.1.3 → 7.0.12-next.2.1

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.
Files changed (258) hide show
  1. package/lib/components/ActionList.js +164 -37
  2. package/lib/components/AlertDialog.js +128 -12
  3. package/lib/components/AlertWithIcon.js +88 -29
  4. package/lib/components/ConnectedModal.js +35 -12
  5. package/lib/components/Dropdowns/GroupsDropdown.js +63 -45
  6. package/lib/components/Dropdowns/ManagedNavDropdown.js +92 -67
  7. package/lib/components/Dropdowns/UserDropdown.js +105 -24
  8. package/lib/components/Dropdowns/index.js +4 -10
  9. package/lib/components/EntityOwnerList.js +47 -21
  10. package/lib/components/Error.js +101 -12
  11. package/lib/components/ErrorBoundary.js +127 -38
  12. package/lib/components/ErrorMessage.js +39 -12
  13. package/lib/components/Forms/DateField.js +56 -45
  14. package/lib/components/Forms/TimeField.js +76 -45
  15. package/lib/components/Forms/index.js +3 -5
  16. package/lib/components/Groups/CreateEditCopySaveButtons.js +109 -14
  17. package/lib/components/Groups/ExternalGroups/Attach.js +206 -151
  18. package/lib/components/Groups/ExternalGroups/Table.js +176 -48
  19. package/lib/components/Groups/GroupCreateOrEditCommonProps.js +2 -2
  20. package/lib/components/Groups/RosterSyncInfo.js +142 -23
  21. package/lib/components/HOC/AccessibleAppComponent.js +88 -72
  22. package/lib/components/HOC/ActivityRequiredComponent.js +68 -33
  23. package/lib/components/HOC/AsyncComponent.js +49 -41
  24. package/lib/components/HOC/AuthenticatedComponent.js +55 -44
  25. package/lib/components/HOC/CollectionComponent.js +154 -104
  26. package/lib/components/HOC/CollectionFirstItemComponent.js +45 -40
  27. package/lib/components/HOC/CollectionItemComponent.js +152 -100
  28. package/lib/components/HOC/ConnectedModalComponent.js +87 -69
  29. package/lib/components/HOC/DataDependentComponent.js +26 -27
  30. package/lib/components/HOC/EntityComponent.js +57 -53
  31. package/lib/components/HOC/FullscreenModalComponent.js +139 -108
  32. package/lib/components/HOC/GroupActivityRequiredComponent.js +27 -20
  33. package/lib/components/HOC/GuidComponent.js +20 -20
  34. package/lib/components/HOC/ModelContextDependencyVerifyComponent.js +32 -29
  35. package/lib/components/HOC/ModelErrorRedirectComponent.js +37 -39
  36. package/lib/components/HOC/SearchPersistorComponent.js +237 -173
  37. package/lib/components/HOC/UnauthenticatedComponent.js +32 -30
  38. package/lib/components/HOC/UserComponent.js +6 -8
  39. package/lib/components/Icons/IconAlphaList.js +28 -8
  40. package/lib/components/Icons/IconExternalUser.js +28 -8
  41. package/lib/components/Icons/IconImpersonation.js +28 -8
  42. package/lib/components/Icons/IconStopImpersonating.js +28 -8
  43. package/lib/components/Icons/IconTable.js +29 -9
  44. package/lib/components/Icons/IconTableDeleteCol.js +28 -8
  45. package/lib/components/Icons/IconTableDeleteRow.js +28 -8
  46. package/lib/components/Icons/IconTableInsertCol.js +28 -8
  47. package/lib/components/Icons/IconTableInsertRow.js +28 -8
  48. package/lib/components/Impersonation/Button.js +71 -16
  49. package/lib/components/Impersonation/Link.js +72 -16
  50. package/lib/components/Impersonation/UserDetail.js +60 -11
  51. package/lib/components/Loading.js +23 -8
  52. package/lib/components/LockDownBrowser/Check.js +188 -51
  53. package/lib/components/LockDownBrowser/ExitButton.js +22 -13
  54. package/lib/components/LockDownBrowser/Launch.js +64 -64
  55. package/lib/components/Lti/Confirm.js +147 -14
  56. package/lib/components/Lti/CreateNonLtiGroupAlertDialog.js +165 -36
  57. package/lib/components/Lti/Launch.js +99 -25
  58. package/lib/components/Lti/LaunchGroup.js +81 -16
  59. package/lib/components/ManageTable.js +304 -90
  60. package/lib/components/ManageTableNoDataComponent.js +38 -7
  61. package/lib/components/NewVersionAlert.js +76 -49
  62. package/lib/components/NotFound.js +81 -11
  63. package/lib/components/Notifications.js +179 -129
  64. package/lib/components/PaginationNextButton.js +28 -9
  65. package/lib/components/PaginationPreviousButton.js +28 -9
  66. package/lib/components/Quill/CustomToolbar.js +427 -222
  67. package/lib/components/Quill/Formats/Image.js +67 -67
  68. package/lib/components/Quill/Formats/List.js +38 -47
  69. package/lib/components/Quill/Formats/Video.js +23 -26
  70. package/lib/components/Quill/ImageDropModule.js +136 -114
  71. package/lib/components/Quill/ImageWarning.js +41 -12
  72. package/lib/components/Quill/ImageWithAltTextModal.js +420 -89
  73. package/lib/components/Quill/Specs/CustomImageSpec.js +32 -31
  74. package/lib/components/Quill/Specs/CustomVideoSpec.js +22 -23
  75. package/lib/components/Quill/TableModule/Blots/BaseTableBlot.js +89 -97
  76. package/lib/components/Quill/TableModule/Blots/TableBlot.js +47 -50
  77. package/lib/components/Quill/TableModule/Blots/TableBodyBlot.js +48 -51
  78. package/lib/components/Quill/TableModule/Blots/TableCellBlot.js +219 -224
  79. package/lib/components/Quill/TableModule/Blots/TableContainer.js +75 -86
  80. package/lib/components/Quill/TableModule/Blots/TableRowBlot.js +70 -73
  81. package/lib/components/Quill/TableModule/constants.js +40 -42
  82. package/lib/components/Quill/TableModule/index.js +357 -305
  83. package/lib/components/Quill/TableModule/utils.js +39 -48
  84. package/lib/components/Quill/accessibilityFix.js +219 -223
  85. package/lib/components/Quill/index.js +30 -33
  86. package/lib/components/RefreshIndicator/Bordered.js +44 -10
  87. package/lib/components/RefreshIndicator/Inline.js +43 -12
  88. package/lib/components/RefreshIndicator/index.js +257 -62
  89. package/lib/components/SearchControls.js +211 -14
  90. package/lib/components/SentryRoute.js +5 -7
  91. package/lib/components/Tables/RoleFilter.js +66 -38
  92. package/lib/components/Tables/TextFilter.js +58 -18
  93. package/lib/components/UserRoles/Add.js +193 -99
  94. package/lib/components/UserRoles/Context.js +3 -6
  95. package/lib/components/UserRoles/RoleCell.js +176 -75
  96. package/lib/components/UserRoles/Select.js +151 -20
  97. package/lib/components/UserRoles/Table.js +215 -82
  98. package/lib/components/UserRoles/index.js +526 -386
  99. package/lib/config/eslint/index.js +26 -29
  100. package/lib/config/eslint/lib/order.js +21 -28
  101. package/lib/config/eslint/lib/prettier.js +15 -19
  102. package/lib/config/eslint/lib/typescript.js +87 -113
  103. package/lib/config/eslint/react.js +18 -15
  104. package/lib/constants/baseActivity.js +26 -28
  105. package/lib/constants/baseRole.js +10 -12
  106. package/lib/constants/configuration.js +43 -55
  107. package/lib/constants/externalProviderType.js +6 -8
  108. package/lib/constants/fetchErrorData.js +10 -12
  109. package/lib/constants/index.js +13 -15
  110. package/lib/constants/lockDownBrowser.js +23 -25
  111. package/lib/constants/mockData.js +370 -300
  112. package/lib/constants/modelStatus.js +11 -13
  113. package/lib/constants/notificationType.js +8 -10
  114. package/lib/constants/operatingSystem.js +8 -10
  115. package/lib/constants/shard.js +7 -9
  116. package/lib/constants/table.js +18 -22
  117. package/lib/constants/tier.js +8 -10
  118. package/lib/constants/userRole.js +11 -8
  119. package/lib/endpointMappings.js +191 -182
  120. package/lib/hooks/useCollection.js +79 -65
  121. package/lib/hooks/useCollectionConfiguration.js +220 -80
  122. package/lib/hooks/useCollectionItem.js +151 -57
  123. package/lib/hooks/useGuid.js +16 -9
  124. package/lib/hooks/usePrevious.js +14 -13
  125. package/lib/index.js +11 -26
  126. package/lib/redux/actionCreator.js +44 -35
  127. package/lib/redux/actions/AuthAction.js +45 -32
  128. package/lib/redux/actions/ModalAction.js +6 -8
  129. package/lib/redux/actions/ModelAction.js +95 -43
  130. package/lib/redux/actions/NotificationAction.js +6 -8
  131. package/lib/redux/actions/SearchAction.js +5 -7
  132. package/lib/redux/actions/index.js +6 -8
  133. package/lib/redux/configureReducers.js +48 -46
  134. package/lib/redux/configureStore.js +77 -91
  135. package/lib/redux/helpers.js +2 -5
  136. package/lib/redux/reducers/authReducer.js +44 -43
  137. package/lib/redux/reducers/index.js +7 -14
  138. package/lib/redux/reducers/modalsReducer.js +43 -31
  139. package/lib/redux/reducers/modelsReducer.js +131 -137
  140. package/lib/redux/reducers/notificationsReducer.js +20 -20
  141. package/lib/redux/reducers/searchReducer.js +13 -13
  142. package/lib/redux/sagas/appInsightsSaga.js +19 -21
  143. package/lib/redux/sagas/authSaga.js +248 -234
  144. package/lib/redux/sagas/caliperSaga.js +142 -131
  145. package/lib/redux/sagas/clockOffsetSaga.js +29 -32
  146. package/lib/redux/sagas/configurationSaga.js +8 -10
  147. package/lib/redux/sagas/downtimeApiErrorSaga.js +16 -19
  148. package/lib/redux/sagas/errorSaga.js +23 -24
  149. package/lib/redux/sagas/googleAnalyticsSaga.js +24 -27
  150. package/lib/redux/sagas/identityProviderSaga.js +19 -21
  151. package/lib/redux/sagas/initialDataLoadSaga.js +34 -31
  152. package/lib/redux/sagas/lockDownBrowserErrorSaga.js +25 -22
  153. package/lib/redux/sagas/modelFetchSaga.js +302 -286
  154. package/lib/redux/sagas/noStoreSaga.js +60 -61
  155. package/lib/redux/sagas/postLoginDataSaga.js +37 -32
  156. package/lib/redux/sagas/postLoginRedirectSaga.js +22 -27
  157. package/lib/redux/sagas/rootSaga.js +77 -60
  158. package/lib/redux/sagas/sentrySaga.js +25 -28
  159. package/lib/redux/sagas/userIdSaga.js +13 -15
  160. package/lib/services/codeProviderService.js +21 -21
  161. package/lib/services/dateService.js +6 -8
  162. package/lib/services/documentService.js +10 -11
  163. package/lib/services/fetchService.js +103 -95
  164. package/lib/services/persistenceService.js +27 -30
  165. package/lib/services/ticketProviderService.js +25 -25
  166. package/lib/services/tokenPersistenceService.js +8 -10
  167. package/lib/services/windowService.js +14 -16
  168. package/lib/startup.js +110 -101
  169. package/lib/types/AppConfiguration.js +2 -2
  170. package/lib/types/Artifact.js +7 -9
  171. package/lib/types/BaseReduxState.js +2 -2
  172. package/lib/types/Client.js +2 -2
  173. package/lib/types/Collection.js +2 -2
  174. package/lib/types/Configuration.js +2 -2
  175. package/lib/types/DeepLinkingResponseRequest.js +2 -2
  176. package/lib/types/DeletableModel.js +2 -2
  177. package/lib/types/Event.js +2 -2
  178. package/lib/types/ExternalGroup.js +2 -2
  179. package/lib/types/ExternalProvider.js +2 -2
  180. package/lib/types/ExternalTerm.js +2 -2
  181. package/lib/types/Group.js +2 -2
  182. package/lib/types/IdentityProvider.js +2 -2
  183. package/lib/types/LtiLaunch.js +2 -2
  184. package/lib/types/NameOnlyEntity.js +2 -2
  185. package/lib/types/Notification.js +2 -2
  186. package/lib/types/OptionalRecord.js +2 -2
  187. package/lib/types/OwnerSchedule.js +2 -2
  188. package/lib/types/PropertyOfType.js +2 -2
  189. package/lib/types/Quill.js +2 -2
  190. package/lib/types/RoleDescription.js +2 -2
  191. package/lib/types/Search.js +2 -2
  192. package/lib/types/SimpleLocation.js +2 -2
  193. package/lib/types/UniTime.js +2 -2
  194. package/lib/types/User.js +2 -2
  195. package/lib/types/UserRole.js +2 -2
  196. package/lib/types/auth/AuthState.js +2 -2
  197. package/lib/types/auth/CasV1LoginRequestBody.js +2 -2
  198. package/lib/types/auth/ClientCredentials.js +2 -2
  199. package/lib/types/auth/CodeProviderService.js +2 -2
  200. package/lib/types/auth/LocalLoginRequestBody.js +2 -2
  201. package/lib/types/auth/TicketProviderService.js +2 -2
  202. package/lib/types/auth/TokenPersistenceService.js +2 -2
  203. package/lib/types/auth/index.js +8 -10
  204. package/lib/types/externals.d.js +2 -0
  205. package/lib/types/index.js +29 -31
  206. package/lib/types/net/EndpointConfig.js +2 -2
  207. package/lib/types/net/EndpointMapping.js +2 -2
  208. package/lib/types/net/EndpointMappings.js +2 -2
  209. package/lib/types/net/ErrorHandler.js +2 -2
  210. package/lib/types/net/FetchConfig.js +2 -2
  211. package/lib/types/net/FetchErrorData.js +6 -8
  212. package/lib/types/net/FetchResult.js +2 -2
  213. package/lib/types/net/HTTPMethod.js +2 -2
  214. package/lib/types/net/HTTPStatusCode.js +12 -14
  215. package/lib/types/net/Metadata.js +2 -2
  216. package/lib/types/net/Model.js +2 -2
  217. package/lib/types/net/ModelCollection.js +2 -2
  218. package/lib/types/net/ModelsState.js +2 -2
  219. package/lib/types/net/OAuthToken.js +2 -2
  220. package/lib/types/net/OAuthTokenOrNull.js +2 -2
  221. package/lib/types/net/TokenAccessFunction.js +2 -2
  222. package/lib/types/net/index.js +17 -19
  223. package/lib/utils/baseActivity.js +83 -85
  224. package/lib/utils/baseRole.js +32 -36
  225. package/lib/utils/collection.js +403 -297
  226. package/lib/utils/cookies.js +19 -23
  227. package/lib/utils/date.js +188 -205
  228. package/lib/utils/dom.js +130 -131
  229. package/lib/utils/domainIdentifier.js +4 -8
  230. package/lib/utils/entityUserRole.js +2 -5
  231. package/lib/utils/error.js +14 -19
  232. package/lib/utils/events.js +32 -31
  233. package/lib/utils/externalGroup.js +20 -25
  234. package/lib/utils/externalProviders.js +4 -7
  235. package/lib/utils/externalTerms.js +6 -6
  236. package/lib/utils/fetch.js +168 -176
  237. package/lib/utils/group.js +14 -11
  238. package/lib/utils/groupDates.js +38 -46
  239. package/lib/utils/groupRoles.js +23 -32
  240. package/lib/utils/lockDownBrowser.js +12 -15
  241. package/lib/utils/logger.js +23 -28
  242. package/lib/utils/lti.js +4 -7
  243. package/lib/utils/model.js +28 -43
  244. package/lib/utils/number.js +9 -13
  245. package/lib/utils/promise.js +23 -26
  246. package/lib/utils/quill.js +55 -60
  247. package/lib/utils/route.js +52 -60
  248. package/lib/utils/search.js +72 -87
  249. package/lib/utils/shard.js +33 -42
  250. package/lib/utils/sort.js +47 -50
  251. package/lib/utils/string.js +10 -12
  252. package/lib/utils/table.js +29 -33
  253. package/lib/utils/timezone.js +7 -12
  254. package/lib/utils/url.js +130 -144
  255. package/lib/utils/user.js +54 -64
  256. package/lib/utils/userAgent.js +7 -14
  257. package/lib/utils/userRole.js +36 -39
  258. package/package.json +17 -3
@@ -1,9 +1,24 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Loading = void 0;
4
- const jsx_runtime_1 = require("react/jsx-runtime");
5
- const RefreshIndicator_1 = require("./RefreshIndicator");
6
- const Loading = props => {
7
- return ((0, jsx_runtime_1.jsx)("div", { className: "loading loading-screen", children: (0, jsx_runtime_1.jsx)("div", { className: "section text-center main-content", children: (0, jsx_runtime_1.jsx)(RefreshIndicator_1.RefreshIndicator, Object.assign({}, props)) }) }));
1
+ import { c as _c } from "react-compiler-runtime";
2
+ import { RefreshIndicator } from './RefreshIndicator';
3
+ import { jsx as _jsx } from "react/jsx-runtime";
4
+ export const Loading = props => {
5
+ const $ = _c(2);
6
+ let t0;
7
+ if ($[0] !== props) {
8
+ t0 = /*#__PURE__*/_jsx("div", {
9
+ className: "loading loading-screen",
10
+ children: /*#__PURE__*/_jsx("div", {
11
+ className: "section text-center main-content",
12
+ children: /*#__PURE__*/_jsx(RefreshIndicator, {
13
+ ...props
14
+ })
15
+ })
16
+ });
17
+ $[0] = props;
18
+ $[1] = t0;
19
+ } else {
20
+ t0 = $[1];
21
+ }
22
+ return t0;
8
23
  };
9
- exports.Loading = Loading;
24
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWZyZXNoSW5kaWNhdG9yIiwianN4IiwiX2pzeCIsIkxvYWRpbmciLCJwcm9wcyIsIiQiLCJfYyIsInQwIiwiY2xhc3NOYW1lIiwiY2hpbGRyZW4iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcG9uZW50cy9Mb2FkaW5nLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGdW5jdGlvbkNvbXBvbmVudCB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgUmVmcmVzaEluZGljYXRvciwgUmVmcmVzaEluZGljYXRvclByb3BzIH0gZnJvbSAnLi9SZWZyZXNoSW5kaWNhdG9yJ1xuXG5leHBvcnQgY29uc3QgTG9hZGluZzogRnVuY3Rpb25Db21wb25lbnQ8UmVmcmVzaEluZGljYXRvclByb3BzPiA9IHByb3BzID0+IHtcblx0cmV0dXJuIChcblx0XHQ8ZGl2IGNsYXNzTmFtZT1cImxvYWRpbmcgbG9hZGluZy1zY3JlZW5cIj5cblx0XHRcdDxkaXYgY2xhc3NOYW1lPVwic2VjdGlvbiB0ZXh0LWNlbnRlciBtYWluLWNvbnRlbnRcIj5cblx0XHRcdFx0PFJlZnJlc2hJbmRpY2F0b3Igey4uLnByb3BzfSAvPlxuXHRcdFx0PC9kaXY+XG5cdFx0PC9kaXY+XG5cdClcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUNBLFNBQVNBLGdCQUFnQixRQUErQixvQkFBb0I7QUFBQSxTQUFBQyxHQUFBLElBQUFDLElBQUE7QUFFNUUsT0FBTyxNQUFNQyxPQUFpRCxHQUFHQyxLQUFBO0VBQUEsTUFBQUMsQ0FBQSxHQUFBQyxFQUFBO0VBQUEsSUFBQUMsRUFBQTtFQUFBLElBQUFGLENBQUEsUUFBQUQsS0FBQTtJQUUvREcsRUFBQSxnQkFBQUwsSUFBQTtNQUFlTSxTQUF3QixFQUF4Qix3QkFBd0I7TUFBQUMsUUFBQSxlQUN0Q1AsSUFBQTtRQUFlTSxTQUFrQyxFQUFsQyxrQ0FBa0M7UUFBQUMsUUFBQSxlQUNoRFAsSUFBQSxDQUFDRixnQkFBZ0I7VUFBQSxHQUFLSTtRQUFLLENBQUc7TUFBQyxDQUMzQjtJQUFDLENBQ0YsQ0FBQztJQUFBQyxDQUFBLE1BQUFELEtBQUE7SUFBQUMsQ0FBQSxNQUFBRSxFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBRixDQUFBO0VBQUE7RUFBQSxPQUpORSxFQUlNO0FBQUEsQ0FFUCIsImlnbm9yZUxpc3QiOltdfQ==
@@ -1,53 +1,190 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LockDownBrowserCheck = void 0;
4
- const tslib_1 = require("tslib");
5
- const jsx_runtime_1 = require("react/jsx-runtime");
6
- const Cancel_1 = tslib_1.__importDefault(require("@material-ui/icons/Cancel"));
7
- const CheckCircle_1 = tslib_1.__importDefault(require("@material-ui/icons/CheckCircle"));
8
- const react_1 = require("react");
9
- const react_bootstrap_1 = require("react-bootstrap");
10
- const react_helmet_1 = require("react-helmet");
11
- const uuid_1 = require("uuid");
12
- const operatingSystem_1 = require("../../constants/operatingSystem");
13
- const actionCreator_1 = require("../../redux/actionCreator");
14
- const noStoreSaga_1 = require("../../redux/sagas/noStoreSaga");
15
- const fetch_1 = require("../../utils/fetch");
16
- const lockDownBrowser_1 = require("../../utils/lockDownBrowser");
17
- const Loading_1 = require("../Loading");
18
- const ExitButton_1 = require("./ExitButton");
19
- const LockDownBrowserCheck = () => {
20
- const lockDownBrowserInfo = (0, lockDownBrowser_1.getLockDownBrowserInfo)();
21
- const platform = lockDownBrowserInfo.buildDateWindows
22
- ? operatingSystem_1.OPERATING_SYSTEM.WINDOWS
23
- : lockDownBrowserInfo.buildDateMac
24
- ? operatingSystem_1.OPERATING_SYSTEM.MAC
25
- : lockDownBrowserInfo.buildDateIpad
26
- ? operatingSystem_1.OPERATING_SYSTEM.IPAD
27
- : undefined;
28
- const buildDate = lockDownBrowserInfo.buildDateWindows || lockDownBrowserInfo.buildDateMac || lockDownBrowserInfo.buildDateIpad;
29
- const [hasLoaded, setHasLoaded] = (0, react_1.useState)(false);
30
- const [hookId] = (0, react_1.useState)((0, uuid_1.v4)());
31
- const [testData, setTestData] = (0, react_1.useState)();
32
- (0, react_1.useEffect)(() => {
33
- if (!hasLoaded) {
34
- setHasLoaded(true);
35
- noStoreSaga_1.noStoreHooks.registerNoStoreActionHook(hookId, (data) => {
36
- noStoreSaga_1.noStoreHooks.unregisterNoStoreActionHook(hookId);
37
- setTestData(data);
38
- });
39
- (0, actionCreator_1.dispatchModelFetchRequest)({
40
- modelName: 'lockDownBrowserTest',
41
- guid: hookId,
42
- noStore: true
43
- });
44
- }
45
- }, [hasLoaded, hookId]);
46
- const isApiLockDownBrowser = !!testData && !(0, fetch_1.isFetchErrorData)(testData) && testData.isLockDownBrowser;
47
- const isLockDownBrowserReadyToUse = lockDownBrowserInfo.isClientLockDownBrowser && isApiLockDownBrowser;
48
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(react_helmet_1.Helmet, { title: "LockDown Browser Check" }), testData === undefined && (0, jsx_runtime_1.jsx)(Loading_1.Loading, {}), testData !== undefined && ((0, jsx_runtime_1.jsx)(react_bootstrap_1.Container, { className: "main-content", children: (0, jsx_runtime_1.jsx)(react_bootstrap_1.Row, { children: (0, jsx_runtime_1.jsxs)(react_bootstrap_1.Col, { xs: 12, children: [(0, jsx_runtime_1.jsx)("h1", { children: isLockDownBrowserReadyToUse ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(CheckCircle_1.default, { className: "fill-green f1 mr2" }), " Success! You are using LockDown Browser."] })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(Cancel_1.default, { className: "fill-red f1 mr2" }), "Oops! We could not confirm LockDown Browser is being used."] })) }), isLockDownBrowserReadyToUse ? ((0, jsx_runtime_1.jsx)("p", { children: "You\u2019re all set to use LockDown Browser for your assessments. You can close LockDown Browser when you\u2019re ready." })) : ((0, jsx_runtime_1.jsxs)("p", { children: ["There was an issue detecting LockDown Browser. Please", ' ', lockDownBrowserInfo.isClientLockDownBrowser && ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "close the browser and try again, or " })), "contact us at ", (0, jsx_runtime_1.jsx)("a", { href: "mailto:tlt@purdue.edu", children: "tlt@purdue.edu" }), " if you continue to have issues."] })), (0, jsx_runtime_1.jsxs)("dl", { className: "f6", children: [(0, jsx_runtime_1.jsxs)("dt", { children: [lockDownBrowserInfo.isClientLockDownBrowser ? ((0, jsx_runtime_1.jsx)(CheckCircle_1.default, { className: "fill-green f4" })) : ((0, jsx_runtime_1.jsx)(Cancel_1.default, { className: "fill-red f4" })), ' ', "Client"] }), (0, jsx_runtime_1.jsx)("dd", { children: lockDownBrowserInfo.isClientLockDownBrowser ? (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "Confirmed" }) : (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "Not Detected" }) }), lockDownBrowserInfo.isClientLockDownBrowser &&
49
- (lockDownBrowserInfo.buildId || platform) && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [lockDownBrowserInfo.buildId && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("dt", { children: "Build Id" }), (0, jsx_runtime_1.jsx)("dd", { children: lockDownBrowserInfo.buildId })] })), platform && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("dt", { children: "Platform" }), (0, jsx_runtime_1.jsx)("dd", { children: platform }), (0, jsx_runtime_1.jsx)("dt", { children: "Build Date" }), (0, jsx_runtime_1.jsx)("dd", { children: buildDate })] }))] })), (0, jsx_runtime_1.jsxs)("dt", { children: [isApiLockDownBrowser ? ((0, jsx_runtime_1.jsx)(CheckCircle_1.default, { className: "fill-green f4" })) : ((0, jsx_runtime_1.jsx)(Cancel_1.default, { className: "fill-red f4" })), ' ', "Server"] }), (0, jsx_runtime_1.jsx)("dd", { children: isApiLockDownBrowser ? (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "Confirmed" }) : (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "Not Detected" }) })] }), lockDownBrowserInfo.isClientLockDownBrowser && (0, jsx_runtime_1.jsx)(ExitButton_1.LockDownBrowserExitButton, {})] }) }) }))] }));
1
+ import { c as _c } from "react-compiler-runtime";
2
+ import IconCancel from '@material-ui/icons/Cancel';
3
+ import IconCheckCircle from '@material-ui/icons/CheckCircle';
4
+ import { useEffect, useState } from 'react';
5
+ import { Col, Container, Row } from 'react-bootstrap';
6
+ import { Helmet } from 'react-helmet';
7
+ import { v4 as uuidv4 } from 'uuid';
8
+ import { OPERATING_SYSTEM } from '../../constants/operatingSystem';
9
+ import { dispatchModelFetchRequest } from '../../redux/actionCreator';
10
+ import { noStoreHooks } from '../../redux/sagas/noStoreSaga';
11
+ import { isFetchErrorData } from '../../utils/fetch';
12
+ import { getLockDownBrowserInfo } from '../../utils/lockDownBrowser';
13
+ import { Loading } from '../Loading';
14
+ import { LockDownBrowserExitButton } from './ExitButton';
15
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
16
+ export const LockDownBrowserCheck = () => {
17
+ const $ = _c(18);
18
+ let t0;
19
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
20
+ t0 = getLockDownBrowserInfo();
21
+ $[0] = t0;
22
+ } else {
23
+ t0 = $[0];
24
+ }
25
+ const lockDownBrowserInfo = t0;
26
+ const platform = lockDownBrowserInfo.buildDateWindows ? OPERATING_SYSTEM.WINDOWS : lockDownBrowserInfo.buildDateMac ? OPERATING_SYSTEM.MAC : lockDownBrowserInfo.buildDateIpad ? OPERATING_SYSTEM.IPAD : undefined;
27
+ const buildDate = lockDownBrowserInfo.buildDateWindows || lockDownBrowserInfo.buildDateMac || lockDownBrowserInfo.buildDateIpad;
28
+ const [hasLoaded, setHasLoaded] = useState(false);
29
+ let t1;
30
+ if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
31
+ t1 = uuidv4();
32
+ $[1] = t1;
33
+ } else {
34
+ t1 = $[1];
35
+ }
36
+ const [hookId] = useState(t1);
37
+ const [testData, setTestData] = useState();
38
+ let t2;
39
+ let t3;
40
+ if ($[2] !== hasLoaded || $[3] !== hookId) {
41
+ t2 = () => {
42
+ if (!hasLoaded) {
43
+ setHasLoaded(true);
44
+ noStoreHooks.registerNoStoreActionHook(hookId, data => {
45
+ noStoreHooks.unregisterNoStoreActionHook(hookId);
46
+ setTestData(data);
47
+ });
48
+ dispatchModelFetchRequest({
49
+ modelName: "lockDownBrowserTest",
50
+ guid: hookId,
51
+ noStore: true
52
+ });
53
+ }
54
+ };
55
+ t3 = [hasLoaded, hookId];
56
+ $[2] = hasLoaded;
57
+ $[3] = hookId;
58
+ $[4] = t2;
59
+ $[5] = t3;
60
+ } else {
61
+ t2 = $[4];
62
+ t3 = $[5];
63
+ }
64
+ useEffect(t2, t3);
65
+ let t4;
66
+ if ($[6] !== testData) {
67
+ t4 = !!testData && !isFetchErrorData(testData) && testData.isLockDownBrowser;
68
+ $[6] = testData;
69
+ $[7] = t4;
70
+ } else {
71
+ t4 = $[7];
72
+ }
73
+ const isApiLockDownBrowser = t4;
74
+ const isLockDownBrowserReadyToUse = lockDownBrowserInfo.isClientLockDownBrowser && isApiLockDownBrowser;
75
+ let t5;
76
+ if ($[8] === Symbol.for("react.memo_cache_sentinel")) {
77
+ t5 = /*#__PURE__*/_jsx(Helmet, {
78
+ title: "LockDown Browser Check"
79
+ });
80
+ $[8] = t5;
81
+ } else {
82
+ t5 = $[8];
83
+ }
84
+ let t6;
85
+ if ($[9] !== testData) {
86
+ t6 = testData === undefined && /*#__PURE__*/_jsx(Loading, {});
87
+ $[9] = testData;
88
+ $[10] = t6;
89
+ } else {
90
+ t6 = $[10];
91
+ }
92
+ let t7;
93
+ if ($[11] !== isApiLockDownBrowser || $[12] !== isLockDownBrowserReadyToUse || $[13] !== testData) {
94
+ t7 = testData !== undefined && /*#__PURE__*/_jsx(Container, {
95
+ className: "main-content",
96
+ children: /*#__PURE__*/_jsx(Row, {
97
+ children: /*#__PURE__*/_jsxs(Col, {
98
+ xs: 12,
99
+ children: [/*#__PURE__*/_jsx("h1", {
100
+ children: isLockDownBrowserReadyToUse ? /*#__PURE__*/_jsxs(_Fragment, {
101
+ children: [/*#__PURE__*/_jsx(IconCheckCircle, {
102
+ className: "fill-green f1 mr2"
103
+ }), " Success! You are using LockDown Browser."]
104
+ }) : /*#__PURE__*/_jsxs(_Fragment, {
105
+ children: [/*#__PURE__*/_jsx(IconCancel, {
106
+ className: "fill-red f1 mr2"
107
+ }), "Oops! We could not confirm LockDown Browser is being used."]
108
+ })
109
+ }), isLockDownBrowserReadyToUse ? /*#__PURE__*/_jsx("p", {
110
+ children: "You\u2019re all set to use LockDown Browser for your assessments. You can close LockDown Browser when you\u2019re ready."
111
+ }) : /*#__PURE__*/_jsxs("p", {
112
+ children: ["There was an issue detecting LockDown Browser. Please", " ", lockDownBrowserInfo.isClientLockDownBrowser && /*#__PURE__*/_jsx(_Fragment, {
113
+ children: "close the browser and try again, or "
114
+ }), "contact us at ", /*#__PURE__*/_jsx("a", {
115
+ href: "mailto:tlt@purdue.edu",
116
+ children: "tlt@purdue.edu"
117
+ }), " if you continue to have issues."]
118
+ }), /*#__PURE__*/_jsxs("dl", {
119
+ className: "f6",
120
+ children: [/*#__PURE__*/_jsxs("dt", {
121
+ children: [lockDownBrowserInfo.isClientLockDownBrowser ? /*#__PURE__*/_jsx(IconCheckCircle, {
122
+ className: "fill-green f4"
123
+ }) : /*#__PURE__*/_jsx(IconCancel, {
124
+ className: "fill-red f4"
125
+ }), " ", "Client"]
126
+ }), /*#__PURE__*/_jsx("dd", {
127
+ children: lockDownBrowserInfo.isClientLockDownBrowser ? /*#__PURE__*/_jsx(_Fragment, {
128
+ children: "Confirmed"
129
+ }) : /*#__PURE__*/_jsx(_Fragment, {
130
+ children: "Not Detected"
131
+ })
132
+ }), lockDownBrowserInfo.isClientLockDownBrowser && (lockDownBrowserInfo.buildId || platform) && /*#__PURE__*/_jsxs(_Fragment, {
133
+ children: [lockDownBrowserInfo.buildId && /*#__PURE__*/_jsxs(_Fragment, {
134
+ children: [/*#__PURE__*/_jsx("dt", {
135
+ children: "Build Id"
136
+ }), /*#__PURE__*/_jsx("dd", {
137
+ children: lockDownBrowserInfo.buildId
138
+ })]
139
+ }), platform && /*#__PURE__*/_jsxs(_Fragment, {
140
+ children: [/*#__PURE__*/_jsx("dt", {
141
+ children: "Platform"
142
+ }), /*#__PURE__*/_jsx("dd", {
143
+ children: platform
144
+ }), /*#__PURE__*/_jsx("dt", {
145
+ children: "Build Date"
146
+ }), /*#__PURE__*/_jsx("dd", {
147
+ children: buildDate
148
+ })]
149
+ })]
150
+ }), /*#__PURE__*/_jsxs("dt", {
151
+ children: [isApiLockDownBrowser ? /*#__PURE__*/_jsx(IconCheckCircle, {
152
+ className: "fill-green f4"
153
+ }) : /*#__PURE__*/_jsx(IconCancel, {
154
+ className: "fill-red f4"
155
+ }), " ", "Server"]
156
+ }), /*#__PURE__*/_jsx("dd", {
157
+ children: isApiLockDownBrowser ? /*#__PURE__*/_jsx(_Fragment, {
158
+ children: "Confirmed"
159
+ }) : /*#__PURE__*/_jsx(_Fragment, {
160
+ children: "Not Detected"
161
+ })
162
+ })]
163
+ }), lockDownBrowserInfo.isClientLockDownBrowser && /*#__PURE__*/_jsx(LockDownBrowserExitButton, {})]
164
+ })
165
+ })
166
+ });
167
+ $[11] = isApiLockDownBrowser;
168
+ $[12] = isLockDownBrowserReadyToUse;
169
+ $[13] = testData;
170
+ $[14] = t7;
171
+ } else {
172
+ t7 = $[14];
173
+ }
174
+ let t8;
175
+ if ($[15] !== t6 || $[16] !== t7) {
176
+ t8 = /*#__PURE__*/_jsxs(_Fragment, {
177
+ children: [t5, t6, t7]
178
+ });
179
+ $[15] = t6;
180
+ $[16] = t7;
181
+ $[17] = t8;
182
+ } else {
183
+ t8 = $[17];
184
+ }
185
+ return t8;
50
186
  };
51
- exports.LockDownBrowserCheck = LockDownBrowserCheck;
187
+
52
188
  // required for use in Routes / AsyncComponent
53
- exports.default = exports.LockDownBrowserCheck;
189
+ export default LockDownBrowserCheck;
190
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJY29uQ2FuY2VsIiwiSWNvbkNoZWNrQ2lyY2xlIiwidXNlRWZmZWN0IiwidXNlU3RhdGUiLCJDb2wiLCJDb250YWluZXIiLCJSb3ciLCJIZWxtZXQiLCJ2NCIsInV1aWR2NCIsIk9QRVJBVElOR19TWVNURU0iLCJkaXNwYXRjaE1vZGVsRmV0Y2hSZXF1ZXN0Iiwibm9TdG9yZUhvb2tzIiwiaXNGZXRjaEVycm9yRGF0YSIsImdldExvY2tEb3duQnJvd3NlckluZm8iLCJMb2FkaW5nIiwiTG9ja0Rvd25Ccm93c2VyRXhpdEJ1dHRvbiIsImpzeCIsIl9qc3giLCJGcmFnbWVudCIsIl9GcmFnbWVudCIsImpzeHMiLCJfanN4cyIsIkxvY2tEb3duQnJvd3NlckNoZWNrIiwiJCIsIl9jIiwidDAiLCJTeW1ib2wiLCJmb3IiLCJsb2NrRG93bkJyb3dzZXJJbmZvIiwicGxhdGZvcm0iLCJidWlsZERhdGVXaW5kb3dzIiwiV0lORE9XUyIsImJ1aWxkRGF0ZU1hYyIsIk1BQyIsImJ1aWxkRGF0ZUlwYWQiLCJJUEFEIiwidW5kZWZpbmVkIiwiYnVpbGREYXRlIiwiaGFzTG9hZGVkIiwic2V0SGFzTG9hZGVkIiwidDEiLCJob29rSWQiLCJ0ZXN0RGF0YSIsInNldFRlc3REYXRhIiwidDIiLCJ0MyIsInJlZ2lzdGVyTm9TdG9yZUFjdGlvbkhvb2siLCJkYXRhIiwidW5yZWdpc3Rlck5vU3RvcmVBY3Rpb25Ib29rIiwibW9kZWxOYW1lIiwiZ3VpZCIsIm5vU3RvcmUiLCJ0NCIsImlzTG9ja0Rvd25Ccm93c2VyIiwiaXNBcGlMb2NrRG93bkJyb3dzZXIiLCJpc0xvY2tEb3duQnJvd3NlclJlYWR5VG9Vc2UiLCJpc0NsaWVudExvY2tEb3duQnJvd3NlciIsInQ1IiwidGl0bGUiLCJ0NiIsInQ3IiwiY2xhc3NOYW1lIiwiY2hpbGRyZW4iLCJ4cyIsImhyZWYiLCJidWlsZElkIiwidDgiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9Mb2NrRG93bkJyb3dzZXIvQ2hlY2sudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBJY29uQ2FuY2VsIGZyb20gJ0BtYXRlcmlhbC11aS9pY29ucy9DYW5jZWwnXG5pbXBvcnQgSWNvbkNoZWNrQ2lyY2xlIGZyb20gJ0BtYXRlcmlhbC11aS9pY29ucy9DaGVja0NpcmNsZSdcbmltcG9ydCB7IEZ1bmN0aW9uQ29tcG9uZW50LCB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBDb2wsIENvbnRhaW5lciwgUm93IH0gZnJvbSAncmVhY3QtYm9vdHN0cmFwJ1xuaW1wb3J0IHsgSGVsbWV0IH0gZnJvbSAncmVhY3QtaGVsbWV0J1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCdcbmltcG9ydCB7IE9QRVJBVElOR19TWVNURU0gfSBmcm9tICcuLi8uLi9jb25zdGFudHMvb3BlcmF0aW5nU3lzdGVtJ1xuaW1wb3J0IHsgZGlzcGF0Y2hNb2RlbEZldGNoUmVxdWVzdCB9IGZyb20gJy4uLy4uL3JlZHV4L2FjdGlvbkNyZWF0b3InXG5pbXBvcnQgeyBub1N0b3JlSG9va3MgfSBmcm9tICcuLi8uLi9yZWR1eC9zYWdhcy9ub1N0b3JlU2FnYSdcbmltcG9ydCB7IEZldGNoRXJyb3JEYXRhIH0gZnJvbSAnLi4vLi4vdHlwZXMvbmV0L0ZldGNoRXJyb3JEYXRhJ1xuaW1wb3J0IHsgaXNGZXRjaEVycm9yRGF0YSB9IGZyb20gJy4uLy4uL3V0aWxzL2ZldGNoJ1xuaW1wb3J0IHsgZ2V0TG9ja0Rvd25Ccm93c2VySW5mbyB9IGZyb20gJy4uLy4uL3V0aWxzL2xvY2tEb3duQnJvd3NlcidcbmltcG9ydCB7IExvYWRpbmcgfSBmcm9tICcuLi9Mb2FkaW5nJ1xuaW1wb3J0IHsgTG9ja0Rvd25Ccm93c2VyRXhpdEJ1dHRvbiB9IGZyb20gJy4vRXhpdEJ1dHRvbidcblxuaW50ZXJmYWNlIExvY2tEb3duQnJvd3NlclRlc3REYXRhIHtcblx0aXNMb2NrRG93bkJyb3dzZXI6IGJvb2xlYW5cbn1cblxuZXhwb3J0IGNvbnN0IExvY2tEb3duQnJvd3NlckNoZWNrOiBGdW5jdGlvbkNvbXBvbmVudCA9ICgpID0+IHtcblx0Y29uc3QgbG9ja0Rvd25Ccm93c2VySW5mbyA9IGdldExvY2tEb3duQnJvd3NlckluZm8oKVxuXHRjb25zdCBwbGF0Zm9ybSA9IGxvY2tEb3duQnJvd3NlckluZm8uYnVpbGREYXRlV2luZG93c1xuXHRcdD8gT1BFUkFUSU5HX1NZU1RFTS5XSU5ET1dTXG5cdFx0OiBsb2NrRG93bkJyb3dzZXJJbmZvLmJ1aWxkRGF0ZU1hY1xuXHRcdFx0PyBPUEVSQVRJTkdfU1lTVEVNLk1BQ1xuXHRcdFx0OiBsb2NrRG93bkJyb3dzZXJJbmZvLmJ1aWxkRGF0ZUlwYWRcblx0XHRcdFx0PyBPUEVSQVRJTkdfU1lTVEVNLklQQURcblx0XHRcdFx0OiB1bmRlZmluZWRcblx0Y29uc3QgYnVpbGREYXRlID1cblx0XHRsb2NrRG93bkJyb3dzZXJJbmZvLmJ1aWxkRGF0ZVdpbmRvd3MgfHwgbG9ja0Rvd25Ccm93c2VySW5mby5idWlsZERhdGVNYWMgfHwgbG9ja0Rvd25Ccm93c2VySW5mby5idWlsZERhdGVJcGFkXG5cblx0Y29uc3QgW2hhc0xvYWRlZCwgc2V0SGFzTG9hZGVkXSA9IHVzZVN0YXRlKGZhbHNlKVxuXHRjb25zdCBbaG9va0lkXSA9IHVzZVN0YXRlKHV1aWR2NCgpKVxuXHRjb25zdCBbdGVzdERhdGEsIHNldFRlc3REYXRhXSA9IHVzZVN0YXRlPExvY2tEb3duQnJvd3NlclRlc3REYXRhIHwgRmV0Y2hFcnJvckRhdGEgfCBudWxsPigpXG5cblx0dXNlRWZmZWN0KCgpID0+IHtcblx0XHRpZiAoIWhhc0xvYWRlZCkge1xuXHRcdFx0c2V0SGFzTG9hZGVkKHRydWUpXG5cdFx0XHRub1N0b3JlSG9va3MucmVnaXN0ZXJOb1N0b3JlQWN0aW9uSG9vayhob29rSWQsIChkYXRhOiBMb2NrRG93bkJyb3dzZXJUZXN0RGF0YSB8IEZldGNoRXJyb3JEYXRhIHwgbnVsbCkgPT4ge1xuXHRcdFx0XHRub1N0b3JlSG9va3MudW5yZWdpc3Rlck5vU3RvcmVBY3Rpb25Ib29rKGhvb2tJZClcblx0XHRcdFx0c2V0VGVzdERhdGEoZGF0YSlcblx0XHRcdH0pXG5cdFx0XHRkaXNwYXRjaE1vZGVsRmV0Y2hSZXF1ZXN0KHtcblx0XHRcdFx0bW9kZWxOYW1lOiAnbG9ja0Rvd25Ccm93c2VyVGVzdCcsXG5cdFx0XHRcdGd1aWQ6IGhvb2tJZCxcblx0XHRcdFx0bm9TdG9yZTogdHJ1ZVxuXHRcdFx0fSlcblx0XHR9XG5cdH0sIFtoYXNMb2FkZWQsIGhvb2tJZF0pXG5cblx0Y29uc3QgaXNBcGlMb2NrRG93bkJyb3dzZXIgPSAhIXRlc3REYXRhICYmICFpc0ZldGNoRXJyb3JEYXRhKHRlc3REYXRhKSAmJiB0ZXN0RGF0YS5pc0xvY2tEb3duQnJvd3NlclxuXHRjb25zdCBpc0xvY2tEb3duQnJvd3NlclJlYWR5VG9Vc2UgPSBsb2NrRG93bkJyb3dzZXJJbmZvLmlzQ2xpZW50TG9ja0Rvd25Ccm93c2VyICYmIGlzQXBpTG9ja0Rvd25Ccm93c2VyXG5cblx0cmV0dXJuIChcblx0XHQ8PlxuXHRcdFx0PEhlbG1ldCB0aXRsZT1cIkxvY2tEb3duIEJyb3dzZXIgQ2hlY2tcIiAvPlxuXHRcdFx0e3Rlc3REYXRhID09PSB1bmRlZmluZWQgJiYgPExvYWRpbmcgLz59XG5cdFx0XHR7dGVzdERhdGEgIT09IHVuZGVmaW5lZCAmJiAoXG5cdFx0XHRcdDxDb250YWluZXIgY2xhc3NOYW1lPVwibWFpbi1jb250ZW50XCI+XG5cdFx0XHRcdFx0PFJvdz5cblx0XHRcdFx0XHRcdDxDb2wgeHM9ezEyfT5cblx0XHRcdFx0XHRcdFx0PGgxPlxuXHRcdFx0XHRcdFx0XHRcdHtpc0xvY2tEb3duQnJvd3NlclJlYWR5VG9Vc2UgPyAoXG5cdFx0XHRcdFx0XHRcdFx0XHQ8PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8SWNvbkNoZWNrQ2lyY2xlIGNsYXNzTmFtZT1cImZpbGwtZ3JlZW4gZjEgbXIyXCIgLz4gU3VjY2VzcyEgWW91IGFyZSB1c2luZ1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRMb2NrRG93biBCcm93c2VyLlxuXHRcdFx0XHRcdFx0XHRcdFx0PC8+XG5cdFx0XHRcdFx0XHRcdFx0KSA6IChcblx0XHRcdFx0XHRcdFx0XHRcdDw+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxJY29uQ2FuY2VsIGNsYXNzTmFtZT1cImZpbGwtcmVkIGYxIG1yMlwiIC8+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdE9vcHMhIFdlIGNvdWxkIG5vdCBjb25maXJtIExvY2tEb3duIEJyb3dzZXIgaXMgYmVpbmcgdXNlZC5cblx0XHRcdFx0XHRcdFx0XHRcdDwvPlxuXHRcdFx0XHRcdFx0XHRcdCl9XG5cdFx0XHRcdFx0XHRcdDwvaDE+XG5cdFx0XHRcdFx0XHRcdHtpc0xvY2tEb3duQnJvd3NlclJlYWR5VG9Vc2UgPyAoXG5cdFx0XHRcdFx0XHRcdFx0PHA+XG5cdFx0XHRcdFx0XHRcdFx0XHRZb3XigJlyZSBhbGwgc2V0IHRvIHVzZSBMb2NrRG93biBCcm93c2VyIGZvciB5b3VyIGFzc2Vzc21lbnRzLiBZb3UgY2FuIGNsb3NlIExvY2tEb3duXG5cdFx0XHRcdFx0XHRcdFx0XHRCcm93c2VyIHdoZW4geW914oCZcmUgcmVhZHkuXG5cdFx0XHRcdFx0XHRcdFx0PC9wPlxuXHRcdFx0XHRcdFx0XHQpIDogKFxuXHRcdFx0XHRcdFx0XHRcdDxwPlxuXHRcdFx0XHRcdFx0XHRcdFx0VGhlcmUgd2FzIGFuIGlzc3VlIGRldGVjdGluZyBMb2NrRG93biBCcm93c2VyLiBQbGVhc2V7JyAnfVxuXHRcdFx0XHRcdFx0XHRcdFx0e2xvY2tEb3duQnJvd3NlckluZm8uaXNDbGllbnRMb2NrRG93bkJyb3dzZXIgJiYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8PmNsb3NlIHRoZSBicm93c2VyIGFuZCB0cnkgYWdhaW4sIG9yIDwvPlxuXHRcdFx0XHRcdFx0XHRcdFx0KX1cblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRhY3QgdXMgYXQgPGEgaHJlZj1cIm1haWx0bzp0bHRAcHVyZHVlLmVkdVwiPnRsdEBwdXJkdWUuZWR1PC9hPiBpZiB5b3UgY29udGludWUgdG9cblx0XHRcdFx0XHRcdFx0XHRcdGhhdmUgaXNzdWVzLlxuXHRcdFx0XHRcdFx0XHRcdDwvcD5cblx0XHRcdFx0XHRcdFx0KX1cblx0XHRcdFx0XHRcdFx0PGRsIGNsYXNzTmFtZT1cImY2XCI+XG5cdFx0XHRcdFx0XHRcdFx0PGR0PlxuXHRcdFx0XHRcdFx0XHRcdFx0e2xvY2tEb3duQnJvd3NlckluZm8uaXNDbGllbnRMb2NrRG93bkJyb3dzZXIgPyAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxJY29uQ2hlY2tDaXJjbGUgY2xhc3NOYW1lPVwiZmlsbC1ncmVlbiBmNFwiIC8+XG5cdFx0XHRcdFx0XHRcdFx0XHQpIDogKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8SWNvbkNhbmNlbCBjbGFzc05hbWU9XCJmaWxsLXJlZCBmNFwiIC8+XG5cdFx0XHRcdFx0XHRcdFx0XHQpfXsnICd9XG5cdFx0XHRcdFx0XHRcdFx0XHRDbGllbnRcblx0XHRcdFx0XHRcdFx0XHQ8L2R0PlxuXHRcdFx0XHRcdFx0XHRcdDxkZD5cblx0XHRcdFx0XHRcdFx0XHRcdHtsb2NrRG93bkJyb3dzZXJJbmZvLmlzQ2xpZW50TG9ja0Rvd25Ccm93c2VyID8gPD5Db25maXJtZWQ8Lz4gOiA8Pk5vdCBEZXRlY3RlZDwvPn1cblx0XHRcdFx0XHRcdFx0XHQ8L2RkPlxuXHRcdFx0XHRcdFx0XHRcdHtsb2NrRG93bkJyb3dzZXJJbmZvLmlzQ2xpZW50TG9ja0Rvd25Ccm93c2VyICYmXG5cdFx0XHRcdFx0XHRcdFx0XHQobG9ja0Rvd25Ccm93c2VySW5mby5idWlsZElkIHx8IHBsYXRmb3JtKSAmJiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDw+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0e2xvY2tEb3duQnJvd3NlckluZm8uYnVpbGRJZCAmJiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZHQ+QnVpbGQgSWQ8L2R0PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGQ+e2xvY2tEb3duQnJvd3NlckluZm8uYnVpbGRJZH08L2RkPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC8+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7cGxhdGZvcm0gJiYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGR0PlBsYXRmb3JtPC9kdD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRkPntwbGF0Zm9ybX08L2RkPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZHQ+QnVpbGQgRGF0ZTwvZHQ+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkZD57YnVpbGREYXRlfTwvZGQ+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8Lz5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8Lz5cblx0XHRcdFx0XHRcdFx0XHRcdCl9XG5cdFx0XHRcdFx0XHRcdFx0PGR0PlxuXHRcdFx0XHRcdFx0XHRcdFx0e2lzQXBpTG9ja0Rvd25Ccm93c2VyID8gKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8SWNvbkNoZWNrQ2lyY2xlIGNsYXNzTmFtZT1cImZpbGwtZ3JlZW4gZjRcIiAvPlxuXHRcdFx0XHRcdFx0XHRcdFx0KSA6IChcblx0XHRcdFx0XHRcdFx0XHRcdFx0PEljb25DYW5jZWwgY2xhc3NOYW1lPVwiZmlsbC1yZWQgZjRcIiAvPlxuXHRcdFx0XHRcdFx0XHRcdFx0KX17JyAnfVxuXHRcdFx0XHRcdFx0XHRcdFx0U2VydmVyXG5cdFx0XHRcdFx0XHRcdFx0PC9kdD5cblx0XHRcdFx0XHRcdFx0XHQ8ZGQ+e2lzQXBpTG9ja0Rvd25Ccm93c2VyID8gPD5Db25maXJtZWQ8Lz4gOiA8Pk5vdCBEZXRlY3RlZDwvPn08L2RkPlxuXHRcdFx0XHRcdFx0XHQ8L2RsPlxuXHRcdFx0XHRcdFx0XHR7bG9ja0Rvd25Ccm93c2VySW5mby5pc0NsaWVudExvY2tEb3duQnJvd3NlciAmJiA8TG9ja0Rvd25Ccm93c2VyRXhpdEJ1dHRvbiAvPn1cblx0XHRcdFx0XHRcdDwvQ29sPlxuXHRcdFx0XHRcdDwvUm93PlxuXHRcdFx0XHQ8L0NvbnRhaW5lcj5cblx0XHRcdCl9XG5cdFx0PC8+XG5cdClcbn1cblxuLy8gcmVxdWlyZWQgZm9yIHVzZSBpbiBSb3V0ZXMgLyBBc3luY0NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgTG9ja0Rvd25Ccm93c2VyQ2hlY2tcbiJdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU9BLFVBQVUsTUFBTSwyQkFBMkI7QUFDbEQsT0FBT0MsZUFBZSxNQUFNLGdDQUFnQztBQUM1RCxTQUE0QkMsU0FBUyxFQUFFQyxRQUFRLFFBQVEsT0FBTztBQUM5RCxTQUFTQyxHQUFHLEVBQUVDLFNBQVMsRUFBRUMsR0FBRyxRQUFRLGlCQUFpQjtBQUNyRCxTQUFTQyxNQUFNLFFBQVEsY0FBYztBQUNyQyxTQUFTQyxFQUFFLElBQUlDLE1BQU0sUUFBUSxNQUFNO0FBQ25DLFNBQVNDLGdCQUFnQixRQUFRLGlDQUFpQztBQUNsRSxTQUFTQyx5QkFBeUIsUUFBUSwyQkFBMkI7QUFDckUsU0FBU0MsWUFBWSxRQUFRLCtCQUErQjtBQUU1RCxTQUFTQyxnQkFBZ0IsUUFBUSxtQkFBbUI7QUFDcEQsU0FBU0Msc0JBQXNCLFFBQVEsNkJBQTZCO0FBQ3BFLFNBQVNDLE9BQU8sUUFBUSxZQUFZO0FBQ3BDLFNBQVNDLHlCQUF5QixRQUFRLGNBQWM7QUFBQSxTQUFBQyxHQUFBLElBQUFDLElBQUEsRUFBQUMsUUFBQSxJQUFBQyxTQUFBLEVBQUFDLElBQUEsSUFBQUMsS0FBQTtBQU14RCxPQUFPLE1BQU1DLG9CQUF1QyxHQUFHQSxDQUFBO0VBQUEsTUFBQUMsQ0FBQSxHQUFBQyxFQUFBO0VBQUEsSUFBQUMsRUFBQTtFQUFBLElBQUFGLENBQUEsUUFBQUcsTUFBQSxDQUFBQyxHQUFBO0lBQzFCRixFQUFBLEdBQUFaLHNCQUFz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
@@ -1,14 +1,23 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LockDownBrowserExitButton = void 0;
4
- const tslib_1 = require("tslib");
5
- const jsx_runtime_1 = require("react/jsx-runtime");
6
- const Button_1 = tslib_1.__importDefault(require("@material-ui/core/Button"));
7
- const react_router_1 = require("react-router");
8
- const constants_1 = require("../../constants");
9
- const LockDownBrowserExitButton = () => {
10
- const location = (0, react_router_1.useLocation)();
11
- return ((0, jsx_runtime_1.jsx)(Button_1.default, { className: "btn-primary mb4", onClick: () => (window.location.href =
12
- location.pathname + `?${constants_1.LOCKDOWN_BROWSER_KEY.EXIT_BROWSER}=${constants_1.LOCKDOWN_BROWSER_TRUE}`), children: "Close LockDown Browser" }));
1
+ import { c as _c } from "react-compiler-runtime";
2
+ import Button from '@material-ui/core/Button';
3
+ import { useLocation } from 'react-router';
4
+ import { LOCKDOWN_BROWSER_KEY, LOCKDOWN_BROWSER_TRUE } from '../../constants';
5
+ import { jsx as _jsx } from "react/jsx-runtime";
6
+ export const LockDownBrowserExitButton = () => {
7
+ const $ = _c(2);
8
+ const location = useLocation();
9
+ let t0;
10
+ if ($[0] !== location.pathname) {
11
+ t0 = /*#__PURE__*/_jsx(Button, {
12
+ className: "btn-primary mb4",
13
+ onClick: () => window.location.href = location.pathname + `?${LOCKDOWN_BROWSER_KEY.EXIT_BROWSER}=${LOCKDOWN_BROWSER_TRUE}`,
14
+ children: "Close LockDown Browser"
15
+ });
16
+ $[0] = location.pathname;
17
+ $[1] = t0;
18
+ } else {
19
+ t0 = $[1];
20
+ }
21
+ return t0;
13
22
  };
14
- exports.LockDownBrowserExitButton = LockDownBrowserExitButton;
23
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCdXR0b24iLCJ1c2VMb2NhdGlvbiIsIkxPQ0tET1dOX0JST1dTRVJfS0VZIiwiTE9DS0RPV05fQlJPV1NFUl9UUlVFIiwianN4IiwiX2pzeCIsIkxvY2tEb3duQnJvd3NlckV4aXRCdXR0b24iLCIkIiwiX2MiLCJsb2NhdGlvbiIsInQwIiwicGF0aG5hbWUiLCJjbGFzc05hbWUiLCJvbkNsaWNrIiwid2luZG93IiwiaHJlZiIsIkVYSVRfQlJPV1NFUiIsImNoaWxkcmVuIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvTG9ja0Rvd25Ccm93c2VyL0V4aXRCdXR0b24udHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCdXR0b24gZnJvbSAnQG1hdGVyaWFsLXVpL2NvcmUvQnV0dG9uJ1xuaW1wb3J0IHsgRnVuY3Rpb25Db21wb25lbnQgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZUxvY2F0aW9uIH0gZnJvbSAncmVhY3Qtcm91dGVyJ1xuaW1wb3J0IHsgTE9DS0RPV05fQlJPV1NFUl9LRVksIExPQ0tET1dOX0JST1dTRVJfVFJVRSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cydcblxuZXhwb3J0IGNvbnN0IExvY2tEb3duQnJvd3NlckV4aXRCdXR0b246IEZ1bmN0aW9uQ29tcG9uZW50ID0gKCkgPT4ge1xuXHRjb25zdCBsb2NhdGlvbiA9IHVzZUxvY2F0aW9uKClcblx0cmV0dXJuIChcblx0XHQ8QnV0dG9uXG5cdFx0XHRjbGFzc05hbWU9XCJidG4tcHJpbWFyeSBtYjRcIlxuXHRcdFx0b25DbGljaz17KCkgPT5cblx0XHRcdFx0KHdpbmRvdy5sb2NhdGlvbi5ocmVmID1cblx0XHRcdFx0XHRsb2NhdGlvbi5wYXRobmFtZSArIGA/JHtMT0NLRE9XTl9CUk9XU0VSX0tFWS5FWElUX0JST1dTRVJ9PSR7TE9DS0RPV05fQlJPV1NFUl9UUlVFfWApXG5cdFx0XHR9PlxuXHRcdFx0Q2xvc2UgTG9ja0Rvd24gQnJvd3NlclxuXHRcdDwvQnV0dG9uPlxuXHQpXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPQSxNQUFNLE1BQU0sMEJBQTBCO0FBRTdDLFNBQVNDLFdBQVcsUUFBUSxjQUFjO0FBQzFDLFNBQVNDLG9CQUFvQixFQUFFQyxxQkFBcUIsUUFBUSxpQkFBaUI7QUFBQSxTQUFBQyxHQUFBLElBQUFDLElBQUE7QUFFN0UsT0FBTyxNQUFNQyx5QkFBNEMsR0FBR0EsQ0FBQTtFQUFBLE1BQUFDLENBQUEsR0FBQUMsRUFBQTtFQUMzRCxNQUFBQyxRQUFBLEdBQWlCUixXQUFXLENBQUMsQ0FBQztFQUFBLElBQUFTLEVBQUE7RUFBQSxJQUFBSCxDQUFBLFFBQUFFLFFBQUEsQ0FBQUUsUUFBQTtJQUU3QkQsRUFBQSxnQkFBQUwsSUFBQSxDQUFDTCxNQUFNO01BQ0lZLFNBQWlCLEVBQWpCLGlCQUFpQjtNQUNsQkMsT0FFOEUsRUFGOUVBLENBQUEsS0FDUEMsTUFBTSxDQUFBTCxRQUFTLENBQUFNLElBQUEsR0FDZk4sUUFBUSxDQUFBRSxRQUFTLEdBQUcsSUFBSVQsb0JBQW9CLENBQUFjLFlBQWEsSUFBSWIscUJBQXFCLEVBQUc7TUFBQWMsUUFBQSxFQUNyRjtJQUVILENBQVEsQ0FBQztJQUFBVixDQUFBLE1BQUFFLFFBQUEsQ0FBQUUsUUFBQTtJQUFBSixDQUFBLE1BQUFHLEVBQUE7RUFBQTtJQUFBQSxFQUFBLEdBQUFILENBQUE7RUFBQTtFQUFBLE9BUFRHLEVBT1M7QUFBQSxDQUVWIiwiaWdub3JlTGlzdCI6W119
@@ -1,66 +1,66 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LockDownBrowserLaunch = void 0;
4
- const tslib_1 = require("tslib");
5
- const jsx_runtime_1 = require("react/jsx-runtime");
6
- const Sentry = tslib_1.__importStar(require("@sentry/react"));
7
- const query_string_1 = require("query-string");
8
- const react_1 = require("react");
9
- const react_helmet_1 = require("react-helmet");
10
- const react_router_1 = require("react-router");
11
- const constants_1 = require("../../constants");
12
- const lockDownBrowser_1 = require("../../utils/lockDownBrowser");
13
- const url_1 = require("../../utils/url");
14
- const Loading_1 = require("../Loading");
15
- const LockDownBrowserLaunch = () => {
16
- const history = (0, react_router_1.useHistory)();
17
- const location = (0, react_router_1.useLocation)();
18
- const search = (0, query_string_1.parse)(location.search);
19
- const redirectPath = search.redirectPath;
20
- let reloadCount = search.reloadCount && typeof search.reloadCount === 'string' ? parseInt(search.reloadCount) : 0;
21
- // this effect will run once after this component renders
22
- // allow LockDown Browser to set its cookies
23
- (0, react_1.useEffect)(() => {
24
- const lockDownBrowserInfo = (0, lockDownBrowser_1.getLockDownBrowserInfo)();
25
- // redirect path is required and must be a single string
26
- if (!redirectPath || typeof redirectPath !== 'string') {
27
- Sentry.captureException('redirectPath is undefined');
28
- history.push({
29
- pathname: '/error',
30
- search: (0, query_string_1.stringify)({ message: constants_1.LOCKDOWN_BROWSER_LAUNCH_ERROR })
31
- });
32
- return;
33
- }
34
- // if LDB cookies are set, redirect to the final path
35
- if (lockDownBrowserInfo.isClientLockDownBrowser) {
36
- const redirectPathLocation = (0, url_1.parseLocation)(redirectPath);
37
- history.push(redirectPathLocation);
38
- return;
39
- }
40
- // increment reloadCount and reload the current url fully (not using in-app router)
41
- // try 3 times before going to the error route
42
- if (reloadCount < 2) {
43
- Sentry.captureMessage('could not determine if client is LockDown Browser, reloading');
44
- reloadCount++;
45
- search.reloadCount = reloadCount.toString();
46
- window.location.href =
47
- window.location.protocol +
48
- '//' +
49
- window.location.host +
50
- window.location.pathname +
51
- '?' +
52
- (0, query_string_1.stringify)(search);
53
- return;
54
- }
55
- Sentry.captureException('client is not LockDown Browser');
56
- history.push({
57
- pathname: '/error',
58
- search: (0, query_string_1.stringify)({ message: constants_1.LOCKDOWN_BROWSER_LAUNCH_ERROR })
59
- });
60
- // eslint-disable-next-line react-hooks/exhaustive-deps
61
- }, []);
62
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(react_helmet_1.Helmet, { title: "LockDown Browser Launch" }), (0, jsx_runtime_1.jsx)(Loading_1.Loading, {})] }));
1
+ import * as Sentry from '@sentry/react';
2
+ import { parse, stringify } from 'query-string';
3
+ import { useEffect } from 'react';
4
+ import { Helmet } from 'react-helmet';
5
+ import { useHistory, useLocation } from 'react-router';
6
+ import { LOCKDOWN_BROWSER_LAUNCH_ERROR } from '../../constants';
7
+ import { getLockDownBrowserInfo } from '../../utils/lockDownBrowser';
8
+ import { parseLocation } from '../../utils/url';
9
+ import { Loading } from '../Loading';
10
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
11
+ export const LockDownBrowserLaunch = () => {
12
+ const history = useHistory();
13
+ const location = useLocation();
14
+ const search = parse(location.search);
15
+ const redirectPath = search.redirectPath;
16
+ let reloadCount = search.reloadCount && typeof search.reloadCount === 'string' ? parseInt(search.reloadCount) : 0;
17
+
18
+ // this effect will run once after this component renders
19
+ // allow LockDown Browser to set its cookies
20
+ useEffect(() => {
21
+ const lockDownBrowserInfo = getLockDownBrowserInfo();
22
+ // redirect path is required and must be a single string
23
+ if (!redirectPath || typeof redirectPath !== 'string') {
24
+ Sentry.captureException('redirectPath is undefined');
25
+ history.push({
26
+ pathname: '/error',
27
+ search: stringify({
28
+ message: LOCKDOWN_BROWSER_LAUNCH_ERROR
29
+ })
30
+ });
31
+ return;
32
+ }
33
+ // if LDB cookies are set, redirect to the final path
34
+ if (lockDownBrowserInfo.isClientLockDownBrowser) {
35
+ const redirectPathLocation = parseLocation(redirectPath);
36
+ history.push(redirectPathLocation);
37
+ return;
38
+ }
39
+ // increment reloadCount and reload the current url fully (not using in-app router)
40
+ // try 3 times before going to the error route
41
+ if (reloadCount < 2) {
42
+ Sentry.captureMessage('could not determine if client is LockDown Browser, reloading');
43
+ reloadCount++;
44
+ search.reloadCount = reloadCount.toString();
45
+ window.location.href = window.location.protocol + '//' + window.location.host + window.location.pathname + '?' + stringify(search);
46
+ return;
47
+ }
48
+ Sentry.captureException('client is not LockDown Browser');
49
+ history.push({
50
+ pathname: '/error',
51
+ search: stringify({
52
+ message: LOCKDOWN_BROWSER_LAUNCH_ERROR
53
+ })
54
+ });
55
+ // eslint-disable-next-line react-hooks/exhaustive-deps
56
+ }, []);
57
+ return /*#__PURE__*/_jsxs(_Fragment, {
58
+ children: [/*#__PURE__*/_jsx(Helmet, {
59
+ title: "LockDown Browser Launch"
60
+ }), /*#__PURE__*/_jsx(Loading, {})]
61
+ });
63
62
  };
64
- exports.LockDownBrowserLaunch = LockDownBrowserLaunch;
63
+
65
64
  // required for use in Routes / AsyncComponent
66
- exports.default = exports.LockDownBrowserLaunch;
65
+ export default LockDownBrowserLaunch;
66
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTZW50cnkiLCJwYXJzZSIsInN0cmluZ2lmeSIsInVzZUVmZmVjdCIsIkhlbG1ldCIsInVzZUhpc3RvcnkiLCJ1c2VMb2NhdGlvbiIsIkxPQ0tET1dOX0JST1dTRVJfTEFVTkNIX0VSUk9SIiwiZ2V0TG9ja0Rvd25Ccm93c2VySW5mbyIsInBhcnNlTG9jYXRpb24iLCJMb2FkaW5nIiwianN4IiwiX2pzeCIsIkZyYWdtZW50IiwiX0ZyYWdtZW50IiwianN4cyIsIl9qc3hzIiwiTG9ja0Rvd25Ccm93c2VyTGF1bmNoIiwiaGlzdG9yeSIsImxvY2F0aW9uIiwic2VhcmNoIiwicmVkaXJlY3RQYXRoIiwicmVsb2FkQ291bnQiLCJwYXJzZUludCIsImxvY2tEb3duQnJvd3NlckluZm8iLCJjYXB0dXJlRXhjZXB0aW9uIiwicHVzaCIsInBhdGhuYW1lIiwibWVzc2FnZSIsImlzQ2xpZW50TG9ja0Rvd25Ccm93c2VyIiwicmVkaXJlY3RQYXRoTG9jYXRpb24iLCJjYXB0dXJlTWVzc2FnZSIsInRvU3RyaW5nIiwid2luZG93IiwiaHJlZiIsInByb3RvY29sIiwiaG9zdCIsImNoaWxkcmVuIiwidGl0bGUiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9Mb2NrRG93bkJyb3dzZXIvTGF1bmNoLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBTZW50cnkgZnJvbSAnQHNlbnRyeS9yZWFjdCdcbmltcG9ydCB7IHBhcnNlLCBzdHJpbmdpZnkgfSBmcm9tICdxdWVyeS1zdHJpbmcnXG5pbXBvcnQgeyBGdW5jdGlvbkNvbXBvbmVudCwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBIZWxtZXQgfSBmcm9tICdyZWFjdC1oZWxtZXQnXG5pbXBvcnQgeyB1c2VIaXN0b3J5LCB1c2VMb2NhdGlvbiB9IGZyb20gJ3JlYWN0LXJvdXRlcidcbmltcG9ydCB7IExPQ0tET1dOX0JST1dTRVJfTEFVTkNIX0VSUk9SIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJ1xuaW1wb3J0IHsgZ2V0TG9ja0Rvd25Ccm93c2VySW5mbyB9IGZyb20gJy4uLy4uL3V0aWxzL2xvY2tEb3duQnJvd3NlcidcbmltcG9ydCB7IHBhcnNlTG9jYXRpb24gfSBmcm9tICcuLi8uLi91dGlscy91cmwnXG5pbXBvcnQgeyBMb2FkaW5nIH0gZnJvbSAnLi4vTG9hZGluZydcblxuZXhwb3J0IGNvbnN0IExvY2tEb3duQnJvd3NlckxhdW5jaDogRnVuY3Rpb25Db21wb25lbnQgPSAoKSA9PiB7XG5cdGNvbnN0IGhpc3RvcnkgPSB1c2VIaXN0b3J5KClcblx0Y29uc3QgbG9jYXRpb24gPSB1c2VMb2NhdGlvbigpXG5cdGNvbnN0IHNlYXJjaCA9IHBhcnNlKGxvY2F0aW9uLnNlYXJjaClcblx0Y29uc3QgcmVkaXJlY3RQYXRoID0gc2VhcmNoLnJlZGlyZWN0UGF0aFxuXHRsZXQgcmVsb2FkQ291bnQgPSBzZWFyY2gucmVsb2FkQ291bnQgJiYgdHlwZW9mIHNlYXJjaC5yZWxvYWRDb3VudCA9PT0gJ3N0cmluZycgPyBwYXJzZUludChzZWFyY2gucmVsb2FkQ291bnQpIDogMFxuXG5cdC8vIHRoaXMgZWZmZWN0IHdpbGwgcnVuIG9uY2UgYWZ0ZXIgdGhpcyBjb21wb25lbnQgcmVuZGVyc1xuXHQvLyBhbGxvdyBMb2NrRG93biBCcm93c2VyIHRvIHNldCBpdHMgY29va2llc1xuXHR1c2VFZmZlY3QoKCkgPT4ge1xuXHRcdGNvbnN0IGxvY2tEb3duQnJvd3NlckluZm8gPSBnZXRMb2NrRG93bkJyb3dzZXJJbmZvKClcblx0XHQvLyByZWRpcmVjdCBwYXRoIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGEgc2luZ2xlIHN0cmluZ1xuXHRcdGlmICghcmVkaXJlY3RQYXRoIHx8IHR5cGVvZiByZWRpcmVjdFBhdGggIT09ICdzdHJpbmcnKSB7XG5cdFx0XHRTZW50cnkuY2FwdHVyZUV4Y2VwdGlvbigncmVkaXJlY3RQYXRoIGlzIHVuZGVmaW5lZCcpXG5cdFx0XHRoaXN0b3J5LnB1c2goe1xuXHRcdFx0XHRwYXRobmFtZTogJy9lcnJvcicsXG5cdFx0XHRcdHNlYXJjaDogc3RyaW5naWZ5KHsgbWVzc2FnZTogTE9DS0RPV05fQlJPV1NFUl9MQVVOQ0hfRVJST1IgfSlcblx0XHRcdH0pXG5cdFx0XHRyZXR1cm5cblx0XHR9XG5cdFx0Ly8gaWYgTERCIGNvb2tpZXMgYXJlIHNldCwgcmVkaXJlY3QgdG8gdGhlIGZpbmFsIHBhdGhcblx0XHRpZiAobG9ja0Rvd25Ccm93c2VySW5mby5pc0NsaWVudExvY2tEb3duQnJvd3Nlcikge1xuXHRcdFx0Y29uc3QgcmVkaXJlY3RQYXRoTG9jYXRpb24gPSBwYXJzZUxvY2F0aW9uKHJlZGlyZWN0UGF0aClcblx0XHRcdGhpc3RvcnkucHVzaChyZWRpcmVjdFBhdGhMb2NhdGlvbilcblx0XHRcdHJldHVyblxuXHRcdH1cblx0XHQvLyBpbmNyZW1lbnQgcmVsb2FkQ291bnQgYW5kIHJlbG9hZCB0aGUgY3VycmVudCB1cmwgZnVsbHkgKG5vdCB1c2luZyBpbi1hcHAgcm91dGVyKVxuXHRcdC8vIHRyeSAzIHRpbWVzIGJlZm9yZSBnb2luZyB0byB0aGUgZXJyb3Igcm91dGVcblx0XHRpZiAocmVsb2FkQ291bnQgPCAyKSB7XG5cdFx0XHRTZW50cnkuY2FwdHVyZU1lc3NhZ2UoJ2NvdWxkIG5vdCBkZXRlcm1pbmUgaWYgY2xpZW50IGlzIExvY2tEb3duIEJyb3dzZXIsIHJlbG9hZGluZycpXG5cdFx0XHRyZWxvYWRDb3VudCsrXG5cdFx0XHRzZWFyY2gucmVsb2FkQ291bnQgPSByZWxvYWRDb3VudC50b1N0cmluZygpXG5cdFx0XHR3aW5kb3cubG9jYXRpb24uaHJlZiA9XG5cdFx0XHRcdHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCArXG5cdFx0XHRcdCcvLycgK1xuXHRcdFx0XHR3aW5kb3cubG9jYXRpb24uaG9zdCArXG5cdFx0XHRcdHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSArXG5cdFx0XHRcdCc/JyArXG5cdFx0XHRcdHN0cmluZ2lmeShzZWFyY2gpXG5cdFx0XHRyZXR1cm5cblx0XHR9XG5cdFx0U2VudHJ5LmNhcHR1cmVFeGNlcHRpb24oJ2NsaWVudCBpcyBub3QgTG9ja0Rvd24gQnJvd3NlcicpXG5cdFx0aGlzdG9yeS5wdXNoKHtcblx0XHRcdHBhdGhuYW1lOiAnL2Vycm9yJyxcblx0XHRcdHNlYXJjaDogc3RyaW5naWZ5KHsgbWVzc2FnZTogTE9DS0RPV05fQlJPV1NFUl9MQVVOQ0hfRVJST1IgfSlcblx0XHR9KVxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcblx0fSwgW10pXG5cblx0cmV0dXJuIChcblx0XHQ8PlxuXHRcdFx0PEhlbG1ldCB0aXRsZT1cIkxvY2tEb3duIEJyb3dzZXIgTGF1bmNoXCIgLz5cblx0XHRcdDxMb2FkaW5nIC8+XG5cdFx0PC8+XG5cdClcbn1cblxuLy8gcmVxdWlyZWQgZm9yIHVzZSBpbiBSb3V0ZXMgLyBBc3luY0NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgTG9ja0Rvd25Ccm93c2VyTGF1bmNoXG4iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBS0EsTUFBTSxNQUFNLGVBQWU7QUFDdkMsU0FBU0MsS0FBSyxFQUFFQyxTQUFTLFFBQVEsY0FBYztBQUMvQyxTQUE0QkMsU0FBUyxRQUFRLE9BQU87QUFDcEQsU0FBU0MsTUFBTSxRQUFRLGNBQWM7QUFDckMsU0FBU0MsVUFBVSxFQUFFQyxXQUFXLFFBQVEsY0FBYztBQUN0RCxTQUFTQyw2QkFBNkIsUUFBUSxpQkFBaUI7QUFDL0QsU0FBU0Msc0JBQXNCLFFBQVEsNkJBQTZCO0FBQ3BFLFNBQVNDLGFBQWEsUUFBUSxpQkFBaUI7QUFDL0MsU0FBU0MsT0FBTyxRQUFRLFlBQVk7QUFBQSxTQUFBQyxHQUFBLElBQUFDLElBQUEsRUFBQUMsUUFBQSxJQUFBQyxTQUFBLEVBQUFDLElBQUEsSUFBQUMsS0FBQTtBQUVwQyxPQUFPLE1BQU1DLHFCQUF3QyxHQUFHQSxDQUFBLEtBQU07RUFDN0QsTUFBTUMsT0FBTyxHQUFHYixVQUFVLENBQUMsQ0FBQztFQUM1QixNQUFNYyxRQUFRLEdBQUdiLFdBQVcsQ0FBQyxDQUFDO0VBQzlCLE1BQU1jLE1BQU0sR0FBR25CLEtBQUssQ0FBQ2tCLFFBQVEsQ0FBQ0MsTUFBTSxDQUFDO0VBQ3JDLE1BQU1DLFlBQVksR0FBR0QsTUFBTSxDQUFDQyxZQUFZO0VBQ3hDLElBQUlDLFdBQVcsR0FBR0YsTUFBTSxDQUFDRSxXQUFXLElBQUksT0FBT0YsTUFBTSxDQUFDRSxXQUFXLEtBQUssUUFBUSxHQUFHQyxRQUFRLENBQUNILE1BQU0sQ0FBQ0UsV0FBVyxDQUFDLEdBQUcsQ0FBQzs7RUFFakg7RUFDQTtFQUNBbkIsU0FBUyxDQUFDLE1BQU07SUFDZixNQUFNcUIsbUJBQW1CLEdBQUdoQixzQkFBc0IsQ0FBQyxDQUFDO0lBQ3BEO0lBQ0EsSUFBSSxDQUFDYSxZQUFZLElBQUksT0FBT0EsWUFBWSxLQUFLLFFBQVEsRUFBRTtNQUN0RHJCLE1BQU0sQ0FBQ3lCLGdCQUFnQixDQUFDLDJCQUEyQixDQUFDO01BQ3BEUCxPQUFPLENBQUNRLElBQUksQ0FBQztRQUNaQyxRQUFRLEVBQUUsUUFBUTtRQUNsQlAsTUFBTSxFQUFFbEIsU0FBUyxDQUFDO1VBQUUwQixPQUFPLEVBQUVyQjtRQUE4QixDQUFDO01BQzdELENBQUMsQ0FBQztNQUNGO0lBQ0Q7SUFDQTtJQUNBLElBQUlpQixtQkFBbUIsQ0FBQ0ssdUJBQXVCLEVBQUU7TUFDaEQsTUFBTUMsb0JBQW9CLEdBQUdyQixhQUFhLENBQUNZLFlBQVksQ0FBQztNQUN4REgsT0FBTyxDQUFDUSxJQUFJLENBQUNJLG9CQUFvQixDQUFDO01BQ2xDO0lBQ0Q7SUFDQTtJQUNBO0lBQ0EsSUFBSVIsV0FBVyxHQUFHLENBQUMsRUFBRTtNQUNwQnRCLE1BQU0sQ0FBQytCLGNBQWMsQ0FBQyw4REFBOEQsQ0FBQztNQUNyRlQsV0FBVyxFQUFFO01BQ2JGLE1BQU0sQ0FBQ0UsV0FBVyxHQUFHQSxXQUFXLENBQUNVLFFBQVEsQ0FBQyxDQUFDO01BQzNDQyxNQUFNLENBQUNkLFFBQVEsQ0FBQ2UsSUFBSSxHQUNuQkQsTUFBTSxDQUFDZCxRQUFRLENBQUNnQixRQUFRLEdBQ3hCLElBQUksR0FDSkYsTUFBTSxDQUFDZCxRQUFRLENBQUNpQixJQUFJLEdBQ3BCSCxNQUFNLENBQUNkLFFBQVEsQ0FBQ1EsUUFBUSxHQUN4QixHQUFHLEdBQ0h6QixTQUFTLENBQUNrQixNQUFNLENBQUM7TUFDbEI7SUFDRDtJQUNBcEIsTUFBTSxDQUFDeUIsZ0JBQWdCLENBQUMsZ0NBQWdDLENBQUM7SUFDekRQLE9BQU8sQ0FBQ1EsSUFBSSxDQUFDO01BQ1pDLFFBQVEsRUFBRSxRQUFRO01BQ2xCUCxNQUFNLEVBQUVsQixTQUFTLENBQUM7UUFBRTBCLE9BQU8sRUFBRXJCO01BQThCLENBQUM7SUFDN0QsQ0FBQyxDQUFDO0lBQ0Y7RUFDRCxDQUFDLEVBQUUsRUFBRSxDQUFDO0VBRU4sb0JBQ0NTLEtBQUEsQ0FBQUYsU0FBQTtJQUFBdUIsUUFBQSxnQkFDQ3pCLElBQUEsQ0FBQ1IsTUFBTTtNQUFDa0MsS0FBSyxFQUFDO0lBQXlCLENBQUUsQ0FBQyxlQUMxQzFCLElBQUEsQ0FBQ0YsT0FBTyxJQUFFLENBQUM7RUFBQSxDQUNWLENBQUM7QUFFTCxDQUFDOztBQUVEO0FBQ0EsZUFBZU8scUJBQXFCIiwiaWdub3JlTGlzdCI6W119