'use client'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Card, CardContent, CardHeader, CardTitle, CardDescription, } from '@/components/ui/card'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import * as z from 'zod'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from '@/components/ui/form'; import { useEffect, useState } from 'react'; import { httpClient } from '@/app/infra/http/HttpClient'; import { useRouter } from 'next/navigation'; import { Mail, Lock, Globe } from 'lucide-react'; import langbotIcon from '@/app/assets/langbot-logo.webp'; import { toast } from 'sonner'; import { useTranslation } from 'react-i18next'; import i18n from '@/i18n'; import Link from 'next/link'; const formSchema = (t: (key: string) => string) => z.object({ email: z.string().email(t('common.invalidEmail')), password: z.string().min(1, t('common.emptyPassword')), }); export default function Login() { const router = useRouter(); const { t } = useTranslation(); const [currentLanguage, setCurrentLanguage] = useState(i18n.language); const form = useForm>>({ resolver: zodResolver(formSchema(t)), defaultValues: { email: '', password: '', }, }); useEffect(() => { judgeLanguage(); getIsInitialized(); checkIfAlreadyLoggedIn(); }, []); const judgeLanguage = () => { if (i18n.language === 'zh-CN' || i18n.language === 'zh-Hans') { setCurrentLanguage('zh-Hans'); localStorage.setItem('langbot_language', 'zh-Hans'); } else if (i18n.language === 'zh-TW' || i18n.language === 'zh-Hant') { setCurrentLanguage('zh-Hant'); localStorage.setItem('langbot_language', 'zh-Hant'); } else if (i18n.language === 'ja' || i18n.language === 'ja-JP') { setCurrentLanguage('ja-JP'); localStorage.setItem('langbot_language', 'ja-JP'); } else { setCurrentLanguage('en-US'); localStorage.setItem('langbot_language', 'en-US'); } // check if the language is already set const lang = localStorage.getItem('langbot_language'); if (lang) { i18n.changeLanguage(lang); setCurrentLanguage(lang); return; } else { const language = navigator.language; if (language) { let lang = 'zh-Hans'; if (language === 'zh-CN') { lang = 'zh-Hans'; } else if (language === 'zh-TW') { lang = 'zh-Hant'; } else if (language === 'ja' || language === 'ja-JP') { lang = 'ja-JP'; } else { lang = 'en-US'; } i18n.changeLanguage(lang); setCurrentLanguage(lang); localStorage.setItem('langbot_language', lang); } } }; const handleLanguageChange = (value: string) => { i18n.changeLanguage(value); setCurrentLanguage(value); localStorage.setItem('langbot_language', value); }; function getIsInitialized() { httpClient .checkIfInited() .then((res) => { if (!res.initialized) { router.push('/register'); } }) .catch((err) => { console.log('error at getIsInitialized: ', err); }); } function checkIfAlreadyLoggedIn() { httpClient .checkUserToken() .then((res) => { if (res.token) { localStorage.setItem('token', res.token); router.push('/home'); } }) .catch((err) => { console.log('error at checkIfAlreadyLoggedIn: ', err); }); } function onSubmit(values: z.infer>) { handleLogin(values.email, values.password); } function handleLogin(username: string, password: string) { httpClient .authUser(username, password) .then((res) => { localStorage.setItem('token', res.token); localStorage.setItem('userEmail', username); console.log('login success: ', res); router.push('/home'); toast.success(t('common.loginSuccess')); }) .catch((err) => { console.log('login error: ', err); toast.error(t('common.loginFailed')); }); } return (
LangBot {t('common.welcome')} {t('common.continueToLogin')}
( {t('common.email')}
)} /> (
{t('common.password')} {t('common.forgotPassword')}
)} />
); }