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 { connect } from "react-redux"; |
||||||
|
import {book} from '../../../../../redux/actions'; |
||||||
|
|
||||||
import MyBooks from "../../../../Home/Portrait/Private/MyBooks"; |
import MyBooks from "../../../../Home/Portrait/Private/MyBooks"; |
||||||
import Videos from "../../../../Home/Portrait/Private/Videos"; |
import Videos from "../../../../Home/Portrait/Private/Videos"; |
||||||
|
import ProductSuggestion from './ProductSuggestion'; |
||||||
|
|
||||||
|
export const UserItems = ({list, grades, getList, isMobile}) => { |
||||||
export const UserItems = ({}) => { |
useEffect(() => { |
||||||
|
if(list.length <= 0){ |
||||||
|
getList(); |
||||||
|
} |
||||||
|
},[]); |
||||||
return ( |
return ( |
||||||
<div className="flex-1 flex flex-col overflow-y-scroll"> |
<div className="w-full flex flex-col lg:pt-20"> |
||||||
<MyBooks /> |
<MyBooks books={list} grades={grades} /> |
||||||
<Videos /> |
<br/> |
||||||
|
<Videos videos={list} grades={grades} /> |
||||||
|
<ProductSuggestion products={list} grades={grades} isMobile={isMobile} /> |
||||||
</div> |
</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); |
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 { connect } from "react-redux"; |
||||||
|
import {publicApi} from '../../../../redux/actions'; |
||||||
|
|
||||||
import Orders from "../../../Orders"; |
import Orders from "../../../Orders"; |
||||||
import UserItems from "../Main/UserItems"; |
import UserItems from "../Main/UserItems"; |
||||||
|
|
||||||
export const Main = ({}) => { |
export const Main = ({setHeaderOptions}) => { |
||||||
|
useEffect(() => { |
||||||
|
setHeaderOptions({shown: true}); |
||||||
|
},[]); |
||||||
const views = { |
const views = { |
||||||
orders: <Orders />, |
// orders: <Orders />,
|
||||||
userItems: <UserItems /> |
userItems: <UserItems /> |
||||||
}; |
}; |
||||||
const [page, setPage] = useState("orders"); |
const [page, setPage] = useState("userItems"); |
||||||
return <div className="flex-1 py-2.5 overflow-y-scroll">{views[page]}</div>; |
return <div className="w-full py-2.5">{views[page]}</div>; |
||||||
}; |
}; |
||||||
|
|
||||||
const mapStateToProps = (state) => ({}); |
const mapStateToProps = (state) => ({}); |
||||||
|
|
||||||
const mapDispatchToProps = {}; |
const mapDispatchToProps = { |
||||||
|
setHeaderOptions: publicApi.setHeaderOptions, |
||||||
|
}; |
||||||
|
|
||||||
export default connect(mapStateToProps, mapDispatchToProps)(Main); |
export default connect(mapStateToProps, mapDispatchToProps)(Main); |
||||||
|
@ -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,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