{"version":3,"file":"Container.mjs","sources":["../../../../../../../../web/src/ui/b2b/Container.tsx"],"sourcesContent":["import { AuthFlowType, StytchAPIError, StytchEvent, StytchProjectConfigurationInput } from '@stytch/core/public';\nimport React, { ComponentType, Dispatch, ReactNode, useEffect, useState } from 'react';\nimport { useSWRConfig } from 'swr';\n\nimport { HandledTokenType } from '../../b2b/StytchB2BClient';\nimport { StytchB2BExtendedLoginConfig } from '../../types';\nimport { extractErrorType } from '../../utils/extractErrorType';\nimport Logo from '../components/atoms/Logo';\nimport { ErrorScreen } from '../components/molecules/ErrorScreen';\nimport { LoggingInScreen } from '../components/molecules/Loading';\nimport MainContainer from '../components/molecules/MainContainer';\nimport { usePresentation } from '../components/PresentationConfig';\nimport { B2BGoogleOneTap } from './components/B2BOneTap';\nimport { useConfig, useErrorCallback, useEventCallback, useGlobalReducer, useStytch } from './GlobalContextProvider';\nimport { useIsOnlyFloatingOneTap } from './hooks/useIsOnlyFloatingOneTap';\nimport { Action } from './reducer';\nimport { ConfirmationScreen } from './screens/Confirmation';\nimport { Discovery } from './screens/Discovery';\nimport { MainScreen } from './screens/Main';\nimport { MFAEnrollmentSelectionScreen } from './screens/MFAEnrollmentSelectionScreen';\nimport { RecoveryCodeEntryScreen } from './screens/RecoveryCodeEntryScreen';\nimport { RecoveryCodeSaveScreen } from './screens/RecoveryCodeSaveScreen';\nimport { SMSOTPEnrollScreen } from './screens/SMSOTPEnrollScreen';\nimport { SMSOTPEntryScreen } from './screens/SMSOTPEntryScreen';\nimport { TOTPEnrollManualScreen } from './screens/TOTPEnrollManualScreen';\nimport { TOTPEnrollQRScreen } from './screens/TOTPEnrollQRScreen';\nimport { TOTPEntryScreen } from './screens/TOTPEntryScreen';\nimport { AppScreens } from './types/AppScreens';\nimport { ErrorType } from './types/ErrorType';\nimport {\n  getStytchEventByKey,\n  onAuthenticateSuccess,\n  onDiscoveryAuthenticateSuccess,\n  StytchMutationKey,\n  useExtractSlug,\n  useProductComponents,\n} from './utils';\n\n/**\n * Separately store additional things to do when authenticateByUrl completes or errors\n */\ntype AuthTokenConfig = {\n  mutationKey: StytchMutationKey;\n  // Typing this is too hard. Instead, manually verify the typings from the client matches that expected\n  // by these success functions\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  onSuccess: (data: any, dispatch: Dispatch<Action>, config: StytchB2BExtendedLoginConfig) => void;\n  defaultError?: ErrorType;\n};\n\nconst authTokenConfig: Record<HandledTokenType, AuthTokenConfig> = {\n  discovery: {\n    mutationKey: 'stytch.magicLinks.discovery.authenticate',\n    onSuccess: onDiscoveryAuthenticateSuccess,\n    defaultError: ErrorType.EmailMagicLink,\n  },\n  discovery_oauth: {\n    mutationKey: 'stytch.oauth.discovery.authenticate',\n    onSuccess: onDiscoveryAuthenticateSuccess,\n  },\n  oauth: {\n    mutationKey: 'stytch.oauth.authenticate',\n    onSuccess: onAuthenticateSuccess,\n  },\n  sso: {\n    mutationKey: 'stytch.sso.authenticate',\n    onSuccess: onAuthenticateSuccess,\n  },\n  multi_tenant_magic_links: {\n    mutationKey: 'stytch.magicLinks.authenticate',\n    onSuccess: onAuthenticateSuccess,\n    defaultError: ErrorType.EmailMagicLink,\n  },\n  multi_tenant_impersonation: {\n    mutationKey: 'stytch.impersonation.authenticate',\n    onSuccess: onAuthenticateSuccess,\n  },\n};\n\nconst errorTypeMap: Record<string, ErrorType> = {\n  ad_blocker_detected: ErrorType.AdBlockerDetected,\n};\n\nconst AppContainer: () => ReactNode = () => {\n  const [state, dispatch] = useGlobalReducer();\n  const stytchClient = useStytch();\n  const triggerError = useErrorCallback();\n  const triggerEvent = useEventCallback();\n  const config = useConfig();\n  const { displayWatermark, theme, options } = usePresentation();\n  const isOnlyFloatingOneTap = useIsOnlyFloatingOneTap();\n\n  const currentScreen = state.screen;\n\n  const screenComponentMap = useProductComponents(config, 'screens')!;\n\n  const handleStytchAPIError = (error: StytchAPIError, defaultErrorType = ErrorType.Default) => {\n    const error_type = extractErrorType(error);\n    const errorType: ErrorType = errorTypeMap[error_type!] ?? defaultErrorType;\n\n    dispatch({\n      type: 'set_error_message_and_transition',\n      errorType,\n      canGoBack: false,\n    });\n  };\n\n  const [isTokenAuthLoading, setIsTokenAuthLoading] = useState(false);\n  const { mutate } = useSWRConfig();\n\n  const { slug, resultPending } = useExtractSlug();\n\n  useEffect(() => {\n    // If we're in One Tap only mode, we should not run any other effects\n    if (isOnlyFloatingOneTap) {\n      return;\n    }\n\n    // Password reset has special handling for exchanging a magic link token\n    // for a session and then using it to reset a password\n    if (state.flowState.type == AuthFlowType.PasswordReset) {\n      return;\n    }\n\n    const parsed = stytchClient.parseAuthenticateUrl();\n    if (!parsed?.handled) {\n      return;\n    }\n\n    const { mutationKey, defaultError, onSuccess } = authTokenConfig[parsed.tokenType];\n    setIsTokenAuthLoading(true);\n    mutate(\n      mutationKey,\n      stytchClient.authenticateByUrl({ session_duration_minutes: config.sessionOptions.sessionDurationMinutes }),\n    )\n      .then(\n        (result) => {\n          if (!result?.handled) return; // Should not be possible\n          const { data } = result;\n\n          const event = getStytchEventByKey(mutationKey);\n          if (event) {\n            triggerEvent({ type: event, data } as StytchEvent<StytchProjectConfigurationInput>);\n          }\n\n          onSuccess(data, dispatch, config);\n        },\n        (error) => {\n          triggerError(error);\n          handleStytchAPIError(error, defaultError);\n        },\n      )\n      .finally(() => setIsTokenAuthLoading(false));\n\n    // eslint-disable-next-line react-hooks/exhaustive-deps -- SDK-1354\n  }, []);\n\n  useEffect(() => {\n    // If we're in One Tap only mode, we should not run any other effects\n    if (isOnlyFloatingOneTap) {\n      return;\n    }\n\n    // Skip further action if token discovery is in progress\n    if (isTokenAuthLoading) {\n      return;\n    }\n\n    const parsed = stytchClient.parseAuthenticateUrl();\n    if (parsed?.handled) {\n      return;\n    }\n\n    if (\n      !slug &&\n      !resultPending &&\n      state.flowState.organization === null &&\n      state.screen === AppScreens.Main &&\n      state.flowState.type == AuthFlowType.Organization\n    ) {\n      // No slug found (or no slug pattern)\n      dispatch({\n        type: 'set_error_message_and_transition',\n        errorType: ErrorType.Organization,\n        canGoBack: false,\n      });\n    }\n  }, [\n    dispatch,\n    isOnlyFloatingOneTap,\n    isTokenAuthLoading,\n    resultPending,\n    slug,\n    state.flowState.organization,\n    state.flowState.type,\n    state.screen,\n    stytchClient,\n    triggerError,\n  ]);\n\n  if (isOnlyFloatingOneTap) {\n    return <B2BGoogleOneTap />;\n  }\n\n  if (isTokenAuthLoading) {\n    return (\n      <MainContainer theme={theme} displayWatermark={false}>\n        <LoggingInScreen />\n      </MainContainer>\n    );\n  }\n\n  let orgLogo;\n  if (state.flowState.organization?.organization_logo_url) {\n    const { organization_name, organization_logo_url } = state.flowState.organization;\n    orgLogo = {\n      url: organization_logo_url,\n      alt: organization_name ?? '',\n    };\n  }\n\n  const defaultScreenComponents: Partial<Record<AppScreens, ComponentType>> = {\n    // Main is omitted from StytchB2BProduct since it's used by everything\n    [AppScreens.Main]: MainScreen,\n    [AppScreens.LoggedIn]: ConfirmationScreen,\n\n    // Discovery can be opted into dynamically via stytch_redirect_type ResetPassword flow\n    // so it cannot be statically shaken away\n    [AppScreens.Discovery]: Discovery,\n    [AppScreens.Error]: ErrorScreen,\n\n    // MFA products are dynamically configured depending on organization and user choice,\n    // and opted into by default\n    [AppScreens.MFAEnrollmentSelection]: MFAEnrollmentSelectionScreen,\n    [AppScreens.SMSOTPEnrollment]: SMSOTPEnrollScreen,\n    [AppScreens.SMSOTPEntry]: SMSOTPEntryScreen,\n    [AppScreens.RecoveryCodeEntry]: RecoveryCodeEntryScreen,\n    [AppScreens.RecoveryCodeSave]: RecoveryCodeSaveScreen,\n    [AppScreens.TOTPEnrollmentQRCode]: TOTPEnrollQRScreen,\n    [AppScreens.TOTPEnrollmentManual]: TOTPEnrollManualScreen,\n    [AppScreens.TOTPEntry]: TOTPEntryScreen,\n  };\n\n  const ScreenComponent = defaultScreenComponents[currentScreen] ?? screenComponentMap[currentScreen];\n\n  return (\n    <MainContainer theme={theme} displayWatermark={displayWatermark}>\n      <Logo appLogo={options.logo} orgLogo={orgLogo} />\n      <ScreenComponent />\n    </MainContainer>\n  );\n};\n\nexport default AppContainer;\n"],"names":["authTokenConfig","discovery","mutationKey","onSuccess","onDiscoveryAuthenticateSuccess","defaultError","ErrorType","EmailMagicLink","discovery_oauth","oauth","onAuthenticateSuccess","sso","multi_tenant_magic_links","multi_tenant_impersonation","errorTypeMap","ad_blocker_detected","AdBlockerDetected","AppContainer","state","dispatch","useGlobalReducer","stytchClient","useStytch","triggerError","useErrorCallback","triggerEvent","useEventCallback","config","useConfig","displayWatermark","theme","options","usePresentation","isOnlyFloatingOneTap","useIsOnlyFloatingOneTap","currentScreen","screen","screenComponentMap","useProductComponents","handleStytchAPIError","error","defaultErrorType","Default","error_type","extractErrorType","errorType","type","canGoBack","isTokenAuthLoading","setIsTokenAuthLoading","useState","mutate","useSWRConfig","slug","resultPending","useExtractSlug","useEffect","flowState","AuthFlowType","PasswordReset","parsed","parseAuthenticateUrl","handled","tokenType","authenticateByUrl","session_duration_minutes","sessionOptions","sessionDurationMinutes","then","result","data","event","getStytchEventByKey","finally","organization","AppScreens","Main","Organization","React","B2BGoogleOneTap","MainContainer","LoggingInScreen","orgLogo","organization_logo_url","organization_name","url","alt","defaultScreenComponents","MainScreen","LoggedIn","ConfirmationScreen","Discovery","Error","ErrorScreen","MFAEnrollmentSelection","MFAEnrollmentSelectionScreen","SMSOTPEnrollment","SMSOTPEnrollScreen","SMSOTPEntry","SMSOTPEntryScreen","RecoveryCodeEntry","RecoveryCodeEntryScreen","RecoveryCodeSave","RecoveryCodeSaveScreen","TOTPEnrollmentQRCode","TOTPEnrollQRScreen","TOTPEnrollmentManual","TOTPEnrollManualScreen","TOTPEntry","TOTPEntryScreen","ScreenComponent","Logo","appLogo","logo"],"mappings":"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"}