mirror of
https://github.com/infiniflow/ragflow.git
synced 2025-12-08 20:42:30 +08:00
### What problem does this PR solve? Feat: Add FilesTable #3221 ### Type of change - [x] New Feature (non-breaking change which adds functionality)
111 lines
3.2 KiB
TypeScript
111 lines
3.2 KiB
TypeScript
import { Button } from '@/components/ui/button';
|
||
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
|
||
import { Separator } from '@/components/ui/separator';
|
||
import { useTranslate } from '@/hooks/common-hooks';
|
||
import { DiscordLogoIcon, GitHubLogoIcon } from '@radix-ui/react-icons';
|
||
import { useSearchParams } from 'umi';
|
||
import { SignInForm, SignUpForm, VerifyEmailForm } from './form';
|
||
import { Step, useSwitchStep } from './hooks';
|
||
|
||
function LoginFooter() {
|
||
return (
|
||
<section className="pt-4">
|
||
<Separator />
|
||
<p className="text-center pt-4">or continue with</p>
|
||
<div className="flex gap-4 justify-center pt-[20px]">
|
||
<GitHubLogoIcon className="w-8 h-8"></GitHubLogoIcon>
|
||
<DiscordLogoIcon className="w-8 h-8"></DiscordLogoIcon>
|
||
</div>
|
||
</section>
|
||
);
|
||
}
|
||
|
||
export function SignUpCard() {
|
||
const { t } = useTranslate('login');
|
||
|
||
const { switchStep } = useSwitchStep(Step.SignIn);
|
||
|
||
return (
|
||
<Card className="w-[400px]">
|
||
<CardHeader>
|
||
<CardTitle>{t('signUp')}</CardTitle>
|
||
</CardHeader>
|
||
<CardContent>
|
||
<SignUpForm></SignUpForm>
|
||
<div className="text-center">
|
||
<Button variant={'link'} className="pt-6" onClick={switchStep}>
|
||
Already have an account? Log In
|
||
</Button>
|
||
</div>
|
||
<LoginFooter></LoginFooter>
|
||
</CardContent>
|
||
</Card>
|
||
);
|
||
}
|
||
|
||
export function SignInCard() {
|
||
const { t } = useTranslate('login');
|
||
const { switchStep } = useSwitchStep(Step.SignUp);
|
||
|
||
return (
|
||
<Card className="w-[400px]">
|
||
<CardHeader>
|
||
<CardTitle>{t('login')}</CardTitle>
|
||
</CardHeader>
|
||
<CardContent>
|
||
<SignInForm></SignInForm>
|
||
<Button
|
||
className="w-full mt-2"
|
||
onClick={switchStep}
|
||
variant={'secondary'}
|
||
>
|
||
{t('signUp')}
|
||
</Button>
|
||
</CardContent>
|
||
</Card>
|
||
);
|
||
}
|
||
|
||
export function VerifyEmailCard() {
|
||
// const { t } = useTranslate('login');
|
||
|
||
return (
|
||
<Card className="w-[400px]">
|
||
<CardHeader>
|
||
<CardTitle>Verify email</CardTitle>
|
||
</CardHeader>
|
||
<CardContent>
|
||
<section className="flex gap-y-6 flex-col">
|
||
<div className="flex items-center space-x-4">
|
||
<div className="flex-1 space-y-1">
|
||
<p className="text-sm font-medium leading-none">
|
||
We’ve sent a 6-digit code to
|
||
</p>
|
||
<p className="text-sm text-blue-500">yifanwu92@gmail.com.</p>
|
||
</div>
|
||
<Button>Resend</Button>
|
||
</div>
|
||
<VerifyEmailForm></VerifyEmailForm>
|
||
</section>
|
||
</CardContent>
|
||
</Card>
|
||
);
|
||
}
|
||
|
||
const Login = () => {
|
||
const [searchParams] = useSearchParams();
|
||
const step = Number((searchParams.get('step') ?? Step.SignIn) as Step);
|
||
|
||
return (
|
||
<div className="w-full h-full flex items-center pl-[15%] bg-[url('@/assets/svg/next-login-bg.svg')] bg-cover bg-center">
|
||
<div className="inline-block bg-colors-background-neutral-standard rounded-lg">
|
||
{step === Step.SignIn && <SignInCard></SignInCard>}
|
||
{step === Step.SignUp && <SignUpCard></SignUpCard>}
|
||
{step === Step.VerifyEmail && <VerifyEmailCard></VerifyEmailCard>}
|
||
</div>
|
||
</div>
|
||
);
|
||
};
|
||
|
||
export default Login;
|