From da2dacccd5b47d840dae091d59cf33baa2931f7e Mon Sep 17 00:00:00 2001 From: Veronika Pastushkova Date: Mon, 17 Jul 2023 09:50:22 +0300 Subject: [PATCH 1/3] add task solution --- src/App.scss | 30 +- src/App.tsx | 13 +- src/api/CategoriesList.json | 23 ++ src/api/Products.ts | 11 + src/api/navFooter.json | 14 + src/api/navHeader.json | 18 ++ .../AddToCartButton/AddToCartButton.scss | 38 +++ .../AddToCartButton/AddToCartButton.tsx | 34 ++ src/components/BackButton/BackButton.scss | 21 ++ src/components/BackButton/BackButton.tsx | 21 ++ src/components/BannerSlider/BannerSlider.scss | 70 +++++ src/components/BannerSlider/BannerSlider.tsx | 78 +++++ src/components/CartItem/CartItem.scss | 121 ++++++++ src/components/CartItem/CartItem.tsx | 90 ++++++ src/components/Dropdown/Dropdown.scss | 82 +++++ src/components/Dropdown/Dropdown.tsx | 96 ++++++ src/components/Footer/Footer.scss | 55 ++++ src/components/Footer/Footer.tsx | 50 +++ src/components/Header/Header.scss | 33 ++ src/components/Header/Header.tsx | 43 +++ src/components/Header/index.tsx | 1 + .../HeaderButtons/HeaderButtons.scss | 55 ++++ .../HeaderButtons/HeaderButtons.tsx | 55 ++++ src/components/LikeButton/LikeButton.scss | 43 +++ src/components/LikeButton/LikeButton.tsx | 36 +++ src/components/Loader/Loader.scss | 25 ++ src/components/Loader/Loader.tsx | 5 + src/components/Logo/Logo.scss | 7 + src/components/Logo/Logo.tsx | 7 + src/components/Nav/Nav.scss | 6 + src/components/Nav/Nav.tsx | 17 + .../NavLinkByCategory/NavLinkByCategory.tsx | 37 +++ src/components/NoResults/NoResults.scss | 37 +++ src/components/NoResults/NoResults.tsx | 19 ++ src/components/PageNavLink/PageNavLink.scss | 25 ++ src/components/PageNavLink/PageNavLink.tsx | 28 ++ src/components/Pagination/Pagination.scss | 42 +++ src/components/Pagination/Pagination.tsx | 87 ++++++ src/components/ProductCard/ProductCard.scss | 150 +++++++++ src/components/ProductCard/ProductCard.tsx | 157 ++++++++++ src/components/ProductsList/ProductList.scss | 33 ++ src/components/ProductsList/ProductsList.tsx | 115 +++++++ src/components/ProductsNav/ProductsNav.scss | 42 +++ src/components/ProductsNav/ProductsNav.tsx | 66 ++++ .../ProductsSlider/ProductsSlider.scss | 60 ++++ .../ProductsSlider/ProductsSlider.tsx | 59 ++++ src/components/SearchBar/SearchBar.scss | 42 +++ src/components/SearchBar/SearchBar.tsx | 68 ++++ .../ShopByCategory/ShopByCategory.scss | 49 +++ .../ShopByCategory/ShopByCategory.tsx | 74 +++++ src/context/Context.tsx | 111 +++++++ src/fonts/FontsFree-Net-Mont-Bold.ttf | Bin 0 -> 146812 bytes src/fonts/FontsFree-regular.ttf | Bin 0 -> 93324 bytes src/fonts/FontsFree-semibold.ttf | Bin 0 -> 93028 bytes src/fonts/_fonts.scss | 17 + src/images/ArrowDown.svg | 3 + src/images/ArrowLeft.svg | 3 + src/images/ArrowRight.svg | 3 + src/images/ArrowUp.svg | 3 + src/images/Cart.svg | 5 + src/images/Close.svg | 3 + src/images/Favorite.svg | 3 + src/images/FavouritesFilledHeartLike.svg | 3 + src/images/FavouritesHeartLike.svg | 3 + src/images/Home.svg | 4 + src/images/Minus.svg | 3 + src/images/Plus.svg | 3 + src/images/Search.svg | 3 + src/index.tsx | 48 ++- src/main.scss | 4 + src/pages/AccessoriesPage/AccessoriesPage.tsx | 52 ++++ src/pages/CartPage/CartPage.scss | 102 ++++++ src/pages/CartPage/CartPage.tsx | 124 ++++++++ src/pages/FavoritesPage/FavoritesPage.scss | 33 ++ src/pages/FavoritesPage/FavoritesPage.tsx | 32 ++ src/pages/HomePage/HomePage.tsx | 43 +++ src/pages/PageNotFound/PageNotFound.scss | 10 + src/pages/PageNotFound/PageNotFound.tsx | 12 + src/pages/PhonesPage/PhonesPage.tsx | 52 ++++ .../ProductDetailsPage.scss | 259 ++++++++++++++++ .../ProductDetailsPage/ProductDetailsPage.tsx | 293 ++++++++++++++++++ src/pages/TabletsPage/TabletsPage.tsx | 52 ++++ src/types/ButtonType.ts | 1 + src/types/ErrorType.ts | 5 + src/types/IconType.ts | 22 ++ src/types/Product.ts | 14 + src/types/ProductDetails.ts | 49 +++ src/types/SortType.ts | 8 + src/utils/_extends.scss | 48 +++ src/utils/_mixins.scss | 4 + src/utils/_variables.scss | 8 + src/utils/fetchClient.ts | 41 +++ src/utils/getProductToSave.ts | 49 +++ src/utils/searchHelper.ts | 47 +++ src/utils/useLocaleStorage.ts | 31 ++ 95 files changed, 3998 insertions(+), 3 deletions(-) create mode 100644 src/api/CategoriesList.json create mode 100644 src/api/Products.ts create mode 100644 src/api/navFooter.json create mode 100644 src/api/navHeader.json create mode 100644 src/components/AddToCartButton/AddToCartButton.scss create mode 100644 src/components/AddToCartButton/AddToCartButton.tsx create mode 100644 src/components/BackButton/BackButton.scss create mode 100644 src/components/BackButton/BackButton.tsx create mode 100644 src/components/BannerSlider/BannerSlider.scss create mode 100644 src/components/BannerSlider/BannerSlider.tsx create mode 100644 src/components/CartItem/CartItem.scss create mode 100644 src/components/CartItem/CartItem.tsx create mode 100644 src/components/Dropdown/Dropdown.scss create mode 100644 src/components/Dropdown/Dropdown.tsx create mode 100644 src/components/Footer/Footer.scss create mode 100644 src/components/Footer/Footer.tsx create mode 100644 src/components/Header/Header.scss create mode 100644 src/components/Header/Header.tsx create mode 100644 src/components/Header/index.tsx create mode 100644 src/components/HeaderButtons/HeaderButtons.scss create mode 100644 src/components/HeaderButtons/HeaderButtons.tsx create mode 100644 src/components/LikeButton/LikeButton.scss create mode 100644 src/components/LikeButton/LikeButton.tsx create mode 100644 src/components/Loader/Loader.scss create mode 100644 src/components/Loader/Loader.tsx create mode 100644 src/components/Logo/Logo.scss create mode 100644 src/components/Logo/Logo.tsx create mode 100644 src/components/Nav/Nav.scss create mode 100644 src/components/Nav/Nav.tsx create mode 100644 src/components/NavLinkByCategory/NavLinkByCategory.tsx create mode 100644 src/components/NoResults/NoResults.scss create mode 100644 src/components/NoResults/NoResults.tsx create mode 100644 src/components/PageNavLink/PageNavLink.scss create mode 100644 src/components/PageNavLink/PageNavLink.tsx create mode 100644 src/components/Pagination/Pagination.scss create mode 100644 src/components/Pagination/Pagination.tsx create mode 100644 src/components/ProductCard/ProductCard.scss create mode 100644 src/components/ProductCard/ProductCard.tsx create mode 100644 src/components/ProductsList/ProductList.scss create mode 100644 src/components/ProductsList/ProductsList.tsx create mode 100644 src/components/ProductsNav/ProductsNav.scss create mode 100644 src/components/ProductsNav/ProductsNav.tsx create mode 100644 src/components/ProductsSlider/ProductsSlider.scss create mode 100644 src/components/ProductsSlider/ProductsSlider.tsx create mode 100644 src/components/SearchBar/SearchBar.scss create mode 100644 src/components/SearchBar/SearchBar.tsx create mode 100644 src/components/ShopByCategory/ShopByCategory.scss create mode 100644 src/components/ShopByCategory/ShopByCategory.tsx create mode 100644 src/context/Context.tsx create mode 100644 src/fonts/FontsFree-Net-Mont-Bold.ttf create mode 100644 src/fonts/FontsFree-regular.ttf create mode 100644 src/fonts/FontsFree-semibold.ttf create mode 100644 src/fonts/_fonts.scss create mode 100644 src/images/ArrowDown.svg create mode 100644 src/images/ArrowLeft.svg create mode 100644 src/images/ArrowRight.svg create mode 100644 src/images/ArrowUp.svg create mode 100644 src/images/Cart.svg create mode 100644 src/images/Close.svg create mode 100644 src/images/Favorite.svg create mode 100644 src/images/FavouritesFilledHeartLike.svg create mode 100644 src/images/FavouritesHeartLike.svg create mode 100644 src/images/Home.svg create mode 100644 src/images/Minus.svg create mode 100644 src/images/Plus.svg create mode 100644 src/images/Search.svg create mode 100644 src/main.scss create mode 100644 src/pages/AccessoriesPage/AccessoriesPage.tsx create mode 100644 src/pages/CartPage/CartPage.scss create mode 100644 src/pages/CartPage/CartPage.tsx create mode 100644 src/pages/FavoritesPage/FavoritesPage.scss create mode 100644 src/pages/FavoritesPage/FavoritesPage.tsx create mode 100644 src/pages/HomePage/HomePage.tsx create mode 100644 src/pages/PageNotFound/PageNotFound.scss create mode 100644 src/pages/PageNotFound/PageNotFound.tsx create mode 100644 src/pages/PhonesPage/PhonesPage.tsx create mode 100644 src/pages/ProductDetailsPage/ProductDetailsPage.scss create mode 100644 src/pages/ProductDetailsPage/ProductDetailsPage.tsx create mode 100644 src/pages/TabletsPage/TabletsPage.tsx create mode 100644 src/types/ButtonType.ts create mode 100644 src/types/ErrorType.ts create mode 100644 src/types/IconType.ts create mode 100644 src/types/Product.ts create mode 100644 src/types/ProductDetails.ts create mode 100644 src/types/SortType.ts create mode 100644 src/utils/_extends.scss create mode 100644 src/utils/_mixins.scss create mode 100644 src/utils/_variables.scss create mode 100644 src/utils/fetchClient.ts create mode 100644 src/utils/getProductToSave.ts create mode 100644 src/utils/searchHelper.ts create mode 100644 src/utils/useLocaleStorage.ts diff --git a/src/App.scss b/src/App.scss index 71bc413aad..5294541bf7 100644 --- a/src/App.scss +++ b/src/App.scss @@ -1 +1,29 @@ -// not empty +html { + scroll-behavior: smooth; +} + +p, +h1, +h2, +h3, +h4, +ul, +button, +span, +body { + margin: 0; + padding: 0; +} + +body { + box-sizing: border-box; + font-family: "Mont", arial, helvetica, sans-serif; + font-weight: 500; + font-size: 14px; + line-height: 21px; +} + +.container { + max-width: 1136px; + margin: 0 auto; +} diff --git a/src/App.tsx b/src/App.tsx index a1715e52b3..3f503cf72d 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,8 +1,19 @@ +import { Outlet } from 'react-router-dom'; import './App.scss'; +import { Footer } from './components/Footer/Footer'; +import { Header } from './components/Header/Header'; const App = () => (
-

React Phone Catalog

+
+ +
+
+ +
+
+ +
); diff --git a/src/api/CategoriesList.json b/src/api/CategoriesList.json new file mode 100644 index 0000000000..9b3f0f1c09 --- /dev/null +++ b/src/api/CategoriesList.json @@ -0,0 +1,23 @@ +[ + { + "title": "Mobile phones", + "image": "img/categories/phones.jpg", + "type": "phones", + "itemType": "phone", + "url": "/phones" + }, + { + "title": "Tablets", + "image": "img/categories/tablets.jpg", + "type": "tablets", + "itemType": "tablet", + "url": "/tablets" + }, + { + "title": "Accessories", + "image": "img/categories/accessories.jpg", + "type": "accessories", + "itemType": "accessory", + "url": "/accessories" + } +] diff --git a/src/api/Products.ts b/src/api/Products.ts new file mode 100644 index 0000000000..3f64583c3c --- /dev/null +++ b/src/api/Products.ts @@ -0,0 +1,11 @@ +import { Product } from '../types/Product'; +import { ProductDetails } from '../types/ProductDetails'; +import { client } from '../utils/fetchClient'; + +export const getProducts = () => { + return client.get('/products.json'); +}; + +export const getProductDetails = (productId: string) => { + return client.get(`/products/${productId}.json`); +}; diff --git a/src/api/navFooter.json b/src/api/navFooter.json new file mode 100644 index 0000000000..7c0deaf4ea --- /dev/null +++ b/src/api/navFooter.json @@ -0,0 +1,14 @@ +[ + { + "title": "Github", + "path": "https://github.com/NikaNika12" + }, + { + "title": "Contacts", + "path": "https://github.com/NikaNika12" + }, + { + "title": "Rights", + "path": "https://github.com/NikaNika12" + } +] diff --git a/src/api/navHeader.json b/src/api/navHeader.json new file mode 100644 index 0000000000..a1f5e17190 --- /dev/null +++ b/src/api/navHeader.json @@ -0,0 +1,18 @@ +[ + { + "title": "Home", + "path": "/" + }, + { + "title": "Phones", + "path": "/phones" + }, + { + "title": "Tablets", + "path": "/tablets" + }, + { + "title": "Accessories", + "path": "/accessories" + } +] diff --git a/src/components/AddToCartButton/AddToCartButton.scss b/src/components/AddToCartButton/AddToCartButton.scss new file mode 100644 index 0000000000..0131884428 --- /dev/null +++ b/src/components/AddToCartButton/AddToCartButton.scss @@ -0,0 +1,38 @@ +@import "../../main.scss"; + +.button { + width: 176px; + height: 40px; + + @extend %buttons-text; + + color: $color-white; + background-color: $color-primary; + border: none; + outline: none; + + transition: box-shadow 0.5s; + cursor: pointer; + + &--small { + width: 176px; + height: 40px; + } + + &--big { + width: 100%; + height: 48px; + } + + &--selected { + color: $color-green; + background: none; + border: 1px solid $color-elements; + } + + &:hover { + color: $color-white; + background-color: $color-primary; + box-shadow: 0 3px 13px rgba(23, 32, 49, 0.26); + } +} diff --git a/src/components/AddToCartButton/AddToCartButton.tsx b/src/components/AddToCartButton/AddToCartButton.tsx new file mode 100644 index 0000000000..47e6437e03 --- /dev/null +++ b/src/components/AddToCartButton/AddToCartButton.tsx @@ -0,0 +1,34 @@ +import classNames from 'classnames'; +import { useContext } from 'react'; +import { Product } from '../../types/Product'; +import { Context } from '../../context/Context'; +import './AddToCartButton.scss'; +import { ButtonType } from '../../types/ButtonType'; + +type Props = { + product: Product; + size: ButtonType; +}; + +export const AddToCartButton: React.FC = ({ product, size }) => { + const { changeCart, cart } = useContext(Context); + + const isInCart = cart.length > 0 + ? cart.find(item => item.id === product?.id) : false; + + return ( + + ); +}; diff --git a/src/components/BackButton/BackButton.scss b/src/components/BackButton/BackButton.scss new file mode 100644 index 0000000000..979d2e66dd --- /dev/null +++ b/src/components/BackButton/BackButton.scss @@ -0,0 +1,21 @@ +@import "../../main.scss"; + +.backButton { + display: flex; + align-items: center; + margin-bottom: 24px; + padding: 10px 20px; + width: 50px; + height: 30px; + background-color: $color-white; + background-image: url("../../images/ArrowLeft.svg"); + background-position: left; + background-repeat: no-repeat; + border: 0; + color: $color-secondary; + cursor: pointer; + + &:hover { + color: $color-primary; + } +} diff --git a/src/components/BackButton/BackButton.tsx b/src/components/BackButton/BackButton.tsx new file mode 100644 index 0000000000..b26fef7bb3 --- /dev/null +++ b/src/components/BackButton/BackButton.tsx @@ -0,0 +1,21 @@ +import { useNavigate } from 'react-router-dom'; +import './BackButton.scss'; + +export const BackButton = () => { + const navigate = useNavigate(); + + return ( + + ); +}; diff --git a/src/components/BannerSlider/BannerSlider.scss b/src/components/BannerSlider/BannerSlider.scss new file mode 100644 index 0000000000..531643ca78 --- /dev/null +++ b/src/components/BannerSlider/BannerSlider.scss @@ -0,0 +1,70 @@ +@import "../../main.scss"; + +.banner { + &__container { + display: flex; + gap: 16px; + margin-bottom: 8px; + } + + &__images { + display: flex; + height: 400px; + order: 2; + } + + &__image { + opacity: 0; + height: 0; + width: 0; + transition: opacity 0.3s; + + &--active { + opacity: 1; + height: 100%; + width: 100%; + } + } + + &__button { + flex: 0 0 32px; + border: 1px solid $color-icons; + background-color: $color-white; + transition: all 0.3s ease; + + &:hover { + border: 1px solid $color-primary; + } + + &--prev { + order: 1; + } + + &--next { + order: 3; + } + } + + &__pagination-container { + display: flex; + justify-content: center; + align-items: center; + gap: 15px; + height: 24px; + margin-bottom: 72px; + } + + &__button-pg { + border: 1px solid transparent; + transition: all 0.3s; + background-color: $color-elements; + + &:hover { + border: 1px solid $color-primary; + } + + &--active { + background-color: $color-primary; + } + } +} diff --git a/src/components/BannerSlider/BannerSlider.tsx b/src/components/BannerSlider/BannerSlider.tsx new file mode 100644 index 0000000000..236420515c --- /dev/null +++ b/src/components/BannerSlider/BannerSlider.tsx @@ -0,0 +1,78 @@ +import { useEffect, useState } from 'react'; +import classNames from 'classnames'; +import './BannerSlider.scss'; + +const BannerImages = [ + 'img/banner1.jpg', + 'img/banner2.jpg', + 'img/banner3.jpg', +]; + +export const BannerSlider: React.FC = () => { + const [currentIndex, setCurrentIndex] = useState(0); + + useEffect(() => { + const interval = setInterval( + () => setCurrentIndex((prev) => prev + 1), + 5000, + ); + + return () => clearInterval(interval); + }, [currentIndex]); + + return ( +
+
+ +
+ {BannerImages.map((image, index) => { + if (currentIndex > BannerImages.length - 1) { + setCurrentIndex(0); + } + + if (currentIndex < 0) { + setCurrentIndex(BannerImages.length - 1); + } + + return ( + {image} + ); + })} +
+ +
+
+ {BannerImages.map((image, index) => ( +
+
+ ); +}; diff --git a/src/components/CartItem/CartItem.scss b/src/components/CartItem/CartItem.scss new file mode 100644 index 0000000000..ddc37926ec --- /dev/null +++ b/src/components/CartItem/CartItem.scss @@ -0,0 +1,121 @@ +@import "../../main.scss"; + +.cart { + &__empty-title { + display: flex; + justify-content: center; + margin-bottom: 40px; + padding-top: 16px; + color: $color-primary; + } + + &__list { + display: flex; + flex-direction: column; + } + + &__item { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 16px; + border: 1px solid $color-elements; + transition: all 0.5s; + padding: 24px; + + &:last-child { + margin-bottom: 0; + } + + &:hover { + box-shadow: 0 3px 13px rgba(23, 32, 49, 0.26); + } + + &__icon { + background-color: $color-white; + border: none; + transition: all 0.5s; + cursor: pointer; + + &--close { + display: block; + background-position: center; + background-repeat: no-repeat; + @include squareSize(16px); + border: 1px solid $color-icons; + background-image: url(../../images/Close.svg); + } + } + } + + &__image { + height: 100%; + &--container { + @include squareSize(80px); + padding: 7px; + } + } + + &__item-title { + width: 295px; + } + + &__buttons { + display: flex; + align-items: center; + + &__icon { + border: 1px solid $color-icons; + transition: all 0.5s; + background-color: $color-white; + cursor: pointer; + + &:hover { + border-color: $color-icons; + } + + &:hover:disabled { + border-color: $color-elements; + } + + &--substract { + display: block; + background-position: center; + background-repeat: no-repeat; + @include squareSize(32px); + border: 1px solid $color-icons; + background-image: url(../../images/Minus.svg); + } + + &--add { + display: block; + background-position: center; + background-repeat: no-repeat; + @include squareSize(32px); + border: 1px solid $color-icons; + background-image: url(../../images/Plus.svg); + } + } + } + + &__quantity { + min-width: 32px; + width: 100%; + text-align: center; + color: #000; + } + + &__price { + min-width: 60px; + @extend %h2-text; + color: $color-primary; + } + + &__empty-phrase { + width: 100%; + margin-top: 30px; + @extend %h1-text; + text-align: center; + color: $color-primary; + } +} diff --git a/src/components/CartItem/CartItem.tsx b/src/components/CartItem/CartItem.tsx new file mode 100644 index 0000000000..d068a8a96a --- /dev/null +++ b/src/components/CartItem/CartItem.tsx @@ -0,0 +1,90 @@ +import { useContext } from 'react'; +import { Context } from '../../context/Context'; +import { Product } from '../../types/Product'; +import './CartItem.scss'; + +export const CartItem: React.FC = (product) => { + const { + imageUrl, + name, + price, + quantity, + discount, + } = product; + + const priceAfterDiscount = price * ((100 - discount) / 100); + + const { changeCart } = useContext(Context); + + const addItem = () => { + changeCart({ + ...product, + quantity: quantity && quantity + 1, + }); + }; + + const substractItem = () => { + changeCart({ + ...product, + quantity: quantity && quantity - 1, + }); + }; + + return ( +
  • + + +
    + product +
    + +
    + {name} +
    + +
    + + +
    + {quantity} +
    + + +
    + +
    + {`$${priceAfterDiscount * (quantity || 1)}`} +
    +
  • + ); +}; diff --git a/src/components/Dropdown/Dropdown.scss b/src/components/Dropdown/Dropdown.scss new file mode 100644 index 0000000000..e628ca3723 --- /dev/null +++ b/src/components/Dropdown/Dropdown.scss @@ -0,0 +1,82 @@ +@import "../../main.scss"; + +.dropdown { + position: relative; + + &__label { + @extend %small-text; + color: $color-secondary; + margin-bottom: 4px; + position: relative; + } + + &__select { + display: flex; + align-items: center; + justify-content: space-between; + @extend %buttons-text; + padding: 10px; + height: 40px; + width: 100%; + border: 1px solid $color-icons; + outline: none; + color: $color-primary; + background-color: $color-white; + text-transform: capitalize; + + &:hover { + border: 1px solid $color-primary; + } + } + + &__arrow { + display: flex; + justify-content: center; + align-items: center; + transition: transform 0.3s; + + &--active { + transform: rotate(180deg); + } + } + + &__options { + position: absolute; + top: 110%; + width: 100%; + border: 1px solid $color-elements; + list-style: none; + padding: 8px 0; + background-color: $color-white; + } + + &__option { + cursor: pointer; + height: 32px; + padding: 0 12px; + transition: all 0.3s; + + &:hover { + background-color: $color-background; + } + } + + &__option a { + display: flex; + align-items: center; + color: $color-secondary; + width: 100%; + height: 100%; + text-decoration: none; + text-transform: capitalize; + transition: all 0.3s; + + &:last-child { + margin-bottom: 0; + } + + &:hover { + color: $color-primary; + } + } +} diff --git a/src/components/Dropdown/Dropdown.tsx b/src/components/Dropdown/Dropdown.tsx new file mode 100644 index 0000000000..321942691f --- /dev/null +++ b/src/components/Dropdown/Dropdown.tsx @@ -0,0 +1,96 @@ +import classNames from 'classnames'; +import { useRef, useState } from 'react'; +import { Link, useSearchParams } from 'react-router-dom'; +import { getSearchWith } from '../../utils/searchHelper'; +import './Dropdown.scss'; + +type Props = { + dropdownList: string[]; + defaultValue: string; + label: string; + searchParamsKey: string; +}; + +export const Dropdown: React.FC = ({ + dropdownList, + defaultValue, + label, + searchParamsKey, +}) => { + const [isOpen, setIsOpen] = useState(false); + const [searchParams] = useSearchParams(); + const [value, setValue] = useState(defaultValue); + const buttonRef = useRef(null); + + const getSearchParams = (params: string) => { + if (searchParamsKey === 'perPage') { + return getSearchWith(searchParams, { + page: '1', + [searchParamsKey]: params, + }); + } + + return getSearchWith(searchParams, { + [searchParamsKey]: params, + }); + }; + + document.addEventListener('click', (e) => { + if (e.target !== buttonRef.current) { + setIsOpen(false); + } + }); + + document.addEventListener('keyup', (e) => { + if (e.key === 'Tab' || e.key === 'Escape') { + setIsOpen(false); + } + }); + + return ( +
    +

    {label}

    + + + {isOpen && ( +
      + {dropdownList.map(dropdownItem => ( + + ))} +
    + )} +
    + ); +}; diff --git a/src/components/Footer/Footer.scss b/src/components/Footer/Footer.scss new file mode 100644 index 0000000000..433529ae6a --- /dev/null +++ b/src/components/Footer/Footer.scss @@ -0,0 +1,55 @@ +@import "../../main.scss"; + +.footer { + display: flex; + justify-content: space-between; + align-items: center; + height: 96px; + box-sizing: border-box; + border-top: 1px solid $color-elements; + + &__container { + display: flex; + align-items: center; + justify-content: space-between; + max-width: 1136px; + width: 100%; + margin: 0 auto; + } + + &__nav { + display: flex; + gap: 64px; + } + + &__link { + @extend %uppercase-text; + color: $color-secondary; + text-decoration: none; + } +} + +.button-top { + display: flex; + align-items: center; + gap: 16px; + cursor: pointer; + font-family: "Mont", arial, helvetica, sans-serif; + font-weight: 600; + font-size: 12px; + line-height: 15px; + text-decoration: none; + + &__text { + color: $color-secondary; + } + + &__icon { + display: block; + background-position: center; + background-repeat: no-repeat; + @include squareSize(32px); + border: 1px solid $color-icons; + background-image: url(../../images/ArrowUp.svg); + } +} diff --git a/src/components/Footer/Footer.tsx b/src/components/Footer/Footer.tsx new file mode 100644 index 0000000000..6b73cdac88 --- /dev/null +++ b/src/components/Footer/Footer.tsx @@ -0,0 +1,50 @@ +import { Link, useLocation } from 'react-router-dom'; +import { Logo } from '../Logo/Logo'; +import footerList from '../../api/navFooter.json'; +import './Footer.scss'; + +export const Footer: React.FC = () => { + const location = useLocation(); + + const handleScrollToTop = () => { + window.scrollTo({ + top: 0, + left: 0, + behavior: 'smooth', + }); + }; + + return ( +
    +
    + + +
    + {footerList.map(item => ( + + {item.title} + + ))} +
    + + +

    + Back to top +

    + + + +
    +
    + ); +}; diff --git a/src/components/Header/Header.scss b/src/components/Header/Header.scss new file mode 100644 index 0000000000..a0363f68df --- /dev/null +++ b/src/components/Header/Header.scss @@ -0,0 +1,33 @@ +@import "../../main.scss"; + +.header { + display: flex; + justify-content: space-between; + align-items: center; + height: 64px; + margin: 0 0 40px; + border-bottom: 1px solid $color-elements; + + &__container { + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + max-width: 1440px; + margin: 0 auto; + padding-left: 40px; + } + + &__left { + display: flex; + justify-content: center; + align-items: center; + gap: 64px; + } + + &__right { + display: flex; + justify-content: center; + align-items: center; + } +} diff --git a/src/components/Header/Header.tsx b/src/components/Header/Header.tsx new file mode 100644 index 0000000000..18a5d6db6e --- /dev/null +++ b/src/components/Header/Header.tsx @@ -0,0 +1,43 @@ +import { useLocation, useParams } from 'react-router-dom'; +import { Logo } from '../Logo/Logo'; +import { Nav } from '../Nav/Nav'; +import { SearchBar } from '../SearchBar/SearchBar'; +import { HeaderButtons } from '../HeaderButtons/HeaderButtons'; +import CategoriesList from '../../api/CategoriesList.json'; +import './Header.scss'; + +export const Header: React.FC = () => { + const location = useLocation(); + const { productId = '' } = useParams(); + + const cartCondition = location.pathname.includes('cart'); + const favoriteCondition = location.pathname.includes('favorite'); + + const productCategoriesList = CategoriesList.map(item => item.type).some( + item => location.pathname.includes(item), + ) && !productId; + + return ( +
    +
    +
    +
    + +
    + {!cartCondition &&
    +
    + {(favoriteCondition || productCategoriesList) && } + {!cartCondition && ( + + )} + +
    +
    +
    + ); +}; diff --git a/src/components/Header/index.tsx b/src/components/Header/index.tsx new file mode 100644 index 0000000000..266dec8a1b --- /dev/null +++ b/src/components/Header/index.tsx @@ -0,0 +1 @@ +export * from './Header'; diff --git a/src/components/HeaderButtons/HeaderButtons.scss b/src/components/HeaderButtons/HeaderButtons.scss new file mode 100644 index 0000000000..52660893c2 --- /dev/null +++ b/src/components/HeaderButtons/HeaderButtons.scss @@ -0,0 +1,55 @@ +@import "../../main.scss"; + +.top-item { + position: relative; + display: flex; + align-items: center; + border-left: 1px solid $color-elements; + + &-count { + position: absolute; + top: 14px; + right: 17px; + + display: flex; + justify-content: center; + align-items: center; + @include squareSize(14px); + + font-family: inherit; + font-weight: 600; + font-size: 9px; + line-height: 12px; + color: $color-white; + background-color: $color-red; + border: 1px solid $color-white; + border-radius: 50%; + } + + &__link { + display: flex; + padding: 22px 24px; + color: $color-primary; + transition: border 0.5s; + + &:hover { + border-bottom: 3px solid $color-primary; + cursor: pointer; + } + } + + &__icon { + display: block; + background-position: center; + background-repeat: no-repeat; + padding: 8px; + + &--favorite { + background-image: url(../../images/Favorite.svg); + } + + &--cart { + background-image: url(../../images/Cart.svg); + } + } +} diff --git a/src/components/HeaderButtons/HeaderButtons.tsx b/src/components/HeaderButtons/HeaderButtons.tsx new file mode 100644 index 0000000000..d3b3389a9b --- /dev/null +++ b/src/components/HeaderButtons/HeaderButtons.tsx @@ -0,0 +1,55 @@ +import classNames from 'classnames'; +import { useContext } from 'react'; +import { Link } from 'react-router-dom'; +import { Context } from '../../context/Context'; +import './HeaderButtons.scss'; + +type ButtonType = 'favorite' | 'cart'; + +type Props = { + type: ButtonType, +}; + +export const HeaderButtons: React.FC = ({ type }) => { + const { cart, favorite } = useContext(Context); + + const productsAmount = (type === 'cart') + ? cart.length + : favorite.length; + + return ( +
    + + {type === 'favorite' + && ( + + )} + + {type === 'cart' + && ( + + )} + + {productsAmount > 0 + && ( + + {productsAmount} + + )} + +
    + ); +}; diff --git a/src/components/LikeButton/LikeButton.scss b/src/components/LikeButton/LikeButton.scss new file mode 100644 index 0000000000..841abfc86b --- /dev/null +++ b/src/components/LikeButton/LikeButton.scss @@ -0,0 +1,43 @@ +@import "../../main.scss"; + +.button-like { + display: flex; + justify-content: center; + align-items: center; + padding: 0; + + background-color: $color-white; + border: 1px solid $color-icons; + transition: all 0.5s; + cursor: pointer; + + &--small { + @include squareSize(40px); + } + + &--big { + @include squareSize(48px); + } + + &--icon { + display: block; + background-position: center; + background-repeat: no-repeat; + background-image: url(../../images/FavouritesHeartLike.svg); + + &--selected { + display: block; + background-position: center; + background-repeat: no-repeat; + background-image: url(../../images/FavouritesFilledHeartLike.svg); + } + } + + &--selected { + border-color: $color-elements; + } + + &:hover { + border-color: $color-primary; + } +} diff --git a/src/components/LikeButton/LikeButton.tsx b/src/components/LikeButton/LikeButton.tsx new file mode 100644 index 0000000000..2f4d6b0cb6 --- /dev/null +++ b/src/components/LikeButton/LikeButton.tsx @@ -0,0 +1,36 @@ +import { useContext } from 'react'; +import classNames from 'classnames'; +import { Product } from '../../types/Product'; +import { Context } from '../../context/Context'; +import './LikeButton.scss'; +import { ButtonType } from '../../types/ButtonType'; + +type Props = { + product: Product; + size: ButtonType; +}; + +export const LikeButton: React.FC = ({ product, size }) => { + const { changeFavorite, favorite } = useContext(Context); + + const isInFavs = favorite.length > 0 + ? favorite.find(item => item.id === product?.id) : false; + + return ( + + ); +}; diff --git a/src/components/Loader/Loader.scss b/src/components/Loader/Loader.scss new file mode 100644 index 0000000000..36624981d2 --- /dev/null +++ b/src/components/Loader/Loader.scss @@ -0,0 +1,25 @@ +.loader { + display: flex; + width: 100%; + justify-content: center; + align-items: center; + + &__content { + border-radius: 50%; + width: 2em; + height: 2em; + margin: 1em auto; + border: 0.3em solid #ddd; + border-left-color: #000; + animation: load8 1.2s infinite linear; + } +} + +@keyframes load8 { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} diff --git a/src/components/Loader/Loader.tsx b/src/components/Loader/Loader.tsx new file mode 100644 index 0000000000..36d7ba0c3c --- /dev/null +++ b/src/components/Loader/Loader.tsx @@ -0,0 +1,5 @@ +export const Loader = () => ( +
    +
    +
    +); diff --git a/src/components/Logo/Logo.scss b/src/components/Logo/Logo.scss new file mode 100644 index 0000000000..32a1301507 --- /dev/null +++ b/src/components/Logo/Logo.scss @@ -0,0 +1,7 @@ +.logo { + display: flex; + justify-content: center; + align-items: center; + height: 24px; + width: 40px; +} diff --git a/src/components/Logo/Logo.tsx b/src/components/Logo/Logo.tsx new file mode 100644 index 0000000000..265922305d --- /dev/null +++ b/src/components/Logo/Logo.tsx @@ -0,0 +1,7 @@ +import { Link } from 'react-router-dom'; + +export const Logo: React.FC = () => ( + + logo + +); diff --git a/src/components/Nav/Nav.scss b/src/components/Nav/Nav.scss new file mode 100644 index 0000000000..62ea7f3238 --- /dev/null +++ b/src/components/Nav/Nav.scss @@ -0,0 +1,6 @@ +.navbar { + display: flex; + gap: 64px; + align-items: center; + justify-content: space-between; +} diff --git a/src/components/Nav/Nav.tsx b/src/components/Nav/Nav.tsx new file mode 100644 index 0000000000..1953037634 --- /dev/null +++ b/src/components/Nav/Nav.tsx @@ -0,0 +1,17 @@ +import pageNavList from '../../api/navHeader.json'; +import { PageNavLink } from '../PageNavLink/PageNavLink'; +import './Nav.scss'; + +export const Nav = () => { + return ( +
    + {pageNavList.map(link => ( + + ))} +
    + ); +}; diff --git a/src/components/NavLinkByCategory/NavLinkByCategory.tsx b/src/components/NavLinkByCategory/NavLinkByCategory.tsx new file mode 100644 index 0000000000..ff297cd46e --- /dev/null +++ b/src/components/NavLinkByCategory/NavLinkByCategory.tsx @@ -0,0 +1,37 @@ +import { NavLink } from 'react-router-dom'; + +interface Props { + path: string, + type: string, + text: string, + amount: number, +} + +export const NavLinkByCategory:React.FC = ({ + path, + type, + text, + amount, +}) => { + return ( +
    + + {} + + + {text} + +
    + {amount} + {' '} + models +
    +
    + ); +}; diff --git a/src/components/NoResults/NoResults.scss b/src/components/NoResults/NoResults.scss new file mode 100644 index 0000000000..b2ca5165a2 --- /dev/null +++ b/src/components/NoResults/NoResults.scss @@ -0,0 +1,37 @@ +@import "../../main.scss"; + +.noresults { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + + &__title { + @extend %h2-text; + text-transform: uppercase; + color: $color-secondary; + margin-bottom: 40px; + } + + &__button { + display: flex; + justify-content: center; + align-items: center; + text-align: center; + + @extend %buttons-text; + + width: 176px; + height: 40px; + background-color: $color-primary; + color: $color-white; + border: none; + outline: none; + + &:hover { + color: $color-white; + background-color: $color-primary; + box-shadow: 0 3px 13px rgba(23, 32, 49, 0.26); + } + } +} diff --git a/src/components/NoResults/NoResults.tsx b/src/components/NoResults/NoResults.tsx new file mode 100644 index 0000000000..52a9374ad4 --- /dev/null +++ b/src/components/NoResults/NoResults.tsx @@ -0,0 +1,19 @@ +import { useNavigate } from 'react-router-dom'; +import './NoResults.scss'; + +export const NoResults = () => { + const navigate = useNavigate(); + + return ( +
    +
    Products can not be found
    + +
    + ); +}; diff --git a/src/components/PageNavLink/PageNavLink.scss b/src/components/PageNavLink/PageNavLink.scss new file mode 100644 index 0000000000..7b4cb09cde --- /dev/null +++ b/src/components/PageNavLink/PageNavLink.scss @@ -0,0 +1,25 @@ +@import "../../main.scss"; + +.nav { + &__link { + display: flex; + align-items: center; + color: $color-secondary; + + @extend %uppercase-text; + text-decoration: none; + transition: border 0.5s, color 0.5s; + + &--active { + color: $color-primary; + padding: 25px 0; + border-bottom: 3px solid $color-primary; + } + + &:hover { + color: $color-primary; + padding: 25px 0; + border-bottom: 3px solid $color-primary; + } + } +} diff --git a/src/components/PageNavLink/PageNavLink.tsx b/src/components/PageNavLink/PageNavLink.tsx new file mode 100644 index 0000000000..6dff39ef79 --- /dev/null +++ b/src/components/PageNavLink/PageNavLink.tsx @@ -0,0 +1,28 @@ +import { NavLink } from 'react-router-dom'; +import classNames from 'classnames'; +import './PageNavLink.scss'; + +type Props = { + name: string, + to: string, +}; + +export const PageNavLink:React.FC = ({ + name, + to, +}) => { + return ( + classNames( + 'nav__link', + { 'nav__link--active': isActive }, + )} + > + {name} + + ); +}; diff --git a/src/components/Pagination/Pagination.scss b/src/components/Pagination/Pagination.scss new file mode 100644 index 0000000000..71a2167cbc --- /dev/null +++ b/src/components/Pagination/Pagination.scss @@ -0,0 +1,42 @@ +@import "../../main.scss"; + +.pagination { + display: flex; + &__list { + display: flex; + gap: 8px; + margin: 0 8px; + } + + &__item { + display: flex; + justify-content: center; + align-items: center; + @include squareSize(32px); + border: 1px solid $color-icons; + + &--disabled { + pointer-events: none; + border: 1px solid $color-elements; + } + + &:hover { + border: 1px solid $color-primary; + } + } + + &__link { + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + color: $color-primary; + text-decoration: none; + + &--active { + background-color: $color-primary; + color: $color-white; + } + } +} diff --git a/src/components/Pagination/Pagination.tsx b/src/components/Pagination/Pagination.tsx new file mode 100644 index 0000000000..710fd3ec7b --- /dev/null +++ b/src/components/Pagination/Pagination.tsx @@ -0,0 +1,87 @@ +import { Link, useSearchParams } from 'react-router-dom'; +import classNames from 'classnames'; +import { getSearchWith } from '../../utils/searchHelper'; +import './Pagination.scss'; + +type Props = { + productsAmount: number; + perPage: number; + currentPage: number; +}; + +export const Pagination: React.FC = ({ + productsAmount, perPage, currentPage, +}) => { + const [searchParams] = useSearchParams(''); + const pagesAmount = () => (perPage ? Math.ceil(productsAmount / perPage) : 0); + + const pagesList = (pagesAmount() > 1) + ? (Array.from( + { length: pagesAmount() }, + (_, i) => i + 1, + )) + : [1]; + + return ( +
    + + arrowLeft + + +
      + {pagesList.map((n) => { + const numberPage = n.toString(); + + return ( +
    • + + {numberPage} + +
    • + ); + })} +
    + + + arrowRigth + +
    + ); +}; diff --git a/src/components/ProductCard/ProductCard.scss b/src/components/ProductCard/ProductCard.scss new file mode 100644 index 0000000000..faf14819ba --- /dev/null +++ b/src/components/ProductCard/ProductCard.scss @@ -0,0 +1,150 @@ +@import "../../main.scss"; + +.product-card { + &__container { + display: flex; + flex-direction: column; + padding: 24px; + width: 222px; + max-width: 272px; + border: 1px solid $color-elements; + + &:hover { + border: 1px solid $color-primary; + } + } + + &__link { + display: flex; + flex-direction: column; + text-decoration: none; + margin-bottom: 8px; + } + + &__image { + display: flex; + height: 208px; + flex-basis: 208px; + object-fit: contain; + margin-bottom: 24px; + } + + &__title { + @extend %buttons-text; + flex: 1 0 42px; + color: $color-primary; + } + + &__prices { + border-bottom: 1px solid $color-elements; + padding-bottom: 4px; + margin-bottom: 16px; + } + + &__price { + @extend %h2-text; + color: $color-primary; + margin-right: 8px; + } + + &__discount { + @extend %h2-text; + color: $color-secondary; + text-decoration: line-through; + } + + &__features { + display: flex; + justify-content: space-between; + text-transform: capitalize; + width: 100%; + margin-bottom: 16px; + } + + &__list { + @extend %small-text; + display: flex; + flex-direction: column; + gap: 8px; + list-style: none; + } + + &__key { + color: $color-secondary; + } + + &__value { + color: $color-primary; + text-align: right; + } + + &__buttons { + display: flex; + gap: 8px; + + &__to-cart { + padding: 0; + width: 176px; + height: 40px; + + @extend %buttons-text; + + color: $color-white; + background-color: $color-primary; + border: none; + outline: none; + + transition: box-shadow 0.5s; + cursor: pointer; + + &--selected { + color: $color-green; + background: none; + border: 1px solid $color-elements; + } + + &:hover { + color: $color-white; + background-color: $color-primary; + box-shadow: 0 3px 13px rgba(23, 32, 49, 0.26); + } + } + + &__to-favs { + display: flex; + justify-content: center; + align-items: center; + @include squareSize(40px); + padding: 0; + + background-color: $color-white; + border: 1px solid $color-icons; + transition: all 0.5s; + cursor: pointer; + + &--icon { + @include squareSize(16px); + display: block; + background-position: center; + background-repeat: no-repeat; + background-image: url(../../images/FavouritesHeartLike.svg); + + &--selected { + @include squareSize(16px); + display: block; + background-position: center; + background-repeat: no-repeat; + background-image: url(../../images/FavouritesFilledHeartLike.svg); + } + } + + &--selected { + border-color: $color-elements; + } + + &:hover { + border-color: $color-primary; + } + } + } +} diff --git a/src/components/ProductCard/ProductCard.tsx b/src/components/ProductCard/ProductCard.tsx new file mode 100644 index 0000000000..1f7bccfa5d --- /dev/null +++ b/src/components/ProductCard/ProductCard.tsx @@ -0,0 +1,157 @@ +import { useContext } from 'react'; +import { Link } from 'react-router-dom'; +import classNames from 'classnames'; +import { Product } from '../../types/Product'; +import { Context } from '../../context/Context'; +import { getProductDetails } from '../../api/Products'; +import { Error } from '../../types/ErrorType'; +import './ProductCard.scss'; + +type Props = { + product: Product, +}; + +export const ProductCard: React.FC = ({ product }) => { + const { + products, + setSelectedProduct, + setIsError, + setIsLoading, + } = useContext(Context); + + const { + id, + type, + imageUrl, + name, + price, + discount, + screen, + capacity, + ram, + } = product; + + const { + cart, changeCart, favorite, changeFavorite, + } = useContext(Context); + + const isInCart = cart.length > 0 + ? cart.find(item => item.id === id) : false; + + const isInFavs = favorite.length > 0 + ? favorite.find(item => item.id === id) : false; + + const getProductLink = (searchProduct: Product) => { + switch (searchProduct.type) { + case 'phone': + return `../phones/${searchProduct.id}`; + + case 'tablet': + return `../tablets/${searchProduct.id}`; + + case 'accessories': + return `../accessories/${searchProduct.id}`; + + default: + return ''; + } + }; + + const currentProduct = products.find( + productCard => productCard.id === id, + ); + + const discountPrice = price - (price / 100) * discount; + + const getCardDetails = async (productId: string) => { + setIsError(null); + setIsLoading(true); + + try { + const currentProductDetails = await getProductDetails(productId); + + setSelectedProduct(currentProductDetails); + } catch { + setIsError(Error.GET_PRODUCT_DETAILS); + } finally { + setIsLoading(false); + } + }; + + const features = { + keys: ['screen', 'capacity', 'RAM'], + values: [`${screen}`, `${capacity}`, `${ram}`], + }; + + return ( +
    +
    + currentProduct && getCardDetails(currentProduct.id)} + > + {`${type}`} +

    {name}

    + + +
    + {`$${price}`} + {discount > 0 && {`$${discountPrice}`}} +
    + +
    +
      + {features.keys.map((key) => ( +
    • + {key} +
    • + ))} +
    + +
      + {features.values.map((value) => ( +
    • + {value} +
    • + ))} +
    +
    +
    + + +
    +
    +
    + ); +}; diff --git a/src/components/ProductsList/ProductList.scss b/src/components/ProductsList/ProductList.scss new file mode 100644 index 0000000000..f84d393275 --- /dev/null +++ b/src/components/ProductsList/ProductList.scss @@ -0,0 +1,33 @@ +@import "../../main.scss"; + +.product-list { + &__products { + display: grid; + grid-template-columns: repeat(4, 1fr); + row-gap: 40px; + column-gap: 16px; + margin-bottom: 40px; + } + + &__title { + margin-bottom: 8px; + } + + &__count { + margin-bottom: 40px; + color: $color-secondary; + } + + &__dropdowns { + display: grid; + grid-template-columns: 176px 128px; + column-gap: 16px; + margin-bottom: 24px; + } + + &__pagination { + display: flex; + justify-content: center; + margin-bottom: 80px; + } +} diff --git a/src/components/ProductsList/ProductsList.tsx b/src/components/ProductsList/ProductsList.tsx new file mode 100644 index 0000000000..e0a4d6feca --- /dev/null +++ b/src/components/ProductsList/ProductsList.tsx @@ -0,0 +1,115 @@ +import { useSearchParams } from 'react-router-dom'; +import { NoResults } from '../NoResults/NoResults'; +import { Product } from '../../types/Product'; +import { ProductCard } from '../ProductCard/ProductCard'; +import { Dropdown } from '../Dropdown/Dropdown'; +import { Pagination } from '../Pagination/Pagination'; +import './ProductList.scss'; + +type Props = { + title: string + products: Product[] +}; + +const optionsSort = ['newest', 'alphabetically', 'price', 'all']; +const optionsPage = ['4', '8', '16', 'all']; + +export const ProductsList: React.FC = ({ title, products }) => { + const [searchParams] = useSearchParams(); + + const productsAmount = products.length; + + const currentPage = Number(searchParams.get('page')) || 1; + const sort = searchParams.get('sort') || ''; + const perPage = Number(searchParams.get('perPage')) || productsAmount; + const query = searchParams.get('query') || ''; + + const getSortedProducts = (productsList: Product[]) => { + let sortedProducts = [...productsList]; + + if (sort === 'age') { + sortedProducts = sortedProducts.sort( + (product1, product2) => product1.age - product2.age, + ); + } + + if (sort === 'name') { + sortedProducts = sortedProducts.sort( + (product1, product2) => product1.name.localeCompare(product2.name), + ); + } + + if (sort === 'price') { + sortedProducts = sortedProducts.sort( + (product1, product2) => product1.price - product2.price, + ); + } + + if (query) { + const queryFilter = (param?: string | null) => { + return param + ? param.toLowerCase().includes(query.toLowerCase()) + : null; + }; + + sortedProducts = sortedProducts.filter( + product => queryFilter(product.name), + ); + } + + return sortedProducts || null; + }; + + const lastPage = Math.ceil(productsAmount / +perPage); + + const start = currentPage * perPage - perPage; + const end = currentPage * perPage <= productsAmount + ? currentPage * perPage + : productsAmount; + + const sortedProducts = getSortedProducts(products).slice(start, end); + + return ( +
    +
    +

    {title}

    +

    {`${productsAmount} models`}

    + {productsAmount === 0 ? ( + + ) : ( + <> +
    + + +
    + +
    + {sortedProducts.map((product) => ( + + ))} +
    + + )} +
    + {perPage !== productsAmount && lastPage > 1 && ( + + )} +
    +
    +
    + ); +}; diff --git a/src/components/ProductsNav/ProductsNav.scss b/src/components/ProductsNav/ProductsNav.scss new file mode 100644 index 0000000000..0685c31376 --- /dev/null +++ b/src/components/ProductsNav/ProductsNav.scss @@ -0,0 +1,42 @@ +@import "../../main.scss"; + +.productsNav { + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 40px; + + &__home { + @include squareSize(16px); + background-image: url("../../images/Home.svg"); + background-position: center; + background-repeat: no-repeat; + } + + &__link { + @extend %small-text; + color: $color-primary; + display: flex; + gap: 8px; + text-decoration: none; + + &::before { + content: ""; + display: block; + @include squareSize(16px); + background-image: url("../../images/ArrowRight.svg"); + background-position: center; + background-repeat: no-repeat; + color: $color-icons; + } + + &--disabled { + pointer-events: none; + color: $color-secondary; + } + + &--title { + color: $color-secondary; + } + } +} diff --git a/src/components/ProductsNav/ProductsNav.tsx b/src/components/ProductsNav/ProductsNav.tsx new file mode 100644 index 0000000000..f8ef9db460 --- /dev/null +++ b/src/components/ProductsNav/ProductsNav.tsx @@ -0,0 +1,66 @@ +import { + useContext, useEffect, useMemo, useState, +} from 'react'; +import { Link, useLocation, useParams } from 'react-router-dom'; +import './ProductsNav.scss'; +import { Context } from '../../context/Context'; +import { getProductDetails } from '../../api/Products'; + +export const ProductsNav: React.FC = () => { + const { selectedProduct, setSelectedProduct } = useContext(Context); + const location = useLocation(); + const { productId = '' } = useParams(); + const [isProduct, setIsProduct] = useState(false); + + const pageLink = location.pathname.split('/').slice(1)[0]; + const pageTitle = pageLink.charAt(0).toUpperCase() + pageLink.slice(1); + + const productTitle = useMemo(() => { + if (!selectedProduct && productId) { + getProductDetails(productId) + .then((productItem) => { + setSelectedProduct(productItem); + }); + } + + return selectedProduct?.name; + }, [selectedProduct, productId]); + + useEffect(() => { + if (productId.length > 0) { + setIsProduct(true); + } else { + setIsProduct(false); + } + }, []); + + return ( + <> +
    + + + {isProduct ? ( + <> + + {pageTitle} + + +

    + {productTitle} +

    + + ) : ( + + {pageTitle} + + )} +
    + + ); +}; diff --git a/src/components/ProductsSlider/ProductsSlider.scss b/src/components/ProductsSlider/ProductsSlider.scss new file mode 100644 index 0000000000..c0998c3bb2 --- /dev/null +++ b/src/components/ProductsSlider/ProductsSlider.scss @@ -0,0 +1,60 @@ +@import "../../main.scss"; + +.products-slider { + &__container { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 33px; + } + + &__header { + @extend %h1-text; + } + + &__buttons { + display: flex; + gap: 16px; + } + + &__button { + @include squareSize(32px); + background-color: $color-white; + border: 1px solid $color-icons; + cursor: pointer; + + &:hover { + border-color: $color-primary; + } + + &--disabled { + border: 1px solid $color-elements; + pointer-events: none; + opacity: 0.5; + } + } + + &__products { + display: flex; + justify-content: space-between; + margin-bottom: 72px; + gap: 16px; + } + + &__icon { + display: block; + margin: 0 auto; + background-position: center; + background-repeat: no-repeat; + @include squareSize(16px); + cursor: pointer; + &--right { + background-image: url(../../images/ArrowRight.svg); + } + + &--left { + background-image: url(../../images/ArrowLeft.svg); + } + + } +} diff --git a/src/components/ProductsSlider/ProductsSlider.tsx b/src/components/ProductsSlider/ProductsSlider.tsx new file mode 100644 index 0000000000..db877dac25 --- /dev/null +++ b/src/components/ProductsSlider/ProductsSlider.tsx @@ -0,0 +1,59 @@ +import { memo, useState } from 'react'; +import classNames from 'classnames'; +import { Product } from '../../types/Product'; +import { ProductCard } from '../ProductCard/ProductCard'; +import './ProductsSlider.scss'; + +type Props = { + title: string; + products: Product[]; +}; + +export const ProductsSlider: React.FC = memo(({ title, products }) => { + const [start, setStart] = useState(0); + const end = start + 4; + + const disablePrevButton = start <= 0; + const disableNextButton = end > products.length - 1; + + return ( +
    +
    +

    {title}

    +
    + + +
    +
    +
    + {products.slice(start, end).map((product: Product) => ( + + ))} +
    +
    + ); +}); diff --git a/src/components/SearchBar/SearchBar.scss b/src/components/SearchBar/SearchBar.scss new file mode 100644 index 0000000000..7a2e3aacc4 --- /dev/null +++ b/src/components/SearchBar/SearchBar.scss @@ -0,0 +1,42 @@ +@import "../../main.scss"; + +.searchbar { + display: flex; + align-items: center; + justify-content: space-between; + min-width: 60px; + + padding: 15px 24px; + border-left: 1px solid $color-elements; + + &__input { + width: 90%; + + @extend %buttons-text; + line-height: 18px; + color: $color-icons; + border: none; + outline: none; + + &::placeholder { + cursor: text; + color: $color-icons; + } + } + + &__icon { + display: block; + background-position: center; + background-repeat: no-repeat; + @include squareSize(16px); + padding: 8px; + + &--search { + background-image: url(../../images/Search.svg); + } + + &--close { + background-image: url(../../images/Close.svg); + } + } +} diff --git a/src/components/SearchBar/SearchBar.tsx b/src/components/SearchBar/SearchBar.tsx new file mode 100644 index 0000000000..f914cc780c --- /dev/null +++ b/src/components/SearchBar/SearchBar.tsx @@ -0,0 +1,68 @@ +import { debounce } from 'lodash'; +import { useMemo, useState } from 'react'; +import { useLocation, useSearchParams } from 'react-router-dom'; +import { getSearchWith } from '../../utils/searchHelper'; +import './SearchBar.scss'; + +export const SearchBar: React.FC = () => { + const [searchParams, setSearchParams] = useSearchParams(); + const query = searchParams.get('query') || ''; + const [inputValue, setInputValue] = useState(query); + const location = useLocation(); + const currentLocation = location.pathname.slice(1); + + useMemo(() => { + setInputValue(query); + }, [query]); + + const handleDebounceChange = debounce( + (event: React.ChangeEvent) => { + setSearchParams( + getSearchWith(searchParams, + { query: event.target.value.trim() || null }), + ); + }, 1000, + ); + + const handleInputChange = (event: React.ChangeEvent) => { + setInputValue(event.target.value); + handleDebounceChange(event); + }; + + const handleDeleteChange = () => { + setInputValue(''); + setSearchParams(getSearchWith(searchParams, { query: null })); + }; + + return ( +
    + + + {!inputValue && ( + + )} + + { inputValue.length > 0 && ( +
    handleDeleteChange()} + onClick={() => handleDeleteChange()} + > + +
    + )} +
    + ); +}; diff --git a/src/components/ShopByCategory/ShopByCategory.scss b/src/components/ShopByCategory/ShopByCategory.scss new file mode 100644 index 0000000000..5bfd2e6cdb --- /dev/null +++ b/src/components/ShopByCategory/ShopByCategory.scss @@ -0,0 +1,49 @@ +@import "../../main.scss"; + +.categories { + margin-bottom: 80px; + + &__title { + @extend %h1-text; + margin-bottom: 24px; + } + + &__container { + display: flex; + justify-content: space-between; + } + + &__image { + @include squareSize(368px); + margin-bottom: 14px; + object-fit: scale-down; + background-position: bottom right; + } + + &__item { + text-decoration: none; + } + + &__name { + @extend %h3-text; + margin-bottom: 4px; + color: $color-primary; + } + + &__count { + color: $color-secondary; + } + + &__item-container { + transition: all 0.5s; + cursor: pointer; + + &:hover { + transform: scale(0.95); + } + + &:hover .categories__image { + box-shadow: 0 3px 13px rgba(23, 32, 49, 0.26); + } + } +} diff --git a/src/components/ShopByCategory/ShopByCategory.tsx b/src/components/ShopByCategory/ShopByCategory.tsx new file mode 100644 index 0000000000..c79a663f5e --- /dev/null +++ b/src/components/ShopByCategory/ShopByCategory.tsx @@ -0,0 +1,74 @@ +import { useContext, useMemo } from 'react'; +import { Link } from 'react-router-dom'; +import CategoriesList from '../../api/CategoriesList.json'; +import { Context } from '../../context/Context'; +import './ShopByCategory.scss'; + +export const ShopByCategory: React.FC = () => { + const { products } = useContext(Context); + + const phones = useMemo(() => ( + products.filter(product => product.type === 'phone') + ), [products]); + + const tablets = useMemo(() => ( + products.filter(product => product.type === 'tablet') + ), [products]); + + const accessories = useMemo(() => ( + products.filter(product => product.type === 'accessory') + ), [products]); + + const categoryCount = (type: string) => { + switch (type) { + case 'phones': + return phones.length; + + case 'tablets': + return tablets.length; + + case 'accessory': + return accessories.length; + + default: + return 0; + } + }; + + return ( +
    +

    + Shop by category +

    +
    + {CategoriesList.map(type => ( +
    + + {type.title} + +

    + {type.title} +

    + +

    + {`${categoryCount(type.type)} models`} +

    + +
    + ))} +
    +
    + ); +}; diff --git a/src/context/Context.tsx b/src/context/Context.tsx new file mode 100644 index 0000000000..1a40f5de58 --- /dev/null +++ b/src/context/Context.tsx @@ -0,0 +1,111 @@ +import React, { + Dispatch, SetStateAction, useEffect, useState, +} from 'react'; +import { Product } from '../types/Product'; +import { ProductDetails } from '../types/ProductDetails'; +import { Error } from '../types/ErrorType'; +import { getProducts } from '../api/Products'; +import { useLocalStorage } from '../utils/useLocaleStorage'; +import { getProductToSave } from '../utils/getProductToSave'; + +type ContextValue = { + products: Product[], + selectedProduct: ProductDetails, + cart: Product[], + favorite: Product[], + isError: Error | null, + isLoading: boolean; + setProducts: Dispatch>, + setSelectedProduct: Dispatch>, + setCart: Dispatch>, + setFavorite: Dispatch>, + setIsError: Dispatch>, + setIsLoading: Dispatch>, + changeCart: (newProduct: Product) => void, + changeFavorite: (newProduct: Product) => void, +}; + +export const Context = React.createContext({ + products: [], + selectedProduct: JSON.parse(`${localStorage.getItem('selectedProduct')}`), + cart: [], + favorite: [], + isError: null, + isLoading: false, + setProducts: () => {}, + setSelectedProduct: () => {}, + setCart: () => {}, + setFavorite: () => {}, + setIsError: () => {}, + setIsLoading: () => {}, + changeCart: () => {}, + changeFavorite: () => {}, +}); + +type Props = { + children: React.ReactNode; +}; + +export const ContextProvider: React.FC = ({ children }) => { + const selectedProductStorage = JSON.parse(`${localStorage.getItem('selectedProduct')}`); + + const [products, setProducts] = useState([]); + const [ + selectedProduct, setSelectedProduct, + ] = useState(selectedProductStorage); + const [cart, setCart] = useLocalStorage('cart', []); + const [favorite, setFavorite] = useLocalStorage('favorite', []); + const [isError, setIsError] = useState(null); + const [isLoading, setIsLoading] = useState(false); + + const changeCart = getProductToSave( + 'cart', + cart, + setCart, + ); + const changeFavorite = getProductToSave( + 'favorite', + favorite, + setFavorite, + ); + + const contextValue: ContextValue = { + products, + selectedProduct, + cart, + favorite, + isError, + isLoading, + setProducts, + setSelectedProduct, + setCart, + setFavorite, + setIsError, + setIsLoading, + changeCart, + changeFavorite, + }; + + useEffect(() => { + const loadProducts = async () => { + try { + setIsLoading(true); + const loadedProducts = await getProducts(); + + setProducts(loadedProducts); + } catch (error) { + setIsError(Error.GET_PRODUCTS); + } finally { + setIsLoading(false); + } + }; + + loadProducts(); + }, []); + + return ( + + {children} + + ); +}; diff --git a/src/fonts/FontsFree-Net-Mont-Bold.ttf b/src/fonts/FontsFree-Net-Mont-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d359b09ba658ca28ea76d2603f8e934f3a5c8a12 GIT binary patch literal 146812 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

    I1H-3=uMOWD6{C~U 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 Y$Mf(cqVh&R-hBNFKltg;<=x@;KcD72djJ3c literal 0 HcmV?d00001 diff --git a/src/fonts/FontsFree-regular.ttf b/src/fonts/FontsFree-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..27a0f98c0437dae052cd4d1c2febec9cd484cf73 GIT binary patch literal 93324 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%0AaTekWTQ;0pp9TFAd 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 literal 0 HcmV?d00001 diff --git a/src/fonts/_fonts.scss b/src/fonts/_fonts.scss new file mode 100644 index 0000000000..9eb66e0626 --- /dev/null +++ b/src/fonts/_fonts.scss @@ -0,0 +1,17 @@ +@font-face { + font-family: Mont; + font-weight: 500; + src: url(./FontsFree-regular.ttf); +} + +@font-face { + font-family: Mont; + font-weight: 600; + src: url(./FontsFree-semibold.ttf); +} + +@font-face { + font-family: Mont; + font-weight: 700; + src: url(./FontsFree-Net-Mont-Bold.ttf); +} diff --git a/src/images/ArrowDown.svg b/src/images/ArrowDown.svg new file mode 100644 index 0000000000..e51b6915b6 --- /dev/null +++ b/src/images/ArrowDown.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/images/ArrowLeft.svg b/src/images/ArrowLeft.svg new file mode 100644 index 0000000000..5e3a0a6280 --- /dev/null +++ b/src/images/ArrowLeft.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/images/ArrowRight.svg b/src/images/ArrowRight.svg new file mode 100644 index 0000000000..d996658665 --- /dev/null +++ b/src/images/ArrowRight.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/images/ArrowUp.svg b/src/images/ArrowUp.svg new file mode 100644 index 0000000000..46cc1e3b34 --- /dev/null +++ b/src/images/ArrowUp.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/images/Cart.svg b/src/images/Cart.svg new file mode 100644 index 0000000000..6030970f2e --- /dev/null +++ b/src/images/Cart.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/images/Close.svg b/src/images/Close.svg new file mode 100644 index 0000000000..78d418ab46 --- /dev/null +++ b/src/images/Close.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/images/Favorite.svg b/src/images/Favorite.svg new file mode 100644 index 0000000000..802e30c79e --- /dev/null +++ b/src/images/Favorite.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/images/FavouritesFilledHeartLike.svg b/src/images/FavouritesFilledHeartLike.svg new file mode 100644 index 0000000000..7138d7522b --- /dev/null +++ b/src/images/FavouritesFilledHeartLike.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/images/FavouritesHeartLike.svg b/src/images/FavouritesHeartLike.svg new file mode 100644 index 0000000000..ec808b48e6 --- /dev/null +++ b/src/images/FavouritesHeartLike.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/images/Home.svg b/src/images/Home.svg new file mode 100644 index 0000000000..474476cb02 --- /dev/null +++ b/src/images/Home.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/images/Minus.svg b/src/images/Minus.svg new file mode 100644 index 0000000000..97c41038ac --- /dev/null +++ b/src/images/Minus.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/images/Plus.svg b/src/images/Plus.svg new file mode 100644 index 0000000000..ab3c34061b --- /dev/null +++ b/src/images/Plus.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/images/Search.svg b/src/images/Search.svg new file mode 100644 index 0000000000..3dc966918a --- /dev/null +++ b/src/images/Search.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/index.tsx b/src/index.tsx index 5f7410fd92..5f33fab9f7 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,8 +1,54 @@ import ReactDOM from 'react-dom'; +import { + HashRouter as Router, + Navigate, + Route, + Routes, +} from 'react-router-dom'; import App from './App'; +import { PageNotFound } from './pages/PageNotFound/PageNotFound'; +import { HomePage } from './pages/HomePage/HomePage'; +import { PhonesPage } from './pages/PhonesPage/PhonesPage'; +import { + ProductDetailsPage, +} from './pages/ProductDetailsPage/ProductDetailsPage'; +import { TabletsPage } from './pages/TabletsPage/TabletsPage'; +import { AccessoriesPage } from './pages/AccessoriesPage/AccessoriesPage'; +import { FavoritesPage } from './pages/FavoritesPage/FavoritesPage'; +import { CartPage } from './pages/CartPage/CartPage'; +import { ContextProvider } from './context/Context'; ReactDOM.render( - , + + + + }> + } /> + + } /> + } /> + + + } /> + } /> + + + + } /> + } /> + + + + } /> + } /> + + + } /> + } /> + + + + , document.getElementById('root'), ); diff --git a/src/main.scss b/src/main.scss new file mode 100644 index 0000000000..c405e1b5fa --- /dev/null +++ b/src/main.scss @@ -0,0 +1,4 @@ +@import "./utils/variables"; +@import "./utils/mixins"; +@import "./utils/extends"; +@import "./fonts/fonts"; diff --git a/src/pages/AccessoriesPage/AccessoriesPage.tsx b/src/pages/AccessoriesPage/AccessoriesPage.tsx new file mode 100644 index 0000000000..e76cacf44c --- /dev/null +++ b/src/pages/AccessoriesPage/AccessoriesPage.tsx @@ -0,0 +1,52 @@ +import { useContext, useEffect, useState } from 'react'; +import { Product } from '../../types/Product'; +import { Context } from '../../context/Context'; +import { getProducts } from '../../api/Products'; +import { Error } from '../../types/ErrorType'; +import { Loader } from '../../components/Loader/Loader'; +import { ProductsNav } from '../../components/ProductsNav/ProductsNav'; +import { ProductsList } from '../../components/ProductsList/ProductsList'; + +export const AccessoriesPage: React.FC = () => { + const [accessories, setAccessories] = useState([]); + const { isLoading, setIsLoading, setIsError } = useContext(Context); + + const getAccessories = (products: Product[], type: string) => { + const accessoriesFromApi = products.filter( + product => product.type === type, + ); + + setAccessories(accessoriesFromApi); + }; + + useEffect(() => { + const loadPhones = async () => { + try { + setIsLoading(true); + const products = await getProducts(); + + getAccessories(products, 'accessory'); + } catch (error) { + setIsError(Error.GET_PRODUCTS); + } finally { + setIsLoading(false); + } + }; + + loadPhones(); + }, []); + + return ( +

    + {isLoading ? ( + + ) : ( + <> + + + + + )} +
    + ); +}; diff --git a/src/pages/CartPage/CartPage.scss b/src/pages/CartPage/CartPage.scss new file mode 100644 index 0000000000..41d87f81f2 --- /dev/null +++ b/src/pages/CartPage/CartPage.scss @@ -0,0 +1,102 @@ +@import "../../main.scss"; + +.cart { + margin-bottom: 80px; + + &__navigate { + margin: 40px 0 16px; + } + + &__empty { + display: flex; + justify-content: center; + align-items: center; + @extend %h2-text; + color: $color-secondary; + margin-bottom: 40px; + } + + &__title { + margin-bottom: 24px; + } + + &__content { + display: grid; + grid-template-columns: 1fr 368px; + gap: 16px; + } + + &__products { + display: flex; + flex-direction: column; + gap: 16px; + } + + &__total-box { + align-self: start; + padding: 24px; + border: 1px solid $color-elements; + position: relative; + } + + &__info { + display: flex; + flex-direction: column; + align-items: center; + border-bottom: 1px solid $color-elements; + margin-bottom: 24px; + } + + &__total-price { + @extend %h2-text; + color: $color-primary; + } + + &__total-count { + @extend %buttons-text; + color: $color-secondary; + margin-bottom: 24px; + } +} + +.modal { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + justify-content: space-around; + border: 1px solid $color-elements; + background-color: $color-red; + + &__content { + padding: 10px 24px; + } + + &__title { + display: flex; + flex-direction: column; + text-align: center; + color: $color-white; + margin-bottom: 10px; + } +} + +.button { + width: 100%; + height: 48px; + + @extend %buttons-text; + text-align: center; + color: $color-white; + background-color: $color-primary; + border: none; + transition: all 0.5s; + cursor: pointer; + + &:hover { + box-shadow: 0 3px 13px rgba(23, 32, 49, 0.26); + } +} diff --git a/src/pages/CartPage/CartPage.tsx b/src/pages/CartPage/CartPage.tsx new file mode 100644 index 0000000000..a55fae3560 --- /dev/null +++ b/src/pages/CartPage/CartPage.tsx @@ -0,0 +1,124 @@ +import { useContext, useState } from 'react'; +import { Context } from '../../context/Context'; +import { Loader } from '../../components/Loader/Loader'; +import { BackButton } from '../../components/BackButton/BackButton'; +import './CartPage.scss'; +import { CartItem } from '../../components/CartItem/CartItem'; + +export const CartPage: React.FC = () => { + const { isLoading, cart } = useContext(Context); + const [isOpenModal, setIsOpenModal] = useState(false); + /* const [cartList, setCartList] = useState([]); + + function getUniqueItems(arr: Product[], getId: (item: Product) => string) { + const visibleItems: Record = {}; + + return arr.filter((item) => { + const key = getId(item); + + if (visibleItems[key]) { + return false; + } + + visibleItems[key] = true; + + return true; + }); + } + + const cartItems = () => { + const list = getUniqueItems(cart, (item: Product) => item.id); + + setCartList(list); + }; + + useEffect(() => { + cartItems(); + }, [cart.length]); */ + + /* const totalPrice = () => { + const currentItems = JSON.parse(localStorage.getItem('cart') || '[]'); + + return currentItems.reduce( + (sum: number, current: Product) => sum + current.price, 0, + ); + }; */ + + const totalPrice = cart.length === 0 ? 0 : cart.map((item) => { + const priceAfterDiscount = item.price * ((100 - item.discount) / 100); + const quantity = item.quantity || 1; + + return priceAfterDiscount * quantity; + }).reduce((a, b) => a + b, 0); + + let totalItems = 0; + + cart.forEach(item => { + const quantity = item.quantity || 1; + + totalItems += quantity; + }); + + return ( + <> + {isLoading + ? + : ( +
    +
    + +
    + +

    Cart

    + {cart.length === 0 ? ( +

    Your cart is empty

    + ) : ( + <> +
    +
    + {cart.map((product) => ( + + ))} +
    +
    +
    +

    {`$${totalPrice}`}

    +

    {`Total for ${totalItems} items`}

    +
    + + + + {isOpenModal && ( +
    +
    +

    + We are sorry, + but this feature is not implemented yet +

    + +
    +
    + )} +
    +
    + + )} +
    + )} + + ); +}; diff --git a/src/pages/FavoritesPage/FavoritesPage.scss b/src/pages/FavoritesPage/FavoritesPage.scss new file mode 100644 index 0000000000..5189c252ca --- /dev/null +++ b/src/pages/FavoritesPage/FavoritesPage.scss @@ -0,0 +1,33 @@ +@import "../../main.scss"; + +.favourites { + margin-bottom: 80px; + &__list { + display: grid; + grid-template-columns: repeat(4, 1fr); + row-gap: 40px; + column-gap: 16px; + } + + &__top { + margin: 25px 0 40px; + } + + &__title { + margin-bottom: 8px; + } + + &__empty-title { + display: flex; + justify-content: center; + align-items: center; + @extend %h2-text; + color: $color-secondary; + margin-bottom: 40px; + } + + &__count { + margin-bottom: 40px; + color: $color-secondary; + } +} diff --git a/src/pages/FavoritesPage/FavoritesPage.tsx b/src/pages/FavoritesPage/FavoritesPage.tsx new file mode 100644 index 0000000000..11f3f4df9a --- /dev/null +++ b/src/pages/FavoritesPage/FavoritesPage.tsx @@ -0,0 +1,32 @@ +import { useContext } from 'react'; +import { Context } from '../../context/Context'; +import { ProductsNav } from '../../components/ProductsNav/ProductsNav'; +import { ProductCard } from '../../components/ProductCard/ProductCard'; +import './FavoritesPage.scss'; + +export const FavoritesPage: React.FC = () => { + const { favorite } = useContext(Context); + + const favoriteCount = favorite.length; + + return ( +
    +
    + +
    +

    Favourites

    +

    {`${favoriteCount} items`}

    + {favoriteCount === 0 ? ( +

    + There no favorite products found +

    + ) : ( +
    + {favorite.map((product) => ( + + ))} +
    + )} +
    + ); +}; diff --git a/src/pages/HomePage/HomePage.tsx b/src/pages/HomePage/HomePage.tsx new file mode 100644 index 0000000000..d0a8e16c51 --- /dev/null +++ b/src/pages/HomePage/HomePage.tsx @@ -0,0 +1,43 @@ +import { useContext } from 'react'; +import { BannerSlider } from '../../components/BannerSlider/BannerSlider'; +import { ProductsSlider } from '../../components/ProductsSlider/ProductsSlider'; +import { Product } from '../../types/Product'; +import { Context } from '../../context/Context'; +import { ShopByCategory } from '../../components/ShopByCategory/ShopByCategory'; + +export const HomePage: React.FC = () => { + const { products } = useContext(Context); + + const getHotPriceProducts = (items: Product[]) => { + return items + .filter(item => item.discount > 0) + .sort((product1, product2) => ( + (product2.price * ((100 - product2.discount) / 100)) + - (product1.price * ((100 - product1.discount) / 100)) + )); + }; + + const getBrandNewProducts = (items: Product[]) => { + return items + .filter(item => item.discount === 0) + .sort((product1, product2) => product2.price - product1.price); + }; + + return ( + <> + + + + + + + + + ); +}; diff --git a/src/pages/PageNotFound/PageNotFound.scss b/src/pages/PageNotFound/PageNotFound.scss new file mode 100644 index 0000000000..c26b301b3c --- /dev/null +++ b/src/pages/PageNotFound/PageNotFound.scss @@ -0,0 +1,10 @@ +@import "../../main.scss"; + +.not-found { + margin-bottom: 40px; + + &__title { + @extend %h1-text; + color: $color-primary; + } +} diff --git a/src/pages/PageNotFound/PageNotFound.tsx b/src/pages/PageNotFound/PageNotFound.tsx new file mode 100644 index 0000000000..358db75c3b --- /dev/null +++ b/src/pages/PageNotFound/PageNotFound.tsx @@ -0,0 +1,12 @@ +import { BackButton } from '../../components/BackButton/BackButton'; +import './PageNotFound.scss'; + +export const PageNotFound: React.FC = () => ( +
    + + +

    + Page not found! +

    +
    +); diff --git a/src/pages/PhonesPage/PhonesPage.tsx b/src/pages/PhonesPage/PhonesPage.tsx new file mode 100644 index 0000000000..fd2da5b581 --- /dev/null +++ b/src/pages/PhonesPage/PhonesPage.tsx @@ -0,0 +1,52 @@ +import { useContext, useEffect, useState } from 'react'; +import { Context } from '../../context/Context'; +import { Loader } from '../../components/Loader/Loader'; +import { ProductsNav } from '../../components/ProductsNav/ProductsNav'; +import { ProductsList } from '../../components/ProductsList/ProductsList'; +import { Product } from '../../types/Product'; +import { getProducts } from '../../api/Products'; +import { Error } from '../../types/ErrorType'; + +export const PhonesPage: React.FC = () => { + const [phones, setPhones] = useState([]); + const { isLoading, setIsLoading, setIsError } = useContext(Context); + + const getPhones = (products: Product[], type: string) => { + const phonesFromApi = products.filter( + product => product.type === type, + ); + + setPhones(phonesFromApi); + }; + + useEffect(() => { + const loadPhones = async () => { + try { + setIsLoading(true); + const products = await getProducts(); + + getPhones(products, 'phone'); + } catch (error) { + setIsError(Error.GET_PRODUCTS); + } finally { + setIsLoading(false); + } + }; + + loadPhones(); + }, []); + + return ( +
    + {isLoading ? ( + + ) : ( + <> + + + + + )} +
    + ); +}; diff --git a/src/pages/ProductDetailsPage/ProductDetailsPage.scss b/src/pages/ProductDetailsPage/ProductDetailsPage.scss new file mode 100644 index 0000000000..d2ea814826 --- /dev/null +++ b/src/pages/ProductDetailsPage/ProductDetailsPage.scss @@ -0,0 +1,259 @@ +@import "../../main.scss"; + +.product-details { + margin-bottom: 80px; + + &__title { + @extend %h1-text; + margin-bottom: 40px; + color: $color-primary; + } + + &__content { + margin-bottom: 80px; + } + + &__top { + display: grid; + grid-template-columns: repeat(24, 1fr); + column-gap: 16px; + margin-bottom: 80px; + } + + &__slider { + grid-column: 1 / 13; + } + + &__action { + grid-column: 14 / 21; + } + + &__colors { + margin-bottom: 48px; + } + + &__small-text { + @extend %small-text; + color: $color-secondary; + margin-bottom: 8px; + } + + &__select-buttons { + display: flex; + gap: 8px; + } + + &__select { + border-bottom: 1px solid $color-elements; + padding-bottom: 24px; + &:first-child { + margin-bottom: 24px; + } + + margin-bottom: 32px; + } + + &__prices { + border-bottom: 1px solid $color-elements; + padding-bottom: 4px; + margin-bottom: 16px; + } + + &__price { + @extend %h2-text; + color: $color-primary; + margin-right: 8px; + } + + &__discount { + @extend %h2-text; + color: $color-secondary; + text-decoration: line-through; + } + + &__actions-button { + display: flex; + gap: 8px; + margin-bottom: 32px; + } + + &__features { + display: flex; + justify-content: space-between; + text-transform: capitalize; + width: 100%; + } + + &__list { + @extend %small-text; + display: flex; + flex-direction: column; + gap: 8px; + list-style: none; + } + + &__key { + color: $color-secondary; + } + + &__value { + color: $color-primary; + text-align: right; + } + + &__botom { + display: grid; + grid-template-columns: repeat(24, 1fr); + column-gap: 16px; + } + + &__subtitle { + @extend %h2-text; + padding-bottom: 16px; + border-bottom: 1px solid $color-elements; + margin-bottom: 32px; + } + + &__text { + display: flex; + flex-direction: column; + gap: 32px; + } + + &__info-title { + @extend %h3-text; + padding-bottom: 16px; + color: $color-primary; + } + + &__info-text { + color: $color-secondary; + } + + &__description { + grid-column: 1 / 13; + } + + &__tech-specs { + grid-column: 14 / 25; + } +} + +.slider { + display: flex; + width: 100%; + height: 464px; + gap: 16px; + + &__col { + display: flex; + flex-direction: column; + gap: 16px; + } + + &__button { + border: 1px solid $color-icons; + height: 80px; + width: 80px; + background-size: contain; + transition: all 0.3s; + + &:hover { + border: 1px solid $color-primary; + } + + &--active { + border: 1px solid $color-primary; + } + } + + &__main { + display: flex; + justify-content: center; + align-items: center; + flex: 1 1 auto; + background-size: contain; + background-repeat: no-repeat; + background-position: center; + transition: 0.2s ease; + } +} + +.colors { + list-style: none; + + &__item-circle { + width: 32px; + height: 32px; + border: 1px solid $color-elements; + border-radius: 36px; + cursor: pointer; + transition: all 0.3s; + + &--is-active { + border-color: $color-primary; + } + + &:hover { + border-color: $color-primary; + } + } + + &__item { + width: 28px; + height: 28px; + border: 2px solid $color-white; + border-radius: 36px; + + &--pink { + background-color: #fcdbc1; + } + + &--grey { + background-color: #5f7170; + } + + &--black { + background-color: #4c4c4c; + } + + &--white { + background-color: #f0f0f0; + } + + } +} + +.capacity { + &__list { + display: flex; + gap: 8px; + margin-bottom: 32px; + padding-bottom: 24px; + + border-bottom: 1px solid $color-elements; + list-style-type: none; + } + + &__item { + padding: 8px; + font-weight: 500; + font-size: 14px; + line-height: 21px; + color: $color-primary; + background-color: $color-white; + border: 1px solid $color-icons; + + transition: all 0.3s; + cursor: pointer; + + &:hover { + border-color: $color-primary; + } + + &--is-active { + color: $color-white; + background-color: $color-primary; + } + } +} diff --git a/src/pages/ProductDetailsPage/ProductDetailsPage.tsx b/src/pages/ProductDetailsPage/ProductDetailsPage.tsx new file mode 100644 index 0000000000..bf82dbf6e2 --- /dev/null +++ b/src/pages/ProductDetailsPage/ProductDetailsPage.tsx @@ -0,0 +1,293 @@ +import { + useContext, useEffect, useMemo, useState, +} from 'react'; +import { useLocation, useParams } from 'react-router-dom'; +import classNames from 'classnames'; +import { Loader } from '../../components/Loader/Loader'; +import { ProductsNav } from '../../components/ProductsNav/ProductsNav'; +import { Context } from '../../context/Context'; +import { ProductsSlider } from '../../components/ProductsSlider/ProductsSlider'; +import CategoriesList from '../../api/CategoriesList.json'; +import { Product } from '../../types/Product'; +import { BackButton } from '../../components/BackButton/BackButton'; +import { + AddToCartButton, +} from '../../components/AddToCartButton/AddToCartButton'; +import { LikeButton } from '../../components/LikeButton/LikeButton'; +import { getProductDetails } from '../../api/Products'; +import { Error } from '../../types/ErrorType'; +import './ProductDetailsPage.scss'; + +const colorsList = ['pink', 'grey', 'black', 'white']; +const capacityList = [16, 256, 512]; + +export const ProductDetailsPage: React.FC = () => { + const { + isLoading, products, setIsError, setIsLoading, + selectedProduct, setSelectedProduct, + } = useContext(Context); + const { productId = '' } = useParams(); + const location = useLocation(); + // const [productInfo, setProductInfo] = useState(); + const [selectedImage, setSelectedImage] = useState( + selectedProduct?.images[0], + ); + const [selectedColor, setSelectedColor] = useState(colorsList[0]); + const [selectedCapacity, setSelectedCapacity] = useState(capacityList[0]); + + const priceWithDiscount = (product: Product) => { + return product.price - (product.discount * product.price) / 100; + }; + + const product = products.find( + item => item.id === selectedProduct?.id, + ); + + const newPrice = product ? priceWithDiscount(product) : 0; + + const featuresShort = { + keys: ['screen', 'resolution', 'processor', 'RAM'], + values: [ + `${selectedProduct?.display.screenSize}`, + `${selectedProduct?.display.screenResolution}`, + `${selectedProduct?.hardware.cpu}`, + `${selectedProduct?.storage.ram}`], + }; + + const featuresLong = { + keys: ['screen', 'resolution', 'processor', 'RAM', 'built in memory', + 'android', 'bluetooth', 'battery'], + values: [ + `${selectedProduct?.display.screenSize}`, + `${selectedProduct?.display.screenResolution}`, + `${selectedProduct?.hardware.cpu}`, + `${selectedProduct?.storage.ram}`, + `${selectedProduct?.storage.flash}`, + `${selectedProduct?.android.os}`, + `${selectedProduct?.connectivity.bluetooth}`, + `${selectedProduct?.battery.standbyTime}`, + ], + }; + + const currentCategory = location.pathname.split('/').slice(1)[0]; + + const productCategory = useMemo(() => { + const list = CategoriesList.filter( + item => item.type === currentCategory, + )[0]; + + return list.itemType; + }, [location]); + + const getRecommendations = ( + items: Product[], category: string, currentId: string, + ) => { + return items + .filter(item => (item.type === category) + && (currentId !== item.id)) + .sort((product1, product2) => ( + product2.price - product1.price + )); + }; + + const getProductInfo = async (id: string) => { + setIsError(null); + + try { + const item = await getProductDetails(id); + + setSelectedProduct(item); + } catch { + setIsError(Error.GET_PRODUCT_DETAILS); + } finally { + setIsLoading(false); + } + }; + + useEffect(() => { + if (!selectedProduct && productId.length > 0) { + getProductInfo(productId); + } + }, [productId]); + + return ( +
    + {isLoading ? ( + + ) : ( +
    + + +
    {selectedProduct?.name}
    + +
    +
    +
    +
    + {selectedProduct?.images.map((image) => ( +
    +
    +
    + +
    +
    +

    + Available colors +

    +
      + {colorsList.map((el, index) => ( +
      setSelectedColor(el)} + onKeyDown={() => setSelectedColor(el)} + > +
    • +
    • + ))} +
    +
    + +
    +

    + Select capacity +

    +
    + {capacityList.map(el => ( + + ))} +
    +
    + +
    + {`$${product?.price}`} + {product?.discount !== 0 + && ( + + {`$${newPrice}`} + + + )} +
    + + {product + && ( +
    + + +
    + )} + +
    +
      + {featuresShort.keys.map((key) => ( +
    • + {key} +
    • + ))} +
    + +
      + {featuresShort.values.map((value) => ( +
    • + {value} +
    • + ))} +
    +
    +
    +
    + +
    + {selectedProduct && ( +
    +

    About

    + +
    + {selectedProduct.description} +
    +
    + )} + +
    +

    Tech specs

    +
    +
      + {featuresLong.keys.map((key) => ( +
    • + {key} +
    • + ))} +
    + +
      + {featuresLong.values.map((value) => ( +
    • + {value} +
    • + ))} +
    +
    +
    +
    +
    + + +
    + )} +
    + ); +}; diff --git a/src/pages/TabletsPage/TabletsPage.tsx b/src/pages/TabletsPage/TabletsPage.tsx new file mode 100644 index 0000000000..6080356350 --- /dev/null +++ b/src/pages/TabletsPage/TabletsPage.tsx @@ -0,0 +1,52 @@ +import { useContext, useEffect, useState } from 'react'; +import { Context } from '../../context/Context'; +import { Loader } from '../../components/Loader/Loader'; +import { ProductsNav } from '../../components/ProductsNav/ProductsNav'; +import { ProductsList } from '../../components/ProductsList/ProductsList'; +import { Product } from '../../types/Product'; +import { getProducts } from '../../api/Products'; +import { Error } from '../../types/ErrorType'; + +export const TabletsPage: React.FC = () => { + const [tablets, setTablets] = useState([]); + const { isLoading, setIsLoading, setIsError } = useContext(Context); + + const getTablets = (products: Product[], type: string) => { + const tabletsFromApi = products.filter( + product => product.type === type, + ); + + setTablets(tabletsFromApi); + }; + + useEffect(() => { + const loadPhones = async () => { + try { + setIsLoading(true); + const products = await getProducts(); + + getTablets(products, 'tablet'); + } catch (error) { + setIsError(Error.GET_PRODUCTS); + } finally { + setIsLoading(false); + } + }; + + loadPhones(); + }, []); + + return ( +
    + {isLoading ? ( + + ) : ( + <> + + + + + )} +
    + ); +}; diff --git a/src/types/ButtonType.ts b/src/types/ButtonType.ts new file mode 100644 index 0000000000..064c1e4137 --- /dev/null +++ b/src/types/ButtonType.ts @@ -0,0 +1 @@ +export type ButtonType = 'big' | 'small'; diff --git a/src/types/ErrorType.ts b/src/types/ErrorType.ts new file mode 100644 index 0000000000..eb9728510e --- /dev/null +++ b/src/types/ErrorType.ts @@ -0,0 +1,5 @@ +export enum Error { + PAGE_NOT_FOUND = 'Page not found', + GET_PRODUCTS = 'Unable to get the products', + GET_PRODUCT_DETAILS = 'Unable to get the product\'s details', +} diff --git a/src/types/IconType.ts b/src/types/IconType.ts new file mode 100644 index 0000000000..df08d2ea00 --- /dev/null +++ b/src/types/IconType.ts @@ -0,0 +1,22 @@ +export enum IconType { + ARROW_DOWN = 'icon__arrow-down', + ARROW_DOWN_DISABLED = 'icon__arrow-down--disabled', + ARROW_LEFT = 'icon__arrow-left', + ARROW_LEFT_DISABLED = 'icon__arrow-left--disabled', + ARROW_RIGHT = 'icon__arrow-right', + ARROW_RIGHT_DISABLED = 'icon__arrow-right--disabled', + ARROW_UP = 'icon__arrow-up', + ARROW_UP_DISABLED = 'icon__arrow-up--disabled', + CART = 'icon__cart', + CLOSE = 'icon__close', + CLOSE_DISABLED = 'icon__close--disabled', + CROSS = 'icon__cross', + FAVORITE = 'icon__favorite', + FAVORITE_FILLED = 'icon__favorite--active', + HOME = 'icon__home', + MENU_BURGER = 'icon__menu-burger', + MINUS = 'icon__minus', + MINUS_DISABLED = 'icon__minus--disabled', + PLUS = 'icon__plus', + SEARCH = 'icon__search', +} diff --git a/src/types/Product.ts b/src/types/Product.ts new file mode 100644 index 0000000000..6659cc75a9 --- /dev/null +++ b/src/types/Product.ts @@ -0,0 +1,14 @@ +export interface Product { + age: number, + id: string, + type: string, + imageUrl: string, + name: string, + snippet: string, + price: number, + discount: number, + screen: string, + capacity: string, + ram: string, + quantity?: number, +} diff --git a/src/types/ProductDetails.ts b/src/types/ProductDetails.ts new file mode 100644 index 0000000000..7a133b202d --- /dev/null +++ b/src/types/ProductDetails.ts @@ -0,0 +1,49 @@ +export interface ProductDetails { + additionalFeatures: string, + android: { + os: string, + ui: string, + }, + availability: string[], + battery: { + standbyTime: string, + talkTime: string, + type: string + }, + camera: { + features: string[], + primary?: string + }, + connectivity: { + bluetooth: string, + cell: string, + gps: boolean, + infrared: boolean, + wifi: string + }, + description: string, + display: { + screenResolution: string, + screenSize: string, + touchScreen: boolean + }, + hardware: { + accelerometer: boolean, + audioJack: string, + cpu: string, + fmRadio: boolean, + physicalKeyboard: boolean, + usb: string + }, + id: string, + images: string[], + name: string, + sizeAndWeight: { + dimensions: string[], + weight: string + }, + storage: { + flash: string, + ram: string + } +} diff --git a/src/types/SortType.ts b/src/types/SortType.ts new file mode 100644 index 0000000000..8ca98468ef --- /dev/null +++ b/src/types/SortType.ts @@ -0,0 +1,8 @@ +export enum SortType { + Newest = 'newest', + Alphabetically = 'alphabetically', + Price = 'price', + Year = 'year', + MaxDiscount = 'maxDiscount', + Random = 'random', +} diff --git a/src/utils/_extends.scss b/src/utils/_extends.scss new file mode 100644 index 0000000000..7f9ad33918 --- /dev/null +++ b/src/utils/_extends.scss @@ -0,0 +1,48 @@ +%h1-text { + font-family: inherit; + font-weight: 700; + font-size: 32px; + line-height: 41px; + letter-spacing: -0.01em; +} + +%h2-text { + font-family: inherit; + font-weight: 700; + font-size: 22px; + line-height: 31px; + letter-spacing: 0; +} + +%h3-text { + font-family: inherit; + font-weight: 600; + font-size: 20px; + line-height: 26px; + letter-spacing: 0; +} + +%uppercase-text { + font-family: inherit; + font-weight: 700; + font-size: 12px; + line-height: 11px; + letter-spacing: 0.04em; + text-transform: uppercase; +} + +%buttons-text { + font-family: inherit; + font-weight: 600; + font-size: 14px; + line-height: 21px; + letter-spacing: 0; +} + +%small-text { + font-family: inherit; + font-weight: 600; + font-size: 12px; + line-height: 15px; + letter-spacing: 0; +} diff --git a/src/utils/_mixins.scss b/src/utils/_mixins.scss new file mode 100644 index 0000000000..b9032dca38 --- /dev/null +++ b/src/utils/_mixins.scss @@ -0,0 +1,4 @@ +@mixin squareSize($size) { + width: $size; + height: $size; +} diff --git a/src/utils/_variables.scss b/src/utils/_variables.scss new file mode 100644 index 0000000000..8647d4386e --- /dev/null +++ b/src/utils/_variables.scss @@ -0,0 +1,8 @@ +$color-primary: #313237; +$color-secondary: #89939a; +$color-icons: #b4bdc3; +$color-elements: #e2e6e9; +$color-background: #fafbfc; +$color-white: #fff; +$color-green: #27ae60; +$color-red: #eb5757; diff --git a/src/utils/fetchClient.ts b/src/utils/fetchClient.ts new file mode 100644 index 0000000000..fb828e82ff --- /dev/null +++ b/src/utils/fetchClient.ts @@ -0,0 +1,41 @@ +const BASE_URL = 'https://mate-academy.github.io/react_phone-catalog/api'; + +function wait(delay: number) { + return new Promise(resolve => { + setTimeout(resolve, delay); + }); +} + +type RequestMethod = 'GET' | 'POST' | 'PATCH' | 'DELETE'; + +function request( + url: string, + method: RequestMethod = 'GET', + data: unknown = null, +): Promise { + const options: RequestInit = { method }; + + if (data) { + options.body = JSON.stringify(data); + options.headers = { + 'Content-Type': 'application/json; charset=UTF-8', + }; + } + + return wait(300) + .then(() => fetch(BASE_URL + url, options)) + .then(response => { + if (!response.ok) { + throw new Error(); + } + + return response.json(); + }); +} + +export const client = { + get: (url: string) => request(url), + post: (url: string, data: unknown) => request(url, 'POST', data), + patch: (url: string, data: unknown) => request(url, 'PATCH', data), + delete: (url: string) => request(url, 'DELETE'), +}; diff --git a/src/utils/getProductToSave.ts b/src/utils/getProductToSave.ts new file mode 100644 index 0000000000..93f0bcafcb --- /dev/null +++ b/src/utils/getProductToSave.ts @@ -0,0 +1,49 @@ +import { Product } from '../types/Product'; + +export const getProductToSave = ( + key: string, + savedProducts: Product[], + saveToState: React.Dispatch>, +) => { + return (newProduct: Product) => { + let newProducts: Product[]; + const copyOfProducts = [...savedProducts]; + const savedProduct = savedProducts.find( + item => item.id === newProduct.id, + ); + const savedProductIndex = savedProduct + ? savedProducts.indexOf(savedProduct) + : -1; + const isChangingQuantity = ( + savedProduct?.quantity !== newProduct.quantity + ) && newProduct?.quantity; + + if (isChangingQuantity && savedProductIndex >= 0) { + copyOfProducts[savedProductIndex].quantity = newProduct.quantity; + } + + if (savedProduct) { + newProducts = copyOfProducts.filter( + (product) => { + if (isChangingQuantity) { + return true; + } + + return product.id !== newProduct.id; + }, + ); + } else { + const useProduct = key === 'cart' + ? { ...newProduct, quantity: 1 } + : { ...newProduct }; + + newProducts = [ + ...savedProducts, + useProduct, + ]; + } + + saveToState(newProducts); + localStorage.setItem(key, JSON.stringify(newProducts)); + }; +}; diff --git a/src/utils/searchHelper.ts b/src/utils/searchHelper.ts new file mode 100644 index 0000000000..42d8db56d5 --- /dev/null +++ b/src/utils/searchHelper.ts @@ -0,0 +1,47 @@ +export type SearchParams = { + [key: string]: string | string[] | null, +}; + +/** + * This function prepares a correct search string + * from a given currentParams and paramsToUpdate. + */ +export function getSearchWith( + currentParams: URLSearchParams, + paramsToUpdate: SearchParams, // it's our custom type +): string { + // copy currentParams by creating new object from a string + const newParams = new URLSearchParams( + currentParams.toString(), + ); + + // Here is the example of paramsToUpdate + // { + // sex: 'm', ['sex', 'm'] + // order: null, ['order', null] + // centuries: ['16', '19'], ['centuries', ['16', '19']] + // } + // + // - params with the `null` value are deleted; + // - string value is set to given param key; + // - array of strings adds several params with the same key; + + Object.entries(paramsToUpdate) + .forEach(([key, value]) => { + if (value === null) { + newParams.delete(key); + } else if (Array.isArray(value)) { + // we delete the key to remove old values + newParams.delete(key); + + value.forEach(part => { + newParams.append(key, part); + }); + } else { + newParams.set(key, value); + } + }); + + // we return a string to use it inside links + return newParams.toString(); +} diff --git a/src/utils/useLocaleStorage.ts b/src/utils/useLocaleStorage.ts new file mode 100644 index 0000000000..4fd098576c --- /dev/null +++ b/src/utils/useLocaleStorage.ts @@ -0,0 +1,31 @@ +import { useState } from 'react'; +import { Product } from '../types/Product'; + +export const useLocalStorage = (key: string, initialValue: Product[]) => { + const valueFromStorage = localStorage.getItem(key) || '[]'; + + const [value, setValue] = useState( + valueFromStorage ? JSON.parse(valueFromStorage) : initialValue, + ); + + return [value, setValue]; +}; + +/* export const useLocalStorage = (key: string, initialValue: Product[]) => { + const [value, setValue] = useState(() => { + try { + const data = localStorage.getItem(key); + + return data ? JSON.parse(data) : initialValue; + } catch { + return initialValue; + } + }); + + const save = (currentValue: Product) => { + setValue(currentValue); + localStorage.setItem(key, JSON.stringify(currentValue)); + }; + + return [value, save]; +}; */ From 7216c95832f66b3613129b03b64c972ab68d546f Mon Sep 17 00:00:00 2001 From: Veronika Pastushkova Date: Mon, 17 Jul 2023 22:10:02 +0300 Subject: [PATCH 2/3] add task solution --- src/components/BannerSlider/BannerSlider.tsx | 6 ++-- src/components/ProductCard/ProductCard.tsx | 18 +--------- src/pages/CartPage/CartPage.tsx | 35 ------------------- .../ProductDetailsPage/ProductDetailsPage.tsx | 1 - src/types/ErrorType.ts | 1 - src/types/IconType.ts | 22 ------------ src/types/SortType.ts | 8 ----- 7 files changed, 4 insertions(+), 87 deletions(-) delete mode 100644 src/types/IconType.ts delete mode 100644 src/types/SortType.ts diff --git a/src/components/BannerSlider/BannerSlider.tsx b/src/components/BannerSlider/BannerSlider.tsx index 236420515c..aa2f612af3 100644 --- a/src/components/BannerSlider/BannerSlider.tsx +++ b/src/components/BannerSlider/BannerSlider.tsx @@ -3,9 +3,9 @@ import classNames from 'classnames'; import './BannerSlider.scss'; const BannerImages = [ - 'img/banner1.jpg', - 'img/banner2.jpg', - 'img/banner3.jpg', + 'img/Banner1.jpg', + 'img/Banner2.jpg', + 'img/Banner3.jpg', ]; export const BannerSlider: React.FC = () => { diff --git a/src/components/ProductCard/ProductCard.tsx b/src/components/ProductCard/ProductCard.tsx index 1f7bccfa5d..c70c3cd375 100644 --- a/src/components/ProductCard/ProductCard.tsx +++ b/src/components/ProductCard/ProductCard.tsx @@ -41,22 +41,6 @@ export const ProductCard: React.FC = ({ product }) => { const isInFavs = favorite.length > 0 ? favorite.find(item => item.id === id) : false; - const getProductLink = (searchProduct: Product) => { - switch (searchProduct.type) { - case 'phone': - return `../phones/${searchProduct.id}`; - - case 'tablet': - return `../tablets/${searchProduct.id}`; - - case 'accessories': - return `../accessories/${searchProduct.id}`; - - default: - return ''; - } - }; - const currentProduct = products.find( productCard => productCard.id === id, ); @@ -87,7 +71,7 @@ export const ProductCard: React.FC = ({ product }) => {
    currentProduct && getCardDetails(currentProduct.id)} > diff --git a/src/pages/CartPage/CartPage.tsx b/src/pages/CartPage/CartPage.tsx index a55fae3560..2cbc373c85 100644 --- a/src/pages/CartPage/CartPage.tsx +++ b/src/pages/CartPage/CartPage.tsx @@ -8,41 +8,6 @@ import { CartItem } from '../../components/CartItem/CartItem'; export const CartPage: React.FC = () => { const { isLoading, cart } = useContext(Context); const [isOpenModal, setIsOpenModal] = useState(false); - /* const [cartList, setCartList] = useState([]); - - function getUniqueItems(arr: Product[], getId: (item: Product) => string) { - const visibleItems: Record = {}; - - return arr.filter((item) => { - const key = getId(item); - - if (visibleItems[key]) { - return false; - } - - visibleItems[key] = true; - - return true; - }); - } - - const cartItems = () => { - const list = getUniqueItems(cart, (item: Product) => item.id); - - setCartList(list); - }; - - useEffect(() => { - cartItems(); - }, [cart.length]); */ - - /* const totalPrice = () => { - const currentItems = JSON.parse(localStorage.getItem('cart') || '[]'); - - return currentItems.reduce( - (sum: number, current: Product) => sum + current.price, 0, - ); - }; */ const totalPrice = cart.length === 0 ? 0 : cart.map((item) => { const priceAfterDiscount = item.price * ((100 - item.discount) / 100); diff --git a/src/pages/ProductDetailsPage/ProductDetailsPage.tsx b/src/pages/ProductDetailsPage/ProductDetailsPage.tsx index bf82dbf6e2..f40f29a619 100644 --- a/src/pages/ProductDetailsPage/ProductDetailsPage.tsx +++ b/src/pages/ProductDetailsPage/ProductDetailsPage.tsx @@ -28,7 +28,6 @@ export const ProductDetailsPage: React.FC = () => { } = useContext(Context); const { productId = '' } = useParams(); const location = useLocation(); - // const [productInfo, setProductInfo] = useState(); const [selectedImage, setSelectedImage] = useState( selectedProduct?.images[0], ); diff --git a/src/types/ErrorType.ts b/src/types/ErrorType.ts index eb9728510e..55eb2189da 100644 --- a/src/types/ErrorType.ts +++ b/src/types/ErrorType.ts @@ -1,5 +1,4 @@ export enum Error { - PAGE_NOT_FOUND = 'Page not found', GET_PRODUCTS = 'Unable to get the products', GET_PRODUCT_DETAILS = 'Unable to get the product\'s details', } diff --git a/src/types/IconType.ts b/src/types/IconType.ts deleted file mode 100644 index df08d2ea00..0000000000 --- a/src/types/IconType.ts +++ /dev/null @@ -1,22 +0,0 @@ -export enum IconType { - ARROW_DOWN = 'icon__arrow-down', - ARROW_DOWN_DISABLED = 'icon__arrow-down--disabled', - ARROW_LEFT = 'icon__arrow-left', - ARROW_LEFT_DISABLED = 'icon__arrow-left--disabled', - ARROW_RIGHT = 'icon__arrow-right', - ARROW_RIGHT_DISABLED = 'icon__arrow-right--disabled', - ARROW_UP = 'icon__arrow-up', - ARROW_UP_DISABLED = 'icon__arrow-up--disabled', - CART = 'icon__cart', - CLOSE = 'icon__close', - CLOSE_DISABLED = 'icon__close--disabled', - CROSS = 'icon__cross', - FAVORITE = 'icon__favorite', - FAVORITE_FILLED = 'icon__favorite--active', - HOME = 'icon__home', - MENU_BURGER = 'icon__menu-burger', - MINUS = 'icon__minus', - MINUS_DISABLED = 'icon__minus--disabled', - PLUS = 'icon__plus', - SEARCH = 'icon__search', -} diff --git a/src/types/SortType.ts b/src/types/SortType.ts deleted file mode 100644 index 8ca98468ef..0000000000 --- a/src/types/SortType.ts +++ /dev/null @@ -1,8 +0,0 @@ -export enum SortType { - Newest = 'newest', - Alphabetically = 'alphabetically', - Price = 'price', - Year = 'year', - MaxDiscount = 'maxDiscount', - Random = 'random', -} From a5f73e7b5bc6c3ed6e12cc2052affb58509a2373 Mon Sep 17 00:00:00 2001 From: Veronika Pastushkova Date: Tue, 18 Jul 2023 21:14:56 +0300 Subject: [PATCH 3/3] add task solution --- src/components/ProductsList/ProductsList.tsx | 4 ++-- src/pages/ProductDetailsPage/ProductDetailsPage.tsx | 13 ++----------- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/src/components/ProductsList/ProductsList.tsx b/src/components/ProductsList/ProductsList.tsx index e0a4d6feca..cc7173879b 100644 --- a/src/components/ProductsList/ProductsList.tsx +++ b/src/components/ProductsList/ProductsList.tsx @@ -27,13 +27,13 @@ export const ProductsList: React.FC = ({ title, products }) => { const getSortedProducts = (productsList: Product[]) => { let sortedProducts = [...productsList]; - if (sort === 'age') { + if (sort === 'newest') { sortedProducts = sortedProducts.sort( (product1, product2) => product1.age - product2.age, ); } - if (sort === 'name') { + if (sort === 'alphabetically') { sortedProducts = sortedProducts.sort( (product1, product2) => product1.name.localeCompare(product2.name), ); diff --git a/src/pages/ProductDetailsPage/ProductDetailsPage.tsx b/src/pages/ProductDetailsPage/ProductDetailsPage.tsx index f40f29a619..3c84e01a46 100644 --- a/src/pages/ProductDetailsPage/ProductDetailsPage.tsx +++ b/src/pages/ProductDetailsPage/ProductDetailsPage.tsx @@ -44,15 +44,6 @@ export const ProductDetailsPage: React.FC = () => { const newPrice = product ? priceWithDiscount(product) : 0; - const featuresShort = { - keys: ['screen', 'resolution', 'processor', 'RAM'], - values: [ - `${selectedProduct?.display.screenSize}`, - `${selectedProduct?.display.screenResolution}`, - `${selectedProduct?.hardware.cpu}`, - `${selectedProduct?.storage.ram}`], - }; - const featuresLong = { keys: ['screen', 'resolution', 'processor', 'RAM', 'built in memory', 'android', 'bluetooth', 'battery'], @@ -226,7 +217,7 @@ export const ProductDetailsPage: React.FC = () => {
      - {featuresShort.keys.map((key) => ( + {featuresLong.keys.slice(0, 4).map((key) => (
    • {key}
    • @@ -234,7 +225,7 @@ export const ProductDetailsPage: React.FC = () => {
      - {featuresShort.values.map((value) => ( + {featuresLong.values.slice(0, 4).map((value) => (
    • {value}