├── 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 |
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 |
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 |
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 |
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 | {/*
*/}
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 |
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 |
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 |
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 | {
17 | getSortParams("tag", tag);
18 | setActiveSort(e);
19 | }}
20 | >
21 | {tag}
22 |
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 | getActiveState(false)}
14 | >
15 |
16 |
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 |
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 | X
48 |
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 |
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 |
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 |
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 |
← Back
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 |
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 |
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 | //
22 | //
23 | //
24 | // ),
25 | // renderNextButton: () => (
26 | //
27 | //
28 | //
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 |
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 |
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 | {
16 | getSortParams("color", "");
17 | setActiveSort(e);
18 | }}
19 | >
20 | All Colors{" "}
21 |
22 |
23 |
24 | {colors.map((color, key) => {
25 | return (
26 |
27 |
28 | {
30 | getSortParams("color", color);
31 | setActiveSort(e);
32 | }}
33 | >
34 | {color}{" "}
35 |
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 | getFilterSortParams("filterSort", e.target.value)}
20 | >
21 | Default
22 | Price - High to Low
23 | Price - Low to High
24 |
25 |
26 |
27 | Showing {sortedProductCount} of {productCount} result
28 |
29 |
30 |
31 |
32 | toggleShopTopFilter(e)}>
33 | filter
34 |
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 |
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 | You need to enable JavaScript to run this app.
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 |
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 |
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 | {
16 | getSortParams("category", "");
17 | setActiveSort(e);
18 | }}
19 | >
20 | All Categories
21 |
22 |
23 |
24 | {categories.map((category, key) => {
25 | return (
26 |
27 |
28 | {
30 | getSortParams("category", category);
31 | setActiveSort(e);
32 | }}
33 | >
34 | {" "}
35 | {category}{" "}
36 |
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 |
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 | {
16 | getSortParams("size", "");
17 | setActiveSort(e);
18 | }}
19 | >
20 | All Sizes{" "}
21 |
22 |
23 |
24 | {sizes.map((size, key) => {
25 | return (
26 |
27 |
28 | {
31 | getSortParams("size", size);
32 | setActiveSort(e);
33 | }}
34 | >
35 | {" "}
36 |
37 | {size}{" "}
38 |
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 |
17 |
18 |
19 | ),
20 | renderNextButton: () => (
21 |
22 |
23 |
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 | getFilterSortParams("filterSort", e.target.value)}
17 | >
18 | Default
19 | Price - High to Low
20 | Price - Low to High
21 |
22 |
23 |
24 | Showing {sortedProductCount} of {productCount} result
25 |
26 |
27 |
28 |
29 | {
31 | getLayout("grid two-column");
32 | setActiveLayout(e);
33 | }}
34 | >
35 |
36 |
37 | {
39 | getLayout("grid three-column");
40 | setActiveLayout(e);
41 | }}
42 | >
43 |
44 |
45 | {
47 | getLayout("list");
48 | setActiveLayout(e);
49 | }}
50 | >
51 |
52 |
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 | changeLanguageTrigger(e)}>
38 | English
39 |
40 |
41 |
42 | changeLanguageTrigger(e)}>
43 | Bangla
44 |
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 |
← Back
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 | Create Product
41 |
42 |
43 |
44 |
← Back
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 | users
25 |
26 |
27 |
28 |
29 |
30 |
Modify Products
31 |
32 | product
33 |
34 |
35 |
36 |
37 |
38 |
Go To All Orders
39 |
40 | Orders
41 |
42 |
43 |
44 |
45 |
46 |
Go To HomePage
47 |
48 | Home
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 |
30 |
31 |
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 |
32 | SUBSCRIBE
33 |
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 | NAME
22 | PRICE
23 | STOCK
24 | CATEGORY
25 | RATING
26 | *
27 |
28 |
29 |
30 | {products &&
31 | products.map((product) => (
32 |
33 | {/* {product.id} */}
34 | {product.name}
35 | {product.price}৳
36 | {product.stock}
37 | {product.category.map((cat) => cat)[0]}
38 | {product.rating}
39 |
40 |
44 |
45 |
46 |
47 |
48 | deleteHandler(product.id)}
52 | >
53 |
54 |
55 |
56 |
57 | ))}
58 |
59 |
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 | ID
22 | USER
23 | DATE
24 | TOTAL
25 | PAID
26 | DELIVERED
27 | *
28 |
29 |
30 |
31 | {orders &&
32 | orders.map((order) => (
33 |
34 | {/* {order.id} */}
35 | {order._id}
36 | {order.user && order.user.name}
37 | {order.createdAt.substring(0, 10)}
38 | {order.totalPrice}৳
39 |
40 | {order.isPaid ? (
41 | order.paidAt.substring(0, 10)
42 | ) : (
43 |
44 | )}
45 |
46 |
47 | {order.isDelivered ? (
48 | order.deliveredAt.substring(0, 10)
49 | ) : (
50 |
51 | )}
52 |
53 |
54 |
55 | Details
56 |
57 |
58 |
59 | ))}
60 |
61 |
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 |
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 | {
37 | changeLanguageTrigger(e);
38 | closeMobileMenu();
39 | }}
40 | >
41 | English
42 | Bangla
43 |
44 |
45 |
46 | Choose Currency
47 | {
50 | setCurrencyTrigger(e);
51 | closeMobileMenu();
52 | }}
53 | >
54 | USD
55 | TAKA
56 |
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 |
54 | SUBSCRIBE
55 |
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 |
--------------------------------------------------------------------------------