import { Form, redirect, useLoaderData } from "@remix-run/react"; import type { ActionFunction, LoaderFunctionArgs } from "@remix-run/node"; import invariant from "tiny-invariant"; import { useState } from "react"; import { getItem } from "../data/inventoryData"; import { addToCart, getCartItem } from "../data/cartData"; export const action: ActionFunction = async ({ request, params }) => { const itemId = params.itemId; invariant(itemId, "itemId param missing"); const formData = await request.formData(); const quantity = Number(formData.get("quantity")); addToCart({ itemId, quantity }); return redirect("/cart"); }; export const loader = async ({ params }: LoaderFunctionArgs) => { invariant(params.itemId, "Missing itemId param"); const item = await getItem(params.itemId); if (!item) { throw new Response("Not Found", { status: 404 }); } const cartItem = await getCartItem(params.itemId); return { item, cartItem }; }; export default function Item() { const { item, cartItem } = useLoaderData(); const [quantity, setQuantity] = useState(1); const cartQuantity = cartItem?.quantity || 0; return (
{`${item.displayName}

{item.displayName}

{item.description ?

{item.description}

: null}

You have {cartQuantity} in your cart

{ console.log( quantity, event.target.value, event.target.value.replace(/\D/, ""), ); const clean = event.target.value.replace(/\D/, "").trim(); if (!clean) { setQuantity(() => quantity); } else { setQuantity(() => parseInt(event.target.value.replace(/\D/, ""), 10), ); } }} />
); }