{"version":3,"file":"IDPConsent.mjs","sources":["../../../../../../../../../web/src/ui/components/organisms/IDPConsent.tsx"],"sourcesContent":["import { useLingui } from '@lingui/react/macro';\nimport { BootstrapData, logger } from '@stytch/core';\nimport {\n  ConnectedAppPublic,\n  IDPOAuthFlowMissingParamError,\n  OAuthAuthorizeSubmitOptions,\n  ScopeResult,\n  StytchAPIError,\n  StytchEvent,\n  StytchEventType,\n  StytchSDKUIError,\n} from '@stytch/core/public';\nimport React, { PropsWithChildren, useCallback, useEffect, useMemo, useReducer } from 'react';\n\nimport {\n  containsCustomScopes,\n  createCustomScopeDescriptions,\n  fallbackConsentManifestGenerator,\n  OAuthAuthorizeParams,\n} from '../../../utils/idpHelpers';\nimport Button from '../atoms/Button';\nimport Column from '../atoms/Column';\nimport Logo from '../atoms/Logo';\nimport Typography from '../atoms/Typography';\nimport ButtonColumn from '../molecules/ButtonColumn';\nimport { Confirmation } from '../molecules/Confirmation';\nimport { ErrorDisplay } from '../molecules/ErrorScreen';\nimport { LoadingScreen } from '../molecules/Loading';\nimport { usePresentation } from '../PresentationConfig';\nimport { ConsentManifest, UngrantableScopes } from './IDPConsentManifest';\nimport { useConsentManifestGenerator } from './IDPContextProvider';\n\ntype Action =\n  | { type: 'START_SUBMIT' }\n  | { type: 'COMPLETE_SUBMIT' }\n  | { type: 'START_PREFLIGHT' }\n  | { type: 'PREFLIGHT_ERROR'; error: string }\n  | {\n      type: 'COMPLETE_PREFLIGHT';\n      consent_required: boolean;\n      client: ConnectedAppPublic;\n      grantable_scope: string;\n      ungrantable_scope: string;\n    }\n  | { type: 'CONSENT_DENIED' };\n\ntype IDPState = {\n  // True if there is a request in progress\n  loading: boolean;\n  // True if we have kicked off the preflight request\n  preflight: boolean;\n  error: string | null;\n  // True after we have submitted the form. This causes a browser redirect\n  // but there is a small period before the redirect loads where we can still\n  // show some limited UI\n  success: boolean;\n  // True if the user has denied consent\n  denied: boolean;\n  // Preflight results: Do we need to ask for consent? Who is asking?\n  consent_required: boolean;\n  client: ConnectedAppPublic | null;\n  grantable_scope: string;\n  ungrantable_scope: string;\n  // Used as a backup client name.\n  // The redirect URI's domain is parsed out to populate a missing client name\n  // in the IDPConsent component.\n  redirect_uri: string;\n};\n\nconst initialState = (error: string | null, params: OAuthAuthorizeParams): IDPState => ({\n  loading: !error,\n  preflight: !!error,\n  error: error,\n  success: false,\n  denied: false,\n  consent_required: false,\n  client: null,\n  grantable_scope: '',\n  ungrantable_scope: '',\n  redirect_uri: params.redirect_uri,\n});\n\nconst idpStateReducer = (state: IDPState, action: Action): IDPState => {\n  switch (action.type) {\n    case 'START_SUBMIT':\n      return { ...state, loading: true };\n    case 'COMPLETE_SUBMIT':\n      return { ...state, loading: false, success: true };\n    case 'START_PREFLIGHT':\n      return { ...state, preflight: true, loading: true };\n    case 'PREFLIGHT_ERROR':\n      return { ...state, preflight: true, loading: false, error: action.error };\n    case 'COMPLETE_PREFLIGHT':\n      return {\n        ...state,\n        loading: false,\n        client: action.client,\n        consent_required: action.consent_required,\n        grantable_scope: action.grantable_scope,\n        ungrantable_scope: action.ungrantable_scope,\n      };\n    case 'CONSENT_DENIED':\n      return { ...state, denied: true };\n    default:\n      return state;\n  }\n};\n\ninterface IDPConsentState {\n  state: IDPState;\n  submit({ consent_granted }: { consent_granted: boolean }): Promise<void>;\n}\n\nexport const useIDPState = ({\n  initialError,\n  initialParams,\n  oauthAuthorizeStart,\n  oauthAuthorizeSubmit,\n  onError,\n  onEvent,\n}: {\n  initialError: string | null;\n  initialParams: OAuthAuthorizeParams;\n  oauthAuthorizeStart(data: {\n    client_id: string;\n    redirect_uri: string;\n    response_type: string;\n    scopes: string[];\n    prompt?: string;\n  }): Promise<{ consent_required: boolean; client: ConnectedAppPublic; scope_results: ScopeResult[] }>;\n  oauthAuthorizeSubmit(\n    data: OAuthAuthorizeSubmitOptions,\n  ): Promise<{ redirect_uri: string; authorization_code?: string }>;\n  onError(error: StytchSDKUIError): void;\n  onEvent(event: StytchEvent): void;\n}): IDPConsentState => {\n  const [state, dispatch] = useReducer(idpStateReducer, initialState(initialError, initialParams));\n\n  useEffect(() => {\n    if (!initialError) return;\n    onError(new IDPOAuthFlowMissingParamError(initialError));\n  }, [initialError, onError]);\n\n  const submitInternal = useCallback(\n    async ({ consent_required, consent_granted }: { consent_required: boolean; consent_granted: boolean }) => {\n      dispatch({ type: 'START_SUBMIT' });\n      const submitResp = await oauthAuthorizeSubmit({\n        ...initialParams,\n        consent_granted,\n      });\n\n      if (submitResp.authorization_code) {\n        dispatch({ type: 'COMPLETE_SUBMIT' });\n      }\n\n      window.location.href = submitResp.redirect_uri;\n      if (consent_required && !consent_granted) {\n        dispatch({ type: 'CONSENT_DENIED' });\n        onEvent({\n          type: StytchEventType.OAuthAuthorizeFlowConsentDenied,\n          data: {},\n        });\n      } else {\n        onEvent({\n          type: StytchEventType.OAuthAuthorizeFlowComplete,\n          data: {},\n        });\n      }\n    },\n    [oauthAuthorizeSubmit, initialParams, onEvent],\n  );\n\n  const submit = useCallback(\n    ({ consent_granted }: { consent_granted: boolean }) =>\n      submitInternal({\n        consent_granted,\n        consent_required: true,\n      }),\n    [submitInternal],\n  );\n\n  const loadClient = useCallback(async () => {\n    dispatch({ type: 'START_PREFLIGHT' });\n    onEvent({\n      type: StytchEventType.OAuthAuthorizeFlowStart,\n      data: {\n        client_id: initialParams['client_id'],\n        redirect_uri: initialParams['redirect_uri'],\n        scope: initialParams['scopes'].join(' '),\n      },\n    });\n\n    let startResponse;\n    try {\n      startResponse = await oauthAuthorizeStart(initialParams);\n    } catch (e: unknown) {\n      const err = StytchAPIError.from(e);\n      const message = err.error_message;\n      dispatch({ type: 'PREFLIGHT_ERROR', error: message });\n      onError(err);\n      return;\n    }\n\n    if (startResponse.consent_required) {\n      const grantable = startResponse.scope_results\n        .filter((s) => s.is_grantable)\n        .map((s) => s.scope)\n        .join(' ');\n      const ungrantable = startResponse.scope_results\n        .filter((s) => !s.is_grantable)\n        .map((s) => s.scope)\n        .join(' ');\n      dispatch({\n        type: 'COMPLETE_PREFLIGHT',\n        consent_required: startResponse.consent_required,\n        client: startResponse.client,\n        grantable_scope: grantable,\n        ungrantable_scope: ungrantable,\n      });\n      return;\n    } else {\n      await submitInternal({ consent_required: false, consent_granted: false });\n    }\n  }, [onEvent, initialParams, oauthAuthorizeStart, onError, submitInternal]);\n\n  useEffect(() => {\n    if (state.preflight) {\n      return;\n    }\n    loadClient();\n  }, [loadClient, state.preflight]);\n  return { state, submit };\n};\n\ntype Props = IDPConsentState & {\n  bootstrap: BootstrapData;\n  bootstrapNotLoaded: boolean;\n};\nexport const IDPConsent: React.FC<Props> = ({ bootstrap, bootstrapNotLoaded, state, submit }) => {\n  const { t } = useLingui();\n  const { loading, error, denied, success, client } = state;\n  const customConsentManifestGenerator = useConsentManifestGenerator();\n\n  const clientName = useMemo(() => {\n    let name = state.client?.client_name ?? '';\n    // If a client name isn't provided then try and parse it from the\n    // redirect URI domain.\n    if (!name) {\n      try {\n        const u = new URL(state.redirect_uri);\n        name = u.hostname;\n      } catch (e) {\n        logger.warn('Unable to parse host from redirect URI.', e);\n        name = t({ id: 'idpConsent.defaultClientName', message: 'The App' });\n      }\n    }\n    return name;\n  }, [state.client?.client_name, state.redirect_uri, t]);\n\n  const manifest = useMemo(() => {\n    if (customConsentManifestGenerator) {\n      try {\n        return customConsentManifestGenerator({\n          scopes: state.grantable_scope.split(' '),\n          clientName,\n        });\n      } catch (e) {\n        logger.error('Error rendering custom consent screen. Falling back to default consent screen.', e);\n      }\n    }\n\n    return fallbackConsentManifestGenerator({\n      scopes: state.grantable_scope.split(' '),\n      rbacPolicy: bootstrap.rbacPolicy,\n      clientName,\n    });\n  }, [customConsentManifestGenerator, state.grantable_scope, clientName, bootstrap.rbacPolicy]);\n\n  const ungrantableScopeDescriptions = useMemo(() => {\n    if (state.ungrantable_scope === '') return [];\n    return createCustomScopeDescriptions(state.ungrantable_scope.split(' '), bootstrap.rbacPolicy);\n  }, [state.ungrantable_scope, bootstrap.rbacPolicy]);\n\n  if (loading || bootstrapNotLoaded) {\n    return <LoadingScreen />;\n  }\n  if (error) {\n    return <ErrorDisplay text={error} />;\n  }\n  if (denied) {\n    return <ErrorDisplay text={t({ id: 'idpConsent.denied', message: 'Access to the application was denied.' })} />;\n  }\n  if (success) {\n    return <Confirmation />;\n  }\n  return (\n    <Consent\n      client={client!}\n      submit={submit}\n      grantableScope={state.grantable_scope}\n      projectName={bootstrap.projectName!}\n    >\n      <UngrantableScopes ungrantableScopeDescriptions={ungrantableScopeDescriptions} clientName={clientName} />\n      <ConsentManifest manifest={manifest} clientName={clientName} />\n    </Consent>\n  );\n};\n\ntype ConsentProps = {\n  client: ConnectedAppPublic;\n  submit: (x: { consent_granted: boolean }) => Promise<void>;\n  grantableScope: string;\n  projectName: string;\n};\n\nconst Consent: React.FC<PropsWithChildren<ConsentProps>> = ({\n  client,\n  submit,\n  grantableScope,\n  projectName,\n  children,\n}) => {\n  const { t } = useLingui();\n  const { options } = usePresentation();\n  const clientName = client.client_name;\n  const title = containsCustomScopes(grantableScope)\n    ? t({\n        id: 'idpConsent.customScopes.title',\n        message: `${clientName} wants to access your ${projectName} account`,\n      })\n    : t({\n        id: 'idpConsent.signIn.title',\n        message: `Sign in to ${clientName} with ${projectName}`,\n      });\n\n  return (\n    <Column gap={6}>\n      {options.logo && <Logo appLogo={options.logo} />}\n      <Typography variant=\"header\" align=\"center\">\n        {title}\n      </Typography>\n\n      {children}\n\n      <ButtonColumn>\n        <Button variant=\"primary\" onClick={() => submit({ consent_granted: true })}>\n          {t({\n            id: 'idpConsent.button.allow',\n            message: 'Allow',\n          })}\n        </Button>\n        <Button onClick={() => submit({ consent_granted: false })} variant=\"ghost\">\n          {t({\n            id: 'idpConsent.button.deny',\n            message: 'Deny',\n          })}\n        </Button>\n      </ButtonColumn>\n    </Column>\n  );\n};\n"],"names":["initialState","error","params","loading","preflight","success","denied","consent_required","client","grantable_scope","ungrantable_scope","redirect_uri","idpStateReducer","state","action","type","useIDPState","initialError","initialParams","oauthAuthorizeStart","oauthAuthorizeSubmit","onError","onEvent","dispatch","useReducer","useEffect","IDPOAuthFlowMissingParamError","submitInternal","useCallback","consent_granted","submitResp","authorization_code","window","location","href","StytchEventType","OAuthAuthorizeFlowConsentDenied","data","OAuthAuthorizeFlowComplete","submit","loadClient","OAuthAuthorizeFlowStart","client_id","scope","join","startResponse","e","err","StytchAPIError","from","message","error_message","grantable","scope_results","filter","s","is_grantable","map","ungrantable","IDPConsent","bootstrap","bootstrapNotLoaded","useLingui","customConsentManifestGenerator","useConsentManifestGenerator","clientName","useMemo","name","client_name","u","URL","hostname","logger","warn","manifest","scopes","split","fallbackConsentManifestGenerator","rbacPolicy","ungrantableScopeDescriptions","createCustomScopeDescriptions","React","LoadingScreen","ErrorDisplay","text","Confirmation","Consent","grantableScope","projectName","UngrantableScopes","ConsentManifest","children","options","usePresentation","title","containsCustomScopes","Column","gap","logo","Logo","appLogo","Typography","variant","align","ButtonColumn","Button","onClick"],"mappings":"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"}