import { RiContractLine, RiDoorLockLine, RiErrorWarningFill } from '@remixicon/react' import * as React from 'react' import { useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { toast } from '@/app/components/base/ui/toast' import { IS_CE_EDITION } from '@/config' import { useGlobalPublicStore } from '@/context/global-public-context' import Link from '@/next/link' import { useRouter, useSearchParams } from '@/next/navigation' import { invitationCheck } from '@/service/common' import { useIsLogin } from '@/service/use-common' import { LicenseStatus } from '@/types/feature' import { cn } from '@/utils/classnames' import Loading from '../components/base/loading' import MailAndCodeAuth from './components/mail-and-code-auth' import MailAndPasswordAuth from './components/mail-and-password-auth' import SocialAuth from './components/social-auth' import SSOAuth from './components/sso-auth' import Split from './split' import { resolvePostLoginRedirect } from './utils/post-login-redirect' const NormalForm = () => { const { t } = useTranslation() const router = useRouter() const searchParams = useSearchParams() const { isLoading: isCheckLoading, data: loginData } = useIsLogin() const isLoggedIn = loginData?.logged_in const message = decodeURIComponent(searchParams.get('message') || '') const invite_token = decodeURIComponent(searchParams.get('invite_token') || '') const [isInitCheckLoading, setInitCheckLoading] = useState(true) const [isRedirecting, setIsRedirecting] = useState(false) const isLoading = isCheckLoading || isInitCheckLoading || isRedirecting const { systemFeatures } = useGlobalPublicStore() const [authType, updateAuthType] = useState<'code' | 'password'>('password') const [showORLine, setShowORLine] = useState(false) const [allMethodsAreDisabled, setAllMethodsAreDisabled] = useState(false) const [workspaceName, setWorkSpaceName] = useState('') const isInviteLink = Boolean(invite_token && invite_token !== 'null') const init = useCallback(async () => { try { if (isLoggedIn) { setIsRedirecting(true) const redirectUrl = resolvePostLoginRedirect() router.replace(redirectUrl || '/apps') return } if (message) { toast.add({ type: 'error', title: message, }) } setAllMethodsAreDisabled(!systemFeatures.enable_social_oauth_login && !systemFeatures.enable_email_code_login && !systemFeatures.enable_email_password_login && !systemFeatures.sso_enforced_for_signin) setShowORLine((systemFeatures.enable_social_oauth_login || systemFeatures.sso_enforced_for_signin) && (systemFeatures.enable_email_code_login || systemFeatures.enable_email_password_login)) updateAuthType(systemFeatures.enable_email_password_login ? 'password' : 'code') if (isInviteLink) { const checkRes = await invitationCheck({ url: '/activate/check', params: { token: invite_token, }, }) setWorkSpaceName(checkRes?.data?.workspace_name || '') } } catch (error) { console.error(error) setAllMethodsAreDisabled(true) } finally { setInitCheckLoading(false) } }, [isLoggedIn, message, router, invite_token, isInviteLink, systemFeatures]) useEffect(() => { init() }, [init]) if (isLoading) { return (
) } if (systemFeatures.license?.status === LicenseStatus.LOST) { return (

{t('licenseLost', { ns: 'login' })}

{t('licenseLostTip', { ns: 'login' })}

) } if (systemFeatures.license?.status === LicenseStatus.EXPIRED) { return (

{t('licenseExpired', { ns: 'login' })}

{t('licenseExpiredTip', { ns: 'login' })}

) } if (systemFeatures.license?.status === LicenseStatus.INACTIVE) { return (

{t('licenseInactive', { ns: 'login' })}

{t('licenseInactiveTip', { ns: 'login' })}

) } return ( <>
{isInviteLink ? (

{t('join', { ns: 'login' })} {workspaceName}

{!systemFeatures.branding.enabled && (

{t('joinTipStart', { ns: 'login' })} {workspaceName} {t('joinTipEnd', { ns: 'login' })}

)}
) : (

{systemFeatures.branding.enabled ? t('pageTitleForE', { ns: 'login' }) : t('pageTitle', { ns: 'login' })}

{t('welcome', { ns: 'login' })}

)}
{systemFeatures.enable_social_oauth_login && } {systemFeatures.sso_enforced_for_signin && (
)}
{showORLine && (
{t('or', { ns: 'login' })}
)} { (systemFeatures.enable_email_code_login || systemFeatures.enable_email_password_login) && ( <> {systemFeatures.enable_email_code_login && authType === 'code' && ( <> {systemFeatures.enable_email_password_login && (
{ updateAuthType('password') }}> {t('usePassword', { ns: 'login' })}
)} )} {systemFeatures.enable_email_password_login && authType === 'password' && ( <> {systemFeatures.enable_email_code_login && (
{ updateAuthType('code') }}> {t('useVerificationCode', { ns: 'login' })}
)} )} ) } {systemFeatures.is_allow_register && authType === 'password' && (
{t('signup.noAccount', { ns: 'login' })} {t('signup.signUp', { ns: 'login' })}
)} {allMethodsAreDisabled && ( <>

{t('noLoginMethod', { ns: 'login' })}

{t('noLoginMethodTip', { ns: 'login' })}

)} {!systemFeatures.branding.enabled && ( <>
{t('tosDesc', { ns: 'login' })}   {t('tos', { ns: 'login' })}  &  {t('pp', { ns: 'login' })}
{IS_CE_EDITION && (
{t('goToInit', { ns: 'login' })}   {t('setAdminAccount', { ns: 'login' })}
)} )}
) } export default NormalForm