karuracc_dev_test/components/AuthForm.tsx
David Kiania fafef34304 Add Next.js app with Supabase auth, notes feature, and Docker setup
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 15:43:09 +03:00

75 lines
2.2 KiB
TypeScript

"use client";
import { useState } from "react";
import { useRouter } from "next/navigation";
import { createClient } from "@/lib/supabase/client";
export function AuthForm({ mode }: { mode: "login" | "signup" }) {
const router = useRouter();
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [error, setError] = useState("");
const [info, setInfo] = useState("");
const [loading, setLoading] = useState(false);
async function handleSubmit() {
setError("");
setInfo("");
setLoading(true);
const supabase = createClient();
if (mode === "signup") {
const { error } = await supabase.auth.signUp({ email, password });
if (error) { setError(error.message); setLoading(false); return; }
setInfo("Account created — check your email to confirm, then sign in.");
setLoading(false);
return;
}
const { error } = await supabase.auth.signInWithPassword({ email, password });
if (error) { setError(error.message); setLoading(false); return; }
router.push("/dashboard");
router.refresh();
}
return (
<>
{error && <div className="error-msg">{error}</div>}
{info && <div className="success-msg">{info}</div>}
<div className="field">
<label htmlFor="email">Email</label>
<input
id="email"
type="email"
value={email}
onChange={e => setEmail(e.target.value)}
placeholder="you@example.com"
autoComplete="email"
/>
</div>
<div className="field">
<label htmlFor="password">Password</label>
<input
id="password"
type="password"
value={password}
onChange={e => setPassword(e.target.value)}
placeholder="••••••••"
autoComplete={mode === "login" ? "current-password" : "new-password"}
onKeyDown={e => e.key === "Enter" && handleSubmit()}
/>
</div>
<button
className="btn btn-primary"
onClick={handleSubmit}
disabled={loading || !email || password.length < 6}
>
{loading ? "Working…" : mode === "login" ? "Sign in" : "Create account"}
</button>
</>
);
}