App.js
// App.js
import React from 'react';
import { BrowserRouter, Route, Link, Routes } from 'react-router-dom';
import './App.css';
import HomePage from './pages/HomPage';
import ProductsPage from './pages/ProductsPage';
import AboutPage from './pages/AboutPage';
function App() {
return (
<div>
<h1>Lesson 21</h1>
<BrowserRouter>
<div>
<nav>
<ul>
<li>
<Link to="/" className="nav-link">Home</Link>
</li>
<li>
<Link to="/products" className="nav-link">Products</Link>
</li>
<li>
<Link to="/about" className="nav-link">About</Link>
</li>
</ul>
</nav>
<Routes>
<Route path="/" exact Component={HomePage} />
<Route path="/products" Component={ProductsPage} />
<Route path="/about" Component={AboutPage} />
</Routes>
</div>
</BrowserRouter>
</div>
);
}
export default App;
App.css
/* Add this CSS to your stylesheet */
nav ul{
display: flex;
}
nav li{
list-style-type: none;
}
.nav-link {
padding: 8px 12px;
margin-right: 10px;
background-color: #007bff;
color: #fff;
text-decoration: none;
border: none;
border-radius: 5px;
}
.nav-link:hover {
background-color: #0056b3;
}
#main {
display: flex;
}
#productList {
display: block;
height: 600px;
width: 15%;
overflow: scroll;
}
.icon {
width: 30px;
}
.image {
width: 300px;
}
pages/HomePage.js
// HomePage.js
import React from 'react';
const HomePage = () => {
return (
<div>
<h1>Welcome to our Website!</h1>
<p>Check out our awesome products and learn more about us.</p>
</div>
);
}
export default HomePage;
pages/ProductsPage.js
// ProductsPage.js
import React, { useEffect, useState } from 'react';
import Product from '../components/Product';
import ProductInfo from '../components/ProductInfo';
const ProductsPage = () => {
const [productID, setProductID] = useState(1);
const [products, setProducts] = useState([]);
const [searchQuery, setSearchQuery] = useState('');
const [filteredProducts, setFilteredProducts] = useState([]);
useEffect(() => {
fetch('https://fakestoreapi.com/products')
.then(res=>res.json())
.then(data => setProducts(data));
}, []);
// Filter products based on search query
useEffect(() => {
const filtered = products.filter(product =>
product.title.toLowerCase().includes(searchQuery.toLowerCase())
);
setFilteredProducts(filtered);
}, [searchQuery, products]);
// Handle search input change
const handleSearchInputChange = event => {
setSearchQuery(event.target.value);
};
const openProduct = (id) => {
setProductID(id);
}
return (
<div>
<input
type="text"
placeholder="Search by product name"
value={searchQuery}
onChange={handleSearchInputChange}
/>
<div id="main">
<div id="productList">
{
filteredProducts.map((product, index) => {
return (
<Product key={index} productID={product} onClick={openProduct}/>
)
})
}
</div>
<ProductInfo productID={productID}/>
</div>
</div>
)
}
export default ProductsPage;
components/Product.js
// Product.js
import React, { useState, useEffect } from 'react';
function Product({ productID, onClick }) {
const [product, setProduct] = useState({});
useEffect(() => {
setProduct(productID)
}, [productID]);
return (
<div>
{product ? (
<div className="product">
<a href={'#'+ product.id} onClick={() => onClick(product.id)}>
<img src={product.image} alt='Alternative text' className='icon'/>
<span>{product.title}</span>
</a>
</div>
) : (
<p>Loading...</p>
)}
</div>
);
}
export default Product;
components/ProductInfo.js
// ProductInfo.js
import React, { useState, useEffect } from 'react';
function ProductInfo({ productID }) {
const [product, setProduct] = useState({});
useEffect(() => {
fetch(`https://fakestoreapi.com/products/${productID}`)
.then(response => response.json())
.then(data => {
console.log(data);
setProduct(data);
});
}, [productID]); // Dependency array includes productID to refetch when it changes
return (
<div>
{product ? (
<div>
<h1>{product.title}</h1>
<p>Category: {product.category}</p>
<p>Description: {product.description}</p>
<img src={product.image} alt='Alternative text' className='image'/>
</div>
) : (
<p>Loading...</p>
)}
</div>
);
}
export default ProductInfo;
pages/AboutPage.js
// AboutPage.js
import React from 'react';
const AboutPage = () => {
return (
<div>
<h1>About Us</h1>
<p>We are a company dedicated to providing high-quality products to our customers.</p>
</div>
);
}
export default AboutPage;