diff --git a/frontend/app/login/login-form.tsx b/frontend/app/login/login-form.tsx index 42bb736..dc25f10 100644 --- a/frontend/app/login/login-form.tsx +++ b/frontend/app/login/login-form.tsx @@ -6,11 +6,18 @@ import { useSearchParams } from "next/navigation"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; -export function LoginForm({ hasKeycloak }: { hasKeycloak: boolean }) { +export function LoginForm({ + hasKeycloak, + callbackUrl: callbackUrlProp, + onSuccess, +}: { + hasKeycloak: boolean; + callbackUrl?: string; + onSuccess?: () => void; +}) { const searchParams = useSearchParams(); - const callbackUrl = searchParams.get("callbackUrl") || "/dashboard"; + const callbackUrl = callbackUrlProp ?? searchParams.get("callbackUrl") ?? "/dashboard"; const [username, setUsername] = useState(""); const [password, setPassword] = useState(""); const [error, setError] = useState(""); @@ -29,6 +36,7 @@ export function LoginForm({ hasKeycloak }: { hasKeycloak: boolean }) { if (res?.error) { setError("登录失败,请检查用户名和密码"); } else { + onSuccess?.(); const redirectUrl = callbackUrl.startsWith("http") ? callbackUrl : window.location.origin + callbackUrl; @@ -37,65 +45,53 @@ export function LoginForm({ hasKeycloak }: { hasKeycloak: boolean }) { } return ( - - - 登录 - - -
-
- - setUsername(e.target.value)} - required - /> -
-
- - setPassword(e.target.value)} - required - /> -
- {error &&

{error}

} - -
+
+
+
+ + setUsername(e.target.value)} + required + /> +
+
+ + setPassword(e.target.value)} + required + /> +
+ {error &&

{error}

} + +
- {hasKeycloak && ( - <> -
-
- -
-
- 或者 -
+ {hasKeycloak && ( + <> +
+
+
+
+ 或者 +
+
- - - )} - -

- 还没有账号?{" "} - - 立即注册 - -

- - + + + )} +
); } diff --git a/frontend/app/login/page.tsx b/frontend/app/login/page.tsx index 7d32bcd..4e04534 100644 --- a/frontend/app/login/page.tsx +++ b/frontend/app/login/page.tsx @@ -1,14 +1,50 @@ -import { Suspense } from "react"; +"use client"; + +import { Suspense, useEffect } from "react"; +import { useRouter, useSearchParams } from "next/navigation"; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; import { LoginForm } from "./login-form"; const hasKeycloak = !!process.env.AUTH_KEYCLOAK_ISSUER; -export default function LoginPage() { +function LoginPageContent() { + const router = useRouter(); + const searchParams = useSearchParams(); + const callbackUrl = searchParams.get("callbackUrl"); + const error = searchParams.get("error"); + + useEffect(() => { + // If not an OAuth callback, redirect to home with login modal open + if (!callbackUrl && !error) { + router.replace("/?login=1"); + } + }, [callbackUrl, error, router]); + return ( -
- 加载中...
}> - - +
+ + + + 登录 + + 加载中...
}> + + + +
); } + +export default function LoginPage() { + return ( + 加载中...}> + + + ); +} diff --git a/frontend/app/register/page.tsx b/frontend/app/register/page.tsx index 0d38110..dbec4a1 100644 --- a/frontend/app/register/page.tsx +++ b/frontend/app/register/page.tsx @@ -1,113 +1,18 @@ "use client"; -import { useState } from "react"; +import { useEffect } from "react"; import { useRouter } from "next/navigation"; -import { Button } from "@/components/ui/button"; -import { Input } from "@/components/ui/input"; -import { Label } from "@/components/ui/label"; -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; export default function RegisterPage() { const router = useRouter(); - const [form, setForm] = useState({ - username: "", - email: "", - password: "", - confirmPassword: "", - }); - const [error, setError] = useState(""); - async function handleSubmit(e: React.FormEvent) { - e.preventDefault(); - setError(""); - - if (form.password !== form.confirmPassword) { - setError("两次输入的密码不一致"); - return; - } - - const res = await fetch("/api/proxy/auth/register", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ - username: form.username, - email: form.email, - password: form.password, - }), - }); - - if (!res.ok) { - const data = await res.json(); - setError(data.error || "注册失败"); - return; - } - - router.push("/login"); - } + useEffect(() => { + router.replace("/"); + }, [router]); return ( -
- - - 注册 - - -
-
- - setForm({ ...form, username: e.target.value })} - required - /> -
-
- - setForm({ ...form, email: e.target.value })} - required - /> -
-
- - setForm({ ...form, password: e.target.value })} - required - /> -
-
- - - setForm({ ...form, confirmPassword: e.target.value }) - } - required - /> -
- {error &&

{error}

} - -
- -

- 已有账号?{" "} - - 去登录 - -

-
-
+
+ 加载中...
); }