{"version":3,"file":"useEffectiveAuthConfig.mjs","sources":["../../../../../../../../../web/src/ui/b2b/hooks/useEffectiveAuthConfig.ts"],"sourcesContent":["import { B2BOAuthProviderConfig, B2BOAuthProviders } from '@stytch/core/public';\nimport { useMemo } from 'react';\n\nimport { isTruthy } from '../../../utils/isTruthy';\nimport { getParamsFromB2BOAuthProviderConfig } from '../../../utils/oauthProviderType';\nimport { useConfig, useGlobalReducer } from '../GlobalContextProvider';\nimport { ProductId, StytchB2BProduct } from '../StytchB2BProduct';\n\nexport type OauthProviderParams = {\n  type: B2BOAuthProviders;\n  one_tap: boolean;\n  customScopes: string[];\n  providerParams: Record<string, string>;\n  cancel_on_tap_outside: boolean | undefined;\n};\n\n// Note that the order of products here is used when displaying fallback auth\n// methods below\nconst productsToAuthMethods: Record<ProductId, string | undefined> = {\n  oauth: undefined, // OAuth methods are defined per-provider\n  sso: 'sso',\n  emailMagicLinks: 'magic_link',\n  emailOtp: 'email_otp',\n  passwords: 'password',\n};\n\nconst oauthProvidersToAuthMethods: Record<B2BOAuthProviders, string> = {\n  [B2BOAuthProviders.Google]: 'google_oauth',\n  [B2BOAuthProviders.Microsoft]: 'microsoft_oauth',\n  [B2BOAuthProviders.HubSpot]: 'hubspot_oauth',\n  [B2BOAuthProviders.Slack]: 'slack_oauth',\n  [B2BOAuthProviders.GitHub]: 'github_oauth',\n};\n\nconst authMethodsToProducts: Record<string, ProductId> = Object.fromEntries(\n  Object.entries(productsToAuthMethods).map(([product, authMethod]) => [authMethod, product]),\n);\n\nconst oauthMethodsToOauthProviders: Record<string, B2BOAuthProviders> = Object.fromEntries(\n  Object.entries(oauthProvidersToAuthMethods).map(([provider, method]) => [\n    method,\n    provider as keyof typeof oauthProvidersToAuthMethods,\n  ]),\n);\n\nconst authMethodToProduct = (authMethod: string): ProductId | undefined => {\n  if (authMethod in oauthMethodsToOauthProviders) {\n    return 'oauth';\n  }\n  return authMethodsToProducts[authMethod];\n};\n\nconst allOauthProviders = Object.values(B2BOAuthProviders);\n\nconst flattenConfigToAuthMethods = (products: StytchB2BProduct[], oauthProviders: B2BOAuthProviderConfig[]) =>\n  products\n    .flatMap((product) => {\n      if (product.id === 'oauth') {\n        return oauthProviders.map((provider) => {\n          const authMethod = oauthProvidersToAuthMethods[typeof provider === 'string' ? provider : provider.type];\n          if (authMethod) {\n            return authMethod;\n          }\n        });\n      } else {\n        const authMethod = productsToAuthMethods[product.id];\n        if (authMethod) {\n          return authMethod;\n        }\n      }\n    })\n    .filter(isTruthy);\n\nconst useOAuthProviderConfigs = () => {\n  const config = useConfig();\n  return useMemo(() => {\n    if (!config.oauthOptions?.providers) {\n      return [];\n    }\n\n    return config.oauthOptions.providers.map(getParamsFromB2BOAuthProviderConfig);\n  }, [config.oauthOptions?.providers]);\n};\n\nconst useRestrictedAuthMethods = () => {\n  const [state] = useGlobalReducer();\n\n  const { primaryAuthMethods } = state.primary;\n  const hasPrimaryAuthMethods = !!primaryAuthMethods;\n\n  const restrictedAuthMethods = useMemo(() => {\n    if (state.primary.primaryAuthMethods) {\n      return new Set(state.primary.primaryAuthMethods);\n    }\n\n    if (state.flowState.organization?.auth_methods === 'RESTRICTED') {\n      return new Set(state.flowState.organization?.allowed_auth_methods ?? []);\n    }\n  }, [\n    state.flowState.organization?.allowed_auth_methods,\n    state.flowState.organization?.auth_methods,\n    state.primary.primaryAuthMethods,\n  ]);\n\n  return { restrictedAuthMethods, hasPrimaryAuthMethods };\n};\n\nexport const useEffectiveAuthConfig = () => {\n  const [state] = useGlobalReducer();\n  const config = useConfig();\n\n  const { restrictedAuthMethods, hasPrimaryAuthMethods } = useRestrictedAuthMethods();\n\n  const oauthProviderConfigs = useOAuthProviderConfigs();\n\n  const flattenedConfiguredAuthMethods = useMemo(\n    () => flattenConfigToAuthMethods(config.products, oauthProviderConfigs),\n    [config.products, oauthProviderConfigs],\n  );\n\n  const authMethodsToShow = useMemo(() => {\n    // If there are no restrictions, use the auth methods from the UI config as-is\n    if (!restrictedAuthMethods) {\n      return flattenedConfiguredAuthMethods;\n    }\n\n    // If there are restrictions, filter the auth methods from the UI config\n    const restrictedAuthMethodsInUiConfig = flattenedConfiguredAuthMethods.filter((authMethod) =>\n      restrictedAuthMethods.has(authMethod),\n    );\n\n    // Use the filtered methods unless there are none _and_ the restrictions\n    // come from `primary_required` (not just org-level restrictions)\n    if (restrictedAuthMethodsInUiConfig.length > 0 || !hasPrimaryAuthMethods) {\n      return restrictedAuthMethodsInUiConfig;\n    }\n\n    // If the org restricts allowed auth methods, show all of the methods\n    // included in `primary_required`\n    if (state.flowState.organization?.auth_methods === 'RESTRICTED') {\n      return flattenConfigToAuthMethods(config.organizationProducts, allOauthProviders).filter((authMethod) =>\n        restrictedAuthMethods.has(authMethod),\n      );\n    }\n\n    // If the org doesn't have any auth method restrictions, default to email\n    // magic links\n    return ['magic_link'];\n  }, [\n    config.organizationProducts,\n    flattenedConfiguredAuthMethods,\n    hasPrimaryAuthMethods,\n    restrictedAuthMethods,\n    state.flowState.organization?.auth_methods,\n  ]);\n\n  const products = useMemo(() => {\n    const productIds = [...new Set(authMethodsToShow.map(authMethodToProduct).filter(isTruthy))];\n    return productIds.map((productId) => config.organizationProducts.find((p) => p.id === productId)).filter(isTruthy);\n  }, [authMethodsToShow, config.organizationProducts]);\n\n  const oauthProviderSettings = useMemo<OauthProviderParams[]>(\n    () =>\n      authMethodsToShow\n        .map((authMethod) => {\n          const provider = oauthMethodsToOauthProviders[authMethod];\n          if (provider) {\n            return (\n              oauthProviderConfigs.find((oauthProvider) => oauthProvider.type === provider) ??\n              getParamsFromB2BOAuthProviderConfig(provider)\n            );\n          }\n        })\n        .filter(isTruthy),\n    [authMethodsToShow, oauthProviderConfigs],\n  );\n\n  return { products, oauthProviderSettings };\n};\n"],"names":["productsToAuthMethods","oauth","undefined","sso","emailMagicLinks","emailOtp","passwords","oauthProvidersToAuthMethods","B2BOAuthProviders","Google","Microsoft","HubSpot","Slack","GitHub","authMethodsToProducts","Object","fromEntries","entries","map","product","authMethod","oauthMethodsToOauthProviders","provider","method","authMethodToProduct","allOauthProviders","values","flattenConfigToAuthMethods","products","oauthProviders","flatMap","id","type","filter","isTruthy","useOAuthProviderConfigs","config","useConfig","useMemo","oauthOptions","providers","getParamsFromB2BOAuthProviderConfig","useRestrictedAuthMethods","state","useGlobalReducer","primaryAuthMethods","primary","hasPrimaryAuthMethods","restrictedAuthMethods","Set","flowState","organization","auth_methods","allowed_auth_methods","useEffectiveAuthConfig","oauthProviderConfigs","flattenedConfiguredAuthMethods","authMethodsToShow","restrictedAuthMethodsInUiConfig","has","length","organizationProducts","productIds","productId","find","p","oauthProviderSettings","oauthProvider"],"mappings":"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"}