@oneblink/apps-react 10.3.1 → 11.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) 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/services/AWSCognitoClient.d.ts +39 -4
  5. package/dist/apps/services/AWSCognitoClient.js +238 -23
  6. package/dist/apps/services/AWSCognitoClient.js.map +1 -1
  7. package/dist/apps/services/cognito.d.ts +50 -41
  8. package/dist/apps/services/cognito.js +85 -48
  9. package/dist/apps/services/cognito.js.map +1 -1
  10. package/dist/components/mfa/MfaAuthenticatorAppDialog.d.ts +12 -0
  11. package/dist/components/mfa/MfaAuthenticatorAppDialog.js +64 -0
  12. package/dist/components/mfa/MfaAuthenticatorAppDialog.js.map +1 -0
  13. package/dist/components/mfa/MfaDisableDialog.d.ts +10 -0
  14. package/dist/components/mfa/MfaDisableDialog.js +31 -0
  15. package/dist/components/mfa/MfaDisableDialog.js.map +1 -0
  16. package/dist/components/mfa/MfaErrorSnackbar.d.ts +10 -0
  17. package/dist/components/mfa/MfaErrorSnackbar.js +17 -0
  18. package/dist/components/mfa/MfaErrorSnackbar.js.map +1 -0
  19. package/dist/components/mfa/MfaMethodRow.d.ts +19 -0
  20. package/dist/components/mfa/MfaMethodRow.js +10 -0
  21. package/dist/components/mfa/MfaMethodRow.js.map +1 -0
  22. package/dist/components/mfa/MfaPhoneNumberDialog.d.ts +11 -0
  23. package/dist/components/mfa/MfaPhoneNumberDialog.js +120 -0
  24. package/dist/components/mfa/MfaPhoneNumberDialog.js.map +1 -0
  25. package/dist/components/mfa/MfaRemovePhoneNumberDialog.d.ts +10 -0
  26. package/dist/components/mfa/MfaRemovePhoneNumberDialog.js +24 -0
  27. package/dist/components/mfa/MfaRemovePhoneNumberDialog.js.map +1 -0
  28. package/dist/components/mfa/MfaStatusChip.d.ts +10 -0
  29. package/dist/components/mfa/MfaStatusChip.js +29 -0
  30. package/dist/components/mfa/MfaStatusChip.js.map +1 -0
  31. package/dist/components/mfa/MfaSuccessSnackbar.d.ts +10 -0
  32. package/dist/components/mfa/MfaSuccessSnackbar.js +17 -0
  33. package/dist/components/mfa/MfaSuccessSnackbar.js.map +1 -0
  34. package/dist/components/mfa/MultiFactorAuthentication.d.ts +1 -2
  35. package/dist/components/mfa/MultiFactorAuthentication.js +30 -30
  36. package/dist/components/mfa/MultiFactorAuthentication.js.map +1 -1
  37. package/dist/hooks/useLogin.d.ts +14 -8
  38. package/dist/hooks/useLogin.js +16 -6
  39. package/dist/hooks/useLogin.js.map +1 -1
  40. package/dist/hooks/useMfa.d.ts +46 -14
  41. package/dist/hooks/useMfa.js +388 -43
  42. package/dist/hooks/useMfa.js.map +1 -1
  43. package/dist/index.d.ts +7 -0
  44. package/dist/index.js +7 -0
  45. package/dist/index.js.map +1 -1
  46. package/package.json +2 -2
  47. package/dist/components/mfa/MfaDialog.d.ts +0 -9
  48. package/dist/components/mfa/MfaDialog.js +0 -47
  49. 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 { 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"]}
package/dist/index.d.ts CHANGED
@@ -31,6 +31,13 @@ export { default as CalendarBookingsForm } from './components/calendar-bookings/
31
31
  export { default as CalendarBookingsRescheduleForm } from './components/calendar-bookings/CalendarBookingsReschedulingForm';
32
32
  export { default as CalendarBookingsCancelForm } from './components/calendar-bookings/CalendarBookingsCancelForm';
33
33
  export { default as MultiFactorAuthentication } from './components/mfa/MultiFactorAuthentication';
34
+ export { default as MfaAuthenticatorAppDialog } from './components/mfa/MfaAuthenticatorAppDialog';
35
+ export { default as MfaDisableDialog } from './components/mfa/MfaDisableDialog';
36
+ export { default as MfaRemovePhoneNumberDialog } from './components/mfa/MfaRemovePhoneNumberDialog';
37
+ export { default as MfaPhoneNumberDialog } from './components/mfa/MfaPhoneNumberDialog';
38
+ export { default as MfaSuccessSnackbar } from './components/mfa/MfaSuccessSnackbar';
39
+ export { default as MfaErrorSnackbar } from './components/mfa/MfaErrorSnackbar';
40
+ export { default as MfaStatusChip } from './components/mfa/MfaStatusChip';
34
41
  export { default as useMfa, MfaProvider, useUserMeetsMfaRequirement, } from './hooks/useMfa';
35
42
  export { default as DownloadableFiles } from './components/downloadable-files';
36
43
  export { default as ImageCropper, getAspectRatio, generateCroppedImageBlob, PercentCrop, } from './components/ImageCropper';
package/dist/index.js CHANGED
@@ -31,6 +31,13 @@ export { default as CalendarBookingsForm } from './components/calendar-bookings/
31
31
  export { default as CalendarBookingsRescheduleForm } from './components/calendar-bookings/CalendarBookingsReschedulingForm';
32
32
  export { default as CalendarBookingsCancelForm } from './components/calendar-bookings/CalendarBookingsCancelForm';
33
33
  export { default as MultiFactorAuthentication } from './components/mfa/MultiFactorAuthentication';
34
+ export { default as MfaAuthenticatorAppDialog } from './components/mfa/MfaAuthenticatorAppDialog';
35
+ export { default as MfaDisableDialog } from './components/mfa/MfaDisableDialog';
36
+ export { default as MfaRemovePhoneNumberDialog } from './components/mfa/MfaRemovePhoneNumberDialog';
37
+ export { default as MfaPhoneNumberDialog } from './components/mfa/MfaPhoneNumberDialog';
38
+ export { default as MfaSuccessSnackbar } from './components/mfa/MfaSuccessSnackbar';
39
+ export { default as MfaErrorSnackbar } from './components/mfa/MfaErrorSnackbar';
40
+ export { default as MfaStatusChip } from './components/mfa/MfaStatusChip';
34
41
  export { default as useMfa, MfaProvider, useUserMeetsMfaRequirement, } from './hooks/useMfa';
35
42
  export { default as DownloadableFiles } from './components/downloadable-files';
36
43
  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 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"]}
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.1",
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"]}