ecommerce / frontend / src / pages / Products.jsx
Products.jsx
Raw
import { useEffect, useState } from "react";
import Appbar from "../components/Appbar";
import Product from "../components/Product";
import { Api } from "../apiConfig";
import axios from 'axios'
import { useNavigate } from "react-router-dom";
import { BiRefresh } from 'react-icons/bi';


export default function Products() {
    const [products, setProducts] = useState([]);
    const navigate = useNavigate();
    const [search, setSearch] = useState("");

    async function getProducts() {
        try {
            let response = await axios.get(Api + '/product/search/' + search);
            if (response.data.products) setProducts(response.data.products);
            else window.alert("Product not found");
        } catch (error) {
            console.log(error);
        }
    }

    async function fetchProducts() {
        try{
            let token = "Bearer " + localStorage.getItem("token");
            let response = await axios.get(Api + "/product/", {
                headers: {
                    authorization: token
                }
            })
            setProducts(response.data.products)
            //console.log(response.data)
        } catch(error) {
            console.log(error);
            window.alert("Failed to fetch products");
        }
    }
    useEffect(()=> {
        fetchProducts();
    },[])
    return (
        <div className="bg-black h-screen overflow-auto">
            <Appbar />
            <br />

           <div class="grid grid-cols-2">
                <div>
                    < input className="ml-10 w-full mr-2" placeholder="search products " onChange={(e)=> {setSearch(e.target.value)}}></input>
                </div>
                <div>
                    <button className="ml-12 text-black bg-white p-1 pb-0 px-3" onClick = {getProducts}> Search</button>
                    <button className="ml-1 text-black bg-white p-1 pt-1 px-1" onClick = {fetchProducts}>  <BiRefresh /></button>
                </div>
            </div>

            <div className="flex flex-wrap pt-10 px-8 justify-between">
                {products.map(product => <div className= "p-3" id = {product._id}> <Product key={product._id} 
                    name = {product.name}
                    price = {product.price}
                    image={product.image}
                    description={product.description}
                    style = "bg-gray-300 text-gray-700 px-4 py-2 rounded-md mr-2"
                    option = {"Add to Cart"}
                    onPress = {()=>{
                       try {
                            let token = 'Bearer ' + localStorage.getItem("token");
                            let productId = product._id;
                            console.log(token);
                            // let response =  axios.post(Api + '/cart/add/'+ productId, {
                            //     headers: { authorization: token}
                            // })
                            // if (response.data.message == "success") window.alert("Product Added to Cart");
                            // else window.alert("Failed to Add product to Cart");
                            let url = Api + '/cart/add/'+ productId;
                            axios.post(url, {},{ headers: { authorization: token}})
                            .then(response => {
                                window.alert("product added to cart");
                            }).catch(err => console.log(err))
                       } catch (error) {
                            console.log(error);
                       }
                    }}
                    onView={()=>{
                        navigate('/productdetails/' + product._id)
                    }}
                    />
                    </div>
                    )}
            </div>
        </div>
    )
}