| 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; |
|
|