{"version":3,"file":"B2BOneTap.mjs","sources":["../../../../../../../../../web/src/ui/b2b/components/B2BOneTap.tsx"],"sourcesContent":["import { DEV, logger } from '@stytch/core';\nimport { B2BOAuthProviders, OneTapPositions } from '@stytch/core/public';\nimport type { CredentialResponse } from 'google-one-tap';\nimport React, { useCallback, useEffect, useState } from 'react';\n\nimport { GoogleOneTapClient } from '../../../oneTap/GoogleOneTapClient';\nimport { readB2BInternals } from '../../../utils/internal';\nimport LastUsed from '../../components/molecules/LastUsed';\nimport { ErrorMessages, OneTapErrors } from '../../components/organisms/OneTapError';\nimport { useIsMounted } from '../../hooks/useIsMounted';\nimport { useConfig, useGlobalReducer, useStytch } from '../GlobalContextProvider';\nimport { useIsOnlyFloatingOneTap } from '../hooks/useIsOnlyFloatingOneTap';\nimport { useLastUsedAuthMethod } from '../hooks/useLastUsedAuthMethod';\nimport { AppScreens } from '../types/AppScreens';\nimport { OAuthB2BButton } from './OAuthB2BButton';\n\nexport type B2BOneTapProps = {\n  customScopes?: string[];\n  providerParams?: Record<string, string>;\n  cancelOnTapOutside?: boolean;\n};\n\nexport const B2BGoogleOneTap = ({ customScopes, providerParams, cancelOnTapOutside }: B2BOneTapProps) => {\n  const stytch = useStytch();\n  const config = useConfig();\n  const isOnlyFloatingOneTap = useIsOnlyFloatingOneTap();\n  const [oneTapError, setOneTapError] = useState<OneTapErrors>();\n  const isMounted = useIsMounted();\n  const [state, dispatch] = useGlobalReducer();\n\n  const [lastUsedMethod, setLastUsedMethod] = useLastUsedAuthMethod();\n\n  /*\n   * Begin One Tap Loading / Initialization Logic\n   */\n  //\n  const attemptToLoadOneTap = useCallback(async () => {\n    const { oneTap } = readB2BInternals(stytch);\n    const clientResult = await oneTap.createOneTapClient();\n    if (!clientResult.success) {\n      if (clientResult.reason === 'oauth_config_not_found') {\n        setOneTapError(OneTapErrors.NoConfiguredOAuthClient);\n      } else if (clientResult.reason === 'default_provider_not_allowed') {\n        setOneTapError(OneTapErrors.DefaultProviderNotAllowed);\n      } else {\n        logger.error('Unable to load One Tap settings for project', clientResult);\n      }\n      return;\n    }\n    const { client } = clientResult;\n\n    /**\n     * One tap is composed of two calls, an init() call and a prompt() call\n     * the init() call takes in a parent_id where one tap should be shown\n     * prompt() does the actual showing. if the element does not exist,\n     * we show One Tap in the upper right corner\n     * if the element does exist, One Tap's lifecycle is tied to the lifecycle of said element\n     * here, we call init() then prompt() in the useeffect. If the component unmounts before\n     * prompt() is called, One Tap falls back to the element-does-not-exist behavior.\n     * Fix: add a check for whether the component is still rendered immediately before we\n     * call prompt, preventing this race condition\n     */\n    if (!isMounted.current) {\n      return;\n    }\n\n    let oneTapCallback: (response: CredentialResponse) => void;\n    if (state.flowState.organization) {\n      oneTapCallback = oneTap.createOnSuccessHandler({\n        organizationId: state.flowState.organization.organization_id,\n        signupRedirectUrl: config.oauthOptions?.signupRedirectURL,\n        loginRedirectUrl: config.oauthOptions?.loginRedirectURL,\n        onSuccess: oneTap.redirectOnSuccess,\n        onError: () => dispatch({ type: 'transition', screen: AppScreens.Error }),\n      });\n    } else {\n      oneTapCallback = oneTap.createOnDiscoverySuccessHandler({\n        discoveryRedirectUrl: config.oauthOptions?.discoveryRedirectURL,\n        onSuccess: oneTap.redirectOnSuccess,\n        onError: () => dispatch({ type: 'transition', screen: AppScreens.Error }),\n      });\n    }\n    const renderResult = await client.render({\n      callback: oneTapCallback,\n      style: {\n        position: OneTapPositions.floating,\n      },\n      cancelOnTapOutside,\n    });\n\n    // Check if the component has become unmounted during the async OT render process\n    // Kill the rest of the logic if so\n    if (!isMounted.current) {\n      client.cancel();\n      return;\n    }\n\n    if (!renderResult.success) {\n      if (renderResult.reason === 'unregistered_origin') {\n        setOneTapError(OneTapErrors.OriginNotAllowedForClient);\n      }\n      if (renderResult.reason === 'invalid_client') {\n        setOneTapError(OneTapErrors.InvalidOAuthClient);\n      }\n      logger.error('Unable to render One Tap prompt', renderResult);\n    }\n    return client;\n  }, [\n    stytch,\n    isMounted,\n    state.flowState.organization,\n    config.oauthOptions?.signupRedirectURL,\n    config.oauthOptions?.loginRedirectURL,\n    config.oauthOptions?.discoveryRedirectURL,\n    dispatch,\n    cancelOnTapOutside,\n  ]);\n\n  useEffect(() => {\n    let client: GoogleOneTapClient | undefined;\n    attemptToLoadOneTap()\n      .then(($client) => (client = $client))\n      .catch((err) => {\n        logger.error('Unable to render One Tap prompt', err);\n      });\n    return () => client?.cancel();\n  }, [attemptToLoadOneTap]);\n  /*\n   * End One Tap Loading / Initialization Logic\n   */\n\n  if (isOnlyFloatingOneTap) {\n    return null;\n  }\n\n  const fallbackButton = (\n    <OAuthB2BButton\n      providerType={B2BOAuthProviders.Google}\n      loginRedirectUrl={config.oauthOptions?.loginRedirectURL}\n      signupRedirectUrl={config.oauthOptions?.signupRedirectURL}\n      discoveryRedirectUrl={config.oauthOptions?.discoveryRedirectURL}\n      customScopes={customScopes}\n      providerParams={providerParams}\n      onSuccess={() => setLastUsedMethod(B2BOAuthProviders.Google)}\n    />\n  );\n\n  const fallbackWithLastUsed =\n    lastUsedMethod === B2BOAuthProviders.Google ? <LastUsed>{fallbackButton}</LastUsed> : fallbackButton;\n\n  if (oneTapError) {\n    return (\n      <>\n        {DEV(<ErrorMessages error={oneTapError} />)}\n        {fallbackWithLastUsed}\n      </>\n    );\n  }\n\n  return fallbackWithLastUsed;\n};\n"],"names":["B2BGoogleOneTap","customScopes","providerParams","cancelOnTapOutside","stytch","useStytch","config","useConfig","isOnlyFloatingOneTap","useIsOnlyFloatingOneTap","oneTapError","setOneTapError","useState","isMounted","useIsMounted","state","dispatch","useGlobalReducer","lastUsedMethod","setLastUsedMethod","useLastUsedAuthMethod","attemptToLoadOneTap","useCallback","oneTap","readB2BInternals","clientResult","createOneTapClient","success","reason","OneTapErrors","NoConfiguredOAuthClient","DefaultProviderNotAllowed","logger","error","client","current","oneTapCallback","flowState","organization","createOnSuccessHandler","organizationId","organization_id","signupRedirectUrl","oauthOptions","signupRedirectURL","loginRedirectUrl","loginRedirectURL","onSuccess","redirectOnSuccess","onError","type","screen","AppScreens","Error","createOnDiscoverySuccessHandler","discoveryRedirectUrl","discoveryRedirectURL","renderResult","render","callback","style","position","OneTapPositions","floating","cancel","OriginNotAllowedForClient","InvalidOAuthClient","useEffect","then","$client","catch","err","fallbackButton","React","OAuthB2BButton","providerType","B2BOAuthProviders","Google","fallbackWithLastUsed","LastUsed","DEV","ErrorMessages"],"mappings":"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"}