product page reflecting information from strapi api

This commit is contained in:
Jacob Delgado 2024-11-21 22:07:08 -08:00
parent df431c11f9
commit 96f1917f8f
10 changed files with 94 additions and 33 deletions

Binary file not shown.

View File

@ -121,11 +121,16 @@ def mail():
# Handle Serving Public Images # Handle Serving Public Images
@app.route('/serve-image/<filename>', methods=['GET']) @app.route('/uploads/<filename>', methods=['GET'])
def serve_image(filename): def serve_image(filename):
return send_from_directory(app.config['UPLOAD_DIRECTORY'], filename) return send_from_directory(app.config['UPLOAD_DIRECTORY'], filename)
# Get all files
@app.route("/images", methods=["GET"])
def get_files():
files = os.listdir(app.config['UPLOAD_DIRECTORY'])
return jsonify({"files": files})
# New Orders # New Orders
@app.route("/new-order", methods=["POST"]) @app.route("/new-order", methods=["POST"])

View File

@ -37,7 +37,29 @@ class Orders(db.Model):
"order":self.order, "order":self.order,
} }
class Products(db.Model):
__tablename__ = "products"
id = db.Column(db.String(32), primary_key=True, unique=True, default=get_uuid)
name = db.Column(db.String(345), default='New Shirt')
image = db.Column(db.String(34), nullable=False)
description = db.Column(db.String(345), default='Basic T-Shirt')
price = db.Column(db.Integer, default=25)
category = db.Column(db.String(345), default='New Shirt')
sale = db.Column(db.Boolean, default=False)
sale_price = db.Column(db.Integer, default=18)
def to_json(self):
return {
"id": self.id,
"name": self.name,
"image": self.image,
"description": self.description,
"price": self.price,
"category": self.category,
"sale": self.sale,
"sale_price": self.sale_price,
}
# class Category(db.Model): # class Category(db.Model):
# __tablename__ = "categories" # __tablename__ = "categories"
# id = db.Column(db.String(32), primary_key=True, unique=True, default=get_uuid) # id = db.Column(db.String(32), primary_key=True, unique=True, default=get_uuid)

View File

Before

Width:  |  Height:  |  Size: 240 KiB

After

Width:  |  Height:  |  Size: 240 KiB

View File

@ -27,6 +27,12 @@ const nextConfig = {
port: "1337", port: "1337",
pathname: "/**", pathname: "/**",
}, },
{
protocol: "http",
hostname: "localhost",
port: "5080",
pathname: "/**",
},
{ {
protocol: "https", protocol: "https",
hostname: "api.kevosattire.com", hostname: "api.kevosattire.com",

View File

@ -20,7 +20,18 @@ const Products = () => {
Authorization: "Bearer " + process.env.NEXT_PUBLIC_API_TOKEN Authorization: "Bearer " + process.env.NEXT_PUBLIC_API_TOKEN
} }
}); });
// const response = await fetch(process.env.NEXT_PUBLIC_Flask_URL +"/images", {
// method: "GET",
// });
const data = await response.json(); const data = await response.json();
// console.log(data);
// Flask
// console.log(data.files);
// setData(data.files);
// Strapi
console.log(data.data); console.log(data.data);
// console.log(data.data[0].image.url); // console.log(data.data[0].image.url);
setData(data.data); setData(data.data);

View File

@ -26,7 +26,7 @@
.main-image{ .main-image{
width: 100%; width: 100%;
max-height: 800px; max-height: 800px;
cursor: pointer; /* cursor: pointer; */
position: relative; position: relative;
} }
} }

View File

@ -14,13 +14,20 @@ const ProductPage = ({ productId }: any) => {
// console.log(productId); // console.log(productId);
const [selectedImage, setSelectedImage] = useState(0); const [selectedImage, setSelectedImage] = useState(0);
const [quantity, setQuantity] = useState(1); const [quantity, setQuantity] = useState(1);
const [isSelected, setIsSelected] = useState(false);
const [imageClass, setImageClass] = useState('cursor-zoom-in');
const images = [
"https://ih1.redbubble.net/image.2997405810.0746/ssrco,slim_fit_t_shirt,womens,101010:01c5ca27c6,front,square_product,600x600.jpg", // Set product variables
"https://ih1.redbubble.net/image.2997405810.0746/ssrco,slim_fit_t_shirt,flatlay,101010:01c5ca27c6,front,wide_portrait,750x1000-bg,f8f8f8.jpg",
];
const [data, setData] = useState([]); const [data, setData] = useState([]);
const [product, setProduct] = useState(''); const [product, setProduct] = useState('');
const [name, setName] = useState('');
const [desc, setDesc] = useState('');
const [price, setPrice] = useState(0);
const [sale, setSale] = useState(false);
const [salePrice, setSalePrice] = useState(0);
const [category, setCategory] = useState('');
useEffect(() => { useEffect(() => {
const fetchData = async () => { const fetchData = async () => {
@ -33,16 +40,30 @@ const ProductPage = ({ productId }: any) => {
const res = await request.json(); const res = await request.json();
// console.log(res.data); // console.log(res.data);
console.log(res.data[1].image.url); console.log(res.data[1].image.url);
setData(res.data); setData(res.data);
// Set product variables
setProduct(res.data[parseInt(productId)]?.image?.url); setProduct(res.data[parseInt(productId)]?.image?.url);
setName(res.data[parseInt(productId)]?.title);
setDesc(res.data[parseInt(productId)]?.desc);
setPrice(res.data[parseInt(productId)]?.price);
setSale(res.data[parseInt(productId)]?.sale);
setSalePrice(res.data[parseInt(productId)]?.sale_price);
setCategory(res.data[parseInt(productId)]?.category);
}; };
fetchData(); fetchData();
}, [productId]); }, [productId]);
const handleSelectedImage = () => {
setIsSelected(!isSelected);
setImageClass(isSelected ? 'cursor-zoom-out scale-125' : 'cursor-zoom-in');
};
return ( return (
<div className="product"> <div className="product">
<div className="left"> <div className="left">
<div className="images"> {/* <div className="images">
<div className="product-image"> <div className="product-image">
<Image <Image
src={`${process.env.NEXT_PUBLIC_UPLOAD_URL+product}`} src={`${process.env.NEXT_PUBLIC_UPLOAD_URL+product}`}
@ -52,46 +73,30 @@ const ProductPage = ({ productId }: any) => {
style={{ objectFit: "cover" }} style={{ objectFit: "cover" }}
onClick={(e) => setSelectedImage(0)} onClick={(e) => setSelectedImage(0)}
/> />
{/* <Image
src={images[0]}
fill
className=""
alt="Shirt Mockup"
style={{ objectFit: "cover" }}
onClick={(e) => setSelectedImage(0)}
/> */}
</div> </div>
<div className="product-image"> <div className="product-image">
{/* <Image
src={images[1]}
fill
className=""
alt="Shirt Mockup"
style={{ objectFit: "cover" }}
onClick={(e) => setSelectedImage(1)}
/> */}
</div> </div>
</div> </div> */}
<div className="mainImage"> <div className="mainImage">
<div className="main-image"> <div className={`main-image ${imageClass}`}>
<Image <Image
src={data[selectedImage]} src={`${process.env.NEXT_PUBLIC_UPLOAD_URL+product}`}
fill fill
className="" className=""
style={{ objectFit: "cover" }} style={{ objectFit: "contain" }}
alt="Profile picture" alt="Profile picture"
onClick={handleSelectedImage}
/> />
</div> </div>
</div> </div>
</div> </div>
<div className="right"> <div className="right">
<h1 className="font-bold text-3xl">Title</h1> <h1 className="font-bold text-3xl">{name}</h1>
<span className="price text-[#F45B1E]">$199</span> <span className="price text-[#F45B1E]">${price}</span>
<p> <p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Modi, culpa {desc}
temporibus. Blanditiis, perferendis tempore praesentium voluptatibus
et, consectetur similique natus facilis reiciendis eum pariatur rem
vitae est aliquid, debitis corporis.
</p> </p>
<div className="quantity"> <div className="quantity">
{/* If quantity is at 1 then it stays at 1, otherwise it will subtract by 1 */} {/* If quantity is at 1 then it stays at 1, otherwise it will subtract by 1 */}

View File

@ -34,6 +34,18 @@ const MenuCard = ({ Menu }: any) => {
> >
<div className="w-full h-[75%]"> <div className="w-full h-[75%]">
<div className="h-full relative w-full"> <div className="h-full relative w-full">
{/* Flask */}
{/* <Image
src={`${process.env.NEXT_PUBLIC_Flask_URL}/uploads/${menu_item}`}
alt="product photo"
fill
style={{ objectFit: "cover", objectPosition: "center" }}
quality={75}
sizes="(max-width: 325px) 100vw, (max-width: 1200px) 50vw, 33vw"
className="flex"
onClick={() => router.push(`/products/${menu_item.id}`)}
/> */}
{/* Strapi */}
<Image <Image
src={`${process.env.NEXT_PUBLIC_UPLOAD_URL+menu_item?.image?.url}`} src={`${process.env.NEXT_PUBLIC_UPLOAD_URL+menu_item?.image?.url}`}
alt="product photo" alt="product photo"