From 6630045f6758380d14d8364f1462251fd3908cbe Mon Sep 17 00:00:00 2001 From: dvirlabs Date: Mon, 4 May 2026 01:01:36 +0300 Subject: [PATCH] Work --- QUICKSTART.md | 2 +- README.md | 2 +- .../routers/__pycache__/auth.cpython-314.pyc | Bin 3639 -> 7083 bytes .../__pycache__/products.cpython-314.pyc | Bin 11345 -> 12582 bytes backend/app/routers/auth.py | 66 +++- backend/app/routers/products.py | 27 +- .../__pycache__/product.cpython-314.pyc | Bin 5434 -> 5794 bytes backend/app/services/product.py | 7 +- frontend/.env.example | 2 +- frontend/index.html | 2 +- frontend/src/components/AddToCartModal.jsx | 36 ++ frontend/src/components/Footer.jsx | 18 +- frontend/src/components/Modal.jsx | 22 ++ frontend/src/components/Navbar.jsx | 21 +- frontend/src/components/Toast.jsx | 25 ++ frontend/src/pages/About.jsx | 4 +- frontend/src/pages/Admin.jsx | 72 ++-- frontend/src/pages/Cart.jsx | 14 +- frontend/src/pages/Checkout.jsx | 198 +++++++++- frontend/src/pages/Contact.jsx | 56 ++- frontend/src/pages/Home.jsx | 2 +- frontend/src/pages/Login.jsx | 83 +++- frontend/src/pages/Models.jsx | 20 +- frontend/src/pages/ProductDetail.jsx | 10 +- frontend/src/pages/Profile.jsx | 14 +- frontend/src/pages/Register.jsx | 27 +- frontend/src/styles/global.css | 354 ++++++++++++++++++ 27 files changed, 961 insertions(+), 123 deletions(-) create mode 100644 frontend/src/components/AddToCartModal.jsx create mode 100644 frontend/src/components/Modal.jsx create mode 100644 frontend/src/components/Toast.jsx diff --git a/QUICKSTART.md b/QUICKSTART.md index 0f563e6..bdaa403 100644 --- a/QUICKSTART.md +++ b/QUICKSTART.md @@ -163,7 +163,7 @@ FRONTEND_URL=http://localhost:5173 ``` VITE_API_URL=http://localhost:8000/api -VITE_APP_NAME=StyleHub +VITE_APP_NAME=Brand Master ``` ## Common Commands diff --git a/README.md b/README.md index 2ebcacf..f349625 100644 --- a/README.md +++ b/README.md @@ -129,7 +129,7 @@ cp .env.example .env Edit `.env`: ``` VITE_API_URL=http://localhost:8000/api -VITE_APP_NAME=StyleHub +VITE_APP_NAME=Brand Master ``` ### 3. Run Development Server diff --git a/backend/app/routers/__pycache__/auth.cpython-314.pyc b/backend/app/routers/__pycache__/auth.cpython-314.pyc index 4fe2a58304bbcfc8653853af801f4ade695e0759..e69393984791a46c36c4518043a0d6dcbf2a3b8e 100644 GIT binary patch literal 7083 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 z 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 WT}>fPcTF9jO(ltyR6R-fy?+C?9m$CR delta 1951 zcma)7TWlLe6y34+Kld900YejD1ke6c9Jy+=E?xs;NqAq#l8lfhHt9m$lkudzwl^)>BDcL6DJ|P_ zTCo*wiy1ZTvwdmJ*1CjjQ&w&fvPz3k3YCbhXH~F#XxaX(2D;95BkKp<;Cdh%06hqL zGGqs{k!%ReFoqyOC@aNy&R3ONnP!Y3pdG|NzIWi&6{+A;%<&SQ!Lpgr3Tg#V1G(| zp(gZubEQ&JrGC)a9=YpOCny#coNz}s-Gj^g7fpL=j#dlvdE26Ka4ER(CWs|rt4T0| zE9vF*_4DigPIgWHinOsog)Zt4=BXX6_U%-$KqKHyiWC8$Q4|OouQEw!3+NUB(aSfc ztr$bG7Xt$zmV_OFkk`p0E^qAL;`1%bo$p+}t2`J=^Wa`W+u(z|2Sj}|p#M~0;m8O( zDQX<^ZqK-ntpwT@;{xq~#Yu@G6uc~odpn+D!I5T))UuNvekhs%w}r_Q2^XdC6DUnh zFW_POAm`==$v2wy|*N!fSxlE|5wMNEbz~i=qs<{~JIysiojjdeqk2-)SOAVKt6eDCTXqJ-oR> z!IAUTa=Be_Y0bjM*cbFgwxRED=6w*zQ!{6q^;V!mEb2EQ@kjno&NqtWz&L^W zmCw%=;1joC>4|H{4*DN=&)zbIN!#tuj10MeWuF7i8Rq4DX}(}i%~vebhWZhD zgdPOpNJZN$TaE%Na<)zBA&eXbkyLi?j~++wQI-l0)K2J@+c@C}s|Hu$gyGP;sXqL; zhB@!tW^_ESY1x+{#Qa|9^ARl1kqc(Y1R$^u$ikt;7NSQ%SV)INqDHrXyR=cn82dUr z1i3cCS9VF|HfR_#AeEm2IED^hqWk!O`P@1oHVQur%RqAZi2Mk}4P^_bTV6ihImD;C z2i*Do___PoFmbF-4hLlj`PR==~aBu zabmDnqMdA8jj)e(%`+aZu@$<3^d)`IvQ@0)$|kfxsrUg*(==Bp&>qO^Le&dey}LQh z8z@?M2z>fnMh7i3NAt7wi?HZf2y?V5pez}}AF8&ZF00pD*40+_YHUIds*()EU5&M; z-oRbLPQbcU%9Zl7W_cl1rDe_lN6XF4rOH*fXUlzKB=%RVb&)d}iQ&lh!d$U((f#w_ zFJv6tZle#OHiBXd1=d7gLV?enTevz5$>&SvNty*8KB(3a5L;eC$ZtaLrtre1FuW=B g?8s4aa65$$>b5GkljiLv9YlvhLOaoVC-A)g0ut$&1poj5 diff --git a/backend/app/services/product.py b/backend/app/services/product.py index 731aeed..6581b5f 100644 --- a/backend/app/services/product.py +++ b/backend/app/services/product.py @@ -1,4 +1,4 @@ -from sqlalchemy.orm import Session +from sqlalchemy.orm import Session, joinedload from app.models import Product, Category from app.schemas.product import ProductCreate, ProductUpdate from typing import List, Optional @@ -13,7 +13,7 @@ def get_products( skip: int = 0, limit: int = 10, ) -> List[Product]: - query = db.query(Product) + query = db.query(Product).options(joinedload(Product.model)) if category_id: query = query.filter(Product.category_id == category_id) @@ -28,7 +28,7 @@ def get_products( def get_product_by_id(db: Session, product_id: int) -> Optional[Product]: - return db.query(Product).filter(Product.id == product_id).first() + return db.query(Product).options(joinedload(Product.model)).filter(Product.id == product_id).first() def create_product(db: Session, product: ProductCreate) -> Product: @@ -67,6 +67,7 @@ def delete_product(db: Session, product_id: int) -> bool: def search_products(db: Session, query: str, skip: int = 0, limit: int = 10) -> List[Product]: return ( db.query(Product) + .options(joinedload(Product.model)) .filter( Product.name.ilike(f"%{query}%") | Product.brand.ilike(f"%{query}%") ) diff --git a/frontend/.env.example b/frontend/.env.example index 63f5530..bed298e 100644 --- a/frontend/.env.example +++ b/frontend/.env.example @@ -1,2 +1,2 @@ VITE_API_URL=http://localhost:8000/api -VITE_APP_NAME=StyleHub +VITE_APP_NAME=Brand Master diff --git a/frontend/index.html b/frontend/index.html index 3b7d53e..ee35a87 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -4,7 +4,7 @@ - StyleHub - Fashion & Shoe Store + Brand Master - Fashion & Shoe Store
diff --git a/frontend/src/components/AddToCartModal.jsx b/frontend/src/components/AddToCartModal.jsx new file mode 100644 index 0000000..4b43c51 --- /dev/null +++ b/frontend/src/components/AddToCartModal.jsx @@ -0,0 +1,36 @@ +import React from 'react' +import { useNavigate } from 'react-router-dom' +import '../styles/global.css' + +export default function AddToCartModal({ isOpen, onClose, productName }) { + const navigate = useNavigate() + + if (!isOpen) return null + + const handleGoToCart = () => { + navigate('/cart') + onClose() + } + + const handleContinueShopping = () => { + onClose() + } + + return ( +
+
e.stopPropagation()}> +
+

Added to Cart!

+

{productName} has been added to your cart

+
+ + +
+
+
+ ) +} diff --git a/frontend/src/components/Footer.jsx b/frontend/src/components/Footer.jsx index 6037da6..5581b59 100644 --- a/frontend/src/components/Footer.jsx +++ b/frontend/src/components/Footer.jsx @@ -7,13 +7,14 @@ export default function Footer() {
-

StyleHub

+
+ 👟 +

Brand Master

+

Your ultimate destination for fashion and footwear.

- f - 𝕏 - 📷 - in + 📷 + 💬
@@ -40,14 +41,13 @@ export default function Footer() {

Contact

-

Email: info@stylehub.com

-

Phone: +1 (555) 123-4567

-

Address: 123 Fashion St, NY 10001

+

Email: info@brandmaster.com

+

Phone: +972 53-244-1361

-

© 2024 StyleHub. All rights reserved.

+

© 2026 Brand Master. All rights reserved.

) diff --git a/frontend/src/components/Modal.jsx b/frontend/src/components/Modal.jsx new file mode 100644 index 0000000..890351f --- /dev/null +++ b/frontend/src/components/Modal.jsx @@ -0,0 +1,22 @@ +import React from 'react' +import '../styles/global.css' + +export default function Modal({ isOpen, onClose, children, title }) { + if (!isOpen) return null + + return ( +
+
e.stopPropagation()}> + {title && ( +
+

{title}

+ +
+ )} +
{children}
+
+
+ ) +} diff --git a/frontend/src/components/Navbar.jsx b/frontend/src/components/Navbar.jsx index cf91dc3..a225ff5 100644 --- a/frontend/src/components/Navbar.jsx +++ b/frontend/src/components/Navbar.jsx @@ -1,5 +1,5 @@ import React, { useContext } from 'react' -import { Link, useNavigate } from 'react-router-dom' +import { Link, useNavigate, useLocation } from 'react-router-dom' import { AuthContext } from '../context/AuthContext' import { CartContext } from '../context/CartContext' import SearchBar from './SearchBar' @@ -9,17 +9,22 @@ export default function Navbar() { const { user, token, logout } = useContext(AuthContext) const { cart } = useContext(CartContext) const navigate = useNavigate() + const location = useLocation() const handleLogout = () => { logout() navigate('/') } + const isActive = (path) => { + return location.pathname === path ? 'active' : '' + } + return (