{"version":3,"file":"RecoveryCodeEntryScreen.mjs","sources":["../../../../../../../../../web/src/ui/b2b/screens/RecoveryCodeEntryScreen.tsx"],"sourcesContent":["import { useLingui } from '@lingui/react/macro';\nimport { RecoveryCodeRecoverResponse, StytchProjectConfigurationInput } from '@stytch/core/public';\nimport React, { FormEvent, useState } from 'react';\n\nimport Button from '../../components/atoms/Button';\nimport Column from '../../components/atoms/Column';\nimport Typography from '../../components/atoms/Typography';\nimport ButtonColumn from '../../components/molecules/ButtonColumn';\nimport Input from '../../components/molecules/Input';\nimport { useConfig, useGlobalReducer, useStytch } from '../GlobalContextProvider';\nimport { StytchMutationKey, useMutate } from '../utils';\nimport styles from './RecoveryCodeEntryScreen.module.css';\n\nexport const RecoveryCodeEntryScreen = () => {\n  const stytchClient = useStytch();\n  const {\n    sessionOptions: { sessionDurationMinutes },\n  } = useConfig();\n  const { t } = useLingui();\n\n  const [state, dispatch] = useGlobalReducer();\n\n  // This screen should only be shown if primary info is available\n  const { memberId, organizationId } = state.mfa.primaryInfo!;\n\n  const {\n    trigger: authenticate,\n    isMutating: isSubmitting,\n    error,\n  } = useMutate<\n    RecoveryCodeRecoverResponse<StytchProjectConfigurationInput>,\n    unknown,\n    StytchMutationKey,\n    { recoveryCode: string; memberId: string; organizationId: string; sessionDurationMinutes: number }\n  >(\n    'stytch.recoveryCodes.recover',\n    (\n      _: string,\n      {\n        arg: { recoveryCode, memberId, organizationId, sessionDurationMinutes },\n      }: { arg: { recoveryCode: string; memberId: string; organizationId: string; sessionDurationMinutes: number } },\n    ) =>\n      stytchClient.recoveryCodes.recover({\n        recovery_code: recoveryCode,\n        member_id: memberId,\n        organization_id: organizationId,\n        session_duration_minutes: sessionDurationMinutes,\n      }),\n    {\n      throwOnError: false,\n      onSuccess: () => {\n        dispatch({ type: 'recovery_code/authenticate_success' });\n      },\n    },\n  );\n\n  const [recoveryCode, setRecoveryCode] = useState('');\n  const errorMessage = error\n    ? t({ id: 'recoveryCodes.entry.error.invalidCode', message: 'Invalid backup code, please try again.' })\n    : undefined;\n\n  const handleSubmit = async (e: FormEvent) => {\n    e.preventDefault();\n    authenticate({ recoveryCode, memberId, organizationId, sessionDurationMinutes });\n  };\n\n  return (\n    <Column as=\"form\" gap={6} onSubmit={handleSubmit}>\n      <Typography variant=\"header\">{t({ id: 'recoveryCodes.entry.title', message: 'Enter backup code' })}</Typography>\n      <Typography variant=\"body\">\n        {t({\n          id: 'recoveryCodes.entry.content',\n          message: 'Enter one of the backup codes you saved when setting up your authenticator app.',\n        })}\n      </Typography>\n\n      <Input\n        id=\"recovery-code\"\n        className={styles.input}\n        value={recoveryCode}\n        onChange={(e) => {\n          setRecoveryCode(e.target.value);\n        }}\n        placeholder={t({ id: 'formField.backupCode.placeholder', message: 'Enter backup code' })}\n        label={t({ id: 'formField.backupCode.ariaLabel', message: 'Backup code' })}\n        hideLabel\n        required\n        autoComplete=\"off\"\n        spellCheck={false}\n        error={errorMessage}\n      />\n\n      <ButtonColumn>\n        <Button variant=\"primary\" loading={isSubmitting} type=\"submit\" disabled={!recoveryCode || isSubmitting}>\n          {t({ id: 'button.continue', message: 'Continue' })}\n        </Button>\n        <Button variant=\"ghost\" onClick={() => dispatch({ type: 'navigate_back' })}>\n          {t({ id: 'button.goBack', message: 'Go back' })}\n        </Button>\n      </ButtonColumn>\n    </Column>\n  );\n};\n"],"names":["RecoveryCodeEntryScreen","stytchClient","useStytch","sessionOptions","sessionDurationMinutes","useConfig","useLingui","state","dispatch","useGlobalReducer","memberId","organizationId","mfa","primaryInfo","trigger","authenticate","isMutating","isSubmitting","error","useMutate","_","arg","recoveryCode","recoveryCodes","recover","recovery_code","member_id","organization_id","session_duration_minutes","throwOnError","onSuccess","type","setRecoveryCode","useState","errorMessage","undefined","handleSubmit","e","preventDefault","React","Column","as","gap","onSubmit","Typography","variant","Input","id","className","styles","input","value","onChange","target","placeholder","label","hideLabel","required","autoComplete","spellCheck","ButtonColumn","Button","loading","disabled","onClick"],"mappings":"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"}