reza added courses page

master
Reza_ashrafi 3 years ago
parent 4eb651a159
commit caba2fa0ad
  1. 3
      .vscode/settings.json
  2. 38
      src/components/BreadCrumbs/index.scss
  3. 18
      src/components/Menu/index.js
  4. 2
      src/components/NavbarDrawer/NavbarDrawer.tsx
  5. 16
      src/custom.scss
  6. 8
      src/redux/actions-type/public.tsx
  7. 2
      src/redux/actions/public.tsx
  8. 3
      src/redux/reducers/public.tsx
  9. 23
      src/router.js
  10. 11
      src/util/location.js
  11. 2
      src/views/Auth/Profile/Birthdate/index.scss
  12. 2
      src/views/Auth/Profile/Document/index.scss
  13. 2
      src/views/Auth/Profile/GenderSwitch/index.scss
  14. 2
      src/views/Auth/Profile/index.scss
  15. 117
      src/views/Courses/Course/index.scss
  16. 19
      src/views/Courses/Course/index.tsx
  17. 43
      src/views/Courses/index.scss
  18. 45
      src/views/Courses/index.tsx
  19. 4
      src/views/Home/Blogs/Blog/index.scss
  20. 1
      src/views/Home/Blogs/index.tsx
  21. 10
      src/views/Home/Books/Book/index.scss
  22. 9
      src/views/Home/Courses/Course/index.scss
  23. 3
      src/views/Home/Courses/index.scss
  24. 32
      src/views/Home/index.tsx

@ -0,0 +1,3 @@
{
"editor.tabSize": 2
}

@ -2,7 +2,43 @@
a { a {
text-decoration: none; text-decoration: none;
font-family: numeralLight; font-family: numeralLight;
color: #6F7074; color: #aaa;
letter-spacing: -1px; letter-spacing: -1px;
} }
} }
.MuiBreadcrumbs-separator{
color: #aaa;
}
@media screen and (min-width: 1441px) {
.MuiBreadcrumbs-li{
a {
font-size: 14px;
}
}
}
@media screen and (min-width: 1008px) and (max-width: 1440px) {
.MuiBreadcrumbs-li{
a {
font-size: calc(100vw / 100);
}
}
}
@media screen and (min-width: 641px) and (max-width: 1007px) {
.MuiBreadcrumbs-li{
a {
font-size: calc(100vw / 55);
}
}
}
@media screen and (max-width: 640px) {
.MuiBreadcrumbs-li{
a {
font-size: calc(100vw / 35);
}
}
}

@ -1,9 +1,12 @@
import * as React from 'react'; import * as React from 'react';
import { styled, alpha } from '@mui/material/styles'; import {Link} from 'react-router-dom';
import { styled } from '@mui/material/styles';
import Button from '@mui/material/Button'; import Button from '@mui/material/Button';
import Menu from '@mui/material/Menu'; import Menu from '@mui/material/Menu';
import MenuItem from '@mui/material/MenuItem'; import MenuItem from '@mui/material/MenuItem';
import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';
import {connect} from 'react-redux';
import { publicApi } from '../../redux/actions';
const StyledMenu = styled((props) => ( const StyledMenu = styled((props) => (
<Menu <Menu
@ -21,14 +24,15 @@ const StyledMenu = styled((props) => (
))(({ theme }) => ({ ))(({ theme }) => ({
})); }));
export default function CustomizedMenus({items}) { function CustomizedMenus({items, selectMenu}) {
const [anchorEl, setAnchorEl] = React.useState(null); const [anchorEl, setAnchorEl] = React.useState(null);
const open = Boolean(anchorEl); const open = Boolean(anchorEl);
const handleClick = (event) => { const handleClick = (event) => {
setAnchorEl(event.currentTarget); setAnchorEl(event.currentTarget);
}; };
const handleClose = () => { const handleClose = (value) => {
setAnchorEl(null); setAnchorEl(null);
selectMenu(value);
}; };
return ( return (
@ -56,8 +60,10 @@ export default function CustomizedMenus({items}) {
> >
{ {
items.map((item, i) => ( items.map((item, i) => (
<MenuItem onClick={handleClose} disableRipple> <MenuItem onClick={() => handleClose(item.value)} disableRipple>
<Link to={'/grades/'+item.value}>
{item.name} {item.name}
</Link>
</MenuItem> </MenuItem>
)) ))
} }
@ -65,3 +71,7 @@ export default function CustomizedMenus({items}) {
</div> </div>
); );
} }
export default connect((state) => ({
}), {selectMenu: publicApi.selectMenu,})(CustomizedMenus)

@ -231,7 +231,7 @@ const NavbarDrawer = ({ status, logout }: any) => {
> >
<div className="navbar-drawer__bottom--link d-flex"> <div className="navbar-drawer__bottom--link d-flex">
<AddCircleOutlineRoundedIcon <AddCircleOutlineRoundedIcon
style={{ fontSize: 30, color: "#777", margin: "0px 8px" }} style={{ fontSize: 30, color: "#333", margin: "0px 8px" }}
/> />
<div>اضافه کردن کاربر </div> <div>اضافه کردن کاربر </div>
{/* {item.message && <div class="badge">{item.message}</div>} */} {/* {item.message && <div class="badge">{item.message}</div>} */}

@ -221,14 +221,12 @@ p{
display: none !important; display: none !important;
} }
//JOL PLayer //JOL PLayer
.tooltip { .tooltip {
opacity: 1 !important; opacity: 1 !important;
transform: translateY(-2px) !important; transform: translateY(-2px) !important;
} }
//Menu //Menu
.MuiButton-root { .MuiButton-root {
font-family: numeralLight !important; font-family: numeralLight !important;
@ -250,6 +248,11 @@ p{
justify-content: center !important; justify-content: center !important;
text-align: center !important; text-align: center !important;
padding: 10px 0px !important; padding: 10px 0px !important;
a{
color: white;
width: 100%;
height: 100%;
}
&:nth-child(even) { &:nth-child(even) {
border-right: 1px solid #555 !important; border-right: 1px solid #555 !important;
} }
@ -257,6 +260,8 @@ p{
} }
} }
@media screen and (min-width: 1441px) { @media screen and (min-width: 1441px) {
.submit { .submit {
font-size: 16px; font-size: 16px;
@ -277,6 +282,13 @@ p{
.MuiOutlinedInput-input { .MuiOutlinedInput-input {
font-size: 20px; font-size: 20px;
} }
.MuiPaper-root {
.MuiList-root {
li {
font-size: 13px !important;
}
}
}
} }
@media screen and (min-width: 1008px) and (max-width: 1440px) { @media screen and (min-width: 1008px) and (max-width: 1440px) {

@ -34,7 +34,12 @@ interface getCity {
} }
interface getContactData { interface getContactData {
type : 'public/contact' type: "public/contact";
data: any;
}
interface selectMenu {
type: "public/selectMenu";
data: any; data: any;
} }
@ -61,6 +66,7 @@ type PublicAction =
| getProvince | getProvince
| getCity | getCity
| getContactData | getContactData
| selectMenu
| loading | loading
| error; | error;

@ -27,6 +27,8 @@ const publicApi = {
(data = {}) => (data = {}) =>
async (dispatch: Dispatch) => async (dispatch: Dispatch) =>
await proxy.get("public/city", data, { dispatch }), await proxy.get("public/city", data, { dispatch }),
selectMenu: (data: Object) => async (dispatch: Dispatch) =>
await dispatch({ type: "public/selectMenu", data: data }),
}; };
export default publicApi; export default publicApi;

@ -26,6 +26,7 @@ const initialState = {
name: "برنامه نویسی", name: "برنامه نویسی",
}, },
], ],
selectedMenu : null,
contactData: null contactData: null
}; };
@ -172,6 +173,8 @@ export default function publicApi(state = initialState, action: PublicAction) {
return { ...state, loading: false, error: null, province: data }; return { ...state, loading: false, error: null, province: data };
case "public/city": case "public/city":
return { ...state, loading: false, error: null, city: data }; return { ...state, loading: false, error: null, city: data };
case "public/selectMenu":
return { ...state, loading: false, error: null, selectedMenu : data };
case "loading": case "loading":
return { ...state, loading: true }; return { ...state, loading: true };
case "error": case "error":

@ -3,19 +3,19 @@ import {
BrowserRouter as Router, BrowserRouter as Router,
Route, Route,
Switch, Switch,
Redirect,
} from "react-router-dom"; } from "react-router-dom";
import { connect } from "react-redux"; import { connect } from "react-redux";
import Auth from "./views/Auth/index"; import Auth from "./views/Auth";
import Home from "./views/Home/index"; import Home from "./views/Home";
import Course from "./views/Course/index"; import Course from "./views/Course";
import VideoTube from "./views/VideoTube/index"; import VideoTube from "./views/VideoTube";
import Subscription from "./views/Subscription/index"; import Subscription from "./views/Subscription";
import Contact from "./views/Contact/index"; import Contact from "./views/Contact";
import Faq from "./views/Faq/index"; import Faq from "./views/Faq";
import PrivateRouter from "./components/PrivateRouter/index"; import PrivateRouter from "./components/PrivateRouter";
import proxy from "./redux/proxy"; import Courses from "./views/Courses";
// import proxy from "./redux/proxy";
function router({ status }) { function router({ status }) {
const home = ( const home = (
@ -35,6 +35,9 @@ function router({ status }) {
<Route exact path={"/login"}> <Route exact path={"/login"}>
<Auth page="login" /> <Auth page="login" />
</Route> </Route>
<Route exact path={"/grades/:id"}>
<Courses />
</Route>
<PrivateRouter <PrivateRouter
restricted={false} restricted={false}
component={Course} component={Course}

@ -0,0 +1,11 @@
class location {
getId = () => {
const pathname = window.location.pathname;
return pathname.slice(pathname.lastIndexOf('/') + 1, pathname.length);
}
}
const _location = new location();
export default _location;

@ -2,7 +2,7 @@
width: 100%; width: 100%;
border-radius: 10px; border-radius: 10px;
padding: 0px 10px; padding: 0px 10px;
border: 1px solid #777; border: 1px solid #333;
margin: 10px 0px; margin: 10px 0px;
label { label {
width: fit-content; width: fit-content;

@ -4,7 +4,7 @@
width: 100%; width: 100%;
height: 50px; height: 50px;
border-radius: 10px; border-radius: 10px;
border: 2px dashed #777; border: 2px dashed #333;
position: relative; position: relative;
input { input {
width: 100%; width: 100%;

@ -10,7 +10,7 @@
cursor: pointer; cursor: pointer;
color: #ccc; color: #ccc;
background-color: black; background-color: black;
border: 1px solid #777; border: 1px solid #333;
} }
&__active{ &__active{
background-color: #84de56 !important; background-color: #84de56 !important;

@ -24,7 +24,7 @@
} }
&__box { &__box {
width: 100%; width: 100%;
border: 1px solid #777; border: 1px solid #333;
border-radius: 20px; border-radius: 20px;
&--section { &--section {
width: 45%; width: 45%;

@ -0,0 +1,117 @@
.courses-course {
margin-top: 40px;
padding: 10px;
border-bottom: 1px solid #212121;
transition: all 0.5s;
* {
transition: all 0.5s;
color: #aaa;
}
img {
border-radius: 10px;
}
h1 {
transition: all 0.5s;
margin-bottom: 10px;
}
p {
}
}
@media screen and (min-width: 1441px) {
.courses-course {
&:hover {
background-color: #dddddd21;
border-radius: 10px;
box-shadow: 0px 0px 10px rgba(146, 146, 146, 0.6);
img {
transform: translateX(10px) scale(1.14);
}
h1 {
color: #84de56;
}
p {
color: #cececefa;
}
}
img {
height: 150px;
}
h1 {
font-size: 20px;
}
p {
font-size: 13px;
width: 80%;
}
}
}
@media screen and (min-width: 1008px) and (max-width: 1400px) {
.courses-course {
&:hover {
background-color: #dddddd21;
border-radius: 10px;
box-shadow: 0px 0px 10px rgba(146, 146, 146, 0.6);
img {
transform: translateX(10px) scale(1.14);
}
h1 {
color: #84de56;
}
p {
color: #cececefa;
}
}
img {
height: 150px;
}
h1 {
font-size: calc(100vw / 70);
}
p {
font-size: calc(100vw / 100);
width: 80%;
}
}
}
@media screen and (min-width : 641px) and (max-width: 1007px) {
.courses-course {
margin-top: 20px;
background-color: #aaaaaa21;
border-radius: 10px;
box-shadow: 0px 0px 10px rgba(146, 146, 146, 0.6);
img {
max-height: 120px;
}
h1 {
font-size: calc(100vw / 45);
color: #84de56;
}
p {
font-size: calc(100vw / 65);
width: 80%;
}
}
}
@media screen and (max-width: 640px) {
.courses-course {
margin-top: 20px;
background-color: #aaaaaa21;
border-radius: 10px;
box-shadow: 0px 0px 10px rgba(146, 146, 146, 0.6);
img {
max-height: 120px;
}
h1 {
font-size: calc(100vw / 24);
color: #84de56;
}
p {
font-size: calc(100vw / 40);
width: 80%;
}
}
}

@ -0,0 +1,19 @@
import React, { useState } from "react";
import "./index.scss";
import { Link } from "react-router-dom";
import location from "../../../util/location";
export default function Course({ data }: any) {
return (
<Link to={"/courses/" + location.getId()} className="courses-course d-flex">
<img src={`https://dnvn.ir/api/v1/file/${data.fileIds}`} alt="" />
<div className="d-flex flex-column justify-content-center px-3">
<h1>{data.name}</h1>
<p>
لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ و با استفاده
از طراحان گرافیک است چاپگرها و متون بلکه روزنامه و مجله در ستون و
</p>
</div>
</Link>
);
}

@ -0,0 +1,43 @@
.courses {
main {
margin-top: 30px;
header {
}
}
}
@media screen and (min-width: 1441px) {
.courses {
main {
max-width: 700px;
}
}
}
@media screen and (min-width: 1008px) and (max-width: 1400px) {
.courses {
main {
max-width: 700px;
}
}
}
@media screen and (min-width: 641px) and (max-width: 1007px) {
.courses {
main {
max-width: 500px;
margin-top: 10px;
}
}
}
@media screen and (max-width: 640px) {
.courses {
main {
max-width: 500px;
margin-top: 10px;
padding: 0px 10px;
}
}
}

@ -0,0 +1,45 @@
import React, { useState, useEffect } from "react";
import Navbar from "../../components/Navbar";
import Footer from "../../views/Home/Footer";
import "./index.scss";
import { book } from "../../redux/actions";
import { connect } from "react-redux";
import location from "../../util/location";
import Course from "./Course";
import BreadCrumbs from "../../components/BreadCrumbs";
function Courses({ getList, list,selectedMenu }: any) {
const [links, setLinks] = useState([
{ link: "/", name: "صفحه اصلی" },
{ link: "/courses", name: "دورهها" },
{ link: "/courses/2", name: "نام کتاب" },
]);
useEffect(() => {
getList();
}, []);
return (
<div className="courses main d-flex flex-column">
<Navbar />
<main className="d-flex flex-column">
<header className="d-flex">
<BreadCrumbs links={links} />
</header>
{list
.filter((item: any) => item.gradeId === selectedMenu)
.map((item: any, i: any) => (
<Course data={item} key={i} />
))}
</main>
<Footer />
</div>
);
}
export default connect(
(state: any) => ({
list: state.book.list,
selectedMenu : state.publicApi.selectedMenu,
}),
{ getList: book.list }
)(Courses);

@ -7,6 +7,7 @@
border-radius: 10px; border-radius: 10px;
padding-bottom: 15px; padding-bottom: 15px;
position: relative; position: relative;
transition: all 0.3s;
&__cover { &__cover {
position: absolute; position: absolute;
left: 0px; left: 0px;
@ -39,6 +40,9 @@
.home-blogs-blog { .home-blogs-blog {
height: 250px; height: 250px;
width: 100%; width: 100%;
&:hover{
transform : scale(0.9);
}
h2 { h2 {
font-size: 20px; font-size: 20px;
} }

@ -19,7 +19,6 @@ function Blogs(props: any) {
return 1; return 1;
} }
}; };
const { number, blogs } = props;
const list = useSelector((state: any) => state.blog.list); const list = useSelector((state: any) => state.blog.list);
useEffect(() => { useEffect(() => {
props.getList(); props.getList();

@ -1,7 +1,9 @@
.home-books-book{ .home-books-book{
padding: 0px 10px;
cursor: pointer; cursor: pointer;
border-bottom: 1px solid #424242; transition: all 0.5s;
border: 1px solid black;
padding: 10px;
border-radius: 10px;
img{ img{
border-radius: 8px; border-radius: 8px;
} }
@ -33,6 +35,10 @@
@media screen and (min-width : 1441px){ @media screen and (min-width : 1441px){
.home-books-book{ .home-books-book{
&:hover{
transform : scale(0.95);
border: 1px solid #84de56;
}
img{ img{
height: 300px; height: 300px;
} }

@ -1,6 +1,9 @@
.home-courses-course{ .home-courses-course{
padding: 0px 10px; padding: 10px 10px;
cursor: pointer; cursor: pointer;
transition: all 0.5s;
border: 1px solid black;
border-radius: 10px;
img{ img{
border-radius: 8px; border-radius: 8px;
margin: 0px auto; margin: 0px auto;
@ -32,6 +35,10 @@
@media screen and (min-width : 1441px){ @media screen and (min-width : 1441px){
.home-courses-course{ .home-courses-course{
&:hover{
border: 1px solid #84de56;
transform: scale(0.95);
}
img{ img{
height: 300px; height: 300px;
} }

@ -1,8 +1,7 @@
.home-courses { .home-courses {
width: 100%; width: 100%;
margin: 0px auto; margin: 0px auto;
border-top: 1px solid #424242; border-top: 1px solid #333; border-bottom: 1px solid #333;
border-bottom: 1px solid #424242;
position: relative; position: relative;
margin-top: 30px; margin-top: 30px;
padding: 20px 10px 50px; padding: 20px 10px 50px;

@ -65,7 +65,7 @@ function Home({
<Courses courses={sortFilterCourse ? sortFilterCourse : courseList} /> <Courses courses={sortFilterCourse ? sortFilterCourse : courseList} />
<GradeFilter grades={grades} grade={grade} setGrade={setGrade} /> <GradeFilter grades={grades} grade={grade} setGrade={setGrade} />
<Books list={gradeFilterBooks ? gradeFilterBooks : courseList} /> <Books list={gradeFilterBooks ? gradeFilterBooks : courseList} />
<Blogs blogs={blogs} /> <Blogs />
<AppDownload /> <AppDownload />
<Footer /> <Footer />
</div> </div>
@ -162,34 +162,4 @@ Home.defaultProps = {
imageUrl: header, imageUrl: header,
}, },
], ],
blogs: [
{
id: 0,
name: "فیزیک کوانتوم و موارد مشابه",
text: "لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ، و با استفاده از طراحان گرافیک است، چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است، و برای شرایط فعلی تکنولوژی مورد نیاز، و کاربردهای متنوع با هدف بهبود ابزارهای کاربردی می باشد، کتابهای زیادی در شصت و سه درصد گذشته حال و آینده، شناخت فراوان جامعه و متخصصان را می طلبد، تا با نرم افزارها شناخت بیشتری را برای طراحان رایانه ای علی الخصوص طراحان خلاقی، و فرهنگ پیشرو در زبان فارسی ایجاد کرد، در این صورت می توان امید داشت که تمام و دشواری موجود در ارائه راهکارها، و شرایط سخت تایپ به پایان رسد و زمان مورد نیاز شامل حروفچینی دستاوردهای اصلی، و جوابگوی سوالات پیوسته اهل دنیای موجود طراحی اساسا مورد استفاده قرار گیرد.",
imageUrl: blog1,
tags: ["دوره جدید", "تخفیفهای هفتگی", "پایه هفتم"],
},
{
id: 1,
name: "فیزیک کوانتوم و موارد مشابه",
text: "لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ، و با استفاده از طراحان گرافیک است، چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است، و برای شرایط فعلی تکنولوژی مورد نیاز، و کاربردهای متنوع با هدف بهبود ابزارهای کاربردی می باشد، کتابهای زیادی در شصت و سه درصد گذشته حال و آینده، شناخت فراوان جامعه و متخصصان را می طلبد، تا با نرم افزارها شناخت بیشتری را برای طراحان رایانه ای علی الخصوص طراحان خلاقی، و فرهنگ پیشرو در زبان فارسی ایجاد کرد، در این صورت می توان امید داشت که تمام و دشواری موجود در ارائه راهکارها، و شرایط سخت تایپ به پایان رسد و زمان مورد نیاز شامل حروفچینی دستاوردهای اصلی، و جوابگوی سوالات پیوسته اهل دنیای موجود طراحی اساسا مورد استفاده قرار گیرد.",
imageUrl: blog2,
tags: ["دوره جدید", "تخفیفهای هفتگی", "پایه هفتم"],
},
{
id: 2,
name: "فیزیک کوانتوم و موارد مشابه",
text: "لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ، و با استفاده از طراحان گرافیک است، چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است، و برای شرایط فعلی تکنولوژی مورد نیاز، و کاربردهای متنوع با هدف بهبود ابزارهای کاربردی می باشد، کتابهای زیادی در شصت و سه درصد گذشته حال و آینده، شناخت فراوان جامعه و متخصصان را می طلبد، تا با نرم افزارها شناخت بیشتری را برای طراحان رایانه ای علی الخصوص طراحان خلاقی، و فرهنگ پیشرو در زبان فارسی ایجاد کرد، در این صورت می توان امید داشت که تمام و دشواری موجود در ارائه راهکارها، و شرایط سخت تایپ به پایان رسد و زمان مورد نیاز شامل حروفچینی دستاوردهای اصلی، و جوابگوی سوالات پیوسته اهل دنیای موجود طراحی اساسا مورد استفاده قرار گیرد.",
imageUrl: blog3,
tags: ["دوره جدید", "تخفیفهای هفتگی", "پایه هفتم"],
},
{
id: 3,
name: "فیزیک کوانتوم و موارد مشابه",
text: "لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ، و با استفاده از طراحان گرافیک است، چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است، و برای شرایط فعلی تکنولوژی مورد نیاز، و کاربردهای متنوع با هدف بهبود ابزارهای کاربردی می باشد، کتابهای زیادی در شصت و سه درصد گذشته حال و آینده، شناخت فراوان جامعه و متخصصان را می طلبد، تا با نرم افزارها شناخت بیشتری را برای طراحان رایانه ای علی الخصوص طراحان خلاقی، و فرهنگ پیشرو در زبان فارسی ایجاد کرد، در این صورت می توان امید داشت که تمام و دشواری موجود در ارائه راهکارها، و شرایط سخت تایپ به پایان رسد و زمان مورد نیاز شامل حروفچینی دستاوردهای اصلی، و جوابگوی سوالات پیوسته اهل دنیای موجود طراحی اساسا مورد استفاده قرار گیرد.",
imageUrl: blog1,
tags: ["دوره جدید", "تخفیفهای هفتگی", "پایه هفتم"],
},
],
}; };

Loading…
Cancel
Save