diff --git a/index.html b/index.html index ecb7d1a..870627a 100644 --- a/index.html +++ b/index.html @@ -12,22 +12,10 @@ - - - - - - - React-Start-App + DM Ecommerce diff --git a/public/About/Hands.png b/public/About/Hands.png deleted file mode 100644 index fc9a6dd..0000000 Binary files a/public/About/Hands.png and /dev/null differ diff --git a/public/About/Laptop.png b/public/About/Laptop.png deleted file mode 100644 index 8ff1400..0000000 Binary files a/public/About/Laptop.png and /dev/null differ diff --git a/public/Activities/data-display/2 25.png b/public/Activities/data-display/2 25.png deleted file mode 100644 index 55a67ad..0000000 Binary files a/public/Activities/data-display/2 25.png and /dev/null differ diff --git a/public/Activities/data-display/Rectangle 103.png b/public/Activities/data-display/Rectangle 103.png deleted file mode 100644 index e6b0d8b..0000000 Binary files a/public/Activities/data-display/Rectangle 103.png and /dev/null differ diff --git a/public/Activities/iconsSearch.svg b/public/Activities/iconsSearch.svg deleted file mode 100644 index e7b4dc2..0000000 --- a/public/Activities/iconsSearch.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/Activities/main.png b/public/Activities/main.png deleted file mode 100644 index 46e3d05..0000000 Binary files a/public/Activities/main.png and /dev/null differ diff --git a/public/Activities/mediaIcons/Group.png b/public/Activities/mediaIcons/Group.png deleted file mode 100644 index 63dee7b..0000000 Binary files a/public/Activities/mediaIcons/Group.png and /dev/null differ diff --git a/public/Activities/mediaIcons/insta.png b/public/Activities/mediaIcons/insta.png deleted file mode 100644 index 65f4a69..0000000 Binary files a/public/Activities/mediaIcons/insta.png and /dev/null differ diff --git a/public/Activities/mediaIcons/teleg.png b/public/Activities/mediaIcons/teleg.png deleted file mode 100644 index d1c2ebe..0000000 Binary files a/public/Activities/mediaIcons/teleg.png and /dev/null differ diff --git a/public/Activities/mediaIcons/whats.png b/public/Activities/mediaIcons/whats.png deleted file mode 100644 index e857fdf..0000000 Binary files a/public/Activities/mediaIcons/whats.png and /dev/null differ diff --git a/public/Cart/CartProduct.png b/public/Cart/CartProduct.png deleted file mode 100644 index eee158c..0000000 Binary files a/public/Cart/CartProduct.png and /dev/null differ diff --git a/public/Home/HeroSection.png b/public/Home/HeroSection.png deleted file mode 100644 index af5be13..0000000 Binary files a/public/Home/HeroSection.png and /dev/null differ diff --git a/public/Home/big_transparent_leaf.png b/public/Home/big_transparent_leaf.png deleted file mode 100644 index 13b3eb0..0000000 Binary files a/public/Home/big_transparent_leaf.png and /dev/null differ diff --git a/public/Home/leaf.png b/public/Home/leaf.png deleted file mode 100644 index 0e02a35..0000000 Binary files a/public/Home/leaf.png and /dev/null differ diff --git a/public/Home/partner1.png b/public/Home/partner1.png deleted file mode 100644 index 7b9af23..0000000 Binary files a/public/Home/partner1.png and /dev/null differ diff --git a/public/Home/partner2.png b/public/Home/partner2.png deleted file mode 100644 index c801fa9..0000000 Binary files a/public/Home/partner2.png and /dev/null differ diff --git a/public/Home/small_transparent_leaf.png b/public/Home/small_transparent_leaf.png deleted file mode 100644 index b312c50..0000000 Binary files a/public/Home/small_transparent_leaf.png and /dev/null differ diff --git a/public/Layout/Footer.jpg b/public/Layout/Footer.jpg deleted file mode 100644 index 43476c8..0000000 Binary files a/public/Layout/Footer.jpg and /dev/null differ diff --git a/public/Layout/KarimLogo.svg b/public/Layout/KarimLogo.svg deleted file mode 100644 index 0544713..0000000 --- a/public/Layout/KarimLogo.svg +++ /dev/null @@ -1,27 +0,0 @@ - - \ No newline at end of file diff --git a/public/Layout/KarimLogo.tsx b/public/Layout/KarimLogo.tsx deleted file mode 100644 index 61167b0..0000000 --- a/public/Layout/KarimLogo.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import React from "react"; - -const KarimLogo = () => { - return ( - <> - - - - - - - - - - - - - - - - - - - - ); -}; - -export default KarimLogo; diff --git a/public/Layout/LoginBg.jpg b/public/Layout/LoginBg.jpg deleted file mode 100644 index fc3a090..0000000 Binary files a/public/Layout/LoginBg.jpg and /dev/null differ diff --git a/public/index.html b/public/index.html index ecb7d1a..06a1d83 100644 --- a/public/index.html +++ b/public/index.html @@ -12,22 +12,10 @@ - - - - - - - + - React-Start-App + DM Ecommerce diff --git a/public/site.webmanifest b/public/site.webmanifest index ea26d6f..3be812d 100644 --- a/public/site.webmanifest +++ b/public/site.webmanifest @@ -1,5 +1,5 @@ { - "name": "ReactStart-App", + "name": "DM Ecommerce", "short_name": "RS", "description": "A social networking platform with automated content moderation and context-based authentication system.", "start_url": "/", diff --git a/src/Components/Cart/CardItem.tsx b/src/Components/Cart/CardItem.tsx index 2c5f8aa..69c138b 100644 --- a/src/Components/Cart/CardItem.tsx +++ b/src/Components/Cart/CardItem.tsx @@ -38,7 +38,7 @@ const CardItem: React.FC = ({ data }) => { }; const price = (data?.quantity ?? 1) * data?.price; - + return ( {
- {Cart.map((item: any, index: number) => ( + {Cart?.map((item: any, index: number) => ( ))}
diff --git a/src/Components/Home/BoseHeadphones.tsx b/src/Components/Home/BoseHeadphones.tsx index c80b953..98d2cea 100644 --- a/src/Components/Home/BoseHeadphones.tsx +++ b/src/Components/Home/BoseHeadphones.tsx @@ -1,6 +1,7 @@ import React from "react"; import { useTranslation } from "react-i18next"; -import { GoArrowUpRight } from "react-icons/go"; +import { RiArrowRightUpFill } from "react-icons/ri"; +import { Link } from "react-router-dom"; const BoseHeadphones = () => { const {t} = useTranslation(); @@ -10,10 +11,12 @@ const BoseHeadphones = () => {
{t("Bose Headphones")}

{t("Smarter than your average headphones")}

- + + +
); diff --git a/src/Components/Home/CategoriesSlider.tsx b/src/Components/Home/CategoriesSlider.tsx index f3eff1b..3e4dbb8 100644 --- a/src/Components/Home/CategoriesSlider.tsx +++ b/src/Components/Home/CategoriesSlider.tsx @@ -26,24 +26,24 @@ const CategoriesSlider = () => {
diff --git a/src/Components/Products/ProductSlider.tsx b/src/Components/Products/ProductSlider.tsx new file mode 100644 index 0000000..1c69a1b --- /dev/null +++ b/src/Components/Products/ProductSlider.tsx @@ -0,0 +1,65 @@ +// import Swiper core and required modules +import { Navigation, A11y } from "swiper/modules"; +import { Swiper, SwiperSlide } from "swiper/react"; + +// Import Swiper styles +import "swiper/css"; +import "swiper/css/navigation"; +import "swiper/css/pagination"; +import "swiper/css/scrollbar"; +import CustomImage from "../../ui/CustomImage"; +import React, { Key } from "react"; + +interface ProductSliderProps { + data: any; + onImageClick: (imagePath: string) => void; +} + +const ProductSlider: React.FC = ({ data, onImageClick }) => { + return ( +
+ + {/* main image */} + + onImageClick(data.main_photo)}> + + + + {data?.images?.map((item: { path: string; },index: Key | null | undefined)=>{ + return ( + + onImageClick(item.path)} > + + + + ) + })} + +
+ ); +}; +export default ProductSlider; diff --git a/src/Layout/Ui/Footer.tsx b/src/Layout/Ui/Footer.tsx index 183a02d..6c2098d 100644 --- a/src/Layout/Ui/Footer.tsx +++ b/src/Layout/Ui/Footer.tsx @@ -57,10 +57,10 @@ const Footer = () => {
{t("Sign up for News and updates")}
- - - - + + + +
diff --git a/src/Pages/Categories/Page.tsx b/src/Pages/Categories/Page.tsx index f22fc5f..d7f8ee6 100644 --- a/src/Pages/Categories/Page.tsx +++ b/src/Pages/Categories/Page.tsx @@ -19,7 +19,7 @@ const Page = () => { const [type, setType] = useState(type_param); const [currentPage, setCurrentPage] = useState(1); const [totalItems, setTotalItems] = useState(0); - console.log(totalItems); + const [perPage, setPerPage] = useState(10); useEffect(() => { @@ -75,6 +75,9 @@ const Page = () => { useEffect(() => { if (data?.meta) { setTotalItems(data.meta?.total); + setPerPage(data.meta?.per_page); + console.log(data.meta); + } }, [data]); @@ -148,7 +151,7 @@ const Page = () => { diff --git a/src/Pages/Product/Page.tsx b/src/Pages/Product/Page.tsx index d6e63b9..3f53c28 100644 --- a/src/Pages/Product/Page.tsx +++ b/src/Pages/Product/Page.tsx @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { IoIosArrowForward } from "react-icons/io"; import { Currency } from "../../Layout/app/Const"; @@ -12,11 +12,25 @@ import { languageObject } from "../../utils/languageObject"; import { jsonObjectToArray } from "../../utils/jsonObjectToArray"; import HeaderLink from "../../Components/Ui/HeaderLink"; import { BaseURL } from "../../api/utils/config"; +import ProductTabs from "../../Components/Products/ProductsTabs"; +import { IoHeartOutline } from "react-icons/io5"; +import { useAddFavorite, useDeleteFavorite } from "../../api/Favorite"; +import { useQueryClient } from "react-query"; +import { toast } from "react-toastify"; +import { FaCartPlus } from "react-icons/fa"; +import { useCartState } from "../../state/CartState"; +import useAuthState from "../../state/AuthState"; +import ProductSlider from "../../Components/Products/ProductSlider"; const Page = () => { const [t] = useTranslation(); const {product_id} = useParams() + const { Cart, setCart } = useCartState(); + const { isAuthenticated } = useAuthState(); + const { mutate: addToFavorite, isSuccess: Add } = useAddFavorite(); + const { mutate: deleteToFavorite, isSuccess: Delete } = useDeleteFavorite(); + const {data,isLoading} = useGetSingleBaseProduct({ show:product_id }) @@ -28,10 +42,55 @@ const Page = () => { const handelImage = (item: any) => { // setMainImage(item); }; - console.log(product?.images); - + + const queryClient = useQueryClient(); + + const handelChangeFavorite = (item: Product) => { + if (!isAuthenticated) { + toast.error("sorry you need to be authenticated"); + return; + } + if (item?.favorite) { + + deleteToFavorite({ + id: item?.id, + }); + } else { + addToFavorite({ + id: item?.id, + }); + } + queryClient.invalidateQueries('mainProduct'); + + }; + useEffect(() => { + if (Add) { + toast.success("added to favorite successfully"); + queryClient.invalidateQueries("mainProduct"); + } + }, [Add]); + useEffect(() => { + if (Delete) { + toast.success("removed from favorite successfully"); + queryClient.invalidateQueries("mainProduct"); + } + }, [Delete]); + const handelAddToCart = (item: Product) => { + if (!isAuthenticated) { + + toast.error("sorry you need to be authenticated"); + return; + } + setCart(item); + + + toast.success(`${languageObject(item?.name)}` + " added to cart"); + }; + const info = jsonObjectToArray(product?.info) - + const handleChangeImage = (imagePath: string) => { + setMainImage(imagePath); + }; if(isLoading){ return
} @@ -42,59 +101,28 @@ const Page = () => {
- + +
+ handelChangeFavorite(product)} + className={product?.favorite ? "" : "not_favorite"} + /> + handelAddToCart(product)} + /> +
- {product?.images?.map((item,index)=>{ - return ( - handelImage(item?.path)} > - - - ) - })} - - handelImage('/Home/p1.png')} - // src={} - alt="" - /> - +
-

{languageObject(product?.name)}

-
- - -
category
{languageObject(product?.category?.name)}
-
- -
price
{product?.price}
-
- -
brand
SAMSUNG
-
- - {info?.map((item:any)=>{ - return ( - -
item
SAMSUNG
-
- ) - })} - -
description
{languageObject(product?.description)}
-
-
-
+ +
- + ); }; diff --git a/src/ProviderContainer.tsx b/src/ProviderContainer.tsx index abd578b..e11a5be 100644 --- a/src/ProviderContainer.tsx +++ b/src/ProviderContainer.tsx @@ -23,9 +23,7 @@ function ProviderContainer({ children }: Tchildren) { }, }} > - {/* */} {children} - {/* */} diff --git a/src/Styles/Page/Cart.scss b/src/Styles/Page/Cart.scss index 0b20900..734145f 100644 --- a/src/Styles/Page/Cart.scss +++ b/src/Styles/Page/Cart.scss @@ -46,9 +46,9 @@ @include Flex; } .ViewCart_Button{ - width: 100%; - margin-top: 20px; - display: flex;justify-content: space-between; + width: 100%; + display: flex;justify-content: space-between; + margin-top: 20px; p{ text-align: center; font-size: 1\6px; @@ -69,7 +69,10 @@ } } - +.Drawer_Body{ + height: 70vh; + display: flex; flex-direction: column; justify-content: space-between;align-items: center; +} .ar{ .cart_first_section{ display: flex;justify-content: space-between; @@ -95,8 +98,27 @@ p{ font-size: 12px; } + .cart_checkout_button{ + font-size: 15px; + padding: 20px 10px; + } + } +} + +.EmptyCard{ + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + margin-top: 5%; + gap: 20px; + img{ + width: 40%; + } + p{ + font-size: max(1.5vw,15px); + } .cart_checkout_button{ font-size: 15px; } } -} \ No newline at end of file diff --git a/src/Styles/Page/Home.scss b/src/Styles/Page/Home.scss index 02d30d5..65c6402 100644 --- a/src/Styles/Page/Home.scss +++ b/src/Styles/Page/Home.scss @@ -10,8 +10,8 @@ &::after { position: absolute; content: ""; - right: 0; top: 0; + right: 0; background: url("../../../public/Home/HeroShape.svg"); background-size: cover; background-repeat: no-repeat; @@ -27,7 +27,7 @@ gap: 20px; h1 { - font-size: 4vw; + font-size: 4.4vw; font-weight: bold; } @@ -64,7 +64,8 @@ .CategoriesSlider_image { padding: 10px 30px; - + width: 152px; + height: 160px; border: 1px solid #d9d9d9; border-radius: 10px; display: flex; @@ -75,6 +76,7 @@ min-width: 140px; max-width: 140px; height: 150px; + border-radius: 10px; } } } @@ -256,26 +258,25 @@ .BatteryLife, .PerfectSound { + width: 100%; display: flex; justify-content: space-between; align-items: center; - justify-content: center; - - > div { - width: 40%; + img{ + width: 54%; + } + div { + width: 46%; h1 { font-size: 5vw; - font-weight: bold; + font-weight: 500; } p { - font-size: 1vw; + font-size: 1.24vw; } } - - > img { - } } .PerfectSound { @@ -289,6 +290,13 @@ } } } + .BatteryLife{ + width: 84%; + margin-inline: auto; + p{ + font-size: 1.38vw !important; + } + } } @media screen and (max-width: 1000px) { @@ -335,15 +343,15 @@ > div { display: flex; flex-direction: column; - gap: 30px; - display: none; + gap: 10px; + // display: none; h3 { font-weight: bold; } button { - font-size: 30px; + font-size: 20px; padding-inline: 10%; border-radius: 2vw; } @@ -352,7 +360,7 @@ > span { img { - width: 50vw; + width: 50VW; } } } @@ -365,7 +373,9 @@ [role="button"] { color: var(--text) !important; } - + .swiper-slide{ + min-width: 150px; + } .CategoriesSlider_image { padding: 4% 10%; border: 1px solid #d9d9d9; @@ -373,7 +383,8 @@ display: flex; justify-content: center; align-items: center; - + width: 110px; + height: 110px; img { min-width: 100px; max-width: 100px; @@ -497,7 +508,9 @@ max-width: 100vw; flex-wrap: wrap; text-align: center; - + img{ + width: 100%; + } > div { width: 80%; @@ -537,60 +550,35 @@ .home_page{ .HeroSection { - display: flex; - padding: 10% 6%; - position: relative; - width: 100%; - z-index: 99; - min-height: 100vh; - - &::after { - position: absolute; - content: ""; - right: auto; - scale: -1; - left: 0; - top: 0; - background: url("../../../public/Home/HeroShape.svg"); - background-size: cover; - background-repeat: no-repeat; - width: 40%; - height: 100%; - z-index: -1; - } - + &::after{ + scale: -1; + right: auto; + left: 0 !important; + } > div { display: flex; flex-direction: column; - width: 45%; - gap: 20px; + width: 60%; h1 { - font-size: 4vw; + font-size: 6vw; font-weight: bold; } > div { display: flex; - gap: 30px; - - h3 { - font-weight: bold; - } - - button { - padding-inline: 10%; - border-radius: 2vw; - } + gap: 30px } } - > span { - img { - width: 25vw; - } - } } } +} + +.swiper-button-prev:after, .swiper-button-next:after{ + background: var(--white); + padding: 4px; + border-radius: 10px; + font-size: 30px; } \ No newline at end of file diff --git a/src/Styles/Page/Product.scss b/src/Styles/Page/Product.scss index 97cbb4e..bd36bca 100644 --- a/src/Styles/Page/Product.scss +++ b/src/Styles/Page/Product.scss @@ -21,63 +21,137 @@ .Product_left { display: flex; width: 45%; - > span { + .fav_icon{ + svg{ + font-size: 25px; + transition: ease-in-out .3s; + margin-inline: 5px; + &:hover{ + color: var(--primary); + } + } + } + .Product_left_container { + width: 100%; display: flex; flex-direction: column; gap: 20px; > img { - width: 50%; + width: 100%; + height: 300px; + object-fit: contain; margin-inline: auto; } .gallery_product { display: flex; gap: 20px; overflow-x: scroll; - // max-width: 40vw; &::-webkit-scrollbar { display: none; } - span { - padding: 10px 15px; - border: 2px solid rgba(128, 128, 128, 0.1); - width: 100%; - > img { - width: 100%; - cursor: pointer; - } - } + } } } - - .Product_Right { + .Product_info { display: flex; flex-direction: column; - gap: 20px; + gap: 5px; align-items: flex-start; - padding-top: 2%; h1 { font-size: 4vw; } > div { + width: 100%; display: flex; flex-direction: column; - gap: 20px; + gap: 10px; > span { display: flex; align-items: flex-start; gap: 20px; - width: 80%; + width: 100%; + padding: 10px 15px 0px 15px; + &:nth-child(odd){ + background: var(--whiteOpacity) !important; + } h6 { - color: gray; + color: var(--whiteGray); position: relative; - min-width: 80px; + width: 50%; + font-size: 12px; + } + h5{ + height: 100%; + color: var(--text); + font-size: 12px; } } } } -} + + .product_images_swiper{ + width: 100%; + .swiper-button-prev:after, .swiper-button-next:after{ + color: var(--text); + font-size: 20px; + background: #fff; + padding: 4px; + border-radius: 4px; + } + .swiper-backface-hidden .swiper-slide{ + padding-inline: 10px; + min-width: 50px !important; + } + > span{ + width: 50px; + } + .product_multi_image{ + width: 60px !important; + height: 50px; + object-fit: fill; + cursor: pointer; + } + } +} +.Product_Right{ + width: 50%; +} +.product_tab{ + width: 100%; +} +.product_description{ + width: 100%; + p{ + padding-inline: 15px; + width: 95%; + background: var(--whiteOpacity); + font-size: 14px; + } +} +.product_additional_info{ + > span { + display: flex; + align-items: flex-start; + gap: 20px; + width: 100%; + padding: 10px 15px 0px 15px; + &:nth-child(even){ + background: var(--whiteOpacity) !important; + } + h6 { + color: var(--text); + position: relative; + width: 50%; + font-size: 12px; + } + h5{ + color: var(--text); + font-size: 12px; + } + } +} .Products { display: flex; flex-direction: column; @@ -89,23 +163,25 @@ > header { display: flex; justify-content: space-between; + h1{ + font-size: 20px; + } } .ProductCards { max-width: 90vw; margin-inline: auto; display: flex; - // gap: 40px; - // overflow-x: scroll; - - // &::-webkit-scrollbar { - // display: none; - // } } } - -@media screen and (max-width:700px) { +@media screen and (max-width:850px) { + .ant-tabs .ant-tabs-tab-btn{ + font-size: 14px !important; + } + .ant-tabs >.ant-tabs-nav .ant-tabs-nav-wrap,.ant-tabs >div>.ant-tabs-nav .ant-tabs-nav-wrap{ + justify-content: center !important;align-items: center !important; + } .Product { display: flex; min-height: 100vh; @@ -114,40 +190,27 @@ margin-inline: auto; } > main { - padding-inline: 10%; + padding-inline: 4%; margin-top: 30px; display: flex;flex-direction: column; width: 100%; gap: 10%; } .Product_left { - display: flex; - width: 90%; + display: flex;justify-content: center;align-items: center; + width: 100%; margin-inline: auto; > span { display: flex; flex-direction: column; gap: 20px; > img { - width: 60%; + width: 50%; margin-inline: auto; } .gallery_product { display: flex; gap: 20px; - // overflow-x: scroll; - // &::-webkit-scrollbar { - // display: none; - // } - span { - padding: 10px 10px; - border: 2px solid rgba(128, 128, 128, 0.1); - width: 100%; - > img { - width: 100%; - cursor: pointer; - } - } } } } @@ -180,4 +243,24 @@ } } } -} \ No newline at end of file +} + +@media screen and (max-width:450px) { + .ant-tabs >.ant-tabs-nav .ant-tabs-nav-wrap,.ant-tabs >div>.ant-tabs-nav .ant-tabs-nav-wrap{ + justify-content: flex-start !important;align-items: flex-start !important; + } + .ant-tabs .ant-tabs-tab-btn{ + font-size: 10px !important; + } +} + +.ant-pagination .ant-pagination-item a{ + color: var(--text); + +} + + +.main_image { + margin-left: 10px; + border: 2px solid var(--primary); /* or any color that fits your design */ +} diff --git a/src/Styles/components/Card.scss b/src/Styles/components/Card.scss index c2af35f..59cc219 100644 --- a/src/Styles/components/Card.scss +++ b/src/Styles/components/Card.scss @@ -4,6 +4,7 @@ justify-content: space-between; align-items: center; border-radius: 7px; + min-width: 400px; .ant-card-body { @include Flex; padding: 10px 5px; @@ -136,3 +137,10 @@ } } } + + +@media screen and (max-width:450px) { + .CardItem{ + min-width: 300px; + } +} \ No newline at end of file diff --git a/src/lib/ReactQueryProvider.tsx b/src/lib/ReactQueryProvider.tsx index fa16858..cdea6d7 100644 --- a/src/lib/ReactQueryProvider.tsx +++ b/src/lib/ReactQueryProvider.tsx @@ -2,7 +2,13 @@ import React from "react"; import { QueryClient, QueryClientProvider } from "react-query"; function QueryProvider({ children }: any) { - const queryClient = new QueryClient(); + const queryClient = new QueryClient({ + defaultOptions: { + queries: { + refetchOnWindowFocus:false, + }, + }, + }); return ( {children} diff --git a/src/state/AuthState.ts b/src/state/AuthState.ts index 5945b96..473fb49 100644 --- a/src/state/AuthState.ts +++ b/src/state/AuthState.ts @@ -34,7 +34,6 @@ const useAuthState = create((set) => { Guest: storedGuest, setGuest: (Guest: string) => { localStorage.setItem(LocalStorageEnum.GUEST_KEY, Guest); - set(() => ({ Guest: Guest, })); diff --git a/src/translate/ar.json b/src/translate/ar.json index 2bbe86e..5314adf 100644 --- a/src/translate/ar.json +++ b/src/translate/ar.json @@ -380,13 +380,26 @@ "Verify": "تحقق", "Create Your Account": "أنشئ حسابك", "Log In To DM": "تسجيل الدخول إلى DM", +"Login / Sign Up": "تسجيل الدخول / الاشتراك", "Verify Your Account": "تحقق من حسابك", "E-mail": "البريد الإلكتروني", "Full Name": "الاسم الكامل", "verify code": "تحقق من الرمز", "verify": "تحقق", "sub_categories": "الفئات الفرعية", -"Clear_All": "مسح الكل" +"Clear_All": "مسح الكل", +"Track, return or purchase items":"تتبع أو إرجاع أو شراء العناصر", +"Order History":"تاريخ الطلب", +"Please try using other keywords to find the product name":"يرجى محاولة استخدام كلمات رئيسية أخرى للعثور على اسم المنتج", +"There are no suitable products":"لا توجد منتجات مناسبة", +"product_info":"معلومات المنتج", +"additional information":"معلومات إضافية", +"description":"الوصف", +"Info":"معلومات", +"Additional Info":"معلومات إضافية", +"Product info is empty":"معلومات المنتج فارغة", +"We are DM company, which has been working for two decades. We are active in the United Arab Emirates in the field of stock laptops, computer parts, RAM, hard drives, etc. We are currently working with Europe, Africa and the Middle East.We provide you the best services with the shortest time and the highest quality":"نحن شركة DM، التي تعمل منذ عقدين من الزمن. نحن نشطون في دولة الإمارات العربية المتحدة في مجال أجهزة الكمبيوتر المحمولة، وقطع الكمبيوتر، وذاكرة الوصول العشوائي، والأقراص الصلبة، وما إلى ذلك. ونعمل حاليًا مع أوروبا وأفريقيا والشرق الأوسط. نقدم لك أفضل الخدمات في أقصر وقت وبأقل تكلفة. اعلى جودة", +"":"" } \ No newline at end of file diff --git a/src/types/item.ts b/src/types/item.ts index 78a071f..1a590c8 100644 --- a/src/types/item.ts +++ b/src/types/item.ts @@ -67,6 +67,7 @@ export interface Product { total_quantity_ordered: number; attributes: ProductAttribute[]; other_attributes: any | null; // Adjust this type based on the actual structure if available + quantity:number } export interface MainData {