Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion src/components/App.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,14 @@ function App() {
setIsDarkMode((isDarkMode) => !isDarkMode);
}

const onItemFormSubmit = (item) => {
setItems([...items, item])
}

return (
<div className={"App " + (isDarkMode ? "dark" : "light")}>
<Header isDarkMode={isDarkMode} onDarkModeClick={handleDarkModeClick} />
<ShoppingList items={items} />
<ShoppingList items={items} onItemFormSubmit={onItemFormSubmit} />
</div>
);
}
Expand Down
4 changes: 2 additions & 2 deletions src/components/Filter.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import React from "react";

function Filter({ onCategoryChange }) {
function Filter({ onCategoryChange, onSearchChange, search }) {
return (
<div className="Filter">
<input type="text" name="search" placeholder="Search..." />
<input type="text" name="search" placeholder="Search..." onChange={onSearchChange} value={search}/>
<select name="filter" onChange={onCategoryChange}>
<option value="All">Filter by category</option>
<option value="Produce">Produce</option>
Expand Down
31 changes: 26 additions & 5 deletions src/components/ItemForm.js
Original file line number Diff line number Diff line change
@@ -1,17 +1,38 @@
import React from "react";
import React, { useState } from "react";
import { v4 as uuid } from "uuid";

function ItemForm(props) {
function ItemForm({ onItemFormSubmit}) {
const [itemName, setItemName] = useState('')
const [itemCategory, setItemCategory] = useState('Produce')

const handleNameChange = (event) => {
setItemName(event.target.value)
}

const handleSelectChange = (event) => {
setItemCategory(event.target.querySelector("option:checked").value)
}

const newItem = {
id: uuid(),
name: itemName,
category: itemCategory,
}

const handleSubmit = (event) => {
event.preventDefault()
onItemFormSubmit(newItem)
}
return (
<form className="NewItem">
<form className="NewItem" onSubmit={handleSubmit}>
<label>
Name:
<input type="text" name="name" />
<input type="text" name="name" value={itemName} onChange={handleNameChange} />
</label>

<label>
Category:
<select name="category">
<select name="category" onChange={handleSelectChange}>
<option value="Produce">Produce</option>
<option value="Dairy">Dairy</option>
<option value="Dessert">Dessert</option>
Expand Down
18 changes: 13 additions & 5 deletions src/components/ShoppingList.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,31 @@ import ItemForm from "./ItemForm";
import Filter from "./Filter";
import Item from "./Item";

function ShoppingList({ items }) {
function ShoppingList({ items, onItemFormSubmit }) {
const [selectedCategory, setSelectedCategory] = useState("All");
const [selectedName, setSelectedName] = useState("");

function handleCategoryChange(event) {
setSelectedCategory(event.target.value);
}

const itemsToDisplay = items.filter((item) => {
if (selectedCategory === "All") return true;
const handleSearchChange = (event) => {
setSelectedName(event.target.value);
}

const matchCategory = (item, selectedCategory) => {
if (selectedCategory === "All") return true;
return item.category === selectedCategory;
}

const itemsToDisplay = items.filter((item) => {
return matchCategory(item, selectedCategory) && item.name.includes(selectedName);
});

return (
<div className="ShoppingList">
<ItemForm />
<Filter onCategoryChange={handleCategoryChange} />
<ItemForm onItemFormSubmit={onItemFormSubmit} />
<Filter onCategoryChange={handleCategoryChange} onSearchChange={handleSearchChange} search={selectedName} />
<ul className="Items">
{itemsToDisplay.map((item) => (
<Item key={item.id} name={item.name} category={item.category} />
Expand Down