commit
2ac53fc232
81 changed files with 2481 additions and 1725 deletions
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 516 B |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 6.6 KiB |
@ -0,0 +1,28 @@ |
||||
import React from "react"; |
||||
import { connect } from "react-redux"; |
||||
import { publicApi } from "../../redux/actions"; |
||||
|
||||
export const OverLayer = ({ setOverLayer, overLayer }) => { |
||||
const click = (e) => { |
||||
setOverLayer(false); |
||||
e.stopPropagation(); |
||||
}; |
||||
return ( |
||||
overLayer && ( |
||||
<div |
||||
className="z-20 w-screen h-full fixed top-0 right-0 backdrop-filter blur-sm bg-opacity-60 bg-gray-600" |
||||
onClick={(e) => click(e)} |
||||
></div> |
||||
) |
||||
); |
||||
}; |
||||
|
||||
const mapStateToProps = (state) => ({ |
||||
overLayer: state.publicApi.overLayer, |
||||
}); |
||||
|
||||
const mapDispatchToProps = { |
||||
setOverLayer: publicApi.setOverLayer, |
||||
}; |
||||
|
||||
export default connect(mapStateToProps, mapDispatchToProps)(OverLayer); |
@ -1,84 +0,0 @@ |
||||
import React, {useState, useEffect} from "react"; |
||||
import { connect } from "react-redux"; |
||||
import { book, publicApi } from "../../redux/actions"; |
||||
import ScrollContainer from "react-indiana-drag-scroll"; |
||||
import { Link } from "react-router-dom"; |
||||
import Product from "../Product"; |
||||
import './index.css'; |
||||
|
||||
const SalesContainer = ({ |
||||
list, getList, |
||||
grades |
||||
}) =>{ |
||||
const [filter, setFilter] = useState({ |
||||
search: "", |
||||
grade: "", |
||||
productsType: "کتاب", |
||||
}); |
||||
useEffect(() => { |
||||
getList(); |
||||
}, []); |
||||
return( |
||||
<div className="w-full my-10"> |
||||
<div className="w-full border-b-2 border-solid border-blue-300 mb-24" style={{height: '100px'}}> |
||||
<div className="w-1/3 p-10 bg-white flex justify-between items-center" style={{ |
||||
marginBottom:'-5px', |
||||
height:'200px' |
||||
}} onClick={() => console.log(list)}> |
||||
|
||||
<div className="flex items-center "> |
||||
{/* <div className="w-6 h-6 bg-blue-300 ml-4 rounded-full"></div> */} |
||||
<h1 className="text-3xl leading-normal"> |
||||
|
||||
<h3 className=" bg-blueC0 text-white text-center"> دوشنبه </h3> |
||||
<h3 className="mr-4 w-24 text-center" style={{background: '#EFFF00'}}> کتاااابی </h3> |
||||
|
||||
</h1> |
||||
|
||||
</div> |
||||
<div className="flex items-center"> |
||||
<p className="text-md">بیش از ۵۰ کتاب تخفیف خورده</p> |
||||
<div className="w-6 h-6 bg-blue-300 mr-4 rounded-full"> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
<ScrollContainer className="flex overflow-x-scroll border-t-0 py-4 pl-10" style={{height:'550px'}} > |
||||
{ |
||||
list?.map((product, index) => ( |
||||
<Link to={"/products/" + product?.id}> |
||||
<Product |
||||
key={`prod_takhfif${index}`} |
||||
productsType={filter.productsType} |
||||
product={product} |
||||
index={Number(index)} |
||||
productName={`کتاب ${product?.name}`} |
||||
productCat={`پایه ${grades[product?.gradeId]}`} |
||||
productPrice={100000} |
||||
productImg={"https://dnvn.ir/api/v1/file/" + product?.fileIds} |
||||
numberOfRegards={160} |
||||
productTitleColor='text-blue5F' |
||||
productCatTextColor='text-blueC0' |
||||
productHolderBorder='' |
||||
productHolderHoverBorder='shadow-md' |
||||
big |
||||
starRate={Math.floor(Math.random() * 5) + 1} |
||||
discountPricePercent |
||||
hoverMode='blue' |
||||
/> |
||||
</Link> |
||||
))} |
||||
</ScrollContainer> |
||||
</div> |
||||
) |
||||
} |
||||
|
||||
const mapStateToProps = (state) => ({ |
||||
list: state.book.list, |
||||
isDark: state.publicApi.isDark, |
||||
}); |
||||
export default connect(mapStateToProps, { getList: book.list })(SalesContainer); |
@ -0,0 +1,33 @@ |
||||
import proxy from "../proxy"; |
||||
const userAddress = { |
||||
list: |
||||
(data = {}) => |
||||
async (dispatch) => { |
||||
await proxy.get("userAddress/list", data, { dispatch }); |
||||
}, |
||||
info: |
||||
(data = {}) => |
||||
async (dispatch) => { |
||||
await dispatch({ type: "userAddress/info", data }); |
||||
}, |
||||
update: |
||||
(data = {}, data2 = {}) => |
||||
async (dispatch) => { |
||||
await proxy.put("userAddress/update", data); |
||||
await proxy.get("userAddress/list", data2, { dispatch }); |
||||
}, |
||||
add: |
||||
(data = {}, data2 = {}, data3 = {}) => |
||||
async (dispatch) => { |
||||
await proxy.post("userAddress/add", data, { dispatch }); |
||||
await proxy.get("userAddress/list", data2, { dispatch }); |
||||
}, |
||||
del: |
||||
(data = {}, data2 = {}) => |
||||
async (dispatch) => { |
||||
await proxy.delete("userAddress/delete", data); |
||||
await proxy.get("userAddress/list", data2, { dispatch }); |
||||
}, |
||||
}; |
||||
|
||||
export default userAddress; |
@ -0,0 +1,23 @@ |
||||
import { toast } from "react-toastify"; |
||||
|
||||
const initialState = { |
||||
loading: false, |
||||
video: null, |
||||
listVOD: [], |
||||
}; |
||||
export default function content(state = initialState, action) { |
||||
let { type, data } = action; |
||||
switch (type) { |
||||
case "content/listVOD": |
||||
return {...state, loading: false, listVOD : data }; |
||||
case "content/infoVOD": |
||||
return {...state, loading: false, video : data }; |
||||
case "content/loading": |
||||
return { ...state, loading: true }; |
||||
case "content/error": |
||||
toast.error(data.message); |
||||
return { ...state, loading: false, error: data.message }; |
||||
default: |
||||
return state; |
||||
} |
||||
} |
@ -0,0 +1,35 @@ |
||||
import { toast } from "react-toastify"; |
||||
|
||||
const initialState = { |
||||
loading: false, |
||||
error: null, |
||||
list: [], |
||||
info : null, |
||||
}; |
||||
export default function userAddress(state = initialState, action) { |
||||
let { type, data } = action; |
||||
switch (type) { |
||||
case "userAddress/list": |
||||
return { |
||||
...state, |
||||
loading: false, |
||||
list: data, |
||||
error: null, |
||||
}; |
||||
case "userAddress/info": |
||||
return { ...state, loading: false, info: data, error: null }; |
||||
case "userAddress/update": |
||||
return { ...state, loading: false, error: null }; |
||||
case "userAddress/add": |
||||
return { ...state, loading: false, error: null, sum: data.payPrice }; |
||||
case "userAddress/delete": |
||||
return { ...state, loading: false, error: null }; |
||||
case "userAddress/loading": |
||||
return { ...state, loading: true }; |
||||
case "userAddress/error": |
||||
toast.error(data.message); |
||||
return { ...state, loading: false, error: data.message }; |
||||
default: |
||||
return state; |
||||
} |
||||
} |
@ -0,0 +1,12 @@ |
||||
const separate = (number) => { |
||||
number += ""; |
||||
number = number.replace(",", ""); |
||||
let x = number.split("."); |
||||
let y = x[0]; |
||||
let z = x.length > 1 ? "." + x[1] : ""; |
||||
let rgx = /(\d+)(\d{3})/; |
||||
while (rgx.test(y)) y = y.replace(rgx, "$1" + "," + "$2"); |
||||
return y + z; |
||||
}; |
||||
|
||||
export default separate; |
@ -0,0 +1,140 @@ |
||||
import React, { useState, useEffect } from "react"; |
||||
import { connect } from "react-redux"; |
||||
import { publicApi } from "../../redux/actions"; |
||||
import onInput from "../../utils/onInput"; |
||||
import Input from "../../components/Input"; |
||||
import Select from "../../components/Select"; |
||||
|
||||
export const Address = ({ city, province, getCity, getProvince }) => { |
||||
const [addressFields, setAddressFields] = useState({}); |
||||
|
||||
useEffect(() => { |
||||
if (province.length <= 1) { |
||||
getProvince(); |
||||
} |
||||
}, []); |
||||
|
||||
useEffect(() => { |
||||
if (addressFields?.provinceId) { |
||||
getCity({ provinceId: addressFields?.provinceId }); |
||||
} |
||||
}, [addressFields]); |
||||
|
||||
const onChange = (name, value) => {}; |
||||
|
||||
const Header = ({ title, text }) => { |
||||
return ( |
||||
<div className="flex flex-row items-center gap-2 mb-4"> |
||||
<strong className="text-blue5F text-base">{title}</strong> |
||||
<p className="mt-1 inline flex-1 text-sm text-gray70">{text}</p> |
||||
</div> |
||||
); |
||||
}; |
||||
return ( |
||||
<div |
||||
className="flex flex-row-reverse flex-1 pb-20 gap-5 divide-x divide-solid divide-gray-200" |
||||
style={{ minHeight: "calc(100vh - 500px)" }} |
||||
> |
||||
<div className="flex flex-col w-1/2"></div> |
||||
<div className="flex flex-col w-1/2 pl-4"> |
||||
<Header |
||||
title="اطلاعات هویتی" |
||||
text="( لطفا نام و نام خانوادگی خود را به طور کامل وارد نمایید )" |
||||
/> |
||||
<div className="flex flex-row items-center gap-5 w-full"> |
||||
<Input |
||||
width="50%" |
||||
label={"نام"} |
||||
regex={(val) => val} |
||||
name="firstName" |
||||
onChange={(name, value) => onChange(name, value)} |
||||
value={addressFields?.firstName} |
||||
align="text-right" |
||||
direction="rtl" |
||||
/> |
||||
<Input |
||||
width="50%" |
||||
label={"نام خانوادگی"} |
||||
regex={(val) => val} |
||||
name="lastName" |
||||
onChange={(name, value) => onChange(name, value)} |
||||
value={addressFields?.lastName} |
||||
align="text-right" |
||||
direction="rtl" |
||||
/> |
||||
</div> |
||||
<br /> |
||||
<br /> |
||||
<Header |
||||
title="شماره تماس" |
||||
text="( شماره موبایل و شماره تلفن ثابت خود را
|
||||
به همراه پیش شماره وارد کنید )" |
||||
/> |
||||
<div className="flex flex-row items-center gap-5 w-full"> |
||||
<Input |
||||
width="50%" |
||||
label={"شماره موبایل"} |
||||
regex={(val) => onInput.numberOnly(val)} |
||||
name="cellphone" |
||||
onChange={(name, value) => onChange(name, value)} |
||||
value={addressFields?.cellphone} |
||||
align="text-right" |
||||
direction="ltr" |
||||
/> |
||||
<Input |
||||
width="50%" |
||||
label={"شماره تلفن"} |
||||
regex={(val) => onInput.numberOnly(val)} |
||||
name="tellphone" |
||||
onChange={(name, value) => onChange(name, value)} |
||||
value={addressFields?.lastName} |
||||
align="text-right" |
||||
direction="ltr" |
||||
/> |
||||
</div> |
||||
<br /> |
||||
<br /> |
||||
<Header |
||||
title="آدرس" |
||||
text="( لطفا نام استان و شهرستان و آدرس |
||||
خود را با دقت تکمیل نمایید )" |
||||
/> |
||||
<div className="flex flex-row items-center gap-5 w-full mt-3"> |
||||
<Select |
||||
options={province} |
||||
name="provinceId" |
||||
onChange={(name, value) => onChange(name, value)} |
||||
/> |
||||
<Select |
||||
options={city} |
||||
name="cityId" |
||||
onChange={(name, value) => onChange(name, value)} |
||||
/> |
||||
</div> |
||||
<br /> |
||||
<Input |
||||
width="50%" |
||||
label={"کد پستی"} |
||||
regex={(val) => onInput.numberOnly(val)} |
||||
name="tellphone" |
||||
onChange={(name, value) => onChange(name, value)} |
||||
value={addressFields?.lastName} |
||||
align="text-right" |
||||
direction="ltr" |
||||
/> |
||||
</div> |
||||
</div> |
||||
); |
||||
}; |
||||
|
||||
const mapStateToProps = (state) => ({ |
||||
province: state.publicApi.province, |
||||
city: state.publicApi.city, |
||||
}); |
||||
|
||||
const mapDispatchToProps = { |
||||
getProvince: publicApi.getProvince, |
||||
getCity: publicApi.getCity, |
||||
}; |
||||
|
||||
export default connect(mapStateToProps, mapDispatchToProps)(Address); |
@ -0,0 +1,124 @@ |
||||
const list = [ |
||||
{ |
||||
title: "دسکتاپ - بنر بالای سایت", |
||||
description: "گرفتن لیست واقعی بنرها از دیتابیس", |
||||
status: 0, |
||||
developer: "", |
||||
}, |
||||
{ |
||||
title: "دسکتاپ - اسلایدر", |
||||
description: "اضافه کردن دکمه های اسلایدر", |
||||
status: 0, |
||||
developer: "", |
||||
}, |
||||
{ |
||||
title: "دسکتاپ - منوی بالای سایت", |
||||
description: "فعال سازی جستجو", |
||||
status: 0, |
||||
developer: "", |
||||
}, |
||||
{ |
||||
title: "دسکتاپ - منوی بالای سایت", |
||||
description: "تعداد محصولات داخل سبد خرید نمایش داده شود", |
||||
status: 0, |
||||
developer: "", |
||||
}, |
||||
{ |
||||
title: "دسکتاپ - صفحه محصولات ", |
||||
description: "فیلتر محصولات کاملا درست شود.", |
||||
status: 0, |
||||
developer: "", |
||||
}, |
||||
{ |
||||
title: "دسکتاپ - صفحه محصول", |
||||
description: "خطای اجرای منطق داریم", |
||||
status: 0, |
||||
developer: "", |
||||
}, |
||||
{ |
||||
title: "دسکتاپ - صفحه محصول", |
||||
description: "اسلایدر عکس محصول کار نمیکند و به سرور وصل نیست.", |
||||
status: 0, |
||||
developer: "", |
||||
}, |
||||
{ |
||||
title: "دسکتاپ - صفحه محصول", |
||||
description: "دکمه مشاهده نمونه کار نمیکند.", |
||||
status: 0, |
||||
developer: "", |
||||
}, |
||||
{ |
||||
title: "دسکتاپ - صفحه محصول", |
||||
description: "دکمه مشاهده دوره ویدیویی محصول کار نمیکند.", |
||||
status: 0, |
||||
developer: "", |
||||
}, |
||||
{ |
||||
title: "دسکتاپ - صفحه محصول", |
||||
description: "قسمت ثبت رضایت مشتری توسط ستاره به سرور وصل نیست", |
||||
status: 0, |
||||
developer: "", |
||||
}, |
||||
{ |
||||
title: "دسکتاپ - صفحه محصول", |
||||
description: "اصلاعات منوی سمت چپ واقعی نیست و همچنین دکمه اضافه کردن به سبد خرید کار نمیکند.", |
||||
status: 0, |
||||
developer: "", |
||||
}, |
||||
{ |
||||
title: "دسکتاپ - صفحه محصول", |
||||
description: "تب مشخصات اطلاعاتش واقعی نیست.", |
||||
status: 0, |
||||
developer: "", |
||||
}, |
||||
{ |
||||
title: "دسکتاپ - صفحه محصول", |
||||
description: "تب پرسش و پاسخ و محتوایی ندارد.", |
||||
status: 0, |
||||
developer: "", |
||||
}, |
||||
{ |
||||
title: "دسکتاپ - صفحه محصول", |
||||
description: "امکان ثبت نظر برای محصول فراهم نیست.", |
||||
status: 0, |
||||
developer: "", |
||||
}, |
||||
{ |
||||
title: "دسکتاپ - صفحه ویدئو", |
||||
description: "قسمت نمایش ویدئو به api وصل نیست.", |
||||
status: 0, |
||||
developer: "", |
||||
}, |
||||
{ |
||||
title: "دسکتاپ - صفحه ویدئو", |
||||
description: "اسلایدر کار نمیکند.", |
||||
status: 0, |
||||
developer: "", |
||||
}, |
||||
{ |
||||
title: "دسکتاپ - صفحه ویدئو", |
||||
description: "تب مشخصات و پرسش و پاسخ محتوایی ندارد.", |
||||
status: 0, |
||||
developer: "", |
||||
}, |
||||
{ |
||||
title: "دسکتاپ - صفحه ویدئو", |
||||
description: "تب سرفصل ها مرتب نیست.", |
||||
status: 0, |
||||
developer: "", |
||||
}, |
||||
{ |
||||
title: "دسکتاپ - صفحه ویدئو", |
||||
description: "اضافه کردن به سبد خرید کار نمیکند.", |
||||
status: 0, |
||||
developer: "", |
||||
}, |
||||
{ |
||||
title: "دسکتاپ - صفحه نمایش ویدئو", |
||||
description: "دیزاین این صفحه مرتب نیست کاملا.", |
||||
status: 0, |
||||
developer: "", |
||||
}, |
||||
]; |
||||
|
||||
export default list; |
@ -0,0 +1,66 @@ |
||||
import React from "react"; |
||||
import list from "./data"; |
||||
|
||||
const colors = ['bg-white', 'bg-blue-200', 'bg-green-200', 'bg-red-200']; |
||||
const statuses = ['کاری انجام نشده', 'در حال انجام', 'انجام شد', 'به مشکل خوردم']; |
||||
|
||||
function Bugs({}) { |
||||
return ( |
||||
<ul className="flex flex-col w-4/5 gap-4 mx-auto h-screen"> |
||||
<div className="w-full flex justify-center mx-auto"> |
||||
<div className="flex flex-col w-full"> |
||||
<div className="w-full"> |
||||
<div className="w-full "> |
||||
<table className="w-full"> |
||||
<thead className="bg-gray-500"> |
||||
<tr> |
||||
<th className="px-6 py-2 text-tiny text-white">Title</th> |
||||
<th className="px-6 py-2 text-tiny text-white"> |
||||
Description |
||||
</th> |
||||
<th className="px-6 py-2 text-tiny text-white">Status</th> |
||||
<th className="px-6 py-2 text-tiny text-white"> |
||||
Developer |
||||
</th> |
||||
</tr> |
||||
</thead> |
||||
<tbody |
||||
className="overflow-y-scroll" |
||||
style={{ minHeight: "100%" }} |
||||
> |
||||
{list.map((bug, index) => ( |
||||
<tr |
||||
className={`whitespace-nowrap p-2 w-full border border-solid border-gray-300 ${ |
||||
colors[bug.status] |
||||
}`}
|
||||
key={bug.title} |
||||
> |
||||
<td className="px-6 py-4 text-center border border-solid border-gray-300"> |
||||
<div className="text-sm text-gray-900">{bug.title}</div> |
||||
</td> |
||||
<td className="px-6 py-4 text-center border border-solid border-gray-300"> |
||||
<div className="text-sm text-gray-900"> |
||||
{bug?.description} |
||||
</div> |
||||
</td> |
||||
<td className="px-6 py-4 text-sm text-gray-900 text-center border border-solid border-gray-300"> |
||||
{statuses[bug.status]} |
||||
</td> |
||||
<td className="px-6 py-4 text-center border border-solid border-gray-300"> |
||||
<div className="text-sm text-gray-900"> |
||||
{bug?.developer} |
||||
</div> |
||||
</td> |
||||
</tr> |
||||
))} |
||||
</tbody> |
||||
</table> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</ul> |
||||
); |
||||
} |
||||
|
||||
export default Bugs; |
@ -0,0 +1,46 @@ |
||||
import React from "react"; |
||||
import { Link } from "react-router-dom"; |
||||
import { Carousel } from "@trendyol-js/react-carousel"; |
||||
import Product from '../../../../../../components/Product'; |
||||
import arrow from "../../../../../../assets/icons/slider-arrow.svg"; |
||||
|
||||
function Suggestion({ products, grades, isMobile }) { |
||||
return ( |
||||
<div className="flex flex-col mt-8 px-4"> |
||||
<strong className="text-blueC0 dark:text-white font-bold text-sm lg:text-base"> |
||||
پیشنهادات ما به شما |
||||
</strong> |
||||
{products.length > 0 && ( |
||||
<div className="relative w-full" style={{ direction: "ltr" }}> |
||||
<Carousel |
||||
show={Math.round(window.innerWidth / 300)} |
||||
slide={2} |
||||
swiping={true} |
||||
useArrowKeys={true} |
||||
transition={0.5} |
||||
rightArrow={ |
||||
<img |
||||
className="absolute top-1/2 transform -translate-y-1/2 cursor-pointer p-2" |
||||
src={arrow} |
||||
alt="" |
||||
/> |
||||
} |
||||
leftArrow={ |
||||
<img |
||||
className="absolute top-1/2 transform -translate-y-1/2 -translate-x-5 cursor-pointer -rotate-180 p-2" |
||||
src={arrow} |
||||
alt="" |
||||
/> |
||||
} |
||||
> |
||||
{products.map((product, index) => ( |
||||
<Product key={index} product={product} imageSize={4.5} /> |
||||
))} |
||||
</Carousel> |
||||
</div> |
||||
)} |
||||
</div> |
||||
); |
||||
} |
||||
|
||||
export default Suggestion; |
@ -1,21 +1,35 @@ |
||||
import React from "react"; |
||||
import React, {useEffect} from "react"; |
||||
import { connect } from "react-redux"; |
||||
import {book} from '../../../../../redux/actions'; |
||||
|
||||
import MyBooks from "../../../../Home/Portrait/Private/MyBooks"; |
||||
import Videos from "../../../../Home/Portrait/Private/Videos"; |
||||
import ProductSuggestion from './ProductSuggestion'; |
||||
|
||||
|
||||
export const UserItems = ({}) => { |
||||
export const UserItems = ({list, grades, getList, isMobile}) => { |
||||
useEffect(() => { |
||||
if(list.length <= 0){ |
||||
getList(); |
||||
} |
||||
},[]); |
||||
return ( |
||||
<div className="flex-1 flex flex-col overflow-y-scroll"> |
||||
<MyBooks /> |
||||
<Videos /> |
||||
<div className="w-full flex flex-col lg:pt-20"> |
||||
<MyBooks books={list} grades={grades} /> |
||||
<br/> |
||||
<Videos videos={list} grades={grades} /> |
||||
<ProductSuggestion products={list} grades={grades} isMobile={isMobile} /> |
||||
</div> |
||||
); |
||||
}; |
||||
|
||||
const mapStateToProps = (state) => ({}); |
||||
const mapStateToProps = (state) => ({ |
||||
list : state.book.list, |
||||
grades: state.publicApi.grades, |
||||
isMobile: state.publicApi.isMobile |
||||
}); |
||||
|
||||
const mapDispatchToProps = {}; |
||||
const mapDispatchToProps = { |
||||
getList : book.list, |
||||
}; |
||||
|
||||
export default connect(mapStateToProps, mapDispatchToProps)(UserItems); |
@ -1,20 +1,26 @@ |
||||
import React, { useState } from "react"; |
||||
import React, { useState, useEffect } from "react"; |
||||
import { connect } from "react-redux"; |
||||
import {publicApi} from '../../../../redux/actions'; |
||||
|
||||
import Orders from "../../../Orders"; |
||||
import UserItems from "../Main/UserItems"; |
||||
|
||||
export const Main = ({}) => { |
||||
export const Main = ({setHeaderOptions}) => { |
||||
useEffect(() => { |
||||
setHeaderOptions({shown: true}); |
||||
},[]); |
||||
const views = { |
||||
orders: <Orders />, |
||||
// orders: <Orders />,
|
||||
userItems: <UserItems /> |
||||
}; |
||||
const [page, setPage] = useState("orders"); |
||||
return <div className="flex-1 py-2.5 overflow-y-scroll">{views[page]}</div>; |
||||
const [page, setPage] = useState("userItems"); |
||||
return <div className="w-full py-2.5">{views[page]}</div>; |
||||
}; |
||||
|
||||
const mapStateToProps = (state) => ({}); |
||||
|
||||
const mapDispatchToProps = {}; |
||||
const mapDispatchToProps = { |
||||
setHeaderOptions: publicApi.setHeaderOptions, |
||||
}; |
||||
|
||||
export default connect(mapStateToProps, mapDispatchToProps)(Main); |
||||
|
@ -1,88 +1,87 @@ |
||||
|
||||
import React, { useState, useEffect } from "react"; |
||||
import { connect } from "react-redux"; |
||||
import { book} from '../../../../redux/actions' |
||||
import { book } from "../../../../redux/actions"; |
||||
import { Carousel } from "@trendyol-js/react-carousel"; |
||||
import arrow from "../../../../assets/icons/slider-arrow.svg"; |
||||
import { Link } from "react-router-dom"; |
||||
import Product from '../../../../components/Product'; |
||||
import Product from "../../../../components/Product"; |
||||
import Button from "../../../../components/Button"; |
||||
import ScrollContainer from "react-indiana-drag-scroll"; |
||||
// import ScrollContainer from "react-indiana-drag-scroll";
|
||||
|
||||
const Part2 = ( |
||||
{ books, |
||||
getBooks, |
||||
grades} |
||||
) => { |
||||
console.log({books}) |
||||
const [filter, setFilter] = useState({ |
||||
search: "", |
||||
grade: "", |
||||
productsType: "کتاب", |
||||
}); |
||||
useEffect(() => { |
||||
getBooks(); |
||||
}, []); |
||||
return ( |
||||
<div className="w-full my-6" style={{ |
||||
height: '550px' |
||||
}}> |
||||
<div className="w-full flex justify-between items-center pr-10"> |
||||
<div className="flex items-center text-4xl font-black text-blue52"> |
||||
<div className="w-6 h-6 bg-blue-300 ml-4 rounded-full"></div> |
||||
<h1> |
||||
کتاب های جدید |
||||
</h1> |
||||
</div> |
||||
<div> |
||||
<Link to='/products'> |
||||
<Button |
||||
title="مشاهده لیست محصولات" |
||||
backgroundColor="bg-blue-100" |
||||
border={{ |
||||
color: "#196EC055", |
||||
width: "0px",
|
||||
}} |
||||
width="100%" |
||||
selectable={true} |
||||
|
||||
color= "text-blueC0" |
||||
onClick={() => null} |
||||
radius={false} |
||||
twPaddings="py-4 px-12 rounded" |
||||
/> |
||||
</Link> |
||||
</div> |
||||
</div> |
||||
<ScrollContainer className="flex overflow-x-scroll py-4 pl-10"> |
||||
{ |
||||
books?.slice(15,24).map((product, index) => ( |
||||
<Link to={"/products/" + product?.id}> |
||||
<Product |
||||
key={`prod_New${index}`} |
||||
productsType={filter.productsType} |
||||
product={product} |
||||
index={Number(index)} |
||||
productName={`کتاب ${product?.name}`} |
||||
productCat={`پایه ${grades[product?.gradeId]}`} |
||||
productPrice={100000} |
||||
productImg={"https://dnvn.ir/api/v1/file/" + product?.fileIds} |
||||
numberOfRegards={160} |
||||
productTitleColor='text-blue5F' |
||||
productCatTextColor='text-blueC0' |
||||
productHolderBorder='' |
||||
productHolderHoverBorder='shadow-md' |
||||
hoverMode='blue' |
||||
big |
||||
starRate={Math.floor(Math.random() * 5) + 1} |
||||
const Part2 = ({ books, grades }) => { |
||||
// console.log({ books });
|
||||
const [filter, setFilter] = useState({ |
||||
search: "", |
||||
grade: "", |
||||
productsType: "کتاب", |
||||
}); |
||||
return ( |
||||
<div |
||||
className="w-full my-6" |
||||
style={ |
||||
{ |
||||
// height: "550px",
|
||||
} |
||||
} |
||||
> |
||||
<div className="w-full flex justify-between items-center mb-4"> |
||||
<div className="flex items-center text-4xl font-black text-blue52"> |
||||
<div className="w-6 h-6 bg-blue-300 ml-4 rounded-full"></div> |
||||
<h1 className="text-2xl text-blue5F">کتاب های جدید</h1> |
||||
</div> |
||||
<div> |
||||
<Link to="/products"> |
||||
<Button |
||||
title="مشاهده لیست محصولات" |
||||
backgroundColor="bg-blue-100" |
||||
border={{ |
||||
color: "#196EC055", |
||||
width: "0px", |
||||
}} |
||||
width="100%" |
||||
selectable={true} |
||||
color="text-blueC0" |
||||
onClick={() => null} |
||||
radius={false} |
||||
twPaddings="py-4 px-12 rounded" |
||||
/> |
||||
</Link> |
||||
</div> |
||||
</div> |
||||
{books.length > 0 && ( |
||||
<div className="relative w-full" style={{ direction: "ltr" }}> |
||||
<Carousel |
||||
show={Math.round(window.innerWidth / 350)} |
||||
slide={2} |
||||
swiping={true} |
||||
useArrowKeys={true} |
||||
transition={0.5} |
||||
rightArrow={ |
||||
<img |
||||
className="absolute top-1/2 transform -translate-y-1/2 cursor-pointer p-2" |
||||
src={arrow} |
||||
alt="" |
||||
/> |
||||
} |
||||
leftArrow={ |
||||
<img |
||||
className="absolute top-1/2 transform -translate-y-1/2 -translate-x-5 cursor-pointer -rotate-180 p-2" |
||||
src={arrow} |
||||
alt="" |
||||
/> |
||||
</Link> |
||||
} |
||||
> |
||||
{books.map((product, index) => ( |
||||
<Product key={index} product={product} imageSize={3} /> |
||||
))} |
||||
</ScrollContainer> |
||||
</Carousel> |
||||
</div> |
||||
) |
||||
} |
||||
)} |
||||
</div> |
||||
); |
||||
}; |
||||
|
||||
const mapStateToProps = (state) => ({ |
||||
books: state.book.list, |
||||
isDark: state.publicApi.isDark, |
||||
isDark: state.publicApi.isDark, |
||||
}); |
||||
export default connect(mapStateToProps, { getBooks: book.list })(Part2); |
||||
export default connect(mapStateToProps, {})(Part2); |
||||
|
@ -0,0 +1,78 @@ |
||||
import React, { useState, useEffect } from "react"; |
||||
import { connect } from "react-redux"; |
||||
import { book, publicApi } from "../../../../redux/actions"; |
||||
// import ScrollContainer from "react-indiana-drag-scroll";
|
||||
import { Carousel } from "@trendyol-js/react-carousel"; |
||||
import arrow from "../../../../assets/icons/slider-arrow.svg"; |
||||
import { Link } from "react-router-dom"; |
||||
import Product from "../../../../components/Product"; |
||||
import "./index.css"; |
||||
|
||||
const SalesContainer = ({ books }) => { |
||||
const [filter, setFilter] = useState({ |
||||
search: "", |
||||
grade: "", |
||||
productsType: "کتاب", |
||||
}); |
||||
return ( |
||||
<div className="w-full my-10"> |
||||
<div className="w-full py-10 pl-2 bg-white flex justify-between items-center gap-3"> |
||||
<div className="flex flex-row items-center pl-4"> |
||||
{/* <div className="w-6 h-6 bg-blue-300 ml-4 rounded-full"></div> */} |
||||
<div className="text-3xl leading-normal"> |
||||
<h3 className=" bg-blueC0 text-white text-center"> دوشنبه </h3> |
||||
<h3 |
||||
className="mr-4 text-center" |
||||
style={{ background: "#EFFF00" }} |
||||
> |
||||
{" "} |
||||
کتاااابی{" "} |
||||
</h3> |
||||
</div> |
||||
</div> |
||||
<div className="flex items-center"> |
||||
<p className="text-md flex">بیش از ۵۰ کتاب تخفیف خورده </p> |
||||
<div className="w-6 h-6 bg-blue-300 mr-4 rounded-full"></div> |
||||
</div> |
||||
|
||||
<span className="flex-1 h-0.5 bg-gray-200 mr-10"></span> |
||||
</div> |
||||
{books.length > 0 && ( |
||||
<div className="relative w-full" style={{ direction: "ltr" }}> |
||||
<Carousel |
||||
show={Math.round(window.innerWidth / 350)} |
||||
slide={2} |
||||
swiping={true} |
||||
useArrowKeys={true} |
||||
transition={0.5} |
||||
rightArrow={ |
||||
<img |
||||
className="absolute top-1/2 transform -translate-y-1/2 cursor-pointer p-2" |
||||
src={arrow} |
||||
alt="" |
||||
// onClick={(e) => e.stopPropagation()}
|
||||
/> |
||||
} |
||||
leftArrow={ |
||||
<img |
||||
className="absolute top-1/2 transform -translate-y-1/2 -translate-x-5 cursor-pointer -rotate-180 p-2" |
||||
src={arrow} |
||||
alt="" |
||||
// onClick={(e) => e.stopPropagation()}
|
||||
/> |
||||
} |
||||
> |
||||
{books.map((product, index) => ( |
||||
<Product key={index} product={product} imageSize={3} /> |
||||
))} |
||||
</Carousel> |
||||
</div> |
||||
)} |
||||
</div> |
||||
); |
||||
}; |
||||
|
||||
const mapStateToProps = (state) => ({ |
||||
isDark: state.publicApi.isDark, |
||||
}); |
||||
export default connect(mapStateToProps, { getList: book.list })(SalesContainer); |
@ -1,92 +1,94 @@ |
||||
import React, { useState, useEffect, useCallback } from "react"; |
||||
import ScrollContainer from "react-indiana-drag-scroll"; |
||||
import { connect } from 'react-redux'; |
||||
import { Link } from "react-router-dom"; |
||||
import filterIcon from '../../../assets/images/vuesax-linear-filter-tick.svg'; |
||||
import Banners from "../../../components/Banners"; |
||||
import SalesContainer from "../../../components/SalesContainer"; |
||||
import React, { useState, useEffect } from "react"; |
||||
import { connect } from "react-redux"; |
||||
import SalesContainer from "./SalesContainer"; |
||||
|
||||
import { book, publicApi } from "../../../redux/actions"; |
||||
import { book, publicApi, product } from "../../../redux/actions"; |
||||
import Part2 from "./Part2"; |
||||
import HomeImg from '../../../assets/images/HomeImg.png'; |
||||
import HomeImg from "../../../assets/images/HomeImg.png"; |
||||
import Part4 from "./Part4"; |
||||
import Design2D from "../../../components/Design2D"; |
||||
|
||||
const DesktopHome = ( |
||||
{ |
||||
books, |
||||
grades |
||||
} |
||||
const DesktopHome = ({ grades, getBooks, books }) => { |
||||
const banners = [ |
||||
{ |
||||
flex: 4, |
||||
items: [ |
||||
{ |
||||
bg: "", |
||||
flex: 1, |
||||
image: |
||||
"https://dkstatics-public.digikala.com/digikala-adservice-banners/d2a56a4a0c3ce4645bf0b405b0bbf3a29da1cbd3_1642861192.jpg", |
||||
}, |
||||
], |
||||
}, |
||||
{ |
||||
flex: 2, |
||||
items: [ |
||||
{ |
||||
bg: "", |
||||
flex: 1, |
||||
image: |
||||
"https://dkstatics-public.digikala.com/digikala-adservice-banners/e13aefeda2d3b44db78a92aac9cdc82a9b1650e9_1632230372.jpg?", |
||||
}, |
||||
{ |
||||
bg: "", |
||||
flex: 1, |
||||
image: |
||||
"https://dkstatics-public.digikala.com/digikala-adservice-banners/fe8f275f4e4b5e6eb2f66cf65f3895398e049b40_1625578273.jpg", |
||||
}, |
||||
], |
||||
}, |
||||
{ |
||||
flex: 2, |
||||
items: [ |
||||
{ |
||||
bg: "", |
||||
flex: 1, |
||||
image: |
||||
"https://dkstatics-public.digikala.com/digikala-adservice-banners/54d75e08cb0a72920ac3b2338232bf5ca70ccc74_1641638418.jpg", |
||||
}, |
||||
], |
||||
}, |
||||
]; |
||||
|
||||
) =>{ |
||||
const banners = [ |
||||
{ |
||||
flex: 4, |
||||
items: [{ bg:'', |
||||
flex: 1, |
||||
image: 'https://dkstatics-public.digikala.com/digikala-adservice-banners/d2a56a4a0c3ce4645bf0b405b0bbf3a29da1cbd3_1642861192.jpg' |
||||
}], |
||||
}, |
||||
{ |
||||
flex: 2, |
||||
items: [ |
||||
{ bg:'', |
||||
flex: 1, |
||||
image: 'https://dkstatics-public.digikala.com/digikala-adservice-banners/e13aefeda2d3b44db78a92aac9cdc82a9b1650e9_1632230372.jpg?' |
||||
}, |
||||
{ bg:'', |
||||
flex: 1, |
||||
image: 'https://dkstatics-public.digikala.com/digikala-adservice-banners/fe8f275f4e4b5e6eb2f66cf65f3895398e049b40_1625578273.jpg' |
||||
}, |
||||
], |
||||
}, |
||||
{ |
||||
flex: 2, |
||||
items: [{ bg:'', |
||||
flex: 1, |
||||
image: 'https://dkstatics-public.digikala.com/digikala-adservice-banners/54d75e08cb0a72920ac3b2338232bf5ca70ccc74_1641638418.jpg' |
||||
}], |
||||
}, |
||||
] |
||||
|
||||
return ( |
||||
|
||||
<div className="flex flex-col items-center w-11/12 justify-center my-10"> |
||||
{/* <Banners |
||||
useEffect(() => { |
||||
getBooks(); |
||||
},[]); |
||||
|
||||
return ( |
||||
<div className="flex flex-col items-center w-11/12 justify-center py-24"> |
||||
{/* <Banners |
||||
mainBanner='https://dkstatics-public.digikala.com/digikala-adservice-banners/d2a56a4a0c3ce4645bf0b405b0bbf3a29da1cbd3_1642861192.jpg' |
||||
midBottomBanner='https://dkstatics-public.digikala.com/digikala-adservice-banners/e13aefeda2d3b44db78a92aac9cdc82a9b1650e9_1632230372.jpg?' |
||||
leftBanner= |
||||
midTopBanner='https://dkstatics-public.digikala.com/digikala-adservice-banners/fe8f275f4e4b5e6eb2f66cf65f3895398e049b40_1625578273.jpg' |
||||
/> */} |
||||
<div className="w-full"> |
||||
<div className="w-full"> |
||||
<Design2D array={banners} /> |
||||
</div> |
||||
<SalesContainer books={books} grades={grades}/> |
||||
<Part2 grades={grades}/> |
||||
<div className="mb-16"> |
||||
<img src={HomeImg} /> |
||||
</div> |
||||
<Part4 /> |
||||
</div> |
||||
</div> |
||||
<SalesContainer books={books} /> |
||||
<Part2 grades={grades} books={books} /> |
||||
<div className="mb-16"> |
||||
<img src={HomeImg} /> |
||||
</div> |
||||
<Part4 books={books} grades={grades} /> |
||||
</div> |
||||
); |
||||
}; |
||||
|
||||
) |
||||
const mapStateToProps = (state) => ({ |
||||
isDark: state.publicApi.isDark, |
||||
isMobile: state.publicApi.isMobile, |
||||
books: state.book.list, |
||||
gradeFilterBooks: state.book.gradeFilterBooks, |
||||
selectedGrade: state.book.selectedGrade, |
||||
grades: state.publicApi.grades, |
||||
}); |
||||
|
||||
} |
||||
const mapDispatchToProps = { |
||||
getBooks: book.list, |
||||
gradeFilter: book.gradeFilter, |
||||
setHeaderOptions: publicApi.setHeaderOptions, |
||||
}; |
||||
|
||||
const mapStateToProps = (state) => ({ |
||||
isDark: state.publicApi.isDark, |
||||
isMobile: state.publicApi.isMobile, |
||||
books: state.book.list, |
||||
grades: state.publicApi.grades, |
||||
gradeFilterBooks: state.book.gradeFilterBooks, |
||||
selectedGrade: state.book.selectedGrade, |
||||
}); |
||||
|
||||
const mapDispatchToProps = { |
||||
getList: book.list, |
||||
gradeFilter: book.gradeFilter, |
||||
setHeaderOptions: publicApi.setHeaderOptions, |
||||
}; |
||||
|
||||
export default connect(mapStateToProps, mapDispatchToProps)(DesktopHome); |
||||
|
||||
export default connect(mapStateToProps, mapDispatchToProps)(DesktopHome); |
||||
|
@ -1,38 +0,0 @@ |
||||
import React from "react"; |
||||
import CourseChapter from "../../../components/CourseChapter"; |
||||
import VideoPlayer from "../../../components/VideoPlayer"; |
||||
const DesktopVideoDisplay = () =>{ |
||||
return( |
||||
<div className="w-full flex flex-col px-4 items-center"> |
||||
<div className="w-4/5 flex flex-col mb-6 justify-center items-center"> |
||||
<div className="w-full flex flex-row flex-1 justify-center overflow-hidden relative"> |
||||
<div className="flex flex-col w-4/5"> |
||||
|
||||
|
||||
<VideoPlayer playerWidth='100%' /> |
||||
|
||||
<h1 className="mx-4 my-2 text-4xl text-blue52 py-6 border-b-2 border-solid border-gray-300">ساز های باستانی ایران عزیز</h1> |
||||
<p className="m-4 text-gray-600"> |
||||
لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ، و با استفاده از طراحان گرافیک است، چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است، و برای شرایط فعلی تکنولوژی مورد نیاز، و کاربردهای متنوع با هدف بهبود ابزارهای کاربردی می باشد، کتابهای زیادی در شصت و سه درصد گذشته حال و آینده، شناخت فراوان جامعه و متخصصان را می طلبد، تا با نرم افزارها شناخت بیشتری را برای طراحان رایانه ای علی الخصوص طراحان خلاقی، و فرهنگ پیشرو در زبان فارسی ایجاد کرد، در این صورت می توان امید داشت که تمام و دشواری موجود در ارائه راهکارها، و شرایط سخت تایپ به پایان رسد و زمان مورد نیاز شامل حروفچینی دستاوردهای اصلی، و جوابگوی سوالات پیوسته اهل دنیای موجود طراحی اساسا مورد استفاده قرار گیرد. |
||||
</p> |
||||
</div> |
||||
<CourseChapter /> |
||||
</div> |
||||
{/* <div className="flex flex-col flex-1 justify-between pr-2"> |
||||
<div className="flex flex-col"> |
||||
<strong className="mt-1 text-blue5F text-base dark:text-white"> |
||||
{product.name} |
||||
</strong> |
||||
<span className="text-blueC0 text-xs mb-1 dark:text-greenBA">{product.grade}</span> |
||||
</div> |
||||
<Divider type={"vertical"} /> |
||||
</div> */} |
||||
<div> |
||||
|
||||
</div> |
||||
</div> |
||||
</div> |
||||
); |
||||
}; |
||||
|
||||
export default DesktopVideoDisplay; |
Loading…
Reference in new issue