{"version":3,"file":"GoogleOneTap.mjs","sources":["../../../../../../../../../web/src/ui/b2c/components/GoogleOneTap.tsx"],"sourcesContent":["import { DEV, logger, StringLiteralFromEnum } from '@stytch/core';\nimport { OAuthProviders, OneTapPositions } from '@stytch/core/public';\nimport classNames from 'classnames';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { GoogleOneTapClient } from '../../../oneTap/GoogleOneTapClient';\nimport { OneTapProvider } from '../../../oneTap/OneTapProvider';\nimport { getRenderedOneTapMode } from '../../../oneTap/positionModes';\nimport { readB2CInternals } from '../../../utils/internal';\nimport { CircularProgress } from '../../components/atoms/CircularProgress';\nimport LastUsed from '../../components/molecules/LastUsed';\nimport { ErrorMessages, OneTapErrors } from '../../components/organisms/OneTapError';\nimport { usePresentation } from '../../components/PresentationConfig';\nimport { useIsMounted } from '../../hooks/useIsMounted';\nimport { useIsOnlyFloatingOneTap } from '../../hooks/useIsOnlyFloatingOneTap';\nimport { useConfig, useStytch } from '../GlobalContextProvider';\nimport { useLastUsedOAuth } from '../screens/Main/useLastUsedOAuth';\nimport styles from './GoogleOneTap.module.css';\nimport { OAuthButton } from './OAuthButton';\n\ntype Props = {\n  position?: StringLiteralFromEnum<OneTapPositions>;\n  customScopes?: string[];\n  providerParams?: Record<string, string>;\n  cancelOnTapOutside?: boolean;\n};\n\nconst OAUTH_BUTTON_HEIGHT = 38;\n\n// See WebComponents.tsx - when using shadow DOM, the Google script cannot see the\n// mount point, so we render it outside and use slot to bring it back in\nconst OneTapMountNode = ({ enableShadowDOM }: { enableShadowDOM: boolean | undefined }) =>\n  enableShadowDOM ? (\n    <slot name=\"one-tap\"></slot>\n  ) : (\n    <div data-prompt_parent_id=\"g_id_onload\" id=\"google-parent-prompt\" />\n  );\n\nexport const GoogleOneTap = ({ position, customScopes, providerParams, cancelOnTapOutside }: Props) => {\n  const oneTapRenderMode = getRenderedOneTapMode(position);\n  const shouldRenderEmbeddedOneTap = oneTapRenderMode === 'embedded';\n  const shouldRenderOneTap = !!oneTapRenderMode;\n\n  const config = useConfig();\n  const stytch = useStytch();\n  const isOnlyFloatingOneTap = useIsOnlyFloatingOneTap(config);\n  const [pending, setPending] = useState(shouldRenderEmbeddedOneTap);\n  const [canDisplayOneTap, setCanDisplayOneTap] = useState(true);\n  const [height, setHeight] = useState(OAUTH_BUTTON_HEIGHT);\n  const [oneTapError, setOneTapError] = useState<OneTapErrors>();\n  const resizeCount = useRef(0);\n  const timeout = useRef<number>();\n  const isMounted = useIsMounted();\n  const [lastUsedMethod, setLastUsedOAuth] = useLastUsedOAuth();\n  const { options } = usePresentation();\n\n  /*\n   * Begin One Tap Render Smoothing Logic\n   */\n  // Gets height of rendered one-tap UI, and sets the container height to that.\n  // Animation is added for a smoother transition,\n  const onResize = useCallback<ResizeObserverCallback>(([el]) => {\n    if (timeout.current != null) {\n      clearTimeout(timeout.current);\n    }\n    // On initial load, the one-tap ui rapidly changes heights 3 times. Checking\n    // the resizeCount lets us debounce the first 2 resizes, so they will get\n    // cancelled, but if they don't, it will resize after the short delay.\n    if (resizeCount.current > 1) {\n      // While setting the height, if the contentRect height is 0, it could also mean that the\n      // oauthOptions props are being changed, and in that scenario if we can continue to display\n      // one tap, we are setting the container height to the current height. If one tap cannot display\n      // one tap, we will set the container height to the height of the button component.\n      // Else we will set the height to the contentRect height.\n      setHeight((currentHeight) =>\n        el.contentRect.height === 0 ? (canDisplayOneTap ? currentHeight : OAUTH_BUTTON_HEIGHT) : el.contentRect.height,\n      );\n    } else {\n      timeout.current = window.setTimeout(\n        () =>\n          setHeight((currentHeight) =>\n            el.contentRect.height === 0\n              ? canDisplayOneTap\n                ? currentHeight\n                : OAUTH_BUTTON_HEIGHT\n              : el.contentRect.height,\n          ),\n        100,\n      );\n    }\n    resizeCount.current++;\n    // eslint-disable-next-line react-hooks/exhaustive-deps -- SDK-1354\n  }, []);\n\n  // If we are in embedded mode, initialize the resize observer and bind it to the React callback\n  useEffect(() => {\n    if (shouldRenderEmbeddedOneTap) {\n      const el = document.getElementById('google-parent-prompt');\n      if (el) {\n        const resizeObserver = new ResizeObserver(onResize);\n        resizeObserver.observe(el);\n        return () => resizeObserver.disconnect();\n      }\n    }\n  }, [onResize, shouldRenderEmbeddedOneTap]);\n  /*\n   * End One Tap Render Smoothing Logic\n   */\n\n  /*\n   * Begin One Tap Loading / Initialization Logic\n   */\n  //\n  const attemptToLoadOneTap = useCallback(async () => {\n    if (!shouldRenderOneTap) {\n      return;\n    }\n\n    const { oneTap } = readB2CInternals(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 === 'no_signup_redirect_urls_set') {\n        setOneTapError(OneTapErrors.NoConfiguredSignupRedirectUrls);\n      } else if (clientResult.reason === 'no_login_redirect_urls_set') {\n        setOneTapError(OneTapErrors.NoConfiguredLoginRedirectUrls);\n      } else {\n        logger.error('Unable to load One Tap settings for project', clientResult);\n      }\n      return;\n    }\n    const { client } = clientResult;\n\n    const onOneTapCancelled = (showError?: boolean) => {\n      setCanDisplayOneTap(false);\n      setHeight(OAUTH_BUTTON_HEIGHT);\n      if (showError) {\n        setOneTapError(OneTapErrors.OriginNotAllowedForClient);\n      }\n    };\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.\n     * If the element does not exist, 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    const renderResult = await client.render({\n      callback: oneTap.createOnSuccessHandler({\n        loginRedirectUrl: config.oauthOptions?.loginRedirectURL,\n        signupRedirectUrl: config.oauthOptions?.signupRedirectURL,\n        onSuccess: oneTap.redirectOnSuccess,\n      }),\n      onOneTapCancelled,\n      style: { position },\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    setCanDisplayOneTap(renderResult.success);\n    setPending(false);\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    shouldRenderOneTap,\n    stytch,\n    isMounted,\n    config.oauthOptions?.loginRedirectURL,\n    config.oauthOptions?.signupRedirectURL,\n    position,\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        setCanDisplayOneTap(false);\n        setPending(false);\n      });\n    return () => client?.cancel();\n  }, [attemptToLoadOneTap]);\n  /*\n   * End One Tap Loading / Initialization Logic\n   */\n\n  // Fallback Google auth button in case One Tap cannot be displayed\n  const fallbackButton = (\n    <OAuthButton\n      providerType={OAuthProviders.Google}\n      loginRedirectUrl={config.oauthOptions?.loginRedirectURL}\n      signupRedirectUrl={config.oauthOptions?.signupRedirectURL}\n      customScopes={customScopes}\n      providerParams={providerParams}\n      onSuccess={() => setLastUsedOAuth(OAuthProviders.Google)}\n    />\n  );\n\n  const fallbackWithLastUsed =\n    lastUsedMethod === OAuthProviders.Google ? <LastUsed>{fallbackButton}</LastUsed> : fallbackButton;\n\n  if (isOnlyFloatingOneTap) {\n    return <OneTapMountNode enableShadowDOM={options.enableShadowDOM} />;\n  }\n\n  if (oneTapError) {\n    return (\n      <>\n        {DEV(<ErrorMessages error={oneTapError} />)}\n        {fallbackWithLastUsed}\n      </>\n    );\n  }\n\n  if (shouldRenderEmbeddedOneTap && OneTapProvider.willGoogleOneTapShowEmbedded()) {\n    return (\n      <div className={classNames(styles.container, { [styles.pending]: pending })} style={{ height: height + 'px' }}>\n        {pending && <CircularProgress size={25} />}\n        {canDisplayOneTap ? <OneTapMountNode enableShadowDOM={options.enableShadowDOM} /> : fallbackButton}\n      </div>\n    );\n  }\n\n  return fallbackWithLastUsed;\n};\n"],"names":["OAUTH_BUTTON_HEIGHT","OneTapMountNode","enableShadowDOM","React","slot","name","div","data-prompt_parent_id","id","GoogleOneTap","position","customScopes","providerParams","cancelOnTapOutside","oneTapRenderMode","getRenderedOneTapMode","shouldRenderEmbeddedOneTap","shouldRenderOneTap","config","useConfig","stytch","useStytch","isOnlyFloatingOneTap","useIsOnlyFloatingOneTap","pending","setPending","useState","canDisplayOneTap","setCanDisplayOneTap","height","setHeight","oneTapError","setOneTapError","resizeCount","useRef","timeout","isMounted","useIsMounted","lastUsedMethod","setLastUsedOAuth","useLastUsedOAuth","options","usePresentation","onResize","useCallback","el","current","clearTimeout","currentHeight","contentRect","window","setTimeout","useEffect","document","getElementById","resizeObserver","ResizeObserver","observe","disconnect","attemptToLoadOneTap","oneTap","readB2CInternals","clientResult","createOneTapClient","success","reason","OneTapErrors","NoConfiguredOAuthClient","NoConfiguredSignupRedirectUrls","NoConfiguredLoginRedirectUrls","logger","error","client","onOneTapCancelled","showError","OriginNotAllowedForClient","renderResult","render","callback","createOnSuccessHandler","loginRedirectUrl","oauthOptions","loginRedirectURL","signupRedirectUrl","signupRedirectURL","onSuccess","redirectOnSuccess","style","cancel","InvalidOAuthClient","then","$client","catch","err","fallbackButton","OAuthButton","providerType","OAuthProviders","Google","fallbackWithLastUsed","LastUsed","DEV","ErrorMessages","OneTapProvider","willGoogleOneTapShowEmbedded","className","classNames","styles","container","CircularProgress","size"],"mappings":"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"}