| | import { useEffect, useState } from 'react'; |
| | import { ErrorTypes, registerPage } from 'librechat-data-provider'; |
| | import { OpenIDIcon, useToastContext } from '@librechat/client'; |
| | import { useOutletContext, useSearchParams } from 'react-router-dom'; |
| | import type { TLoginLayoutContext } from '~/common'; |
| | import { ErrorMessage } from '~/components/Auth/ErrorMessage'; |
| | import SocialButton from '~/components/Auth/SocialButton'; |
| | import { useAuthContext } from '~/hooks/AuthContext'; |
| | import { getLoginError } from '~/utils'; |
| | import { useLocalize } from '~/hooks'; |
| | import LoginForm from './LoginForm'; |
| |
|
| | function Login() { |
| | const localize = useLocalize(); |
| | const { showToast } = useToastContext(); |
| | const { error, setError, login } = useAuthContext(); |
| | const { startupConfig } = useOutletContext<TLoginLayoutContext>(); |
| |
|
| | const [searchParams, setSearchParams] = useSearchParams(); |
| | |
| | const disableAutoRedirect = searchParams.get('redirect') === 'false'; |
| |
|
| | |
| | const [isAutoRedirectDisabled, setIsAutoRedirectDisabled] = useState(disableAutoRedirect); |
| |
|
| | useEffect(() => { |
| | const oauthError = searchParams?.get('error'); |
| | if (oauthError && oauthError === ErrorTypes.AUTH_FAILED) { |
| | showToast({ |
| | message: localize('com_auth_error_oauth_failed'), |
| | status: 'error', |
| | }); |
| | const newParams = new URLSearchParams(searchParams); |
| | newParams.delete('error'); |
| | setSearchParams(newParams, { replace: true }); |
| | } |
| | }, [searchParams, setSearchParams, showToast, localize]); |
| |
|
| | |
| | useEffect(() => { |
| | if (disableAutoRedirect) { |
| | setIsAutoRedirectDisabled(true); |
| | const newParams = new URLSearchParams(searchParams); |
| | newParams.delete('redirect'); |
| | setSearchParams(newParams, { replace: true }); |
| | } |
| | }, [disableAutoRedirect, searchParams, setSearchParams]); |
| |
|
| | |
| | const shouldAutoRedirect = |
| | startupConfig?.openidLoginEnabled && |
| | startupConfig?.openidAutoRedirect && |
| | startupConfig?.serverDomain && |
| | !isAutoRedirectDisabled; |
| |
|
| | useEffect(() => { |
| | if (shouldAutoRedirect) { |
| | console.log('Auto-redirecting to OpenID provider...'); |
| | window.location.href = `${startupConfig.serverDomain}/oauth/openid`; |
| | } |
| | }, [shouldAutoRedirect, startupConfig]); |
| |
|
| | |
| | if (shouldAutoRedirect) { |
| | return ( |
| | <div className="flex min-h-screen flex-col items-center justify-center p-4"> |
| | <p className="text-lg font-semibold"> |
| | {localize('com_ui_redirecting_to_provider', { 0: startupConfig.openidLabel })} |
| | </p> |
| | <div className="mt-4"> |
| | <SocialButton |
| | key="openid" |
| | enabled={startupConfig.openidLoginEnabled} |
| | serverDomain={startupConfig.serverDomain} |
| | oauthPath="openid" |
| | Icon={() => |
| | startupConfig.openidImageUrl ? ( |
| | <img src={startupConfig.openidImageUrl} alt="OpenID Logo" className="h-5 w-5" /> |
| | ) : ( |
| | <OpenIDIcon /> |
| | ) |
| | } |
| | label={startupConfig.openidLabel} |
| | id="openid" |
| | /> |
| | </div> |
| | </div> |
| | ); |
| | } |
| |
|
| | return ( |
| | <> |
| | {error != null && <ErrorMessage>{localize(getLoginError(error))}</ErrorMessage>} |
| | {startupConfig?.emailLoginEnabled === true && ( |
| | <LoginForm |
| | onSubmit={login} |
| | startupConfig={startupConfig} |
| | error={error} |
| | setError={setError} |
| | /> |
| | )} |
| | {startupConfig?.registrationEnabled === true && ( |
| | <p className="my-4 text-center text-sm font-light text-gray-700 dark:text-white"> |
| | {' '} |
| | {localize('com_auth_no_account')}{' '} |
| | <a |
| | href={registerPage()} |
| | className="inline-flex p-1 text-sm font-medium text-green-600 transition-colors hover:text-green-700 dark:text-green-400 dark:hover:text-green-300" |
| | > |
| | {localize('com_auth_sign_up')} |
| | </a> |
| | </p> |
| | )} |
| | </> |
| | ); |
| | } |
| |
|
| | export default Login; |
| |
|