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. 112
      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. 110
      src/views/Product/Rate/index.js
  18. 181
      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. 20
      src/views/ShoppingCart/Code/index.js
  27. 18
      src/views/ShoppingCart/Product/index.js
  28. 120
      src/views/ShoppingCart/index.js
  29. 32
      src/views/Video/components/Desktop/Table.js
  30. 17
      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} /> <Avatar size={40} />
<div className="flex flex-col py-2 mr-2 justify-center"> <div className="flex flex-col py-2 mr-2 justify-center">
<strong className="text-gray-300 text-tiny font-bold"> <strong className="text-gray-300 text-tiny font-bold">
{window.t("نوشته از:" + " " + "کامران ایزدی")} {window.t("نوشته از:")}
</strong> </strong>
<p className="text-gray-300 mt-2 text-xs"> <p className="text-gray-300 mt-2 text-xs">
{window.t("سردبیر بخش وبلاگ دانوین ایزدی")} {window.t("سردبیر بخش وبلاگ دانوین ایزدی")}

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

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

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

@ -34,7 +34,7 @@ function Videos({ videos, grades, isDark, isMobile }) {
</div> </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"> <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> </h2>
{/* <p className="font-medium text-blueC0 dark:text-greenBA text-xs mt-1 lg:mt-2 lg:text-sm">{`پایه ${ {/* <p className="font-medium text-blueC0 dark:text-greenBA text-xs mt-1 lg:mt-2 lg:text-sm">{`پایه ${
grades[video.gradeId] 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"> <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"> <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"> <strong className="text-green7B dark:text-white font-bold text-base lg:text-base mt-2">
دورههای ویدئویی شما {window.t("دورههای ویدئویی شما")}
</strong> </strong>
{isDark ? ( {isDark ? (
<img <img

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

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

@ -68,30 +68,35 @@ function Header({ list }) {
to="/products" 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" 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> </Link>
</div> </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-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="flex flex-row">
<div className="relative"> <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> <span className="h-1 w-full absolute bottom-0 z-10 left-0 bg-yellow3"></span>
</div> </div>
<h1 className="inline">با طعم لذت</h1> <h1 className="inline"> {window.t("با طعم لذت")}</h1>
</div> </div>
<div className="flex my-1.5"> <div className="flex flex-row my-1.5">
<h1 className="inline">از اول تا یازدهم &nbsp;</h1> <h1 className="inline">{window.t("از اول تا یازدهم")}&nbsp;</h1>
<div className="relative"> <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> <span className="h-1 w-full absolute bottom-0 left-0 bg-orange1"></span>
</div> </div>
</div> </div>
<div className="flex flex-row"> <div className="flex flex-row">
<div className="relative"> <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> <span className="h-1 w-full absolute bottom-0 left-0 bg-green1"></span>
</div> </div>
<h1 className="inline">و تعاملی</h1> <h1 className="inline">و {window.t("تعاملی")} </h1>
</div> </div>
</div> </div>
<div className="w-full p-4 transform translate-y-1/3 relative"> <div className="w-full p-4 transform translate-y-1/3 relative">
@ -111,31 +116,37 @@ export default Header;
Header.defaultProps = { Header.defaultProps = {
list: [ list: [
{ {
name: "زیست یازدهم", name: window.t("زیست یازدهم"),
imageUrl: zist11Image, imageUrl: zist11Image,
}, },
{ {
name: "علوم دوم", name: window.t("علوم دوم"),
imageUrl: olum2Image, imageUrl: olum2Image,
}, },
{ {
name: "علوم اول", name: window.t("علوم اول"),
imageUrl: olum1Image, imageUrl: olum1Image,
}, },
{ {
name: "علوم هفتم", name: window.t("علوم هفتم"),
imageUrl: olum7Image, imageUrl: olum7Image,
}, },
{ {
name: "علوم چهارم", name: window.t("علوم چهارم"),
imageUrl: olum4Image, imageUrl: olum4Image,
}, },
{ {
name: "علوم چهارم", name: window.t("علوم چهارم"),
imageUrl: olum4Image, imageUrl: olum4Image,
}, },
{ {
name: "علوم چهارم", name: window.t("علوم چهارم"),
imageUrl: olum4Image, imageUrl: olum4Image,
}, },
], ],

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

@ -9,33 +9,42 @@ function Responsive() {
background: `url(${emc2Image})`, background: `url(${emc2Image})`,
backgroundRepeat: "no-repeat", backgroundRepeat: "no-repeat",
backgroundPosition: "0px 0px", 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 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 "> <div className="flex ">
<h1 className="inline z-50"> <h1 className="inline z-50">
از طریق موبایل یا کامپیوتر میتونی {window.t("از طریق موبایل یا کامپیوتر میتونی")}
</h1> </h1>
</div> </div>
<div className="flex my-1.5"> <div className="flex my-1.5">
<div className="relative"> <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> <span className="h-1 w-full absolute bottom-0 left-0 bg-green1"></span>
</div> </div>
<h1 className="inline">کتابها به راحتی</h1> <h1 className="inline">{window.t("کتابها به راحتی")}</h1>
</div> </div>
<div className="flex flex-row"> <div className="flex flex-row">
<h1 className="inline"> دسترسی داشته باشی</h1> <h1 className="inline">
</div> {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>
<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>
</div> </div>
); );

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

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

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

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

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

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

@ -5,107 +5,48 @@ import separate from "../../../utils/separate";
import StarRating from "../../../components/StarRating"; import StarRating from "../../../components/StarRating";
import Progress from "../../../components/Progress"; import Progress from "../../../components/Progress";
function Rate({ desktop, productId, rateDetail }) { function Rate({ avarage, all, fields, desktop }) {
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]);
return ( return (
<div className="w-full flex justify-between items-center mt-5"> <div className="w-full flex justify-between items-center mt-5">
<div className="flex flex-col items-center justify-center h-full ml-4"> <div className="flex flex-col items-center justify-center h-full ml-4">
{desktop ? ( {desktop ? (
<h1 className={`text-gray-600 mb-2 font-bold dark:text-white`}> <h1 className={`text-gray-600 mb-2 font-bold dark:text-white`}>
{rate || " "} {avarage}
</h1> </h1>
) : ( ) : (
<strong <strong
className={`text-blue5F mb-2 font-bold dark:text-white`} className={`text-blue5F mb-2 font-bold dark:text-white`}
style={{ fontSize: "calc(100vw / 10)" }} style={{ fontSize: "calc(100vw / 10)" }}
> >
{rate || " "} {avarage}
</strong> </strong>
)} )}
<div className=""> <div className="">
<StarRating value={rate} /> <StarRating />
</div> </div>
{allCount ? (
<span className="text-base text-gray70 mt-2 dark:text-white"> <span className="text-base text-gray70 mt-2 dark:text-white">
{" "} {separate(all)}
{`از بین ${allCount} نفر`}
</span> </span>
) : null}
</div> </div>
<ul className="p-0 m-0 list-none flex flex-col flex-1"> <ul className="p-0 m-0 list-none flex flex-col flex-1">
{[ {fields.map((item, index) => (
{
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) => (
<li <li
key={index} key={index}
className="w-full flex flex-row-reverse items-center justify-between" className="w-full flex flex-row-reverse items-center justify-between"
> >
<span className="mr-2 text-xs text-blue5F dark:text-white"> <span className="mr-2 text-xs text-blue5F dark:text-white">
{item.name || " "} {item.name}
</span> </span>
{desktop ? ( {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"> <span className="ml-2 text-xs text-blue5F dark:text-white">
{item.value + "%"} {item.percent + "%"}
</span> </span>
) : null}
</li> </li>
))} ))}
</ul> </ul>
@ -114,3 +55,30 @@ function Rate({ desktop, productId, rateDetail }) {
} }
export default Rate; 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} {book?.name}
</h1> </h1>
<div className="text-green7B text-tiny dark:text-greenBA"> <div className="text-green7B text-tiny dark:text-greenBA">
{"پایه" + " " + grades[book?.gradeId]} {window.t("پایه") + " " + grades[book?.gradeId]}
</div> </div>
</div> </div>
</header> </header>
@ -147,13 +147,15 @@ export const Product = ({
style={{ direction: "ltr" }} 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"> <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>
<li className="border-solid border-blueFE flex-1 flex-shrink-0 text-center text-tiny leading-5 font-medium text-green7B dark:text-white"> <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> {window.t("فیزیکی - دیجیتالی")}
<span>{digitalAvailableForSell ? "دیجیتال - " : ""}</span> <br /> {window.t("در دسترس")}
<span>{physicalAvailableForSell ? "فیزیکی" : ""}</span> </li>
<br /> در دسترس <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> </li>
{book?.rate ? ( {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"> <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} ) : null}
</ul> </ul>
<h2 className="text-green7B text-base font-semibold mt-10 dark:text-greenBA"> <h2 className="text-green7B text-base font-semibold mt-10 dark:text-greenBA">
نسخه محصول را انتخاب کنید {window.t("نسخه محصول را انتخاب کنید")}
</h2> </h2>
{physicalProduct && physicalAvailableForSell ? ( <div className="w-full flex flex-row justify-between items-center mt-5">
<div className="w-full flex justify-between items-center mt-5 gap-2">
<ButtonBetween <ButtonBetween
width="72%" width="100%"
item={"خرید نسخه فیزیکی کتاب"} item={window.t("خرید نسخه فیزیکی کتاب")}
status={separate(physicalProduct?.price) + " " + "تومان"} status={
onClick={() => { separate(book?.product[1]?.price) + " " + window.t("تومان")
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 { onClick={() =>
setDialog({ userId
text: window.t( ? pushToCart({
"ابتدا میبایست وارد حساب کاربری خود شوید." productId: book?.product[1]?.id,
), userId,
type: "confirm", count: 1,
accept: () => navigation("/login"), })
open: true, : toast.info(window.t("ابتدا وارد حساب کاربری خود شوید"))
});
} }
}}
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> </div>
) : null} <div className="w-full flex flex-row justify-between items-center mt-4 gap-2">
{digitalProduct && digitalAvailableForSell ? (
<div className="w-full flex justify-between items-center mt-4 gap-2">
<ButtonBetween <ButtonBetween
width="72%" width="72%"
item={"خرید نسخه دیجیتال کتاب"} item={window.t("خرید نسخه دیجیتال کتاب")}
status={separate(digitalProduct?.price) + " " + "تومان"} status={
onClick={() => { separate(book?.product[0]?.price) + " " + window.t("تومان")
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 { onClick={() =>
setDialog({ userId
text: window.t( ? pushToCart({
"ابتدا میبایست وارد حساب کاربری خود شوید." productId: book?.product[0]?.id,
), userId,
type: "confirm", count: 1,
accept: () => navigation("/login"), })
open: true, : toast.info(window.t("ابتدا وارد حساب کاربری خود شوید."))
});
} }
}}
loading={userProductLoading && whichTypeAdded === "digital"}
/> />
<a <a
href={`https://dnvn.ir/xpdf/${book?.sampleFileId}`} 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" 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" }} style={{ padding: "18px 0px" }}
> >
مشاهده نمونه {window.t("مشاهده نمونه")}
</a> </a>
</div> </div>
) : null} <div className="w-full flex flex-row justify-between items-center mt-4">
{videoProduct && videoAvailableForSell ? (
<div className="w-full flex justify-between items-center mt-4">
<ButtonBetween <ButtonBetween
width="72%" width="72%"
item={"خرید نسخه ویدئویی کتاب"} item={window.t("خرید نسخه ویدئویی کتاب")}
status={separate(videoProduct?.price) + " " + "تومان"} status={
onClick={() => { separate(book?.product[2]?.price) + " " + window.t("تومان")
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 { onClick={() =>
setDialog({ userId
text: window.t( ? pushToCart({
"ابتدا میبایست وارد حساب کاربری خود شوید." productId: book?.product[2]?.id,
), userId,
type: "confirm", count: 1,
accept: () => navigation("/login"), })
open: true, : toast.info(window.t("ابتدا وارد حساب کاربری خود شوید."))
});
} }
}}
loading={userProductLoading && whichTypeAdded === "video"}
/> />
<ButtonBetween <ButtonBetween
width="25%" width="25%"
item={"پیش نمایش"} item={window.t("پیش نمایش")}
onClick={() => navigation("/videos/" + book?.id)} onClick={() => navigation("/videos/" + book?.id)}
/> />
</div> </div>
) : null}
<div className="w-full flex flex-col justify-between items-center mt-8"> <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"> <p className="text-sm text-gray70 mt-2 dark:text-white leading-6">
خالد حسینی تو رمان باد بادک باز مینویسه : ﻣﺮﺩ ﺁﻫﺴﺘﻪ ﺩﺭ ﮔﻮﺵ ﻓﺮﺯﻧﺪ خالد حسینی تو رمان باد بادک باز مینویسه : ﻣﺮﺩ ﺁﻫﺴﺘﻪ ﺩﺭ ﮔﻮﺵ ﻓﺮﺯﻧﺪ
ﺗﺎﺯﻩ ﺑﻪ ﺑﻠﻮﻍ ﺭﺳﯿﺪﻩ ﺍﺵ ﺑﺮﺍﯼ ﭘﻨﺪ ﭼﻨﯿﻦ ﻧﺠﻮﺍ ﮐﺮﺩ : ﭘﺴﺮﻡ ﺩﺭ ﺯﻧﺪﮔﯽ ﺗﺎﺯﻩ ﺑﻪ ﺑﻠﻮﻍ ﺭﺳﯿﺪﻩ ﺍﺵ ﺑﺮﺍﯼ ﭘﻨﺪ ﭼﻨﯿﻦ ﻧﺠﻮﺍ ﮐﺮﺩ : ﭘﺴﺮﻡ ﺩﺭ ﺯﻧﺪﮔﯽ
@ -315,16 +242,12 @@ export const Product = ({
ﺩﺭ ﺯﻧﺪﮔﯽ ﺩﺭﻭﻍ ﻧﮕﻮ ﭼﺮﺍ ﮐﻪ ﺍﮔﺮ ﮔﻔﺘﯽ ﺻﺪﺍﻗﺖ ﺭﺍ ﺩﺯﺩﯾﺪﻩ ﺍﯼ، ﺧﯿﺎﻧﺖ ﻧﮑﻦ ﮐﻪ ﺩﺭ ﺯﻧﺪﮔﯽ ﺩﺭﻭﻍ ﻧﮕﻮ ﭼﺮﺍ ﮐﻪ ﺍﮔﺮ ﮔﻔﺘﯽ ﺻﺪﺍﻗﺖ ﺭﺍ ﺩﺯﺩﯾﺪﻩ ﺍﯼ، ﺧﯿﺎﻧﺖ ﻧﮑﻦ ﮐﻪ
ﺍﮔﺮ ﮐﺮﺩﯼ ﻋﺸﻖ ﺭﺍ ﺩﺯﺩﯾﺪﻩ ﺍﯼ، ﺧﺸﻮﻧﺖ ﻧﮑﻦ ﺍﮔﺮ ﮐﺮﺩﯼ ﻣﺤﺒﺖ ﺭﺍ ﺩﺯﺩﯾﺪﻩ ﺍﯼ، ﺍﮔﺮ ﮐﺮﺩﯼ ﻋﺸﻖ ﺭﺍ ﺩﺯﺩﯾﺪﻩ ﺍﯼ، ﺧﺸﻮﻧﺖ ﻧﮑﻦ ﺍﮔﺮ ﮐﺮﺩﯼ ﻣﺤﺒﺖ ﺭﺍ ﺩﺯﺩﯾﺪﻩ ﺍﯼ،
ﻧﺎ ﺣﻖ ﻧﮕﻮ ﺍﮔﺮ ﮔﻔﺘﯽ ﺣﻖ ﺭﺍ ﺩﺯﺩﯾﺪﻩ ﺍﯼ، ﺑﯽ ﺣﯿﺎﯾﯽ ﻧﮑﻦ ﺍﮔﺮ ﮐﺮﺩﯼ ﺷﺮﺍﻓﺖ ﺭﺍ ﻧﺎ ﺣﻖ ﻧﮕﻮ ﺍﮔﺮ ﮔﻔﺘﯽ ﺣﻖ ﺭﺍ ﺩﺯﺩﯾﺪﻩ ﺍﯼ، ﺑﯽ ﺣﯿﺎﯾﯽ ﻧﮑﻦ ﺍﮔﺮ ﮐﺮﺩﯼ ﺷﺮﺍﻓﺖ ﺭﺍ
ﺩﺯﺩﯾﺪﻩ ﺍی... ﭘﺲ ﺩﺭ ﺯﻧﺪﮔﯽ ﻓﻘﻂ ﺩﺯﺩﯼ نکن{" "} ﺩﺯﺩﯾﺪﻩ ﺍی... ﭘﺲ ﺩﺭ ﺯﻧﺪﮔﯽ ﻓﻘﻂ ﺩﺯﺩﯼ نکن
</p> </p>
</div> </div>
<div className="w-full flex flex-col justify-between items-center mt-10"> <div className="w-full flex flex-col justify-between items-center mt-10">
<Header title="امتیازات و نظرات" link="#" /> <Header title={window.t("امتیازات و نظرات")} link="#" />
<Rate <Rate value={book?.rate || 0} />
value={book?.rate || 0}
productId={physicalProduct?.id}
rateDetail={physicalProduct?.rateDetail}
/>
</div> </div>
<div <div
className="flex w-full pb-4 mt-10 no-scrollbar" className="flex w-full pb-4 mt-10 no-scrollbar"

@ -68,19 +68,19 @@ export const Main = ({
byAvailableFilter = bySubjectFilter; byAvailableFilter = bySubjectFilter;
} }
if (sort) { if (sort) {
if (sort === "ارزان ترین") { if (sort === window.t("ارزان ترین")) {
bySortFilter = byAvailableFilter?.sort( bySortFilter = byAvailableFilter?.sort(
(a, b) => (a, b) =>
a.product?.find((product) => product?.productType === type)?.price - a.product?.find((product) => product?.productType === type)?.price -
b.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( bySortFilter = byAvailableFilter?.sort(
(a, b) => (a, b) =>
a.product?.find((product) => product?.productType === type)?.rate - a.product?.find((product) => product?.productType === type)?.rate -
b.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( bySortFilter = byAvailableFilter?.sort(
(a, b) => moment(a.createdAt) - moment(b.createdAt) (a, b) => moment(a.createdAt) - moment(b.createdAt)
); );
@ -174,7 +174,7 @@ export const Main = ({
</g> </g>
</svg> </svg>
<span className="text-tiny text-greenBA font-bold"> <span className="text-tiny text-greenBA font-bold">
{"مرتب سازی" + "" + ":"} {window.t("مرتب سازی") + "" + ":"}
</span> </span>
</div> </div>
<ul className="flex py-0 flex-1 gap-4"> <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"> <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 && ( {filterLength > 0 && (
<span <span
className="text-tiny text-greenBA bg-greenBA bg-opacity-20 rounded-full px-3 py-2" 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> </span>
)} )}
</div> </div>
<div className="flex flex-col divide-y divide-solid divide-gray-200"> <div className="flex flex-col divide-y divide-solid divide-gray-200">
<Dropdown <Dropdown
list={productTypes} list={productTypes}
title="نوع محصول" title={window.t("نوع محصول")}
name="productType" name="productType"
active={filterOptions.productType} active={filterOptions.productType}
/> />
<Dropdown <Dropdown
list={Object.values(levels)} list={Object.values(levels)}
title={"پایه تحصیلی"} title={window.t("پایه تحصیلی")}
name="grade" name="grade"
active={filterOptions.grade} active={filterOptions.grade}
/> />
<Dropdown <Dropdown
list={subjects} list={subjects}
title={"عنوان کتاب"} title={window.t("عنوان کتاب")}
name="subject" name="subject"
active={filterOptions.subject} active={filterOptions.subject}
/> />
<CkeckItem title="فقط کالاهای موجود" name={"available"} /> <CkeckItem title={window.t("فقط کالاهای موجود")} name={"available"} />
</div> </div>
</div> </div>
); );

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

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

@ -21,7 +21,7 @@ export default function Tab({ data }) {
: "bg-white font-normal" : "bg-white font-normal"
}`} }`}
> >
تمامی محتوا {window.t("تمامی محتوا")}
</button> </button>
<button <button
onClick={() => setDataType("voice")} onClick={() => setDataType("voice")}
@ -31,7 +31,7 @@ export default function Tab({ data }) {
: "bg-white font-normal" : "bg-white font-normal"
}`} }`}
> >
صوت {window.t("صوت")}
</button> </button>
<button <button
onClick={() => setDataType("video")} onClick={() => setDataType("video")}
@ -41,7 +41,7 @@ export default function Tab({ data }) {
: "bg-white font-normal" : "bg-white font-normal"
}`} }`}
> >
ویدئو {window.t("ویدئو")}
</button> </button>
<button <button
onClick={() => setDataType("pdf")} onClick={() => setDataType("pdf")}
@ -51,7 +51,7 @@ export default function Tab({ data }) {
: "bg-white font-normal" : "bg-white font-normal"
}`} }`}
> >
پی دی اف {window.t("پی دی اف")}
</button> </button>
<button <button
onClick={() => setDataType("ppt")} onClick={() => setDataType("ppt")}
@ -61,7 +61,7 @@ export default function Tab({ data }) {
: "bg-white font-normal" : "bg-white font-normal"
}`} }`}
> >
پاور پوینت {window.t("پاور پوینت")}
</button> </button>
<button <button
onClick={() => setDataType("links")} onClick={() => setDataType("links")}
@ -71,18 +71,14 @@ export default function Tab({ data }) {
: "bg-white font-normal" : "bg-white font-normal"
}`} }`}
> >
لینک ها {window.t("لینک ها")}
</button> </button>
</div> </div>
<div className="flex flex-col w-full p-4"> <div className="flex flex-col w-full p-4">
{dataType === "all" && ( {dataType === "all" && (
<> <>
{data.voice && ( {data.voice && <Voice data={data?.voice} />}
<Voice data={data?.voice} /> {data.video && <Video data={data?.video} />}
)}
{data.video && (
<Video data={data?.video} />
)}
{data.ppt && <PPT data={data.ppt} />} {data.ppt && <PPT data={data.ppt} />}
{data.pdf && <PDF data={data.pdf} />} {data.pdf && <PDF data={data.pdf} />}
{data.links && <Links data={data.links} />} {data.links && <Links data={data.links} />}
@ -93,7 +89,9 @@ export default function Tab({ data }) {
{data.voice ? ( {data.voice ? (
<Voice 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 ? ( {data.video ? (
<Video 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 ? ( {data.ppt ? (
<PPT 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 ? ( {data.pdf ? (
<PDF 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 ? ( {data.links ? (
<Links 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"> <span className="text-sm text-blueC0 mt-2 dark:text-greenBA">
{grades[data?.book?.gradeId]} {grades[data?.book?.gradeId]}
</span> </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>
</div> </div>
<Tab <Tab
data={{ data={{
voice: data?.qr?.content?.filter((obj) => obj.type === 'voice')[0], voice: data?.qr?.content?.filter((obj) => obj.type === "voice")[0],
video: data?.qr?.content?.filter((obj) => obj.type === 'video')[0], video: data?.qr?.content?.filter((obj) => obj.type === "video")[0],
pdf: data?.qr?.content?.filter((obj) => obj.type === 'pdf')[0], pdf: data?.qr?.content?.filter((obj) => obj.type === "pdf")[0],
ppt: data?.qr?.content?.filter((obj) => obj.type === 'ppt')[0], ppt: data?.qr?.content?.filter((obj) => obj.type === "ppt")[0],
links: data?.qr?.content?.filter((obj) => obj.type === 'links')[0], links: data?.qr?.content?.filter((obj) => obj.type === "links")[0],
}} }}
/> />
</div> </div>
@ -67,18 +69,21 @@ export default connect(mapStateToProps, mapDispatchToProps)(Content);
Content.defaultProps = { Content.defaultProps = {
data: { data: {
name: "ریاضیات گسسته خیلی پیشرفته", name: window.t("ریاضیات گسسته خیلی پیشرفته"),
grade: "پایه هفتم ابتدایی", grade: window.t("پایه هفتم ابتدایی"),
page: "67", page: "67",
percent: "62", percent: "62",
voice: { name: "استاد رضایی: فصل پنجم توضیح در مورد آتش فشان ها", file: 1 }, voice: {
video: { name: "ویدئوی آزمایش آتشفشان سرکه ای", file: 1 }, name: window.t("استاد رضایی: فصل پنجم توضیح در مورد آتش فشان ها"),
pdf: { name: "فایل پاورپوینت ارائه درس آتشفشان ها", file: 1 }, file: 1,
ppt: { name: "فایل پاورپوینت ارائه درس آتشفشان ها", file: 1 }, },
video: { name: window.t("ویدئوی آزمایش آتشفشان سرکه ای"), file: 1 },
pdf: { name: window.t("فایل پی دی اف ارائه درس آتشفشان ها"), file: 1 },
ppt: { name: window.t("فایل پاورپوینت ارائه درس آتشفشان ها"), file: 1 },
links: [ links: [
"وبسایت آموزشی دانوین", window.t("وبسایت آموزشی دانوین"),
"وبسایت رسمی مدیریت راهبردی کشور", window.t("وبسایت رسمی مدیریت راهبردی کشور"),
"سازمان تبلیغات صنایع سبک ", window.t("سازمان تبلیغات صنایع سبک "),
], ],
}, },
}; };

@ -7,16 +7,23 @@ function Code({ codeId, setCodeId, userId, factorId }) {
const setOff = () => { const setOff = () => {
setCodeId({ offCodeValue: value, userId: userId, id: factorId }); setCodeId({ offCodeValue: value, userId: userId, id: factorId });
} };
return ( 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"> <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 <input
type="text" 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" 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> </div>
); );
} }
@ -29,9 +36,6 @@ const mapStateToProps = (state) => ({
const mapDispatchToProps = { const mapDispatchToProps = {
setCodeId: userFactor.update, setCodeId: userFactor.update,
} };
export default connect( export default connect(mapStateToProps, mapDispatchToProps)(Code);
mapStateToProps,
mapDispatchToProps
)(Code);

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

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

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

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

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

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

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

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

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

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

Loading…
Cancel
Save