@oneblink/apps-react 11.0.0-beta.1 → 11.0.0-beta.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/dist/apps/auth-service.d.ts +3 -3
- package/dist/apps/auth-service.js +2 -2
- package/dist/apps/auth-service.js.map +1 -1
- package/dist/apps/index.d.ts +10 -0
- package/dist/apps/index.js +10 -0
- package/dist/apps/index.js.map +1 -1
- package/dist/apps/mfa-service.d.ts +4 -0
- package/dist/apps/mfa-service.js +3 -0
- package/dist/apps/mfa-service.js.map +1 -0
- package/dist/apps/services/cognito.d.ts +3 -3
- package/dist/apps/services/cognito.js +3 -3
- package/dist/apps/services/cognito.js.map +1 -1
- package/dist/components/mfa/MfaAuthenticatorAppDialog.js +2 -2
- package/dist/components/mfa/MfaAuthenticatorAppDialog.js.map +1 -1
- package/dist/components/mfa/MfaMethodRow.d.ts +2 -1
- package/dist/components/mfa/MfaMethodRow.js +3 -3
- package/dist/components/mfa/MfaMethodRow.js.map +1 -1
- package/dist/components/mfa/MultiFactorAuthentication.d.ts +11 -10
- package/dist/components/mfa/MultiFactorAuthentication.js +20 -14
- package/dist/components/mfa/MultiFactorAuthentication.js.map +1 -1
- package/dist/hooks/useLogin.d.ts +2 -2
- package/dist/hooks/useLogin.js.map +1 -1
- package/dist/hooks/useMfa.d.ts +66 -29
- package/dist/hooks/useMfa.js +85 -43
- package/dist/hooks/useMfa.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/joinArray.d.ts +1 -0
- package/dist/utils/joinArray.js +7 -0
- package/dist/utils/joinArray.js.map +1 -0
- package/dist/utils/mfa-requirement.d.ts +12 -0
- package/dist/utils/mfa-requirement.js +96 -0
- package/dist/utils/mfa-requirement.js.map +1 -0
- package/package.json +1 -1
package/dist/hooks/useMfa.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import * as React from 'react';
|
|
3
|
-
import {
|
|
3
|
+
import { mfaService } from '../apps';
|
|
4
4
|
import useLoadDataEffect from './useLoadDataEffect';
|
|
5
5
|
export const MfaContext = React.createContext({
|
|
6
6
|
isExternalIdentityProviderUser: false,
|
|
7
7
|
isLoading: true,
|
|
8
8
|
isMfaEnabled: false,
|
|
9
|
-
mfaSettings:
|
|
9
|
+
mfaSettings: mfaService.DEFAULT_MFA_SETTINGS,
|
|
10
10
|
isSetupSuccessOpen: false,
|
|
11
11
|
isSettingUpMfa: false,
|
|
12
12
|
isSetupMethodDialogOpen: false,
|
|
@@ -94,23 +94,36 @@ function setPreferredMfaMethodInSettings(mfaSettings, mfaMethod) {
|
|
|
94
94
|
* useUserMeetsMfaRequirement,
|
|
95
95
|
* } from '@oneblink/apps-react'
|
|
96
96
|
*
|
|
97
|
-
* function Component() {
|
|
98
|
-
* const { isLoading,
|
|
99
|
-
* useUserMeetsMfaRequirement(
|
|
100
|
-
*
|
|
97
|
+
* function Component({ teamMemberMfaRequirement }) {
|
|
98
|
+
* const { mfaSetupRequired, isLoading, loadingError, refreshMfa } =
|
|
99
|
+
* useUserMeetsMfaRequirement(teamMemberMfaRequirement)
|
|
100
|
+
*
|
|
101
|
+
* if (isLoading) {
|
|
102
|
+
* return <Loading />
|
|
103
|
+
* }
|
|
104
|
+
*
|
|
105
|
+
* if (loadingError) {
|
|
106
|
+
* return <Error onRetry={refreshMfa} />
|
|
107
|
+
* }
|
|
108
|
+
*
|
|
109
|
+
* if (mfaSetupRequired) {
|
|
110
|
+
* return <ConfigureMfa />
|
|
111
|
+
* }
|
|
112
|
+
*
|
|
113
|
+
* return <Application />
|
|
101
114
|
* }
|
|
102
115
|
*
|
|
103
|
-
* function App() {
|
|
116
|
+
* function App({ teamMemberMfaRequirement }) {
|
|
104
117
|
* return (
|
|
105
118
|
* <MfaProvider isExternalIdentityProviderUser={false}>
|
|
106
|
-
* <Component />
|
|
119
|
+
* <Component teamMemberMfaRequirement={teamMemberMfaRequirement} />
|
|
107
120
|
* </MfaProvider>
|
|
108
121
|
* )
|
|
109
122
|
* }
|
|
110
123
|
*
|
|
111
124
|
* const root = document.getElementById('root')
|
|
112
125
|
* if (root) {
|
|
113
|
-
* ReactDOM.render(<App />, root)
|
|
126
|
+
* ReactDOM.render(<App teamMemberMfaRequirement={mfaRequirement} />, root)
|
|
114
127
|
* }
|
|
115
128
|
* ```
|
|
116
129
|
*
|
|
@@ -123,7 +136,7 @@ export function MfaProvider({ children, isExternalIdentityProviderUser, }) {
|
|
|
123
136
|
isExternalIdentityProviderUser,
|
|
124
137
|
isLoading: !isExternalIdentityProviderUser,
|
|
125
138
|
isMfaEnabled: false,
|
|
126
|
-
mfaSettings:
|
|
139
|
+
mfaSettings: mfaService.DEFAULT_MFA_SETTINGS,
|
|
127
140
|
isSetupSuccessOpen: false,
|
|
128
141
|
isSettingUpMfa: false,
|
|
129
142
|
isSetupMethodDialogOpen: false,
|
|
@@ -139,11 +152,11 @@ export function MfaProvider({ children, isExternalIdentityProviderUser, }) {
|
|
|
139
152
|
...currentState,
|
|
140
153
|
isLoading: true,
|
|
141
154
|
isMfaEnabled: false,
|
|
142
|
-
mfaSettings:
|
|
155
|
+
mfaSettings: mfaService.DEFAULT_MFA_SETTINGS,
|
|
143
156
|
loadingError: undefined,
|
|
144
157
|
}));
|
|
145
158
|
try {
|
|
146
|
-
const mfaSettings = await
|
|
159
|
+
const mfaSettings = await mfaService.getMfaSettings(abortSignal);
|
|
147
160
|
if (!abortSignal.aborted) {
|
|
148
161
|
setState((currentState) => ({
|
|
149
162
|
...currentState,
|
|
@@ -231,7 +244,7 @@ export function MfaProvider({ children, isExternalIdentityProviderUser, }) {
|
|
|
231
244
|
smsPreferred = !hasPreferredMfaMethod(currentState.mfaSettings);
|
|
232
245
|
return currentState;
|
|
233
246
|
});
|
|
234
|
-
await
|
|
247
|
+
await mfaService.setupSmsMfa({
|
|
235
248
|
preferred: smsPreferred,
|
|
236
249
|
});
|
|
237
250
|
setState((currentState) => {
|
|
@@ -252,7 +265,7 @@ export function MfaProvider({ children, isExternalIdentityProviderUser, }) {
|
|
|
252
265
|
setupError: undefined,
|
|
253
266
|
}));
|
|
254
267
|
try {
|
|
255
|
-
const { isPhoneNumberVerified } = await
|
|
268
|
+
const { isPhoneNumberVerified } = await mfaService.updateUserPhoneNumber(phoneNumber);
|
|
256
269
|
if (!isPhoneNumberVerified) {
|
|
257
270
|
setState((currentState) => ({
|
|
258
271
|
...currentState,
|
|
@@ -296,7 +309,7 @@ export function MfaProvider({ children, isExternalIdentityProviderUser, }) {
|
|
|
296
309
|
setupError: undefined,
|
|
297
310
|
}));
|
|
298
311
|
try {
|
|
299
|
-
await
|
|
312
|
+
await mfaService.verifyUserPhoneNumber(code);
|
|
300
313
|
setState((currentState) => ({
|
|
301
314
|
...currentState,
|
|
302
315
|
mfaSettings: {
|
|
@@ -325,7 +338,7 @@ export function MfaProvider({ children, isExternalIdentityProviderUser, }) {
|
|
|
325
338
|
phoneVerificationCodeSentAt: Date.now(),
|
|
326
339
|
}));
|
|
327
340
|
try {
|
|
328
|
-
await
|
|
341
|
+
await mfaService.sendPhoneNumberVerificationCode();
|
|
329
342
|
}
|
|
330
343
|
catch (error) {
|
|
331
344
|
setState((currentState) => ({
|
|
@@ -353,7 +366,7 @@ export function MfaProvider({ children, isExternalIdentityProviderUser, }) {
|
|
|
353
366
|
setupError: undefined,
|
|
354
367
|
}));
|
|
355
368
|
try {
|
|
356
|
-
await
|
|
369
|
+
await mfaService.removeUserPhoneNumber();
|
|
357
370
|
setState((currentState) => ({
|
|
358
371
|
...currentState,
|
|
359
372
|
isRemovePhoneNumberDialogOpen: false,
|
|
@@ -383,7 +396,7 @@ export function MfaProvider({ children, isExternalIdentityProviderUser, }) {
|
|
|
383
396
|
setupError: undefined,
|
|
384
397
|
}));
|
|
385
398
|
try {
|
|
386
|
-
let mfaSettings =
|
|
399
|
+
let mfaSettings = mfaService.DEFAULT_MFA_SETTINGS;
|
|
387
400
|
setState((currentState) => {
|
|
388
401
|
mfaSettings = currentState.mfaSettings;
|
|
389
402
|
return currentState;
|
|
@@ -408,7 +421,7 @@ export function MfaProvider({ children, isExternalIdentityProviderUser, }) {
|
|
|
408
421
|
return;
|
|
409
422
|
}
|
|
410
423
|
const hasPreferredMethod = hasPreferredMfaMethod(mfaSettings);
|
|
411
|
-
const newMfaAuthenticatorAppSetup = await
|
|
424
|
+
const newMfaAuthenticatorAppSetup = await mfaService.setupMfaAuthenticatorApp({
|
|
412
425
|
preferred: !hasPreferredMethod,
|
|
413
426
|
});
|
|
414
427
|
setState((currentState) => ({
|
|
@@ -447,8 +460,8 @@ export function MfaProvider({ children, isExternalIdentityProviderUser, }) {
|
|
|
447
460
|
if (!disablingMfaMethod) {
|
|
448
461
|
return;
|
|
449
462
|
}
|
|
450
|
-
await
|
|
451
|
-
const mfaSettings = await
|
|
463
|
+
await mfaService.disableMfaMethod(disablingMfaMethod);
|
|
464
|
+
const mfaSettings = await mfaService.getMfaSettings();
|
|
452
465
|
disablingMfaMethodRef.current = undefined;
|
|
453
466
|
setState((currentState) => ({
|
|
454
467
|
...currentState,
|
|
@@ -464,7 +477,7 @@ export function MfaProvider({ children, isExternalIdentityProviderUser, }) {
|
|
|
464
477
|
setupError: undefined,
|
|
465
478
|
}));
|
|
466
479
|
try {
|
|
467
|
-
await
|
|
480
|
+
await mfaService.setPreferredMfaMethod(mfaMethod);
|
|
468
481
|
setState((currentState) => ({
|
|
469
482
|
...currentState,
|
|
470
483
|
isSettingPreferredMfaMethod: false,
|
|
@@ -526,41 +539,70 @@ export function MfaProvider({ children, isExternalIdentityProviderUser, }) {
|
|
|
526
539
|
cancelDisablingMfa,
|
|
527
540
|
completeDisablingMfa,
|
|
528
541
|
]);
|
|
529
|
-
return
|
|
542
|
+
return _jsx(MfaContext.Provider, { value: value, children: children });
|
|
530
543
|
}
|
|
531
544
|
export default function useMfa() {
|
|
532
545
|
return React.useContext(MfaContext);
|
|
533
546
|
}
|
|
534
547
|
/**
|
|
535
|
-
* React hook to
|
|
536
|
-
* application.
|
|
537
|
-
* `<MfaProvider
|
|
548
|
+
* React hook to determine whether the logged in user must set up MFA before
|
|
549
|
+
* accessing your application. Reads MFA settings from the `<MfaProvider />`
|
|
550
|
+
* context. Will throw an Error if used outside of `<MfaProvider />`.
|
|
538
551
|
*
|
|
539
|
-
*
|
|
552
|
+
* Users signed in via an external identity provider are not required to set up
|
|
553
|
+
* MFA.
|
|
554
|
+
*
|
|
555
|
+
* #### Example
|
|
540
556
|
*
|
|
541
557
|
* ```js
|
|
542
|
-
* import { useUserMeetsMfaRequirement } from '@oneblink/apps-react'
|
|
558
|
+
* import { MfaProvider, useUserMeetsMfaRequirement } from '@oneblink/apps-react'
|
|
559
|
+
*
|
|
560
|
+
* function Component({ teamMemberMfaRequirement }) {
|
|
561
|
+
* const { mfaSetupRequired, isLoading, loadingError, refreshMfa } =
|
|
562
|
+
* useUserMeetsMfaRequirement(teamMemberMfaRequirement)
|
|
563
|
+
*
|
|
564
|
+
* if (isLoading) {
|
|
565
|
+
* return <Loading />
|
|
566
|
+
* }
|
|
543
567
|
*
|
|
544
|
-
*
|
|
568
|
+
* if (loadingError) {
|
|
569
|
+
* return <Error onRetry={refreshMfa} />
|
|
570
|
+
* }
|
|
545
571
|
*
|
|
546
|
-
*
|
|
547
|
-
*
|
|
548
|
-
*
|
|
572
|
+
* if (mfaSetupRequired) {
|
|
573
|
+
* return <ConfigureMfa />
|
|
574
|
+
* }
|
|
575
|
+
*
|
|
576
|
+
* return <Application />
|
|
549
577
|
* }
|
|
550
578
|
* ```
|
|
551
579
|
*
|
|
552
|
-
* @
|
|
580
|
+
* @param mfaRequirement - The MFA requirement to enforce, e.g. from your
|
|
581
|
+
* organisation or app settings.
|
|
582
|
+
* @returns Whether MFA setup is required, along with loading state from the MFA
|
|
583
|
+
* provider.
|
|
553
584
|
* @group Hooks
|
|
554
585
|
*/
|
|
555
|
-
export function useUserMeetsMfaRequirement(
|
|
556
|
-
const
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
return
|
|
563
|
-
|
|
564
|
-
|
|
586
|
+
export function useUserMeetsMfaRequirement(mfaRequirement) {
|
|
587
|
+
const { isLoading, loadingError, mfaSettings, loadMfa, isExternalIdentityProviderUser, } = useMfa();
|
|
588
|
+
return React.useMemo(() => {
|
|
589
|
+
const mfaRequired = mfaService.isMfaRequired(mfaRequirement);
|
|
590
|
+
const shouldCheckMfa = mfaRequired && !isExternalIdentityProviderUser;
|
|
591
|
+
const meetsRequirement = mfaService.userMeetsMfaRequirement(mfaRequirement, mfaSettings);
|
|
592
|
+
const mfaSetupRequired = shouldCheckMfa && !isLoading && !loadingError && !meetsRequirement;
|
|
593
|
+
return {
|
|
594
|
+
mfaSetupRequired,
|
|
595
|
+
isLoading: shouldCheckMfa && isLoading,
|
|
596
|
+
loadingError: shouldCheckMfa ? loadingError : undefined,
|
|
597
|
+
refreshMfa: loadMfa,
|
|
598
|
+
};
|
|
599
|
+
}, [
|
|
600
|
+
mfaRequirement,
|
|
601
|
+
isExternalIdentityProviderUser,
|
|
602
|
+
mfaSettings,
|
|
603
|
+
isLoading,
|
|
604
|
+
loadingError,
|
|
605
|
+
loadMfa,
|
|
606
|
+
]);
|
|
565
607
|
}
|
|
566
608
|
//# sourceMappingURL=useMfa.js.map
|
package/dist/hooks/useMfa.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMfa.js","sourceRoot":"","sources":["../../src/hooks/useMfa.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport { authService } from '../apps'\nimport useLoadDataEffect from './useLoadDataEffect'\n\ntype MfaState = {\n isExternalIdentityProviderUser: boolean\n isLoading: boolean\n isMfaEnabled: boolean\n mfaSettings: authService.MfaSettings\n isSetupSuccessOpen: boolean\n loadingError?: Error\n isSettingUpMfa: boolean\n settingUpMfaMethod?: authService.MfaMethod\n isSetupMethodDialogOpen: boolean\n disablingMfaMethod?: authService.MfaMethod\n isSettingPreferredMfaMethod: boolean\n setupError?: Error\n mfaAuthenticatorAppSetup?: Awaited<\n ReturnType<typeof authService.setupMfaAuthenticatorApp>\n >\n isPhoneNumberDialogOpen: boolean\n phoneVerificationCodeSentAt?: number\n isRemovePhoneNumberDialogOpen: boolean\n}\n\nexport const MfaContext = React.createContext<\n MfaState & {\n beginMfaSetup: (mfaMethod: authService.MfaMethod) => Promise<void>\n openMfaSetupMethodDialog: () => void\n closeMfaSetupMethodDialog: () => void\n beginDisablingMfaMethod: (mfaMethod: authService.MfaMethod) => void\n setPreferredMfaMethod: (mfaMethod: authService.MfaMethod) => Promise<void>\n openPhoneNumberDialog: () => void\n closePhoneNumberDialog: () => void\n savePhoneNumber: (phoneNumber: string) => Promise<void>\n verifyPhoneNumber: (code: string) => Promise<void>\n resendPhoneNumberVerificationCode: () => Promise<void>\n beginRemovingPhoneNumber: () => void\n cancelRemovingPhoneNumber: () => void\n completeRemovingPhoneNumber: () => Promise<void>\n hideSetupSuccess: () => void\n cancelMfaAuthenticatorAppSetup: () => void\n completeMfaAuthenticatorAppSetup: () => Promise<void>\n cancelDisablingMfa: () => void\n completeDisablingMfa: () => Promise<void>\n clearMfaSetupError: () => void\n loadMfa: () => void\n }\n>({\n isExternalIdentityProviderUser: false,\n isLoading: true,\n isMfaEnabled: false,\n mfaSettings: authService.DEFAULT_MFA_SETTINGS,\n isSetupSuccessOpen: false,\n isSettingUpMfa: false,\n isSetupMethodDialogOpen: false,\n isSettingPreferredMfaMethod: false,\n isPhoneNumberDialogOpen: false,\n isRemovePhoneNumberDialogOpen: false,\n beginMfaSetup: async () => {},\n openMfaSetupMethodDialog: () => {},\n closeMfaSetupMethodDialog: () => {},\n beginDisablingMfaMethod: () => {},\n setPreferredMfaMethod: async () => {},\n openPhoneNumberDialog: () => {},\n closePhoneNumberDialog: () => {},\n savePhoneNumber: async () => {},\n verifyPhoneNumber: async () => {},\n resendPhoneNumberVerificationCode: async () => {},\n beginRemovingPhoneNumber: () => {},\n cancelRemovingPhoneNumber: () => {},\n completeRemovingPhoneNumber: async () => {},\n hideSetupSuccess: () => {},\n cancelMfaAuthenticatorAppSetup: () => {},\n completeMfaAuthenticatorAppSetup: async () => {},\n cancelDisablingMfa: () => {},\n completeDisablingMfa: async () => {},\n clearMfaSetupError: () => {},\n loadMfa: () => {},\n})\n\nfunction getIsMfaEnabled(mfaSettings: authService.MfaSettings) {\n return mfaSettings.authenticator.enabled || mfaSettings.sms.enabled\n}\n\nfunction hasPreferredMfaMethod(mfaSettings: authService.MfaSettings) {\n return (\n (mfaSettings.authenticator.enabled &&\n mfaSettings.authenticator.preferred) ||\n (mfaSettings.sms.enabled && mfaSettings.sms.preferred)\n )\n}\n\nfunction enableSmsMfaInSettings(\n mfaSettings: authService.MfaSettings,\n smsPreferred: boolean,\n): authService.MfaSettings {\n return {\n ...mfaSettings,\n sms: {\n ...mfaSettings.sms,\n enabled: true,\n preferred: smsPreferred,\n },\n }\n}\n\nfunction enableAuthenticatorMfaInSettings(\n mfaSettings: authService.MfaSettings,\n authenticatorPreferred: boolean,\n): authService.MfaSettings {\n return {\n ...mfaSettings,\n authenticator: {\n enabled: true,\n preferred: authenticatorPreferred,\n },\n sms: {\n ...mfaSettings.sms,\n preferred: authenticatorPreferred ? false : mfaSettings.sms.preferred,\n },\n }\n}\n\nfunction setPreferredMfaMethodInSettings(\n mfaSettings: authService.MfaSettings,\n mfaMethod: authService.MfaMethod,\n): authService.MfaSettings {\n return {\n ...mfaSettings,\n authenticator: {\n ...mfaSettings.authenticator,\n preferred: mfaMethod === 'authenticator',\n },\n sms: {\n ...mfaSettings.sms,\n preferred: mfaMethod === 'sms',\n },\n }\n}\n\n/**\n * React Component that provides the context for the\n * `useUserMeetsMfaRequirement()` hook and `<MultiFactorAuthentication />`\n * component, to be used by components further down your component tree. **It\n * should only be included in your component tree once and ideally at the root\n * of the application.**\n *\n * #### Example\n *\n * ```js\n * import * as React from 'react'\n * import {\n * MfaProvider,\n * useUserMeetsMfaRequirement,\n * } from '@oneblink/apps-react'\n *\n * function Component() {\n * const { isLoading, userMeetsMfaRequirement } =\n * useUserMeetsMfaRequirement(true)\n * // use MFA Requirement details here\n * }\n *\n * function App() {\n * return (\n * <MfaProvider isExternalIdentityProviderUser={false}>\n * <Component />\n * </MfaProvider>\n * )\n * }\n *\n * const root = document.getElementById('root')\n * if (root) {\n * ReactDOM.render(<App />, root)\n * }\n * ```\n *\n * @param props\n * @returns\n * @group Components\n */\nexport function MfaProvider({\n children,\n isExternalIdentityProviderUser,\n}: {\n children: React.ReactNode\n isExternalIdentityProviderUser: boolean\n}) {\n const [state, setState] = React.useState<MfaState>({\n isExternalIdentityProviderUser,\n isLoading: !isExternalIdentityProviderUser,\n isMfaEnabled: false,\n mfaSettings: authService.DEFAULT_MFA_SETTINGS,\n isSetupSuccessOpen: false,\n isSettingUpMfa: false,\n isSetupMethodDialogOpen: false,\n isSettingPreferredMfaMethod: false,\n isPhoneNumberDialogOpen: false,\n isRemovePhoneNumberDialogOpen: false,\n })\n\n const handleLoadMfa = React.useCallback(\n async (abortSignal: AbortSignal) => {\n if (isExternalIdentityProviderUser) {\n return\n }\n\n setState((currentState) => ({\n ...currentState,\n isLoading: true,\n isMfaEnabled: false,\n mfaSettings: authService.DEFAULT_MFA_SETTINGS,\n loadingError: undefined,\n }))\n try {\n const mfaSettings = await authService.getMfaSettings(abortSignal)\n if (!abortSignal.aborted) {\n setState((currentState) => ({\n ...currentState,\n isLoading: false,\n mfaSettings,\n isMfaEnabled: getIsMfaEnabled(mfaSettings),\n }))\n }\n } catch (error) {\n if (abortSignal.aborted) {\n return\n }\n\n setState((currentState) => ({\n ...currentState,\n isLoading: false,\n loadingError: error as Error,\n }))\n }\n },\n [isExternalIdentityProviderUser],\n )\n\n const loadMfa = useLoadDataEffect(handleLoadMfa)\n\n const clearMfaSetupError = React.useCallback(() => {\n setState((currentState) => ({\n ...currentState,\n setupError: undefined,\n }))\n }, [])\n\n const openMfaSetupMethodDialog = React.useCallback(() => {\n setState((currentState) => ({\n ...currentState,\n isSetupMethodDialogOpen: true,\n }))\n }, [])\n\n const closeMfaSetupMethodDialog = React.useCallback(() => {\n setState((currentState) => ({\n ...currentState,\n isSetupMethodDialogOpen: false,\n }))\n }, [])\n\n const hideSetupSuccess = React.useCallback(() => {\n setState((currentState) => ({\n ...currentState,\n isSetupSuccessOpen: false,\n }))\n }, [])\n\n const cancelMfaAuthenticatorAppSetup = React.useCallback(() => {\n setState((currentState) => ({\n ...currentState,\n mfaAuthenticatorAppSetup: undefined,\n settingUpMfaMethod: undefined,\n }))\n }, [])\n\n const completeMfaAuthenticatorAppSetup = React.useCallback(async () => {\n setState((currentState) => {\n const authenticatorPreferred = !hasPreferredMfaMethod(\n currentState.mfaSettings,\n )\n const mfaSettings = enableAuthenticatorMfaInSettings(\n currentState.mfaSettings,\n authenticatorPreferred,\n )\n\n return {\n ...currentState,\n isSetupSuccessOpen: true,\n isMfaEnabled: getIsMfaEnabled(mfaSettings),\n mfaSettings,\n mfaAuthenticatorAppSetup: undefined,\n settingUpMfaMethod: undefined,\n }\n })\n }, [])\n\n const openPhoneNumberDialog = React.useCallback(() => {\n setState((currentState) => ({\n ...currentState,\n isPhoneNumberDialogOpen: true,\n phoneVerificationCodeSentAt: undefined,\n setupError: undefined,\n }))\n }, [])\n\n const closePhoneNumberDialog = React.useCallback(() => {\n setState((currentState) => ({\n ...currentState,\n isPhoneNumberDialogOpen: false,\n phoneVerificationCodeSentAt: undefined,\n }))\n }, [])\n\n const setupSmsMfaMethod = React.useCallback(async () => {\n let smsPreferred = false\n\n setState((currentState) => {\n smsPreferred = !hasPreferredMfaMethod(currentState.mfaSettings)\n return currentState\n })\n\n await authService.setupSmsMfa({\n preferred: smsPreferred,\n })\n\n setState((currentState) => {\n const mfaSettings = enableSmsMfaInSettings(\n currentState.mfaSettings,\n smsPreferred,\n )\n\n return {\n ...currentState,\n isSetupSuccessOpen: true,\n isSettingUpMfa: false,\n settingUpMfaMethod: undefined,\n isMfaEnabled: getIsMfaEnabled(mfaSettings),\n mfaSettings,\n }\n })\n }, [])\n\n const savePhoneNumber = React.useCallback(\n async (phoneNumber: string) => {\n setState((currentState) => ({\n ...currentState,\n setupError: undefined,\n }))\n\n try {\n const { isPhoneNumberVerified } =\n await authService.updateUserPhoneNumber(phoneNumber)\n\n if (!isPhoneNumberVerified) {\n setState((currentState) => ({\n ...currentState,\n phoneVerificationCodeSentAt: Date.now(),\n mfaSettings: {\n ...currentState.mfaSettings,\n sms: {\n ...currentState.mfaSettings.sms,\n phoneNumber,\n isPhoneNumberVerified: false,\n },\n },\n }))\n return\n }\n setState((currentState) => ({\n ...currentState,\n mfaSettings: {\n ...currentState.mfaSettings,\n sms: {\n ...currentState.mfaSettings.sms,\n phoneNumber,\n isPhoneNumberVerified,\n },\n },\n isPhoneNumberDialogOpen: false,\n phoneVerificationCodeSentAt: undefined,\n }))\n await setupSmsMfaMethod()\n } catch (error) {\n setState((currentState) => ({\n ...currentState,\n setupError: error as Error,\n }))\n }\n },\n [setupSmsMfaMethod],\n )\n\n const verifyPhoneNumber = React.useCallback(\n async (code: string) => {\n setState((currentState) => ({\n ...currentState,\n setupError: undefined,\n }))\n\n try {\n await authService.verifyUserPhoneNumber(code)\n\n setState((currentState) => ({\n ...currentState,\n mfaSettings: {\n ...currentState.mfaSettings,\n sms: {\n ...currentState.mfaSettings.sms,\n isPhoneNumberVerified: true,\n },\n },\n isPhoneNumberDialogOpen: false,\n phoneVerificationCodeSentAt: undefined,\n }))\n await setupSmsMfaMethod()\n } catch (error) {\n setState((currentState) => ({\n ...currentState,\n setupError: error as Error,\n }))\n }\n },\n [setupSmsMfaMethod],\n )\n\n const resendPhoneNumberVerificationCode = React.useCallback(async () => {\n setState((currentState) => ({\n ...currentState,\n setupError: undefined,\n phoneVerificationCodeSentAt: Date.now(),\n }))\n\n try {\n await authService.sendPhoneNumberVerificationCode()\n } catch (error) {\n setState((currentState) => ({\n ...currentState,\n setupError: error as Error,\n }))\n }\n }, [])\n\n const beginRemovingPhoneNumber = React.useCallback(() => {\n setState((currentState) => ({\n ...currentState,\n isRemovePhoneNumberDialogOpen: true,\n setupError: undefined,\n }))\n }, [])\n\n const cancelRemovingPhoneNumber = React.useCallback(() => {\n setState((currentState) => ({\n ...currentState,\n isRemovePhoneNumberDialogOpen: false,\n }))\n }, [])\n\n const completeRemovingPhoneNumber = React.useCallback(async () => {\n setState((currentState) => ({\n ...currentState,\n setupError: undefined,\n }))\n\n try {\n await authService.removeUserPhoneNumber()\n setState((currentState) => ({\n ...currentState,\n isRemovePhoneNumberDialogOpen: false,\n mfaSettings: {\n ...currentState.mfaSettings,\n sms: {\n ...currentState.mfaSettings.sms,\n phoneNumber: undefined,\n isPhoneNumberVerified: false,\n },\n },\n }))\n } catch (error) {\n setState((currentState) => ({\n ...currentState,\n setupError: error as Error,\n }))\n }\n }, [])\n\n const beginMfaSetup = React.useCallback(\n async (mfaMethod: authService.MfaMethod) => {\n setState((currentState) => ({\n ...currentState,\n isSettingUpMfa: true,\n settingUpMfaMethod: mfaMethod,\n mfaAuthenticatorAppSetup: undefined,\n setupError: undefined,\n }))\n\n try {\n let mfaSettings = authService.DEFAULT_MFA_SETTINGS\n\n setState((currentState) => {\n mfaSettings = currentState.mfaSettings\n return currentState\n })\n\n if (mfaMethod === 'sms') {\n if (\n !mfaSettings.sms.phoneNumber ||\n !mfaSettings.sms.isPhoneNumberVerified\n ) {\n setState((currentState) => ({\n ...currentState,\n isSettingUpMfa: false,\n settingUpMfaMethod: undefined,\n isSetupMethodDialogOpen: false,\n isPhoneNumberDialogOpen: true,\n }))\n return\n }\n\n await setupSmsMfaMethod()\n setState((currentState) => ({\n ...currentState,\n isSetupMethodDialogOpen: false,\n }))\n return\n }\n\n const hasPreferredMethod = hasPreferredMfaMethod(mfaSettings)\n const newMfaAuthenticatorAppSetup =\n await authService.setupMfaAuthenticatorApp({\n preferred: !hasPreferredMethod,\n })\n setState((currentState) => ({\n ...currentState,\n isSettingUpMfa: false,\n isSetupMethodDialogOpen: false,\n mfaAuthenticatorAppSetup: newMfaAuthenticatorAppSetup,\n }))\n } catch (error) {\n setState((currentState) => ({\n ...currentState,\n isSettingUpMfa: false,\n settingUpMfaMethod: undefined,\n setupError: error as Error,\n }))\n }\n },\n [setupSmsMfaMethod],\n )\n\n const disablingMfaMethodRef = React.useRef<authService.MfaMethod | undefined>(\n undefined,\n )\n\n const beginDisablingMfaMethod = React.useCallback(\n (mfaMethod: authService.MfaMethod) => {\n disablingMfaMethodRef.current = mfaMethod\n setState((currentState) => ({\n ...currentState,\n disablingMfaMethod: mfaMethod,\n }))\n },\n [],\n )\n\n const cancelDisablingMfa = React.useCallback(() => {\n disablingMfaMethodRef.current = undefined\n setState((currentState) => ({\n ...currentState,\n disablingMfaMethod: undefined,\n }))\n }, [])\n\n const completeDisablingMfa = React.useCallback(async () => {\n const disablingMfaMethod = disablingMfaMethodRef.current\n if (!disablingMfaMethod) {\n return\n }\n\n await authService.disableMfaMethod(disablingMfaMethod)\n const mfaSettings = await authService.getMfaSettings()\n disablingMfaMethodRef.current = undefined\n setState((currentState) => ({\n ...currentState,\n disablingMfaMethod: undefined,\n mfaSettings,\n isMfaEnabled: getIsMfaEnabled(mfaSettings),\n }))\n }, [])\n\n const setPreferredMfaMethod = React.useCallback(\n async (mfaMethod: authService.MfaMethod) => {\n setState((currentState) => ({\n ...currentState,\n isSettingPreferredMfaMethod: true,\n setupError: undefined,\n }))\n\n try {\n await authService.setPreferredMfaMethod(mfaMethod)\n setState((currentState) => ({\n ...currentState,\n isSettingPreferredMfaMethod: false,\n mfaSettings: setPreferredMfaMethodInSettings(\n currentState.mfaSettings,\n mfaMethod,\n ),\n }))\n } catch (error) {\n setState((currentState) => ({\n ...currentState,\n isSettingPreferredMfaMethod: false,\n setupError: error as Error,\n }))\n }\n },\n [],\n )\n\n const value = React.useMemo(() => {\n return {\n ...state,\n clearMfaSetupError,\n loadMfa,\n beginMfaSetup,\n openMfaSetupMethodDialog,\n closeMfaSetupMethodDialog,\n beginDisablingMfaMethod,\n setPreferredMfaMethod,\n openPhoneNumberDialog,\n closePhoneNumberDialog,\n savePhoneNumber,\n verifyPhoneNumber,\n resendPhoneNumberVerificationCode,\n beginRemovingPhoneNumber,\n cancelRemovingPhoneNumber,\n completeRemovingPhoneNumber,\n hideSetupSuccess,\n cancelMfaAuthenticatorAppSetup,\n completeMfaAuthenticatorAppSetup,\n cancelDisablingMfa,\n completeDisablingMfa,\n }\n }, [\n state,\n clearMfaSetupError,\n loadMfa,\n beginMfaSetup,\n openMfaSetupMethodDialog,\n closeMfaSetupMethodDialog,\n beginDisablingMfaMethod,\n setPreferredMfaMethod,\n openPhoneNumberDialog,\n closePhoneNumberDialog,\n savePhoneNumber,\n verifyPhoneNumber,\n resendPhoneNumberVerificationCode,\n beginRemovingPhoneNumber,\n cancelRemovingPhoneNumber,\n completeRemovingPhoneNumber,\n hideSetupSuccess,\n cancelMfaAuthenticatorAppSetup,\n completeMfaAuthenticatorAppSetup,\n cancelDisablingMfa,\n completeDisablingMfa,\n ])\n\n return (\n <MfaContext.Provider value={value}>\n {children}\n </MfaContext.Provider>\n )\n}\n\nexport default function useMfa() {\n return React.useContext(MfaContext)\n}\n\n/**\n * React hook to check if the logged in user meets the MFA requirement of your\n * application. Will throw an Error if used outside of the\n * `<MfaProvider />` component.\n *\n * Example\n *\n * ```js\n * import { useUserMeetsMfaRequirement } from '@oneblink/apps-react'\n *\n * const isMfaRequired = true\n *\n * function Component() {\n * const userMeetsMfaRequirement =\n * useUserMeetsMfaRequirement(isMfaRequired)\n * }\n * ```\n *\n * @returns\n * @group Hooks\n */\nexport function useUserMeetsMfaRequirement(isMfaRequired: boolean) {\n const context = React.useContext(MfaContext)\n\n if (!context) {\n throw new Error(\n `\"useUserMeetsMfaRequirement\" hook was used outside of the \"<MfaProvider />\" component's children.`,\n )\n }\n\n const { isMfaEnabled, isExternalIdentityProviderUser } = context\n if (!isMfaRequired || isExternalIdentityProviderUser) {\n return true\n }\n return isMfaEnabled\n}\n"]}
|
|
1
|
+
{"version":3,"file":"useMfa.js","sourceRoot":"","sources":["../../src/hooks/useMfa.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport { mfaService } from '../apps'\nimport useLoadDataEffect from './useLoadDataEffect'\nimport { MiscTypes } from '@oneblink/types'\n\ntype MfaState = {\n isExternalIdentityProviderUser: boolean\n isLoading: boolean\n isMfaEnabled: boolean\n mfaSettings: mfaService.MfaSettings\n isSetupSuccessOpen: boolean\n loadingError?: Error\n isSettingUpMfa: boolean\n settingUpMfaMethod?: mfaService.MfaMethod\n isSetupMethodDialogOpen: boolean\n disablingMfaMethod?: mfaService.MfaMethod\n isSettingPreferredMfaMethod: boolean\n setupError?: Error\n mfaAuthenticatorAppSetup?: Awaited<\n ReturnType<typeof mfaService.setupMfaAuthenticatorApp>\n >\n isPhoneNumberDialogOpen: boolean\n phoneVerificationCodeSentAt?: number\n isRemovePhoneNumberDialogOpen: boolean\n}\n\nexport const MfaContext = React.createContext<\n MfaState & {\n beginMfaSetup: (mfaMethod: mfaService.MfaMethod) => Promise<void>\n openMfaSetupMethodDialog: () => void\n closeMfaSetupMethodDialog: () => void\n beginDisablingMfaMethod: (mfaMethod: mfaService.MfaMethod) => void\n setPreferredMfaMethod: (mfaMethod: mfaService.MfaMethod) => Promise<void>\n openPhoneNumberDialog: () => void\n closePhoneNumberDialog: () => void\n savePhoneNumber: (phoneNumber: string) => Promise<void>\n verifyPhoneNumber: (code: string) => Promise<void>\n resendPhoneNumberVerificationCode: () => Promise<void>\n beginRemovingPhoneNumber: () => void\n cancelRemovingPhoneNumber: () => void\n completeRemovingPhoneNumber: () => Promise<void>\n hideSetupSuccess: () => void\n cancelMfaAuthenticatorAppSetup: () => void\n completeMfaAuthenticatorAppSetup: () => Promise<void>\n cancelDisablingMfa: () => void\n completeDisablingMfa: () => Promise<void>\n clearMfaSetupError: () => void\n loadMfa: () => void\n }\n>({\n isExternalIdentityProviderUser: false,\n isLoading: true,\n isMfaEnabled: false,\n mfaSettings: mfaService.DEFAULT_MFA_SETTINGS,\n isSetupSuccessOpen: false,\n isSettingUpMfa: false,\n isSetupMethodDialogOpen: false,\n isSettingPreferredMfaMethod: false,\n isPhoneNumberDialogOpen: false,\n isRemovePhoneNumberDialogOpen: false,\n beginMfaSetup: async () => {},\n openMfaSetupMethodDialog: () => {},\n closeMfaSetupMethodDialog: () => {},\n beginDisablingMfaMethod: () => {},\n setPreferredMfaMethod: async () => {},\n openPhoneNumberDialog: () => {},\n closePhoneNumberDialog: () => {},\n savePhoneNumber: async () => {},\n verifyPhoneNumber: async () => {},\n resendPhoneNumberVerificationCode: async () => {},\n beginRemovingPhoneNumber: () => {},\n cancelRemovingPhoneNumber: () => {},\n completeRemovingPhoneNumber: async () => {},\n hideSetupSuccess: () => {},\n cancelMfaAuthenticatorAppSetup: () => {},\n completeMfaAuthenticatorAppSetup: async () => {},\n cancelDisablingMfa: () => {},\n completeDisablingMfa: async () => {},\n clearMfaSetupError: () => {},\n loadMfa: () => {},\n})\n\nfunction getIsMfaEnabled(mfaSettings: mfaService.MfaSettings) {\n return mfaSettings.authenticator.enabled || mfaSettings.sms.enabled\n}\n\nfunction hasPreferredMfaMethod(mfaSettings: mfaService.MfaSettings) {\n return (\n (mfaSettings.authenticator.enabled &&\n mfaSettings.authenticator.preferred) ||\n (mfaSettings.sms.enabled && mfaSettings.sms.preferred)\n )\n}\n\nfunction enableSmsMfaInSettings(\n mfaSettings: mfaService.MfaSettings,\n smsPreferred: boolean,\n): mfaService.MfaSettings {\n return {\n ...mfaSettings,\n sms: {\n ...mfaSettings.sms,\n enabled: true,\n preferred: smsPreferred,\n },\n }\n}\n\nfunction enableAuthenticatorMfaInSettings(\n mfaSettings: mfaService.MfaSettings,\n authenticatorPreferred: boolean,\n): mfaService.MfaSettings {\n return {\n ...mfaSettings,\n authenticator: {\n enabled: true,\n preferred: authenticatorPreferred,\n },\n sms: {\n ...mfaSettings.sms,\n preferred: authenticatorPreferred ? false : mfaSettings.sms.preferred,\n },\n }\n}\n\nfunction setPreferredMfaMethodInSettings(\n mfaSettings: mfaService.MfaSettings,\n mfaMethod: mfaService.MfaMethod,\n): mfaService.MfaSettings {\n return {\n ...mfaSettings,\n authenticator: {\n ...mfaSettings.authenticator,\n preferred: mfaMethod === 'authenticator',\n },\n sms: {\n ...mfaSettings.sms,\n preferred: mfaMethod === 'sms',\n },\n }\n}\n\n/**\n * React Component that provides the context for the\n * `useUserMeetsMfaRequirement()` hook and `<MultiFactorAuthentication />`\n * component, to be used by components further down your component tree. **It\n * should only be included in your component tree once and ideally at the root\n * of the application.**\n *\n * #### Example\n *\n * ```js\n * import * as React from 'react'\n * import {\n * MfaProvider,\n * useUserMeetsMfaRequirement,\n * } from '@oneblink/apps-react'\n *\n * function Component({ teamMemberMfaRequirement }) {\n * const { mfaSetupRequired, isLoading, loadingError, refreshMfa } =\n * useUserMeetsMfaRequirement(teamMemberMfaRequirement)\n *\n * if (isLoading) {\n * return <Loading />\n * }\n *\n * if (loadingError) {\n * return <Error onRetry={refreshMfa} />\n * }\n *\n * if (mfaSetupRequired) {\n * return <ConfigureMfa />\n * }\n *\n * return <Application />\n * }\n *\n * function App({ teamMemberMfaRequirement }) {\n * return (\n * <MfaProvider isExternalIdentityProviderUser={false}>\n * <Component teamMemberMfaRequirement={teamMemberMfaRequirement} />\n * </MfaProvider>\n * )\n * }\n *\n * const root = document.getElementById('root')\n * if (root) {\n * ReactDOM.render(<App teamMemberMfaRequirement={mfaRequirement} />, root)\n * }\n * ```\n *\n * @param props\n * @returns\n * @group Components\n */\nexport function MfaProvider({\n children,\n isExternalIdentityProviderUser,\n}: {\n children: React.ReactNode\n isExternalIdentityProviderUser: boolean\n}) {\n const [state, setState] = React.useState<MfaState>({\n isExternalIdentityProviderUser,\n isLoading: !isExternalIdentityProviderUser,\n isMfaEnabled: false,\n mfaSettings: mfaService.DEFAULT_MFA_SETTINGS,\n isSetupSuccessOpen: false,\n isSettingUpMfa: false,\n isSetupMethodDialogOpen: false,\n isSettingPreferredMfaMethod: false,\n isPhoneNumberDialogOpen: false,\n isRemovePhoneNumberDialogOpen: false,\n })\n\n const handleLoadMfa = React.useCallback(\n async (abortSignal: AbortSignal) => {\n if (isExternalIdentityProviderUser) {\n return\n }\n\n setState((currentState) => ({\n ...currentState,\n isLoading: true,\n isMfaEnabled: false,\n mfaSettings: mfaService.DEFAULT_MFA_SETTINGS,\n loadingError: undefined,\n }))\n try {\n const mfaSettings = await mfaService.getMfaSettings(abortSignal)\n if (!abortSignal.aborted) {\n setState((currentState) => ({\n ...currentState,\n isLoading: false,\n mfaSettings,\n isMfaEnabled: getIsMfaEnabled(mfaSettings),\n }))\n }\n } catch (error) {\n if (abortSignal.aborted) {\n return\n }\n\n setState((currentState) => ({\n ...currentState,\n isLoading: false,\n loadingError: error as Error,\n }))\n }\n },\n [isExternalIdentityProviderUser],\n )\n\n const loadMfa = useLoadDataEffect(handleLoadMfa)\n\n const clearMfaSetupError = React.useCallback(() => {\n setState((currentState) => ({\n ...currentState,\n setupError: undefined,\n }))\n }, [])\n\n const openMfaSetupMethodDialog = React.useCallback(() => {\n setState((currentState) => ({\n ...currentState,\n isSetupMethodDialogOpen: true,\n }))\n }, [])\n\n const closeMfaSetupMethodDialog = React.useCallback(() => {\n setState((currentState) => ({\n ...currentState,\n isSetupMethodDialogOpen: false,\n }))\n }, [])\n\n const hideSetupSuccess = React.useCallback(() => {\n setState((currentState) => ({\n ...currentState,\n isSetupSuccessOpen: false,\n }))\n }, [])\n\n const cancelMfaAuthenticatorAppSetup = React.useCallback(() => {\n setState((currentState) => ({\n ...currentState,\n mfaAuthenticatorAppSetup: undefined,\n settingUpMfaMethod: undefined,\n }))\n }, [])\n\n const completeMfaAuthenticatorAppSetup = React.useCallback(async () => {\n setState((currentState) => {\n const authenticatorPreferred = !hasPreferredMfaMethod(\n currentState.mfaSettings,\n )\n const mfaSettings = enableAuthenticatorMfaInSettings(\n currentState.mfaSettings,\n authenticatorPreferred,\n )\n\n return {\n ...currentState,\n isSetupSuccessOpen: true,\n isMfaEnabled: getIsMfaEnabled(mfaSettings),\n mfaSettings,\n mfaAuthenticatorAppSetup: undefined,\n settingUpMfaMethod: undefined,\n }\n })\n }, [])\n\n const openPhoneNumberDialog = React.useCallback(() => {\n setState((currentState) => ({\n ...currentState,\n isPhoneNumberDialogOpen: true,\n phoneVerificationCodeSentAt: undefined,\n setupError: undefined,\n }))\n }, [])\n\n const closePhoneNumberDialog = React.useCallback(() => {\n setState((currentState) => ({\n ...currentState,\n isPhoneNumberDialogOpen: false,\n phoneVerificationCodeSentAt: undefined,\n }))\n }, [])\n\n const setupSmsMfaMethod = React.useCallback(async () => {\n let smsPreferred = false\n\n setState((currentState) => {\n smsPreferred = !hasPreferredMfaMethod(currentState.mfaSettings)\n return currentState\n })\n\n await mfaService.setupSmsMfa({\n preferred: smsPreferred,\n })\n\n setState((currentState) => {\n const mfaSettings = enableSmsMfaInSettings(\n currentState.mfaSettings,\n smsPreferred,\n )\n\n return {\n ...currentState,\n isSetupSuccessOpen: true,\n isSettingUpMfa: false,\n settingUpMfaMethod: undefined,\n isMfaEnabled: getIsMfaEnabled(mfaSettings),\n mfaSettings,\n }\n })\n }, [])\n\n const savePhoneNumber = React.useCallback(\n async (phoneNumber: string) => {\n setState((currentState) => ({\n ...currentState,\n setupError: undefined,\n }))\n\n try {\n const { isPhoneNumberVerified } =\n await mfaService.updateUserPhoneNumber(phoneNumber)\n\n if (!isPhoneNumberVerified) {\n setState((currentState) => ({\n ...currentState,\n phoneVerificationCodeSentAt: Date.now(),\n mfaSettings: {\n ...currentState.mfaSettings,\n sms: {\n ...currentState.mfaSettings.sms,\n phoneNumber,\n isPhoneNumberVerified: false,\n },\n },\n }))\n return\n }\n setState((currentState) => ({\n ...currentState,\n mfaSettings: {\n ...currentState.mfaSettings,\n sms: {\n ...currentState.mfaSettings.sms,\n phoneNumber,\n isPhoneNumberVerified,\n },\n },\n isPhoneNumberDialogOpen: false,\n phoneVerificationCodeSentAt: undefined,\n }))\n await setupSmsMfaMethod()\n } catch (error) {\n setState((currentState) => ({\n ...currentState,\n setupError: error as Error,\n }))\n }\n },\n [setupSmsMfaMethod],\n )\n\n const verifyPhoneNumber = React.useCallback(\n async (code: string) => {\n setState((currentState) => ({\n ...currentState,\n setupError: undefined,\n }))\n\n try {\n await mfaService.verifyUserPhoneNumber(code)\n\n setState((currentState) => ({\n ...currentState,\n mfaSettings: {\n ...currentState.mfaSettings,\n sms: {\n ...currentState.mfaSettings.sms,\n isPhoneNumberVerified: true,\n },\n },\n isPhoneNumberDialogOpen: false,\n phoneVerificationCodeSentAt: undefined,\n }))\n await setupSmsMfaMethod()\n } catch (error) {\n setState((currentState) => ({\n ...currentState,\n setupError: error as Error,\n }))\n }\n },\n [setupSmsMfaMethod],\n )\n\n const resendPhoneNumberVerificationCode = React.useCallback(async () => {\n setState((currentState) => ({\n ...currentState,\n setupError: undefined,\n phoneVerificationCodeSentAt: Date.now(),\n }))\n\n try {\n await mfaService.sendPhoneNumberVerificationCode()\n } catch (error) {\n setState((currentState) => ({\n ...currentState,\n setupError: error as Error,\n }))\n }\n }, [])\n\n const beginRemovingPhoneNumber = React.useCallback(() => {\n setState((currentState) => ({\n ...currentState,\n isRemovePhoneNumberDialogOpen: true,\n setupError: undefined,\n }))\n }, [])\n\n const cancelRemovingPhoneNumber = React.useCallback(() => {\n setState((currentState) => ({\n ...currentState,\n isRemovePhoneNumberDialogOpen: false,\n }))\n }, [])\n\n const completeRemovingPhoneNumber = React.useCallback(async () => {\n setState((currentState) => ({\n ...currentState,\n setupError: undefined,\n }))\n\n try {\n await mfaService.removeUserPhoneNumber()\n setState((currentState) => ({\n ...currentState,\n isRemovePhoneNumberDialogOpen: false,\n mfaSettings: {\n ...currentState.mfaSettings,\n sms: {\n ...currentState.mfaSettings.sms,\n phoneNumber: undefined,\n isPhoneNumberVerified: false,\n },\n },\n }))\n } catch (error) {\n setState((currentState) => ({\n ...currentState,\n setupError: error as Error,\n }))\n }\n }, [])\n\n const beginMfaSetup = React.useCallback(\n async (mfaMethod: mfaService.MfaMethod) => {\n setState((currentState) => ({\n ...currentState,\n isSettingUpMfa: true,\n settingUpMfaMethod: mfaMethod,\n mfaAuthenticatorAppSetup: undefined,\n setupError: undefined,\n }))\n\n try {\n let mfaSettings = mfaService.DEFAULT_MFA_SETTINGS\n\n setState((currentState) => {\n mfaSettings = currentState.mfaSettings\n return currentState\n })\n\n if (mfaMethod === 'sms') {\n if (\n !mfaSettings.sms.phoneNumber ||\n !mfaSettings.sms.isPhoneNumberVerified\n ) {\n setState((currentState) => ({\n ...currentState,\n isSettingUpMfa: false,\n settingUpMfaMethod: undefined,\n isSetupMethodDialogOpen: false,\n isPhoneNumberDialogOpen: true,\n }))\n return\n }\n\n await setupSmsMfaMethod()\n setState((currentState) => ({\n ...currentState,\n isSetupMethodDialogOpen: false,\n }))\n return\n }\n\n const hasPreferredMethod = hasPreferredMfaMethod(mfaSettings)\n const newMfaAuthenticatorAppSetup =\n await mfaService.setupMfaAuthenticatorApp({\n preferred: !hasPreferredMethod,\n })\n setState((currentState) => ({\n ...currentState,\n isSettingUpMfa: false,\n isSetupMethodDialogOpen: false,\n mfaAuthenticatorAppSetup: newMfaAuthenticatorAppSetup,\n }))\n } catch (error) {\n setState((currentState) => ({\n ...currentState,\n isSettingUpMfa: false,\n settingUpMfaMethod: undefined,\n setupError: error as Error,\n }))\n }\n },\n [setupSmsMfaMethod],\n )\n\n const disablingMfaMethodRef = React.useRef<mfaService.MfaMethod | undefined>(\n undefined,\n )\n\n const beginDisablingMfaMethod = React.useCallback(\n (mfaMethod: mfaService.MfaMethod) => {\n disablingMfaMethodRef.current = mfaMethod\n setState((currentState) => ({\n ...currentState,\n disablingMfaMethod: mfaMethod,\n }))\n },\n [],\n )\n\n const cancelDisablingMfa = React.useCallback(() => {\n disablingMfaMethodRef.current = undefined\n setState((currentState) => ({\n ...currentState,\n disablingMfaMethod: undefined,\n }))\n }, [])\n\n const completeDisablingMfa = React.useCallback(async () => {\n const disablingMfaMethod = disablingMfaMethodRef.current\n if (!disablingMfaMethod) {\n return\n }\n\n await mfaService.disableMfaMethod(disablingMfaMethod)\n const mfaSettings = await mfaService.getMfaSettings()\n disablingMfaMethodRef.current = undefined\n setState((currentState) => ({\n ...currentState,\n disablingMfaMethod: undefined,\n mfaSettings,\n isMfaEnabled: getIsMfaEnabled(mfaSettings),\n }))\n }, [])\n\n const setPreferredMfaMethod = React.useCallback(\n async (mfaMethod: mfaService.MfaMethod) => {\n setState((currentState) => ({\n ...currentState,\n isSettingPreferredMfaMethod: true,\n setupError: undefined,\n }))\n\n try {\n await mfaService.setPreferredMfaMethod(mfaMethod)\n setState((currentState) => ({\n ...currentState,\n isSettingPreferredMfaMethod: false,\n mfaSettings: setPreferredMfaMethodInSettings(\n currentState.mfaSettings,\n mfaMethod,\n ),\n }))\n } catch (error) {\n setState((currentState) => ({\n ...currentState,\n isSettingPreferredMfaMethod: false,\n setupError: error as Error,\n }))\n }\n },\n [],\n )\n\n const value = React.useMemo(() => {\n return {\n ...state,\n clearMfaSetupError,\n loadMfa,\n beginMfaSetup,\n openMfaSetupMethodDialog,\n closeMfaSetupMethodDialog,\n beginDisablingMfaMethod,\n setPreferredMfaMethod,\n openPhoneNumberDialog,\n closePhoneNumberDialog,\n savePhoneNumber,\n verifyPhoneNumber,\n resendPhoneNumberVerificationCode,\n beginRemovingPhoneNumber,\n cancelRemovingPhoneNumber,\n completeRemovingPhoneNumber,\n hideSetupSuccess,\n cancelMfaAuthenticatorAppSetup,\n completeMfaAuthenticatorAppSetup,\n cancelDisablingMfa,\n completeDisablingMfa,\n }\n }, [\n state,\n clearMfaSetupError,\n loadMfa,\n beginMfaSetup,\n openMfaSetupMethodDialog,\n closeMfaSetupMethodDialog,\n beginDisablingMfaMethod,\n setPreferredMfaMethod,\n openPhoneNumberDialog,\n closePhoneNumberDialog,\n savePhoneNumber,\n verifyPhoneNumber,\n resendPhoneNumberVerificationCode,\n beginRemovingPhoneNumber,\n cancelRemovingPhoneNumber,\n completeRemovingPhoneNumber,\n hideSetupSuccess,\n cancelMfaAuthenticatorAppSetup,\n completeMfaAuthenticatorAppSetup,\n cancelDisablingMfa,\n completeDisablingMfa,\n ])\n\n return <MfaContext.Provider value={value}>{children}</MfaContext.Provider>\n}\n\nexport default function useMfa() {\n return React.useContext(MfaContext)\n}\n\n/**\n * React hook to determine whether the logged in user must set up MFA before\n * accessing your application. Reads MFA settings from the `<MfaProvider />`\n * context. Will throw an Error if used outside of `<MfaProvider />`.\n *\n * Users signed in via an external identity provider are not required to set up\n * MFA.\n *\n * #### Example\n *\n * ```js\n * import { MfaProvider, useUserMeetsMfaRequirement } from '@oneblink/apps-react'\n *\n * function Component({ teamMemberMfaRequirement }) {\n * const { mfaSetupRequired, isLoading, loadingError, refreshMfa } =\n * useUserMeetsMfaRequirement(teamMemberMfaRequirement)\n *\n * if (isLoading) {\n * return <Loading />\n * }\n *\n * if (loadingError) {\n * return <Error onRetry={refreshMfa} />\n * }\n *\n * if (mfaSetupRequired) {\n * return <ConfigureMfa />\n * }\n *\n * return <Application />\n * }\n * ```\n *\n * @param mfaRequirement - The MFA requirement to enforce, e.g. from your\n * organisation or app settings.\n * @returns Whether MFA setup is required, along with loading state from the MFA\n * provider.\n * @group Hooks\n */\nexport function useUserMeetsMfaRequirement(\n mfaRequirement: MiscTypes.MfaRequirement | undefined,\n) {\n const {\n isLoading,\n loadingError,\n mfaSettings,\n loadMfa,\n isExternalIdentityProviderUser,\n } = useMfa()\n\n return React.useMemo(() => {\n const mfaRequired = mfaService.isMfaRequired(mfaRequirement)\n const shouldCheckMfa = mfaRequired && !isExternalIdentityProviderUser\n const meetsRequirement = mfaService.userMeetsMfaRequirement(\n mfaRequirement,\n mfaSettings,\n )\n const mfaSetupRequired =\n shouldCheckMfa && !isLoading && !loadingError && !meetsRequirement\n\n return {\n mfaSetupRequired,\n isLoading: shouldCheckMfa && isLoading,\n loadingError: shouldCheckMfa ? loadingError : undefined,\n refreshMfa: loadMfa,\n }\n }, [\n mfaRequirement,\n isExternalIdentityProviderUser,\n mfaSettings,\n isLoading,\n loadingError,\n loadMfa,\n ])\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -25,6 +25,7 @@ export { default as useFormSubmissionAutoSaveState } from './hooks/useFormSubmis
|
|
|
25
25
|
export { default as useGoogleJsApiLoader } from './hooks/useGoogleJsApiLoader';
|
|
26
26
|
export { default as useFormSubmissionDuration } from './hooks/useFormSubmissionDuration';
|
|
27
27
|
export { default as ProgressBar } from './components/renderer/ProgressBar';
|
|
28
|
+
export { default as LoadingWithMessage } from './components/LoadingWithMessage';
|
|
28
29
|
export { default as PaymentReceipt } from './PaymentReceipt';
|
|
29
30
|
export { default as PaymentForm } from './components/payments/PaymentForm';
|
|
30
31
|
export { default as CalendarBookingsForm } from './components/calendar-bookings/CalendarBookingsForm';
|
package/dist/index.js
CHANGED
|
@@ -25,6 +25,7 @@ export { default as useFormSubmissionAutoSaveState } from './hooks/useFormSubmis
|
|
|
25
25
|
export { default as useGoogleJsApiLoader } from './hooks/useGoogleJsApiLoader';
|
|
26
26
|
export { default as useFormSubmissionDuration } from './hooks/useFormSubmissionDuration';
|
|
27
27
|
export { default as ProgressBar } from './components/renderer/ProgressBar';
|
|
28
|
+
export { default as LoadingWithMessage } from './components/LoadingWithMessage';
|
|
28
29
|
export { default as PaymentReceipt } from './PaymentReceipt';
|
|
29
30
|
export { default as PaymentForm } from './components/payments/PaymentForm';
|
|
30
31
|
export { default as CalendarBookingsForm } from './components/calendar-bookings/CalendarBookingsForm';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["export {\n OneBlinkFormBaseProps,\n OneBlinkFormControlledProps,\n OneBlinkFormUncontrolled as OneBlinkForm,\n OneBlinkFormControlled,\n} from './OneBlinkForm'\nexport { default as OneBlinkAutoSaveForm } from './OneBlinkAutoSaveForm'\nexport { default as OneBlinkReadOnlyForm } from './OneBlinkReadOnlyForm'\nexport { OneBlinkFormStoreProvider } from './components/formStore/OneBlinkFormStoreProvider'\nexport { default as OneBlinkFormStoreClearFiltersButton } from './components/formStore/OneBlinkFormStoreClearFiltersButton'\nexport { default as OneBlinkFormStoreColumnsButton } from './components/formStore/OneBlinkFormStoreColumnsButton'\nexport { default as OneBlinkFormStoreDownloadButton } from './components/formStore/OneBlinkFormStoreDownloadButton'\nexport { default as OneBlinkFormStoreRefreshButton } from './components/formStore/OneBlinkFormStoreRefreshButton'\nexport { default as OneBlinkFormStoreTable } from './components/formStore/OneBlinkFormStoreTable'\n\nexport { default as useIsMounted } from './hooks/useIsMounted'\nexport { default as useBooleanState } from './hooks/useBooleanState'\nexport { default as useNullableState } from './hooks/useNullableState'\nexport { default as useClickOutsideElement } from './hooks/useClickOutsideElement'\nexport {\n default as useIsOffline,\n IsOfflineContextProvider,\n} from './hooks/useIsOffline'\nexport { default as useLogin, UseLoginValue } from './hooks/useLogin'\nexport { default as useSignUp } from './hooks/useSignUp'\nexport {\n default as useAuth,\n AuthContextProvider,\n AuthContextValue,\n} from './hooks/useAuth'\nexport {\n default as usePendingSubmissions,\n PendingSubmissionsContextProvider,\n PendingSubmissionsContextValue,\n} from './hooks/usePendingSubmissions'\nexport {\n default as useDrafts,\n DraftsContextProvider,\n DraftsContextValue,\n} from './hooks/useDrafts'\nexport {\n default as useLoadDataState,\n LoadDataState,\n} from './hooks/useLoadDataState'\nexport { default as useLoadResourcesState } from './hooks/useLoadResourcesState'\nexport { default as useLoadDataEffect } from './hooks/useLoadDataEffect'\nexport { default as useFormSubmissionState } from './hooks/useFormSubmissionState'\nexport { default as useFormSubmissionAutoSaveState } from './hooks/useFormSubmissionAutoSaveState'\nexport { default as useGoogleJsApiLoader } from './hooks/useGoogleJsApiLoader'\nexport { default as useFormSubmissionDuration } from './hooks/useFormSubmissionDuration'\n\nexport { default as ProgressBar } from './components/renderer/ProgressBar'\nexport { default as PaymentReceipt } from './PaymentReceipt'\nexport { default as PaymentForm } from './components/payments/PaymentForm'\n\nexport { default as CalendarBookingsForm } from './components/calendar-bookings/CalendarBookingsForm'\nexport { default as CalendarBookingsRescheduleForm } from './components/calendar-bookings/CalendarBookingsReschedulingForm'\nexport { default as CalendarBookingsCancelForm } from './components/calendar-bookings/CalendarBookingsCancelForm'\n\nexport { default as MultiFactorAuthentication } from './components/mfa/MultiFactorAuthentication'\nexport { default as MfaAuthenticatorAppDialog } from './components/mfa/MfaAuthenticatorAppDialog'\nexport { default as MfaDisableDialog } from './components/mfa/MfaDisableDialog'\nexport { default as MfaRemovePhoneNumberDialog } from './components/mfa/MfaRemovePhoneNumberDialog'\nexport { default as MfaPhoneNumberDialog } from './components/mfa/MfaPhoneNumberDialog'\nexport { default as MfaSuccessSnackbar } from './components/mfa/MfaSuccessSnackbar'\nexport { default as MfaErrorSnackbar } from './components/mfa/MfaErrorSnackbar'\nexport { default as MfaStatusChip } from './components/mfa/MfaStatusChip'\nexport {\n default as useMfa,\n MfaProvider,\n useUserMeetsMfaRequirement,\n} from './hooks/useMfa'\n\nexport { default as DownloadableFiles } from './components/downloadable-files'\n\nexport {\n default as ImageCropper,\n getAspectRatio,\n generateCroppedImageBlob,\n PercentCrop,\n} from './components/ImageCropper'\n\nexport * from './types/form'\n// Former apps package now exported through here\nexport * from './apps'\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,wBAAwB,IAAI,YAAY,EACxC,sBAAsB,GACvB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AACxE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AACxE,OAAO,EAAE,yBAAyB,EAAE,MAAM,kDAAkD,CAAA;AAC5F,OAAO,EAAE,OAAO,IAAI,mCAAmC,EAAE,MAAM,4DAA4D,CAAA;AAC3H,OAAO,EAAE,OAAO,IAAI,8BAA8B,EAAE,MAAM,uDAAuD,CAAA;AACjH,OAAO,EAAE,OAAO,IAAI,+BAA+B,EAAE,MAAM,wDAAwD,CAAA;AACnH,OAAO,EAAE,OAAO,IAAI,8BAA8B,EAAE,MAAM,uDAAuD,CAAA;AACjH,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,+CAA+C,CAAA;AAEjG,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACpE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AACtE,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AAClF,OAAO,EACL,OAAO,IAAI,YAAY,EACvB,wBAAwB,GACzB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAiB,MAAM,kBAAkB,CAAA;AACrE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EACL,OAAO,IAAI,OAAO,EAClB,mBAAmB,GAEpB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,OAAO,IAAI,qBAAqB,EAChC,iCAAiC,GAElC,MAAM,+BAA+B,CAAA;AACtC,OAAO,EACL,OAAO,IAAI,SAAS,EACpB,qBAAqB,GAEtB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,OAAO,IAAI,gBAAgB,GAE5B,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,+BAA+B,CAAA;AAChF,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AACxE,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AAClF,OAAO,EAAE,OAAO,IAAI,8BAA8B,EAAE,MAAM,wCAAwC,CAAA;AAClG,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAC9E,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAExF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mCAAmC,CAAA;AAC1E,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AAC/E,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mCAAmC,CAAA;AAE1E,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,qDAAqD,CAAA;AACrG,OAAO,EAAE,OAAO,IAAI,8BAA8B,EAAE,MAAM,iEAAiE,CAAA;AAC3H,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,2DAA2D,CAAA;AAEjH,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,4CAA4C,CAAA;AACjG,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,4CAA4C,CAAA;AACjG,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AAC/E,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,6CAA6C,CAAA;AACnG,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,uCAAuC,CAAA;AACvF,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,qCAAqC,CAAA;AACnF,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AAC/E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,gCAAgC,CAAA;AACzE,OAAO,EACL,OAAO,IAAI,MAAM,EACjB,WAAW,EACX,0BAA0B,GAC3B,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAE9E,OAAO,EACL,OAAO,IAAI,YAAY,EACvB,cAAc,EACd,wBAAwB,GAEzB,MAAM,2BAA2B,CAAA;AAElC,cAAc,cAAc,CAAA;AAC5B,gDAAgD;AAChD,cAAc,QAAQ,CAAA","sourcesContent":["export {\n OneBlinkFormBaseProps,\n OneBlinkFormControlledProps,\n OneBlinkFormUncontrolled as OneBlinkForm,\n OneBlinkFormControlled,\n} from './OneBlinkForm'\nexport { default as OneBlinkAutoSaveForm } from './OneBlinkAutoSaveForm'\nexport { default as OneBlinkReadOnlyForm } from './OneBlinkReadOnlyForm'\nexport { OneBlinkFormStoreProvider } from './components/formStore/OneBlinkFormStoreProvider'\nexport { default as OneBlinkFormStoreClearFiltersButton } from './components/formStore/OneBlinkFormStoreClearFiltersButton'\nexport { default as OneBlinkFormStoreColumnsButton } from './components/formStore/OneBlinkFormStoreColumnsButton'\nexport { default as OneBlinkFormStoreDownloadButton } from './components/formStore/OneBlinkFormStoreDownloadButton'\nexport { default as OneBlinkFormStoreRefreshButton } from './components/formStore/OneBlinkFormStoreRefreshButton'\nexport { default as OneBlinkFormStoreTable } from './components/formStore/OneBlinkFormStoreTable'\n\nexport { default as useIsMounted } from './hooks/useIsMounted'\nexport { default as useBooleanState } from './hooks/useBooleanState'\nexport { default as useNullableState } from './hooks/useNullableState'\nexport { default as useClickOutsideElement } from './hooks/useClickOutsideElement'\nexport {\n default as useIsOffline,\n IsOfflineContextProvider,\n} from './hooks/useIsOffline'\nexport { default as useLogin, UseLoginValue } from './hooks/useLogin'\nexport { default as useSignUp } from './hooks/useSignUp'\nexport {\n default as useAuth,\n AuthContextProvider,\n AuthContextValue,\n} from './hooks/useAuth'\nexport {\n default as usePendingSubmissions,\n PendingSubmissionsContextProvider,\n PendingSubmissionsContextValue,\n} from './hooks/usePendingSubmissions'\nexport {\n default as useDrafts,\n DraftsContextProvider,\n DraftsContextValue,\n} from './hooks/useDrafts'\nexport {\n default as useLoadDataState,\n LoadDataState,\n} from './hooks/useLoadDataState'\nexport { default as useLoadResourcesState } from './hooks/useLoadResourcesState'\nexport { default as useLoadDataEffect } from './hooks/useLoadDataEffect'\nexport { default as useFormSubmissionState } from './hooks/useFormSubmissionState'\nexport { default as useFormSubmissionAutoSaveState } from './hooks/useFormSubmissionAutoSaveState'\nexport { default as useGoogleJsApiLoader } from './hooks/useGoogleJsApiLoader'\nexport { default as useFormSubmissionDuration } from './hooks/useFormSubmissionDuration'\n\nexport { default as ProgressBar } from './components/renderer/ProgressBar'\nexport { default as LoadingWithMessage } from './components/LoadingWithMessage'\nexport { default as PaymentReceipt } from './PaymentReceipt'\nexport { default as PaymentForm } from './components/payments/PaymentForm'\n\nexport { default as CalendarBookingsForm } from './components/calendar-bookings/CalendarBookingsForm'\nexport { default as CalendarBookingsRescheduleForm } from './components/calendar-bookings/CalendarBookingsReschedulingForm'\nexport { default as CalendarBookingsCancelForm } from './components/calendar-bookings/CalendarBookingsCancelForm'\n\nexport { default as MultiFactorAuthentication } from './components/mfa/MultiFactorAuthentication'\nexport { default as MfaAuthenticatorAppDialog } from './components/mfa/MfaAuthenticatorAppDialog'\nexport { default as MfaDisableDialog } from './components/mfa/MfaDisableDialog'\nexport { default as MfaRemovePhoneNumberDialog } from './components/mfa/MfaRemovePhoneNumberDialog'\nexport { default as MfaPhoneNumberDialog } from './components/mfa/MfaPhoneNumberDialog'\nexport { default as MfaSuccessSnackbar } from './components/mfa/MfaSuccessSnackbar'\nexport { default as MfaErrorSnackbar } from './components/mfa/MfaErrorSnackbar'\nexport { default as MfaStatusChip } from './components/mfa/MfaStatusChip'\nexport {\n default as useMfa,\n MfaProvider,\n useUserMeetsMfaRequirement,\n} from './hooks/useMfa'\n\nexport { default as DownloadableFiles } from './components/downloadable-files'\n\nexport {\n default as ImageCropper,\n getAspectRatio,\n generateCroppedImageBlob,\n PercentCrop,\n} from './components/ImageCropper'\n\nexport * from './types/form'\n// Former apps package now exported through here\nexport * from './apps'\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function joinArray<T>(arr: T[], type?: Intl.ListFormatType): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"joinArray.js","sourceRoot":"","sources":["../../src/utils/joinArray.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAI,GAAQ,EAAE,IAA0B;IAC/D,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;QAC3C,IAAI;KACL,CAAC,CAAA;IACF,OAAO,UAAU,CAAC,MAAM,CAAC,GAAe,CAAC,CAAA;AAC3C,CAAC","sourcesContent":["export function joinArray<T>(arr: T[], type?: Intl.ListFormatType): string {\r\n const listFormat = new Intl.ListFormat('en', {\r\n type,\r\n })\r\n return listFormat.format(arr as string[])\r\n}\r\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { MiscTypes } from '@oneblink/types';
|
|
2
|
+
import type { MfaSettings } from '../apps/services/AWSCognitoClient';
|
|
3
|
+
export type { MfaSettings };
|
|
4
|
+
export declare function isMfaRequired(mfaRequirement: MiscTypes.MfaRequirement | undefined): boolean;
|
|
5
|
+
export type MfaRequirementMethod = keyof MiscTypes.MfaRequirement;
|
|
6
|
+
export declare function mfaRequirementToSelectedMethods(mfaRequirement: MiscTypes.MfaRequirement | undefined): MfaRequirementMethod[];
|
|
7
|
+
export declare function mfaSelectedMethodsToMfaRequirement(methods: MfaRequirementMethod[]): MiscTypes.MfaRequirement;
|
|
8
|
+
export declare function formatMfaRequirementLabel(mfaRequirement: MiscTypes.MfaRequirement | undefined): string;
|
|
9
|
+
export declare function formatMfaRequirementMethodLabel(method: MfaRequirementMethod): string;
|
|
10
|
+
export declare function userMeetsMfaRequirement(mfaRequirement: MiscTypes.MfaRequirement | undefined, mfaSettings: MfaSettings): boolean;
|
|
11
|
+
export declare function formatMfaMethodNotAcceptedMessage(method: MfaRequirementMethod, mfaRequirement: MiscTypes.MfaRequirement | undefined, accessScopeLabel?: string): string | undefined;
|
|
12
|
+
export declare function formatMfaSetupRequiredMessage(mfaRequirement: MiscTypes.MfaRequirement | undefined, mfaSettings: MfaSettings, accessScopeLabel?: string): string | undefined;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { joinArray } from './joinArray';
|
|
2
|
+
export function isMfaRequired(mfaRequirement) {
|
|
3
|
+
return (!!mfaRequirement && (mfaRequirement.sms || mfaRequirement.authenticatorApp));
|
|
4
|
+
}
|
|
5
|
+
const MFA_REQUIREMENT_METHOD_KEYS = Object.keys({
|
|
6
|
+
sms: false,
|
|
7
|
+
authenticatorApp: false,
|
|
8
|
+
});
|
|
9
|
+
export function mfaRequirementToSelectedMethods(mfaRequirement) {
|
|
10
|
+
var _a, _b;
|
|
11
|
+
const checkboxState = {
|
|
12
|
+
sms: (_a = mfaRequirement === null || mfaRequirement === void 0 ? void 0 : mfaRequirement.sms) !== null && _a !== void 0 ? _a : false,
|
|
13
|
+
authenticatorApp: (_b = mfaRequirement === null || mfaRequirement === void 0 ? void 0 : mfaRequirement.authenticatorApp) !== null && _b !== void 0 ? _b : false,
|
|
14
|
+
};
|
|
15
|
+
const methods = [];
|
|
16
|
+
if (checkboxState.authenticatorApp) {
|
|
17
|
+
methods.push('authenticatorApp');
|
|
18
|
+
}
|
|
19
|
+
if (checkboxState.sms) {
|
|
20
|
+
methods.push('sms');
|
|
21
|
+
}
|
|
22
|
+
return methods;
|
|
23
|
+
}
|
|
24
|
+
export function mfaSelectedMethodsToMfaRequirement(methods) {
|
|
25
|
+
return {
|
|
26
|
+
sms: methods.includes('sms'),
|
|
27
|
+
authenticatorApp: methods.includes('authenticatorApp'),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export function formatMfaRequirementLabel(mfaRequirement) {
|
|
31
|
+
if (!isMfaRequired(mfaRequirement)) {
|
|
32
|
+
return 'MFA Optional';
|
|
33
|
+
}
|
|
34
|
+
const selectedMethods = mfaRequirementToSelectedMethods(mfaRequirement);
|
|
35
|
+
if (selectedMethods.length === MFA_REQUIREMENT_METHOD_KEYS.length) {
|
|
36
|
+
return 'MFA Required';
|
|
37
|
+
}
|
|
38
|
+
const methodList = joinArray(selectedMethods.map(formatMfaRequirementMethodLabel), 'disjunction');
|
|
39
|
+
return `MFA Required (${methodList} only)`;
|
|
40
|
+
}
|
|
41
|
+
export function formatMfaRequirementMethodLabel(method) {
|
|
42
|
+
switch (method) {
|
|
43
|
+
case 'sms':
|
|
44
|
+
return 'SMS';
|
|
45
|
+
case 'authenticatorApp':
|
|
46
|
+
return 'Authenticator App';
|
|
47
|
+
default: {
|
|
48
|
+
const n = method;
|
|
49
|
+
return n;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function isMfaRequirementMethodEnabled(method, mfaSettings) {
|
|
54
|
+
if (method === 'sms') {
|
|
55
|
+
return mfaSettings.sms.preferred;
|
|
56
|
+
}
|
|
57
|
+
return mfaSettings.authenticator.preferred;
|
|
58
|
+
}
|
|
59
|
+
export function userMeetsMfaRequirement(mfaRequirement, mfaSettings) {
|
|
60
|
+
if (!isMfaRequired(mfaRequirement)) {
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
return mfaRequirementToSelectedMethods(mfaRequirement).some((method) => isMfaRequirementMethodEnabled(method, mfaSettings));
|
|
64
|
+
}
|
|
65
|
+
export function formatMfaMethodNotAcceptedMessage(method, mfaRequirement, accessScopeLabel = 'app') {
|
|
66
|
+
if (!mfaRequirement || !isMfaRequired(mfaRequirement)) {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
if (mfaRequirement[method]) {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
const requiredMethods = mfaRequirementToSelectedMethods(mfaRequirement);
|
|
73
|
+
const methodList = joinArray(requiredMethods.map(formatMfaRequirementMethodLabel), 'disjunction');
|
|
74
|
+
return `This MFA method is not sufficient for using this ${accessScopeLabel.toLowerCase()}. Your administrator requires ${methodList} multi factor authentication.`;
|
|
75
|
+
}
|
|
76
|
+
export function formatMfaSetupRequiredMessage(mfaRequirement, mfaSettings, accessScopeLabel = 'Account') {
|
|
77
|
+
if (!isMfaRequired(mfaRequirement) ||
|
|
78
|
+
userMeetsMfaRequirement(mfaRequirement, mfaSettings)) {
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
const requiredMethods = mfaRequirementToSelectedMethods(mfaRequirement);
|
|
82
|
+
const hasAnyMfaEnabled = mfaSettings.authenticator.enabled || mfaSettings.sms.enabled;
|
|
83
|
+
if (requiredMethods.length === 1) {
|
|
84
|
+
const methodLabel = formatMfaRequirementMethodLabel(requiredMethods[0]);
|
|
85
|
+
if (hasAnyMfaEnabled) {
|
|
86
|
+
return `requires ${methodLabel} multi factor authentication. You have a different MFA method configured, but that method is not accepted for this ${accessScopeLabel.toLowerCase()}.`;
|
|
87
|
+
}
|
|
88
|
+
return `requires ${methodLabel} multi factor authentication to be configured before accessing this ${accessScopeLabel}.`;
|
|
89
|
+
}
|
|
90
|
+
const methodList = joinArray(requiredMethods.map(formatMfaRequirementMethodLabel), 'disjunction');
|
|
91
|
+
if (hasAnyMfaEnabled) {
|
|
92
|
+
return `requires ${methodList} multi factor authentication. Your current MFA method is not accepted for this ${accessScopeLabel.toLowerCase()}.`;
|
|
93
|
+
}
|
|
94
|
+
return `requires ${methodList} multi factor authentication to be configured before accessing this ${accessScopeLabel}.`;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=mfa-requirement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mfa-requirement.js","sourceRoot":"","sources":["../../src/utils/mfa-requirement.ts"],"names":[],"mappings":"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","sourcesContent":["import { MiscTypes } from '@oneblink/types'\r\nimport type { MfaSettings } from '../apps/services/AWSCognitoClient'\r\nimport { joinArray } from './joinArray'\r\n\r\nexport type { MfaSettings }\r\n\r\nexport function isMfaRequired(\r\n mfaRequirement: MiscTypes.MfaRequirement | undefined,\r\n): boolean {\r\n return (\r\n !!mfaRequirement && (mfaRequirement.sms || mfaRequirement.authenticatorApp)\r\n )\r\n}\r\n\r\nexport type MfaRequirementMethod = keyof MiscTypes.MfaRequirement\r\n\r\nconst MFA_REQUIREMENT_METHOD_KEYS = Object.keys({\r\n sms: false,\r\n authenticatorApp: false,\r\n} satisfies MiscTypes.MfaRequirement) as MfaRequirementMethod[]\r\n\r\nexport function mfaRequirementToSelectedMethods(\r\n mfaRequirement: MiscTypes.MfaRequirement | undefined,\r\n): MfaRequirementMethod[] {\r\n const checkboxState = {\r\n sms: mfaRequirement?.sms ?? false,\r\n authenticatorApp: mfaRequirement?.authenticatorApp ?? false,\r\n }\r\n const methods: MfaRequirementMethod[] = []\r\n\r\n if (checkboxState.authenticatorApp) {\r\n methods.push('authenticatorApp')\r\n }\r\n\r\n if (checkboxState.sms) {\r\n methods.push('sms')\r\n }\r\n\r\n return methods\r\n}\r\n\r\nexport function mfaSelectedMethodsToMfaRequirement(\r\n methods: MfaRequirementMethod[],\r\n): MiscTypes.MfaRequirement {\r\n return {\r\n sms: methods.includes('sms'),\r\n authenticatorApp: methods.includes('authenticatorApp'),\r\n }\r\n}\r\n\r\nexport function formatMfaRequirementLabel(\r\n mfaRequirement: MiscTypes.MfaRequirement | undefined,\r\n): string {\r\n if (!isMfaRequired(mfaRequirement)) {\r\n return 'MFA Optional'\r\n }\r\n\r\n const selectedMethods = mfaRequirementToSelectedMethods(mfaRequirement)\r\n\r\n if (selectedMethods.length === MFA_REQUIREMENT_METHOD_KEYS.length) {\r\n return 'MFA Required'\r\n }\r\n\r\n const methodList = joinArray(\r\n selectedMethods.map(formatMfaRequirementMethodLabel),\r\n 'disjunction',\r\n )\r\n\r\n return `MFA Required (${methodList} only)`\r\n}\r\n\r\nexport function formatMfaRequirementMethodLabel(\r\n method: MfaRequirementMethod,\r\n): string {\r\n switch (method) {\r\n case 'sms':\r\n return 'SMS'\r\n case 'authenticatorApp':\r\n return 'Authenticator App'\r\n default: {\r\n const n: never = method\r\n return n\r\n }\r\n }\r\n}\r\n\r\nfunction isMfaRequirementMethodEnabled(\r\n method: MfaRequirementMethod,\r\n mfaSettings: MfaSettings,\r\n): boolean {\r\n if (method === 'sms') {\r\n return mfaSettings.sms.preferred\r\n }\r\n\r\n return mfaSettings.authenticator.preferred\r\n}\r\n\r\nexport function userMeetsMfaRequirement(\r\n mfaRequirement: MiscTypes.MfaRequirement | undefined,\r\n mfaSettings: MfaSettings,\r\n): boolean {\r\n if (!isMfaRequired(mfaRequirement)) {\r\n return true\r\n }\r\n\r\n return mfaRequirementToSelectedMethods(mfaRequirement).some((method) =>\r\n isMfaRequirementMethodEnabled(method, mfaSettings),\r\n )\r\n}\r\n\r\nexport function formatMfaMethodNotAcceptedMessage(\r\n method: MfaRequirementMethod,\r\n mfaRequirement: MiscTypes.MfaRequirement | undefined,\r\n accessScopeLabel = 'app',\r\n): string | undefined {\r\n if (!mfaRequirement || !isMfaRequired(mfaRequirement)) {\r\n return undefined\r\n }\r\n\r\n if (mfaRequirement[method]) {\r\n return undefined\r\n }\r\n\r\n const requiredMethods = mfaRequirementToSelectedMethods(mfaRequirement)\r\n\r\n const methodList = joinArray(\r\n requiredMethods.map(formatMfaRequirementMethodLabel),\r\n 'disjunction',\r\n )\r\n\r\n return `This MFA method is not sufficient for using this ${accessScopeLabel.toLowerCase()}. Your administrator requires ${methodList} multi factor authentication.`\r\n}\r\n\r\nexport function formatMfaSetupRequiredMessage(\r\n mfaRequirement: MiscTypes.MfaRequirement | undefined,\r\n mfaSettings: MfaSettings,\r\n accessScopeLabel = 'Account',\r\n): string | undefined {\r\n if (\r\n !isMfaRequired(mfaRequirement) ||\r\n userMeetsMfaRequirement(mfaRequirement, mfaSettings)\r\n ) {\r\n return undefined\r\n }\r\n\r\n const requiredMethods = mfaRequirementToSelectedMethods(mfaRequirement)\r\n const hasAnyMfaEnabled =\r\n mfaSettings.authenticator.enabled || mfaSettings.sms.enabled\r\n\r\n if (requiredMethods.length === 1) {\r\n const methodLabel = formatMfaRequirementMethodLabel(requiredMethods[0])\r\n\r\n if (hasAnyMfaEnabled) {\r\n return `requires ${methodLabel} multi factor authentication. You have a different MFA method configured, but that method is not accepted for this ${accessScopeLabel.toLowerCase()}.`\r\n }\r\n\r\n return `requires ${methodLabel} multi factor authentication to be configured before accessing this ${accessScopeLabel}.`\r\n }\r\n\r\n const methodList = joinArray(\r\n requiredMethods.map(formatMfaRequirementMethodLabel),\r\n 'disjunction',\r\n )\r\n\r\n if (hasAnyMfaEnabled) {\r\n return `requires ${methodList} multi factor authentication. Your current MFA method is not accepted for this ${accessScopeLabel.toLowerCase()}.`\r\n }\r\n\r\n return `requires ${methodList} multi factor authentication to be configured before accessing this ${accessScopeLabel}.`\r\n}\r\n"]}
|