// Checkout page — order summary + shipping + mock payment + success
const CheckoutPage = ({cart, removeItem, updateQty, clearCart, isReseller, setRoute}) => {
const [step, setStep] = React.useState("form"); // form | success
const [mobile, setMobile] = React.useState(() => window.innerWidth < 768);
React.useEffect(() => {
const h = () => setMobile(window.innerWidth < 768);
window.addEventListener("resize", h);
return () => window.removeEventListener("resize", h);
}, []);
const [form, setForm] = React.useState({
firstName:"", lastName:"", email:"", phone:"",
address:"", city:"", state:"", zip:"",
cardNum:"", cardExp:"", cardCvv:"",
});
const [errors, setErrors] = React.useState({});
const items = cart || [];
const wsDiscount = 0.55;
const subtotal = items.reduce((sum, i) => {
const price = isReseller ? i.price * wsDiscount : i.price;
return sum + price * i.qty;
}, 0);
const shipping = subtotal >= 200 ? 0 : 18.99;
const total = subtotal + shipping;
const confirmNum = React.useRef("SSL-26-" + Math.floor(100000 + Math.random() * 900000));
const validate = () => {
const e = {};
if (!form.firstName.trim()) e.firstName = "Required";
if (!form.lastName.trim()) e.lastName = "Required";
if (!form.email.trim()) e.email = "Required";
if (!form.address.trim()) e.address = "Required";
if (!form.city.trim()) e.city = "Required";
if (!form.state.trim()) e.state = "Required";
if (!form.zip.trim()) e.zip = "Required";
if (!form.cardNum.trim()) e.cardNum = "Required";
if (!form.cardExp.trim()) e.cardExp = "Required";
if (!form.cardCvv.trim()) e.cardCvv = "Required";
return e;
};
const handleSubmit = (e) => {
e.preventDefault();
const errs = validate();
if (Object.keys(errs).length) { setErrors(errs); return; }
setStep("success");
clearCart && clearCart();
window.scrollTo({top:0, behavior:"instant"});
};
const set = (k, v) => {
setForm(p => ({...p, [k]: v}));
setErrors(p => ({...p, [k]: undefined}));
};
if (step === "success") {
return (
Your order {confirmNum.current} has been received. You'll get a confirmation email at{" "}
{form.email || "the address on file"} within a few minutes.
Questions? Reach your account rep at{" "}
info@smokeshowlabs.com{" "}
or 213-943-9000.
Add some products before checking out.