← back to Govarbitrage
src/components/offer-form.tsx
58 lines
"use client";
import { useState } from "react";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
export function OfferForm({ listingId }: { listingId: string }) {
const [name, setName] = useState("");
const [email, setEmail] = useState("");
const [offer, setOffer] = useState("");
const [status, setStatus] = useState<"idle" | "sending" | "done" | "error">("idle");
async function submit(e: React.FormEvent) {
e.preventDefault();
setStatus("sending");
try {
const res = await fetch(`/api/listings/${listingId}/buyer-lead`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
name,
email,
offer: offer ? Number(offer) : undefined,
}),
});
setStatus(res.ok ? "done" : "error");
} catch {
setStatus("error");
}
}
if (status === "done") {
return (
<p className="rounded-md border border-[var(--positive)]/40 bg-[var(--positive)]/10 p-3 text-sm">
Thanks — your <strong>contingent, non-binding</strong> interest is recorded. We'll follow up
only if we win this lot.
</p>
);
}
return (
<form onSubmit={submit} className="space-y-2">
<Input placeholder="Your name" value={name} onChange={(e) => setName(e.target.value)} required />
<Input placeholder="Email" type="email" value={email} onChange={(e) => setEmail(e.target.value)} required />
<Input
placeholder="Contingent offer (optional, USD)"
type="number"
value={offer}
onChange={(e) => setOffer(e.target.value)}
/>
<Button type="submit" disabled={status === "sending"}>
{status === "sending" ? "Submitting…" : "Register contingent interest"}
</Button>
{status === "error" && <p className="text-sm text-[var(--negative)]">Something went wrong — try again.</p>}
</form>
);
}