← Back to Exercises

Product List

"use client";

import { useEffect, useState } from "react";
import axios from "axios";

function Filter({ setFilter }) {
  return (
    <input
      type="text"
      placeholder="Search by name or category"
      className="form-control w-full border p-2 mb-5 rounded"
      onChange={(e) => setFilter(e.target.value.toLowerCase())}
    />
  );
}

function ProductList({ filter }) {
  const [products, setProducts] = useState([]);

  useEffect(() => {
    axios.get("https://dummyjson.com/products")
      .then(res => setProducts(res.data.products))
      .catch(err => console.error(err));
  }, []);

  const filteredProducts = products.filter(
    (product) => 
      product.title.toLowerCase().includes(filter) || 
      product.category.toLowerCase().includes(filter)
  );

  return (
    <div className="grid grid-cols-2 gap-4">
      {filteredProducts.map((product) => (
        <div key={product.id} className="border p-4 rounded shadow">
          <h3 className="font-bold">{product.title}</h3>
          <p className="text-gray-600">{product.category}</p>
        </div>
      ))}
    </div>
  );
}

export default function App() {
  const [filter, setFilter] = useState("");

  return (
    <div className="p-6 max-w-lg mx-auto">
      <Filter setFilter={setFilter} />
      <ProductList filter={filter} />
    </div>
  );
}