{"version":3,"file":"SsoAndOAuthButtons.mjs","sources":["../../../../../../../../../web/src/ui/b2b/screens/SsoAndOAuthButtons.tsx"],"sourcesContent":["import { useLingui } from '@lingui/react/macro';\nimport { arrayUtils } from '@stytch/core';\nimport { AuthFlowType, B2BOAuthProviders } from '@stytch/core/public';\nimport React from 'react';\n\nimport { assertUnreachable } from '../../../utils/assertUnreachable';\nimport Button from '../../components/atoms/Button';\nimport ButtonColumn from '../../components/molecules/ButtonColumn';\nimport LastUsed from '../../components/molecules/LastUsed';\nimport { getButtonId, usePresentation } from '../../components/PresentationConfig';\nimport { useConfig, useGlobalReducer } from '../GlobalContextProvider';\nimport { OauthProviderParams, useEffectiveAuthConfig } from '../hooks/useEffectiveAuthConfig';\nimport { useLastUsedAuthMethod } from '../hooks/useLastUsedAuthMethod';\nimport { AppScreens, ButtonComponent, MainScreenComponent } from '../types/AppScreens';\nimport { AuthButton as AuthButtonType, getButtonKey, getSsoMethodKey } from '../types/authMethodKeys';\nimport { useProductComponents } from '../utils';\n\n// OAuth helper functions\nexport const getCustomScopesForProvider = (\n  oauthProvider: {\n    type: B2BOAuthProviders;\n    one_tap: boolean;\n    customScopes: string[];\n    providerParams: Record<string, string>;\n    cancel_on_tap_outside?: boolean;\n  },\n  oauthOptionsCustomScopes: string[] | undefined,\n) => {\n  let currentCustomScopes = oauthProvider.customScopes;\n  if (Object.keys(currentCustomScopes).length == 0) {\n    currentCustomScopes = oauthOptionsCustomScopes as string[];\n  }\n  return currentCustomScopes;\n};\n\nexport const getProviderParamsForProvider = (\n  oauthProvider: {\n    type: B2BOAuthProviders;\n    one_tap: boolean;\n    customScopes: string[];\n    providerParams: Record<string, string>;\n    cancel_on_tap_outside?: boolean;\n  },\n  oauthOptionsProviderParams: Record<string, string> | undefined,\n  email: string | undefined,\n) => {\n  let currentProviderParams = oauthProvider.providerParams;\n  if (Object.keys(currentProviderParams).length == 0) {\n    currentProviderParams = oauthOptionsProviderParams ?? {};\n  }\n\n  if (\n    email &&\n    (oauthProvider.type === B2BOAuthProviders.Google || oauthProvider.type === B2BOAuthProviders.Microsoft) &&\n    !('login_hint' in currentProviderParams)\n  ) {\n    currentProviderParams = {\n      ...currentProviderParams,\n      login_hint: email,\n    };\n  }\n\n  return currentProviderParams;\n};\n\nexport const SsoAndOAuthButtons = ({ buttons }: { buttons: ButtonComponent[] }) => {\n  const { t } = useLingui();\n  const [state, dispatch] = useGlobalReducer();\n  const { oauthProviderSettings = [] } = useEffectiveAuthConfig();\n  const presentation = usePresentation();\n\n  const [lastUsedMethod, setLastUsedMethod] = useLastUsedAuthMethod();\n\n  const config = useConfig();\n  const { loginRedirectURL, signupRedirectURL, discoveryRedirectURL, customScopes, providerParams } =\n    config.oauthOptions ?? {};\n\n  const { B2BGoogleOneTap, OAuthB2BButton, SSOButton } = useProductComponents(config, 'ssoAndOAuthButtons')!;\n\n  // Determine which buttons need to be displayed\n  const isDiscoveryFlow = state.flowState.type === AuthFlowType.Discovery;\n  const authButtons = buttons.flatMap<AuthButtonType>((button) => {\n    if (button === MainScreenComponent.OAuthButtons) {\n      return oauthProviderSettings.map((provider) => ({ type: 'oauth', provider }));\n    } else if (button === MainScreenComponent.SSOButtons) {\n      return isDiscoveryFlow\n        ? { type: 'sso-discovery' }\n        : (state.flowState.organization?.sso_active_connections?.map((connection) => ({ type: 'sso', connection })) ??\n            []);\n    } else {\n      assertUnreachable(button);\n    }\n  });\n\n  if (authButtons.length === 0) {\n    return null;\n  }\n\n  // Reorder providers based on last used\n  const [reorderedButtons, foundLastUsedOAuth] = arrayUtils.moveToFront(\n    authButtons,\n    (button) => getButtonKey(button) === lastUsedMethod,\n  );\n\n  // Helper function to create OAuth button component\n  const createOAuthButton = (oauthProvider: OauthProviderParams) => {\n    const providerProps = {\n      customScopes: getCustomScopesForProvider(oauthProvider, customScopes),\n      providerParams: getProviderParamsForProvider(oauthProvider, providerParams, state.primary.email),\n    };\n\n    if (oauthProvider.one_tap) {\n      return (\n        <B2BGoogleOneTap\n          key={oauthProvider.type}\n          {...providerProps}\n          cancelOnTapOutside={oauthProvider.cancel_on_tap_outside}\n        />\n      );\n    }\n\n    return (\n      <OAuthB2BButton\n        key={oauthProvider.type}\n        providerType={oauthProvider.type}\n        loginRedirectUrl={loginRedirectURL}\n        signupRedirectUrl={signupRedirectURL}\n        discoveryRedirectUrl={discoveryRedirectURL}\n        onSuccess={() => setLastUsedMethod(oauthProvider.type)}\n        {...providerProps}\n      />\n    );\n  };\n\n  return (\n    <ButtonColumn>\n      {reorderedButtons.map((button, index) => {\n        const buttonComponent = (() => {\n          switch (button.type) {\n            case 'oauth':\n              return createOAuthButton(button.provider);\n\n            case 'sso':\n              return (\n                <SSOButton\n                  key={button.connection.display_name}\n                  connection={button.connection}\n                  onStart={() => setLastUsedMethod(getSsoMethodKey(button.connection))}\n                />\n              );\n\n            case 'sso-discovery':\n              return (\n                <Button\n                  key=\"sso-discovery\"\n                  variant=\"outline\"\n                  id={getButtonId('sso-discovery', presentation.options)}\n                  onClick={() => {\n                    dispatch({ type: 'transition', screen: AppScreens.SSODiscoveryEmail, history: 'push' });\n                  }}\n                >\n                  {t({ id: 'provider.continueWithSSO', message: 'Use single sign-on' })}\n                </Button>\n              );\n\n            default:\n              assertUnreachable(button);\n          }\n        })();\n\n        return foundLastUsedOAuth && index === 0 ? (\n          <LastUsed key={getButtonKey(button)}>{buttonComponent}</LastUsed>\n        ) : (\n          buttonComponent\n        );\n      })}\n    </ButtonColumn>\n  );\n};\n"],"names":["getCustomScopesForProvider","oauthProvider","oauthOptionsCustomScopes","currentCustomScopes","customScopes","Object","keys","length","getProviderParamsForProvider","oauthOptionsProviderParams","email","currentProviderParams","providerParams","type","B2BOAuthProviders","Google","Microsoft","login_hint","SsoAndOAuthButtons","buttons","useLingui","state","dispatch","useGlobalReducer","oauthProviderSettings","useEffectiveAuthConfig","presentation","usePresentation","lastUsedMethod","setLastUsedMethod","useLastUsedAuthMethod","config","useConfig","loginRedirectURL","signupRedirectURL","discoveryRedirectURL","oauthOptions","B2BGoogleOneTap","OAuthB2BButton","SSOButton","useProductComponents","isDiscoveryFlow","flowState","AuthFlowType","Discovery","authButtons","flatMap","button","MainScreenComponent","OAuthButtons","map","provider","SSOButtons","organization","sso_active_connections","connection","assertUnreachable","reorderedButtons","foundLastUsedOAuth","arrayUtils","moveToFront","getButtonKey","createOAuthButton","providerProps","primary","one_tap","React","key","cancelOnTapOutside","cancel_on_tap_outside","providerType","loginRedirectUrl","signupRedirectUrl","discoveryRedirectUrl","onSuccess","ButtonColumn","index","buttonComponent","display_name","onStart","getSsoMethodKey","Button","variant","id","getButtonId","options","onClick","screen","AppScreens","SSODiscoveryEmail","history","LastUsed"],"mappings":"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"}