├── public ├── robots.txt ├── favicon.png ├── assets │ └── img │ │ ├── logo.png │ │ ├── favicon.png │ │ ├── loading.gif │ │ ├── bg │ │ ├── shape-2.png │ │ ├── shape.png │ │ ├── footer-bg.jpg │ │ ├── medicine-bg.jpg │ │ ├── newsletter-bg.jpg │ │ ├── testimonial-bg-2.jpg │ │ └── testimonial-bg-3.jpg │ │ ├── icon-img │ │ ├── 2.png │ │ ├── 13.png │ │ ├── 14.png │ │ ├── cart.png │ │ ├── play.png │ │ ├── select.png │ │ ├── snow1.png │ │ ├── payment.png │ │ ├── suscribe.png │ │ ├── support-1.png │ │ ├── support-10.png │ │ ├── support-11.png │ │ ├── support-12.png │ │ ├── support-13.png │ │ ├── support-14.png │ │ ├── support-15.png │ │ ├── support-2.png │ │ ├── support-3.png │ │ ├── support-4.png │ │ ├── support-5.png │ │ ├── support-6.png │ │ ├── support-7.png │ │ ├── support-8.png │ │ ├── support-9.png │ │ ├── slider-shape.png │ │ ├── medical-contact.png │ │ └── medical-contact-shape.png │ │ ├── logo │ │ ├── logo-1.png │ │ ├── logo-2.1.png │ │ ├── payment-logo.png │ │ ├── payment-accept.png │ │ └── logo-for-website-2.png │ │ ├── slider │ │ ├── asus-rog.png │ │ └── Apple-Watch-with-macbook-.png │ │ └── brand-logo │ │ ├── app-store.png │ │ ├── apps-google.png │ │ └── google-play.png ├── .htaccess ├── manifest.json └── index.html ├── src ├── components │ ├── homemodal.png │ ├── alert │ │ └── Alert.js │ ├── admin │ │ ├── Dashboard.jsx │ │ ├── HeaderNav.jsx │ │ ├── Sidebar.jsx │ │ ├── Product.jsx │ │ └── OrderList.jsx │ ├── Loader │ │ └── Loader.js │ ├── header │ │ ├── sub-components │ │ │ ├── MobileSearch.js │ │ │ ├── MobileWidgets.js │ │ │ ├── HeaderSocial.js │ │ │ ├── LanguageCurrencyChanger.js │ │ │ └── MobileLangCurrChange.js │ │ ├── Logo.js │ │ ├── OffcanvasMenu.js │ │ ├── HeaderTop.js │ │ └── MobileMenu.js │ ├── product │ │ ├── ShopSearch.js │ │ ├── sub-components │ │ │ └── ProductRating.js │ │ ├── ProductImageFixed.js │ │ ├── ShopTag.js │ │ ├── ProductImageGallerySticky.js │ │ ├── ShopColor.js │ │ ├── ShopTopActionFilter.js │ │ ├── ShopCategories.js │ │ ├── ShopSize.js │ │ ├── ProductImageGallerySlider.js │ │ └── ShopTopAction.js │ ├── text-grid │ │ └── TextGridOneSingle.js │ ├── image-slider │ │ └── ImageSliderOneSingle.js │ ├── brand-logo │ │ └── BrandLogoOneSingle.js │ ├── feature-icon │ │ └── FeatureIconSingle.js │ ├── category │ │ └── CategoryOneSingle.js │ ├── section-title │ │ ├── SectionTitle.js │ │ └── SectionTitleWithText.js │ ├── footer │ │ ├── FooterCopyright.js │ │ ├── FooterNewsletter.js │ │ └── sub-components │ │ │ ├── SocialLinks.js │ │ │ └── SubscribeEmail.js │ ├── contact │ │ ├── LocationMap.js │ │ └── MedicalContact.js │ ├── banner │ │ └── BannerOneSingle.js │ ├── HomeModal.js │ ├── hero-slider │ │ └── HeroSliderOneSingle.js │ └── newsletter │ │ ├── SubscribeEmail.js │ │ └── SubscribeEmailTwo.js ├── assets │ ├── fonts │ │ ├── FontAwesome.otf │ │ ├── Pe-icon-7-stroke.eot │ │ ├── Pe-icon-7-stroke.ttf │ │ ├── Pe-icon-7-stroke.woff │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ └── fontawesome-webfont.woff2 │ └── scss │ │ ├── _image-slider.scss │ │ ├── _brand-logo.scss │ │ ├── style.scss │ │ ├── _variables.scss │ │ ├── _breadcrumb.scss │ │ ├── _preloader.scss │ │ ├── _helper.scss │ │ └── _404.scss ├── data │ ├── form │ │ ├── division.js │ │ └── districts.js │ ├── hero-sliders │ │ ├── hero-slider-thirty.json │ │ ├── hero-slider-thirty-five.json │ │ ├── hero-slider-thirty-four.json │ │ ├── hero-slider-thirty-three.json │ │ ├── hero-slider-fourteen.json │ │ ├── hero-slider-nine.json │ │ ├── hero-slider-seven.json │ │ ├── hero-slider-five.json │ │ ├── hero-slider-one.json │ │ ├── hero-slider-thirty-one.json │ │ ├── hero-slider-twenty.json │ │ ├── hero-slider-two.json │ │ ├── hero-slider-eight.json │ │ ├── hero-slider-six.json │ │ ├── hero-slider-twenty-five.json │ │ ├── hero-slider-eighteen.json │ │ ├── hero-slider-fifteen.json │ │ ├── hero-slider-three.json │ │ ├── hero-slider-nineteen.json │ │ ├── hero-slider-twenty-eight.json │ │ ├── hero-slider-twenty-four.json │ │ ├── hero-slider-twenty-six.json │ │ ├── hero-slider-four.json │ │ ├── hero-slider-twenty-three.json │ │ ├── hero-slider-seventeen.json │ │ ├── hero-slider-twenty-one.json │ │ ├── hero-slider-ten.json │ │ ├── hero-slider-twelve.json │ │ ├── hero-slider-twenty-seven.json │ │ ├── hero-slider-twenty-two.json │ │ ├── hero-slider-thirty-two.json │ │ ├── hero-slider-twenty-nine.json │ │ ├── hero-slider-thirty-six.json │ │ ├── hero-slider-sixteen.json │ │ ├── scroll-slider.json │ │ ├── hero-slider-eleven.json │ │ └── hero-slider-thirteen.json │ ├── feature-icons │ │ ├── feature-icon-six.json │ │ ├── feature-icon-five.json │ │ ├── feature-icon-eight.json │ │ ├── feature-icon-three.json │ │ ├── feature-icon-two.json │ │ ├── feature-icon-seven.json │ │ ├── feature-icon.json │ │ ├── feature-icon-four.json │ │ └── feature-icon-nine.json │ ├── brand-logos │ │ └── brand-logo-one.json │ ├── category │ │ ├── category-five.json │ │ ├── category-one.json │ │ ├── category-four.json │ │ └── category-two.json │ ├── banner │ │ └── banner-one.json │ ├── image-slider │ │ ├── image-slider-one.json │ │ └── image-slider-two.json │ └── text-grid │ │ └── text-grid-one.json ├── helpers │ ├── scroll-top.js │ └── shippingPrice.js ├── pages │ ├── admin │ │ ├── AdminBlog.jsx │ │ ├── AdminOrderList.jsx │ │ ├── AdminUsers.jsx │ │ ├── AdminProduct.jsx │ │ └── AdminDashboard.jsx │ ├── other │ │ ├── About.js │ │ └── ActivateAccount.js │ ├── home │ │ └── HomeScreen.js │ └── shop-product │ │ ├── ProductSlider.js │ │ ├── ProductSticky.js │ │ ├── ProductTabLeft.js │ │ ├── ProductTabRight.js │ │ └── ProductFixedImage.js ├── wrappers │ ├── product │ │ ├── ShopProducts.js │ │ ├── ShopTopbar.js │ │ ├── ProductGridSixContainer.js │ │ ├── ProductGridFiveContainer.js │ │ ├── ShopTopbarFilter.js │ │ ├── NewProductGrid.js │ │ ├── ShopSidebar.js │ │ ├── ProductSliderFive.js │ │ ├── RelatedProductSlider.js │ │ ├── ProductSliderTwo.js │ │ ├── ProductSlider.js │ │ ├── NewProductSlider.js │ │ ├── ProductSliderSix.js │ │ ├── ProductSliderFour.js │ │ └── ProductSliderThree.js │ ├── breadcrumb │ │ └── Breadcrumb.js │ ├── slider-banner │ │ └── SliderBanner.js │ ├── text-grid │ │ └── TextGridOne.js │ ├── cta │ │ └── CtaOne.js │ ├── feature-icon │ │ └── FeatureIcon.js │ ├── banner │ │ └── BannerOne.js │ ├── image-slider │ │ ├── ImageSliderOne.js │ │ └── ImageSliderTwo.js │ ├── newsletter │ │ └── Newsletter.js │ ├── category │ │ └── CategoryOneSlider.js │ ├── hero-slider │ │ └── HeroSliderOne.js │ └── brand-logo │ │ └── BrandLogoSliderOne.js ├── redux │ ├── actions │ │ ├── currencyActions.js │ │ ├── compareActions.js │ │ ├── wishlistActions.js │ │ └── cartActions.js │ ├── reducers │ │ ├── compareReducer.js │ │ ├── currencyReducer.js │ │ ├── wishlistReducer.js │ │ └── rootReducer.js │ └── constants │ │ ├── orderConstants.js │ │ ├── productConstants.js │ │ └── userConstants.js ├── layouts │ ├── LayoutAdmin.jsx │ └── LayoutOne.js └── index.js ├── .gitignore └── package.json /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | -------------------------------------------------------------------------------- /public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/favicon.png -------------------------------------------------------------------------------- /public/assets/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/logo.png -------------------------------------------------------------------------------- /public/assets/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/favicon.png -------------------------------------------------------------------------------- /public/assets/img/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/loading.gif -------------------------------------------------------------------------------- /src/components/homemodal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/src/components/homemodal.png -------------------------------------------------------------------------------- /public/assets/img/bg/shape-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/bg/shape-2.png -------------------------------------------------------------------------------- /public/assets/img/bg/shape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/bg/shape.png -------------------------------------------------------------------------------- /public/assets/img/icon-img/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/icon-img/2.png -------------------------------------------------------------------------------- /src/assets/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/src/assets/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /public/assets/img/bg/footer-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/bg/footer-bg.jpg -------------------------------------------------------------------------------- /public/assets/img/icon-img/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/icon-img/13.png -------------------------------------------------------------------------------- /public/assets/img/icon-img/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/icon-img/14.png -------------------------------------------------------------------------------- /public/assets/img/logo/logo-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/logo/logo-1.png -------------------------------------------------------------------------------- /public/assets/img/bg/medicine-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/bg/medicine-bg.jpg -------------------------------------------------------------------------------- /public/assets/img/icon-img/cart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/icon-img/cart.png -------------------------------------------------------------------------------- /public/assets/img/icon-img/play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/icon-img/play.png -------------------------------------------------------------------------------- /public/assets/img/icon-img/select.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/icon-img/select.png -------------------------------------------------------------------------------- /public/assets/img/icon-img/snow1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/icon-img/snow1.png -------------------------------------------------------------------------------- /public/assets/img/logo/logo-2.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/logo/logo-2.1.png -------------------------------------------------------------------------------- /public/assets/img/slider/asus-rog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/slider/asus-rog.png -------------------------------------------------------------------------------- /src/assets/fonts/Pe-icon-7-stroke.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/src/assets/fonts/Pe-icon-7-stroke.eot -------------------------------------------------------------------------------- /src/assets/fonts/Pe-icon-7-stroke.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/src/assets/fonts/Pe-icon-7-stroke.ttf -------------------------------------------------------------------------------- /public/.htaccess: -------------------------------------------------------------------------------- 1 | Options -MultiViews 2 | RewriteEngine On 3 | RewriteCond %{REQUEST_FILENAME} !-f 4 | RewriteRule ^ index.html [QSA,L] -------------------------------------------------------------------------------- /public/assets/img/bg/newsletter-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/bg/newsletter-bg.jpg -------------------------------------------------------------------------------- /public/assets/img/icon-img/payment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/icon-img/payment.png -------------------------------------------------------------------------------- /public/assets/img/icon-img/suscribe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/icon-img/suscribe.png -------------------------------------------------------------------------------- /public/assets/img/logo/payment-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/logo/payment-logo.png -------------------------------------------------------------------------------- /src/assets/fonts/Pe-icon-7-stroke.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/src/assets/fonts/Pe-icon-7-stroke.woff -------------------------------------------------------------------------------- /public/assets/img/bg/testimonial-bg-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/bg/testimonial-bg-2.jpg -------------------------------------------------------------------------------- /public/assets/img/bg/testimonial-bg-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/bg/testimonial-bg-3.jpg -------------------------------------------------------------------------------- /public/assets/img/brand-logo/app-store.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/brand-logo/app-store.png -------------------------------------------------------------------------------- /public/assets/img/icon-img/support-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/icon-img/support-1.png -------------------------------------------------------------------------------- /public/assets/img/icon-img/support-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/icon-img/support-10.png -------------------------------------------------------------------------------- /public/assets/img/icon-img/support-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/icon-img/support-11.png -------------------------------------------------------------------------------- /public/assets/img/icon-img/support-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/icon-img/support-12.png -------------------------------------------------------------------------------- /public/assets/img/icon-img/support-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/icon-img/support-13.png -------------------------------------------------------------------------------- /public/assets/img/icon-img/support-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/icon-img/support-14.png -------------------------------------------------------------------------------- /public/assets/img/icon-img/support-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/icon-img/support-15.png -------------------------------------------------------------------------------- /public/assets/img/icon-img/support-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/icon-img/support-2.png -------------------------------------------------------------------------------- /public/assets/img/icon-img/support-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/icon-img/support-3.png -------------------------------------------------------------------------------- /public/assets/img/icon-img/support-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/icon-img/support-4.png -------------------------------------------------------------------------------- /public/assets/img/icon-img/support-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/icon-img/support-5.png -------------------------------------------------------------------------------- /public/assets/img/icon-img/support-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/icon-img/support-6.png -------------------------------------------------------------------------------- /public/assets/img/icon-img/support-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/icon-img/support-7.png -------------------------------------------------------------------------------- /public/assets/img/icon-img/support-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/icon-img/support-8.png -------------------------------------------------------------------------------- /public/assets/img/icon-img/support-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/icon-img/support-9.png -------------------------------------------------------------------------------- /public/assets/img/logo/payment-accept.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/logo/payment-accept.png -------------------------------------------------------------------------------- /src/assets/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/src/assets/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /src/assets/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/src/assets/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /src/assets/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/src/assets/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /src/assets/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/src/assets/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /public/assets/img/brand-logo/apps-google.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/brand-logo/apps-google.png -------------------------------------------------------------------------------- /public/assets/img/brand-logo/google-play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/brand-logo/google-play.png -------------------------------------------------------------------------------- /public/assets/img/icon-img/slider-shape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/icon-img/slider-shape.png -------------------------------------------------------------------------------- /public/assets/img/icon-img/medical-contact.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/icon-img/medical-contact.png -------------------------------------------------------------------------------- /public/assets/img/logo/logo-for-website-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/logo/logo-for-website-2.png -------------------------------------------------------------------------------- /public/assets/img/icon-img/medical-contact-shape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/icon-img/medical-contact-shape.png -------------------------------------------------------------------------------- /public/assets/img/slider/Apple-Watch-with-macbook-.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanvir-Niloy/wonderstech-frontend/HEAD/public/assets/img/slider/Apple-Watch-with-macbook-.png -------------------------------------------------------------------------------- /src/components/alert/Alert.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | const Alert = ({ variant, children }) => { 4 | return
{children}
; 5 | }; 6 | 7 | export default Alert; 8 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "Flone React", 3 | "name": "React Minimalist eCommerce Template", 4 | "start_url": ".", 5 | "display": "standalone", 6 | "theme_color": "#000000", 7 | "background_color": "#ffffff" 8 | } 9 | -------------------------------------------------------------------------------- /src/data/form/division.js: -------------------------------------------------------------------------------- 1 | const divisions = [ 2 | "Dhaka", 3 | "Barishal", 4 | "Chattogram", 5 | "Khulna", 6 | "Mymensingh", 7 | "Rajshahi", 8 | "Rangpur", 9 | "Sylhet", 10 | ]; 11 | 12 | export default divisions; 13 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-thirty.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": 1, 3 | "title": "Made For You", 4 | "subtitle": "On Every Wooden Furniture", 5 | "url": "/shop-grid-standard", 6 | "backgroundImage": "/assets/img/slider/slider-32.jpg" 7 | } 8 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-thirty-five.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": 1, 3 | "title": "Black Friday
Hot Deal!", 4 | "dateTime": "November 13, 2020 12:12:00", 5 | "url": "/shop-grid-standard", 6 | "backgroundImage": "/assets/img/slider/slider-37.jpg" 7 | } 8 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-thirty-four.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": 1, 3 | "title": "Stylish", 4 | "subtitle": "Male Clothes", 5 | "text": "30% off Black Friday", 6 | "url": "/shop-grid-standard", 7 | "backgroundImage": "/assets/img/slider/slider-36.jpg" 8 | } 9 | -------------------------------------------------------------------------------- /src/helpers/scroll-top.js: -------------------------------------------------------------------------------- 1 | import { useEffect } from "react"; 2 | import { withRouter } from "react-router-dom"; 3 | 4 | const ScrollToTop = props => { 5 | useEffect(() => { 6 | window.scrollTo(0, 0); 7 | }); 8 | return props.children; 9 | }; 10 | 11 | export default withRouter(ScrollToTop); 12 | -------------------------------------------------------------------------------- /src/pages/admin/AdminBlog.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import LayoutAdmin from "../../layouts/LayoutAdmin"; 3 | 4 | const AdminBlog = () => { 5 | return ( 6 | 7 |

Admin blog actions

8 |
9 | ); 10 | }; 11 | 12 | export default AdminBlog; 13 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-thirty-three.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": 1, 3 | "title": "Christmas Sale", 4 | "subtitle": "New Year Offer
Collection", 5 | "url": "/shop-grid-standard", 6 | "backgroundImage": "/assets/img/slider/slider-35.jpg", 7 | "image": "/assets/img/slider/single-slider-12.png" 8 | } 9 | -------------------------------------------------------------------------------- /src/assets/scss/_image-slider.scss: -------------------------------------------------------------------------------- 1 | /*----- 12. image slider style -----*/ 2 | 3 | .single-image { 4 | overflow: hidden; 5 | a { 6 | img { 7 | width: 100%; 8 | transition: all 0.5s ease 0s; 9 | transform: scale(1); 10 | } 11 | } 12 | &:hover a img { 13 | transform: scale(1.1); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/components/admin/Dashboard.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Link } from "react-router-dom"; 3 | 4 | const Dashboard = () => { 5 | return ( 6 |
7 |

Welcome to your Dashboard

8 | 9 | Back 10 | 11 |
12 | ); 13 | }; 14 | 15 | export default Dashboard; 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | _gsdata_ -------------------------------------------------------------------------------- /src/components/Loader/Loader.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { RotateSpinner } from "react-spinners-kit"; 3 | 4 | const Loader = () => { 5 | return ( 6 |
14 | 15 |
16 | ); 17 | }; 18 | 19 | export default Loader; 20 | -------------------------------------------------------------------------------- /src/components/header/sub-components/MobileSearch.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | const MobileSearch = () => { 4 | return ( 5 |
6 |
7 | 8 | 11 | 12 |
13 | ); 14 | }; 15 | 16 | export default MobileSearch; 17 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-fourteen.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "Welcome to Flone", 5 | "subtitle": "30% off Summer Vacation", 6 | "image": "/assets/img/slider/slider-5.jpg", 7 | "url": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": 2, 11 | "title": "Smart Products", 12 | "subtitle": "40% off Summer Vacation", 13 | "image": "/assets/img/slider/slider-5-1.jpg", 14 | "url": "/shop-grid-standard" 15 | } 16 | ] 17 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-nine.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "Sale Off 40%", 5 | "subtitle": "Summer Offer
2020 Collection", 6 | "image": "/assets/img/slider/slider-2-2.jpg", 7 | "url": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": 2, 11 | "title": "Sale Off 20%", 12 | "subtitle": "Summer Offer
2020 Collection", 13 | "image": "/assets/img/slider/slider-1.jpg", 14 | "url": "/shop-grid-standard" 15 | } 16 | ] 17 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-seven.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "New Arrivals", 5 | "subtitle": "Book Shop
Find Your Book", 6 | "image": "/assets/img/slider/slider-11.jpg", 7 | "url": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": 2, 11 | "title": "New Arrivals", 12 | "subtitle": "Book Shop
Find Your Book", 13 | "image": "/assets/img/slider/slider-11-2.jpg", 14 | "url": "/shop-grid-standard" 15 | } 16 | ] 17 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-five.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "Natural & Healthy", 5 | "subtitle": "100% Organic Fruits Collection", 6 | "image": "/assets/img/slider/slider-8.jpg", 7 | "url": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": 2, 11 | "title": "Natural & Healthy", 12 | "subtitle": "100% Organic Veg Collection", 13 | "image": "/assets/img/slider/slider-8-2.jpg", 14 | "url": "/shop-grid-standard" 15 | } 16 | ] 17 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-one.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "Wonders Tech", 5 | "subtitle": "Best Smart Gadget Shop", 6 | "image": "/assets/img/slider/asus-rog.png", 7 | "url": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": 2, 11 | "title": "Wonders Tech SmartShop", 12 | "subtitle": "Expore Modern Gadget ", 13 | "image": "/assets/img/slider/Apple-Watch-with-macbook-.png", 14 | "url": "/shop-grid-standard" 15 | } 16 | ] 17 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-thirty-one.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "Smart Products", 5 | "subtitle": "Winter Offer 2020 Collection", 6 | "image": "/assets/img/slider/slider-33.jpg", 7 | "url": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": 2, 11 | "title": "Smart Products", 12 | "subtitle": "Summer Offer 2020 Collection", 13 | "image": "/assets/img/slider/slider-33.jpg", 14 | "url": "/shop-grid-standard" 15 | } 16 | ] 17 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-twenty.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "Natural & Healthy", 5 | "subtitle": "100% Organic Fruits Collection", 6 | "image": "/assets/img/slider/slider-19.jpg", 7 | "url": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": 2, 11 | "title": "Natural & Healthy", 12 | "subtitle": "100% Organic Veg Collection", 13 | "image": "/assets/img/slider/slider-19.jpg", 14 | "url": "/shop-grid-standard" 15 | } 16 | ] 17 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-two.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "Smart Products", 5 | "subtitle": "Winter Offer 2020 Collection", 6 | "image": "/assets/img/slider/single-slide-4.png", 7 | "url": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": 2, 11 | "title": "Smart Products", 12 | "subtitle": "Summer Offer 2020 Collection", 13 | "image": "/assets/img/slider/single-slide-5.png", 14 | "url": "/shop-grid-standard" 15 | } 16 | ] 17 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-eight.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "Cosmetic Best Selling", 5 | "subtitle": "Fashion
Cosmetic", 6 | "image": "/assets/img/slider/hm13-slider-1.jpg", 7 | "url": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": 2, 11 | "title": "Cosmetic Best Selling", 12 | "subtitle": "Fashion
Cosmetic", 13 | "image": "/assets/img/slider/hm13-slider-1.jpg", 14 | "url": "/shop-grid-standard" 15 | } 16 | ] 17 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-six.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "New Arrivals", 5 | "subtitle": "Fresh Your Mind &
Feeling love", 6 | "image": "/assets/img/slider/slider-10.jpg", 7 | "url": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": 2, 11 | "title": "New Arrivals", 12 | "subtitle": "Fresh Your Mind &
Feeling love", 13 | "image": "/assets/img/slider/slider-10-2.jpg", 14 | "url": "/shop-grid-standard" 15 | } 16 | ] 17 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-twenty-five.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "Covid - 19 Collection", 5 | "subtitle": "Medicine & PPE Stay Safe", 6 | "image": "/assets/img/slider/slider-26.jpg", 7 | "url": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": 2, 11 | "title": "Covid - 19 Collection", 12 | "subtitle": "Medicine & PPE Stay Safe", 13 | "image": "/assets/img/slider/slider-27.jpg", 14 | "url": "/shop-grid-standard" 15 | } 16 | ] 17 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-eighteen.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "Enjoy This Offer Today", 5 | "subtitle": "New Collection
Sale 40%", 6 | "image": "/assets/img/slider/slider-16.jpg", 7 | "url": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": 2, 11 | "title": "Enjoy This Offer Today", 12 | "subtitle": "New Collection
Sale 20%", 13 | "image": "/assets/img/slider/slider-16.jpg", 14 | "url": "/shop-grid-standard" 15 | } 16 | ] 17 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-fifteen.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "Enjoy This Offer Today", 5 | "subtitle": "New Collection
Sale 40%", 6 | "image": "/assets/img/slider/slider-12.jpg", 7 | "url": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": 2, 11 | "title": "Enjoy This Offer Today", 12 | "subtitle": "New Collection
Sale 20%", 13 | "image": "/assets/img/slider/slider-12-2.jpg", 14 | "url": "/shop-grid-standard" 15 | } 16 | ] 17 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-three.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "New Arrival", 5 | "subtitle": "New Design
Bluetooth Speaker", 6 | "image": "/assets/img/slider/single-slide-3.png", 7 | "url": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": 2, 11 | "title": "Smart Products", 12 | "subtitle": "Summer Offer
2020 Collection", 13 | "image": "/assets/img/slider/single-slide-6.png", 14 | "url": "/shop-grid-standard" 15 | } 16 | ] 17 | -------------------------------------------------------------------------------- /src/data/feature-icons/feature-icon-six.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "Free Shipping", 5 | "subtitle": "Lorem ipsum dolor sit amet consectetu adipisicing elit sed" 6 | }, 7 | { 8 | "id": 2, 9 | "title": "Support 24/7", 10 | "subtitle": "Lorem ipsum dolor sit amet consectetu adipisicing elit sed" 11 | }, 12 | { 13 | "id": 3, 14 | "title": "Money Return", 15 | "subtitle": "Lorem ipsum dolor sit amet consectetu adipisicing elit sed" 16 | } 17 | ] 18 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-nineteen.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "Enjoy This Offer Today", 5 | "subtitle": "New Collection
Sale 40%", 6 | "image": "/assets/img/slider/slider-17.jpg", 7 | "url": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": 2, 11 | "title": "Enjoy This Offer Today", 12 | "subtitle": "New Collection
Sale 20%", 13 | "image": "/assets/img/slider/slider-18.jpg", 14 | "url": "/shop-grid-standard" 15 | } 16 | ] 17 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-twenty-eight.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "Best Products Collection", 5 | "subtitle": "Final Sale For
2020", 6 | "image": "/assets/img/slider/slider-30.jpg", 7 | "url": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": 2, 11 | "title": "Best Products Collection", 12 | "subtitle": "Final Sale For
2020", 13 | "image": "/assets/img/slider/slider-30.jpg", 14 | "url": "/shop-grid-standard" 15 | } 16 | ] 17 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-twenty-four.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "2020 Latest Collection", 5 | "subtitle": "-40% Offer All
New Book.", 6 | "image": "/assets/img/slider/slider-24.jpg", 7 | "url": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": 2, 11 | "title": "2020 Latest Collection", 12 | "subtitle": "-20% Offer All
New Book.", 13 | "image": "/assets/img/slider/slider-25.jpg", 14 | "url": "/shop-grid-standard" 15 | } 16 | ] 17 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-twenty-six.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "Natural & Healthy", 5 | "subtitle": "100% Fresh
Flower Collection", 6 | "image": "/assets/img/slider/slider-28.jpg", 7 | "url": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": 2, 11 | "title": "Natural & Healthy", 12 | "subtitle": "100% Fresh
Flower Collection", 13 | "image": "/assets/img/slider/slider-28.jpg", 14 | "url": "/shop-grid-standard" 15 | } 16 | ] 17 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-four.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "-20% Off All Items", 5 | "subtitle": "Green Up
Your Room", 6 | "image": "/assets/img/slider/single-slide-11-1.png", 7 | "url": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": 2, 11 | "title": "-40% Off All Items", 12 | "subtitle": "Summer Offer
2020 Collection", 13 | "image": "/assets/img/slider/single-slide-11-2.png", 14 | "url": "/shop-grid-standard" 15 | } 16 | ] 17 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-twenty-three.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "2020 Latest Collection", 5 | "subtitle": "-30% Offer All
Pet Food.", 6 | "image": "/assets/img/slider/slider-23.jpg", 7 | "url": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": 2, 11 | "title": "2020 Latest Collection", 12 | "subtitle": "-40% Offer All
Pet Food.", 13 | "image": "/assets/img/slider/slider-23.jpg", 14 | "url": "/shop-grid-standard" 15 | } 16 | ] 17 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-seventeen.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "2020 Latest Collection", 5 | "subtitle": "-30% Offer All
Hand & Made.", 6 | "image": "/assets/img/slider/slider-14.jpg", 7 | "url": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": 2, 11 | "title": "2020 Latest Collection", 12 | "subtitle": "-40% Offer All
Hand & Made.", 13 | "image": "/assets/img/slider/slider-15.jpg", 14 | "url": "/shop-grid-standard" 15 | } 16 | ] 17 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-twenty-one.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "2020 Latest Collection", 5 | "subtitle": "-40% Offer All
Hydraulic Gear.", 6 | "image": "/assets/img/slider/slider-20.jpg", 7 | "url": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": 2, 11 | "title": "2020 Latest Collection", 12 | "subtitle": "-20% Offer All
Hydraulic Gear.", 13 | "image": "/assets/img/slider/slider-21.jpg", 14 | "url": "/shop-grid-standard" 15 | } 16 | ] 17 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-ten.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "Stylish", 5 | "subtitle": "Male Clothes", 6 | "text": "30% off Summer Vacation", 7 | "image": "/assets/img/slider/slider-2.jpg", 8 | "url": "/shop-grid-standard" 9 | }, 10 | { 11 | "id": 2, 12 | "title": "Stylish", 13 | "subtitle": "Female Clothes", 14 | "text": "30% off Summer Vacation", 15 | "image": "/assets/img/slider/slider-2-2.jpg", 16 | "url": "/shop-grid-standard" 17 | } 18 | ] 19 | -------------------------------------------------------------------------------- /src/data/brand-logos/brand-logo-one.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "1", 4 | "image": "/assets/img/brand-logo/brand-logo-1.png" 5 | }, 6 | { 7 | "id": "2", 8 | "image": "/assets/img/brand-logo/brand-logo-2.png" 9 | }, 10 | { 11 | "id": "3", 12 | "image": "/assets/img/brand-logo/brand-logo-3.png" 13 | }, 14 | { 15 | "id": "4", 16 | "image": "/assets/img/brand-logo/brand-logo-4.png" 17 | }, 18 | { 19 | "id": "5", 20 | "image": "/assets/img/brand-logo/brand-logo-5.png" 21 | } 22 | ] -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-twelve.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "New Arrival", 5 | "subtitle": "Final Sale", 6 | "text": "30% off Summer Vacation", 7 | "image": "/assets/img/slider/slider-3.jpg", 8 | "url": "/shop-grid-standard" 9 | }, 10 | { 11 | "id": 2, 12 | "title": "New Arrival", 13 | "subtitle": "Final Sale", 14 | "text": "40% off Summer Vacation", 15 | "image": "/assets/img/slider/slider-4.jpg", 16 | "url": "/shop-grid-standard" 17 | } 18 | ] 19 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-twenty-seven.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "All Products Sale Up Off To 40%", 5 | "subtitle": "Summer
Collections", 6 | "image": "/assets/img/slider/slider-29.jpg", 7 | "url": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": 2, 11 | "title": "All Products Sale Up Off To 40%", 12 | "subtitle": "Summer
Collections", 13 | "image": "/assets/img/slider/slider-29.jpg", 14 | "url": "/shop-grid-standard" 15 | } 16 | ] 17 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-twenty-two.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "Hurry Up", 5 | "subtitle": "Get 50% Offer", 6 | "text": "All Pastrys For This Summer.", 7 | "image": "/assets/img/slider/slider-22.jpg", 8 | "url": "/shop-grid-standard" 9 | }, 10 | { 11 | "id": 2, 12 | "title": "Hurry Up", 13 | "subtitle": "Get 30% Offer", 14 | "text": "All cakes For This Summer.", 15 | "image": "/assets/img/slider/slider-22.jpg", 16 | "url": "/shop-grid-standard" 17 | } 18 | ] 19 | -------------------------------------------------------------------------------- /src/data/category/category-five.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "image": "/assets/img/banner/banner-43.jpg", 5 | "title": "Wooden Chair (06)", 6 | "url": "/shop-grid-standard" 7 | }, 8 | { 9 | "id": 2, 10 | "image": "/assets/img/banner/banner-44.jpg", 11 | "title": "Sofa Collection (10)", 12 | "url": "/shop-grid-standard" 13 | }, 14 | { 15 | "id": 3, 16 | "image": "/assets/img/banner/banner-45.jpg", 17 | "title": "Wooden Bed (06)", 18 | "url": "/shop-grid-standard" 19 | } 20 | ] 21 | -------------------------------------------------------------------------------- /src/data/feature-icons/feature-icon-five.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "image": "/assets/img/icon-img/support-1.png", 5 | "title": "Free Shipping", 6 | "subtitle": "ALL ORDER OVER $30" 7 | }, 8 | { 9 | "id": 2, 10 | "image": "/assets/img/icon-img/support-2.png", 11 | "title": "Online support", 12 | "subtitle": "SUPPORT 24/7" 13 | }, 14 | { 15 | "id": 3, 16 | "image": "/assets/img/icon-img/support-3.png", 17 | "title": "100% money back", 18 | "subtitle": "100% SECURITY" 19 | } 20 | ] 21 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-thirty-two.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "Furniture
Collection 2020", 5 | "subtitle": "Sale up to 40% off", 6 | "image": "/assets/img/slider/slider-34.jpg", 7 | "url": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": 2, 11 | "title": "Furniture
Collection 2020", 12 | "subtitle": "Sale up to 30% off", 13 | "image": "/assets/img/slider/slider-34.jpg", 14 | "url": "/shop-grid-standard" 15 | } 16 | ] 17 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-twenty-nine.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "Furniture
Collection 2020", 5 | "subtitle": "Sale up to 40% off", 6 | "image": "/assets/img/slider/slider-31.jpg", 7 | "url": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": 2, 11 | "title": "Furniture
Collection 2020", 12 | "subtitle": "Sale up to 30% off", 13 | "image": "/assets/img/slider/slider-31.jpg", 14 | "url": "/shop-grid-standard" 15 | } 16 | ] 17 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-thirty-six.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "image": "/assets/img/slider/valentine-text.png", 5 | "backgroundImage": "/assets/img/slider/slider-38.jpg", 6 | "title": "New Collection For
Big Sale 40%", 7 | "url": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": 2, 11 | "image": "/assets/img/slider/valentine-text.png", 12 | "backgroundImage": "/assets/img/slider/slider-38.jpg", 13 | "title": "New Collection For
Big Sale 40%", 14 | "url": "/shop-grid-standard" 15 | } 16 | ] 17 | -------------------------------------------------------------------------------- /src/data/feature-icons/feature-icon-eight.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "image": "/assets/img/icon-img/support-1.png", 5 | "title": "Free Home Delivery" 6 | }, 7 | { 8 | "id": 2, 9 | "image": "/assets/img/icon-img/support-12.png", 10 | "title": "Secure Payment" 11 | }, 12 | { 13 | "id": 3, 14 | "image": "/assets/img/icon-img/support-4.png", 15 | "title": "Order Discount" 16 | }, 17 | { 18 | "id": 4, 19 | "image": "/assets/img/icon-img/support-11.png", 20 | "title": "24 x 7 Online Support" 21 | } 22 | ] 23 | -------------------------------------------------------------------------------- /src/data/feature-icons/feature-icon-three.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "image": "/assets/img/icon-img/support-1.png", 5 | "title": "Free Shipping", 6 | "subtitle": "Free shipping on all order" 7 | }, 8 | { 9 | "id": 2, 10 | "image": "/assets/img/icon-img/support-2.png", 11 | "title": "Support 24/7", 12 | "subtitle": "Free shipping on all order" 13 | }, 14 | { 15 | "id": 3, 16 | "image": "/assets/img/icon-img/support-3.png", 17 | "title": "Money Return", 18 | "subtitle": "Free shipping on all order" 19 | } 20 | ] 21 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-sixteen.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "Hurry Up", 5 | "subtitle": "Get 50% Offer", 6 | "text": "All Electronic Products & Instrument For This Summer.", 7 | "image": "/assets/img/slider/slider-13.jpg", 8 | "url": "/shop-grid-standard" 9 | }, 10 | { 11 | "id": 2, 12 | "title": "Hurry Up", 13 | "subtitle": "Get 30% Offer", 14 | "text": "All Electronic Products & Instrument For This Summer.", 15 | "image": "/assets/img/slider/slider-13.jpg", 16 | "url": "/shop-grid-standard" 17 | } 18 | ] 19 | -------------------------------------------------------------------------------- /src/components/product/ShopSearch.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | const ShopSearch = () => { 4 | 5 | return ( 6 |
7 |

Search

8 |
9 |
10 | 11 | 14 | 15 |
16 |
17 | ); 18 | }; 19 | 20 | export default ShopSearch; 21 | -------------------------------------------------------------------------------- /src/wrappers/product/ShopProducts.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import ProductgridList from "./ProductgridList"; 4 | 5 | const ShopProducts = ({ products, layout }) => { 6 | 7 | 8 | return ( 9 |
10 |
11 | 12 |
13 |
14 | ); 15 | }; 16 | 17 | ShopProducts.propTypes = { 18 | layout: PropTypes.string, 19 | products: PropTypes.array 20 | }; 21 | 22 | export default ShopProducts; 23 | -------------------------------------------------------------------------------- /src/components/text-grid/TextGridOneSingle.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | 4 | const TextGridOneSingle = ({ data, spaceBottomClass }) => { 5 | return ( 6 |
7 |
10 |

{data.title}

11 |

{data.text}

12 |
13 |
14 | ); 15 | }; 16 | 17 | TextGridOneSingle.propTypes = { 18 | data: PropTypes.object, 19 | spaceBottomClass: PropTypes.string 20 | }; 21 | 22 | export default TextGridOneSingle; 23 | -------------------------------------------------------------------------------- /src/wrappers/breadcrumb/Breadcrumb.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { NavLink } from "react-router-dom"; 3 | import { Breadcrumbs } from "react-breadcrumbs-dynamic"; 4 | 5 | const Breadcrumb = () => { 6 | return ( 7 |
8 |
9 |
10 | /} 12 | item={NavLink} 13 | finalItem={"span"} 14 | /> 15 |
16 |
17 |
18 | ); 19 | }; 20 | 21 | export default Breadcrumb; 22 | -------------------------------------------------------------------------------- /src/components/image-slider/ImageSliderOneSingle.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import { Link } from "react-router-dom"; 4 | 5 | const ImageSliderOneSingle = ({ data, sliderClass }) => { 6 | return ( 7 |
8 | 9 | 10 | 11 |
12 | ); 13 | }; 14 | 15 | ImageSliderOneSingle.propTypes = { 16 | data: PropTypes.object, 17 | sliderClass: PropTypes.string 18 | }; 19 | 20 | export default ImageSliderOneSingle; 21 | -------------------------------------------------------------------------------- /src/data/feature-icons/feature-icon-two.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "image": "/assets/img/icon-img/support-1.png", 5 | "title": "Free Shipping", 6 | "subtitle": "Lorem ipsum dolor sit amet consectetu adipisicing elit sed" 7 | }, 8 | { 9 | "id": 2, 10 | "image": "/assets/img/icon-img/support-2.png", 11 | "title": "Support 24/7", 12 | "subtitle": "Lorem ipsum dolor sit amet consectetu adipisicing elit sed" 13 | }, 14 | { 15 | "id": 3, 16 | "image": "/assets/img/icon-img/support-3.png", 17 | "title": "Money Return", 18 | "subtitle": "Lorem ipsum dolor sit amet consectetu adipisicing elit sed" 19 | } 20 | ] 21 | -------------------------------------------------------------------------------- /src/components/header/Logo.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import { Link } from "react-router-dom"; 4 | 5 | const Logo = ({ imageUrl, logoClass }) => { 6 | return ( 7 |
8 | 9 | 15 | 16 |
17 | ); 18 | }; 19 | 20 | Logo.propTypes = { 21 | imageUrl: PropTypes.string, 22 | logoClass: PropTypes.string, 23 | }; 24 | 25 | export default Logo; 26 | -------------------------------------------------------------------------------- /src/assets/scss/_brand-logo.scss: -------------------------------------------------------------------------------- 1 | /*------- 14. Brand logo style -------*/ 2 | 3 | .brand-logo-active, 4 | .brand-logo-active-2 { 5 | &.owl-carousel { 6 | .owl-item { 7 | img { 8 | display: inline-block; 9 | width: auto; 10 | } 11 | } 12 | } 13 | .single-brand-logo, 14 | .single-brand-logo2 { 15 | text-align: center; 16 | img { 17 | filter: grayscale(100%); 18 | transition: all 0.5s ease 0s; 19 | } 20 | &:hover img { 21 | filter: grayscale(0%); 22 | } 23 | } 24 | } 25 | 26 | .brand-logo-wrap { 27 | padding: 100px 90px; 28 | @media #{$xs-layout} { 29 | padding: 50px 20px; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/components/product/sub-components/ProductRating.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React, { Fragment } from "react"; 3 | 4 | const ProductRating = ({ ratingValue }) => { 5 | let rating = []; 6 | 7 | for (let i = 0; i < 5; i++) { 8 | rating.push(); 9 | } 10 | if (ratingValue && ratingValue > 0) { 11 | for (let i = 0; i <= ratingValue - 1; i++) { 12 | rating[i] = ; 13 | } 14 | } 15 | return {rating}; 16 | }; 17 | 18 | ProductRating.propTypes = { 19 | ratingValue: PropTypes.number 20 | }; 21 | 22 | export default ProductRating; 23 | -------------------------------------------------------------------------------- /src/data/banner/banner-one.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "image": "/assets/img/banner/banner-1.jpg", 5 | "title": "Watches", 6 | "subtitle": "Starting at", 7 | "price": "$99.00", 8 | "link": "/shop-grid-standard" 9 | }, 10 | { 11 | "id": 2, 12 | "image": "/assets/img/banner/banner-2.jpg", 13 | "title": "Plo Bag", 14 | "subtitle": "Starting at", 15 | "price": "$79.00", 16 | "link": "/shop-grid-standard" 17 | }, 18 | { 19 | "id": 3, 20 | "image": "/assets/img/banner/banner-3.jpg", 21 | "title": "Sunglass", 22 | "subtitle": "Starting at", 23 | "price": "$29.00", 24 | "link": "/shop-grid-standard" 25 | } 26 | ] 27 | -------------------------------------------------------------------------------- /src/wrappers/slider-banner/SliderBanner.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import BannerEight from "../banner/BannerEight"; 3 | import HeroSliderSeven from "../hero-slider/HeroSliderSeven"; 4 | 5 | const SliderBanner = () => { 6 | return ( 7 |
8 |
9 |
10 |
11 | {/* hero slider */} 12 | 13 |
14 | {/* banner */} 15 | 16 |
17 |
18 |
19 | ); 20 | }; 21 | 22 | export default SliderBanner; 23 | -------------------------------------------------------------------------------- /src/components/brand-logo/BrandLogoOneSingle.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | 4 | const BrandLogoOneSingle = ({ data, sliderClassName, spaceBottomClass }) => { 5 | return ( 6 |
11 | 12 |
13 | ); 14 | }; 15 | 16 | BrandLogoOneSingle.propTypes = { 17 | data: PropTypes.object, 18 | sliderClassName: PropTypes.string, 19 | spaceBottomClass: PropTypes.string 20 | }; 21 | 22 | export default BrandLogoOneSingle; 23 | -------------------------------------------------------------------------------- /src/data/feature-icons/feature-icon-seven.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "image": "/assets/img/icon-img/support-1.png", 5 | "title": "Free Shipping", 6 | "subtitle": "Lorem ipsum dolor sit amet consectetur adipisicing elit sed do eiusm." 7 | }, 8 | { 9 | "id": 2, 10 | "image": "/assets/img/icon-img/support-11.png", 11 | "title": "Support 24/7", 12 | "subtitle": "Lorem ipsum dolor sit amet consectetur adipisicing elit sed do eiusm." 13 | }, 14 | { 15 | "id": 3, 16 | "image": "/assets/img/icon-img/support-12.png", 17 | "title": "Money Return", 18 | "subtitle": "Lorem ipsum dolor sit amet consectetur adipisicing elit sed do eiusm." 19 | } 20 | ] 21 | -------------------------------------------------------------------------------- /src/data/hero-sliders/scroll-slider.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "1", 4 | "title": "2020 Fashion For Womens", 5 | "subtitle": "-20% Spring
Snickers", 6 | "image": "/assets/img/slider/hm-11-2.png", 7 | "url": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": "2", 11 | "title": "2020 Fashion For Womens", 12 | "subtitle": "-30% Spring
Shoes", 13 | "image": "/assets/img/slider/single-slide-2.png", 14 | "url": "/shop-grid-standard" 15 | }, 16 | { 17 | "id": "3", 18 | "title": "2020 Fashion For Womens", 19 | "subtitle": "-40% Spring
Shoes", 20 | "image": "/assets/img/slider/single-slide-7.png", 21 | "url": "/shop-grid-standard" 22 | } 23 | ] 24 | -------------------------------------------------------------------------------- /src/data/feature-icons/feature-icon.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "image": "/assets/img/icon-img/support-1.png", 5 | "title": "Free Shipping", 6 | "subtitle": "Free shipping on all order" 7 | }, 8 | { 9 | "id": 2, 10 | "image": "/assets/img/icon-img/support-2.png", 11 | "title": "Support 24/7", 12 | "subtitle": "Free shipping on all order" 13 | }, 14 | { 15 | "id": 3, 16 | "image": "/assets/img/icon-img/support-3.png", 17 | "title": "Money Return", 18 | "subtitle": "Free shipping on all order" 19 | }, 20 | { 21 | "id": 4, 22 | "image": "/assets/img/icon-img/support-4.png", 23 | "title": "Order Discount", 24 | "subtitle": "Free shipping on all order" 25 | } 26 | ] 27 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-eleven.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "New Arrival", 5 | "subtitle": "Final Sale", 6 | "text": "30% off Summer Vacation", 7 | "image": "/assets/img/slider/slider-6.jpg", 8 | "url": "/shop-grid-standard" 9 | }, 10 | { 11 | "id": 2, 12 | "title": "New Arrival", 13 | "subtitle": "Final Sale", 14 | "text": "40% off Summer Vacation", 15 | "image": "/assets/img/slider/slider-6-1.jpg", 16 | "url": "/shop-grid-standard" 17 | }, 18 | { 19 | "id": 3, 20 | "title": "New Arrival", 21 | "subtitle": "Final Sale", 22 | "text": "40% off Summer Vacation", 23 | "image": "/assets/img/slider/slider-6-2.jpg", 24 | "url": "/shop-grid-standard" 25 | } 26 | ] 27 | -------------------------------------------------------------------------------- /src/data/feature-icons/feature-icon-four.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "titleImage": "/assets/img/icon-img/support-8.png", 5 | "title": "Free shipping on all order", 6 | "iconImage": "/assets/img/icon-img/support-5.png", 7 | "backgroundColor": "#ccfbe9" 8 | }, 9 | { 10 | "id": 2, 11 | "titleImage": "/assets/img/icon-img/support-9.png", 12 | "title": "Back guarantee under 5 days", 13 | "iconImage": "/assets/img/icon-img/support-6.png", 14 | "backgroundColor": "#f2fbcc" 15 | }, 16 | { 17 | "id": 3, 18 | "titleImage": "/assets/img/icon-img/support-10.png", 19 | "title": "On every order over $150", 20 | "iconImage": "/assets/img/icon-img/support-7.png", 21 | "backgroundColor": "#ddfbcc" 22 | } 23 | ] 24 | -------------------------------------------------------------------------------- /src/data/feature-icons/feature-icon-nine.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "titleImage": "/assets/img/icon-img/support-13.png", 5 | "title": "Free shipping on all order", 6 | "iconImage": "/assets/img/icon-img/support-5.png", 7 | "backgroundColor": "#303030" 8 | }, 9 | { 10 | "id": 2, 11 | "titleImage": "/assets/img/icon-img/support-14.png", 12 | "title": "Back guarantee under 5 days", 13 | "iconImage": "/assets/img/icon-img/support-6.png", 14 | "backgroundColor": "#303030" 15 | }, 16 | { 17 | "id": 3, 18 | "titleImage": "/assets/img/icon-img/support-15.png", 19 | "title": "On every order over $150", 20 | "iconImage": "/assets/img/icon-img/support-7.png", 21 | "backgroundColor": "#303030" 22 | } 23 | ] 24 | -------------------------------------------------------------------------------- /src/redux/actions/currencyActions.js: -------------------------------------------------------------------------------- 1 | import axios from "axios"; 2 | export const SET_CURRENCY = "SET_CURRENCY"; 3 | 4 | export const setCurrency = currencyName => { 5 | return dispatch => { 6 | axios 7 | .get(`https://api.exchangeratesapi.io/latest?base=USD`) 8 | .then(response => { 9 | const rates = response.data.rates; 10 | let currencyRate = 0; 11 | for (const rate in rates) { 12 | if (rate === currencyName) { 13 | currencyRate = rates[rate]; 14 | } 15 | } 16 | dispatch({ 17 | type: SET_CURRENCY, 18 | payload: { currencyName, currencyRate } 19 | }); 20 | }) 21 | .catch(err => { 22 | console.log("Error: ", err); 23 | }); 24 | }; 25 | }; 26 | -------------------------------------------------------------------------------- /src/data/hero-sliders/hero-slider-thirteen.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "Stylish", 5 | "subtitle": "Male Clothes", 6 | "text": "30% off Summer Vacation", 7 | "image": "/assets/img/slider/single-slide-2.png", 8 | "url": "/shop-grid-standard", 9 | "shapeImage": "/assets/img/icon-img/slider-shape.png", 10 | "shapeTitle": "Sale", 11 | "shapeSubtitle": "$99.00" 12 | }, 13 | { 14 | "id": 2, 15 | "title": "Stylish", 16 | "subtitle": "Female Clothes", 17 | "text": "20% off Summer Vacation", 18 | "image": "/assets/img/slider/single-slide-7.png", 19 | "url": "/shop-grid-standard", 20 | "shapeImage": "/assets/img/icon-img/slider-shape.png", 21 | "shapeTitle": "Sale", 22 | "shapeSubtitle": "$20.00" 23 | } 24 | ] 25 | -------------------------------------------------------------------------------- /src/layouts/LayoutAdmin.jsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from "react"; 2 | import HeaderNav from "../components/admin/HeaderNav"; 3 | import Sidebar from "../components/admin/Sidebar"; 4 | 5 | const LayoutAdmin = ({ children }) => { 6 | const [sidebar, setSidebar] = useState(false); 7 | 8 | const handleSidebar = () => { 9 | setSidebar((prev) => !prev); 10 | }; 11 | 12 | const closeSidebar = () => { 13 | setSidebar(false); 14 | }; 15 | 16 | return ( 17 | <> 18 | 19 |
20 | {sidebar && } 21 |
{children}
22 |
23 | 24 | ); 25 | }; 26 | 27 | export default LayoutAdmin; 28 | -------------------------------------------------------------------------------- /src/components/feature-icon/FeatureIconSingle.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | 4 | const FeatureIconSingle = ({ singleFeature }) => { 5 | return ( 6 |
7 |
8 |
9 | 14 |
15 |
16 |
{singleFeature.title}
17 |

{singleFeature.subtitle}

18 |
19 |
20 |
21 | ); 22 | }; 23 | 24 | FeatureIconSingle.propTypes = { 25 | singleFeature: PropTypes.object 26 | }; 27 | 28 | export default FeatureIconSingle; 29 | -------------------------------------------------------------------------------- /src/redux/actions/compareActions.js: -------------------------------------------------------------------------------- 1 | export const ADD_TO_COMPARE = "ADD_TO_COMPARE"; 2 | export const DELETE_FROM_COMPARE = "DELETE_FROM_COMPARE"; 3 | 4 | // add to compare 5 | export const addToCompare = (item, addToast) => { 6 | return dispatch => { 7 | if (addToast) { 8 | addToast("Added To Compare", { 9 | appearance: "success", 10 | autoDismiss: true 11 | }); 12 | } 13 | dispatch({ type: ADD_TO_COMPARE, payload: item }); 14 | }; 15 | }; 16 | 17 | // delete from compare 18 | export const deleteFromCompare = (item, addToast) => { 19 | return dispatch => { 20 | if (addToast) { 21 | addToast("Removed From Compare", { 22 | appearance: "error", 23 | autoDismiss: true 24 | }); 25 | } 26 | dispatch({ type: DELETE_FROM_COMPARE, payload: item }); 27 | }; 28 | }; 29 | -------------------------------------------------------------------------------- /src/data/category/category-one.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "1", 4 | "image": "/assets/img/product/hm9-cagi-1.jpg", 5 | "subtitle": "4 Products", 6 | "title": "Bluetooth Speaker", 7 | "link": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": "2", 11 | "image": "/assets/img/product/hm9-cagi-2.jpg", 12 | "subtitle": "8 Products", 13 | "title": "Bluetooth Headphone", 14 | "link": "/shop-grid-standard" 15 | }, 16 | { 17 | "id": "3", 18 | "image": "/assets/img/product/hm9-cagi-3.jpg", 19 | "subtitle": "9 Products", 20 | "title": "Kardon Aura Studio", 21 | "link": "/shop-grid-standard" 22 | }, 23 | { 24 | "id": "4", 25 | "image": "/assets/img/product/hm9-cagi-2.jpg", 26 | "subtitle": "4 Products", 27 | "title": "Bluetooth Speaker", 28 | "link": "/shop-grid-standard" 29 | } 30 | ] 31 | -------------------------------------------------------------------------------- /src/wrappers/product/ShopTopbar.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React, { Fragment } from "react"; 3 | import ShopTopAction from "../../components/product/ShopTopAction"; 4 | 5 | const ShopTopbar = ({ 6 | getLayout, 7 | getFilterSortParams, 8 | productCount, 9 | sortedProductCount 10 | }) => { 11 | return ( 12 | 13 | {/* shop top action */} 14 | 20 | 21 | ); 22 | }; 23 | 24 | ShopTopbar.propTypes = { 25 | getFilterSortParams: PropTypes.func, 26 | getLayout: PropTypes.func, 27 | productCount: PropTypes.number, 28 | sortedProductCount: PropTypes.number 29 | }; 30 | 31 | export default ShopTopbar; 32 | -------------------------------------------------------------------------------- /src/components/category/CategoryOneSingle.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import { Link } from "react-router-dom"; 4 | 5 | const CategoryOneSingle = ({ data, sliderClass }) => { 6 | return ( 7 |
8 | 9 | 10 | 11 |
12 | {data.subtitle} 13 |

14 | {data.title} 15 |

16 |
17 |
18 | ); 19 | }; 20 | 21 | CategoryOneSingle.propTypes = { 22 | data: PropTypes.object, 23 | sliderClass: PropTypes.string 24 | }; 25 | 26 | export default CategoryOneSingle; 27 | -------------------------------------------------------------------------------- /src/data/image-slider/image-slider-one.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "1", 4 | "image": "/assets/img/image-slider/image-slider-1.jpg", 5 | "link": "/shop-grid-standard" 6 | }, 7 | { 8 | "id": "2", 9 | "image": "/assets/img/image-slider/image-slider-2.jpg", 10 | "link": "/shop-grid-standard" 11 | }, 12 | { 13 | "id": "3", 14 | "image": "/assets/img/image-slider/image-slider-3.jpg", 15 | "link": "/shop-grid-standard" 16 | }, 17 | { 18 | "id": "4", 19 | "image": "/assets/img/image-slider/image-slider-4.jpg", 20 | "link": "/shop-grid-standard" 21 | }, 22 | { 23 | "id": "5", 24 | "image": "/assets/img/image-slider/image-slider-5.jpg", 25 | "link": "/shop-grid-standard" 26 | }, 27 | { 28 | "id": "6", 29 | "image": "/assets/img/image-slider/image-slider-2.jpg", 30 | "link": "/shop-grid-standard" 31 | } 32 | ] 33 | -------------------------------------------------------------------------------- /src/redux/reducers/compareReducer.js: -------------------------------------------------------------------------------- 1 | import { ADD_TO_COMPARE, DELETE_FROM_COMPARE } from "../actions/compareActions"; 2 | 3 | const initState = []; 4 | 5 | const compareReducer = (state = initState, action) => { 6 | const compareItems = state, 7 | product = action.payload; 8 | 9 | if (action.type === ADD_TO_COMPARE) { 10 | const compareItem = compareItems.filter(item => item.id === product.id)[0]; 11 | if (compareItem === undefined) { 12 | return [...compareItems, product]; 13 | } else { 14 | return compareItems; 15 | } 16 | } 17 | 18 | if (action.type === DELETE_FROM_COMPARE) { 19 | const remainingItems = (compareItems, product) => 20 | compareItems.filter(compareItem => compareItem.id !== product.id); 21 | return remainingItems(compareItems, product); 22 | } 23 | 24 | return compareItems; 25 | }; 26 | 27 | export default compareReducer; 28 | -------------------------------------------------------------------------------- /src/data/text-grid/text-grid-one.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "1", 4 | "title": "Our Vision", 5 | "text": "Baby Product House provide how all this mistaken idea of denounc pleasure and sing pain was born an will give you a ete account of the system, and expound the actual teangs the eat explorer of the truth." 6 | }, 7 | { 8 | "id": "2", 9 | "title": "Our Mission", 10 | "text": "Baby Product House provide how all this mistaken idea of denounc pleasure and sing pain was born an will give you a ete account of the system, and expound the actual teangs the eat explorer of the truth." 11 | }, 12 | { 13 | "id": "3", 14 | "title": "Our Goal", 15 | "text": "Baby Product House provide how all this mistaken idea of denounc pleasure and sing pain was born an will give you a ete account of the system, and expound the actual teangs the eat explorer of the truth." 16 | } 17 | ] 18 | -------------------------------------------------------------------------------- /src/wrappers/product/ProductGridSixContainer.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import SectionTitleSix from "../../components/section-title/SectionTitleSix"; 3 | import ProductGridSix from "./ProductGridSix"; 4 | 5 | const ProductGridSixContainer = ({ spaceBottomClass }) => { 6 | return ( 7 |
12 |
13 | 17 |
18 | 23 |
24 |
25 |
26 | ); 27 | }; 28 | 29 | export default ProductGridSixContainer; 30 | -------------------------------------------------------------------------------- /src/components/section-title/SectionTitle.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | 4 | const SectionTitle = ({ 5 | titleText, 6 | subtitleText, 7 | subtitleColorClass, 8 | positionClass, 9 | spaceClass, 10 | borderClass 11 | }) => { 12 | return ( 13 |
18 |

{titleText}

19 |

20 | {subtitleText} 21 |

22 |
23 | ); 24 | }; 25 | 26 | SectionTitle.propTypes = { 27 | borderClass: PropTypes.string, 28 | positionClass: PropTypes.string, 29 | spaceClass: PropTypes.string, 30 | subtitleText: PropTypes.string, 31 | subtitleColorClass: PropTypes.string, 32 | titleText: PropTypes.string 33 | }; 34 | 35 | export default SectionTitle; 36 | -------------------------------------------------------------------------------- /src/components/admin/HeaderNav.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Link } from "react-router-dom"; 3 | 4 | const HeaderNav = ({ onSidebarHandler }) => { 5 | return ( 6 |
7 |
8 | {/* baby product logo */} 9 |

Wonders Smart Tech (Admin Panel)

10 |
11 |
    12 |
  • 13 | Dashboard 14 |
  • 15 |
  • 16 | Product 17 |
  • 18 |
  • 19 | Users 20 |
  • 21 |
  • 22 | Orders 23 |
  • 24 |
25 |
26 | 27 |
28 |
29 | ); 30 | }; 31 | 32 | export default HeaderNav; 33 | -------------------------------------------------------------------------------- /src/data/category/category-four.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "1", 4 | "image": "/assets/img/product/category1.jpg", 5 | "subtitle": "2 Products", 6 | "title": "New", 7 | "link": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": "2", 11 | "image": "/assets/img/product/category2.jpg", 12 | "subtitle": "3 Products", 13 | "title": "Crafts", 14 | "link": "/shop-grid-standard" 15 | }, 16 | { 17 | "id": "3", 18 | "image": "/assets/img/product/category3.jpg", 19 | "subtitle": "6 Products", 20 | "title": "Earthenware", 21 | "link": "/shop-grid-standard" 22 | }, 23 | { 24 | "id": "4", 25 | "image": "/assets/img/product/category4.jpg", 26 | "subtitle": "5 Products", 27 | "title": "Featured", 28 | "link": "/shop-grid-standard" 29 | }, 30 | { 31 | "id": "5", 32 | "image": "/assets/img/product/category2.jpg", 33 | "subtitle": "3 Products", 34 | "title": "Best Products", 35 | "link": "/shop-grid-standard" 36 | } 37 | ] 38 | -------------------------------------------------------------------------------- /src/wrappers/product/ProductGridFiveContainer.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import ProductGridFive from "./ProductGridFive"; 4 | 5 | const ProductGridFiveContainer = ({ 6 | spaceTopClass, 7 | spaceBottomClass, 8 | category 9 | }) => { 10 | return ( 11 |
16 |
17 |
18 | 23 |
24 |
25 |
26 | ); 27 | }; 28 | 29 | ProductGridFiveContainer.propTypes = { 30 | category: PropTypes.string, 31 | spaceBottomClass: PropTypes.string, 32 | spaceTopClass: PropTypes.string 33 | }; 34 | 35 | export default ProductGridFiveContainer; 36 | -------------------------------------------------------------------------------- /src/components/footer/FooterCopyright.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import { Link } from "react-router-dom"; 4 | 5 | const FooterCopyright = ({ footerLogo, spaceBottomClass, colorClass }) => { 6 | return ( 7 |
12 |
13 | 14 | 15 | 16 |
17 | 18 | 19 |
20 | 21 | 22 | 23 |
24 |
25 | ); 26 | }; 27 | 28 | FooterCopyright.propTypes = { 29 | footerLogo: PropTypes.string, 30 | spaceBottomClass: PropTypes.string, 31 | colorClass: PropTypes.string, 32 | }; 33 | 34 | export default FooterCopyright; 35 | -------------------------------------------------------------------------------- /src/data/category/category-two.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "1", 4 | "image": "/assets/img/product/hm8-pro-1.jpg", 5 | "subtitle": "2 Products", 6 | "title": "Living Room", 7 | "link": "/shop-grid-standard" 8 | }, 9 | { 10 | "id": "2", 11 | "image": "/assets/img/product/hm8-pro-2.jpg", 12 | "subtitle": "3 Products", 13 | "title": "Drawing Room", 14 | "link": "/shop-grid-standard" 15 | }, 16 | { 17 | "id": "3", 18 | "image": "/assets/img/product/hm8-pro-3.jpg", 19 | "subtitle": "6 Products", 20 | "title": "Dining Room", 21 | "link": "/shop-grid-standard" 22 | }, 23 | { 24 | "id": "4", 25 | "image": "/assets/img/product/hm8-pro-4.jpg", 26 | "subtitle": "5 Products", 27 | "title": "Drawing Room", 28 | "link": "/shop-grid-standard" 29 | }, 30 | { 31 | "id": "5", 32 | "image": "/assets/img/product/hm8-pro-2.jpg", 33 | "subtitle": "3 Products", 34 | "title": "Living Room", 35 | "link": "/shop-grid-standard" 36 | } 37 | ] 38 | -------------------------------------------------------------------------------- /src/components/contact/LocationMap.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Map, GoogleApiWrapper, Marker } from "google-maps-react"; 3 | import { PropTypes } from "prop-types"; 4 | 5 | const FooterMap = props => { 6 | const mapStyles = { 7 | width: "100%", 8 | height: "100%" 9 | }; 10 | 11 | return ( 12 | 18 | 25 | 26 | ); 27 | }; 28 | 29 | FooterMap.propTypes = { 30 | google: PropTypes.object, 31 | latitude: PropTypes.string, 32 | longitude: PropTypes.string 33 | }; 34 | 35 | export default GoogleApiWrapper({ 36 | apiKey: "AIzaSyB2D8wrWMY3XZnuHO6C31uq90JiuaFzGws" 37 | })(FooterMap); 38 | -------------------------------------------------------------------------------- /src/wrappers/text-grid/TextGridOne.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import textGridData from "../../data/text-grid/text-grid-one.json"; 4 | import TextGridOneSingle from "../../components/text-grid/TextGridOneSingle.js"; 5 | 6 | const TextGridOne = ({ spaceBottomClass }) => { 7 | return ( 8 |
13 |
14 |
15 | {textGridData && 16 | textGridData.map((single, key) => { 17 | return ( 18 | 23 | ); 24 | })} 25 |
26 |
27 |
28 | ); 29 | }; 30 | 31 | TextGridOne.propTypes = { 32 | spaceBottomClass: PropTypes.string 33 | }; 34 | 35 | export default TextGridOne; 36 | -------------------------------------------------------------------------------- /src/wrappers/cta/CtaOne.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import { Link } from "react-router-dom"; 4 | 5 | const CtaOne = ({ spaceTopClass, backgroundImage }) => { 6 | return ( 7 |
8 |
9 |
15 |
16 |

Shop and save money

17 |
18 | 19 | Buy $97.09 20 | 21 |
22 |
23 |
24 |
25 |
26 | ); 27 | }; 28 | 29 | CtaOne.propTypes = { 30 | backgroundImage: PropTypes.string, 31 | spaceTopClass: PropTypes.string 32 | }; 33 | 34 | export default CtaOne; 35 | -------------------------------------------------------------------------------- /src/components/banner/BannerOneSingle.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import { Link } from "react-router-dom"; 4 | 5 | const BannerOneSingle = ({ data, spaceBottomClass }) => { 6 | return ( 7 |
8 |
11 | 12 | 13 | 14 |
15 |

{data.title}

16 |

17 | {data.subtitle} {data.price} 18 |

19 | 20 | 21 | 22 |
23 |
24 |
25 | ); 26 | }; 27 | 28 | BannerOneSingle.propTypes = { 29 | data: PropTypes.object, 30 | spaceBottomClass: PropTypes.string 31 | }; 32 | 33 | export default BannerOneSingle; 34 | -------------------------------------------------------------------------------- /src/wrappers/product/ShopTopbarFilter.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React, { Fragment } from "react"; 3 | import ShopTopActionFilter from "../../components/product/ShopTopActionFilter"; 4 | 5 | const ShopTopbar = ({ 6 | getLayout, 7 | getFilterSortParams, 8 | productCount, 9 | sortedProductCount, 10 | products, 11 | getSortParams 12 | }) => { 13 | return ( 14 | 15 | {/* shop top action */} 16 | 24 | 25 | ); 26 | }; 27 | 28 | ShopTopbar.propTypes = { 29 | getFilterSortParams: PropTypes.func, 30 | getLayout: PropTypes.func, 31 | getSortParams: PropTypes.func, 32 | productCount: PropTypes.number, 33 | products: PropTypes.array, 34 | sortedProductCount: PropTypes.number 35 | }; 36 | 37 | export default ShopTopbar; 38 | -------------------------------------------------------------------------------- /src/wrappers/feature-icon/FeatureIcon.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import featureIconData from "../../data/feature-icons/feature-icon.json"; 4 | import FeatureIconSingle from "../../components/feature-icon/FeatureIconSingle"; 5 | 6 | const FeatureIcon = ({ spaceTopClass, spaceBottomClass }) => { 7 | return ( 8 |
13 |
14 |
15 | {featureIconData.map(singleFeature => { 16 | return ( 17 | 21 | ); 22 | })} 23 |
24 |
25 |
26 | ); 27 | }; 28 | 29 | FeatureIcon.propTypes = { 30 | spaceBottomClass: PropTypes.string, 31 | spaceTopClass: PropTypes.string 32 | }; 33 | 34 | export default FeatureIcon; 35 | -------------------------------------------------------------------------------- /src/wrappers/product/NewProductGrid.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import ProductGridTwo from "./ProductGridTwo"; 4 | import SectionTitleTwo from "../../components/section-title/SectionTitleTwo"; 5 | 6 | const NewProductGrid = ({ category, limit }) => { 7 | return ( 8 |
9 |
10 | 16 |
17 | 23 |
24 |
25 |
26 | ); 27 | }; 28 | 29 | NewProductGrid.propTypes = { 30 | category: PropTypes.string, 31 | limit: PropTypes.number 32 | }; 33 | 34 | export default NewProductGrid; 35 | -------------------------------------------------------------------------------- /src/components/product/ProductImageFixed.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | 4 | const ProductImageFixed = ({ product }) => { 5 | return ( 6 |
7 | {product.discount || product.new ? ( 8 |
9 | {product.discount ? ( 10 | -{product.discount}% 11 | ) : ( 12 | "" 13 | )} 14 | {product.new ? New : ""} 15 |
16 | ) : ( 17 | "" 18 | )} 19 | 20 |
21 | {product.image ? ( 22 | 27 | ) : ( 28 | "" 29 | )} 30 |
31 |
32 | ); 33 | }; 34 | 35 | ProductImageFixed.propTypes = { 36 | product: PropTypes.object 37 | }; 38 | 39 | export default ProductImageFixed; 40 | -------------------------------------------------------------------------------- /src/redux/constants/orderConstants.js: -------------------------------------------------------------------------------- 1 | export const ORDER_CREATE_REQUEST = "ORDER_CREATE_REQUEST"; 2 | export const ORDER_CREATE_SUCCESS = "ORDER_CREATE_SUCCESS"; 3 | export const ORDER_CREATE_FAIL = "ORDER_CREATE_FAIL"; 4 | export const ORDER_CREATE_RESET = "ORDER_CREATE_RESET"; 5 | 6 | export const ORDER_DETAILS_REQUEST = "ORDER_DETAILS_REQUEST"; 7 | export const ORDER_DETAILS_SUCCESS = "ORDER_DETAILS_SUCCESS"; 8 | export const ORDER_DETAILS_FAIL = "ORDER_DETAILS_FAIL"; 9 | 10 | export const ORDER_LIST_MY_REQUEST = "ORDER_LIST_MY_REQUEST"; 11 | export const ORDER_LIST_MY_SUCCESS = "ORDER_LIST_MY_SUCCESS"; 12 | export const ORDER_LIST_MY_FAIL = "ORDER_LIST_MY_FAIL"; 13 | 14 | export const ORDER_LIST_REQUEST = "ORDER_LIST_REQUEST"; 15 | export const ORDER_LIST_SUCCESS = "ORDER_LIST_SUCCESS"; 16 | export const ORDER_LIST_FAIL = "ORDER_LIST_FAIL"; 17 | 18 | export const ORDER_DELIVER_REQUEST = "ORDER_DELIVER_REQUEST"; 19 | export const ORDER_DELIVER_SUCCESS = "ORDER_DELIVER_SUCCESS"; 20 | export const ORDER_DELIVER_FAIL = "ORDER_DELIVER_FAIL"; 21 | export const ORDER_DELIVER_RESET = "ORDER_DELIVER_RESET"; 22 | -------------------------------------------------------------------------------- /src/layouts/LayoutOne.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React, { Fragment } from "react"; 3 | import HeaderOne from "../wrappers/header/HeaderOne"; 4 | import FooterOne from "../wrappers/footer/FooterOne"; 5 | 6 | const LayoutOne = ({ 7 | children, 8 | headerContainerClass, 9 | headerTop, 10 | headerPaddingClass, 11 | headerPositionClass, 12 | }) => { 13 | return ( 14 | 15 | 21 | {children} 22 | 27 | 28 | ); 29 | }; 30 | 31 | LayoutOne.propTypes = { 32 | children: PropTypes.any, 33 | headerContainerClass: PropTypes.string, 34 | headerPaddingClass: PropTypes.string, 35 | headerPositionClass: PropTypes.string, 36 | headerTop: PropTypes.string, 37 | }; 38 | 39 | export default LayoutOne; 40 | -------------------------------------------------------------------------------- /src/wrappers/banner/BannerOne.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import bannerData from "../../data/banner/banner-one.json"; 4 | import BannerOneSingle from "../../components/banner/BannerOneSingle.js"; 5 | 6 | const BannerOne = ({ spaceTopClass, spaceBottomClass }) => { 7 | return ( 8 |
13 |
14 |
15 | {bannerData && 16 | bannerData.map((single, key) => { 17 | return ( 18 | 23 | ); 24 | })} 25 |
26 |
27 |
28 | ); 29 | }; 30 | 31 | BannerOne.propTypes = { 32 | spaceBottomClass: PropTypes.string, 33 | spaceTopClass: PropTypes.string 34 | }; 35 | 36 | export default BannerOne; 37 | -------------------------------------------------------------------------------- /src/redux/reducers/currencyReducer.js: -------------------------------------------------------------------------------- 1 | import { SET_CURRENCY } from "../actions/currencyActions"; 2 | 3 | const initState = { 4 | currencySymbol: "$", 5 | currencyName: "USD", 6 | currencyRate: 1 7 | }; 8 | 9 | const currencyReducer = (state = initState, action) => { 10 | if (action.type === SET_CURRENCY) { 11 | const currencyName = action.payload.currencyName; 12 | 13 | if (currencyName === "USD") { 14 | return { 15 | ...state, 16 | currencySymbol: "$", 17 | currencyRate: action.payload.currencyRate, 18 | currencyName 19 | }; 20 | } 21 | if (currencyName === "EUR") { 22 | return { 23 | ...state, 24 | currencySymbol: "€", 25 | currencyRate: action.payload.currencyRate, 26 | currencyName 27 | }; 28 | } 29 | if (currencyName === "GBP") { 30 | return { 31 | ...state, 32 | currencySymbol: "£", 33 | currencyRate: action.payload.currencyRate, 34 | currencyName 35 | }; 36 | } 37 | } 38 | 39 | return state; 40 | }; 41 | 42 | export default currencyReducer; 43 | -------------------------------------------------------------------------------- /src/assets/scss/style.scss: -------------------------------------------------------------------------------- 1 | @import "~bootstrap/scss/bootstrap.scss"; 2 | @import "~swiper/css/swiper.css"; 3 | @import "~animate.css/animate.min.css"; 4 | @import "~lightgallery.js/dist/css/lightgallery.css"; 5 | @import "~react-modal-video/scss/modal-video.scss"; 6 | @import "../css/icons.min.css"; 7 | 8 | @import "variables"; 9 | @import "helper"; 10 | @import "common"; 11 | @import "preloader"; 12 | @import "header"; 13 | @import "slider"; 14 | @import "support"; 15 | @import "section-title"; 16 | @import "product"; 17 | @import "blog"; 18 | @import "footer"; 19 | @import "banner"; 20 | @import "suscribe"; 21 | @import "about"; 22 | @import "image-slider"; 23 | @import "testimonial"; 24 | @import "brand-logo"; 25 | @import "timers"; 26 | @import "breadcrumb"; 27 | @import "sidebar"; 28 | @import "shop"; 29 | @import "product-details"; 30 | @import "cart"; 31 | @import "compare"; 32 | @import "checkout"; 33 | @import "contact"; 34 | @import "blog-details"; 35 | @import "login-register"; 36 | @import "my-account"; 37 | @import "404"; 38 | @import "video-popup"; 39 | 40 | // ADMIN DASHBOARD 41 | 42 | @import "admin-pages"; 43 | -------------------------------------------------------------------------------- /src/redux/reducers/wishlistReducer.js: -------------------------------------------------------------------------------- 1 | import { 2 | ADD_TO_WISHLIST, 3 | DELETE_FROM_WISHLIST, 4 | DELETE_ALL_FROM_WISHLIST 5 | } from "../actions/wishlistActions"; 6 | 7 | const initState = []; 8 | 9 | const wishlistReducer = (state = initState, action) => { 10 | const wishlistItems = state, 11 | product = action.payload; 12 | 13 | if (action.type === ADD_TO_WISHLIST) { 14 | const wishlistItem = wishlistItems.filter( 15 | item => item.id === product.id 16 | )[0]; 17 | if (wishlistItem === undefined) { 18 | return [...wishlistItems, product]; 19 | } else { 20 | return wishlistItems; 21 | } 22 | } 23 | 24 | if (action.type === DELETE_FROM_WISHLIST) { 25 | const remainingItems = (wishlistItems, product) => 26 | wishlistItems.filter(wishlistItem => wishlistItem.id !== product.id); 27 | return remainingItems(wishlistItems, product); 28 | } 29 | 30 | if (action.type === DELETE_ALL_FROM_WISHLIST) { 31 | return wishlistItems.filter(item => { 32 | return false; 33 | }); 34 | } 35 | 36 | return wishlistItems; 37 | }; 38 | 39 | export default wishlistReducer; 40 | -------------------------------------------------------------------------------- /src/components/product/ShopTag.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import { setActiveSort } from "../../helpers/product"; 4 | 5 | const ShopTag = ({ tags, getSortParams }) => { 6 | return ( 7 |
8 |

Tag

9 |
10 | {tags ? ( 11 |
    12 | {tags.map((tag, key) => { 13 | return ( 14 |
  • 15 | 23 |
  • 24 | ); 25 | })} 26 |
27 | ) : ( 28 | "No tags found" 29 | )} 30 |
31 |
32 | ); 33 | }; 34 | 35 | ShopTag.propTypes = { 36 | getSortParams: PropTypes.func, 37 | tags: PropTypes.array 38 | }; 39 | 40 | export default ShopTag; 41 | -------------------------------------------------------------------------------- /src/data/image-slider/image-slider-two.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "1", 4 | "image": "/assets/img/image-slider/image-slider-6.jpg", 5 | "link": "/shop-grid-standard" 6 | }, 7 | { 8 | "id": "2", 9 | "image": "/assets/img/image-slider/image-slider-7.jpg", 10 | "link": "/shop-grid-standard" 11 | }, 12 | { 13 | "id": "3", 14 | "image": "/assets/img/image-slider/image-slider-8.jpg", 15 | "link": "/shop-grid-standard" 16 | }, 17 | { 18 | "id": "4", 19 | "image": "/assets/img/image-slider/image-slider-9.jpg", 20 | "link": "/shop-grid-standard" 21 | }, 22 | { 23 | "id": "5", 24 | "image": "/assets/img/image-slider/image-slider-10.jpg", 25 | "link": "/shop-grid-standard" 26 | }, 27 | { 28 | "id": "6", 29 | "image": "/assets/img/image-slider/image-slider-11.jpg", 30 | "link": "/shop-grid-standard" 31 | }, 32 | { 33 | "id": "7", 34 | "image": "/assets/img/image-slider/image-slider-12.jpg", 35 | "link": "/shop-grid-standard" 36 | }, 37 | { 38 | "id": "8", 39 | "image": "/assets/img/image-slider/image-slider-13.jpg", 40 | "link": "/shop-grid-standard" 41 | } 42 | ] 43 | -------------------------------------------------------------------------------- /src/wrappers/image-slider/ImageSliderOne.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import Swiper from "react-id-swiper"; 3 | import ImageSliderOneSingle from "../../components/image-slider/ImageSliderOneSingle"; 4 | import imageData from "../../data/image-slider/image-slider-one.json"; 5 | 6 | const ImageSliderOne = () => { 7 | const settings = { 8 | loop: false, 9 | grabCursor: true, 10 | breakpoints: { 11 | 1024: { 12 | slidesPerView: 5 13 | }, 14 | 768: { 15 | slidesPerView: 4 16 | }, 17 | 640: { 18 | slidesPerView: 3 19 | }, 20 | 320: { 21 | slidesPerView: 2 22 | } 23 | } 24 | }; 25 | 26 | return ( 27 |
28 |
29 | 30 | {imageData && 31 | imageData.map((single, key) => { 32 | return ( 33 | 38 | ); 39 | })} 40 | 41 |
42 |
43 | ); 44 | }; 45 | 46 | export default ImageSliderOne; 47 | -------------------------------------------------------------------------------- /src/wrappers/image-slider/ImageSliderTwo.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import Swiper from "react-id-swiper"; 3 | import ImageSliderOneSingle from "../../components/image-slider/ImageSliderOneSingle"; 4 | import imageData from "../../data/image-slider/image-slider-two.json"; 5 | 6 | const ImageSliderTwo = () => { 7 | const settings = { 8 | loop: false, 9 | grabCursor: true, 10 | breakpoints: { 11 | 1024: { 12 | slidesPerView: 8 13 | }, 14 | 768: { 15 | slidesPerView: 4 16 | }, 17 | 640: { 18 | slidesPerView: 3 19 | }, 20 | 320: { 21 | slidesPerView: 2 22 | } 23 | } 24 | }; 25 | 26 | return ( 27 |
28 |
29 | 30 | {imageData && 31 | imageData.map((single, key) => { 32 | return ( 33 | 38 | ); 39 | })} 40 | 41 |
42 |
43 | ); 44 | }; 45 | 46 | export default ImageSliderTwo; 47 | -------------------------------------------------------------------------------- /src/components/header/OffcanvasMenu.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import { Link } from "react-router-dom"; 4 | import HeaderSocial from "./sub-components/HeaderSocial"; 5 | import NavMenu from "./NavMenu"; 6 | 7 | const OffcanvasMenu = ({ activeState, getActiveState }) => { 8 | return ( 9 |
10 |
11 | 17 |
18 |
19 | 20 | 24 | 25 |
26 | {/* nav menu*/} 27 | 28 | 29 | {/* header social */} 30 | 31 |
32 | ); 33 | }; 34 | 35 | OffcanvasMenu.propTypes = { 36 | activeState: PropTypes.bool, 37 | getActiveState: PropTypes.func 38 | }; 39 | 40 | export default OffcanvasMenu; 41 | -------------------------------------------------------------------------------- /src/redux/actions/wishlistActions.js: -------------------------------------------------------------------------------- 1 | export const ADD_TO_WISHLIST = "ADD_TO_WISHLIST"; 2 | export const DELETE_FROM_WISHLIST = "DELETE_FROM_WISHLIST"; 3 | export const DELETE_ALL_FROM_WISHLIST = "DELETE_ALL_FROM_WISHLIST"; 4 | 5 | // add to wishlist 6 | export const addToWishlist = (item, addToast) => { 7 | return dispatch => { 8 | if (addToast) { 9 | addToast("Added To Wishlist", { 10 | appearance: "success", 11 | autoDismiss: true 12 | }); 13 | } 14 | dispatch({ type: ADD_TO_WISHLIST, payload: item }); 15 | }; 16 | }; 17 | 18 | // delete from wishlist 19 | export const deleteFromWishlist = (item, addToast) => { 20 | return dispatch => { 21 | if (addToast) { 22 | addToast("Removed From Wishlist", { 23 | appearance: "error", 24 | autoDismiss: true 25 | }); 26 | } 27 | dispatch({ type: DELETE_FROM_WISHLIST, payload: item }); 28 | }; 29 | }; 30 | 31 | //delete all from wishlist 32 | export const deleteAllFromWishlist = addToast => { 33 | return dispatch => { 34 | if (addToast) { 35 | addToast("Removed All From Wishlist", { 36 | appearance: "error", 37 | autoDismiss: true 38 | }); 39 | } 40 | dispatch({ type: DELETE_ALL_FROM_WISHLIST }); 41 | }; 42 | }; 43 | -------------------------------------------------------------------------------- /src/redux/constants/productConstants.js: -------------------------------------------------------------------------------- 1 | export const FETCH_PRODUCTS_LOADING = "FETCH_PRODUCTS_LOADING"; 2 | export const FETCH_PRODUCTS_SUCCESS = "FETCH_PRODUCTS_SUCCESS"; 3 | export const FETCH_PRODUCTS_FAIL = "FETCH_PRODUCTS_FAIL"; 4 | 5 | export const PRODUCT_DELETE_REQUEST = "PRODUCT_DELETE_REQUEST"; 6 | export const PRODUCT_DELETE_SUCCESS = "PRODUCT_DELETE_SUCCESS"; 7 | export const PRODUCT_DELETE_FAIL = "PRODUCT_DELETE_FAIL"; 8 | export const PRODUCT_DELETE_RESET = "PRODUCT_DELETE_RESET"; 9 | 10 | export const PRODUCT_CREATE_REQUEST = "PRODUCT_CREATE_REQUEST"; 11 | export const PRODUCT_CREATE_SUCCESS = "PRODUCT_CREATE_SUCCESS"; 12 | export const PRODUCT_CREATE_FAIL = "PRODUCT_CREATE_FAIL"; 13 | export const PRODUCT_CREATE_RESET = "PRODUCT_CREATE_RESET"; 14 | 15 | export const PRODUCT_BY_ID_REQUEST = "PRODUCT_BY_ID_REQUEST"; 16 | export const PRODUCT_BY_ID_SUCCESS = "PRODUCT_BY_ID_SUCCESS"; 17 | export const PRODUCT_BY_ID_FAIL = "PRODUCT_BY_ID_FAIL"; 18 | export const PRODUCT_BY_ID_RESET = "PRODUCT_BY_ID_RESET"; 19 | 20 | export const PRODUCT_UPDATE_REQUEST = 'PRODUCT_UPDATE_REQUEST' 21 | export const PRODUCT_UPDATE_SUCCESS = 'PRODUCT_UPDATE_SUCCESS' 22 | export const PRODUCT_UPDATE_FAIL = 'PRODUCT_UPDATE_FAIL' 23 | export const PRODUCT_UPDATE_RESET = 'PRODUCT_UPDATE_RESET' 24 | -------------------------------------------------------------------------------- /src/wrappers/product/ShopSidebar.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import { 4 | getIndividualCategories, 5 | getIndividualColors 6 | } from "../../helpers/product"; 7 | import ShopSearch from "../../components/product/ShopSearch"; 8 | import ShopCategories from "../../components/product/ShopCategories"; 9 | import ShopColor from "../../components/product/ShopColor"; 10 | 11 | 12 | 13 | const ShopSidebar = ({ products, getSortParams, sideSpaceClass,}) => { 14 | const uniqueCategories = getIndividualCategories(products); 15 | const uniqueColors = getIndividualColors(products); 16 | 17 | return ( 18 |
19 | {/* shop search */} 20 | 21 | 22 | {/* filter by categories */} 23 | 27 | {/* filter by color */} 28 | 29 |
30 | ); 31 | }; 32 | 33 | ShopSidebar.propTypes = { 34 | getSortParams: PropTypes.func, 35 | products: PropTypes.array, 36 | sideSpaceClass: PropTypes.string, 37 | }; 38 | 39 | export default ShopSidebar; 40 | -------------------------------------------------------------------------------- /src/assets/scss/_variables.scss: -------------------------------------------------------------------------------- 1 | // Font Family 2 | $poppins: "Poppins", sans-serif; 3 | $abrilfatface: "Abril Fatface", cursive; 4 | $cormorantgaramond: "Cormorant Garamond"; 5 | $greatvibes: "Great Vibes", cursive; 6 | $lobster: "Lobster", cursive; 7 | $josefin: "Josefin Sans", sans-serif; 8 | 9 | // text Colors --------------- 10 | 11 | $white: #ffffff; 12 | $black: #000000; 13 | $grey: #f6f7f8; 14 | $red: #f6f7f8; 15 | $green: #f6f7f8; 16 | 17 | // bg Colors --------------- 18 | 19 | $bg-white: #ffffff; 20 | $bg-black: #000000; 21 | $bg-grey: #f6f6f8; 22 | $bg-purple: #f0e0ff; 23 | 24 | // Heading Color 25 | $heading-color: #000000; 26 | 27 | // Theme Color 28 | // $theme-color: #a749ff; 29 | // $theme-color: #ff9800; 30 | $theme-color: #f3b632; 31 | 32 | // Responsive Variables 33 | $xx-layout: "only screen and (min-width: 1366px) and (max-width: 1600px)"; 34 | $xl-layout: "only screen and (min-width: 1200px) and (max-width: 1365px)"; 35 | $lg-layout: "only screen and (min-width: 992px) and (max-width: 1199px)"; 36 | $md-layout: "only screen and (min-width: 768px) and (max-width: 991px)"; 37 | $xs-layout: "only screen and (max-width: 767px)"; 38 | $sm-layout: "only screen and (min-width: 576px) and (max-width: 767px)"; 39 | $xxs-layout: "only screen and (min-width: 320px) and (max-width: 479px)"; 40 | -------------------------------------------------------------------------------- /src/data/form/districts.js: -------------------------------------------------------------------------------- 1 | const Districts = [ 2 | "Gazipur", 3 | "Bagerhat", 4 | "Bandarban", 5 | "Barguna", 6 | "Barishal", 7 | "Bhola", 8 | "Bogura", 9 | "Brahmanbaria", 10 | "Chandpur", 11 | "Chapai Nawabganj", 12 | "Chattogram", 13 | "Chuadanga", 14 | "Cox's Bazar", 15 | "Cumilla", 16 | "Dhaka", 17 | "Dinajpur", 18 | "Faridpur", 19 | "Feni", 20 | "Gaibandha", 21 | "Gopalganj", 22 | "Habiganj", 23 | "Jamalpur", 24 | "Jashore", 25 | "Jhalokati", 26 | "Jhenaidah", 27 | "Joypurhat", 28 | "Khagrachari", 29 | "Khulna", 30 | "Kishoreganj", 31 | "Kurigram", 32 | "Kushtia", 33 | "Lakshmipur", 34 | "Lalmonirhat", 35 | "Madaripur", 36 | "Magura", 37 | "Manikganj", 38 | "Meherpur", 39 | "Moulvibazar", 40 | "Munshiganj", 41 | "Mymensingh", 42 | "Naogaon", 43 | "Narail", 44 | "Narayanganj", 45 | "Narsingdi", 46 | "Natore", 47 | "Netrokona", 48 | "Nilphamari", 49 | "Noakhali", 50 | "Pabna", 51 | "Panchagarh", 52 | "Patuakhali", 53 | "Pirojpur", 54 | "Rajbari", 55 | "Rajshahi", 56 | "Rangamati", 57 | "Rangpur", 58 | "Satkhira", 59 | "Shariatpur", 60 | "Sherpur", 61 | "Sirajganj", 62 | "Sunamganj", 63 | "Sylhet", 64 | "Tangail", 65 | "Thakurgaon", 66 | ]; 67 | 68 | export default Districts; 69 | -------------------------------------------------------------------------------- /src/assets/scss/_breadcrumb.scss: -------------------------------------------------------------------------------- 1 | /*------ 16. Breadcrumb style --------*/ 2 | 3 | .breadcrumb-content { 4 | ul { 5 | li { 6 | display: inline-block; 7 | font-size: 15px; 8 | font-weight: 500; 9 | color: #5b5858; 10 | margin-right: 18px; 11 | text-transform: uppercase; 12 | position: relative; 13 | &::before { 14 | position: absolute; 15 | width: 18px; 16 | height: 1px; 17 | background-color: #5b5858; 18 | content: ""; 19 | right: -21px; 20 | top: 12px; 21 | z-index: 99; 22 | transform: rotate(115deg); 23 | } 24 | &:last-child::before { 25 | display: none; 26 | } 27 | a { 28 | color: #5b5858; 29 | &:hover { 30 | color: $theme-color; 31 | } 32 | } 33 | } 34 | } 35 | 36 | span { 37 | & > span { 38 | display: inline-block; 39 | font-size: 15px; 40 | font-weight: 500; 41 | text-transform: uppercase; 42 | 43 | & > a { 44 | font-weight: 500; 45 | color: #5b5858; 46 | &:hover { 47 | color: $theme-color; 48 | } 49 | } 50 | 51 | & > span { 52 | margin-right: 0; 53 | margin: 0 15px; 54 | } 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/components/product/ProductImageGallerySticky.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | 4 | const productImageGallerySticky = ({ product }) => { 5 | return ( 6 |
7 | {product.discount || product.new ? ( 8 |
9 | {product.discount ? ( 10 | -{product.discount}% 11 | ) : ( 12 | "" 13 | )} 14 | {product.new ? New : ""} 15 |
16 | ) : ( 17 | "" 18 | )} 19 |
20 | {product.image && 21 | product.image.map((single, key) => { 22 | return ( 23 |
24 | 29 |
30 | ); 31 | })} 32 |
33 |
34 | ); 35 | }; 36 | 37 | productImageGallerySticky.propTypes = { 38 | product: PropTypes.object 39 | }; 40 | 41 | export default productImageGallerySticky; 42 | -------------------------------------------------------------------------------- /src/assets/scss/_preloader.scss: -------------------------------------------------------------------------------- 1 | /*--- flone preloader ---*/ 2 | 3 | .flone-preloader-wrapper { 4 | position: fixed; 5 | top: 0; 6 | left: 0; 7 | right: 0; 8 | bottom: 0; 9 | background-color: #f7f7f7; 10 | z-index: 999999; 11 | } 12 | 13 | .flone-preloader { 14 | width: 50px; 15 | height: 50px; 16 | display: inline-block; 17 | padding: 0; 18 | text-align: left; 19 | box-sizing: border-box; 20 | position: absolute; 21 | top: 50%; 22 | left: 50%; 23 | margin-left: -25px; 24 | margin-top: -25px; 25 | } 26 | 27 | .flone-preloader span { 28 | position: absolute; 29 | display: inline-block; 30 | width: 50px; 31 | height: 50px; 32 | border-radius: 100%; 33 | background: #7460ef; 34 | -webkit-animation: preloader 1.3s linear infinite; 35 | animation: preloader 1.3s linear infinite; 36 | } 37 | 38 | .flone-preloader span:last-child { 39 | animation-delay: -0.8s; 40 | -webkit-animation-delay: -0.8s; 41 | } 42 | 43 | @keyframes preloader { 44 | 0% { 45 | transform: scale(0, 0); 46 | opacity: 0.5; 47 | } 48 | 100% { 49 | transform: scale(1, 1); 50 | opacity: 0; 51 | } 52 | } 53 | 54 | @-webkit-keyframes preloader { 55 | 0% { 56 | -webkit-transform: scale(0, 0); 57 | opacity: 0.5; 58 | } 59 | 100% { 60 | -webkit-transform: scale(1, 1); 61 | opacity: 0; 62 | } 63 | } 64 | 65 | /*--- end of flone preloader ---*/ 66 | -------------------------------------------------------------------------------- /src/components/footer/FooterNewsletter.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import SocialLinks from "./sub-components/SocialLinks"; 4 | // import SubscribeEmail from "./sub-components/SubscribeEmail"; 5 | 6 | const FooterNewsletter = ({ 7 | spaceBottomClass, 8 | spaceLeftClass, 9 | sideMenu, 10 | colorClass, 11 | widgetColorClass, 12 | }) => { 13 | return ( 14 |
19 |
20 |

SUBSCRIBE

21 |
22 |
23 |

Get E-mail updates about our latest shop and special offers.

24 | {/* subscribe email */} 25 | {/* */} 26 | 27 |
28 |
29 | ); 30 | }; 31 | 32 | FooterNewsletter.propTypes = { 33 | spaceBottomClass: PropTypes.string, 34 | spaceLeftClass: PropTypes.string, 35 | colorClass: PropTypes.string, 36 | widgetColorClass: PropTypes.string, 37 | }; 38 | 39 | export default FooterNewsletter; 40 | -------------------------------------------------------------------------------- /src/wrappers/newsletter/Newsletter.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import SubscribeEmail from "../../components/newsletter/SubscribeEmail"; 4 | 5 | const Newsletter = ({ 6 | bgColorClass, 7 | spaceBottomClass, 8 | spaceLeftClass, 9 | spaceRightClass 10 | }) => { 11 | return ( 12 |
19 |
20 |
21 |
22 |
23 |

Subscribe

24 |

Subscribe to our newsletter to receive news on update

25 | {/* subscription form */} 26 | 27 |
28 |
29 |
30 |
31 |
32 | ); 33 | }; 34 | 35 | Newsletter.propTypes = { 36 | bgColorClass: PropTypes.string, 37 | spaceBottomClass: PropTypes.string, 38 | spaceLeftClass: PropTypes.string, 39 | spaceRightClass: PropTypes.string 40 | }; 41 | 42 | export default Newsletter; 43 | -------------------------------------------------------------------------------- /src/components/header/sub-components/MobileWidgets.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | const MobileWidgets = () => { 4 | return ( 5 |
6 |
7 |
8 | 18 |
19 |
20 | {/*Off Canvas Widget Social Start*/} 21 | 35 | {/*Off Canvas Widget Social End*/} 36 |
37 | ); 38 | }; 39 | 40 | export default MobileWidgets; 41 | -------------------------------------------------------------------------------- /src/components/HomeModal.js: -------------------------------------------------------------------------------- 1 | import React,{useState,useEffect}from 'react'; 2 | import Modal from 'react-modal'; 3 | import {Container,Row,Col} from 'react-bootstrap'; 4 | import homemodal from './homemodal.png'; 5 | 6 | const customStyles = { 7 | content: { 8 | top: '50%', 9 | left: '50%', 10 | right: 'auto', 11 | bottom: 'auto', 12 | marginRight: '-50%', 13 | transform: 'translate(-50%, -50%)', 14 | }, 15 | }; 16 | 17 | function HomeModal() { 18 | 19 | const [modalIsOpen, setIsOpen] = useState(false); 20 | 21 | 22 | useEffect(()=>{ 23 | let pop_status = localStorage.getItem('pop_status'); 24 | if(!pop_status){ 25 | setIsOpen(true); 26 | localStorage.setItem('pop_status',1); 27 | } 28 | },[]) 29 | if(!modalIsOpen) return null; 30 | 31 | 32 | 33 | function closeModal() { 34 | setIsOpen(false); 35 | } 36 | 37 | return ( 38 | 39 | 40 | 41 | 47 | 48 | start modal 49 | 50 | 51 | 52 | 53 | ); 54 | } 55 | 56 | 57 | export default HomeModal; -------------------------------------------------------------------------------- /src/pages/other/About.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React, { Fragment } from "react"; 3 | import MetaTags from "react-meta-tags"; 4 | import { BreadcrumbsItem } from "react-breadcrumbs-dynamic"; 5 | import LayoutOne from "../../layouts/LayoutOne"; 6 | import Breadcrumb from "../../wrappers/breadcrumb/Breadcrumb"; 7 | import SectionTitleWithText from "../../components/section-title/SectionTitleWithText"; 8 | 9 | 10 | const About = ({ location }) => { 11 | const { pathname } = location; 12 | 13 | return ( 14 | 15 | 16 | Wonders Tech | About Us 17 | 21 | 22 | Home 23 | 24 | About us 25 | 26 | 27 | {/* breadcrumb */} 28 | 29 | 30 | {/* section title with text */} 31 | 32 | 33 | 34 | 35 | ); 36 | }; 37 | 38 | About.propTypes = { 39 | location: PropTypes.object, 40 | }; 41 | 42 | export default About; 43 | -------------------------------------------------------------------------------- /src/pages/other/ActivateAccount.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from "react"; 2 | import { Link } from "react-router-dom"; 3 | import Alert from "../../components/alert/Alert"; 4 | import Loader from "../../components/Loader/Loader"; 5 | 6 | const ActivateAccount = ({ match }) => { 7 | const [error, setError] = useState(""); 8 | const [loading, setLoading] = useState(false); 9 | // const [status, setStatus] = useState(""); 10 | useEffect(() => { 11 | setLoading(true); 12 | fetch(`/api/users/activate/${match.params.token}`) 13 | .then((res) => res.json()) 14 | .then((data) => { 15 | // setStatus(data.message); 16 | setLoading(false); 17 | }) 18 | .catch((err) => { 19 | setLoading(false); 20 | console.log(err); 21 | setError(err.message); 22 | }); 23 | }, [match]); 24 | 25 | // console.log(error); 26 | 27 | return ( 28 | <> 29 | {loading ? ( 30 | 31 | ) : error ? ( 32 | {error} 33 | ) : ( 34 |
35 | 36 | Your acccount is Active Please 37 | 38 | {" "} 39 | Login{" "} 40 | 41 | 42 |
43 | )} 44 | 45 | ); 46 | }; 47 | 48 | export default ActivateAccount; 49 | -------------------------------------------------------------------------------- /src/components/footer/sub-components/SocialLinks.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | const SocialLinks = () => { 4 | return ( 5 | <> 6 |
7 | 50 |
51 | 52 | ); 53 | }; 54 | 55 | export default SocialLinks; 56 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import "react-app-polyfill/ie11"; 2 | import "react-app-polyfill/stable"; 3 | import React from "react"; 4 | import ReactDOM from "react-dom"; 5 | import { createStore, applyMiddleware } from "redux"; 6 | import thunk from "redux-thunk"; 7 | import { save, load } from "redux-localstorage-simple"; 8 | import { Provider } from "react-redux"; 9 | // import { fetchProducts } from "./redux/actions/productActions"; 10 | import rootReducer from "./redux/reducers/rootReducer"; 11 | // import products from "./data/products.json"; 12 | import App from "./App"; 13 | import "./assets/scss/style.scss"; 14 | import * as serviceWorker from "./serviceWorker"; 15 | 16 | import { composeWithDevTools } from "redux-devtools-extension"; 17 | 18 | const notSaveStorage = [ 19 | "userDelete", 20 | "userDetails", 21 | "productDelete", 22 | "productCreate", 23 | ]; 24 | 25 | const store = createStore( 26 | rootReducer, 27 | load(), 28 | composeWithDevTools( 29 | applyMiddleware(thunk, save({ ignoreStates: notSaveStorage })) 30 | ) 31 | ); 32 | 33 | // fetch products from json file 34 | // store.dispatch(fetchProducts()); 35 | 36 | ReactDOM.render( 37 | 38 | 39 | , 40 | document.getElementById("root") 41 | ); 42 | 43 | // If you want your app to work offline and load faster, you can change 44 | // unregister() to register() below. Note this comes with some pitfalls. 45 | // Learn more about service workers: https://bit.ly/CRA-PWA 46 | serviceWorker.unregister(); 47 | -------------------------------------------------------------------------------- /src/wrappers/product/ProductSliderFive.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import Swiper from "react-id-swiper"; 4 | import ProductGridEleven from "./ProductGridEleven"; 5 | 6 | const ProductSliderFive = ({ 7 | spaceBottomClass, 8 | category, 9 | productGridStyleClass, 10 | type 11 | }) => { 12 | const settings = { 13 | loop: false, 14 | slidesPerView: 4, 15 | grabCursor: true, 16 | breakpoints: { 17 | 1024: { 18 | slidesPerView: 4 19 | }, 20 | 768: { 21 | slidesPerView: 3 22 | }, 23 | 640: { 24 | slidesPerView: 2 25 | }, 26 | 320: { 27 | slidesPerView: 1 28 | } 29 | } 30 | }; 31 | 32 | return ( 33 |
38 |
39 | 40 | 48 | 49 |
50 |
51 | ); 52 | }; 53 | 54 | ProductSliderFive.propTypes = { 55 | category: PropTypes.string, 56 | productGridStyleClass: PropTypes.string, 57 | spaceBottomClass: PropTypes.string 58 | }; 59 | 60 | export default ProductSliderFive; 61 | -------------------------------------------------------------------------------- /src/wrappers/product/RelatedProductSlider.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import Swiper from "react-id-swiper"; 4 | import SectionTitle from "../../components/section-title/SectionTitle"; 5 | import ProductGrid from "./ProductGrid"; 6 | 7 | const RelatedProductSlider = ({ spaceBottomClass, category }) => { 8 | const settings = { 9 | loop: true, 10 | slidesPerView: 2, 11 | grabCursor: true, 12 | breakpoints: { 13 | 1024: { 14 | slidesPerView: 2 15 | }, 16 | 768: { 17 | slidesPerView: 2 18 | }, 19 | 640: { 20 | slidesPerView: 2 21 | }, 22 | 320: { 23 | slidesPerView: 1 24 | } 25 | } 26 | }; 27 | 28 | return ( 29 |
34 |
35 | 40 |
41 | 42 | 47 | 48 |
49 |
50 |
51 | ); 52 | }; 53 | 54 | RelatedProductSlider.propTypes = { 55 | category: PropTypes.string, 56 | spaceBottomClass: PropTypes.string 57 | }; 58 | 59 | export default RelatedProductSlider; 60 | -------------------------------------------------------------------------------- /src/pages/admin/AdminOrderList.jsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect } from "react"; 2 | import OrdersList from "../../components/admin/OrderList"; 3 | import LayoutAdmin from "../../layouts/LayoutAdmin"; 4 | import { Link } from "react-router-dom"; 5 | import { useDispatch, useSelector } from "react-redux"; 6 | import { getOrderList } from "../../redux/actions/orderActions"; 7 | import Loader from "../../components/Loader/Loader"; 8 | import Alert from "../../components/alert/Alert"; 9 | 10 | const AdminOrders = ({ history }) => { 11 | const dispatch = useDispatch(); 12 | 13 | const { userInfo } = useSelector((state) => state.userLogin); 14 | 15 | const { loading, error, orders } = useSelector((state) => state.orderList); 16 | 17 | useEffect(() => { 18 | if (userInfo && userInfo.isAdmin) { 19 | dispatch(getOrderList()); 20 | } else { 21 | history.push("/"); 22 | } 23 | }, [dispatch, userInfo, history]); 24 | 25 | return ( 26 | <> 27 | 28 |
29 |
30 |

Orders List

31 |
32 | 33 | 34 | 35 | {loading ? ( 36 | 37 | ) : error ? ( 38 | {error} 39 | ) : ( 40 | 41 | )} 42 |
43 |
44 | 45 | ); 46 | }; 47 | 48 | export default AdminOrders; 49 | -------------------------------------------------------------------------------- /src/wrappers/product/ProductSliderTwo.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import Swiper from "react-id-swiper"; 4 | import SectionTitle from "../../components/section-title/SectionTitle"; 5 | import ProductGrid from "./ProductGrid"; 6 | 7 | const ProductSliderTwo = ({ spaceBottomClass, category }) => { 8 | const settings = { 9 | loop: false, 10 | slidesPerView: 4, 11 | grabCursor: true, 12 | breakpoints: { 13 | 1024: { 14 | slidesPerView: 4 15 | }, 16 | 768: { 17 | slidesPerView: 3 18 | }, 19 | 640: { 20 | slidesPerView: 2 21 | }, 22 | 320: { 23 | slidesPerView: 1 24 | } 25 | } 26 | }; 27 | 28 | return ( 29 |
34 |
35 | 41 |
42 | 43 | 48 | 49 |
50 |
51 |
52 | ); 53 | }; 54 | 55 | ProductSliderTwo.propTypes = { 56 | category: PropTypes.string, 57 | spaceBottomClass: PropTypes.string 58 | }; 59 | 60 | export default ProductSliderTwo; 61 | -------------------------------------------------------------------------------- /src/wrappers/category/CategoryOneSlider.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import Swiper from "react-id-swiper"; 4 | import categoryData from "../../data/category/category-one.json"; 5 | import CategoryOneSingle from "../../components/category/CategoryOneSingle.js"; 6 | 7 | const CategoryOneSlider = ({ spaceBottomClass }) => { 8 | // swiper slider settings 9 | const settings = { 10 | loop: false, 11 | spaceBetween: 30, 12 | breakpoints: { 13 | 992: { 14 | slidesPerView: 3 15 | }, 16 | 576: { 17 | slidesPerView: 2 18 | }, 19 | 320: { 20 | slidesPerView: 1 21 | } 22 | } 23 | }; 24 | return ( 25 |
28 |
29 |
30 |
31 | 32 | {categoryData && 33 | categoryData.map((single, key) => { 34 | return ( 35 | 40 | ); 41 | })} 42 | 43 |
44 |
45 |
46 |
47 | ); 48 | }; 49 | 50 | CategoryOneSlider.propTypes = { 51 | spaceBottomClass: PropTypes.string 52 | }; 53 | 54 | export default CategoryOneSlider; 55 | -------------------------------------------------------------------------------- /src/wrappers/product/ProductSlider.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import Swiper from "react-id-swiper"; 4 | import SectionTitle from "../../components/section-title/SectionTitle"; 5 | import ProductGridTwo from "./ProductGridTwo"; 6 | 7 | const ProductSlider = ({ spaceBottomClass, category }) => { 8 | const settings = { 9 | loop: false, 10 | slidesPerView: 4, 11 | grabCursor: true, 12 | breakpoints: { 13 | 1024: { 14 | slidesPerView: 4 15 | }, 16 | 768: { 17 | slidesPerView: 3 18 | }, 19 | 640: { 20 | slidesPerView: 2 21 | }, 22 | 320: { 23 | slidesPerView: 1 24 | } 25 | } 26 | }; 27 | 28 | return ( 29 |
34 |
35 | 41 |
42 | 43 | 49 | 50 |
51 |
52 |
53 | ); 54 | }; 55 | 56 | ProductSlider.propTypes = { 57 | category: PropTypes.string, 58 | spaceBottomClass: PropTypes.string 59 | }; 60 | 61 | export default ProductSlider; 62 | -------------------------------------------------------------------------------- /src/wrappers/hero-slider/HeroSliderOne.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import Swiper from "react-id-swiper"; 3 | import heroSliderData from "../../data/hero-sliders/hero-slider-one.json"; 4 | import HeroSliderOneSingle from "../../components/hero-slider/HeroSliderOneSingle.js"; 5 | 6 | const HeroSliderOne = () => { 7 | const params = { 8 | effect: "fade", 9 | loop: true, 10 | speed: 1000, 11 | autoplay: { 12 | delay: 5000, 13 | disableOnInteraction: false 14 | }, 15 | watchSlidesVisibility: true, 16 | navigation: { 17 | nextEl: ".swiper-button-next", 18 | prevEl: ".swiper-button-prev" 19 | }, 20 | // renderPrevButton: () => ( 21 | // 24 | // ), 25 | // renderNextButton: () => ( 26 | // 29 | // ) 30 | }; 31 | 32 | return ( 33 |
34 |
35 | 36 | {heroSliderData && 37 | heroSliderData.map((single, key) => { 38 | return ( 39 | 44 | ); 45 | })} 46 | 47 |
48 |
49 | ); 50 | }; 51 | 52 | export default HeroSliderOne; 53 | -------------------------------------------------------------------------------- /src/components/hero-slider/HeroSliderOneSingle.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import { Link } from "react-router-dom"; 4 | 5 | const HeroSliderOneSingle = ({ data, sliderClassName }) => { 6 | return ( 7 |
12 |
13 |
14 |
15 |
16 |

{data.title}

17 |

{data.subtitle}

18 |
19 | 23 | SHOP NOW 24 | 25 |
26 |
27 |
28 |
29 |
30 | 35 |
36 |
37 |
38 |
39 |
40 | ); 41 | }; 42 | 43 | HeroSliderOneSingle.propTypes = { 44 | data: PropTypes.object, 45 | sliderClassName: PropTypes.string 46 | }; 47 | 48 | export default HeroSliderOneSingle; 49 | -------------------------------------------------------------------------------- /src/redux/constants/userConstants.js: -------------------------------------------------------------------------------- 1 | export const USER_LOGIN_REQUEST = "USER_LOGIN_REQUEST"; 2 | export const USER_LOGIN_SUCCESS = "USER_LOGIN_SUCCESS"; 3 | export const USER_LOGIN_FAIL = "USER_LOGIN_FAIL"; 4 | 5 | export const USER_LOGOUT = "USER_LOGOUT"; 6 | 7 | export const USER_REGISTER_REQUEST = "USER_REGISTER_REQUEST"; 8 | export const USER_REGISTER_SUCCESS = "USER_REGISTER_SUCCESS"; 9 | export const USER_REGISTER_FAIL = "USER_REGISTER_FAIL"; 10 | export const USER_REGISTER_RESET = "USER_REGISTER_RESET"; 11 | 12 | export const USER_DETAILS_REQUEST = "USER_DETAILS_REQUEST"; 13 | export const USER_DETAILS_SUCCESS = "USER_DETAILS_SUCCESS"; 14 | export const USER_DETAILS_FAIL = "USER_DETAILS_FAIL"; 15 | 16 | export const USER_PROFILE_UPDATE_REQUEST = "USER_PROFILE_UPDATE_REQUEST"; 17 | export const USER_PROFILE_UPDATE_SUCCESS = "USER_PROFILE_UPDATE_SUCCESS"; 18 | export const USER_PROFILE_UPDATE_FAIL = "USER_PROFILE_UPDATE_FAIL"; 19 | export const USER_PROFILE_RESET = "USER_PROFILE_RESET"; 20 | 21 | export const SAVE_USER_SHIPPING_ADDRESS = "SAVE_USER_SHIPPING_ADDRESS"; 22 | 23 | export const USER_LIST_REQUEST = "USER_LIST_REQUEST"; 24 | export const USER_LIST_SUCCESS = "USER_LIST_SUCCESS"; 25 | export const USER_LIST_FAIL = "USER_LIST_FAIL"; 26 | 27 | export const USER_DELETE_REQUEST = "USER_DELETE_REQUEST"; 28 | export const USER_DELETE_SUCCESS = "USER_DELETE_SUCCESS"; 29 | export const USER_DELETE_FAIL = "USER_DELETE_FAIL"; 30 | export const USER_DELETE_RESET = "USER_DELETE_RESET"; 31 | 32 | export const USER_EDIT_REQUEST = "USER_EDIT_REQUEST"; 33 | export const USER_EDIT_SUCCESS = "USER_EDIT_SUCCESS"; 34 | export const USER_EDIT_FAIL = "USER_EDIT_FAIL"; 35 | export const USER_EDIT_RESET = "USER_EDIT_RESET"; 36 | -------------------------------------------------------------------------------- /src/pages/home/HomeScreen.js: -------------------------------------------------------------------------------- 1 | import React, { Fragment, useEffect } from "react"; 2 | import MetaTags from "react-meta-tags"; 3 | import LayoutOne from "../../layouts/LayoutOne"; 4 | import HeroSliderOne from "../../wrappers/hero-slider/HeroSliderOne"; 5 | import FeatureIcon from "../../wrappers/feature-icon/FeatureIcon"; 6 | import TabProduct from "../../wrappers/product/TabProduct"; 7 | import { fetchProducts } from "../../redux/actions/productActions"; 8 | import { useDispatch } from "react-redux"; 9 | import products from "../../data/products.json"; 10 | import HomeModal from '../../components/HomeModal' 11 | 12 | const HomeScreen = () => { 13 | const dispatch = useDispatch(); 14 | useEffect(() => { 15 | dispatch(fetchProducts(products)); 16 | }, [dispatch]); 17 | 18 | return ( 19 | 20 | 21 | Wonders Tech 22 | 26 | 27 | 31 | 32 | {/*home modal */} 33 | {/* */} 34 | 35 | {/* hero slider */} 36 | 37 | 38 | 39 | 40 | {/* featured icon */} 41 | 42 | 43 | {/* tab product */} 44 | 45 | 46 | 47 | ); 48 | }; 49 | 50 | export default HomeScreen; 51 | -------------------------------------------------------------------------------- /src/components/header/sub-components/HeaderSocial.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | const HeaderSocial = () => { 4 | return ( 5 |
6 | 58 |
59 | ); 60 | }; 61 | 62 | export default HeaderSocial; 63 | -------------------------------------------------------------------------------- /src/components/header/HeaderTop.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import { multilanguage } from "redux-multilanguage"; 4 | import { connect } from "react-redux"; 5 | import { setCurrency } from "../../redux/actions/currencyActions"; 6 | import LanguageCurrencyChanger from "./sub-components/LanguageCurrencyChanger"; 7 | 8 | const HeaderTop = ({ 9 | currency, 10 | setCurrency, 11 | currentLanguageCode, 12 | dispatch, 13 | borderStyle, 14 | }) => { 15 | return ( 16 |
21 | 27 |
28 |

29 | E-mail: 30 | wonderstech@gmail.com 31 |

32 |
33 |
34 | ); 35 | }; 36 | 37 | HeaderTop.propTypes = { 38 | borderStyle: PropTypes.string, 39 | setCurrency: PropTypes.func, 40 | currency: PropTypes.object, 41 | currentLanguageCode: PropTypes.string, 42 | dispatch: PropTypes.func, 43 | }; 44 | 45 | const mapStateToProps = (state) => { 46 | return { 47 | currency: state.currencyData, 48 | }; 49 | }; 50 | 51 | const mapDispatchToProps = (dispatch) => { 52 | return { 53 | setCurrency: (currencyName) => { 54 | dispatch(setCurrency(currencyName)); 55 | }, 56 | }; 57 | }; 58 | 59 | export default connect( 60 | mapStateToProps, 61 | mapDispatchToProps 62 | )(multilanguage(HeaderTop)); 63 | -------------------------------------------------------------------------------- /src/components/product/ShopColor.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import { setActiveSort } from "../../helpers/product"; 4 | 5 | const ShopColor = ({ colors, getSortParams }) => { 6 | return ( 7 |
8 |

Color

9 |
10 | {colors ? ( 11 |
    12 |
  • 13 |
    14 | 22 |
    23 |
  • 24 | {colors.map((color, key) => { 25 | return ( 26 |
  • 27 |
    28 | 36 |
    37 |
  • 38 | ); 39 | })} 40 |
41 | ) : ( 42 | "No colors found" 43 | )} 44 |
45 |
46 | ); 47 | }; 48 | 49 | ShopColor.propTypes = { 50 | colors: PropTypes.array, 51 | getSortParams: PropTypes.func 52 | }; 53 | 54 | export default ShopColor; 55 | -------------------------------------------------------------------------------- /src/components/product/ShopTopActionFilter.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React, { Fragment } from "react"; 3 | import ShopTopFilter from "./ShopTopFilter"; 4 | import { toggleShopTopFilter } from "../../helpers/product"; 5 | 6 | const ShopTopActionFilter = ({ 7 | getFilterSortParams, 8 | productCount, 9 | sortedProductCount, 10 | products, 11 | getSortParams 12 | }) => { 13 | return ( 14 | 15 |
16 |
17 |
18 | 25 |
26 |

27 | Showing {sortedProductCount} of {productCount} result 28 |

29 |
30 | 31 |
32 | 35 |
36 |
37 | 38 | {/* shop top filter */} 39 | 40 |
41 | ); 42 | }; 43 | 44 | ShopTopActionFilter.propTypes = { 45 | getFilterSortParams: PropTypes.func, 46 | getSortParams: PropTypes.func, 47 | productCount: PropTypes.number, 48 | products: PropTypes.array, 49 | sortedProductCount: PropTypes.number 50 | }; 51 | 52 | export default ShopTopActionFilter; 53 | -------------------------------------------------------------------------------- /src/wrappers/product/NewProductSlider.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import Swiper from "react-id-swiper"; 4 | import SectionTitleThree from "../../components/section-title/SectionTitleThree"; 5 | import ProductGridTwo from "./ProductGridTwo"; 6 | 7 | const NewProductSlider = ({ 8 | spaceTopClass, 9 | spaceBottomClass, 10 | category, 11 | limit 12 | }) => { 13 | const settings = { 14 | loop: false, 15 | grabCursor: true, 16 | breakpoints: { 17 | 1024: { 18 | slidesPerView: 4 19 | }, 20 | 768: { 21 | slidesPerView: 3 22 | }, 23 | 640: { 24 | slidesPerView: 2 25 | }, 26 | 320: { 27 | slidesPerView: 1 28 | } 29 | } 30 | }; 31 | 32 | return ( 33 |
38 |
39 | 44 |
45 | 46 | 52 | 53 |
54 |
55 |
56 | ); 57 | }; 58 | 59 | NewProductSlider.propTypes = { 60 | category: PropTypes.string, 61 | limit: PropTypes.number, 62 | spaceBottomClass: PropTypes.string, 63 | spaceTopClass: PropTypes.string 64 | }; 65 | 66 | export default NewProductSlider; 67 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 20 | Wonders Smartshop 21 | 22 | 23 | 24 |
25 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /src/wrappers/product/ProductSliderSix.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import Swiper from "react-id-swiper"; 4 | import SectionTitle from "../../components/section-title/SectionTitle"; 5 | import ProductGridTwo from "./ProductGridTwo"; 6 | 7 | const ProductSliderSix = ({ spaceBottomClass, spaceTopClass, category }) => { 8 | const settings = { 9 | loop: false, 10 | slidesPerView: 4, 11 | grabCursor: true, 12 | breakpoints: { 13 | 1024: { 14 | slidesPerView: 4 15 | }, 16 | 768: { 17 | slidesPerView: 3 18 | }, 19 | 640: { 20 | slidesPerView: 2 21 | }, 22 | 320: { 23 | slidesPerView: 1 24 | } 25 | } 26 | }; 27 | 28 | return ( 29 |
34 |
35 | 43 |
44 | 45 | 50 | 51 |
52 |
53 |
54 | ); 55 | }; 56 | 57 | ProductSliderSix.propTypes = { 58 | category: PropTypes.string, 59 | spaceBottomClass: PropTypes.string 60 | }; 61 | 62 | export default ProductSliderSix; 63 | -------------------------------------------------------------------------------- /src/wrappers/product/ProductSliderFour.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import Swiper from "react-id-swiper"; 4 | import SectionTitleSeven from "../../components/section-title/SectionTitleSeven"; 5 | import ProductGridNine from "./ProductGridNine"; 6 | 7 | const ProductSliderFour = ({ spaceBottomClass, category }) => { 8 | const settings = { 9 | loop: false, 10 | slidesPerView: 4, 11 | grabCursor: true, 12 | breakpoints: { 13 | 1024: { 14 | slidesPerView: 4 15 | }, 16 | 768: { 17 | slidesPerView: 3 18 | }, 19 | 640: { 20 | slidesPerView: 2 21 | }, 22 | 320: { 23 | slidesPerView: 1 24 | } 25 | } 26 | }; 27 | 28 | return ( 29 |
34 |
35 | 42 |
43 | 44 | 50 | 51 |
52 |
53 |
54 | ); 55 | }; 56 | 57 | ProductSliderFour.propTypes = { 58 | category: PropTypes.string, 59 | spaceBottomClass: PropTypes.string 60 | }; 61 | 62 | export default ProductSliderFour; 63 | -------------------------------------------------------------------------------- /src/wrappers/brand-logo/BrandLogoSliderOne.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import Swiper from "react-id-swiper"; 4 | import BrandLogoOneSingle from "../../components/brand-logo/BrandLogoOneSingle"; 5 | import brandLogoData from "../../data/brand-logos/brand-logo-one.json"; 6 | 7 | const BrandLogoSliderOne = ({ spaceBottomClass, spaceTopClass }) => { 8 | const settings = { 9 | loop: true, 10 | autoplay: { 11 | delay: 3000, 12 | disableOnInteraction: false 13 | }, 14 | grabCursor: true, 15 | breakpoints: { 16 | 1024: { 17 | slidesPerView: 5 18 | }, 19 | 768: { 20 | slidesPerView: 4 21 | }, 22 | 640: { 23 | slidesPerView: 3 24 | }, 25 | 320: { 26 | slidesPerView: 2 27 | } 28 | } 29 | }; 30 | 31 | return ( 32 |
37 |
38 |
39 | 40 | {brandLogoData && 41 | brandLogoData.map((single, key) => { 42 | return ( 43 | 49 | ); 50 | })} 51 | 52 |
53 |
54 |
55 | ); 56 | }; 57 | 58 | BrandLogoSliderOne.propTypes = { 59 | spaceBottomClass: PropTypes.string, 60 | spaceTopClass: PropTypes.string 61 | }; 62 | 63 | export default BrandLogoSliderOne; 64 | -------------------------------------------------------------------------------- /src/components/product/ShopCategories.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import { setActiveSort } from "../../helpers/product"; 4 | 5 | const ShopCategories = ({ categories, getSortParams }) => { 6 | return ( 7 |
8 |

Categories

9 |
10 | {categories ? ( 11 |
    12 |
  • 13 |
    14 | 22 |
    23 |
  • 24 | {categories.map((category, key) => { 25 | return ( 26 |
  • 27 |
    28 | 37 |
    38 |
  • 39 | ); 40 | })} 41 |
42 | ) : ( 43 | "No categories found" 44 | )} 45 |
46 |
47 | ); 48 | }; 49 | 50 | ShopCategories.propTypes = { 51 | categories: PropTypes.array, 52 | getSortParams: PropTypes.func 53 | }; 54 | 55 | export default ShopCategories; 56 | -------------------------------------------------------------------------------- /src/wrappers/product/ProductSliderThree.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import Swiper from "react-id-swiper"; 4 | import SectionTitleSeven from "../../components/section-title/SectionTitleSeven"; 5 | import ProductGridEight from "./ProductGridEight"; 6 | 7 | const ProductSliderThree = ({ spaceBottomClass, category, colorClass }) => { 8 | const settings = { 9 | loop: false, 10 | slidesPerView: 4, 11 | grabCursor: true, 12 | breakpoints: { 13 | 1024: { 14 | slidesPerView: 4 15 | }, 16 | 768: { 17 | slidesPerView: 3 18 | }, 19 | 640: { 20 | slidesPerView: 2 21 | }, 22 | 320: { 23 | slidesPerView: 1 24 | } 25 | } 26 | }; 27 | 28 | return ( 29 |
34 |
35 | 42 |
43 | 44 | 50 | 51 |
52 |
53 |
54 | ); 55 | }; 56 | 57 | ProductSliderThree.propTypes = { 58 | category: PropTypes.string, 59 | spaceBottomClass: PropTypes.string 60 | }; 61 | 62 | export default ProductSliderThree; 63 | -------------------------------------------------------------------------------- /src/components/product/ShopSize.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import { setActiveSort } from "../../helpers/product"; 4 | 5 | const ShopSize = ({ sizes, getSortParams }) => { 6 | return ( 7 |
8 |

Size

9 |
10 | {sizes ? ( 11 |
    12 |
  • 13 |
    14 | 22 |
    23 |
  • 24 | {sizes.map((size, key) => { 25 | return ( 26 |
  • 27 |
    28 | 39 |
    40 |
  • 41 | ); 42 | })} 43 |
44 | ) : ( 45 | "No sizes found" 46 | )} 47 |
48 |
49 | ); 50 | }; 51 | 52 | ShopSize.propTypes = { 53 | getSortParams: PropTypes.func, 54 | sizes: PropTypes.array 55 | }; 56 | 57 | export default ShopSize; 58 | -------------------------------------------------------------------------------- /src/assets/scss/_helper.scss: -------------------------------------------------------------------------------- 1 | @import "variables"; 2 | 3 | /*============================================= 4 | = Helper CSS = 5 | =============================================*/ 6 | 7 | @for $i from 0 through 15 { 8 | .row-#{1 * $i} { 9 | margin-left: -1px * $i; 10 | margin-right: -1px * $i; 11 | 12 | & > [class*="col"] { 13 | padding-left: 1px * $i; 14 | padding-right: 1px * $i; 15 | } 16 | } 17 | } 18 | @for $i from 16 through 80 { 19 | .row-#{1 * $i} { 20 | margin-left: -1px * $i; 21 | margin-right: -1px * $i; 22 | 23 | // Responsive 24 | @media #{$xl-layout} { 25 | margin-left: -15px; 26 | margin-right: -15px; 27 | } 28 | @media #{$lg-layout} { 29 | margin-left: -15px; 30 | margin-right: -15px; 31 | } 32 | @media #{$md-layout} { 33 | margin-left: -15px; 34 | margin-right: -15px; 35 | } 36 | @media #{$xs-layout} { 37 | margin-left: -15px; 38 | margin-right: -15px; 39 | } 40 | 41 | & > [class*="col"] { 42 | padding-left: 1px * $i; 43 | padding-right: 1px * $i; 44 | 45 | // Responsive 46 | @media #{$xl-layout} { 47 | padding-left: 15px; 48 | padding-right: 15px; 49 | } 50 | @media #{$lg-layout} { 51 | padding-left: 15px; 52 | padding-right: 15px; 53 | } 54 | @media #{$md-layout} { 55 | padding-left: 15px; 56 | padding-right: 15px; 57 | } 58 | @media #{$xs-layout} { 59 | padding-left: 15px; 60 | padding-right: 15px; 61 | } 62 | } 63 | } 64 | } 65 | 66 | /* no gutters */ 67 | .no-gutters { 68 | margin-left: 0; 69 | margin-right: 0; 70 | & > .col, 71 | & > [class*="col-"] { 72 | padding-right: 0; 73 | padding-left: 0; 74 | margin: 0; 75 | } 76 | } 77 | 78 | /*===== End of Helper CSS ======*/ 79 | -------------------------------------------------------------------------------- /src/components/product/ProductImageGallerySlider.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import Swiper from "react-id-swiper"; 4 | 5 | const ProductImageGallerySlider = ({ product }) => { 6 | // swiper slider settings 7 | const gallerySwiperParams = { 8 | spaceBetween: 15, 9 | slidesPerView: 3, 10 | loop: true, 11 | navigation: { 12 | nextEl: ".swiper-button-next", 13 | prevEl: ".swiper-button-prev" 14 | }, 15 | renderPrevButton: () => ( 16 | 19 | ), 20 | renderNextButton: () => ( 21 | 24 | ), 25 | breakpoints: { 26 | 1024: { 27 | slidesPerView: 3 28 | }, 29 | 768: { 30 | slidesPerView: 2 31 | }, 32 | 640: { 33 | slidesPerView: 2 34 | }, 35 | 320: { 36 | slidesPerView: 1 37 | } 38 | } 39 | }; 40 | return ( 41 |
42 | 43 | {product.image && 44 | product.image.map((single, key) => { 45 | return ( 46 |
47 |
48 | 53 |
54 |
55 | ); 56 | })} 57 |
58 |
59 | ); 60 | }; 61 | 62 | ProductImageGallerySlider.propTypes = { 63 | product: PropTypes.object 64 | }; 65 | 66 | export default ProductImageGallerySlider; 67 | -------------------------------------------------------------------------------- /src/components/product/ShopTopAction.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import { setActiveLayout } from "../../helpers/product"; 4 | 5 | const ShopTopAction = ({ 6 | getLayout, 7 | getFilterSortParams, 8 | productCount, 9 | sortedProductCount 10 | }) => { 11 | return ( 12 |
13 |
14 |
15 | 22 |
23 |

24 | Showing {sortedProductCount} of {productCount} result 25 |

26 |
27 | 28 |
29 | 37 | 45 | 53 |
54 |
55 | ); 56 | }; 57 | 58 | ShopTopAction.propTypes = { 59 | getFilterSortParams: PropTypes.func, 60 | getLayout: PropTypes.func, 61 | productCount: PropTypes.number, 62 | sortedProductCount: PropTypes.number 63 | }; 64 | 65 | export default ShopTopAction; 66 | -------------------------------------------------------------------------------- /src/components/header/sub-components/LanguageCurrencyChanger.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import { changeLanguage } from "redux-multilanguage"; 4 | 5 | const LanguageCurrencyChanger = ({ 6 | currency, 7 | setCurrency, 8 | currentLanguageCode, 9 | dispatch, 10 | }) => { 11 | const changeLanguageTrigger = (e) => { 12 | const languageCode = e.target.value; 13 | dispatch(changeLanguage(languageCode)); 14 | }; 15 | 16 | const setCurrencyTrigger = (e) => { 17 | const currencyName = e.target.value; 18 | setCurrency(currencyName); 19 | }; 20 | 21 | return ( 22 |
23 |
24 | 25 | {currentLanguageCode === "en" 26 | ? "English" 27 | : currentLanguageCode === "fn" 28 | ? "French" 29 | : currentLanguageCode === "de" 30 | ? "Germany" 31 | : ""}{" "} 32 | 33 | 34 |
35 |
    36 |
  • 37 | 40 |
  • 41 |
  • 42 | 45 |
  • 46 | 47 |
48 |
49 |
50 |
51 |

Call Us +8801150338042

52 |
53 |
54 | ); 55 | }; 56 | 57 | LanguageCurrencyChanger.propTypes = { 58 | setCurrency: PropTypes.func, 59 | currency: PropTypes.object, 60 | currentLanguageCode: PropTypes.string, 61 | dispatch: PropTypes.func, 62 | }; 63 | 64 | export default LanguageCurrencyChanger; 65 | -------------------------------------------------------------------------------- /src/redux/reducers/rootReducer.js: -------------------------------------------------------------------------------- 1 | import currencyReducer from "./currencyReducer"; 2 | 3 | import cartReducer from "./cartReducer"; 4 | import wishlistReducer from "./wishlistReducer"; 5 | import compareReducer from "./compareReducer"; 6 | import { combineReducers } from "redux"; 7 | import { createMultilanguageReducer } from "redux-multilanguage"; 8 | import { 9 | getUserDetailsReducer, 10 | saveShippingAddressReducer, 11 | updateUserProfileReducer, 12 | userDeleteReducer, 13 | userEditReducer, 14 | userListReducer, 15 | userLoginReducer, 16 | userRegisterReducer 17 | } from "./userReducer"; 18 | import { 19 | orderCreateReducer, 20 | orderDeliverReducer, 21 | orderDetailsReducer, 22 | orderListMyReducer, 23 | orderListReducer, 24 | } from "./orderReducers"; 25 | 26 | import { 27 | productReducer, 28 | productDeleteReducer, 29 | productCreateReducer, 30 | productByIdReducer, 31 | productUpdateReducer 32 | } from "./productReducer"; 33 | 34 | const rootReducer = combineReducers({ 35 | multilanguage: createMultilanguageReducer({ currentLanguageCode: "en" }), 36 | currencyData: currencyReducer, 37 | productData: productReducer, 38 | productCreate: productCreateReducer, 39 | productById: productByIdReducer, 40 | productDelete: productDeleteReducer, 41 | productUpdate: productUpdateReducer, 42 | cartData: cartReducer, 43 | wishlistData: wishlistReducer, 44 | compareData: compareReducer, 45 | userLogin: userLoginReducer, 46 | userRegister: userRegisterReducer, 47 | userDetails: getUserDetailsReducer, 48 | userUpdateProfile: updateUserProfileReducer, 49 | userList: userListReducer, 50 | userDelete: userDeleteReducer, 51 | userEdit: userEditReducer, 52 | userShippingAddress: saveShippingAddressReducer, 53 | orderCreate: orderCreateReducer, 54 | orderDetails: orderDetailsReducer, 55 | orderMyList: orderListMyReducer, 56 | orderList: orderListReducer, 57 | orderDeliver: orderDeliverReducer, 58 | }); 59 | 60 | export default rootReducer; 61 | -------------------------------------------------------------------------------- /src/pages/admin/AdminUsers.jsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect } from "react"; 2 | import LayoutAdmin from "../../layouts/LayoutAdmin"; 3 | import UserList from "../../components/admin/UserList"; 4 | import { userList } from "../../redux/actions/userActions"; 5 | import { useDispatch, useSelector } from "react-redux"; 6 | import Loader from "../../components/Loader/Loader"; 7 | import { useToasts } from "react-toast-notifications"; 8 | import Alert from "../../components/alert/Alert"; 9 | import { Link, useHistory } from "react-router-dom"; 10 | 11 | const AdminUsers = () => { 12 | const history = useHistory(); 13 | const dispatch = useDispatch(); 14 | 15 | const { addToast } = useToasts(); 16 | 17 | const { loading, error, users } = useSelector((state) => state.userList); 18 | const { userInfo } = useSelector((state) => state.userLogin); 19 | const { error: deleteError, status: deleteStatus } = useSelector( 20 | (state) => state.userDelete 21 | ); 22 | 23 | useEffect(() => { 24 | if (userInfo && userInfo.isAdmin) { 25 | dispatch(userList()); 26 | } else { 27 | history.push("/"); 28 | } 29 | 30 | if (deleteError) { 31 | addToast(deleteError, { appearance: "error", autoDismiss: true }); 32 | } 33 | if (deleteStatus) { 34 | addToast(deleteStatus.message, { 35 | appearance: "success", 36 | autoDismiss: true, 37 | }); 38 | } 39 | }, [dispatch, deleteError, history, deleteStatus]); 40 | 41 | return ( 42 | 43 |
44 |

Users List

45 | 46 | 47 | 48 | {loading ? ( 49 | 50 | ) : error ? ( 51 | {error} 52 | ) : ( 53 | 54 | )} 55 |
56 |
57 | ); 58 | }; 59 | 60 | export default AdminUsers; 61 | -------------------------------------------------------------------------------- /src/components/admin/Sidebar.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Link } from "react-router-dom"; 3 | import classNames from "classnames"; 4 | 5 | const Sidebar = ({ onCloseSidebar, sidebar }) => { 6 | return ( 7 | <> 8 |
9 |
10 |
11 |
12 |

13 | Login:Admin 14 | 15 | × 16 | 17 |

18 | 19 |
20 |
    21 |
  • 22 | 23 | 24 | Dashboard 25 | 26 |
  • 27 |
  • 28 | 29 | 30 | Product 31 | 32 |
  • 33 |
  • 34 | 35 | 36 | Users 37 | 38 |
  • 39 |
  • 40 | 41 | 42 | Orders 43 | 44 |
  • 45 |
46 |
47 |
48 |
Certified user
49 |
50 |
51 | 52 | ); 53 | }; 54 | 55 | export default Sidebar; 56 | -------------------------------------------------------------------------------- /src/components/contact/MedicalContact.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | const MedicalContact = () => { 4 | return ( 5 |
13 |
14 |
15 |
16 |
17 |

Please Call

18 |

Emergency Order

19 |
20 |
21 |
22 |
23 |
24 |
25 | 32 |
33 |
34 |
35 |
36 |
37 | 44 |
45 |
46 |

+88 254 254 123

47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 | ); 56 | }; 57 | 58 | export default MedicalContact; 59 | -------------------------------------------------------------------------------- /src/assets/scss/_404.scss: -------------------------------------------------------------------------------- 1 | .error { 2 | h1 { 3 | font-size: 17rem; 4 | font-weight: bold; 5 | letter-spacing: 1rem; 6 | line-height: 1.1; 7 | margin-bottom: 30px; 8 | color: #a749ff; 9 | @media #{$lg-layout} { 10 | font-size: 15rem; 11 | margin-bottom: 4px; 12 | } 13 | @media #{$md-layout} { 14 | font-size: 12rem; 15 | } 16 | @media #{$xs-layout} { 17 | font-size: 7rem; 18 | line-height: 88px; 19 | } 20 | @media #{$sm-layout} { 21 | font-size: 9rem; 22 | line-height: 100px; 23 | } 24 | } 25 | h2 { 26 | font-size: 25px; 27 | font-weight: 600; 28 | } 29 | } 30 | 31 | .error-btn { 32 | position: relative; 33 | transition: all 0.3s; 34 | color: #fff; 35 | font-size: 16px; 36 | min-width: 184px; 37 | min-height: 55px; 38 | line-height: 55px; 39 | margin-bottom: 6px; 40 | padding: 0 10px; 41 | border: none; 42 | border-radius: 0; 43 | background-color: #a749ff; 44 | display: inline-block; 45 | &:after { 46 | position: absolute; 47 | content: ""; 48 | left: 0; 49 | bottom: -6px; 50 | height: 3px; 51 | width: 100%; 52 | background-color: #a749ff; 53 | transition: all 0.3s; 54 | } 55 | &:hover { 56 | background-color: #111111; 57 | color: #fff; 58 | &:after { 59 | background-color: #111111; 60 | } 61 | } 62 | } 63 | 64 | .searchform { 65 | position: relative; 66 | & input { 67 | border: 1px solid #eeeeee; 68 | height: 45px; 69 | width: 100%; 70 | padding-left: 15px; 71 | padding-right: 80px; 72 | background-color: transparent; 73 | } 74 | & button { 75 | border: none; 76 | background-color: #a749ff; 77 | width: 70px; 78 | color: #fff; 79 | cursor: pointer; 80 | position: absolute; 81 | right: 0; 82 | top: 0; 83 | height: 100%; 84 | &:hover { 85 | background-color: #000; 86 | } 87 | } 88 | @media #{$xs-layout} { 89 | &.mb-50 { 90 | margin-bottom: 20px; 91 | } 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /src/pages/admin/AdminProduct.jsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect } from "react"; 2 | import ProductList from "../../components/admin/Product"; 3 | import LayoutAdmin from "../../layouts/LayoutAdmin"; 4 | import { Link } from "react-router-dom"; 5 | import { useDispatch, useSelector } from "react-redux"; 6 | import { fetchProducts } from "../../redux/actions/productActions"; 7 | import Loader from "../../components/Loader/Loader"; 8 | import Alert from "../../components/alert/Alert"; 9 | 10 | const AdminProduct = ({ history }) => { 11 | const dispatch = useDispatch(); 12 | 13 | const { loading, error, products } = useSelector( 14 | (state) => state.productData 15 | ); 16 | 17 | const { userInfo } = useSelector((state) => state.userLogin); 18 | 19 | const { 20 | loading: loadingDelete, 21 | error: errorDelete, 22 | success, 23 | } = useSelector((state) => state.productDelete); 24 | 25 | useEffect(() => { 26 | if (userInfo && userInfo.isAdmin) { 27 | dispatch(fetchProducts()); 28 | } else { 29 | history.push("/"); 30 | } 31 | }, [dispatch, userInfo, history, success]); 32 | 33 | return ( 34 | <> 35 | 36 |
37 |
38 |

Product List

39 | 40 | 41 | 42 |
43 | 44 | 45 | 46 | {loadingDelete && } 47 | {errorDelete && {errorDelete} } 48 | {loading ? ( 49 | 50 | ) : error ? ( 51 | {error} 52 | ) : ( 53 | 54 | )} 55 |
56 |
57 | 58 | ); 59 | }; 60 | 61 | export default AdminProduct; 62 | -------------------------------------------------------------------------------- /src/pages/admin/AdminDashboard.jsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect } from "react"; 2 | import LayoutAdmin from "../../layouts/LayoutAdmin"; 3 | import { Link } from "react-router-dom"; 4 | import { useSelector } from "react-redux"; 5 | 6 | const AdminDashboard = ({ history }) => { 7 | const { userInfo } = useSelector((state) => state.userLogin); 8 | 9 | useEffect(() => { 10 | if (!userInfo || !userInfo.isAdmin) { 11 | history.push("/"); 12 | } 13 | }, [userInfo, history]); 14 | 15 | return ( 16 | 17 |
18 |

Welcome to your Dashboard

19 |
20 |
21 |
22 |

Modify Users List

23 | 24 | 25 | 26 |
27 |
28 |
29 |
30 |

Modify Products

31 | 32 | 33 | 34 |
35 |
36 |
37 |
38 |

Go To All Orders

39 | 40 | 41 | 42 |
43 |
44 |
45 |
46 |

Go To HomePage

47 | 48 | 49 | 50 |
51 |
52 |
53 |
54 |
55 | ); 56 | }; 57 | 58 | export default AdminDashboard; 59 | -------------------------------------------------------------------------------- /src/components/newsletter/SubscribeEmail.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import MailchimpSubscribe from "react-mailchimp-subscribe"; 4 | 5 | const CustomForm = ({ status, message, onValidated }) => { 6 | let email; 7 | const submit = () => { 8 | email && 9 | email.value.indexOf("@") > -1 && 10 | onValidated({ 11 | EMAIL: email.value 12 | }); 13 | email.value = ""; 14 | }; 15 | 16 | return ( 17 |
18 |
19 |
20 | (email = node)} 23 | type="email" 24 | placeholder="Your Email Address" 25 | required 26 | /> 27 |
28 |
29 | 32 |
33 |
34 | 35 | {status === "sending" && ( 36 |
sending...
37 | )} 38 | {status === "error" && ( 39 |
43 | )} 44 | {status === "success" && ( 45 |
49 | )} 50 |
51 | ); 52 | }; 53 | 54 | const SubscribeEmail = ({ mailchimpUrl }) => { 55 | return ( 56 |
57 | ( 60 | subscribe(formData)} 64 | /> 65 | )} 66 | /> 67 |
68 | ); 69 | }; 70 | 71 | SubscribeEmail.propTypes = { 72 | mailchimpUrl: PropTypes.string 73 | }; 74 | 75 | export default SubscribeEmail; 76 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "baby-product", 3 | "proxy": "https://wonderstech.herokuapp.com/", 4 | "version": "1.5.0", 5 | "private": true, 6 | "dependencies": { 7 | "animate.css": "^3.7.2", 8 | "axios": "^0.21.4", 9 | "bootstrap": "4.5.0", 10 | "classnames": "^2.3.1", 11 | "google-maps-react": "^2.0.2", 12 | "node-sass": "^4.14.1", 13 | "prop-types": "^15.7.2", 14 | "react": "16.13.1", 15 | "react-app-polyfill": "^1.0.4", 16 | "react-bootstrap": "1.0.1", 17 | "react-breadcrumbs-dynamic": "^1.2.1", 18 | "react-countdown-now": "^2.1.2", 19 | "react-countup": "^4.2.3", 20 | "react-dom": "^16.12.0", 21 | "react-fullpage": "^0.1.19", 22 | "react-google-login": "^5.2.2", 23 | "react-hooks-paginator": "^0.4.0", 24 | "react-id-swiper": "2.4.0", 25 | "react-lightgallery": "0.6.3", 26 | "react-mailchimp-subscribe": "^2.1.0", 27 | "react-meta-tags": "^0.7.4", 28 | "react-modal": "^3.14.4", 29 | "react-modal-video": "^1.2.3", 30 | "react-redux": "^7.1.3", 31 | "react-router-dom": "^5.1.2", 32 | "react-scripts": "3.2.0", 33 | "react-scroll": "^1.7.14", 34 | "react-spinners-kit": "^1.9.1", 35 | "react-sticky-el": "^1.1.0", 36 | "react-toast-notifications": "^2.2.5", 37 | "react-visibility-sensor": "^5.1.1", 38 | "redux": "^4.0.4", 39 | "redux-devtools-extension": "^2.13.9", 40 | "redux-localstorage-simple": "^2.1.6", 41 | "redux-multilanguage": "^0.1.2", 42 | "redux-thunk": "^2.3.0", 43 | "restful-react": "^15.9.0", 44 | "swiper": "^5.2.0", 45 | "uuid": "^3.3.3" 46 | }, 47 | "scripts": { 48 | "start": "react-scripts start", 49 | "build": "react-scripts build", 50 | "test": "react-scripts test", 51 | "eject": "react-scripts eject" 52 | }, 53 | "eslintConfig": { 54 | "extends": "react-app" 55 | }, 56 | "browserslist": { 57 | "production": [ 58 | ">0.2%", 59 | "not dead", 60 | "not op_mini all", 61 | "ie 11" 62 | ], 63 | "development": [ 64 | "last 1 chrome version", 65 | "last 1 firefox version", 66 | "last 1 safari version", 67 | "ie 11" 68 | ] 69 | }, 70 | "devDependencies": {} 71 | } 72 | -------------------------------------------------------------------------------- /src/components/footer/sub-components/SubscribeEmail.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import MailchimpSubscribe from "react-mailchimp-subscribe"; 4 | 5 | const CustomForm = ({ status, message, onValidated }) => { 6 | let email; 7 | const submit = () => { 8 | email && 9 | email.value.indexOf("@") > -1 && 10 | onValidated({ 11 | EMAIL: email.value 12 | }); 13 | 14 | let emailInput = document.getElementById("mc-form-email"); 15 | emailInput.value = ""; 16 | }; 17 | 18 | return ( 19 |
20 |
21 |
22 | (email = node)} 26 | type="email" 27 | placeholder="Enter your email address..." 28 | /> 29 |
30 |
31 | 34 |
35 |
36 | 37 | {status === "sending" && ( 38 |
sending...
39 | )} 40 | {status === "error" && ( 41 |
45 | )} 46 | {status === "success" && ( 47 |
51 | )} 52 |
53 | ); 54 | }; 55 | 56 | const SubscribeEmail = ({ mailchimpUrl }) => { 57 | return ( 58 |
59 | ( 62 | subscribe(formData)} 66 | /> 67 | )} 68 | /> 69 |
70 | ); 71 | }; 72 | 73 | SubscribeEmail.propTypes = { 74 | mailchimpUrl: PropTypes.string 75 | }; 76 | 77 | export default SubscribeEmail; 78 | -------------------------------------------------------------------------------- /src/components/section-title/SectionTitleWithText.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | 4 | const SectionTitleWithText = ({ spaceTopClass, spaceBottomClass }) => { 5 | return ( 6 |
11 |
12 |
13 |
Who Are We
14 |

Welcome To Wonders SmartShop BD

15 |

16 | Leading Computer, Laptop & Gaming PC Retail & Online Shop in Bangladesh{" "} 17 | Technology has become a part of our daily lives and for a huge portion of our life, we are dependent on tech products daily. There is hardly a home in Bangladesh without a tech product. This is where we come in. Wonders SmartShop & Engineering Ltd had started as a Tech product shop way. We focused on giving the customers the best service possible. This is why Wonders SmartShop is one of The most trusted names in the tech industry of Bangladesh today.{" "} 18 |

19 |
20 |

21 | Best E-commerce Shop to order your desired Product 22 | {" "}Wonders SmartShop always prioritizes its customers and to ensure better customer service started the e-commerce shop in addition to the physical stores. The goal was to meet more customer needs in the shortest time. Since then, We have had the top spot as the best E-commerce shop in Bangladesh. Our website has a comprehensive search option to find the desired product. Our website has a unique PC builder feature so that you can build a Custom PC with your desired components. We arrange many promotional campaigns on different occasions and also on a regular basis. Some of our most successful events are named Flash sale, Special offer, Thursday Thunder, Anniversary Special Offer, New Year Offer, 12.12 Campaign, and many more. We even arrange special gaming events and tournaments for Bangladeshi gamers with renowned gaming Brands like Razer and Asus ROG. 23 |

24 |
25 |
26 |
27 | ); 28 | }; 29 | 30 | SectionTitleWithText.propTypes = { 31 | spaceBottomClass: PropTypes.string, 32 | spaceTopClass: PropTypes.string, 33 | }; 34 | 35 | export default SectionTitleWithText; 36 | -------------------------------------------------------------------------------- /src/components/admin/Product.jsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect } from "react"; 2 | import { useDispatch, useSelector } from "react-redux"; 3 | import { Link } from "react-router-dom"; 4 | import { deleteProduct } from "../../redux/actions/productActions"; 5 | 6 | const ProductList = ({ products }) => { 7 | const disptach = useDispatch(); 8 | 9 | const deleteHandler = (id) => { 10 | if (window.confirm("Are you sure to Delete this product?")) { 11 | disptach(deleteProduct(id)); 12 | } 13 | }; 14 | 15 | return ( 16 |
17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | {products && 31 | products.map((product) => ( 32 | 33 | {/* */} 34 | 35 | 36 | 37 | 38 | 39 | 56 | 57 | ))} 58 | 59 |
NAMEPRICESTOCKCATEGORYRATING*
{product.id} {product.name} {product.price}৳{product.stock}{product.category.map((cat) => cat)[0]}{product.rating} 40 | 44 | 47 | 48 | 55 |
60 |
61 |
62 | ); 63 | }; 64 | 65 | export default ProductList; 66 | -------------------------------------------------------------------------------- /src/redux/actions/cartActions.js: -------------------------------------------------------------------------------- 1 | export const ADD_TO_CART = "ADD_TO_CART"; 2 | export const DECREASE_QUANTITY = "DECREASE_QUANTITY"; 3 | export const DELETE_FROM_CART = "DELETE_FROM_CART"; 4 | export const DELETE_ALL_FROM_CART = "DELETE_ALL_FROM_CART"; 5 | 6 | //add to cart 7 | export const addToCart = ( 8 | item, 9 | addToast, 10 | quantityCount, 11 | selectedProductColor, 12 | selectedProductSize 13 | ) => { 14 | return dispatch => { 15 | if (addToast) { 16 | addToast("Added To Cart", { appearance: "success", autoDismiss: true }); 17 | } 18 | dispatch({ 19 | type: ADD_TO_CART, 20 | payload: { 21 | ...item, 22 | quantity: quantityCount, 23 | selectedProductColor: selectedProductColor 24 | ? selectedProductColor 25 | : item.selectedProductColor 26 | ? item.selectedProductColor 27 | : null, 28 | selectedProductSize: selectedProductSize 29 | ? selectedProductSize 30 | : item.selectedProductSize 31 | ? item.selectedProductSize 32 | : null 33 | } 34 | }); 35 | }; 36 | }; 37 | //decrease from cart 38 | export const decreaseQuantity = (item, addToast) => { 39 | return dispatch => { 40 | if (addToast) { 41 | addToast("Item Decremented From Cart", { 42 | appearance: "warning", 43 | autoDismiss: true 44 | }); 45 | } 46 | dispatch({ type: DECREASE_QUANTITY, payload: item }); 47 | }; 48 | }; 49 | //delete from cart 50 | export const deleteFromCart = (item, addToast) => { 51 | return dispatch => { 52 | if (addToast) { 53 | addToast("Removed From Cart", { appearance: "error", autoDismiss: true }); 54 | } 55 | dispatch({ type: DELETE_FROM_CART, payload: item }); 56 | }; 57 | }; 58 | //delete all from cart 59 | export const deleteAllFromCart = addToast => { 60 | return dispatch => { 61 | if (addToast) { 62 | addToast("Removed All From Cart", { 63 | appearance: "error", 64 | autoDismiss: true 65 | }); 66 | } 67 | dispatch({ type: DELETE_ALL_FROM_CART }); 68 | }; 69 | }; 70 | 71 | // get stock of cart item 72 | export const cartItemStock = (item, color, size) => { 73 | if (item.stock) { 74 | return item.stock; 75 | } else { 76 | return item.variation 77 | .filter(single => single.color === color)[0] 78 | .size.filter(single => single.name === size)[0].stock; 79 | } 80 | }; 81 | 82 | 83 | -------------------------------------------------------------------------------- /src/components/admin/OrderList.jsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect } from "react"; 2 | import { useDispatch, useSelector } from "react-redux"; 3 | import { Link } from "react-router-dom"; 4 | import { deleteProduct } from "../../redux/actions/productActions"; 5 | 6 | const OrderList = ({ orders }) => { 7 | const disptach = useDispatch(); 8 | 9 | const deleteHandler = (id) => { 10 | if (window.confirm("Are you sure to Delete this product?")) { 11 | disptach(deleteProduct(id)); 12 | } 13 | }; 14 | 15 | return ( 16 |
17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | {orders && 32 | orders.map((order) => ( 33 | 34 | {/* */} 35 | 36 | 37 | 38 | 39 | 46 | 53 | 58 | 59 | ))} 60 | 61 |
IDUSERDATETOTALPAIDDELIVERED*
{order.id} {order._id} {order.user && order.user.name}{order.createdAt.substring(0, 10)}{order.totalPrice}৳ 40 | {order.isPaid ? ( 41 | order.paidAt.substring(0, 10) 42 | ) : ( 43 | 44 | )} 45 | 47 | {order.isDelivered ? ( 48 | order.deliveredAt.substring(0, 10) 49 | ) : ( 50 | 51 | )} 52 | 54 | 55 | 56 | 57 |
62 |
63 |
64 | ); 65 | }; 66 | 67 | export default OrderList; 68 | -------------------------------------------------------------------------------- /src/pages/shop-product/ProductSlider.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React, { Fragment } from "react"; 3 | import MetaTags from "react-meta-tags"; 4 | import { BreadcrumbsItem } from "react-breadcrumbs-dynamic"; 5 | import { connect } from "react-redux"; 6 | import LayoutOne from "../../layouts/LayoutOne"; 7 | import Breadcrumb from "../../wrappers/breadcrumb/Breadcrumb"; 8 | import RelatedProductSlider from "../../wrappers/product/RelatedProductSlider"; 9 | import ProductDescriptionTab from "../../wrappers/product/ProductDescriptionTab"; 10 | import ProductImageDescriptionSlider from "../../wrappers/product/ProductImageDescriptionSlider"; 11 | 12 | const ProductSlider = ({ location, product }) => { 13 | const { pathname } = location; 14 | 15 | return ( 16 | 17 | 18 | Wonders Tech | Product 19 | 23 | 24 | 25 | Home 26 | 27 | Shop Product 28 | 29 | 30 | 31 | {/* breadcrumb */} 32 | 33 | 34 | {/* product description with image */} 35 | 40 | 41 | {/* product description tab */} 42 | 46 | 47 | {/* related product slider */} 48 | 52 | 53 | 54 | ); 55 | }; 56 | 57 | ProductSlider.propTypes = { 58 | location: PropTypes.object, 59 | product: PropTypes.object 60 | }; 61 | 62 | const mapStateToProps = (state, ownProps) => { 63 | const itemId = ownProps.match.params.id; 64 | return { 65 | product: state.productData.products.filter( 66 | single => single.id === itemId 67 | )[0] 68 | }; 69 | }; 70 | 71 | export default connect(mapStateToProps)(ProductSlider); 72 | -------------------------------------------------------------------------------- /src/pages/shop-product/ProductSticky.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React, { Fragment } from "react"; 3 | import MetaTags from "react-meta-tags"; 4 | import { BreadcrumbsItem } from "react-breadcrumbs-dynamic"; 5 | import { connect } from "react-redux"; 6 | import LayoutOne from "../../layouts/LayoutOne"; 7 | import Breadcrumb from "../../wrappers/breadcrumb/Breadcrumb"; 8 | import RelatedProductSlider from "../../wrappers/product/RelatedProductSlider"; 9 | import ProductDescriptionTab from "../../wrappers/product/ProductDescriptionTab"; 10 | import ProductImageDescriptionSticky from "../../wrappers/product/ProductImageDescriptionSticky"; 11 | 12 | const ProductSticky = ({ location, product }) => { 13 | const { pathname } = location; 14 | 15 | return ( 16 | 17 | 18 | Wonders Tech | Product 19 | 23 | 24 | 25 | Home 26 | 27 | Shop Product 28 | 29 | 30 | 31 | {/* breadcrumb */} 32 | 33 | 34 | {/* product description with image */} 35 | 40 | 41 | {/* product description tab */} 42 | 46 | 47 | {/* related product slider */} 48 | 52 | 53 | 54 | ); 55 | }; 56 | 57 | ProductSticky.propTypes = { 58 | location: PropTypes.object, 59 | product: PropTypes.object 60 | }; 61 | 62 | const mapStateToProps = (state, ownProps) => { 63 | const itemId = ownProps.match.params.id; 64 | return { 65 | product: state.productData.products.filter( 66 | single => single.id === itemId 67 | )[0] 68 | }; 69 | }; 70 | 71 | export default connect(mapStateToProps)(ProductSticky); 72 | -------------------------------------------------------------------------------- /src/components/header/MobileMenu.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect } from "react"; 2 | import MobileMenuSearch from "./sub-components/MobileSearch"; 3 | import MobileNavMenu from "./sub-components/MobileNavMenu"; 4 | import MobileLangCurChange from "./sub-components/MobileLangCurrChange"; 5 | import MobileWidgets from "./sub-components/MobileWidgets"; 6 | 7 | const MobileMenu = () => { 8 | useEffect(() => { 9 | const offCanvasNav = document.querySelector("#offcanvas-navigation"); 10 | const offCanvasNavSubMenu = offCanvasNav.querySelectorAll(".sub-menu"); 11 | const anchorLinks = offCanvasNav.querySelectorAll("a"); 12 | 13 | for (let i = 0; i < offCanvasNavSubMenu.length; i++) { 14 | offCanvasNavSubMenu[i].insertAdjacentHTML( 15 | "beforebegin", 16 | "" 17 | ); 18 | } 19 | 20 | const menuExpand = offCanvasNav.querySelectorAll(".menu-expand"); 21 | const numMenuExpand = menuExpand.length; 22 | 23 | for (let i = 0; i < numMenuExpand; i++) { 24 | menuExpand[i].addEventListener("click", (e) => { 25 | sideMenuExpand(e); 26 | }); 27 | } 28 | 29 | for (let i = 0; i < anchorLinks.length; i++) { 30 | anchorLinks[i].addEventListener("click", () => { 31 | closeMobileMenu(); 32 | }); 33 | } 34 | }); 35 | 36 | const sideMenuExpand = (e) => { 37 | e.currentTarget.parentElement.classList.toggle("active"); 38 | }; 39 | 40 | const closeMobileMenu = () => { 41 | const offcanvasMobileMenu = document.querySelector( 42 | "#offcanvas-mobile-menu" 43 | ); 44 | offcanvasMobileMenu.classList.remove("active"); 45 | }; 46 | 47 | return ( 48 |
49 | 56 |
57 |
58 | {/* mobile search */} 59 | {/* */} 60 | 61 | {/* mobile nav menu */} 62 | 63 | 64 | {/* mobile language and currency */} 65 | {/* */} 66 | 67 | {/* mobile widgets */} 68 | 69 |
70 |
71 |
72 | ); 73 | }; 74 | 75 | export default MobileMenu; 76 | -------------------------------------------------------------------------------- /src/pages/shop-product/ProductTabLeft.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React, { Fragment } from "react"; 3 | import MetaTags from "react-meta-tags"; 4 | import { BreadcrumbsItem } from "react-breadcrumbs-dynamic"; 5 | import { connect } from "react-redux"; 6 | import LayoutOne from "../../layouts/LayoutOne"; 7 | import Breadcrumb from "../../wrappers/breadcrumb/Breadcrumb"; 8 | import RelatedProductSlider from "../../wrappers/product/RelatedProductSlider"; 9 | import ProductDescriptionTab from "../../wrappers/product/ProductDescriptionTab"; 10 | import ProductImageDescription from "../../wrappers/product/ProductImageDescription"; 11 | 12 | const ProductTabLeft = ({ location, product }) => { 13 | const { pathname } = location; 14 | 15 | return ( 16 | 17 | 18 | Wonders Tech | Product 19 | 23 | 24 | 25 | Home 26 | 27 | Shop Product 28 | 29 | 30 | 31 | {/* breadcrumb */} 32 | 33 | 34 | {/* product description with image */} 35 | 41 | 42 | {/* product description tab */} 43 | 47 | 48 | {/* related product slider */} 49 | 53 | 54 | 55 | ); 56 | }; 57 | 58 | ProductTabLeft.propTypes = { 59 | location: PropTypes.object, 60 | product: PropTypes.object 61 | }; 62 | 63 | const mapStateToProps = (state, ownProps) => { 64 | const itemId = ownProps.match.params.id; 65 | return { 66 | product: state.productData.products.filter( 67 | single => single.id === itemId 68 | )[0] 69 | }; 70 | }; 71 | 72 | export default connect(mapStateToProps)(ProductTabLeft); 73 | -------------------------------------------------------------------------------- /src/pages/shop-product/ProductTabRight.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React, { Fragment } from "react"; 3 | import MetaTags from "react-meta-tags"; 4 | import { BreadcrumbsItem } from "react-breadcrumbs-dynamic"; 5 | import { connect } from "react-redux"; 6 | import LayoutOne from "../../layouts/LayoutOne"; 7 | import Breadcrumb from "../../wrappers/breadcrumb/Breadcrumb"; 8 | import RelatedProductSlider from "../../wrappers/product/RelatedProductSlider"; 9 | import ProductDescriptionTab from "../../wrappers/product/ProductDescriptionTab"; 10 | import ProductImageDescription from "../../wrappers/product/ProductImageDescription"; 11 | 12 | const ProductTabRight = ({ location, product }) => { 13 | const { pathname } = location; 14 | 15 | return ( 16 | 17 | 18 | Wonders Tech | Product 19 | 23 | 24 | 25 | Home 26 | 27 | Shop Product 28 | 29 | 30 | 31 | {/* breadcrumb */} 32 | 33 | 34 | {/* product description with image */} 35 | 41 | 42 | {/* product description tab */} 43 | 47 | 48 | {/* related product slider */} 49 | 53 | 54 | 55 | ); 56 | }; 57 | 58 | ProductTabRight.propTypes = { 59 | location: PropTypes.object, 60 | product: PropTypes.object 61 | }; 62 | 63 | const mapStateToProps = (state, ownProps) => { 64 | const itemId = ownProps.match.params.id; 65 | return { 66 | product: state.productData.products.filter( 67 | single => single.id === itemId 68 | )[0] 69 | }; 70 | }; 71 | 72 | export default connect(mapStateToProps)(ProductTabRight); 73 | -------------------------------------------------------------------------------- /src/helpers/shippingPrice.js: -------------------------------------------------------------------------------- 1 | // Dhaka, Gazipur, Narsingdi, Manikganj, Munshiganj, Narayanganj, Mymensingh, Sherpur, Jamalpur, Netrokona, Kishoreganj, Tangail, Faridpur, Maradipur, Shariatpur, Rajbari and Gopalganj 2 | 3 | // const addShippingPrice = (division, district) => { 4 | // if (division === "Dhaka") { 5 | // return 70; 6 | // } else if (district === "Gazipur") { 7 | // return 70; 8 | // } else if (district === "Narsingdi") { 9 | // return 70; 10 | // } else if (district === "Manikganj") { 11 | // return 70; 12 | // } else if (district === "Munshiganj") { 13 | // return 70; 14 | // } else if (district === "Narayanganj") { 15 | // return 70; 16 | // } else if (district === "Mymensingh") { 17 | // return 70; 18 | // } else if (district === "Sherpur") { 19 | // return 70; 20 | // } else if (district === "Jamalpur") { 21 | // return 70; 22 | // } else if (district === "Netrokona") { 23 | // return 70; 24 | // } else if (district === "Kishoreganj") { 25 | // return 70; 26 | // } else if (district === "Tangail") { 27 | // return 70; 28 | // } else if (district === "Faridpur") { 29 | // return 70; 30 | // } else if (district === "Maradipur") { 31 | // return 70; 32 | // } else if (district === "Shariatpur") { 33 | // return 70; 34 | // } else if (district === "Rajbari") { 35 | // return 70; 36 | // } else if (district === "Gopalganj") { 37 | // return 70; 38 | // } else { 39 | // return 120; 40 | // } 41 | // }; 42 | 43 | // export const divisionShippingPrice = (division, district) => { 44 | // if (division !== "Dhaka") { 45 | // return 120; 46 | // } else { 47 | // return 70; 48 | // } 49 | // }; 50 | 51 | export const districtShippingPrice = (division, district) => { 52 | if ( 53 | division === "Dhaka" && 54 | (district === "Dhaka" || 55 | district === "Gazipur" || 56 | district === "Narsingdi" || 57 | district === "Manikganj" || 58 | district === "Munshiganj" || 59 | district === "Narayanganj" || 60 | district === "Mymensingh" || 61 | district === "Sherpur" || 62 | district === "Jamalpur" || 63 | district === "Netrokona" || 64 | district === "Kishoreganj" || 65 | district === "Tangail" || 66 | district === "Faridpur" || 67 | district === "Maradipur" || 68 | district === "Shariatpur" || 69 | district === "Rajbari" || 70 | district === "Gopalganj") 71 | ) { 72 | return 70; 73 | } else { 74 | return 120; 75 | } 76 | }; 77 | -------------------------------------------------------------------------------- /src/pages/shop-product/ProductFixedImage.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React, { Fragment } from "react"; 3 | import MetaTags from "react-meta-tags"; 4 | import { BreadcrumbsItem } from "react-breadcrumbs-dynamic"; 5 | import { connect } from "react-redux"; 6 | import LayoutOne from "../../layouts/LayoutOne"; 7 | import Breadcrumb from "../../wrappers/breadcrumb/Breadcrumb"; 8 | import RelatedProductSlider from "../../wrappers/product/RelatedProductSlider"; 9 | import ProductDescriptionTab from "../../wrappers/product/ProductDescriptionTab"; 10 | import ProductImageDescription from "../../wrappers/product/ProductImageDescription"; 11 | 12 | const ProductFixedImage = ({ location, product }) => { 13 | const { pathname } = location; 14 | 15 | return ( 16 | 17 | 18 | Wonders Tech | Product 19 | 23 | 24 | 25 | Home 26 | 27 | Shop Product 28 | 29 | 30 | 31 | {/* breadcrumb */} 32 | 33 | 34 | {/* product description with image */} 35 | 41 | 42 | {/* product description tab */} 43 | 47 | 48 | {/* related product slider */} 49 | 53 | 54 | 55 | ); 56 | }; 57 | 58 | ProductFixedImage.propTypes = { 59 | location: PropTypes.object, 60 | product: PropTypes.object 61 | }; 62 | 63 | const mapStateToProps = (state, ownProps) => { 64 | const itemId = ownProps.match.params.id; 65 | return { 66 | product: state.productData.products.filter( 67 | single => single.id === itemId 68 | )[0] 69 | }; 70 | }; 71 | 72 | export default connect(mapStateToProps)(ProductFixedImage); 73 | -------------------------------------------------------------------------------- /src/components/header/sub-components/MobileLangCurrChange.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import { multilanguage, changeLanguage } from "redux-multilanguage"; 4 | import { connect } from "react-redux"; 5 | import { setCurrency } from "../../../redux/actions/currencyActions"; 6 | 7 | const MobileLangCurrChange = ({ 8 | currency, 9 | setCurrency, 10 | currentLanguageCode, 11 | dispatch 12 | }) => { 13 | const changeLanguageTrigger = e => { 14 | const languageCode = e.target.value; 15 | dispatch(changeLanguage(languageCode)); 16 | }; 17 | 18 | const setCurrencyTrigger = e => { 19 | const currencyName = e.target.value; 20 | setCurrency(currencyName); 21 | }; 22 | 23 | const closeMobileMenu = () => { 24 | const offcanvasMobileMenu = document.querySelector( 25 | "#offcanvas-mobile-menu" 26 | ); 27 | offcanvasMobileMenu.classList.remove("active"); 28 | }; 29 | 30 | return ( 31 |
32 |
33 | Choose Language 34 | 44 |
45 |
46 | Choose Currency 47 | 57 |
58 |
59 | ); 60 | }; 61 | 62 | MobileLangCurrChange.propTypes = { 63 | setCurrency: PropTypes.func, 64 | currency: PropTypes.object, 65 | currentLanguageCode: PropTypes.string, 66 | dispatch: PropTypes.func 67 | }; 68 | 69 | const mapStateToProps = state => { 70 | return { 71 | currency: state.currencyData 72 | }; 73 | }; 74 | 75 | const mapDispatchToProps = dispatch => { 76 | return { 77 | setCurrency: currencyName => { 78 | dispatch(setCurrency(currencyName)); 79 | } 80 | }; 81 | }; 82 | 83 | export default connect( 84 | mapStateToProps, 85 | mapDispatchToProps 86 | )(multilanguage(MobileLangCurrChange)); 87 | -------------------------------------------------------------------------------- /src/components/newsletter/SubscribeEmailTwo.js: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | import MailchimpSubscribe from "react-mailchimp-subscribe"; 4 | 5 | const CustomForm = ({ 6 | status, 7 | message, 8 | onValidated, 9 | spaceTopClass, 10 | subscribeBtnClass 11 | }) => { 12 | let email; 13 | const submit = () => { 14 | email && 15 | email.value.indexOf("@") > -1 && 16 | onValidated({ 17 | EMAIL: email.value 18 | }); 19 | 20 | email.value = ""; 21 | }; 22 | 23 | return ( 24 |
25 |
26 |
27 | (email = node)} 30 | type="email" 31 | placeholder="Your Email Address" 32 | required 33 | /> 34 |
35 | {status === "sending" && ( 36 |
sending...
37 | )} 38 | {status === "error" && ( 39 |
43 | )} 44 | {status === "success" && ( 45 |
49 | )} 50 |
53 | 56 |
57 |
58 |
59 | ); 60 | }; 61 | 62 | const SubscribeEmailTwo = ({ 63 | mailchimpUrl, 64 | spaceTopClass, 65 | subscribeBtnClass 66 | }) => { 67 | return ( 68 |
69 | ( 72 | subscribe(formData)} 76 | spaceTopClass={spaceTopClass} 77 | subscribeBtnClass={subscribeBtnClass} 78 | /> 79 | )} 80 | /> 81 |
82 | ); 83 | }; 84 | 85 | SubscribeEmailTwo.propTypes = { 86 | mailchimpUrl: PropTypes.string, 87 | spaceTopClass: PropTypes.string 88 | }; 89 | 90 | export default SubscribeEmailTwo; 91 | --------------------------------------------------------------------------------