Repository: ShariqAnsari88/shoe-store-frontend Branch: main Commit: c5405a37a753 Files: 33 Total size: 64.7 KB Directory structure: gitextract_oskfoxu2/ ├── .eslintrc.json ├── .gitignore ├── README.md ├── components/ │ ├── CartItem.jsx │ ├── Footer.jsx │ ├── Header.jsx │ ├── HeroBanner.jsx │ ├── Menu.jsx │ ├── MenuMobile.jsx │ ├── ProductCard.jsx │ ├── ProductDetailsCarousel.jsx │ ├── RelatedProducts.jsx │ └── Wrapper.jsx ├── jsconfig.json ├── next.config.js ├── package.json ├── pages/ │ ├── _app.js │ ├── _document.js │ ├── api/ │ │ └── hello.js │ ├── cart.js │ ├── category/ │ │ └── [slug].js │ ├── failed.js │ ├── index.js │ ├── product/ │ │ └── [slug].js │ └── success.js ├── postcss.config.js ├── store/ │ ├── cartSlice.js │ └── store.js ├── styles/ │ └── globals.css ├── tailwind.config.js └── utils/ ├── api.js ├── helper.js └── urls.js ================================================ FILE CONTENTS ================================================ ================================================ FILE: .eslintrc.json ================================================ { "extends": "next/core-web-vitals", "rules": { "react/no-unescaped-entities": "off", "@next/next/no-page-custom-font": "off" } } ================================================ FILE: .gitignore ================================================ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. # dependencies /node_modules /.pnp .pnp.js # testing /coverage # next.js /.next/ /out/ # production /build # misc .DS_Store *.pem # debug npm-debug.log* yarn-debug.log* yarn-error.log* .pnpm-debug.log* # local env files .env*.local .env # vercel .vercel ================================================ FILE: README.md ================================================ This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). ## Getting Started First, run the development server: ```bash npm run dev # or yarn dev # or pnpm dev ``` Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. You can start editing the page by modifying `pages/index.js`. The page auto-updates as you edit the file. [API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.js`. The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages. This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. ## Learn More To learn more about Next.js, take a look at the following resources: - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! ## Deploy on Vercel The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. ================================================ FILE: components/CartItem.jsx ================================================ import Image from "next/image"; import React from "react"; import { RiDeleteBin6Line } from "react-icons/ri"; import { updateCart, removeFromCart } from "@/store/cartSlice"; import { useDispatch } from "react-redux"; const CartItem = ({ data }) => { const p = data.attributes; const dispatch = useDispatch(); const updateCartItem = (e, key) => { let payload = { key, val: key === "quantity" ? parseInt(e.target.value) : e.target.value, id: data.id, }; dispatch(updateCart(payload)); }; return (
{/* IMAGE START */}
{p.name}
{/* IMAGE END */}
{/* PRODUCT TITLE */}
{p.name}
{/* PRODUCT SUBTITLE */}
{p.subtitle}
{/* PRODUCT PRICE */}
MRP : ₹{p.price}
{/* PRODUCT SUBTITLE */}
{p.subtitle}
Size:
Quantity:
dispatch(removeFromCart({ id: data.id })) } className="cursor-pointer text-black/[0.5] hover:text-black text-[16px] md:text-[20px]" />
); }; export default CartItem; ================================================ FILE: components/Footer.jsx ================================================ import Link from "next/link"; import React from "react"; import { FaFacebookF, FaTwitter, FaYoutube, FaInstagram } from "react-icons/fa"; import Wrapper from "./Wrapper"; const Footer = () => { return ( ); }; export default Footer; ================================================ FILE: components/Header.jsx ================================================ import React, { useState, useEffect } from "react"; import Wrapper from "./Wrapper"; import Link from "next/link"; import Menu from "./Menu"; import MenuMobile from "./MenuMobile"; import { IoMdHeartEmpty } from "react-icons/io"; import { BsCart } from "react-icons/bs"; import { BiMenuAltRight } from "react-icons/bi"; import { VscChromeClose } from "react-icons/vsc"; import { fetchDataFromApi } from "@/utils/api"; import { useSelector } from "react-redux"; const Header = () => { const [mobileMenu, setMobileMenu] = useState(false); const [showCatMenu, setShowCatMenu] = useState(false); const [show, setShow] = useState("translate-y-0"); const [lastScrollY, setLastScrollY] = useState(0); const [categories, setCategories] = useState(null); const { cartItems } = useSelector((state) => state.cart); const controlNavbar = () => { if (window.scrollY > 200) { if (window.scrollY > lastScrollY && !mobileMenu) { setShow("-translate-y-[80px]"); } else { setShow("shadow-sm"); } } else { setShow("translate-y-0"); } setLastScrollY(window.scrollY); }; useEffect(() => { window.addEventListener("scroll", controlNavbar); return () => { window.removeEventListener("scroll", controlNavbar); }; }, [lastScrollY]); useEffect(() => { fetchCategories(); }, []); const fetchCategories = async () => { const { data } = await fetchDataFromApi("/api/categories?populate=*"); setCategories(data); }; return (
{mobileMenu && ( )}
{/* Icon start */}
51
{/* Icon end */} {/* Icon start */}
{cartItems.length > 0 && (
{cartItems.length}
)}
{/* Icon end */} {/* Mobile icon start */}
{mobileMenu ? ( setMobileMenu(false)} /> ) : ( setMobileMenu(true)} /> )}
{/* Mobile icon end */}
); }; export default Header; ================================================ FILE: components/HeroBanner.jsx ================================================ import React from "react"; import "react-responsive-carousel/lib/styles/carousel.min.css"; // requires a loader import { Carousel } from "react-responsive-carousel"; import { BiArrowBack } from "react-icons/bi"; const HeroBanner = () => { return (
(
)} renderArrowNext={(clickHandler, hasNext) => (
)} >
Shop now
Shop now
Shop now
); }; export default HeroBanner; ================================================ FILE: components/Menu.jsx ================================================ import React from "react"; import Link from "next/link"; import { BsChevronDown } from "react-icons/bs"; const data = [ { id: 1, name: "Home", url: "/" }, { id: 2, name: "About", url: "/about" }, { id: 3, name: "Categories", subMenu: true }, { id: 4, name: "Contact", url: "/contact" }, ]; const subMenuData = [ { id: 1, name: "Jordan", doc_count: 11 }, { id: 2, name: "Sneakers", doc_count: 8 }, { id: 3, name: "Running shoes", doc_count: 64 }, { id: 4, name: "Football shoes", doc_count: 107 }, ]; const Menu = ({ showCatMenu, setShowCatMenu, categories }) => { return ( ); }; export default Menu; ================================================ FILE: components/MenuMobile.jsx ================================================ import React from "react"; import Link from "next/link"; import { BsChevronDown } from "react-icons/bs"; const data = [ { id: 1, name: "Home", url: "/" }, { id: 2, name: "About", url: "/about" }, { id: 3, name: "Categories", subMenu: true }, { id: 4, name: "Contact", url: "/contact" }, ]; const subMenuData = [ { id: 1, name: "Jordan", doc_count: 11 }, { id: 2, name: "Sneakers", doc_count: 8 }, { id: 3, name: "Running shoes", doc_count: 64 }, { id: 4, name: "Football shoes", doc_count: 107 }, ]; const MenuMobile = ({ showCatMenu, setShowCatMenu, setMobileMenu, categories, }) => { return ( ); }; export default MenuMobile; ================================================ FILE: components/ProductCard.jsx ================================================ import { getDiscountedPricePercentage } from "@/utils/helper"; import Image from "next/image"; import Link from "next/link"; import React from "react"; const ProductCard = ({ data: { attributes: p, id } }) => { return ( {p.name}

{p.name}

₹{p.price}

{p.original_price && ( <>

₹{p.original_price}

{getDiscountedPricePercentage( p.original_price, p.price )} % off

)}
); }; export default ProductCard; ================================================ FILE: components/ProductDetailsCarousel.jsx ================================================ import React from "react"; import "react-responsive-carousel/lib/styles/carousel.min.css"; // requires a loader import { Carousel } from "react-responsive-carousel"; const ProductDetailsCarousel = ({ images }) => { return (
{images?.map((img) => ( {img.attributes.name} ))} {/* */}
); }; export default ProductDetailsCarousel; ================================================ FILE: components/RelatedProducts.jsx ================================================ import React from "react"; import Carousel from "react-multi-carousel"; import "react-multi-carousel/lib/styles.css"; import ProductCard from "./ProductCard"; const RelatedProducts = ({ products }) => { const responsive = { desktop: { breakpoint: { max: 3000, min: 1024 }, items: 3, }, tablet: { breakpoint: { max: 1023, min: 464 }, items: 2, }, mobile: { breakpoint: { max: 767, min: 0 }, items: 1, }, }; return (
You Might Also Like
{products?.data?.map((product) => ( ))}
); }; export default RelatedProducts; ================================================ FILE: components/Wrapper.jsx ================================================ import React from "react"; const Wrapper = ({ children, className }) => { return (
{children}
); }; export default Wrapper; ================================================ FILE: jsconfig.json ================================================ { "compilerOptions": { "paths": { "@/*": ["./*"] } } } ================================================ FILE: next.config.js ================================================ /** @type {import('next').NextConfig} */ const nextConfig = { reactStrictMode: true, eslint: { ignoreDuringBuilds: true, }, images: { domains: ["res.cloudinary.com"], }, }; module.exports = nextConfig; ================================================ FILE: package.json ================================================ { "name": "frontend", "version": "0.1.0", "private": true, "scripts": { "dev": "next dev", "build": "next build", "start": "next start", "lint": "next lint" }, "dependencies": { "@next/font": "13.1.6", "@reduxjs/toolkit": "^1.9.3", "@stripe/react-stripe-js": "^1.16.5", "@stripe/stripe-js": "^1.48.0", "eslint": "8.34.0", "eslint-config-next": "13.1.6", "next": "13.1.6", "react": "18.2.0", "react-dom": "18.2.0", "react-icons": "^4.7.1", "react-markdown": "^8.0.5", "react-multi-carousel": "^2.8.2", "react-redux": "^8.0.5", "react-responsive-carousel": "^3.2.23", "react-toastify": "^9.1.1", "swr": "^2.1.0" }, "devDependencies": { "autoprefixer": "^10.4.14", "postcss": "^8.4.21", "tailwindcss": "^3.2.7" } } ================================================ FILE: pages/_app.js ================================================ import "@/styles/globals.css"; import Head from "next/head"; import Header from "@/components/Header"; import Footer from "@/components/Footer"; import { Provider } from "react-redux"; import store from "@/store/store"; export default function App({ Component, pageProps }) { return ( <> Online Shoe Store | JS Dev Hindi