account settings and account creation
This commit is contained in:
+51
-3
@@ -2,6 +2,7 @@
|
||||
|
||||
import { FormEvent, useState } from "react";
|
||||
import Image from "next/image";
|
||||
import Link from "next/link";
|
||||
|
||||
export default function HomePage() {
|
||||
const [email, setEmail] = useState("");
|
||||
@@ -9,7 +10,10 @@ export default function HomePage() {
|
||||
const [status, setStatus] = useState<
|
||||
"idle" | "loading" | "success" | "error"
|
||||
>("idle");
|
||||
|
||||
const [message, setMessage] = useState<string | null>(null);
|
||||
const [accepted, setAccepted] = useState(false);
|
||||
const TOS_VERSION = "2025-12-27";
|
||||
|
||||
async function handleSubmit(e: FormEvent) {
|
||||
e.preventDefault();
|
||||
@@ -20,6 +24,14 @@ export default function HomePage() {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!accepted) {
|
||||
setMessage(
|
||||
"You must accept the Terms and confirm you’re responsible for safe/legal assembly."
|
||||
);
|
||||
setStatus("error");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
setStatus("loading");
|
||||
setMessage(null);
|
||||
@@ -27,7 +39,7 @@ export default function HomePage() {
|
||||
const res = await fetch("/api/beta-signup", {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ email, useCase }),
|
||||
body: JSON.stringify({ email, useCase, acceptedTos: accepted, tosVersion: TOS_VERSION }),
|
||||
});
|
||||
|
||||
if (!res.ok) {
|
||||
@@ -36,7 +48,9 @@ export default function HomePage() {
|
||||
}
|
||||
|
||||
setStatus("success");
|
||||
setMessage("✅ You’re on the list. Invites drop soon — we’ll email your access link when it’s go-time.");
|
||||
setMessage(
|
||||
"✅ You’re on the list. Invites drop soon — we’ll email your access link when it’s go-time."
|
||||
);
|
||||
setEmail("");
|
||||
setUseCase("");
|
||||
} catch (err) {
|
||||
@@ -187,9 +201,43 @@ export default function HomePage() {
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="rounded-md border border-zinc-800 bg-black/30 p-3">
|
||||
<label className="flex items-start gap-2 text-[11px] text-zinc-400">
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={accepted}
|
||||
onChange={(e) => setAccepted(e.target.checked)}
|
||||
disabled={status === "loading" || status === "success"}
|
||||
className="mt-0.5 h-4 w-4 rounded border-zinc-700 bg-zinc-950 text-amber-400 focus:ring-2 focus:ring-amber-500/40"
|
||||
required
|
||||
/>
|
||||
<span>
|
||||
I agree to the{" "}
|
||||
<Link
|
||||
href="/tos"
|
||||
className="text-amber-300 hover:text-amber-200 underline"
|
||||
>
|
||||
Terms of Service
|
||||
</Link>{" "}
|
||||
and{" "}
|
||||
<Link
|
||||
href="/privacy"
|
||||
className="text-amber-300 hover:text-amber-200 underline"
|
||||
>
|
||||
Privacy Policy
|
||||
</Link>
|
||||
. I understand Battl Builders is informational only and I’m
|
||||
solely responsible for legality, compatibility, and safe
|
||||
assembly/use of any firearm or components.
|
||||
</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<button
|
||||
type="submit"
|
||||
disabled={status === "loading" || status === "success"}
|
||||
disabled={
|
||||
status === "loading" || status === "success" || !accepted
|
||||
}
|
||||
className="flex w-full items-center justify-center rounded-md border border-amber-500/70 bg-amber-500/90 px-3 py-2 text-sm font-medium text-black transition hover:bg-amber-400 disabled:cursor-not-allowed disabled:opacity-70"
|
||||
>
|
||||
{status === "loading"
|
||||
|
||||
Reference in New Issue
Block a user