total calc

This commit is contained in:
Ava Gaiety W 2025-06-14 15:52:33 -06:00
parent 46a18112cc
commit 746534d4d3
2 changed files with 54 additions and 6 deletions

View file

@ -1,28 +1,69 @@
import { useState, useRef } from 'react';
const CentsInADollar = 100;
const DefaultTotal = 0;
function costToReadable(cost) { function costToReadable(cost) {
const centsInADollar = 100; return cost / CentsInADollar;
return cost / centsInADollar;
} }
function BandForm({ band }) { function BandForm({ band }) {
const formRef = useRef(null);
const [total, setTotal] = useState(DefaultTotal);
const [formIsPending, setFormIsPending] = useState(false);
function purchase(formData) {
console.log(formData);
setFormIsPending(true);
}
function ticketQuantityChanged() {
const formData = new FormData(formRef.current);
const ticketQuantities = formData.getAll('ticketQuantity');
setTotal(
ticketQuantities.reduce((total, quantity, index) => {
return total += (band.ticketTypes[index].cost * quantity);
}, 0)
)
}
return ( return (
<form className="form"> <form className="form" action={purchase} ref={formRef}>
<h2>Select Tickets</h2> <h2>Select Tickets</h2>
{band.ticketTypes.map(({type, name, description, cost}) => ( {band.ticketTypes.map(({type, name, description, cost}, index) => (
<div className="ticketWrapper" key={name}> <div className="ticketWrapper" key={name}>
<div className="ticket"> <div className="ticket">
<div className="ticketDetails"> <div className="ticketDetails">
<h3>{name}</h3> <h3 id={name}>{name}</h3>
<p>{description}</p> <p>{description}</p>
<h4>${costToReadable(cost)}</h4> <h4>${costToReadable(cost)}</h4>
</div> </div>
<div> <div>
<input type="number" step="1" /> {/* TODO: describedby cost and description */}
<input
labelledby={name}
defaultValue="0"
name="ticketQuantity"
id={name}
type="number"
step="1"
onChange={ticketQuantityChanged}
/>
</div> </div>
</div> </div>
<hr /> <hr />
</div> </div>
))} ))}
<div className="total">
<h3>Total</h3>
<p>${costToReadable(total)}</p>
</div>
<button type="submit" disabled={formIsPending}>Get Tickets</button>
</form> </form>
); );
} }

View file

@ -84,4 +84,11 @@ h4 {
flex-direction: column; flex-direction: column;
gap: var(--spacing-md); gap: var(--spacing-md);
} }
.total {
display: flex;
flex-direction: row;
justify-content: space-between;
font-size: var(--font-lg);
}
} }