@oneblink/apps-react 10.3.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.
Files changed (61) hide show
  1. package/dist/apps/auth-service.d.ts +3 -2
  2. package/dist/apps/auth-service.js +2 -2
  3. package/dist/apps/auth-service.js.map +1 -1
  4. package/dist/apps/index.d.ts +10 -0
  5. package/dist/apps/index.js +10 -0
  6. package/dist/apps/index.js.map +1 -1
  7. package/dist/apps/mfa-service.d.ts +4 -0
  8. package/dist/apps/mfa-service.js +3 -0
  9. package/dist/apps/mfa-service.js.map +1 -0
  10. package/dist/apps/services/AWSCognitoClient.d.ts +39 -4
  11. package/dist/apps/services/AWSCognitoClient.js +238 -23
  12. package/dist/apps/services/AWSCognitoClient.js.map +1 -1
  13. package/dist/apps/services/cognito.d.ts +50 -41
  14. package/dist/apps/services/cognito.js +85 -48
  15. package/dist/apps/services/cognito.js.map +1 -1
  16. package/dist/components/mfa/MfaAuthenticatorAppDialog.d.ts +12 -0
  17. package/dist/components/mfa/MfaAuthenticatorAppDialog.js +64 -0
  18. package/dist/components/mfa/MfaAuthenticatorAppDialog.js.map +1 -0
  19. package/dist/components/mfa/MfaDisableDialog.d.ts +10 -0
  20. package/dist/components/mfa/MfaDisableDialog.js +31 -0
  21. package/dist/components/mfa/MfaDisableDialog.js.map +1 -0
  22. package/dist/components/mfa/MfaErrorSnackbar.d.ts +10 -0
  23. package/dist/components/mfa/MfaErrorSnackbar.js +17 -0
  24. package/dist/components/mfa/MfaErrorSnackbar.js.map +1 -0
  25. package/dist/components/mfa/MfaMethodRow.d.ts +20 -0
  26. package/dist/components/mfa/MfaMethodRow.js +10 -0
  27. package/dist/components/mfa/MfaMethodRow.js.map +1 -0
  28. package/dist/components/mfa/MfaPhoneNumberDialog.d.ts +11 -0
  29. package/dist/components/mfa/MfaPhoneNumberDialog.js +120 -0
  30. package/dist/components/mfa/MfaPhoneNumberDialog.js.map +1 -0
  31. package/dist/components/mfa/MfaRemovePhoneNumberDialog.d.ts +10 -0
  32. package/dist/components/mfa/MfaRemovePhoneNumberDialog.js +24 -0
  33. package/dist/components/mfa/MfaRemovePhoneNumberDialog.js.map +1 -0
  34. package/dist/components/mfa/MfaStatusChip.d.ts +10 -0
  35. package/dist/components/mfa/MfaStatusChip.js +29 -0
  36. package/dist/components/mfa/MfaStatusChip.js.map +1 -0
  37. package/dist/components/mfa/MfaSuccessSnackbar.d.ts +10 -0
  38. package/dist/components/mfa/MfaSuccessSnackbar.js +17 -0
  39. package/dist/components/mfa/MfaSuccessSnackbar.js.map +1 -0
  40. package/dist/components/mfa/MultiFactorAuthentication.d.ts +10 -10
  41. package/dist/components/mfa/MultiFactorAuthentication.js +46 -40
  42. package/dist/components/mfa/MultiFactorAuthentication.js.map +1 -1
  43. package/dist/hooks/useLogin.d.ts +14 -8
  44. package/dist/hooks/useLogin.js +16 -6
  45. package/dist/hooks/useLogin.js.map +1 -1
  46. package/dist/hooks/useMfa.d.ts +100 -31
  47. package/dist/hooks/useMfa.js +455 -68
  48. package/dist/hooks/useMfa.js.map +1 -1
  49. package/dist/index.d.ts +8 -0
  50. package/dist/index.js +8 -0
  51. package/dist/index.js.map +1 -1
  52. package/dist/utils/joinArray.d.ts +1 -0
  53. package/dist/utils/joinArray.js +7 -0
  54. package/dist/utils/joinArray.js.map +1 -0
  55. package/dist/utils/mfa-requirement.d.ts +12 -0
  56. package/dist/utils/mfa-requirement.js +96 -0
  57. package/dist/utils/mfa-requirement.js.map +1 -0
  58. package/package.json +2 -2
  59. package/dist/components/mfa/MfaDialog.d.ts +0 -9
  60. package/dist/components/mfa/MfaDialog.js +0 -47
  61. package/dist/components/mfa/MfaDialog.js.map +0 -1
@@ -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'\n\ntype MfaState = {\n isExternalIdentityProviderUser: boolean\n isLoading: boolean\n isMfaEnabled: boolean\n loadingError?: Error\n isSettingUpMfa: boolean\n isDisablingMfa: boolean\n setupError?: Error\n mfaSetup?: Awaited<ReturnType<typeof authService.setupMfa>>\n}\n\nexport const MfaContext = React.createContext<\n MfaState & {\n beginMfaSetup: () => void\n cancelMfaSetup: () => void\n completeMfaSetup: () => void\n beginDisablingMfa: () => void\n cancelDisablingMfa: () => void\n completeDisablingMfa: () => void\n clearMfaSetupError: () => void\n loadMfa: () => void\n }\n>({\n isExternalIdentityProviderUser: false,\n isLoading: true,\n isMfaEnabled: false,\n isSettingUpMfa: false,\n isDisablingMfa: false,\n beginMfaSetup: () => {},\n cancelMfaSetup: () => {},\n completeMfaSetup: () => {},\n beginDisablingMfa: () => {},\n cancelDisablingMfa: () => {},\n completeDisablingMfa: () => {},\n clearMfaSetupError: () => {},\n loadMfa: () => {},\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 isSettingUpMfa: false,\n isDisablingMfa: false,\n })\n\n const loadMfa = React.useCallback(async (abortSignal?: AbortSignal) => {\n setState((currentState) => ({\n ...currentState,\n isLoading: true,\n isMfaEnabled: false,\n loadingError: undefined,\n }))\n try {\n const newIsMfaEnabled = await authService.checkIsMfaEnabled()\n if (!abortSignal?.aborted) {\n setState((currentState) => ({\n ...currentState,\n isLoading: false,\n isMfaEnabled: newIsMfaEnabled,\n }))\n }\n } catch (error) {\n setState((currentState) => ({\n ...currentState,\n isLoading: false,\n loadingError: error as Error,\n }))\n }\n }, [])\n\n const clearMfaSetupError = React.useCallback(() => {\n setState((currentState) => ({\n ...currentState,\n setupError: undefined,\n }))\n }, [])\n\n const cancelMfaSetup = React.useCallback(() => {\n setState((currentState) => ({\n ...currentState,\n mfaSetup: undefined,\n }))\n }, [])\n\n const completeMfaSetup = React.useCallback(() => {\n setState((currentState) => ({\n ...currentState,\n isMfaEnabled: true,\n mfaSetup: undefined,\n }))\n }, [])\n\n const beginMfaSetup = React.useCallback(async () => {\n setState((currentState) => ({\n ...currentState,\n isSettingUpMfa: true,\n mfaSetup: undefined,\n setupError: undefined,\n }))\n try {\n const newMfaSetup = await authService.setupMfa()\n setState((currentState) => ({\n ...currentState,\n isSettingUpMfa: false,\n mfaSetup: newMfaSetup,\n }))\n } catch (error) {\n setState((currentState) => ({\n ...currentState,\n isSettingUpMfa: false,\n setupError: error as Error,\n }))\n }\n }, [])\n\n const beginDisablingMfa = React.useCallback(() => {\n setState((currentState) => ({\n ...currentState,\n isDisablingMfa: true,\n }))\n }, [])\n\n const cancelDisablingMfa = React.useCallback(() => {\n setState((currentState) => ({\n ...currentState,\n isDisablingMfa: false,\n }))\n }, [])\n\n const completeDisablingMfa = React.useCallback(async () => {\n await authService.disableMfa()\n setState((currentState) => ({\n ...currentState,\n isDisablingMfa: false,\n isMfaEnabled: false,\n }))\n }, [])\n\n React.useEffect(() => {\n if (isExternalIdentityProviderUser) {\n return\n }\n\n loadMfa()\n\n return () => {}\n }, [isExternalIdentityProviderUser, loadMfa])\n\n const value = React.useMemo(() => {\n return {\n ...state,\n clearMfaSetupError,\n loadMfa,\n beginMfaSetup,\n cancelMfaSetup,\n completeMfaSetup,\n beginDisablingMfa,\n cancelDisablingMfa,\n completeDisablingMfa,\n }\n }, [\n state,\n clearMfaSetupError,\n loadMfa,\n beginMfaSetup,\n cancelMfaSetup,\n completeMfaSetup,\n beginDisablingMfa,\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 check if the logged in user meets the MFA requirement of your\n * application. Will throw an Error if used outside of the `<MfaProvider />`\n * 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,12 +25,20 @@ 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';
31
32
  export { default as CalendarBookingsRescheduleForm } from './components/calendar-bookings/CalendarBookingsReschedulingForm';
32
33
  export { default as CalendarBookingsCancelForm } from './components/calendar-bookings/CalendarBookingsCancelForm';
33
34
  export { default as MultiFactorAuthentication } from './components/mfa/MultiFactorAuthentication';
35
+ export { default as MfaAuthenticatorAppDialog } from './components/mfa/MfaAuthenticatorAppDialog';
36
+ export { default as MfaDisableDialog } from './components/mfa/MfaDisableDialog';
37
+ export { default as MfaRemovePhoneNumberDialog } from './components/mfa/MfaRemovePhoneNumberDialog';
38
+ export { default as MfaPhoneNumberDialog } from './components/mfa/MfaPhoneNumberDialog';
39
+ export { default as MfaSuccessSnackbar } from './components/mfa/MfaSuccessSnackbar';
40
+ export { default as MfaErrorSnackbar } from './components/mfa/MfaErrorSnackbar';
41
+ export { default as MfaStatusChip } from './components/mfa/MfaStatusChip';
34
42
  export { default as useMfa, MfaProvider, useUserMeetsMfaRequirement, } from './hooks/useMfa';
35
43
  export { default as DownloadableFiles } from './components/downloadable-files';
36
44
  export { default as ImageCropper, getAspectRatio, generateCroppedImageBlob, PercentCrop, } from './components/ImageCropper';
package/dist/index.js CHANGED
@@ -25,12 +25,20 @@ 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';
31
32
  export { default as CalendarBookingsRescheduleForm } from './components/calendar-bookings/CalendarBookingsReschedulingForm';
32
33
  export { default as CalendarBookingsCancelForm } from './components/calendar-bookings/CalendarBookingsCancelForm';
33
34
  export { default as MultiFactorAuthentication } from './components/mfa/MultiFactorAuthentication';
35
+ export { default as MfaAuthenticatorAppDialog } from './components/mfa/MfaAuthenticatorAppDialog';
36
+ export { default as MfaDisableDialog } from './components/mfa/MfaDisableDialog';
37
+ export { default as MfaRemovePhoneNumberDialog } from './components/mfa/MfaRemovePhoneNumberDialog';
38
+ export { default as MfaPhoneNumberDialog } from './components/mfa/MfaPhoneNumberDialog';
39
+ export { default as MfaSuccessSnackbar } from './components/mfa/MfaSuccessSnackbar';
40
+ export { default as MfaErrorSnackbar } from './components/mfa/MfaErrorSnackbar';
41
+ export { default as MfaStatusChip } from './components/mfa/MfaStatusChip';
34
42
  export { default as useMfa, MfaProvider, useUserMeetsMfaRequirement, } from './hooks/useMfa';
35
43
  export { default as DownloadableFiles } from './components/downloadable-files';
36
44
  export { default as ImageCropper, getAspectRatio, generateCroppedImageBlob, } from './components/ImageCropper';
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'\n\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":"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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 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,7 @@
1
+ export function joinArray(arr, type) {
2
+ const listFormat = new Intl.ListFormat('en', {
3
+ type,
4
+ });
5
+ return listFormat.format(arr);
6
+ }
7
+ //# sourceMappingURL=joinArray.js.map
@@ -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":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAIvC,MAAM,UAAU,aAAa,CAC3B,cAAoD;IAEpD,OAAO,CACL,CAAC,CAAC,cAAc,IAAI,CAAC,cAAc,CAAC,GAAG,IAAI,cAAc,CAAC,gBAAgB,CAAC,CAC5E,CAAA;AACH,CAAC;AAID,MAAM,2BAA2B,GAAG,MAAM,CAAC,IAAI,CAAC;IAC9C,GAAG,EAAE,KAAK;IACV,gBAAgB,EAAE,KAAK;CACW,CAA2B,CAAA;AAE/D,MAAM,UAAU,+BAA+B,CAC7C,cAAoD;;IAEpD,MAAM,aAAa,GAAG;QACpB,GAAG,EAAE,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,GAAG,mCAAI,KAAK;QACjC,gBAAgB,EAAE,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,gBAAgB,mCAAI,KAAK;KAC5D,CAAA;IACD,MAAM,OAAO,GAA2B,EAAE,CAAA;IAE1C,IAAI,aAAa,CAAC,gBAAgB,EAAE,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;IAClC,CAAC;IAED,IAAI,aAAa,CAAC,GAAG,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,kCAAkC,CAChD,OAA+B;IAE/B,OAAO;QACL,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC5B,gBAAgB,EAAE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC;KACvD,CAAA;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,cAAoD;IAEpD,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,CAAC;QACnC,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,MAAM,eAAe,GAAG,+BAA+B,CAAC,cAAc,CAAC,CAAA;IAEvE,IAAI,eAAe,CAAC,MAAM,KAAK,2BAA2B,CAAC,MAAM,EAAE,CAAC;QAClE,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,MAAM,UAAU,GAAG,SAAS,CAC1B,eAAe,CAAC,GAAG,CAAC,+BAA+B,CAAC,EACpD,aAAa,CACd,CAAA;IAED,OAAO,iBAAiB,UAAU,QAAQ,CAAA;AAC5C,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC7C,MAA4B;IAE5B,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,KAAK;YACR,OAAO,KAAK,CAAA;QACd,KAAK,kBAAkB;YACrB,OAAO,mBAAmB,CAAA;QAC5B,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,CAAC,GAAU,MAAM,CAAA;YACvB,OAAO,CAAC,CAAA;QACV,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,6BAA6B,CACpC,MAA4B,EAC5B,WAAwB;IAExB,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,WAAW,CAAC,GAAG,CAAC,SAAS,CAAA;IAClC,CAAC;IAED,OAAO,WAAW,CAAC,aAAa,CAAC,SAAS,CAAA;AAC5C,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,cAAoD,EACpD,WAAwB;IAExB,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,CAAC;QACnC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,+BAA+B,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CACrE,6BAA6B,CAAC,MAAM,EAAE,WAAW,CAAC,CACnD,CAAA;AACH,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,MAA4B,EAC5B,cAAoD,EACpD,gBAAgB,GAAG,KAAK;IAExB,IAAI,CAAC,cAAc,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,CAAC;QACtD,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,MAAM,eAAe,GAAG,+BAA+B,CAAC,cAAc,CAAC,CAAA;IAEvE,MAAM,UAAU,GAAG,SAAS,CAC1B,eAAe,CAAC,GAAG,CAAC,+BAA+B,CAAC,EACpD,aAAa,CACd,CAAA;IAED,OAAO,oDAAoD,gBAAgB,CAAC,WAAW,EAAE,iCAAiC,UAAU,+BAA+B,CAAA;AACrK,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,cAAoD,EACpD,WAAwB,EACxB,gBAAgB,GAAG,SAAS;IAE5B,IACE,CAAC,aAAa,CAAC,cAAc,CAAC;QAC9B,uBAAuB,CAAC,cAAc,EAAE,WAAW,CAAC,EACpD,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,MAAM,eAAe,GAAG,+BAA+B,CAAC,cAAc,CAAC,CAAA;IACvE,MAAM,gBAAgB,GACpB,WAAW,CAAC,aAAa,CAAC,OAAO,IAAI,WAAW,CAAC,GAAG,CAAC,OAAO,CAAA;IAE9D,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,WAAW,GAAG,+BAA+B,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAA;QAEvE,IAAI,gBAAgB,EAAE,CAAC;YACrB,OAAO,YAAY,WAAW,sHAAsH,gBAAgB,CAAC,WAAW,EAAE,GAAG,CAAA;QACvL,CAAC;QAED,OAAO,YAAY,WAAW,uEAAuE,gBAAgB,GAAG,CAAA;IAC1H,CAAC;IAED,MAAM,UAAU,GAAG,SAAS,CAC1B,eAAe,CAAC,GAAG,CAAC,+BAA+B,CAAC,EACpD,aAAa,CACd,CAAA;IAED,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,YAAY,UAAU,kFAAkF,gBAAgB,CAAC,WAAW,EAAE,GAAG,CAAA;IAClJ,CAAC;IAED,OAAO,YAAY,UAAU,uEAAuE,gBAAgB,GAAG,CAAA;AACzH,CAAC","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"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@oneblink/apps-react",
3
3
  "description": "Helper functions for OneBlink apps in ReactJS.",
4
- "version": "10.3.1",
4
+ "version": "11.0.0-beta.2",
5
5
  "author": "OneBlink <developers@oneblink.io> (https://oneblink.io)",
6
6
  "bugs": {
7
7
  "url": "https://github.com/oneblink/apps-react/issues"
@@ -132,7 +132,7 @@
132
132
  "copy:sass": "copyfiles -u 1 ./src/styles.scss ./dist",
133
133
  "copy:styles": "copyfiles -u 1 ./src/styles/* ./dist",
134
134
  "docs": "typedoc",
135
- "eslint": "eslint src --fix --cache",
135
+ "eslint": "eslint . --fix --cache",
136
136
  "fixpack": "fixpack",
137
137
  "format": "prettier --write .",
138
138
  "prepare": "npm run build",
@@ -1,9 +0,0 @@
1
- import * as React from 'react';
2
- import { authService } from '../../apps';
3
- declare function MfaDialog({ onClose, onCompleted, mfaSetup, }: {
4
- onClose: () => void;
5
- onCompleted: () => void;
6
- mfaSetup: Awaited<ReturnType<typeof authService.setupMfa>> | undefined;
7
- }): import("react/jsx-runtime").JSX.Element;
8
- declare const _default: React.MemoExoticComponent<typeof MfaDialog>;
9
- export default _default;
@@ -1,47 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import * as React from 'react';
3
- import { QRCodeSVG } from 'qrcode.react';
4
- import { Box, Collapse, Dialog, Grid, Link, Typography, DialogContent, DialogActions, Button, } from '@mui/material';
5
- import { authService } from '../../apps';
6
- import useBooleanState from '../../hooks/useBooleanState';
7
- import { CopyToClipBoardIconButton } from '../CopyToClipboardIconButton';
8
- import SuccessSnackbar from '../SuccessSnackbar';
9
- import InputField from '../InputField';
10
- function MfaDialog({ onClose, onCompleted, mfaSetup, }) {
11
- const [code, setState] = React.useState('');
12
- const [hasSuccessfullySaved, showSuccessfullySaved, hideSuccessfullySaved] = useBooleanState(false);
13
- const [isShowingSecretCode, showSecretCode, hideSecretCode] = useBooleanState(false);
14
- const qrcodeValue = React.useMemo(() => {
15
- if (mfaSetup) {
16
- return authService.generateMfaQrCodeUrl(mfaSetup);
17
- }
18
- }, [mfaSetup]);
19
- const [isSaving, startSaving, stopSaving] = useBooleanState(false);
20
- const handleSave = React.useCallback(async () => {
21
- startSaving();
22
- if (!code || !mfaSetup) {
23
- return;
24
- }
25
- await mfaSetup.mfaCodeCallback(code);
26
- onCompleted();
27
- stopSaving();
28
- showSuccessfullySaved();
29
- }, [
30
- code,
31
- mfaSetup,
32
- onCompleted,
33
- showSuccessfullySaved,
34
- startSaving,
35
- stopSaving,
36
- ]);
37
- return (_jsxs(React.Fragment, { children: [_jsxs(Dialog, { open: !!mfaSetup, onClose: onClose, title: "Complete MFA Setup", children: [_jsx(DialogContent, { dividers: true, children: _jsxs(_Fragment, { children: [_jsx(Typography, { variant: "subtitle2", gutterBottom: true, children: "Authenticator App" }), _jsxs(Typography, { variant: "body2", paragraph: true, children: ["Authenticator apps like", ' ', _jsx(Link, { href: "https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2", target: "_blank", rel: "noopener noreferrer", children: "Google Authenticator" }), ' ', "and", ' ', _jsx(Link, { href: "https://www.microsoft.com/en-us/security/mobile-authenticator-app", target: "_blank", rel: "noopener noreferrer", children: "Microsoft Authenticator" }), ' ', "generate one-time passwords that are used as a second factor to verify your identity when prompted during sign-in."] }), _jsx(Typography, { variant: "subtitle2", gutterBottom: true, children: "Scan the QR code" }), _jsx(Typography, { variant: "body2", paragraph: true, children: "Use an authenticator app or browser extension to scan the QR code below." }), _jsx(Box, { marginBottom: 2, children: _jsxs(Grid, { container: true, spacing: 2, alignItems: "center", children: [_jsx(Grid, { children: _jsx(Box, { border: 1, padding: 2, borderRadius: 1, borderColor: "divider", display: "inline-block", children: _jsx(QRCodeSVG, { value: qrcodeValue || '' }) }) }), _jsx(Grid, { size: { xs: 'grow' }, children: _jsxs(Typography, { variant: "caption", color: "text.secondary", children: ["Having trouble scanning the QR code?", ' ', _jsx(Link, { onClick: showSecretCode, component: "button", children: "Click here" }), ' ', "to display the setup key which can be manually entered in your authenticator app."] }) })] }) }), _jsx(Collapse, { in: isShowingSecretCode, children: _jsx(Box, { marginBottom: 2, children: _jsx(InputField, { label: "Setup Key", value: (mfaSetup === null || mfaSetup === void 0 ? void 0 : mfaSetup.secretCode) || '', fullWidth: true, slotProps: {
38
- input: {
39
- endAdornment: (_jsx(CopyToClipBoardIconButton, { text: (mfaSetup === null || mfaSetup === void 0 ? void 0 : mfaSetup.secretCode) || '' })),
40
- },
41
- }, helperText: _jsxs(_Fragment, { children: [_jsx(Link, { onClick: hideSecretCode, component: "button", children: "Click here" }), ' ', "to hide the setup key"] }) }) }) }), _jsx(Typography, { variant: "subtitle2", gutterBottom: true, children: "Verify App" }), _jsx(Typography, { variant: "body2", paragraph: true, children: "Enter the 6-digit code found in your authenticator app." }), _jsx(InputField, { autoFocus: true, margin: "none", name: "code", label: "Code", fullWidth: true, placeholder: "XXXXXX", variant: "outlined", value: code, onChange: (event) => {
42
- const newValue = event.target.value;
43
- setState(() => newValue);
44
- }, disabled: isSaving, "data-cypress": "mfa-dialog-code" })] }) }), _jsxs(DialogActions, { children: [_jsx(Button, { onClick: onClose, disabled: isSaving, children: "Cancel" }), _jsx(Button, { variant: "contained", color: "primary", loading: isSaving, onClick: handleSave, children: "Save" })] })] }), _jsx(SuccessSnackbar, { open: hasSuccessfullySaved, onClose: hideSuccessfullySaved, children: "MFA has been successfully setup." })] }));
45
- }
46
- export default React.memo(MfaDialog);
47
- //# sourceMappingURL=MfaDialog.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MfaDialog.js","sourceRoot":"","sources":["../../../src/components/mfa/MfaDialog.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport { QRCodeSVG } from 'qrcode.react'\nimport {\n Box,\n Collapse,\n Dialog,\n Grid,\n Link,\n Typography,\n DialogContent,\n DialogActions,\n Button,\n} from '@mui/material'\nimport { authService } from '../../apps'\nimport useBooleanState from '../../hooks/useBooleanState'\nimport { CopyToClipBoardIconButton } from '../CopyToClipboardIconButton'\nimport SuccessSnackbar from '../SuccessSnackbar'\nimport InputField from '../InputField'\n\nfunction MfaDialog({\n onClose,\n onCompleted,\n mfaSetup,\n}: {\n onClose: () => void\n onCompleted: () => void\n mfaSetup: Awaited<ReturnType<typeof authService.setupMfa>> | undefined\n}) {\n const [code, setState] = React.useState('')\n const [hasSuccessfullySaved, showSuccessfullySaved, hideSuccessfullySaved] =\n useBooleanState(false)\n const [isShowingSecretCode, showSecretCode, hideSecretCode] =\n useBooleanState(false)\n\n const qrcodeValue = React.useMemo(() => {\n if (mfaSetup) {\n return authService.generateMfaQrCodeUrl(mfaSetup)\n }\n }, [mfaSetup])\n\n const [isSaving, startSaving, stopSaving] = useBooleanState(false)\n const handleSave = React.useCallback(async () => {\n startSaving()\n if (!code || !mfaSetup) {\n return\n }\n\n await mfaSetup.mfaCodeCallback(code)\n onCompleted()\n stopSaving()\n showSuccessfullySaved()\n }, [\n code,\n mfaSetup,\n onCompleted,\n showSuccessfullySaved,\n startSaving,\n stopSaving,\n ])\n\n return (\n <React.Fragment>\n <Dialog open={!!mfaSetup} onClose={onClose} title=\"Complete MFA Setup\">\n <DialogContent dividers>\n <>\n <Typography variant=\"subtitle2\" gutterBottom>\n Authenticator App\n </Typography>\n <Typography variant=\"body2\" paragraph>\n Authenticator apps like{' '}\n <Link\n href=\"https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Google Authenticator\n </Link>{' '}\n and{' '}\n <Link\n href=\"https://www.microsoft.com/en-us/security/mobile-authenticator-app\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Microsoft Authenticator\n </Link>{' '}\n generate one-time passwords that are used as a second factor to\n verify your identity when prompted during sign-in.\n </Typography>\n <Typography variant=\"subtitle2\" gutterBottom>\n Scan the QR code\n </Typography>\n <Typography variant=\"body2\" paragraph>\n Use an authenticator app or browser extension to scan the QR code\n below.\n </Typography>\n\n <Box marginBottom={2}>\n <Grid container spacing={2} alignItems=\"center\">\n <Grid>\n <Box\n border={1}\n padding={2}\n borderRadius={1}\n borderColor=\"divider\"\n display=\"inline-block\"\n >\n <QRCodeSVG value={qrcodeValue || ''} />\n </Box>\n </Grid>\n <Grid size={{ xs: 'grow' }}>\n <Typography variant=\"caption\" color=\"text.secondary\">\n Having trouble scanning the QR code?{' '}\n <Link onClick={showSecretCode} component=\"button\">\n Click here\n </Link>{' '}\n to display the setup key which can be manually entered in\n your authenticator app.\n </Typography>\n </Grid>\n </Grid>\n </Box>\n\n <Collapse in={isShowingSecretCode}>\n <Box marginBottom={2}>\n <InputField\n label=\"Setup Key\"\n value={mfaSetup?.secretCode || ''}\n fullWidth\n slotProps={{\n input: {\n endAdornment: (\n <CopyToClipBoardIconButton\n text={mfaSetup?.secretCode || ''}\n />\n ),\n },\n }}\n helperText={\n <>\n <Link onClick={hideSecretCode} component=\"button\">\n Click here\n </Link>{' '}\n to hide the setup key\n </>\n }\n />\n </Box>\n </Collapse>\n\n <Typography variant=\"subtitle2\" gutterBottom>\n Verify App\n </Typography>\n <Typography variant=\"body2\" paragraph>\n Enter the 6-digit code found in your authenticator app.\n </Typography>\n\n <InputField\n autoFocus\n margin=\"none\"\n name=\"code\"\n label=\"Code\"\n fullWidth\n placeholder=\"XXXXXX\"\n variant=\"outlined\"\n value={code}\n onChange={(event) => {\n const newValue = event.target.value\n setState(() => newValue)\n }}\n disabled={isSaving}\n data-cypress=\"mfa-dialog-code\"\n />\n </>\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose} disabled={isSaving}>\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n loading={isSaving}\n onClick={handleSave}\n >\n Save\n </Button>\n </DialogActions>\n </Dialog>\n\n <SuccessSnackbar\n open={hasSuccessfullySaved}\n onClose={hideSuccessfullySaved}\n >\n MFA has been successfully setup.\n </SuccessSnackbar>\n </React.Fragment>\n )\n}\n\nexport default React.memo(MfaDialog)\n"]}