import { FailedSignInResponse } from '@/proxy/auth/models' import ActionLink from '@/components/shared/ActionLink' import Captcha from '@/components/shared/Captcha' import PasswordInput from '@/components/shared/PasswordInput' import Alert from '@/components/ui/Alert' import Button from '@/components/ui/Button' import Checkbox from '@/components/ui/Checkbox' import { FormContainer, FormItem } from '@/components/ui/Form' import Input from '@/components/ui/Input' import PlatformLoginResultType from '@/constants/login.result.enum' import { ROUTES_ENUM } from '@/routes/route.constant' import { getTenantByNameDetail } from '@/services/tenant.service' import { useStoreActions, useStoreState } from '@/store' import useAuth from '@/utils/hooks/useAuth' import { useLocalization } from '@/utils/hooks/useLocalization' import useTimeOutMessage from '@/utils/hooks/useTimeOutMessage' import { TurnstileInstance } from '@marsidev/react-turnstile' import { Field, Form, Formik } from 'formik' import { motion } from 'framer-motion' import { useEffect, useRef, useState } from 'react' import { useNavigate } from 'react-router-dom' import * as Yup from 'yup' import { defaultDomain, getSubdomain } from '@/utils/subdomain' import { Helmet } from 'react-helmet' import { APP_NAME } from '@/constants/app.constant' type SignInFormSchema = { userName: string password: string rememberMe: boolean twoFactorCode: string captchaResponse: string } const validationSchema = Yup.object().shape({ userName: Yup.string().required('Please enter your user name'), password: Yup.string().required('Please enter your password'), rememberMe: Yup.bool(), twoFactor: Yup.boolean(), twoFactorCode: Yup.string().when('twoFactor', { is: true, then: (schema) => schema.required('Mail adresinize gönderilen doğrulama kodunu giriniz'), otherwise: (schema) => schema.notRequired(), }), }) const Login = () => { const navigate = useNavigate() const isMultiTenant = useStoreState((a) => a.abpConfig.config?.multiTenancy.isEnabled) const { setTenant } = useStoreActions((a) => a.auth.tenant) const UiVersion = useStoreState((state) => state.locale.currentUiVersion) const { setUiVersion } = useStoreActions((a) => a.locale) const tenantName = useStoreState((state) => state.locale.currentTenantName) const { setTenantName } = useStoreActions((actions) => actions.locale) const [message, setMessage] = useState('') const [error, setError] = useTimeOutMessage(300000) const [twoFactor, setTwoFactor] = useState(false) const [showCaptcha, setShowCaptcha] = useState(false) const captchaRef = useRef(null) const { setWarning } = useStoreActions((actions) => actions.base.messages) const setWarningTimeout = (message: string) => { setTimeout(() => { setWarning(message) }, 100) } const { signIn } = useAuth() const { translate } = useLocalization() const onSignIn = async ( values: SignInFormSchema, { setSubmitting, isSubmitting, setFieldValue, setFieldTouched }: any, ) => { if (isSubmitting) { return } setSubmitting(true) const { userName, password, twoFactorCode, captchaResponse } = values const result = await signIn({ userName, password, twoFactorCode, captchaResponse, }) if (result.status === 'error') { setError(result.message) } else { setError('') } if (result.status === 'failed') { const data = result.data as FailedSignInResponse setError(data.description) if (data.pResult === PlatformLoginResultType.NotAllowed) { setWarningTimeout(data.description) navigate(ROUTES_ENUM.authenticated.sendConfirmationCode) } else { setWarning('') } if ( data.pResult === PlatformLoginResultType.RequiresTwoFactor || data.pResult === PlatformLoginResultType.WrongTwoFactorCode ) { if (data.pResult === PlatformLoginResultType.RequiresTwoFactor) { setError(undefined) setMessage('Mail adresinize gönderilen doğrulama kodunu giriniz') } else { setMessage('') } setTwoFactor(true) setFieldValue('twoFactor', true) setFieldTouched('twoFactorCode', false) } else { setMessage('') setTwoFactor(false) setFieldValue('twoFactor', false) } setShowCaptcha(data.pResult === PlatformLoginResultType.ShowCaptcha) if (data.pResult === PlatformLoginResultType.ShowCaptcha) { captchaRef.current?.reset() } if ( data.pResult === PlatformLoginResultType.ShouldChangePasswordOnNextLogin || data.pResult === PlatformLoginResultType.ShouldChangePasswordPeriodic ) { setWarningTimeout(data.description) navigate(ROUTES_ENUM.authenticated.forgotPassword) } else { setWarning('') } if (data.pResult === PlatformLoginResultType.LoginEndDateDue) { setWarningTimeout(data.description) navigate(ROUTES_ENUM.authenticated.sendExtendLogin) } else { setWarning('') } } else { // Temizlik setTwoFactor(false) setFieldValue('twoFactorCode', '') setFieldValue('twoFactor', false) setShowCaptcha(false) setError('') setMessage('') //Tenant belirlenmişse fetchDataByName(tenantName || '') // Versiyon kontrolü findUiVersion() } setSubmitting(false) } const fetchDataByName = async (name: string) => { if (name) { const response = await getTenantByNameDetail(name) if (response.data) { setTenant({ tenantId: response.data.id, tenantName: response.data.name, menuGroup: response.data.menuGroup }); } else { setTenant(undefined) } } else { setTenant(undefined) } } const subDomainName = getSubdomain() useEffect(() => { if (subDomainName) { setTenantName(subDomainName) fetchDataByName(subDomainName) } }, [subDomainName]) const tenantStyle: React.CSSProperties | undefined = subDomainName && subDomainName !== defaultDomain ? { opacity: 0, position: 'absolute', pointerEvents: 'none', height: 0, margin: 0, padding: 0, border: 'none', } : undefined const findUiVersion = async () => { try { const res = await fetch(`/version.json?ts=${Date.now()}`) const latest = (await res.json())?.releases?.[0]?.version if (latest && UiVersion !== latest) { setUiVersion(latest) navigate(ROUTES_ENUM.protected.admin.changeLog) } } catch (e) { console.warn('Versiyon okunamadı', e) } } return ( <>

{translate('::Abp.Account.WelcomeBack')}

{translate('::Abp.Account.WelcomeBack.Message')}

{isMultiTenant && ( <>
setTenantName(e.target.value)} style={tenantStyle} aria-hidden={subDomainName && subDomainName !== defaultDomain ? 'true' : 'false'} />
)}
{({ touched, errors, isSubmitting, setFieldValue }) => (
{!twoFactor && ( )} {!twoFactor && ( )} {twoFactor && ( )}
{translate('::Abp.Account.RememberMe')} {translate('::Abp.Account.ForgotPassword')}
{showCaptcha && ( setFieldValue('captchaResponse', '')} onExpire={() => setFieldValue('captchaResponse', '')} onSuccess={(token: string) => setFieldValue('captchaResponse', token)} /> )} {message && ( {message} )} {error && ( {error} )}
{translate('::Abp.Account.SignUp.Message')} {translate('::Abp.Account.Register')}
)}
) } export default Login