feat: Add filter products
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
import { ProductCards } from "./components";
|
import { ProductCards } from "./components";
|
||||||
import { useEffect, useState } from "react";
|
import React, { useEffect, useMemo, useState } from "react";
|
||||||
import type { Product, ProductLine } from "../../types";
|
import type { Product, ProductLine } from "../../types";
|
||||||
import Order from "./components/order/Order";
|
import Order from "./components/order/Order";
|
||||||
import styles from "./Catalog.module.css";
|
import styles from "./Catalog.module.css";
|
||||||
@@ -8,9 +8,10 @@ import styles from "./Catalog.module.css";
|
|||||||
const Catalog = () => {
|
const Catalog = () => {
|
||||||
const [products, setProducts] = useState<Product[]>([]);
|
const [products, setProducts] = useState<Product[]>([]);
|
||||||
const [productLines, setProductLines] = useState<ProductLine[] | []>([]);
|
const [productLines, setProductLines] = useState<ProductLine[] | []>([]);
|
||||||
|
const [filterText, setFilterText] = useState<string>("");
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
async function fetchProducts(){
|
async function fetchProducts() {
|
||||||
try{
|
try{
|
||||||
const response = await fetch("http://localhost:8010/api/v1/products");
|
const response = await fetch("http://localhost:8010/api/v1/products");
|
||||||
const data = await response.json();
|
const data = await response.json();
|
||||||
@@ -22,7 +23,7 @@ const Catalog = () => {
|
|||||||
fetchProducts();
|
fetchProducts();
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
function addProductLine(product: Product, quantity: number){
|
function addProductLine(product: Product, quantity: number): void{
|
||||||
const newProductLine: ProductLine = {
|
const newProductLine: ProductLine = {
|
||||||
id: Date.now(),
|
id: Date.now(),
|
||||||
product: product,
|
product: product,
|
||||||
@@ -34,10 +35,30 @@ const Catalog = () => {
|
|||||||
setProductLines([...productLines, newProductLine]);
|
setProductLines([...productLines, newProductLine]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const filteredProducts = useMemo(() =>
|
||||||
|
filterText.trim()
|
||||||
|
? products.filter(p =>
|
||||||
|
p.name.toLowerCase().includes(filterText.toLowerCase())
|
||||||
|
)
|
||||||
|
: products,
|
||||||
|
[products, filterText]
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={styles.layout}>
|
<div className={styles.layout}>
|
||||||
<section className={styles.catalog}>
|
<section className={styles.catalog}>
|
||||||
<ProductCards products={products} addProductLine={addProductLine}/>
|
<section>
|
||||||
|
<form onSubmit={e => e.preventDefault()}>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
value={filterText}
|
||||||
|
placeholder="Buscar"
|
||||||
|
onChange={
|
||||||
|
(event) => setFilterText(event.target.value)}/>
|
||||||
|
<button type="submit">Buscar</button>
|
||||||
|
</form>
|
||||||
|
</section>
|
||||||
|
<ProductCards products={filteredProducts} addProductLine={addProductLine}/>
|
||||||
</section>
|
</section>
|
||||||
<aside className={styles.order}>
|
<aside className={styles.order}>
|
||||||
<Order productLines={productLines}/>
|
<Order productLines={productLines}/>
|
||||||
|
|||||||
Reference in New Issue
Block a user