'use client'; import { useState, useEffect } from 'react'; import { useRouter, useSearchParams } from 'next/navigation'; import { useForm } from 'react-hook-form'; import { useAuth } from '@/components/providers/auth-provider'; import { Button } from '@nice/ui/components/button'; import { Input } from '@nice/ui/components/input'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@nice/ui/components/form'; import { Alert, AlertDescription } from '@nice/ui/components/alert'; import Link from 'next/link'; import { toast } from '@nice/ui/components/sonner'; import React from 'react'; import { Checkbox } from '@nice/ui/components/checkbox'; import { oidcClient } from '@/lib/auth/oidc-client'; import { Eye, EyeOff } from 'lucide-react'; interface LoginForm { username: string; password: string; remember: boolean; } export default function LoginPage() { const router = useRouter(); const searchParams = useSearchParams(); const { login, isLoading, isAuthenticated } = useAuth(); const [isRedirecting, setIsRedirecting] = useState(false); const [redirectUri, setRedirectUri] = useState(''); const [passwordVisible, setPasswordVisible] = useState(false); const [error, setError] = useState(null); const redirectUrl = searchParams.get('redirectUrl') || '/dashboard'; const message = searchParams.get('message'); useEffect(() => { // 设置回调 URI setRedirectUri(`${window.location.origin}/auth/callback`); }, []); const handleSSOLogin = () => { if (!redirectUri) return; // 构建授权 URL const authUrl = oidcClient.buildAuthorizationUrl({ redirectUri, state: 'test-state', scope: 'openid profile email', }); // 保存状态到 sessionStorage(包括 redirectUrl) sessionStorage.setItem('oauth_state', 'test-state'); sessionStorage.setItem('oauth_redirect_uri', redirectUri); sessionStorage.setItem('oauth_return_url', redirectUrl); // 跳转到授权页面 window.location.href = authUrl; }; const form = useForm({ defaultValues: { username: '', password: '', remember: false, }, }); // 组件加载时检查是否有保存的凭据 useEffect(() => { const savedCredentials = localStorage.getItem('loginCredentials'); if (savedCredentials) { const { username, password } = JSON.parse(savedCredentials); form.setValue('username', username); form.setValue('password', password); form.setValue('remember', true); } }, [form]); // 处理已登录用户的重定向 React.useEffect(() => { if (isAuthenticated && !isRedirecting) { setIsRedirecting(true); router.push(redirectUrl); } }, [isAuthenticated, redirectUrl, router, isRedirecting]); const handleSubmit = async (data: LoginForm) => { setError(null); try { await login(data.username, data.password); // 处理记住密码 if (data.remember) { localStorage.setItem( 'loginCredentials', JSON.stringify({ username: data.username, password: data.password, }), ); } else { localStorage.removeItem('loginCredentials'); } toast.success('登录成功'); setIsRedirecting(true); router.replace(redirectUrl); } catch (err) { setError(err instanceof Error ? err.message : '登录失败,请重试'); toast.error('登录失败,请重试'); } }; // 如果正在重定向,显示加载状态而不是空白 if (isRedirecting) { return (

正在跳转...

); } return (
{/* 欢迎标题 */}

欢迎使用FengHuo

{/* 成功消息 */} {message === 'register_success' && ( 注册成功!请使用您的账号登录。 )} {/* 错误消息 */} {error && ( {error} )}
{/* 登录表单 */}
{/* 用户名输入 */} ( 用户名 )} /> {/* 密码输入 */} ( 密码
)} /> {/* 添加记住密码复选框 */} ( 记住密码 )} /> {/* 登录按钮 */}
更多登录方式
{/* 注册链接 */}
还没有账号? 立即注册
); }