Merge branch 'temp' of https: update 36 files //git.sitenevis.com/Danovin/application

master
amir hosein gorji 2 years ago
commit ec66729bd7
  1. 2
      src/views/Blogs/layouts/Single.js
  2. 8
      src/views/Dashboard/layouts/Main/Addresses/index.js
  3. 6
      src/views/Home/Portrait/Private/Blogs/index.js
  4. 16
      src/views/Home/Portrait/Private/Shop/index.js
  5. 4
      src/views/Home/Portrait/Private/Videos/index.js
  6. 34
      src/views/Home/Portrait/Public/Features/index.js
  7. 4
      src/views/Home/Portrait/Public/GradiantText/index.js
  8. 41
      src/views/Home/Portrait/Public/Header/index.js
  9. 17
      src/views/Home/Portrait/Public/Platforms/index.js
  10. 33
      src/views/Home/Portrait/Public/Responsive/index.js
  11. 16
      src/views/Order/components/Book.js
  12. 114
      src/views/Order/index.js
  13. 23
      src/views/Orders/components/Order.js
  14. 6
      src/views/Product/Comment/index.js
  15. 27
      src/views/Product/Desktop/ProductOverAll/index.js
  16. 4
      src/views/Product/Desktop/index.js
  17. 118
      src/views/Product/Rate/index.js
  18. 235
      src/views/Product/index.js
  19. 8
      src/views/Products/layouts/Desktop/Main.js
  20. 12
      src/views/Products/layouts/Desktop/Sidebar.js
  21. 4
      src/views/Products/layouts/Mobile/Header.js
  22. 39
      src/views/Products/layouts/Mobile/Main.js
  23. 10
      src/views/QR/Content/components/Links.js
  24. 40
      src/views/QR/Content/components/Tab.js
  25. 35
      src/views/QR/Content/index.js
  26. 26
      src/views/ShoppingCart/Code/index.js
  27. 18
      src/views/ShoppingCart/Product/index.js
  28. 308
      src/views/ShoppingCart/index.js
  29. 32
      src/views/Video/components/Desktop/Table.js
  30. 19
      src/views/Video/components/Season.js
  31. 55
      src/views/Video/index.js
  32. 4
      src/views/VideoDisplay/components/Season.js
  33. 14
      src/views/VideoDisplay/index.js
  34. 10
      src/views/Videos/components/MostViewedVideo.js
  35. 8
      src/views/Videos/components/NewestVideo.js
  36. 4
      src/views/Videos/components/VerticalGradeFilter.js

@ -27,7 +27,7 @@ export const Single = ({ blog, isMobile }) => {
<Avatar size={40} />
<div className="flex flex-col py-2 mr-2 justify-center">
<strong className="text-gray-300 text-tiny font-bold">
{window.t("نوشته از:" + " " + "کامران ایزدی")}
{window.t("نوشته از:")}
</strong>
<p className="text-gray-300 mt-2 text-xs">
{window.t("سردبیر بخش وبلاگ دانوین ایزدی")}

@ -166,20 +166,20 @@ const Location = ({
<div className={`flex w-full ${active ? "" : "flex-row"}`}>
<div className="flex flex-col flex-1 mb-4">
<span className="mb-2 leading-6">
{`{window.t("آدرس")}` + " " + address.address}
{window.t("آدرس") + " " + address.address}
</span>
<span className="mb-2 leading-6">
{`{window.t("نام:")}` +
{window.t("نام") +
" " +
address.firstName +
" " +
address.lastName}
</span>
<span className="mb-2 leading-6">
{`{window.t("کد پستی:")}` + " " + address.postalCode}
{window.t("کد پستی:") + " " + address.postalCode}
</span>
<span className="mb-2 leading-6">
{`{window.t("شماره تماس:")}` + " " + address.cellphone}
{window.t("شماره تماس:") + " " + address.cellphone}
</span>
</div>
</div>

@ -14,7 +14,7 @@ function Blogs({ list, isDark, setActive }) {
<div className="w-full flex flex-col rounded-md py-4 overflow-hidden">
<header className="w-full flex justify-between items-center">
<strong className="text-green7B dark:text-white font-bold text-base lg:text-sm">
خواندنیها
{window.t("خواندنیها")}
</strong>
<Link to="/blogs">
{isDark ? (
@ -73,12 +73,12 @@ const Blog = ({ blog, setActive }) => {
className="w-5 h-5 rounded-full ml-2"
/>
<span className="text-green7B text-xs font-light dark:text-greenBA">
{"حامد دژبانی نسب"}
{window.t("حامد دژبانی نسب")}
</span>
</div>
<div className="flex items-center">
<span className="text-xs font-light text-gray70 dark:text-greenBA">
{_.join(["زمان مناسب", "30"], " ")}
{_.join([window.t("زمان مناسب"), "30"], " ")}
</span>
</div>
</div>

@ -2,7 +2,7 @@ import React from "react";
import { Link } from "react-router-dom";
import { connect } from "react-redux";
import { book } from "../../../../../redux/actions";
import Header from '../../../../../components/Header'
import Header from "../../../../../components/Header";
// assets
@ -10,11 +10,11 @@ function Shop({ list, grades }) {
return (
<div className="w-full pr-4">
<div className="w-full flex flex-col rounded-md py-4 overflow-hidden">
<Header title="فروشگاه" link="/products" />
<Header title={window.t("فروشگاه")} link="/products" />
<ul
className="list-none w-full overflow-x-scroll mt-3 flex flex-col flex-wrap no-scrollbar"
style={{
height: 'calc(100vh / 4)',
height: "calc(100vh / 4)",
}}
>
{list.map((book, index) => (
@ -41,10 +41,10 @@ const Book = ({ book, index }) => {
alt=""
className="rounded-sm"
style={{
width: 'calc(100vh / 4 * 3 / 4.3 )',
height: 'calc(100vh / 4)',
width: "calc(100vh / 4 * 3 / 4.3 )",
height: "calc(100vh / 4)",
maxWidth: 200,
maxHeight: 275
maxHeight: 275,
}}
/>
) : (
@ -53,8 +53,8 @@ const Book = ({ book, index }) => {
alt=""
className="rounded-sm mb-0"
style={{
width: 'calc(100vh / 4 / 2 * 3 / 4.3)',
height: 'calc(100vh / 4 / 2 - 4px)',
width: "calc(100vh / 4 / 2 * 3 / 4.3)",
height: "calc(100vh / 4 / 2 - 4px)",
marginBottom: index % 2 !== 0 ? "8px" : "0px",
}}
/>

@ -34,7 +34,7 @@ function Videos({ videos, grades, isDark, isMobile }) {
</div>
<h2 className="mt-3 mb-4 text-sm font-semibold text-blue5F dark:text-white lg:mt-4 lg:text-tiny lg:mb-5">
{"دوره ویدئویی" + " " + video?.product[2]?.name}
{window.t("دوره ویدئویی") + " " + video?.product[2]?.name}
</h2>
{/* <p className="font-medium text-blueC0 dark:text-greenBA text-xs mt-1 lg:mt-2 lg:text-sm">{`پایه ${
grades[video.gradeId]
@ -49,7 +49,7 @@ function Videos({ videos, grades, isDark, isMobile }) {
<div className="w-full flex flex-col py-4 lg:px-3 overflow-hidden lg:border lg:border-solid lg:border-gray-200 rounded-md lg:bg-blueC0 lg:bg-opacity-5">
<header className="w-full flex justify-between items-center">
<strong className="text-green7B dark:text-white font-bold text-base lg:text-base mt-2">
دورههای ویدئویی شما
{window.t("دورههای ویدئویی شما")}
</strong>
{isDark ? (
<img

@ -17,7 +17,10 @@ function Features({ features }) {
const Feature = ({ feature }) => {
return (
<div className="flex flex-col mt-4" style={{ width: "48%" }}>
<div className="p-4 rounded-md w-16" style={{ backgroundColor: feature.backgroundColor }}>
<div
className="p-4 rounded-md w-16"
style={{ backgroundColor: feature.backgroundColor }}
>
<img src={feature.icon} className="w-8 h-8" alt="" />
</div>
<strong
@ -26,7 +29,9 @@ const Feature = ({ feature }) => {
>
{feature.title}
</strong>
<p className="mt-2 font-light text-gray1 dark:text-white text-sm leading-4">{feature.text}</p>
<p className="mt-2 font-light text-gray1 dark:text-white text-sm leading-4">
{feature.text}
</p>
</div>
);
};
@ -39,30 +44,37 @@ Features.defaultProps = {
icon: interactiveIcon,
backgroundColor: "#FFFDC4",
color: "#C0C700",
title: "کتابهای تعاملی",
text: "قابلیت امتیاز دهی به مطالب از جمله امکانات این سامانه می باشد تا به جامعه هدف کارکنان کمک نماید",
title: window.t("کتابهای تعاملی"),
text: window.t(
"قابلیت امتیاز دهی به مطالب از جمله امکانات این سامانه می باشد تا به جامعه هدف کارکنان کمک نماید"
),
},
{
icon: videoIcon,
backgroundColor: "#A1DDFF",
color: "#196EC0",
title: "",
title: "ویدئوهای مربوط به هر درس",
text: "انتخاب رنگ در حوزه طراحی کار بسیار عجیبی است و کاربران همه روزه با آن دسته پنجه نرم می کنند",
title: window.t("ویدئوهای مربوط به هر درس"),
text: window.t(
"انتخاب رنگ در حوزه طراحی کار بسیار عجیبی است و کاربران همه روزه با آن دسته پنجه نرم می کنند"
),
},
{
icon: testIcon,
backgroundColor: "#C4FFF7",
color: "#06A38E",
title: "آزمون ",
text: "این پلتفرم می تواند تاریخ جشن تولد خود شما، دوستان شما و حتی خانواده شما را به شما یادآوری نمایید",
title: window.t("آزمون"),
text: window.t(
"این پلتفرم می تواند تاریخ جشن تولد خود شما، دوستان شما و حتی خانواده شما را به شما یادآوری نمایید"
),
},
{
icon: packageIcon,
backgroundColor: "#FFC4EB",
color: "#930362",
title: "پکیج های آموزشی ",
text: "همه پایه های تحصیلی باید توسط کاربران انتخاب شود تا به آنها اینکار را یادآوری نماید",
title: window.t("پکیج های آموزشی"),
text: window.t(
"همه پایه های تحصیلی باید توسط کاربران انتخاب شود تا به آنها اینکار را یادآوری نماید"
),
},
],
};

@ -8,10 +8,10 @@ function GradiantText() {
style={{ background: `url(${phraseImage})` }}
>
<h2 className="text-3xl font-extrabold text-transparent bg-clip-text bg-gradient-to-br from-blue-900 to-blue-300">
یادگیری بدون وقفه
{window.t("یادگیری بدون وقفه ")}
</h2>
<h2 className="text-3xl font-extrabold text-transparent bg-clip-text bg-gradient-to-br from-blue-300 to-blue-900">
لذت یادگیری هوشمند
{window.t("لذت یادگیری هوشمند ")}
</h2>
</div>
);

@ -68,30 +68,35 @@ function Header({ list }) {
to="/products"
className="flex items-center text-white text-tiny bg-blueC0 px-4 py-3 rounded-md backdrop-filter backdrop-blur-md mt-5 self-end"
>
ورود به فروشگاه
{window.t("ورود به فروشگاه")}
</Link>
</div>
<div className="flex flex-col items-center text-center font-extrabold text-blue5F dark:text-gray-300 text-2xl mt-3 transform translate-y-4">
<div className="flex flex-row">
<div className="relative">
<h1 className="inline z-20 pb-1">یادگیری &nbsp;</h1>
<h1 className="inline z-20 pb-1">
{window.t("یادگیری")}
&nbsp;
</h1>
<span className="h-1 w-full absolute bottom-0 z-10 left-0 bg-yellow3"></span>
</div>
<h1 className="inline">با طعم لذت</h1>
<h1 className="inline"> {window.t("با طعم لذت")}</h1>
</div>
<div className="flex my-1.5">
<h1 className="inline">از اول تا یازدهم &nbsp;</h1>
<div className="flex flex-row my-1.5">
<h1 className="inline">{window.t("از اول تا یازدهم")}&nbsp;</h1>
<div className="relative">
<h1 className="inline z-20 pb-1">کنارتونیم</h1>
<h1 className="inline z-20 pb-1">{window.t("کنارتونیم")}</h1>
<span className="h-1 w-full absolute bottom-0 left-0 bg-orange1"></span>
</div>
</div>
<div className="flex flex-row">
<div className="relative">
<h1 className="inline z-20 pb-1">یادگیری جذاب &nbsp;</h1>
<h1 className="inline z-20 pb-1">
{window.t("یادگیری جذاب")}&nbsp;
</h1>
<span className="h-1 w-full absolute bottom-0 left-0 bg-green1"></span>
</div>
<h1 className="inline">و تعاملی</h1>
<h1 className="inline">و {window.t("تعاملی")} </h1>
</div>
</div>
<div className="w-full p-4 transform translate-y-1/3 relative">
@ -111,31 +116,37 @@ export default Header;
Header.defaultProps = {
list: [
{
name: "زیست یازدهم",
name: window.t("زیست یازدهم"),
imageUrl: zist11Image,
},
{
name: "علوم دوم",
name: window.t("علوم دوم"),
imageUrl: olum2Image,
},
{
name: "علوم اول",
name: window.t("علوم اول"),
imageUrl: olum1Image,
},
{
name: "علوم هفتم",
name: window.t("علوم هفتم"),
imageUrl: olum7Image,
},
{
name: "علوم چهارم",
name: window.t("علوم چهارم"),
imageUrl: olum4Image,
},
{
name: "علوم چهارم",
name: window.t("علوم چهارم"),
imageUrl: olum4Image,
},
{
name: "علوم چهارم",
name: window.t("علوم چهارم"),
imageUrl: olum4Image,
},
],

@ -26,7 +26,10 @@ const Platform = ({ platform }) => {
<strong className="text-sm" style={{ color: platform.titleColor }}>
{platform.title}
</strong>
<p className="text-xs leading-5 mt-2" style={{ color: platform.textColor }}>
<p
className="text-xs leading-5 mt-2"
style={{ color: platform.textColor }}
>
{platform.text}
</p>
</div>
@ -43,8 +46,10 @@ Platforms.defaultProps = {
textColor: "#00366B",
titleColor: "#1072DC",
borderColor: "#196EC044",
title: "استفاده از تکنولوژی واقعیت افزوده",
text: "با استفاده از این تکنولوژی شما پس از نصب اپلیکیشن ما و گرفتن گوشیتون روی محتوای ویدئویی کتاب فیلم رو داخل گوشیتون ببینید",
title: window.t("استفاده از تکنولوژی واقعیت افزوده"),
text: window.t(
"با استفاده از این تکنولوژی شما پس از نصب اپلیکیشن ما و گرفتن گوشیتون روی محتوای ویدئویی کتاب فیلم رو داخل گوشیتون ببینید"
),
icon: arBlue,
},
{
@ -52,8 +57,10 @@ Platforms.defaultProps = {
textColor: "#0B5900",
titleColor: "#118A00",
borderColor: "#118A0044",
title: "محتوای قابل دریافت باحال و جذاب",
text: "تقریبا بالا گوشه هر صفحه از کتاب ما یک کد کیو آر براتون گذاشتیم که با اسکن کد شما میتونید محتویات ضمیمه شده اون رو ببینید",
title: window.t("محتوای قابل دریافت باحال و جذاب"),
text: window.t(
"تقریبا بالا گوشه هر صفحه از کتاب ما یک کد کیو آر براتون گذاشتیم که با اسکن کد شما میتونید محتویات ضمیمه شده اون رو ببینید"
),
icon: qrGreen,
},
],

@ -9,33 +9,42 @@ function Responsive() {
background: `url(${emc2Image})`,
backgroundRepeat: "no-repeat",
backgroundPosition: "0px 0px",
}}
>
<div className="flex flex-col items-center text-center font-extrabold text-blue5F dark:text-gray-300 text-lg mt-3 transform translate-y-4">
<div className="flex ">
<h1 className="inline z-50">
از طریق موبایل یا کامپیوتر میتونی
{window.t("از طریق موبایل یا کامپیوتر میتونی")}
</h1>
</div>
<div className="flex my-1.5">
<div className="relative">
<h1 className="inline z-50 pb-1">به محتوای دیجیتال &nbsp;</h1>
<h1 className="inline z-50 pb-1">
{window.t("به محتوای دیجیتال")}
&nbsp;
</h1>
<span className="h-1 w-full absolute bottom-0 left-0 bg-green1"></span>
</div>
<h1 className="inline">کتابها به راحتی</h1>
<h1 className="inline">{window.t("کتابها به راحتی")}</h1>
</div>
<div className="flex flex-row">
<h1 className="inline"> دسترسی داشته باشی</h1>
<h1 className="inline">
{window.t("کتابها به راحتی")}
</h1>
</div>
</div>
<div className="w-full relative mt-16" style={{ height : 'calc(100vh / 4)' }}>
<div className="absolute left-0 bottom-0 rounded-md bg-grayE3" style={{ height : 'calc(100vh / 4)', width : 'calc(100vw / 1.2)' }}>
</div>
<div className="absolute right-0 bottom-0 rounded-md bg-gray-300" style={{ height : 'calc(100vh / 6.2)', width : 'calc(100vw / 6)' }}>
</div>
<div
className="w-full relative mt-16"
style={{ height: "calc(100vh / 4)" }}
>
<div
className="absolute left-0 bottom-0 rounded-md bg-grayE3"
style={{ height: "calc(100vh / 4)", width: "calc(100vw / 1.2)" }}
></div>
<div
className="absolute right-0 bottom-0 rounded-md bg-gray-300"
style={{ height: "calc(100vh / 6.2)", width: "calc(100vw / 6)" }}
></div>
</div>
</div>
);

@ -11,16 +11,24 @@ export default function Book({ book }) {
style={{ width: 60, height: 90 }}
/>
<div className="flex flex-col mr-2">
<strong className="text-xs text-blueC0 dark:text-white lg:text-tiny">علوم اجتماعی</strong>
<span className="mt-4 text-xs lg:text-sm text-gray70 dark:text-greenBA">پایه دوم</span>
<span className="mt-2 text-xs lg:text-sm text-gray70 dark:text-white">نسخه دیجیتال</span>
<strong className="text-xs text-blueC0 dark:text-white lg:text-tiny">
{window.t("علوم اجتماعی")}
</strong>
<span className="mt-4 text-xs lg:text-sm text-gray70 dark:text-greenBA">
{window.t("پایه دوم")}
</span>
<span className="mt-2 text-xs lg:text-sm text-gray70 dark:text-white">
{window.t("نسخه دیجیتال")}
</span>
</div>
</div>
<div className="flex items-center">
<span className="py-1 px-2 rounded-sm text-green4F2 text-sm lg:text-base bg-grayF9 dark:bg-gray-500 dark:text-white">
1
</span>
<div className="mr-3 text-blueC0 text-xs lg:text-base dark:text-white">126.000 تومان</div>
<div className="mr-3 text-blueC0 text-xs lg:text-base dark:text-white">
126.000 {window.t("تومان")}
</div>
</div>
</div>
);

@ -1,7 +1,7 @@
import React, { useEffect } from "react";
import Book from "./components/Book";
import { connect } from "react-redux";
import {publicApi} from '../../redux/actions';
import { publicApi } from "../../redux/actions";
import b1Image from "./assets/b1.png";
import _ from "lodash";
@ -13,21 +13,21 @@ const colors = {
};
const status = {
1: "در حال پردازش",
4: "درخواست رد شد",
3: "تکمیل شد",
2: "ارسال شده",
1: window.t("در حال پردازش"),
4: window.t("درخواست رد شد"),
3: window.t("تکمیل شد"),
2: window.t("ارسال شده"),
};
function OrderDetails({ order, setHeaderOptions, headerOptions }) {
useEffect(() => {
setHeaderOptions(headerOptions);
},[]);
}, []);
return (
<div className="px-4 flex flex-col py-5 lg:pt-24 lg:w-3/5 lg:mx-auto">
<div className="flex w-full justify-between items-center p-3 bg-blueC0 bg-opacity-10 rounded-t-md dark:bg-blueC0 dark:bg-opacity-10">
<strong className="font-medium text-sm lg:text-tiny text-blue52 dark:text-white">
{_.join(["شماره سفارش:", order.number], " ")}
{_.join([window.t("شماره سفارش:"), order.number], " ")}
</strong>
<div className="flex items-center">
<span className="text-xs lg:text-tiny font-light text-blue52 dark:text-white">
@ -39,21 +39,27 @@ function OrderDetails({ order, setHeaderOptions, headerOptions }) {
></div>
</div>
</div>
<div className="w-full flex items-center py-4 border-b border-solid border-blueFF1 dark:border-gray45">
<strong className="text-xs lg:text-tiny text-green4F dark:text-white">آدرس تحویل:</strong>
<div className="w-full flex flex-row items-center py-4 border-b border-solid border-blueFF1 dark:border-gray45">
<strong className="text-xs lg:text-tiny text-green4F dark:text-white">
{window.t("آدرس تحویل")}:
</strong>
<span className="flex-1 font-light text-right mr-2 text-xs lg:text-tiny text-green4F dark:text-white">
{order.address}
</span>
</div>
<div className="w-full flex justify-between py-0 border-b border-solid border-blueFF1 dark:border-gray45">
<div className="flex py-4">
<strong className="text-xs lg:text-tiny text-green4F dark:text-white">مشخصات تحویل گیرنده:</strong>
<div className="w-full flex flex-row justify-between py-0 border-b border-solid border-blueFF1 dark:border-gray45">
<div className="flex flex-row py-4">
<strong className="text-xs lg:text-tiny text-green4F dark:text-white">
{window.t("مشخصات تحویل گیرنده")}:
</strong>
<span className="flex-1 font-light text-right mr-2 text-xs lg:text-tiny text-green4F dark:text-white">
{order.name}
</span>
</div>
<div className="flex py-4">
<strong className="text-xs lg:text-tiny text-green4F dark:text-white">شماره موبایل:</strong>
<div className="flex flex-row py-4">
<strong className="text-xs lg:text-tiny text-green4F dark:text-white">
{window.t("شماره موبایل:")}
</strong>
<span className="flex-1 font-light text-right mr-2 text-xs lg:text-tiny text-green4F dark:text-white">
{order.cellphone}
</span>
@ -61,10 +67,12 @@ function OrderDetails({ order, setHeaderOptions, headerOptions }) {
</div>
<div className="w-full rounded-md flex flex-col p-4 mt-2 bg-blueC0 bg-opacity-10 dark:bg-blueC0 dark:bg-opacity-20 dark:border-blueC0 dark:border dark:border-solid">
<strong className="text-xs lg:text-tiny text-green4F dark:text-white">
{_.join(["کد تحویل", order.receiveCode], " ")}
{_.join([window.t("کد تحویل:"), order.receiveCode], " ")}
</strong>
<p className="font-light text-right mt-3 text-xs lg:text-sm text-green4F dark:text-white">
این کد را پس از دریافت کالا، به مامور ارسال دانوین اعلام فرمایید
{window.t(
"این کد را پس از دریافت کالا، به مامور ارسال دانوین اعلام فرمایید"
)}
</p>
</div>
<div className="w-full flex flex-col">
@ -72,51 +80,66 @@ function OrderDetails({ order, setHeaderOptions, headerOptions }) {
<Book book={item} key={index} />
))}
</div>
<div className="w-full flex justify-between py-2 border-b border-solid border-blueFF1 dark:border-gray45">
<div className="flex py-4">
<strong className="text-xs lg:text-tiny text-green4F dark:text-white">مبلغ سبد خرید:</strong>
<div className="w-full flex flex-row justify-between py-2 border-b border-solid border-blueFF1 dark:border-gray45">
<div className="flex flex-row py-4">
<strong className="text-xs lg:text-tiny text-green4F dark:text-white">
{window.t("مبلغ سبد خرید:")}
</strong>
<span className="flex-1 font-light text-right mr-2 text-xs lg:text-tiny text-green4F dark:text-white">
{_.join([order.shoppingCardPrice, "تومان"], " ")}
{_.join([order.shoppingCardPrice, window.t("تومان")], " ")}
</span>
</div>
<div className="flex py-4">
<strong className="text-xs lg:text-tiny text-green4F dark:text-white">تخفیف:</strong>
<div className="flex flex-row py-4">
<strong className="text-xs lg:text-tiny text-green4F dark:text-white">
{window.t("تخفیف:")}
</strong>
<span className="flex-1 font-light text-right mr-2 text-xs lg:text-tiny text-green4F dark:text-white">
{_.join([order.discountPrice, "تومان"], " ")}
{_.join([order.discountPrice, window.t("تومان")], " ")}
</span>
</div>
</div>
<div className="w-full flex justify-between py-2 border-b border-solid border-blueFF1 dark:border-gray45">
<div className="flex py-4">
<strong className="text-xs lg:text-tiny text-green4F dark:text-white"> هزینه ارسال کالا:</strong>
<div className="w-full flex flex-row justify-between py-2 border-b border-solid border-blueFF1 dark:border-gray45">
<div className="flex flex-row py-4">
<strong className="text-xs lg:text-tiny text-green4F dark:text-white">
{window.t("هزینه ارسال کالا:")}
</strong>
<span className="flex-1 font-light text-right mr-2 text-xs lg:text-tiny text-green4F dark:text-white">
{_.join([order.sendPrice, "تومان"], " ")}
{_.join([order.sendPrice, window.t("تومان")], " ")}
</span>
</div>
<div className="flex py-4 border">
<strong className="text-xs lg:text-tiny text-green4F dark:text-white">جمع هزینه پرداختی:</strong>
<div className="flex flex-row py-4 border">
<strong className="text-xs lg:text-tiny text-green4F dark:text-white">
{window.t("جمع هزینه پرداختی:")}
</strong>
<span className="flex-1 font-light text-right mr-2 text-xs lg:text-tiny text-green4F dark:text-white">
{_.join([order.totalPrice, "تومان"], " ")}
{_.join([order.totalPrice, window.t("تومان")], " ")}
</span>
</div>
</div>
<div className="w-full flex justify-between py-2 border-b border-solid border-blueFF1 dark:border-gray45">
<div className="flex py-4">
<strong className="text-xs lg:text-tiny text-green4F dark:text-white">نحوه پرداخت:</strong>
<div className="w-full flex flex-row justify-between py-2 border-b border-solid border-blueFF1 dark:border-gray45">
<div className="flex flex-row py-4">
<strong className="text-xs lg:text-tiny text-green4F dark:text-white">
{window.t("نحوه پرداخت:")}
</strong>
<span className="flex-1 font-light text-right mr-2 text-xs lg:text-tiny text-green4F dark:text-white">
{order.payMethod}
</span>
</div>
<div className="flex py-4">
<strong className="text-xs lg:text-tiny text-green4F dark:text-white"> شماره تراکنش:</strong>
<div className="flex flex-row py-4">
<strong className="text-xs lg:text-tiny text-green4F dark:text-white">
{" "}
{window.t("شماره تراکنش:")}
</strong>
<span className="flex-1 font-light text-right mr-2 text-xs lg:text-tiny text-green4F dark:text-white">
{order.transactionNumber}
</span>
</div>
</div>
<div className="w-full flex justify-between py-2">
<div className="w-full flex py-4">
<strong className="text-xs lg:text-tiny text-green4F dark:text-white">تاریخ تحویل:</strong>
<div className="w-full flex flex-row justify-between py-2">
<div className="w-full flex flex-row py-4">
<strong className="text-xs lg:text-tiny text-green4F dark:text-white">
{window.t("تاریخ تحویل:")}
</strong>
<span className="flex-1 font-light text-right mr-2 text-xs lg:text-tiny text-green4F dark:text-white">
{order.date}
</span>
@ -126,13 +149,11 @@ function OrderDetails({ order, setHeaderOptions, headerOptions }) {
);
}
const mapStateToProps = (state) => ({
});
const mapStateToProps = (state) => ({});
const mapDispatchToProps = {
setHeaderOptions: publicApi.setHeaderOptions,
}
};
export default connect(mapStateToProps, mapDispatchToProps)(OrderDetails);
@ -144,15 +165,16 @@ OrderDetails.defaultProps = {
items: [b1Image, b1Image],
date: "1400/1/11",
cost: "1.240.000",
address:
"تهران خیابان انقلاب حدفاصل ابوریحان و فلسطین بن بست سروش پلاک 2 واحد 12 شرقی",
name: "هومن عابدی",
address: window.t(
"تهران خیابان انقلاب حدفاصل ابوریحان و فلسطین بن بست سروش پلاک 2 واحد 12 شرقی"
),
name: window.t("هومن عابدی"),
cellphone: "09121234568",
shoppingCardPrice: "981.000",
discountPrice: "12.000",
sendPrice: "18.000",
totalPrice: "18.000",
payMethod: "حضوری",
payMethod: window.t("حضوری"),
transactionNumber: " BS3194DNB98312",
},
};

@ -12,10 +12,10 @@ const colors = {
};
const status = {
1: "در حال پردازش",
4: "درخواست رد شد",
3: "تکمیل شد",
2: "ارسال شده",
1: window.t("در حال پردازش"),
4: window.t("درخواست رد شد"),
3: window.t("تکمیل شد"),
2: window.t("ارسال شده"),
};
function Order({ order, isMobile }) {
@ -23,7 +23,7 @@ function Order({ order, isMobile }) {
<div className="w-full flex flex-col rounded-md overflow-hidden my-3 border border-solid border-blueC0 border-opacity-50 dark:border-blueC0 dark:border-opacity-10 lg:w-4/5 mx-auto">
<div className="flex w-full justify-between items-center p-3 bg-blueC0 bg-opacity-10 dark:bg-blueC0 dark:bg-opacity-10">
<strong className="font-medium text-sm lg:text-tiny text-green4F dark:text-white">
{_.join(["شماره سفارش:", order.number], " ")}
{_.join([window.t("شماره سفارش:"), order.number], " ")}
</strong>
<div className="flex items-center">
<span className="text-xs lg:text-tiny font-light text-green4F dark:text-white">
@ -48,6 +48,7 @@ function Order({ order, isMobile }) {
width: isMobile ? 60 : 100,
height: isMobile ? 90 : 150,
}}
alt=""
/>
))
: order.items?.slice(0, 1)?.map((item, index) => (
@ -59,6 +60,7 @@ function Order({ order, isMobile }) {
width: isMobile ? 60 : 100,
height: isMobile ? 90 : 150,
}}
alt=""
/>
))}
{isMobile && order.items.length >= 2 && (
@ -78,7 +80,7 @@ function Order({ order, isMobile }) {
fontFamily: "bold",
}}
>
{_.join(["کد تحویل:", order.receiveCode], " ")}
{_.join([window.t("کد تحویل:"), order.receiveCode], " ")}
</div>
</div>
</div>
@ -91,7 +93,7 @@ function Order({ order, isMobile }) {
backgroundColor: "#F0FFF1",
}}
>
{_.join(["کد تحویل:", order.receiveCode], " ")}
{_.join([window.t("کد تحویل:"), order.receiveCode], " ")}
</div>
</div>
<strong
@ -100,21 +102,22 @@ function Order({ order, isMobile }) {
fontFamily: "bold",
}}
>
{_.join(["جمع فاکتور:", order.cost], " ")}
{_.join([window.t("جمع فاکتور:"), order.cost], " ")}
</strong>
<Link
to="/orders/order"
className="rounded-md flex justify-center px-5 py-2.5 border border-solid border-blueC0 text-green4F bg-blueC0 bg-opacity-10"
>
جزئیات سفارش
{window.t("جزئیات سفارش")}
<img
src={leftArrowIcon}
style={{ width: 18 }}
className="transform rotate-90"
alt=""
/>
</Link>
<span className="my-5 text-xs text-blue52 font-light dark:text-white lg:hidden">
{_.join(["تاریخ سفارش:", order.date], " ")}
{_.join([window.t("تاریخ سفارش:"), order.date], " ")}
</span>
</div>
</div>

@ -27,7 +27,9 @@ export default Comment;
Comment.defaultProps = {
comment: {
name: "سورنا عابدی",
text: "خالد حسینی تو رمان باد بادک باز مینویسه : ﻣﺮﺩ ﺁﻫﺴﺘﻪ ﺩﺭ ﮔﻮﺵ ﻓﺮﺯﻧﺪ ﺗﺎﺯﻩ ﺑﻪ ﺑﻠﻮﻍ ﺭﺳﯿﺪﻩ ﺍﺵ ﺑﺮﺍﯼ ﭘﻨﺪ ﭼﻨﯿﻦ ﻧﺠﻮﺍ ﮐﺮﺩ : ” ﭘﺴﺮﻡ ﺩﺭ ﺯﻧﺪﮔﯽ ﻫﺮﮔﺰ ﺩﺯﺩﯼ ﻧﮑﻦ ” ﭘﺴﺮ ﻣﺘﻌﺠﺐ ﻭ ﻣﺒﻬﻮﺕ ﺑﻪ ﭘﺪﺭ ﻧﮕﺎﻩ ﮐﺮﺩ ﺑﺪﯾﻦ ﻣﻌﻨﺎ ﮐﻪ ﺍﻭ ﻫﺮﮔﺰ ﺩﺳﺖ ﮐﺞ ﻧﺪﺍﺷﺘﻪ ﭘﺪﺭ ﺑﻪ ﻧﮕﺎﻩ ﻣﺘﻌﺠﺐ ﻓﺮﺯﻧﺪ ﻟﺒﺨﻨﺪﯼ ﺯﺩ ﻭ ﺍﺩﺍﻣﻪ ",
name: window.t("سورنا عابدی"),
text: window.t(
"خالد حسینی تو رمان باد بادک باز مینویسه : ﻣﺮﺩ ﺁﻫﺴﺘﻪ ﺩﺭ ﮔﻮﺵ ﻓﺮﺯﻧﺪ ﺗﺎﺯﻩ ﺑﻪ ﺑﻠﻮﻍ ﺭﺳﯿﺪﻩ ﺍﺵ ﺑﺮﺍﯼ ﭘﻨﺪ ﭼﻨﯿﻦ ﻧﺠﻮﺍ ﮐﺮﺩ : ” ﭘﺴﺮﻡ ﺩﺭ ﺯﻧﺪﮔﯽ ﻫﺮﮔﺰ ﺩﺯﺩﯼ ﻧﮑﻦ ” ﭘﺴﺮ ﻣﺘﻌﺠﺐ ﻭ ﻣﺒﻬﻮﺕ ﺑﻪ ﭘﺪﺭ ﻧﮕﺎﻩ ﮐﺮﺩ ﺑﺪﯾﻦ ﻣﻌﻨﺎ ﮐﻪ ﺍﻭ ﻫﺮﮔﺰ ﺩﺳﺖ ﮐﺞ ﻧﺪﺍﺷﺘﻪ ﭘﺪﺭ ﺑﻪ ﻧﮕﺎﻩ ﻣﺘﻌﺠﺐ ﻓﺮﺯﻧﺪ ﻟﺒﺨﻨﺪﯼ ﺯﺩ ﻭ ﺍﺩﺍﻣﻪ"
),
},
};

@ -66,8 +66,9 @@ export const ProductOverAll = ({
<div className="flex justify-end items-center">
<div className="p-2">
<StarRating value={physicalProduct?.rate} />
<StarRating value={book?.rate || 4} />
</div>
{physicalProduct?.suggestedCounter ? (
<div className="p-2 border-0 border-solid border-r border-gray-100 text-sm text-gray-400">
بیش از {physicalProduct?.suggestedCounter} نفر امتیاز داده اند
@ -77,14 +78,14 @@ export const ProductOverAll = ({
</div>
<div className="py-4">
<div className="w-full flex items-center pb-2">
<h1 className="text-base font-bold">نوع کتاب</h1>
<h1 className="text-base font-bold">{window.t("نوع کتاب")}</h1>
<p className=" text-xs px-4 text-blueC0">
به من کمک کن انتخاب کنم
{window.t("به من کمک کن انتخاب کنم")}
</p>
</div>
<div className="w-full flex justify-between items-center mt-4 gap-5">
<Button
title="نسخه فیزیکی"
title={window.t("نسخه فیزیکی")}
backgroundColor={isDark ? "bg-transparent" : "bg-white"}
border={{
color: isDark ? "#ffffff55" : "#aaa",
@ -101,7 +102,7 @@ export const ProductOverAll = ({
radius={false}
/>
<Button
title="نسخه دیجیتال"
title={window.t("نسخه دیجیتال")}
backgroundColor={isDark ? "bg-transparent" : "bg-white"}
border={{
color: isDark ? "#ffffff55" : "#196EC055",
@ -120,7 +121,7 @@ export const ProductOverAll = ({
href={`https://dnvn.ir/xpdf/${book?.sampleFileId}`}
className="flex-1 py-4 text-sm border border-solid border-red19 rounded-md font-bold text-red19 text-center"
>
مشاهده نمونه
{window.t("مشاهده نمونه")}
</a>
{/* <Button
title="مشاهده نمونه"
@ -143,7 +144,7 @@ export const ProductOverAll = ({
to={"/videos/" + book?.id}
className="bg-blueC0 text-green7B bg-opacity-5 font-semibold text-tiny rounded-md border border-solid border-blueC0 w-2/3 py-4 text-center flex items-center justify-center"
>
مشاهده دوره ویدیویی این محصول
{window.t("مشاهده دوره ویدیویی این محصول")}
<img
src={arrow}
alt=""
@ -170,21 +171,23 @@ export const ProductOverAll = ({
tabs={[
{
title: "مشخصات",
components: <Table specifications={physicalProduct?.properties} />,
components: (
<Table specifications={physicalProduct?.properties} />
),
},
{
title: "نقد و بررسی",
title: window.t("نقد و بررسی"),
components: (
<div className="bg-gray-100 rounded-md mt-4 w-full flex justify-center items-center h-40 text-green4F text-tiny">
این بخش فعلا قابل دسترسی نیست.
{window.t("این بخش فعلا قابل دسترسی نیست.")}
</div>
),
},
{
title: "پرسش و پاسخ",
title: window.t("پرسش و پاسخ"),
components: (
<div className="bg-gray-100 rounded-md mt-4 w-full flex justify-center items-center h-40 text-green4F text-tiny">
این بخش فعلا قابل دسترسی نیست.
{window.t(" این بخش فعلا قابل دسترسی نیست.")}
</div>
),
},

@ -27,9 +27,9 @@ const DesktopProductLayout = ({ physicalProduct, rate }) => {
/>
</div>
<div className="w-4/5 ">
<Comments indent={false} />
{/* <Comments indent={false} /> */}
<Comment />
<QandA />
{/* <QandA /> */}
</div>
</div>
);

@ -5,107 +5,48 @@ import separate from "../../../utils/separate";
import StarRating from "../../../components/StarRating";
import Progress from "../../../components/Progress";
function Rate({ desktop, productId, rateDetail }) {
const fiveCount = React.useMemo(() => {
return rateDetail?.find((rate) => rate?.rate === 5);
}, [rateDetail]);
const fourCount = React.useMemo(() => {
return rateDetail?.find((rate) => rate?.rate === 4);
}, [rateDetail]);
const threeCount = React.useMemo(() => {
return rateDetail?.find((rate) => rate?.rate === 3);
}, [rateDetail]);
const twoCount = React.useMemo(() => {
return rateDetail?.find((rate) => rate?.rate === 2);
}, [rateDetail]);
const oneCount = React.useMemo(() => {
return rateDetail?.find((rate) => rate?.rate === 1);
}, [rateDetail]);
const allCount = React.useMemo(() => {
return rateDetail?.reduce((a, b) => a + b?.count, 0);
}, [rateDetail]);
const rate = React.useMemo(() => {
return rateDetail?.length
? ((oneCount?.count || 0) * 1 +
(twoCount?.count || 0) * 2 +
(threeCount?.count || 0) * 3 +
(fourCount?.count || 0) * 4 +
(fiveCount?.count || 0) * 5) /
rateDetail?.length
: 0;
}, [rateDetail]);
function Rate({ avarage, all, fields, desktop }) {
return (
<div className="w-full flex justify-between items-center mt-5">
<div className="flex flex-col items-center justify-center h-full ml-4">
{desktop ? (
<h1 className={`text-gray-600 mb-2 font-bold dark:text-white`}>
{rate || " "}
{avarage}
</h1>
) : (
<strong
className={`text-blue5F mb-2 font-bold dark:text-white`}
style={{ fontSize: "calc(100vw / 10)" }}
>
{rate || " "}
{avarage}
</strong>
)}
<div className="">
<StarRating value={rate} />
<StarRating />
</div>
{allCount ? (
<span className="text-base text-gray70 mt-2 dark:text-white">
{" "}
{`از بین ${allCount} نفر`}
</span>
) : null}
<span className="text-base text-gray70 mt-2 dark:text-white">
{separate(all)}
</span>
</div>
<ul className="p-0 m-0 list-none flex flex-col flex-1">
{[
{
name: "یک ستاره",
value: ((oneCount?.count || 0) / allCount) * 100,
},
{
name: "دو ستاره",
value: ((twoCount?.count || 0) / allCount) * 100,
},
{
name: "سه ستاره",
value: ((threeCount?.count || 0) / allCount) * 100,
},
{
name: "چهار ستاره",
value: ((fourCount?.count || 0) / allCount) * 100,
},
{
name: "پنج ستاره",
value: ((fiveCount?.count || 0) / allCount) * 100,
},
].map((item, index) => (
{fields.map((item, index) => (
<li
key={index}
className="w-full flex flex-row-reverse items-center justify-between"
>
<span className="mr-2 text-xs text-blue5F dark:text-white">
{item.name || " "}
{item.name}
</span>
{desktop ? (
<Progress deskTop percent={item.value} />
<Progress deskTop percent={item.percent} />
) : (
<Progress percent={item.value} />
<Progress percent={item.percent} />
)}
{item?.value ? (
<span className="ml-2 text-xs text-blue5F dark:text-white">
{item.value + "%"}
</span>
) : null}
<span className="ml-2 text-xs text-blue5F dark:text-white">
{item.percent + "%"}
</span>
</li>
))}
</ul>
@ -114,3 +55,30 @@ function Rate({ desktop, productId, rateDetail }) {
}
export default Rate;
Rate.defaultProps = {
avarage: 4.8,
all: 4780,
fields: [
{
name: window.t("5 ستاره"),
percent: 49,
},
{
name: window.t("4 ستاره"),
percent: 31,
},
{
name: window.t("3 ستاره"),
percent: 9,
},
{
name: window.t("2 ستاره"),
percent: 5,
},
{
name: window.t("1 ستاره"),
percent: 6,
},
],
};

@ -138,7 +138,7 @@ export const Product = ({
{book?.name}
</h1>
<div className="text-green7B text-tiny dark:text-greenBA">
{"پایه" + " " + grades[book?.gradeId]}
{window.t("پایه") + " " + grades[book?.gradeId]}
</div>
</div>
</header>
@ -147,13 +147,15 @@ export const Product = ({
style={{ direction: "ltr" }}
>
<li className="border-solid border-blueFE flex-1 flex-shrink-0 text-center text-tiny leading-5 font-medium text-green7B dark:text-white">
{book?.pagesNum} <br /> صفحه
{book?.pagesNum} <br /> {window.t("صفحه")}
</li>
<li className="border-solid border-blueFE flex-1 flex-shrink-0 text-center text-tiny leading-5 font-medium text-green7B dark:text-white">
<span>{videoAvailableForSell ? "ویدئویی - " : ""}</span>
<span>{digitalAvailableForSell ? "دیجیتال - " : ""}</span>
<span>{physicalAvailableForSell ? "فیزیکی" : ""}</span>
<br /> در دسترس
{window.t("فیزیکی - دیجیتالی")}
<br /> {window.t("در دسترس")}
</li>
<li className="border-solid border-blueFE flex-1 flex-shrink-0 text-center text-tiny leading-5 font-medium text-green7B dark:text-white">
{book?.rate} <br />
{window.t("امتیاز")}
</li>
{book?.rate ? (
<li className="border-solid border-blueFE flex-1 flex-shrink-0 text-center text-tiny leading-5 font-medium text-green7B dark:text-white">
@ -162,151 +164,76 @@ export const Product = ({
) : null}
</ul>
<h2 className="text-green7B text-base font-semibold mt-10 dark:text-greenBA">
نسخه محصول را انتخاب کنید
{window.t("نسخه محصول را انتخاب کنید")}
</h2>
{physicalProduct && physicalAvailableForSell ? (
<div className="w-full flex justify-between items-center mt-5 gap-2">
<ButtonBetween
width="72%"
item={"خرید نسخه فیزیکی کتاب"}
status={separate(physicalProduct?.price) + " " + "تومان"}
onClick={() => {
if (userId) {
if (physicalAvailabileInCart) {
setDialog({
text: window.t(
"این محصول قبلا به سبد خرید شما اضافه شده است."
),
type: "confirm",
accept: () => navigation("/cart"),
open: true,
});
} else {
setWhichTypeAdded("physical");
pushToCart({
productId: physicalProduct?.id,
userId: userId,
count: 1,
});
}
} else {
setDialog({
text: window.t(
"ابتدا میبایست وارد حساب کاربری خود شوید."
),
type: "confirm",
accept: () => navigation("/login"),
open: true,
});
}
}}
loading={userProductLoading && whichTypeAdded === "physical"}
/>
<a
href={`https://dnvn.ir/xpdf/${book?.sampleFileId}`}
className="flex-1 border-2 border-solid text-sm border-green-500 bg-green-50 bg-opacity-70 rounded-sm font-bold text-green-700 text-center"
style={{ padding: "18px 0px" }}
>
مشاهده نمونه
</a>
</div>
) : null}
{digitalProduct && digitalAvailableForSell ? (
<div className="w-full flex justify-between items-center mt-4 gap-2">
<ButtonBetween
width="72%"
item={"خرید نسخه دیجیتال کتاب"}
status={separate(digitalProduct?.price) + " " + "تومان"}
onClick={() => {
if (userId) {
if (digitalAvailabileInCart) {
setDialog({
text: window.t(
"این محصول قبلا به سبد خرید شما اضافه شده است."
),
type: "confirm",
accept: () => navigation("/cart"),
open: true,
});
} else {
setWhichTypeAdded("digital");
pushToCart({
productId: digitalProduct?.id,
userId: userId,
count: 1,
});
}
} else {
setDialog({
text: window.t(
"ابتدا میبایست وارد حساب کاربری خود شوید."
),
type: "confirm",
accept: () => navigation("/login"),
open: true,
});
}
}}
loading={userProductLoading && whichTypeAdded === "digital"}
/>
<a
href={`https://dnvn.ir/xpdf/${book?.sampleFileId}`}
className="flex-1 border-2 border-solid text-sm border-green-500 bg-green-50 bg-opacity-70 rounded-sm font-bold text-green-700 text-center"
style={{ padding: "18px 0px" }}
>
مشاهده نمونه
</a>
</div>
) : null}
{videoProduct && videoAvailableForSell ? (
<div className="w-full flex justify-between items-center mt-4">
<ButtonBetween
width="72%"
item={"خرید نسخه ویدئویی کتاب"}
status={separate(videoProduct?.price) + " " + "تومان"}
onClick={() => {
if (userId) {
if (videoAvailabileInCart) {
setDialog({
text: window.t(
"این محصول قبلا به سبد خرید شما اضافه شده است."
),
type: "confirm",
accept: () => navigation("/cart"),
open: true,
});
} else {
setWhichTypeAdded("video");
pushToCart({
productId: videoProduct?.id,
userId: userId,
count: 1,
});
}
} else {
setDialog({
text: window.t(
"ابتدا میبایست وارد حساب کاربری خود شوید."
),
type: "confirm",
accept: () => navigation("/login"),
open: true,
});
}
}}
loading={userProductLoading && whichTypeAdded === "video"}
/>
<ButtonBetween
width="25%"
item={"پیش نمایش"}
onClick={() => navigation("/videos/" + book?.id)}
/>
</div>
) : null}
<div className="w-full flex flex-row justify-between items-center mt-5">
<ButtonBetween
width="100%"
item={window.t("خرید نسخه فیزیکی کتاب")}
status={
separate(book?.product[1]?.price) + " " + window.t("تومان")
}
onClick={() =>
userId
? pushToCart({
productId: book?.product[1]?.id,
userId,
count: 1,
})
: toast.info(window.t("ابتدا وارد حساب کاربری خود شوید"))
}
/>
</div>
<div className="w-full flex flex-row justify-between items-center mt-4 gap-2">
<ButtonBetween
width="72%"
item={window.t("خرید نسخه دیجیتال کتاب")}
status={
separate(book?.product[0]?.price) + " " + window.t("تومان")
}
onClick={() =>
userId
? pushToCart({
productId: book?.product[0]?.id,
userId,
count: 1,
})
: toast.info(window.t("ابتدا وارد حساب کاربری خود شوید."))
}
/>
<a
href={`https://dnvn.ir/xpdf/${book?.sampleFileId}`}
className="flex-1 border-2 border-solid text-sm border-green-500 bg-green-50 bg-opacity-70 rounded-sm font-bold text-green-700 text-center"
style={{ padding: "18px 0px" }}
>
{window.t("مشاهده نمونه")}
</a>
</div>
<div className="w-full flex flex-row justify-between items-center mt-4">
<ButtonBetween
width="72%"
item={window.t("خرید نسخه ویدئویی کتاب")}
status={
separate(book?.product[2]?.price) + " " + window.t("تومان")
}
onClick={() =>
userId
? pushToCart({
productId: book?.product[2]?.id,
userId,
count: 1,
})
: toast.info(window.t("ابتدا وارد حساب کاربری خود شوید."))
}
/>
<ButtonBetween
width="25%"
item={window.t("پیش نمایش")}
onClick={() => navigation("/videos/" + book?.id)}
/>
</div>
<div className="w-full flex flex-col justify-between items-center mt-8">
<Header title="توضیحات" link="#" />
<Header title={window.t("توضیحات")} link="#" />
<p className="text-sm text-gray70 mt-2 dark:text-white leading-6">
خالد حسینی تو رمان باد بادک باز مینویسه : ﻣﺮﺩ ﺁﻫﺴﺘﻪ ﺩﺭ ﮔﻮﺵ ﻓﺮﺯﻧﺪ
ﺗﺎﺯﻩ ﺑﻪ ﺑﻠﻮﻍ ﺭﺳﯿﺪﻩ ﺍﺵ ﺑﺮﺍﯼ ﭘﻨﺪ ﭼﻨﯿﻦ ﻧﺠﻮﺍ ﮐﺮﺩ : ﭘﺴﺮﻡ ﺩﺭ ﺯﻧﺪﮔﯽ
@ -315,16 +242,12 @@ export const Product = ({
ﺩﺭ ﺯﻧﺪﮔﯽ ﺩﺭﻭﻍ ﻧﮕﻮ ﭼﺮﺍ ﮐﻪ ﺍﮔﺮ ﮔﻔﺘﯽ ﺻﺪﺍﻗﺖ ﺭﺍ ﺩﺯﺩﯾﺪﻩ ﺍﯼ، ﺧﯿﺎﻧﺖ ﻧﮑﻦ ﮐﻪ
ﺍﮔﺮ ﮐﺮﺩﯼ ﻋﺸﻖ ﺭﺍ ﺩﺯﺩﯾﺪﻩ ﺍﯼ، ﺧﺸﻮﻧﺖ ﻧﮑﻦ ﺍﮔﺮ ﮐﺮﺩﯼ ﻣﺤﺒﺖ ﺭﺍ ﺩﺯﺩﯾﺪﻩ ﺍﯼ،
ﻧﺎ ﺣﻖ ﻧﮕﻮ ﺍﮔﺮ ﮔﻔﺘﯽ ﺣﻖ ﺭﺍ ﺩﺯﺩﯾﺪﻩ ﺍﯼ، ﺑﯽ ﺣﯿﺎﯾﯽ ﻧﮑﻦ ﺍﮔﺮ ﮐﺮﺩﯼ ﺷﺮﺍﻓﺖ ﺭﺍ
ﺩﺯﺩﯾﺪﻩ ﺍی... ﭘﺲ ﺩﺭ ﺯﻧﺪﮔﯽ ﻓﻘﻂ ﺩﺯﺩﯼ نکن{" "}
ﺩﺯﺩﯾﺪﻩ ﺍی... ﭘﺲ ﺩﺭ ﺯﻧﺪﮔﯽ ﻓﻘﻂ ﺩﺯﺩﯼ نکن
</p>
</div>
<div className="w-full flex flex-col justify-between items-center mt-10">
<Header title="امتیازات و نظرات" link="#" />
<Rate
value={book?.rate || 0}
productId={physicalProduct?.id}
rateDetail={physicalProduct?.rateDetail}
/>
<Header title={window.t("امتیازات و نظرات")} link="#" />
<Rate value={book?.rate || 0} />
</div>
<div
className="flex w-full pb-4 mt-10 no-scrollbar"

@ -68,19 +68,19 @@ export const Main = ({
byAvailableFilter = bySubjectFilter;
}
if (sort) {
if (sort === "ارزان ترین") {
if (sort === window.t("ارزان ترین")) {
bySortFilter = byAvailableFilter?.sort(
(a, b) =>
a.product?.find((product) => product?.productType === type)?.price -
b.product?.find((product) => product?.productType === type)?.price
);
} else if (sort === "محبوب ترین") {
} else if (sort === window.t("محبوب ترین")) {
bySortFilter = byAvailableFilter?.sort(
(a, b) =>
a.product?.find((product) => product?.productType === type)?.rate -
b.product?.find((product) => product?.productType === type)?.rate
);
} else if (sort === "جدیدترین") {
} else if (sort === window.t("جدیدترین")) {
bySortFilter = byAvailableFilter?.sort(
(a, b) => moment(a.createdAt) - moment(b.createdAt)
);
@ -174,7 +174,7 @@ export const Main = ({
</g>
</svg>
<span className="text-tiny text-greenBA font-bold">
{"مرتب سازی" + "" + ":"}
{window.t("مرتب سازی") + "" + ":"}
</span>
</div>
<ul className="flex py-0 flex-1 gap-4">

@ -116,7 +116,7 @@ export const Sidebar = ({
}}
>
<div className="flex justify-between items-center mb-10">
<strong className="text-lg text-green4F">فیلترها</strong>
<strong className="text-lg text-green4F">{window.t("فیلترها")}</strong>
{filterLength > 0 && (
<span
className="text-tiny text-greenBA bg-greenBA bg-opacity-20 rounded-full px-3 py-2"
@ -130,30 +130,30 @@ export const Sidebar = ({
})
}
>
{filterLength + " " + "فیلتر"}
{filterLength + " " + window.t("فیلتر")}
</span>
)}
</div>
<div className="flex flex-col divide-y divide-solid divide-gray-200">
<Dropdown
list={productTypes}
title="نوع محصول"
title={window.t("نوع محصول")}
name="productType"
active={filterOptions.productType}
/>
<Dropdown
list={Object.values(levels)}
title={"پایه تحصیلی"}
title={window.t("پایه تحصیلی")}
name="grade"
active={filterOptions.grade}
/>
<Dropdown
list={subjects}
title={"عنوان کتاب"}
title={window.t("عنوان کتاب")}
name="subject"
active={filterOptions.subject}
/>
<CkeckItem title="فقط کالاهای موجود" name={"available"} />
<CkeckItem title={window.t("فقط کالاهای موجود")} name={"available"} />
</div>
</div>
);

@ -37,7 +37,7 @@ export const Header = ({
borderColor="border-grayDB dark:border-gray45"
backgroundColor="bg-gray-100"
onChange={(name, value) =>
value === "نوع محصول"
value === window.t("نوع محصول")
? setFilterOptions({ ...filterOptions, [name]: null })
: setFilterOptions({ ...filterOptions, [name]: value })
}
@ -50,7 +50,7 @@ export const Header = ({
borderColor="border-grayDB dark:border-gray45"
backgroundColor="bg-gray-100"
onChange={(name, value) =>
value === "پایه تحصیلی"
value === window.t("پایه تحصیلی")
? setFilterOptions({ ...filterOptions, [name]: null })
: setFilterOptions({ ...filterOptions, [name]: value })
}

@ -55,7 +55,7 @@ export const Main = ({ books, filterOptions, grades }) => {
bySearchFilter = byAvailableFilter;
}
return filterOptions.productType === "دوره ویدئویی"
return filterOptions.productType === window.t("دوره ویدئویی")
? bySearchFilter?.map((product, index) => (
<Link
to={"/videos/" + product?.id}
@ -81,16 +81,18 @@ export const Main = ({ books, filterOptions, grades }) => {
{product?.name}
</strong>
<span className="text-tiny lg:text-sm text-green7B dark:text-greenBA font-light mb-4">
{"پایه" + " " + grades[product?.gradeId]}
{window.t("پایه") + " " + grades[product?.gradeId]}
</span>
<div className="w-full flex justify-center font-bold lg:font-medium text-lg lg:text-tiny text-blue5F dark:text-white">
{product?.product[2]?.price + " " + "تومان"}
<div className="w-full flex flex-row justify-center font-bold lg:font-medium text-lg lg:text-tiny text-blue5F dark:text-white">
{product?.product[2]?.price + " " + window.t("تومان")}
</div>
</Link>
))
: bySearchFilter?.map((product) => (
<>
{(productType ? productType === "کتاب دیجیتال" : true) && (
{(productType
? productType === window.t("کتاب دیجیتال")
: true) && (
<Link
key={product?.product[0]?.id}
to={"/products/" + product?.id}
@ -101,17 +103,17 @@ export const Main = ({ books, filterOptions, grades }) => {
className="w-full rounded-md mb-3 object-contain"
/>
<strong className="text-blue5F dark:text-white text-tiny font-bold lg:text-sm lg:font-medium mb-2">
{"کتاب دیجیتال" + " " + product?.name}
{window.t("کتاب دیجیتال") + " " + product?.name}
</strong>
<span className="text-tiny lg:text-xs text-green7B dark:text-greenBA font-light mb-4">
{"پایه" + " " + grades[product?.gradeId]}
{window.t("پایه") + " " + grades[product?.gradeId]}
</span>
<div className="w-full flex justify-center font-bold lg:font-medium text-lg lg:text-sm text-blue5F dark:text-white">
{product?.product[0]?.price + " " + "تومان"}
<div className="w-full flex flex-row justify-center font-bold lg:font-medium text-lg lg:text-sm text-blue5F dark:text-white">
{product?.product[0]?.price + " " + window.t("تومان")}
</div>
</Link>
)}
{(productType ? productType === "کتاب فیزیکی" : true) && (
{(productType ? productType === window.t("کتاب فیزیکی") : true) && (
<Link
key={product?.product[1]?.id}
to={"/products/" + product?.id}
@ -120,15 +122,16 @@ export const Main = ({ books, filterOptions, grades }) => {
<img
src={"https://dnvn.ir/api/v1/file/" + product?.fileIds}
className="w-full rounded-md mb-3"
alt=""
/>
<strong className="text-blue5F dark:text-white text-tiny font-bold lg:text-sm lg:font-medium mb-2">
{"کتاب فیزیکی" + " " + product?.name}
{window.t("کتاب فیزیکی") + " " + product?.name}
</strong>
<span className="text-tiny lg:text-xs text-green7B dark:text-greenBA font-light mb-4">
{"پایه" + " " + grades[product?.gradeId]}
{window.t("پایه") + " " + grades[product?.gradeId]}
</span>
<div className="w-full flex justify-center font-bold lg:font-medium text-lg lg:text-sm text-blue5F dark:text-white">
{product?.product[1]?.price + " " + "تومان"}
<div className="w-full flex flex-row justify-center font-bold lg:font-medium text-lg lg:text-sm text-blue5F dark:text-white">
{product?.product[1]?.price + " " + window.t("تومان")}
</div>
</Link>
)}
@ -137,10 +140,10 @@ export const Main = ({ books, filterOptions, grades }) => {
};
return (
<div className="h-full overflow-y-scroll w-full flex flex-wrap pt-20 pb-32">
{filterOptions?.productType === "دوره ویدئویی" && Items(2)}
{filterOptions?.productType === "کتاب دیجیتال" && Items(0)}
{filterOptions?.productType === "کتاب فیزیکی" && Items(1)}
<div className="h-full overflow-y-scroll w-full flex flex-wrap py-32">
{filterOptions?.productType === window.t("دوره ویدئویی") && Items(2)}
{filterOptions?.productType === window.t("کتاب دیجیتال") && Items(0)}
{filterOptions?.productType === window.t("کتاب فیزیکی") && Items(1)}
{!filterOptions?.productType && Items(0)}
{filterLoading && (
<div className="w-full h-screen flex justify-center items-center bg-white bg-opacity-20 backdrop-filter backdrop-blur-xl fixed left-0 top-0">

@ -6,14 +6,20 @@ export default function Links({ data }) {
return (
<div className="w-full justify-between items-center rounded-md bg-yellow-100 bg-opacity-20 py-3 px-2 mt-5 relative dark:bg-opacity-10">
<div className="flex flex-col">
<strong className="text-sm font-normal dark:text-white">لینک ها</strong>
<strong className="text-sm font-normal dark:text-white">
{window.t("لینک ها")}
</strong>
{data.map((link, i) => (
<Link to="#" key={i} className="text-xs mt-1 dark:text-white">
{link}
</Link>
))}
</div>
<img src={linkIcon} className="w-8 absolute left-2 top-1/2 transform -translate-y-1/2" />
<img
src={linkIcon}
className="w-8 absolute left-2 top-1/2 transform -translate-y-1/2"
alt=""
/>
</div>
);
}

@ -21,7 +21,7 @@ export default function Tab({ data }) {
: "bg-white font-normal"
}`}
>
تمامی محتوا
{window.t("تمامی محتوا")}
</button>
<button
onClick={() => setDataType("voice")}
@ -31,7 +31,7 @@ export default function Tab({ data }) {
: "bg-white font-normal"
}`}
>
صوت
{window.t("صوت")}
</button>
<button
onClick={() => setDataType("video")}
@ -41,7 +41,7 @@ export default function Tab({ data }) {
: "bg-white font-normal"
}`}
>
ویدئو
{window.t("ویدئو")}
</button>
<button
onClick={() => setDataType("pdf")}
@ -51,7 +51,7 @@ export default function Tab({ data }) {
: "bg-white font-normal"
}`}
>
پی دی اف
{window.t("پی دی اف")}
</button>
<button
onClick={() => setDataType("ppt")}
@ -61,7 +61,7 @@ export default function Tab({ data }) {
: "bg-white font-normal"
}`}
>
پاور پوینت
{window.t("پاور پوینت")}
</button>
<button
onClick={() => setDataType("links")}
@ -71,18 +71,14 @@ export default function Tab({ data }) {
: "bg-white font-normal"
}`}
>
لینک ها
{window.t("لینک ها")}
</button>
</div>
<div className="flex flex-col w-full p-4">
{dataType === "all" && (
<>
{data.voice && (
<Voice data={data?.voice} />
)}
{data.video && (
<Video data={data?.video} />
)}
{data.voice && <Voice data={data?.voice} />}
{data.video && <Video data={data?.video} />}
{data.ppt && <PPT data={data.ppt} />}
{data.pdf && <PDF data={data.pdf} />}
{data.links && <Links data={data.links} />}
@ -93,7 +89,9 @@ export default function Tab({ data }) {
{data.voice ? (
<Voice data={data.voice} />
) : (
<p className="text-sm text-gray70">فایل صدا یافت نشد.</p>
<p className="text-sm text-gray70">
{window.t("فایل صدا یافت نشد.")}
</p>
)}
</>
)}
@ -102,7 +100,9 @@ export default function Tab({ data }) {
{data.video ? (
<Video data={data.video} />
) : (
<p className="text-sm text-gray70">فایل تصویری یافت نشد.</p>
<p className="text-sm text-gray70">
{window.t("فایل تصویری یافت نشد.")}
</p>
)}
</>
)}
@ -111,7 +111,9 @@ export default function Tab({ data }) {
{data.ppt ? (
<PPT data={data.ppt} />
) : (
<p className="text-sm text-gray70">فایل پاورپوینت یافت نشد.</p>
<p className="text-sm text-gray70">
{window.t("فایل پاورپوینت یافت نشد.")}
</p>
)}
</>
)}
@ -120,7 +122,9 @@ export default function Tab({ data }) {
{data.pdf ? (
<PDF data={data.pdf} />
) : (
<p className="text-sm text-gray70">فایل پی دی اف یافت نشد.</p>
<p className="text-sm text-gray70">
{window.t("فایل پی دی اف یافت نشد.")}
</p>
)}
</>
)}
@ -129,7 +133,9 @@ export default function Tab({ data }) {
{data.links ? (
<Links data={data.links} />
) : (
<p className="text-sm text-gray70">لینکی پیدا نشد.</p>
<p className="text-sm text-gray70">
{window.t("لینکی پیدا نشد.")}
</p>
)}
</>
)}

@ -36,17 +36,19 @@ export const Content = ({
<span className="text-sm text-blueC0 mt-2 dark:text-greenBA">
{grades[data?.book?.gradeId]}
</span>
<p className="text-sm mt-2 text-blueC0 dark:text-greenBA">{`شما در حال مشاهده صفحه ${data?.qr?.pageNumber} هستید.`}</p>
<p className="text-sm mt-2 text-blueC0 dark:text-greenBA">{`${window.t(
"شما در حال مشاهده صفحه"
)} ${data?.qr?.pageNumber} ${window.t("هستید.")}`}</p>
</div>
</div>
<Tab
data={{
voice: data?.qr?.content?.filter((obj) => obj.type === 'voice')[0],
video: data?.qr?.content?.filter((obj) => obj.type === 'video')[0],
pdf: data?.qr?.content?.filter((obj) => obj.type === 'pdf')[0],
ppt: data?.qr?.content?.filter((obj) => obj.type === 'ppt')[0],
links: data?.qr?.content?.filter((obj) => obj.type === 'links')[0],
voice: data?.qr?.content?.filter((obj) => obj.type === "voice")[0],
video: data?.qr?.content?.filter((obj) => obj.type === "video")[0],
pdf: data?.qr?.content?.filter((obj) => obj.type === "pdf")[0],
ppt: data?.qr?.content?.filter((obj) => obj.type === "ppt")[0],
links: data?.qr?.content?.filter((obj) => obj.type === "links")[0],
}}
/>
</div>
@ -67,18 +69,21 @@ export default connect(mapStateToProps, mapDispatchToProps)(Content);
Content.defaultProps = {
data: {
name: "ریاضیات گسسته خیلی پیشرفته",
grade: "پایه هفتم ابتدایی",
name: window.t("ریاضیات گسسته خیلی پیشرفته"),
grade: window.t("پایه هفتم ابتدایی"),
page: "67",
percent: "62",
voice: { name: "استاد رضایی: فصل پنجم توضیح در مورد آتش فشان ها", file: 1 },
video: { name: "ویدئوی آزمایش آتشفشان سرکه ای", file: 1 },
pdf: { name: "فایل پاورپوینت ارائه درس آتشفشان ها", file: 1 },
ppt: { name: "فایل پاورپوینت ارائه درس آتشفشان ها", file: 1 },
voice: {
name: window.t("استاد رضایی: فصل پنجم توضیح در مورد آتش فشان ها"),
file: 1,
},
video: { name: window.t("ویدئوی آزمایش آتشفشان سرکه ای"), file: 1 },
pdf: { name: window.t("فایل پی دی اف ارائه درس آتشفشان ها"), file: 1 },
ppt: { name: window.t("فایل پاورپوینت ارائه درس آتشفشان ها"), file: 1 },
links: [
"وبسایت آموزشی دانوین",
"وبسایت رسمی مدیریت راهبردی کشور",
"سازمان تبلیغات صنایع سبک ",
window.t("وبسایت آموزشی دانوین"),
window.t("وبسایت رسمی مدیریت راهبردی کشور"),
window.t("سازمان تبلیغات صنایع سبک "),
],
},
};

@ -7,31 +7,35 @@ function Code({ codeId, setCodeId, userId, factorId }) {
const setOff = () => {
setCodeId({ offCodeValue: value, userId: userId, id: factorId });
}
};
return (
<div className="flex w-full border border-blueC0 border-solid rounded-md mt-3 mb-4 overflow-hidden lg:w-2/5 lg:mt-5">
<input
type="text"
className="border-0 flex-1 text-right pr-3 font-medium text-tiny dark:bg-gray2077 placeholder:text-blue5F dark:text-white outline-none lg:text-base lg:font-bold"
placeholder={"کد تخفیف دارید ؟"}
placeholder={window.t("کد تخفیف دارید ؟")}
/>
<button className={"py-3 px-4 lg:py-4 text-tiny bg-blueC0 text-white border border-blueC0 border-solid lg:font-bold"} onClick={() => setOff()}>ثبت کد</button>
<button
className={
"py-3 px-4 lg:py-4 text-tiny bg-blueC0 text-white border border-blueC0 border-solid lg:font-bold"
}
onClick={() => setOff()}
>
{window.t("ثبت کد")}
</button>
</div>
);
}
const mapStateToProps = (state) => ({
codeId: state.userFactor.info?.codeId,
userId: state.user.status.id,
factorId: state.userFactor.info?.id,
codeId: state.userFactor.info?.codeId,
userId: state.user.status.id,
factorId: state.userFactor.info?.id,
});
const mapDispatchToProps = {
setCodeId: userFactor.update,
}
};
export default connect(
mapStateToProps,
mapDispatchToProps
)(Code);
export default connect(mapStateToProps, mapDispatchToProps)(Code);

@ -30,10 +30,12 @@ function Product({ product, grades, pushToCart, isMobile, loading }) {
{product.product.book.name}
</strong>
<span className="text-gray70 text-tiny mb-2 dark:text-greenBA">
{"پایه" + " " + grades[product.product.book.gradeId]}
{window.t("پایه") + " " + grades[product.product.book.gradeId]}
</span>
<span className="text-gray70 text-tiny dark:text-greenBA">
{product.productType === 2 ? "نسخه فیزیکی" : "نسخه دیجیتال"}
{product.productType === 2
? window.t("نسخه فیزیکی")
: window.t("نسخه دیجیتال")}
</span>
</div>
</div>
@ -119,7 +121,8 @@ function Product({ product, grades, pushToCart, isMobile, loading }) {
</div>
) : null}
<strong className="font-bold text-md text-blue5F dark:text-white">
{separate(product.product.price * product.count)}&nbsp;تومان
{separate(product.product.price * product.count)}&nbsp;
{window.t("تومان")}
</strong>
</div>
</div>
@ -141,17 +144,20 @@ function Product({ product, grades, pushToCart, isMobile, loading }) {
<div className="flex items-center mt-4">
<span className="w-2 h-2 bg-greenBA rounded-md ml-1"></span>
<div className="text-gray70 text-sm dark:text-greenBA">
{"پایه" + " " + grades[product?.product?.book?.gradeId]}
{window.t("پایه") + " " + grades[product?.product?.book?.gradeId]}
</div>
<span className="w-2 h-2 bg-greenBA rounded-md mr-5 ml-1"></span>
<div className="text-gray70 text-sm dark:text-greenBA">
{product?.productType === 2 ? "نسخه فیزیکی" : "نسخه دیجیتال"}
{product?.productType === 2
? window.t("نسخه فیزیکی")
: window.t("نسخه دیجیتال")}
</div>
</div>
<div className="flex items-center pl-4 mt-6">
<strong className="font-semibold text-xl text-blue5F dark:text-white">
&nbsp;{separate(product?.product?.price * product.count)}
&nbsp;&nbsp;تومان
&nbsp;&nbsp;
{window.t("تومان")}
</strong>
</div>
</div>

@ -41,6 +41,7 @@ function ShoppingCart({
const [phase, setPhase] = useState("products");
const navigation = useNavigate();
useEffect(() => {
console.log("gl1");
if (isLogin) getList();
getFactorInfo({ userId: user?.id });
setHeaderOptions(headerOptions);
@ -56,42 +57,40 @@ function ShoppingCart({
return userProducts?.filter((product) => product.condition < 2)?.length;
}, [userProducts]);
const next = useMemo(() => {
return {
products: () =>
productsLength
? userProducts.filter((object) => object.productType === 2)?.length
? setPhase("deliveryForm")
: setDialog({
type: "confirm",
text: "به درگاه پرداخت بریم؟",
open: true,
accept: () => payFactor({ userId: user.id }),
})
: toast.info("ابتدا یک محصول را به سبد خرید خود اضافه کنید."),
deliveryForm: () =>
setDialog({
type: "confirm",
text: "به درگاه پرداخت بریم؟",
open: true,
accept: () => payFactor({ userId: user.id }),
}),
profile: () => {
console.log("Set profile");
console.log("Go to shaparak");
},
};
}, [userProducts, user]);
const next = {
products: () =>
productsLength
? userProducts.filter((object) => object.productType === 2).length > 0
? setPhase("deliveryForm")
: setDialog({
type: "confirm",
text: window.t("به درگاه پرداخت بریم؟"),
open: true,
accept: () => payFactor({ userId: user.id }),
})
: toast.info(window.t("ابتدا یک محصول را به سبد خرید خود اضافه کنید.")),
deliveryForm: () =>
setDialog({
type: "confirm",
text: window.t("به درگاه پرداخت بریم؟"),
open: true,
accept: () => payFactor({ userId: user.id }),
}),
profile: () => {
console.log("Set profile");
console.log("Go to shaparak");
},
};
const Table = React.useCallback(() => {
return (
<div className="w-full flex flex-col">
<header className="w-full flex gap-10">
<strong className="w-3/4 pb-2 border-b border-solid border-gray-200 text-gray70 text-sm font-normal">
کالاهای انتخابی
{window.t("کالاهای انتخابی")}
</strong>
<strong className="w-1/4 pb-2 border-b border-solid border-gray-200 text-gray70 text-sm font-normal">
تعداد سفارش
{window.t("تعداد سفارش")}
</strong>
</header>
<ul className="w-full mt-2 list-none p-0">
@ -111,95 +110,88 @@ function ShoppingCart({
);
}, [userProducts]);
const PriceStatus = useCallback(
({ name, value, type }) => {
return (
<React.Fragment>
<div className="w-full flex lg:hidden justify-between py-3">
<strong className="font-semibold text-tiny dark:text-white text-blue5F">
{name}
</strong>
<span
className="font-medium text-lg dark:text-white"
style={{
color: !isDark
? type === "error"
? "#F1420D"
: "rgb(6, 186, 206)"
: "",
}}
>
{separate(Math.floor(value))}
<span
style={{
color: !isDark ? (type === "error" ? "#F1420D" : "") : "",
}}
className="text-sm mr-2"
>
تومان
</span>
</span>
</div>
<div className="w-full hidden lg:flex justify-between py-4">
<strong className="font-semibold text-tiny dark:text-white text-blue5F">
{name}
</strong>
{value ? (
<span
className="font-medium text-lg dark:text-white"
style={{
color: !isDark
? type === "error"
? "#F1420D"
: "rgb(6, 186, 206)"
: "",
}}
>
{separate(Math.floor(value))}
<span
style={{
color: !isDark ? (type === "error" ? "#F1420D" : "") : "",
}}
className="text-sm mr-2"
>
تومان
</span>
</span>
) : null}
</div>
</React.Fragment>
);
},
[useless]
);
const PriceStatus = ({ name, value, type }) => {
return isMobile ? (
<div className="w-full flex flex-row justify-between py-3">
<strong className="font-semibold text-tiny dark:text-white text-blue5F">
{name}
</strong>
<span
className="font-medium text-lg dark:text-white"
style={{
color: !isDark
? type === "error"
? "#F1420D"
: "rgb(6, 186, 206)"
: "",
}}
>
{separate(Math.floor(value))}
<span
style={{
color: !isDark ? (type === "error" ? "#F1420D" : "") : "",
}}
className="text-sm mr-2"
>
{window.t("تومان")}
</span>
</span>
</div>
) : (
<div className="w-full flex flex-row justify-between py-4">
<strong className="font-semibold text-tiny dark:text-white text-blue5F">
{name}
</strong>
<span
className="font-medium text-lg dark:text-white"
style={{
color: !isDark
? type === "error"
? "#F1420D"
: "rgb(6, 186, 206)"
: "",
}}
>
{separate(Math.floor(value))}
<span
style={{
color: !isDark ? (type === "error" ? "#F1420D" : "") : "",
}}
className="text-sm mr-2"
>
{window.t("تومان")}
</span>
</span>
</div>
);
};
const layouts = useMemo(() => {
return {
products: isMobile ? (
<>
{userProducts
.sort((a, b) => a?.id - b?.id)
.map(
(product, index) =>
product.condition < 2 && (
<Product loading={loading} key={index} product={product} />
)
)}
<Code />
</>
) : productsLength ? (
<Table />
) : (
<Empty
text="سبد خرید شما خالی است."
buttonText="فروشگاه"
buttonAction={() => navigation("/products")}
/>
),
deliveryForm: <DeliveryForm setPhase={setPhase} />,
address: <Address setPhase={setPhase} />,
};
}, [isMobile, userProducts, loading]);
const layouts = {
products: isMobile ? (
<>
{userProducts
.sort((a, b) => a?.id - b?.id)
.map(
(product, index) =>
product.condition < 2 && (
<Product loading={loading} key={index} product={product} />
)
)}
<Code />
</>
) : productsLength ? (
<Table />
) : (
<Empty
text={window.t("سبد خرید شما خالی است.")}
buttonText={window.t("فروشگاه")}
buttonAction={() => navigation("/products")}
/>
// <strong className="text-blueC0">سبد خرید شما خالی است.</strong>
),
deliveryForm: <DeliveryForm setPhase={setPhase} />,
address: <Address setPhase={setPhase} />,
};
return isMobile ? (
<div className="w-full flex flex-col px-4 pb-24">
@ -210,30 +202,25 @@ function ShoppingCart({
<>
<div className="flex flex-col w-full border-t border-gray-300 border-b">
<PriceStatus
name="مبلغ سبد خرید"
value={factorInfo?.sumPrice ? factorInfo?.sumPrice : null}
name={window.t("مبلغ سبد خرید")}
value={productsLength ? factorInfo?.sumPrice : 0}
type="normal"
/>
<PriceStatus
name="میزان تخفیف"
value={factorInfo?.offPrice ? factorInfo?.offPrice : null}
name={window.t("میزان تخفیف")}
value={productsLength ? factorInfo?.offPrice : 0}
type="error"
/>
{/* <PriceStatus
name="مالیات بر ارزش افزوده"
value={productsLength ? factorInfo?.sumPrice * 0.009 : 0}
type="error"
/> */}
</div>
<div className="flex justify-between items-center w-full py-3">
<strong className="font-bold text-tiny text-blue5F dark:text-white">
جمع کل سبد خرید
{window.t("جمع کل سبد خرید")}
</strong>
{factorInfo?.payFactor ? (
<p className="font-medium text-greenBA text-lg dark:text-white">
{separate(factorInfo?.payPrice) + " " + "تومان"}
</p>
) : null}
<p className="font-medium text-greenBA text-lg dark:text-white">
{separate(productsLength ? factorInfo?.payPrice : 0) +
" " +
window.t("تومان")}
</p>
</div>
<div
className="w-full rounded-md flex justify-center items-center py-2.5 px-3 mt-5 mb-4"
@ -241,11 +228,13 @@ function ShoppingCart({
>
<img src={alertIcon} className="w-5 ml-2" />
<p className="text-xs text-green71 dark:text-white text-justify font-medium">
هزینه ارسال کالا پس از تعیین محل آدرس مشخص میشود
{window.t(
"هزینه ارسال کالا پس از تعیین محل آدرس مشخص میشود"
)}
</p>
</div>
<Button
title="ادامه فرایند خرید"
text={window.t("ادامه فرایند خرید")}
backgroundColor="bg-blueC0"
border={{ color: "#196EC055", width: "0px" }}
width="100%"
@ -258,7 +247,6 @@ function ShoppingCart({
onClick={() => setPhase("products")}
>
{window.t("بازگشت")}
<img
src={dropdownIcon}
alt=""
@ -271,7 +259,7 @@ function ShoppingCart({
</>
) : (
<Empty
text="سبد خرید شما خالی است."
text={window.t("سبد خرید شما خالی است.")}
buttonText="فروشگاه"
buttonAction={() => navigation("/products")}
/>
@ -292,22 +280,18 @@ function ShoppingCart({
>
<div className="flex flex-col w-full border-t py-2 border-gray-300 border-b">
<PriceStatus
name="مبلغ سبد خرید"
value={factorInfo?.sumPrice ? factorInfo?.sumPrice : null}
name={window.t("مبلغ سبد خرید")}
value={productsLength ? factorInfo?.sumPrice : ""}
type="normal"
/>
<PriceStatus
name="هزینه حمل و نقل"
value={
factorInfo?.transportPrice
? factorInfo?.transportPrice
: " "
}
name={window.t("هزینه حمل و نقل")}
value={productsLength ? factorInfo?.transportPrice : 0}
type="error"
/>
<PriceStatus
name="میزان تخفیف"
value={factorInfo?.offPrice ? factorInfo?.offPrice : null}
name={window.t("میزان تخفیف")}
value={productsLength ? factorInfo?.offPrice : ""}
type="error"
/>
{/* <PriceStatus
@ -322,35 +306,35 @@ function ShoppingCart({
</div>
<div className="flex justify-between items-center w-full py-4 border-t border-b border-grayDB border-solid">
<strong className="font-semibold text-tiny text-blue5F dark:text-white">
جمع کل سبد خرید
{window.t("جمع کل سبد خرید")}
</strong>
{factorInfo?.payPrice ? (
<p className="font-medium text-greenBA text-lg dark:text-white">
{separate(factorInfo?.payPrice)}
<span className="font-medium text-greenBA text-sm mr-2">
تومان
</span>
</p>
) : null}
<p className="font-medium text-greenBA text-lg dark:text-white">
{separate(productsLength ? factorInfo?.payPrice : "")}
<span className="font-medium text-greenBA text-sm mr-2">
{window.t("تومان")}
</span>
</p>
</div>
{phase === "products" && (
<div
className="w-full rounded-md flex justify-center items-center py-2.5 px-3 mt-5 mb-4"
style={{ backgroundColor: "#DEFFF188" }}
>
<img src={alertIcon} className="w-5 ml-2" />
<img src={alertIcon} className="w-5 ml-2" alt="" />
<p className="text-xs text-green71 dark:text-white text-justify font-medium">
هزینه ارسال کالا پس از تعیین محل آدرس مشخص میشود
{window.t(
"هزینه ارسال کالا پس از تعیین محل آدرس مشخص میشود"
)}
</p>
</div>
)}
{null && phase === "deliveryForm" && (
<div className="flex flex-col mt-10">
<strong className="text-tiny text-blue52 mb-5 font-medium">
انتخاب شیوه پرداخت
{window.t("انتخاب شیوه پرداخت")}
</strong>
<Button
title="از طریق درگاه پرداخت"
title={window.t("از طریق درگاه پرداخت")}
backgroundColor="bg-transparent"
border={{ color: "#77777755", width: "1px" }}
width="100%"
@ -359,7 +343,7 @@ function ShoppingCart({
/>
<br />
<Button
title="پرداخت در محل"
title={window.t("پرداخت در محل")}
backgroundColor="bg-transparent"
border={{ color: "#77777755", width: "1px" }}
width="100%"
@ -375,11 +359,11 @@ function ShoppingCart({
<Button
title={
phase === "deliveryForm"
? "پرداخت"
? window.t("پرداخت")
: userProducts.filter((object) => object.productType === 2)
.length > 0
? "ادامه فرایند خرید"
: "پرداخت"
? window.t("ادامه فرایند خرید")
: window.t("پرداخت")
}
backgroundColor="bg-blueC0"
border={{ color: "#196EC055", width: "0px" }}

@ -1,14 +1,14 @@
import React from "react";
const persian = {
weight: "وزن",
pageNumber: "تعداد صفحات",
pageType: "نوع کاغذ",
bookNumber: "شماره شابک",
publisher: "انتشارات",
author: "نویسنده",
bookType: "قطع",
publishedYear: "سال انتشار",
weight: window.t("وزن"),
pageNumber: window.t("تعداد صفحات"),
pageType: window.t("نوع کاغذ"),
bookNumber: window.t("شماره شابک"),
publisher: window.t("انتشارات"),
author: window.t("نویسنده"),
bookType: window.t("قطع"),
publishedYear: window.t("سال انتشار"),
};
const Table = ({ specifications }) => {
@ -38,13 +38,13 @@ export default Table;
Table.defaultProps = {
specifications: {
weight: "1 کیلوگرم",
pageNumber: "400 صفحه",
pageType: "گلاسه",
bookNumber: "124900985340561870112312499",
publisher: "رزمندگان",
author: "یک نویسنده گمنام",
bookType: "خشتی",
publishedYear: "1399",
weight: window.t("1 کیلوگرم"),
pageNumber: window.t("400 صفحه"),
pageType: window.t("گلاسه"),
bookNumber: window.t("124900985340561870112312499"),
publisher: window.t("رزمندگان"),
author: window.t("یک نویسنده گمنام"),
bookType: window.t("خشتی"),
publishedYear: window.t("1399"),
},
};

@ -22,7 +22,6 @@ const Season = ({
"season",
location.getId() + "," + seasonId + "," + videoId
);
};
const duration = (value) => {
@ -47,7 +46,9 @@ const Season = ({
}}
>
<div className="flex items-center justify-between w-full">
<h5 className="text-tiny font-bold text-green7B dark:text-white">{unit.name}</h5>
<h5 className="text-tiny font-bold text-green7B dark:text-white">
{unit.name}
</h5>
<div className="flex items-center gap-4">
<Link
to={
@ -62,7 +63,9 @@ const Season = ({
} py-2 w-20 text-center text-tiny rounded-sm shadow-md`}
onClick={() => setCategory(season[0].categoryId, unit.name)}
>
{Number(index) === 0 ? "تماشا" : "قفل"}
{Number(index) === 0
? `${window.t("تماشا")}`
: `${window.t("قفل")}`}
</Link>
</div>
</div>
@ -95,7 +98,9 @@ const Season = ({
} py-2.5 w-24 text-center text-tiny rounded-sm shadow-md`}
onClick={() => setCategory(season[0].categoryId, unit.name)}
>
{Number(index) === 0 ? "تماشا" : "قفل"}
{Number(index) === 0
? `${window.t("تماشا")}`
: `${window.t("قفل")}`}
</Link>
</div>
</div>
@ -127,14 +132,12 @@ const Season = ({
className={`w-4 transform transition-all ${
season[0].categoryId === activeSeason ? "rotate-180" : ""
}`}
/>
/>
</button>
<ul
className={`w-full flex flex-col px-2 ${
season[0].categoryId === activeSeason
? ""
: ""
season[0].categoryId === activeSeason ? "" : ""
} transform origin-bottom duration-1000 transition-all overflow-hidden`}
style={{
maxHeight: season[0].categoryId === activeSeason ? 1000 : 0,

@ -15,6 +15,7 @@ import ProductTab from "../../components/ProductTab";
import Table from "./components/Desktop/Table";
import Comments from "../../components/Comments";
import Loading from "../../components/Loading";
import Comment from "../Product/Comment";
//assets
import tickIcon from "../../components/ProductStatusCard/tick-circle.svg";
@ -65,21 +66,23 @@ function Video({
/>
<div className="flex flex-col py-1 pr-3">
<strong className="text-blue5F leading-7 text-lg dark:text-white font-black">
{"دوره ویدئویی" + " " + book?.product[2]?.name}
{window.t("دوره ویدئویی") + " " + book?.product[2]?.name}
</strong>
<span className="text-blueC0 text-base dark:text-greenBA font-semibold mt-3 mb-5">
{"پایه" + " " + (grades[book?.gradeId] || "پایه دوازدهم")}
{window.t("پایه") +
" " +
(grades[book?.gradeId] || window.t("پایه دوازدهم"))}
</span>
</div>
</div>
<div className="flex flex-col flex-1 justify-between my-5">
<Button
title={
"خرید با قیمت" +
window.t("خرید با قیمت") +
" " +
separate(book?.product[2]?.price) +
" " +
"تومان"
window.t("تومان")
}
backgroundColor={isDark ? "bg-blueC0" : "bg-blueC0"}
border={{
@ -96,7 +99,7 @@ function Video({
userId: userId,
count: 1,
})
: toast.info("ابتدا وارد حساب کاربری خود شوید.")
: toast.info(window.t("ابتدا وارد حساب کاربری خود شوید."))
}
/>
</div>
@ -118,7 +121,7 @@ function Video({
<ProductTab
tabs={[
{
title: "سر فصل ها",
title: window.t("سر فصل ها"),
shown: true,
components: (
<div className="flex flex-col w-full mt-5 gap-5">
@ -131,7 +134,7 @@ function Video({
),
},
{
title: "مشخصات",
title: window.t("مشخصات"),
shown: book?.product.filter(
(product) => product?.productType === 4
)?.properties?.length,
@ -146,20 +149,20 @@ function Video({
),
},
{
title: "نقد و بررسی",
title: window.t("نقد و بررسی"),
shown: true,
components: (
<div className="bg-gray-100 rounded-md mt-4 w-full flex justify-center items-center h-40 text-green4F text-tiny">
این بخش فعلا قابل دسترسی نیست.
{window.t("این بخش فعلا قابل دسترسی نیست.")}
</div>
),
},
{
title: "پرسش و پاسخ",
title: window.t("پرسش و پاسخ"),
shown: true,
components: (
<div className="bg-gray-100 rounded-md mt-4 w-full flex justify-center items-center h-40 text-green4F text-tiny">
این بخش فعلا قابل دسترسی نیست.
{window.t("این بخش فعلا قابل دسترسی نیست.")}
</div>
),
},
@ -170,24 +173,28 @@ function Video({
<div className="w-3/12 flex flex-col" style={{ minWidth: 350 }}>
<div className="w-full flex flex-col pr-2 py-2 border-0">
<h1 className="text-blue5F leading-7 mb-3 font-semibold text-xl dark:text-white">
{"دوره ویدئویی" + " " + book?.product[2]?.name}
{window.t("دوره ویدئویی") + " " + book?.product[2]?.name}
</h1>
<div className="text-blueC0 text-tiny dark:text-greenBA font-bold">
{"پایه" + " " + grades[book?.gradeId]}
{window.t("پایه") + " " + grades[book?.gradeId]}
</div>
<div className="flex justify-end">
<div className="p-2">
<StarRating value={book?.product[2]?.rate || 4} />
</div>
<div className="p-2 border-0 border-solid border-r border-gray-100 text-sm text-gray-400">
بیش از {book?.product[2]?.suggestedCounter} نفر امتیاز داده اند
{window.t("بیش از")}
{book?.product[2]?.suggestedCounter}
{window.t("نفر امتیاز داده اند")}
</div>
</div>
</div>
<div className="bg-grayF9 w-full flex flex-col rounded-md divide-y divide-solid divide-gray-200 mb-4 px-4">
<div className="flex items-center w-full gap-5 my-5">
<img src={tickIcon} alt="" className="w-9" />
<p className="text-blue52 text-sm font-light">{`توصیه خرید توسط ${book?.product[2]?.suggestedCounter} نفر`}</p>
<p className="text-blue52 text-sm font-light">{`${window.t(
"توصیه خرید توسط"
)} ${book?.product[2]?.suggestedCounter} ${window.t("نفر")}`}</p>
</div>
<div className="flex items-center py-3">
<img
@ -199,7 +206,7 @@ function Video({
onClick={() => addToFavorite({ [bookmark]: location.getId() })}
/>
<span className="mr-3 text-sm">
اضافه کردن به لیست علاقه مندی ها
{window.t("اضافه کردن به لیست علاقه مندی ها")}
</span>
</div>
<div className="flex flex-col w-full py-4 px-4">
@ -207,17 +214,19 @@ function Video({
<strong className="text-blueC0 text-5xl">
{separate(book?.product[2]?.price)}
</strong>
<span className="text-sm text-gray-500">تومان</span>
<span className="text-sm text-gray-500">
{window.t("تومان")}
</span>
</div>
{book?.product[2]?.fakePrice ? (
<p className="text-gray-500 text-xs text-center mt-2 mb-4">
با خرید این کالا 540.000 صرفه جویی کنید
{window.t("با خرید این کالا 540.000 صرفه جویی کنید")}
</p>
) : (
<div className="mb-4"></div>
)}
<Button
title="اضافه کردن به سبد خرید"
title={window.t("اضافه کردن به سبد خرید")}
backgroundColor={isDark ? "bg-blueC0" : "bg-blueC0"}
border={{
color: isDark ? "#ffffff55" : "#196EC055",
@ -233,7 +242,7 @@ function Video({
userId: userId,
count: 1,
})
: toast.info("ابتدا وارد حساب کاربری خود شوید.")
: toast.info(window.t("ابتدا وارد حساب کاربری خود شوید."))
}
/>
</div>
@ -242,12 +251,14 @@ function Video({
to={"/products/" + location.getId()}
className="bg-blueC0 text-green7B bg-opacity-5 font-semibold text-tiny rounded-md border border-solid border-blueC0 w-full py-4 text-center flex items-center justify-center"
>
مشاهده کتاب این محصول
{window.t("مشاهده کتاب این محصول")}
<img src={arrow} alt="" className="mr-2 transform rotate-90 w-5" />
</Link>
</div>
</header>
<Comments indent={false} />
<div className="mt-10">
<Comments indent={false} /> <Comment />
</div>
</div>
);
}

@ -19,7 +19,7 @@ const Season = ({ season }) => {
to={"/videos/0/display"}
className="flex flex-1 items-center py-2.5 px-2 border-l border-solid border-blueFE dark:border-opacity-60 justify-center text-sm text-blueC0 dark:text-white"
>
نمایش
{window.t("نمایش")}
</Link>
)}
{unit.download && (
@ -27,7 +27,7 @@ const Season = ({ season }) => {
to="/videos/0/download"
className="flex flex-1 items-center py-2.5 px-2 justify-center text-sm text-blueC0 dark:text-white"
>
دانلود
{window.t("دانلود")}
</Link>
)}
</div>

@ -49,17 +49,9 @@ function VideoDisplay({
{selectedVideo?.name}
</h1>
<p className="m-4 text-gray70 leading-7 font-normal text-tiny">
لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ، و با
استفاده از طراحان گرافیک است، چاپگرها و متون بلکه روزنامه و مجله در
ستون و سطرآنچنان که لازم است، و برای شرایط فعلی تکنولوژی مورد نیاز،
و کاربردهای متنوع با هدف بهبود ابزارهای کاربردی می باشد، کتابهای
زیادی در شصت و سه درصد گذشته حال و آینده، شناخت فراوان جامعه و
متخصصان را می طلبد، تا با نرم افزارها شناخت بیشتری را برای طراحان
رایانه ای علی الخصوص طراحان خلاقی، و فرهنگ پیشرو در زبان فارسی ایجاد
کرد، در این صورت می توان امید داشت که تمام و دشواری موجود در ارائه
راهکارها، و شرایط سخت تایپ به پایان رسد و زمان مورد نیاز شامل
حروفچینی دستاوردهای اصلی، و جوابگوی سوالات پیوسته اهل دنیای موجود
طراحی اساسا مورد استفاده قرار گیرد.
{window.t(
"استفاده از طراحان گرافیک است، چاپگرها و متون بلکه روزنامه و مجله درلورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ، و با لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ، و با"
)}
</p>
</div>
<PlayList playList={book?.vods} />

@ -7,8 +7,8 @@ import posterImage from "../../../assets/images/poster.svg";
function MostViewedVideo({ videos, grades }) {
return (
<div className="w-full flex flex-col">
<Header title="پربازدیدترین" link="/videos/video" />
<div className="w-full flex overflow-x-scroll pb-4 no-scrollbar">
<Header title={window.t("پربازدیدترین")} link="/videos/video" />
<div className="w-full flex flex-row overflow-x-scroll pb-4 no-scrollbar">
{videos.map((video, index) => (
<Video key={index} video={video} grades={grades} />
))}
@ -42,14 +42,14 @@ const Video = ({ video, grades }) => {
/>
</div>
<strong className="text-base mt-0 text-blue5F dark:text-white font-bold">
{"دوره ویدئویی" + " " + video.name}
{window.t("دوره ویدئویی") + " " + video.name}
</strong>
<div className="w-full flex justify-between items-center mt-3">
<span className="text-green7B text-sm dark:text-white">
{"پایه" + " " + grades[video.gradeId]}
{window.t("پایه") + " " + grades[video.gradeId]}
</span>
<strong className="text-black text-tiny dark:text-greenBA">
{separate(video?.product[2]?.price) + " " + "تومان"}
{separate(video?.product[2]?.price) + " " + window.t("تومان")}
</strong>
</div>
</Link>

@ -8,8 +8,8 @@ import Header from "../../../components/Header";
const NewestVideo = ({ videos, grades }) => {
return (
<div className="w-full flex flex-col">
<Header title="جدیدترین دورهها" link="/videos/video" />
<div className="w-full flex flex-wrap justify-between overflow-x-scroll mt-3">
<Header title={window.t("جدیدترین دورهها")} link="/videos/video" />
<div className="w-full flex flex-row flex-wrap justify-between overflow-x-scroll mt-3">
{videos.slice(0, 4).map((video, index) => (
<Video key={index} video={video} grades={grades} />
))}
@ -40,10 +40,10 @@ const Video = ({ video, grades }) => {
</strong>
<div className="flex items-center justify-between w-full mt-2">
<span className="text-green7B text-sm dark:text-greenBA">
{"پایه" + " " + grades[video.gradeId]}
{window.t("پایه") + " " + grades[video.gradeId]}
</span>
<strong className="text-black text-tiny dark:text-greenBA">
{separate(video?.product[2]?.price) + " " + "تومان"}
{separate(video?.product[2]?.price) + " " + window.t("تومان")}
</strong>
</div>
</Link>

@ -14,8 +14,8 @@ const VerticalGradeFilter = ({ grades }) => {
};
return (
<div className="w-full flex flex-col mt-3">
<Header title={"پایه تحصیلی"} link="videos/video" />
<div className="flex w-full overflow-x-scroll pb-3">
<Header title={window.t("پایه تحصیلی")} link="videos/video" />
<div className="flex flex-row w-full overflow-x-scroll pb-3">
{Object.keys(grades).map((grade, index) => (
<Grade grade={grade} key={index} />
))}

Loading…
Cancel
Save