Checkpoint: Initial stable CheckFlow base before i18n and demo mode

This commit is contained in:
Wonhee Han
2026-08-20 14:01:12 +09:00
parent ed076cf5ab
commit dbfaa0fcb2
42 changed files with 4727 additions and 167 deletions
+103
View File
@@ -0,0 +1,103 @@
"use client";
import { useState } from "react";
import { signIn } from "next-auth/react";
import { useRouter } from "next/navigation";
import Link from "next/link";
export default function RegisterPage() {
const router = useRouter();
const [name, setName] = useState("");
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [error, setError] = useState("");
const [loading, setLoading] = useState(false);
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
setError("");
setLoading(true);
const res = await fetch("/api/auth/register", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ name, email, password }),
});
if (!res.ok) {
let msg = "Registration failed.";
try {
const data = await res.json();
msg = data.error || msg;
} catch {
// non-JSON response (e.g. 500 HTML page)
}
setError(msg);
setLoading(false);
return;
}
await signIn("credentials", { email, password, redirect: false });
router.push("/");
};
return (
<div className="auth-page">
<div className="auth-card">
<div className="auth-logo">
<div className="auth-logo-icon"></div>
<span className="auth-logo-name">CheckFlow</span>
</div>
<h1 className="auth-title">Create account</h1>
<p className="auth-subtitle">Start organizing your tasks today</p>
<form onSubmit={handleSubmit}>
<div className="form-group">
<label className="form-label">Display Name</label>
<input
id="name"
type="text"
className="form-input"
placeholder="Your name"
value={name}
onChange={(e) => setName(e.target.value)}
required
autoFocus
/>
</div>
<div className="form-group">
<label className="form-label">Email</label>
<input
id="reg-email"
type="email"
className="form-input"
placeholder="you@example.com"
value={email}
onChange={(e) => setEmail(e.target.value)}
required
/>
</div>
<div className="form-group">
<label className="form-label">Password</label>
<input
id="reg-password"
type="password"
className="form-input"
placeholder="Min. 8 characters"
value={password}
onChange={(e) => setPassword(e.target.value)}
required
minLength={8}
/>
</div>
{error && <p className="form-error" style={{ marginBottom: "12px" }}>{error}</p>}
<button id="register-btn" type="submit" className="btn btn-primary w-full" disabled={loading} style={{ height: "44px" }}>
{loading ? "Creating account..." : "Create account"}
</button>
</form>
<p className="auth-footer">
Already have an account?{" "}
<Link href="/login" className="auth-link">Sign in</Link>
</p>
</div>
</div>
);
}