1.Guest list
IntermediateBuild a guest list: a form to add a name (ignoring empty names and duplicates, case-insensitively), a list of guests each with a remove button, and a count.
Show hint
Check duplicates with guests.some((g) => g.toLowerCase() === name.toLowerCase()). Add with spread, remove with filter.
Show solution
import { useState } from "react";
export default function App() {
const [guests, setGuests] = useState(["Asha", "Ravi"]);
const [name, setName] = useState("");
const [message, setMessage] = useState("");
function add(e) {
e.preventDefault();
const trimmed = name.trim();
if (!trimmed) return;
if (guests.some((g) => g.toLowerCase() === trimmed.toLowerCase())) {
setMessage(`${trimmed} is already on the list`);
return;
}
setGuests([...guests, trimmed]);
setName("");
setMessage("");
}
return (
<form onSubmit={add}>
<input value={name} onChange={(e) => setName(e.target.value)} placeholder="Guest name" />
<button type="submit">Add</button>
{message && <p style={{ color: "crimson" }}>{message}</p>}
<ul>
{guests.map((g) => (
<li key={g}>
{g} <button type="button" onClick={() => setGuests(guests.filter((x) => x !== g))}>Remove</button>
</li>
))}
</ul>
<p>{guests.length} guests</p>
</form>
);
}The remove buttons use type="button" so they do not submit the form. Names are unique, so they work as keys.