I THINK DEMO IS READY

main
Pedram Keshavarzi 3 years ago
parent 294ca885ac
commit eeeefa7870
  1. 55
      package-lock.json
  2. 2
      package.json
  3. 22
      src/App.js
  4. BIN
      src/assets/fizik.pdf
  5. 198
      src/assets/sample.pdf
  6. 21
      src/components/AnswerSheet/index.js
  7. 78
      src/components/AnswerSheet/preview/index.js
  8. 2
      src/components/Product/index.js
  9. 25
      src/components/header/Header.js
  10. 17
      src/components/header/Header.scss
  11. 7
      src/components/nav/Nav.js
  12. 5
      src/components/nav/minimalNav.js
  13. 82
      src/redux/reducers/exam.js
  14. 53
      src/view/LoginSignUp/index.js
  15. 405
      src/view/LoginSignUp/mobile/index.js
  16. 9
      src/view/addExam/components/addQuestionnaireCourse.js
  17. 8
      src/view/addExam/index.js
  18. 2
      src/view/addExam/views/AddQuestionsFromBank.js
  19. 66
      src/view/addExam/views/OkExam.js
  20. 152
      src/view/addExam/views/ViewExam.js
  21. 35
      src/view/addExam/views/addQuestionnaireExam.js
  22. 11
      src/view/register/index.js
  23. 722
      src/view/register/mobile/index.js
  24. 8
      src/view/services/index.js
  25. 19
      yarn.lock

55
package-lock.json generated

@ -8,6 +8,7 @@
"name": "Andishmand", "name": "Andishmand",
"version": "0.1.0", "version": "0.1.0",
"dependencies": { "dependencies": {
"@react-pdf-viewer/core": "^3.1.2",
"@testing-library/jest-dom": "^5.16.1", "@testing-library/jest-dom": "^5.16.1",
"@testing-library/react": "^12.1.2", "@testing-library/react": "^12.1.2",
"@testing-library/user-event": "^13.5.0", "@testing-library/user-event": "^13.5.0",
@ -18,6 +19,7 @@
"lord-icon-element": "^3.3.3", "lord-icon-element": "^3.3.3",
"lottie-web": "^5.8.1", "lottie-web": "^5.8.1",
"mapir-react-component": "^2.0.1", "mapir-react-component": "^2.0.1",
"pdfjs-dist": "^2.13.216",
"react": "^17.0.2", "react": "^17.0.2",
"react-beautiful-dnd": "^13.1.0", "react-beautiful-dnd": "^13.1.0",
"react-colorful": "^5.5.1", "react-colorful": "^5.5.1",
@ -2831,6 +2833,16 @@
"node": ">= 8" "node": ">= 8"
} }
}, },
"node_modules/@react-pdf-viewer/core": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@react-pdf-viewer/core/-/core-3.1.2.tgz",
"integrity": "sha512-tctjW98NjIN/BaZO42r0ZPx63H41EubU/n+E9nS1zS/3K/xrILQU5s+UP0WqEYoBFNs/mMI7pTJWsxV4WUhdDg==",
"peerDependencies": {
"pdfjs-dist": "^2.6.347",
"react": "^16.8.0 || ^17.0.0",
"react-dom": "^16.8.0 || ^17.0.0"
}
},
"node_modules/@rollup/plugin-babel": { "node_modules/@rollup/plugin-babel": {
"version": "5.3.0", "version": "5.3.0",
"resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz",
@ -12627,6 +12639,22 @@
"pbf": "bin/pbf" "pbf": "bin/pbf"
} }
}, },
"node_modules/pdfjs-dist": {
"version": "2.13.216",
"resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-2.13.216.tgz",
"integrity": "sha512-qn/9a/3IHIKZarTK6ajeeFXBkG15Lg1Fx99PxU09PAU2i874X8mTcHJYyDJxu7WDfNhV6hM7bRQBZU384anoqQ==",
"dependencies": {
"web-streams-polyfill": "^3.2.0"
},
"peerDependencies": {
"worker-loader": "^3.0.8"
},
"peerDependenciesMeta": {
"worker-loader": {
"optional": true
}
}
},
"node_modules/performance-now": { "node_modules/performance-now": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
@ -16667,6 +16695,14 @@
"defaults": "^1.0.3" "defaults": "^1.0.3"
} }
}, },
"node_modules/web-streams-polyfill": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz",
"integrity": "sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA==",
"engines": {
"node": ">= 8"
}
},
"node_modules/web-vitals": { "node_modules/web-vitals": {
"version": "2.1.2", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.2.tgz", "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.2.tgz",
@ -19497,6 +19533,12 @@
} }
} }
}, },
"@react-pdf-viewer/core": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@react-pdf-viewer/core/-/core-3.1.2.tgz",
"integrity": "sha512-tctjW98NjIN/BaZO42r0ZPx63H41EubU/n+E9nS1zS/3K/xrILQU5s+UP0WqEYoBFNs/mMI7pTJWsxV4WUhdDg==",
"requires": {}
},
"@rollup/plugin-babel": { "@rollup/plugin-babel": {
"version": "5.3.0", "version": "5.3.0",
"resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz",
@ -26713,6 +26755,14 @@
"resolve-protobuf-schema": "^2.1.0" "resolve-protobuf-schema": "^2.1.0"
} }
}, },
"pdfjs-dist": {
"version": "2.13.216",
"resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-2.13.216.tgz",
"integrity": "sha512-qn/9a/3IHIKZarTK6ajeeFXBkG15Lg1Fx99PxU09PAU2i874X8mTcHJYyDJxu7WDfNhV6hM7bRQBZU384anoqQ==",
"requires": {
"web-streams-polyfill": "^3.2.0"
}
},
"performance-now": { "performance-now": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
@ -29548,6 +29598,11 @@
"defaults": "^1.0.3" "defaults": "^1.0.3"
} }
}, },
"web-streams-polyfill": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz",
"integrity": "sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA=="
},
"web-vitals": { "web-vitals": {
"version": "2.1.2", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.2.tgz", "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.2.tgz",

@ -3,6 +3,7 @@
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"dependencies": { "dependencies": {
"@react-pdf-viewer/core": "^3.1.2",
"@testing-library/jest-dom": "^5.16.1", "@testing-library/jest-dom": "^5.16.1",
"@testing-library/react": "^12.1.2", "@testing-library/react": "^12.1.2",
"@testing-library/user-event": "^13.5.0", "@testing-library/user-event": "^13.5.0",
@ -13,6 +14,7 @@
"lord-icon-element": "^3.3.3", "lord-icon-element": "^3.3.3",
"lottie-web": "^5.8.1", "lottie-web": "^5.8.1",
"mapir-react-component": "^2.0.1", "mapir-react-component": "^2.0.1",
"pdfjs-dist": "^2.13.216",
"react": "^17.0.2", "react": "^17.0.2",
"react-beautiful-dnd": "^13.1.0", "react-beautiful-dnd": "^13.1.0",
"react-colorful": "^5.5.1", "react-colorful": "^5.5.1",

@ -1,6 +1,6 @@
import logo from './logo.svg'; import logo from './logo.svg';
import './App.css'; import './App.css';
import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; import { BrowserRouter as Router, Routes, Route, useNavigate } from "react-router-dom";
import Dashboard2 from './view/dashboard2/Dashboard2'; import Dashboard2 from './view/dashboard2/Dashboard2';
import Header from './components/header/Header'; import Header from './components/header/Header';
import Nav from './components/nav/Nav'; import Nav from './components/nav/Nav';
@ -8,7 +8,7 @@ import Dashboard from './view/dashboard/Dashboard';
import Accounting from './view/accounting/Accounting'; import Accounting from './view/accounting/Accounting';
import Messages from './view/messages/Messages'; import Messages from './view/messages/Messages';
import Login from './view/login/Login'; import Login from './view/login/Login';
import { useState } from 'react'; import { useEffect, useState } from 'react';
// import {useParams} from 'react-router-dom'; // import {useParams} from 'react-router-dom';
import avatar1 from "./assets/img/avatar/080cd026ce8cd30f68acfa086ebde7fb.jpg"; import avatar1 from "./assets/img/avatar/080cd026ce8cd30f68acfa086ebde7fb.jpg";
@ -32,7 +32,6 @@ import AdminPanel from './view/admin';
import AddProduct from './view/addProduct'; import AddProduct from './view/addProduct';
import AddExam from './view/addExam'; import AddExam from './view/addExam';
let data = [ let data = [
{ {
id: 1, id: 1,
@ -615,6 +614,7 @@ let data = [
]; ];
function App() { function App() {
let location = window.location.pathname; let location = window.location.pathname;
// const {id} = useParams(); // const {id} = useParams();
console.log(location); console.log(location);
@ -629,15 +629,24 @@ function App() {
} }
} }
} }
let loginStorage = localStorage.getItem('login')
const [LOGIN,setLOGIN]=useState(true); const [LOGIN,setLOGIN]=useState(true);
const activeLogin=()=>{ const activeLogin=()=>{
setLOGIN(true);
localStorage.setItem('login', true)
} }
const logOut = () => { const logOut = () => {
setLOGIN(false);
localStorage.setItem('login', false)
}; };
useEffect(() => {
setLOGIN(loginStorage);
}, [loginStorage])
//--UserFullInfo--------------------- //--UserFullInfo---------------------
const [ActiveUserFullInfo, setActiveUserFullInfo] = useState(false); const [ActiveUserFullInfo, setActiveUserFullInfo] = useState(false);
const [UserFullInfoData, setUserFullInfoData] = useState(buyPackagesData); const [UserFullInfoData, setUserFullInfoData] = useState(buyPackagesData);
@ -655,7 +664,7 @@ function App() {
<Router> <Router>
<div className="App"> <div className="App">
{LOGIN && <Header />} {LOGIN && <Header />}
{LOGIN && <Nav logOut={logOut} />} {LOGIN && <Nav logOut={logOut} />}
<Routes> <Routes>
<Route path="/" element={LOGIN ? <Route path="/" element={LOGIN ?
@ -686,6 +695,7 @@ function App() {
<Route path="/adminpanel" element={<AdminPanel />} /> <Route path="/adminpanel" element={<AdminPanel />} />
<Route path="/adminpanel/add-product" element={<AddProduct />} /> <Route path="/adminpanel/add-product" element={<AddProduct />} />
<Route path="/adminpanel/add-exam" element={<AddExam />} /> <Route path="/adminpanel/add-exam" element={<AddExam />} />
<Route path="/register" element={<Register activeLogin={activeLogin}/>}/> <Route path="/register" element={<Register activeLogin={activeLogin}/>}/>
<Route path="/accounting" element={<Accounting />} /> <Route path="/accounting" element={<Accounting />} />
<Route path="/messages" element={<Messages />} /> <Route path="/messages" element={<Messages />} />

Binary file not shown.

@ -0,0 +1,198 @@
%PDF-1.3
%âãÏÓ
1 0 obj
<<
/Type /Catalog
/Outlines 2 0 R
/Pages 3 0 R
>>
endobj
2 0 obj
<<
/Type /Outlines
/Count 0
>>
endobj
3 0 obj
<<
/Type /Pages
/Count 2
/Kids [ 4 0 R 6 0 R ]
>>
endobj
4 0 obj
<<
/Type /Page
/Parent 3 0 R
/Resources <<
/Font <<
/F1 9 0 R
>>
/ProcSet 8 0 R
>>
/MediaBox [0 0 612.0000 792.0000]
/Contents 5 0 R
>>
endobj
5 0 obj
<< /Length 1074 >>
stream
2 J
BT
0 0 0 rg
/F1 0027 Tf
57.3750 722.2800 Td
( A Simple PDF File ) Tj
ET
BT
/F1 0010 Tf
69.2500 688.6080 Td
( This is a small demonstration .pdf file - ) Tj
ET
BT
/F1 0010 Tf
69.2500 664.7040 Td
( just for use in the Virtual Mechanics tutorials. More text. And more ) Tj
ET
BT
/F1 0010 Tf
69.2500 652.7520 Td
( text. And more text. And more text. And more text. ) Tj
ET
BT
/F1 0010 Tf
69.2500 628.8480 Td
( And more text. And more text. And more text. And more text. And more ) Tj
ET
BT
/F1 0010 Tf
69.2500 616.8960 Td
( text. And more text. Boring, zzzzz. And more text. And more text. And ) Tj
ET
BT
/F1 0010 Tf
69.2500 604.9440 Td
( more text. And more text. And more text. And more text. And more text. ) Tj
ET
BT
/F1 0010 Tf
69.2500 592.9920 Td
( And more text. And more text. ) Tj
ET
BT
/F1 0010 Tf
69.2500 569.0880 Td
( And more text. And more text. And more text. And more text. And more ) Tj
ET
BT
/F1 0010 Tf
69.2500 557.1360 Td
( text. And more text. And more text. Even more. Continued on page 2 ...) Tj
ET
endstream
endobj
6 0 obj
<<
/Type /Page
/Parent 3 0 R
/Resources <<
/Font <<
/F1 9 0 R
>>
/ProcSet 8 0 R
>>
/MediaBox [0 0 612.0000 792.0000]
/Contents 7 0 R
>>
endobj
7 0 obj
<< /Length 676 >>
stream
2 J
BT
0 0 0 rg
/F1 0027 Tf
57.3750 722.2800 Td
( Simple PDF File 2 ) Tj
ET
BT
/F1 0010 Tf
69.2500 688.6080 Td
( ...continued from page 1. Yet more text. And more text. And more text. ) Tj
ET
BT
/F1 0010 Tf
69.2500 676.6560 Td
( And more text. And more text. And more text. And more text. And more ) Tj
ET
BT
/F1 0010 Tf
69.2500 664.7040 Td
( text. Oh, how boring typing this stuff. But not as boring as watching ) Tj
ET
BT
/F1 0010 Tf
69.2500 652.7520 Td
( paint dry. And more text. And more text. And more text. And more text. ) Tj
ET
BT
/F1 0010 Tf
69.2500 640.8000 Td
( Boring. More, a little more text. The end, and just as well. ) Tj
ET
endstream
endobj
8 0 obj
[/PDF /Text]
endobj
9 0 obj
<<
/Type /Font
/Subtype /Type1
/Name /F1
/BaseFont /Helvetica
/Encoding /WinAnsiEncoding
>>
endobj
10 0 obj
<<
/Creator (Rave \(http://www.nevrona.com/rave\))
/Producer (Nevrona Designs)
/CreationDate (D:20060301072826)
>>
endobj
xref
0 11
0000000000 65535 f
0000000019 00000 n
0000000093 00000 n
0000000147 00000 n
0000000222 00000 n
0000000390 00000 n
0000001522 00000 n
0000001690 00000 n
0000002423 00000 n
0000002456 00000 n
0000002574 00000 n
trailer
<<
/Size 11
/Root 1 0 R
/Info 10 0 R
>>
startxref
2714
%%EOF

@ -1,20 +1,21 @@
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { connect } from "react-redux";
const AnswerSheet = ({ questionsQuantity, optionsQuantity, selectedCourseId, passAnswers }) => { const AnswerSheet = ({ questionStart, questionEnd, optionsQuantity, selectedCourseId, passAnswers,selectedQId, addExamState }) => {
const [data, setData] = useState([]); const [data, setData] = useState([]);
const [options, setOptions] = useState([]); const [options, setOptions] = useState([]);
const [success, setSuccess] = useState(selectedCourseId); const [success, setSuccess] = useState(selectedCourseId);
useEffect(() => { useEffect(() => {
let array = []; let array = [];
let optionsArray = []; let optionsArray = [];
for (var i = 1; i <= questionsQuantity; i++) { for (var i = questionStart; i < questionEnd; i++) {
array.push({ array.push({
questionId: i, questionId:i,
answer: null, answer: null,
courseId: selectedCourseId courseId: selectedCourseId,
questionnaierId: selectedQId
}); });
} }
for (var i = 1; i <= optionsQuantity; i++) { for (var i = 1; optionsQuantity ? i <= optionsQuantity : i <=4 ; i++) {
optionsArray.push({ optionsArray.push({
id: i, id: i,
active: false, active: false,
@ -23,7 +24,7 @@ const AnswerSheet = ({ questionsQuantity, optionsQuantity, selectedCourseId, pas
setOptions(optionsArray); setOptions(optionsArray);
setData(array) setData(array)
passAnswers(data) // passAnswers(data)
// console.log(data, options) // console.log(data, options)
}, [selectedCourseId]) }, [selectedCourseId])
@ -90,5 +91,9 @@ const AnswerSheet = ({ questionsQuantity, optionsQuantity, selectedCourseId, pas
</div> </div>
) )
} }
const mapStateToProps = (state) => ({
grades: state.publicApi.grades,
addExamState: state.addExamReduser
})
export default AnswerSheet export default connect(mapStateToProps)(AnswerSheet);

@ -0,0 +1,78 @@
import React, { useEffect, useState } from "react";
import { connect } from "react-redux";
const PreviewAnswerSheet = ({ questionStart, questionEnd, optionsQuantity, selectedCourseId, passAnswers,selectedQId, answers }) => {
const [data, setData] = useState([]);
const [options, setOptions] = useState([]);
const [success, setSuccess] = useState(selectedCourseId);
useEffect(() => {
let array = [];
let optionsArray = [];
for (var i = questionStart; i < questionEnd; i++) {
array.push({
questionId:i,
answer: null,
courseId: selectedCourseId,
questionnaierId: selectedQId
});
}
for (var i = 1; optionsQuantity ? i <= optionsQuantity : i <=4 ; i++) {
optionsArray.push({
id: i,
active: false,
})
}
setOptions(optionsArray);
setData(array)
// passAnswers(data)
// console.log(data, options)
}, [selectedCourseId])
console.log(selectedCourseId)
return (
<div className="w-full flex flex-col border border-gray-200 rounded-xl bg-white">
{
answers.map((item, index) => (
<div className="w-full flex items-center justify-between h-14 border-b border-gray-200">
<p className="w-14 flex items-center h-full justify-center border-l border-gray-200">
{item.questionId}
</p>
<form className="flex w-full h-full px-8 items-center justify-between border-l border-gray-200">
{
options.map(
(option) => (
<p type='radio' value={option.id} className={`w-8 h-6 rounded-full border border-gray-400 cursor-pointer ${option.id == item.answer ? 'bg-green-500' : 'bg-white'}`}
>
</p>
)
)
}
</form>
<div className="w-32 ">
نمره : ۱
</div>
</div>
))
}
</div>
)
}
const mapStateToProps = (state) => ({
grades: state.publicApi.grades,
addExamState: state.addExamReduser
})
export default connect(mapStateToProps)(PreviewAnswerSheet);

@ -107,7 +107,7 @@ const ProductDesign = ({
className={`bg-pinkF5 text-red26 w-32 border-2 border-red52 px-1 py-2 text-xs flex justify-center hover:bg-red52 hover:text-white className={`bg-pinkF5 text-red26 w-32 border-2 border-red52 px-1 py-2 text-xs flex justify-center hover:bg-red52 hover:text-white
`} `}
> >
<button className="z-2" onClick={btnOnClick}>افزودن به سبد خرید</button> <button className="z-3" onClick={btnOnClick}>افزودن به سبد خرید</button>
</div> </div>
</div> </div>

@ -7,7 +7,7 @@ import logoIcon from '../../assets/img/logo.png';
import MobileSideMenu from './MobileSideMenu'; import MobileSideMenu from './MobileSideMenu';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import arrowIcon from './MobileSideMenu/arrow-down.svg'
import exitIcon from '../../assets/img/group-9.svg' import exitIcon from '../../assets/img/group-9.svg'
const Header = ({ const Header = ({
@ -21,11 +21,28 @@ const Header = ({
console.log("weekday:"); console.log("weekday:");
console.log(weekday); console.log(weekday);
const [menuPopup, setMenuPopup] = useState(false); const [menuPopup, setMenuPopup] = useState(false);
const [subMenu, setSubMenu] = useState(false);
return ( return (
<> <>
<div className={`header w-full h-[8.5%] z-10 bg-white fixed top-0 left-0 flex items-center ${!isMobile && 'shadow-md'}`}> <div className={`header w-full h-[8.5%] z-10 bg-white fixed top-0 left-0 flex items-center ${!isMobile && 'shadow-md'}`}>
{
subMenu && <div className={`w-1/6 p-4 flex flex-col text-right bg-white shadow-xl absolute top-[108.5%] rounded-lg left-5 transition duration-700 ease-in-out ${subMenu && 'subMenu'}`}
>
<Link to='/adminpanel' className='w-full text-right border-b border-gray-200 py-2'>
ورود به پنل ادمین
</Link>
<Link to='/adminpanel/add-exam' className='w-full text-right border-b border-gray-200 py-2'>
ورود به صفحه افزودن آزمون
</Link>
<Link to='/adminpanel/add-product' className='w-full text-right border-b border-gray-200 py-2'>
ورود به صفحه افزودن محصول
</Link>
</div>
}
{ {
isMobile ? isMobile ?
<div className='flex w-full items-center justify-between rtl px-4'> <div className='flex w-full items-center justify-between rtl px-4'>
@ -54,8 +71,8 @@ const Header = ({
{window.location.pathname.includes('adminpanel') ? <div></div> : {window.location.pathname.includes('adminpanel') ? <div></div> :
<> <>
<div className="header-profile h-full flex items-center"> <div className="header-profile h-full flex items-center">
<img src={arrowIcon} className=" ml-4 w-6" onClick={() => setSubMenu(!subMenu)}/>
<div className="header-profile-img-container w-10 h-10 bg-color2 rounded-full ml-6 overflow-hidden"> <div className="header-profile-img-container w-10 h-10 bg-color2 ml-2 rounded-full overflow-hidden">
<img src={avatar1} alt="avatar1" className='w-full' /> <img src={avatar1} alt="avatar1" className='w-full' />
</div> </div>
<div className="header-profile-text-container w-fit text-right ml-4"> <div className="header-profile-text-container w-fit text-right ml-4">
@ -66,7 +83,9 @@ const Header = ({
پایه ششم پایه ششم
</div> </div>
</div> </div>
</div> </div>
<div className="header-line w-px h-[90%] bg-color1 ml-6"></div> <div className="header-line w-px h-[90%] bg-color1 ml-6"></div>
<div className="header-date-and-time text-right ml-6"> <div className="header-date-and-time text-right ml-6">

@ -17,3 +17,20 @@ $RegularFont:"IRANSansX-Regular";
} }
} }
} }
.subMenu{
animation: fadeInAnimation ease-in-out 0.5s;
animation-iteration-count: 1;
animation-fill-mode:both;
}
@keyframes fadeInAnimation {
0% {
height: 0px;
}
100% {
height: 200px;
}
}

@ -23,11 +23,14 @@ const Nav = ({
const [type, setType] = useState('default'); const [type, setType] = useState('default');
const location2 = useLocation(); const location2 = useLocation();
useEffect(() => { useEffect(() => {
if(location.includes('adminpanel')){ if(location2.pathname.includes('adminpanel')){
setType('minimal'); setType('minimal');
} }
else{
setType('default')
}
}, []) }, [location2.pathname])
let initai_navId = 1; let initai_navId = 1;

@ -2,7 +2,8 @@ import React, {useState} from "react";
import { Link } from "react-router-dom"; import { Link } from "react-router-dom";
// assets // assets
import avatar from '../../assets/img/avatar/uglyUser.jpeg';
import avatar from "../../assets/img/avatar/pexels-jan-kopřiva-3525908.jpg";
import dropDownIcon from '../../assets/img/arrow-down.svg' import dropDownIcon from '../../assets/img/arrow-down.svg'
import homeIcon from './home-2.svg' import homeIcon from './home-2.svg'
import optionsIcon from './element-3.svg' import optionsIcon from './element-3.svg'
@ -77,7 +78,7 @@ const MinimalNav = ({logOut}) => {
}, },
{ {
icon: exitIcon, icon: exitIcon,
link: '/adminpanel', link: '/',
id: 10 id: 10
}, },
] ]

@ -1,5 +1,6 @@
import { IoReturnUpBack } from "react-icons/io5" import { IoReturnUpBack } from "react-icons/io5"
import fizikpdf from '../../assets/fizik.pdf'
import samplePdf from '../../assets/sample.pdf'
const initialState = { const initialState = {
grade: 8, grade: 8,
groupId: 0, groupId: 0,
@ -15,32 +16,34 @@ const initialState = {
{ {
id: 1, id: 1,
name: 'عمومی', name: 'عمومی',
fileUrl: '', fileUrl: fizikpdf,
courses: [
{
id: 0,
questionnaireId: 1,
name: 'دینی',
coefficient: 4,
questionStart: 1,
questionEnd: 21
},
],
answers:[
]
}, },
{ {
id: 2, id: 2,
name: 'اختصاصی', name: 'اختصاصی',
fileUrl: '', fileUrl: samplePdf,
courses: [],
answers:[
]
} }
], ],
questionairesCourses: [
{
id: 0,
questionnaireId: 1,
questionsQuantity: 20,
name: 'دینی',
coefficient: 4
},
{
id: 1,
questionnaireId: 2,
questionsQuantity: 20,
name: 'ریاضی',
coefficient: 4,
},
],
answers: [ answers: [
@ -190,7 +193,7 @@ const initialState = {
} }
export const numOfinitQs = initialState.questionBank.length; export const numOfinitQs = initialState.questionBank.length;
export default function addExamReduser(state = initialState, { type, payload }) { export default function addExamReduser(state = initialState, { type, payload }) {
console.log(state.courses) console.log(state.courses)
@ -224,19 +227,30 @@ export default function addExamReduser(state = initialState, { type, payload })
questionnaires: [...state.questionnaires, payload] questionnaires: [...state.questionnaires, payload]
} }
case 'ADD_QUESTIONNAIRE_COURSES': case 'ADD_QUESTIONNAIRE_COURSES':
console.log(payload)
let thisQ = state.questionnaires.find(itm => itm.id == payload.questionnaireId)
let otherQ = state.questionnaires.filter(itm => itm.id !== payload.questionnaireId)
thisQ = {
...thisQ,
courses: [ ...thisQ.courses,payload]
}
console.log(thisQ)
return { return {
...state, ...state,
questionairesCourses: [ questionnaires: [...otherQ, thisQ]
...state.questionairesCourses,
payload
]
} }
case 'ADD_ANSWERS': case 'ADD_ANSWERS':
console.log(payload)
let thisQC = state.questionnaires.find(itm => itm.id == payload[0].questionnaierId)
let otherQC = state.questionnaires.filter(itm => itm.id !== payload[0].questionnaierId)
thisQC = {
...thisQC,
answers: [ ...thisQC?.answers,...payload]
}
return { return {
...state, ...state,
answers: [ questionnaires: [...otherQC, thisQC]
...state.answers, payload
]
} }
case 'ADD_EXAM_COURSE': case 'ADD_EXAM_COURSE':
@ -254,7 +268,7 @@ export default function addExamReduser(state = initialState, { type, payload })
console.log(payload) console.log(payload)
const othercourses = state.courses.filter(itm => itm.id !== payload.courseId) const othercourses = state.courses.filter(itm => itm.id !== payload.courseId)
const selectedC = state.courses.filter(itm => itm.id == payload.courseId) const selectedC = state.courses.filter(itm => itm.id == payload.courseId)
selectedC[0] = { ...selectedC[0], selectedQuestions: [ payload, ...selectedC[0].selectedQuestions] } selectedC[0] = { ...selectedC[0], selectedQuestions: [payload, ...selectedC[0].selectedQuestions] }
const newCourses = [...othercourses, ...selectedC] const newCourses = [...othercourses, ...selectedC]
return { return {
@ -309,18 +323,18 @@ export default function addExamReduser(state = initialState, { type, payload })
const otherCourses = state.courses.filter(itm => itm.id !== payload.courseId) const otherCourses = state.courses.filter(itm => itm.id !== payload.courseId)
const selectedc = state.courses.filter(itm => itm.id == payload.courseId) const selectedc = state.courses.filter(itm => itm.id == payload.courseId)
selectedc[0] = { ...selectedc[0], selectedQuestions: [payload, ...selectedc[0].selectedQuestions] } selectedc[0] = { ...selectedc[0], selectedQuestions: [payload, ...selectedc[0].selectedQuestions] }
const newcourses = [ ...selectedc, ...otherCourses] const newcourses = [...selectedc, ...otherCourses]
return{ return {
...state, ...state,
courses: newcourses courses: newcourses
} }
case 'CHANGE_COURSE_NUM_OF_OPTIONS' : case 'CHANGE_COURSE_NUM_OF_OPTIONS':
const otherCourseS = state.courses.filter(itm => itm.id !== payload.courseId) const otherCourseS = state.courses.filter(itm => itm.id !== payload.courseId)
const seLectedC = state.courses.filter(itm => itm.id == payload.courseId) const seLectedC = state.courses.filter(itm => itm.id == payload.courseId)
seLectedC[0] = { ...seLectedC[0], numberOfOptions: payload.value } seLectedC[0] = { ...seLectedC[0], numberOfOptions: payload.value }
const neWCourses = [ ...seLectedC, ...otherCourseS] const neWCourses = [...seLectedC, ...otherCourseS]
return{ return {
...state, ...state,
courses: neWCourses courses: neWCourses

@ -11,6 +11,7 @@ import { useNavigate } from "react-router-dom";
import Input from "../../components/input/signUpInput"; import Input from "../../components/input/signUpInput";
import onInput from "../../utils/onInput"; import onInput from "../../utils/onInput";
import Timer from "../../components/Timer"; import Timer from "../../components/Timer";
import LoginSignUpMobile from './mobile'
import { connect } from "react-redux"; import { connect } from "react-redux";
@ -23,7 +24,7 @@ const LoginSignUp = ({ activeLogin,
theme, theme,
headerOptions, headerOptions,
setHeaderOptions, setHeaderOptions,
isMobile,
}) => { }) => {
const [steps, setSteps] = useState(0); const [steps, setSteps] = useState(0);
const [index, setIndex] = useState(1); const [index, setIndex] = useState(1);
@ -96,47 +97,7 @@ const LoginSignUp = ({ activeLogin,
title: 'یک اسلاید عجیب غریب دیگر در راه هست', title: 'یک اسلاید عجیب غریب دیگر در راه هست',
description: 'معلمی که دانش آموزانش رو شب ها شکار می کند و این متن شاید باعث تعجب شما شده باشد که آیا طراح دیوانه شده است یا خیر ؟ ', description: 'معلمی که دانش آموزانش رو شب ها شکار می کند و این متن شاید باعث تعجب شما شده باشد که آیا طراح دیوانه شده است یا خیر ؟ ',
}, },
{
id: 2,
image: thirdPic,
title: 'یک اسلاید عجیب غریب دیگر در راه هست',
description: 'معلمی که دانش آموزانش رو شب ها شکار می کند و این متن شاید باعث تعجب شما شده باشد که آیا طراح دیوانه شده است یا خیر ؟ ',
}, {
id: 2,
image: thirdPic,
title: 'یک اسلاید عجیب غریب دیگر در راه هست',
description: 'معلمی که دانش آموزانش رو شب ها شکار می کند و این متن شاید باعث تعجب شما شده باشد که آیا طراح دیوانه شده است یا خیر ؟ ',
}, {
id: 2,
image: thirdPic,
title: 'یک اسلاید عجیب غریب دیگر در راه هست',
description: 'معلمی که دانش آموزانش رو شب ها شکار می کند و این متن شاید باعث تعجب شما شده باشد که آیا طراح دیوانه شده است یا خیر ؟ ',
}, {
id: 2,
image: thirdPic,
title: 'یک اسلاید عجیب غریب دیگر در راه هست',
description: 'معلمی که دانش آموزانش رو شب ها شکار می کند و این متن شاید باعث تعجب شما شده باشد که آیا طراح دیوانه شده است یا خیر ؟ ',
}, {
id: 2,
image: thirdPic,
title: 'یک اسلاید عجیب غریب دیگر در راه هست',
description: 'معلمی که دانش آموزانش رو شب ها شکار می کند و این متن شاید باعث تعجب شما شده باشد که آیا طراح دیوانه شده است یا خیر ؟ ',
}, {
id: 2,
image: thirdPic,
title: 'یک اسلاید عجیب غریب دیگر در راه هست',
description: 'معلمی که دانش آموزانش رو شب ها شکار می کند و این متن شاید باعث تعجب شما شده باشد که آیا طراح دیوانه شده است یا خیر ؟ ',
}, {
id: 2,
image: thirdPic,
title: 'یک اسلاید عجیب غریب دیگر در راه هست',
description: 'معلمی که دانش آموزانش رو شب ها شکار می کند و این متن شاید باعث تعجب شما شده باشد که آیا طراح دیوانه شده است یا خیر ؟ ',
}, {
id: 2,
image: thirdPic,
title: 'یک اسلاید عجیب غریب دیگر در راه هست',
description: 'معلمی که دانش آموزانش رو شب ها شکار می کند و این متن شاید باعث تعجب شما شده باشد که آیا طراح دیوانه شده است یا خیر ؟ ',
},
]; ];
const delay = 2500; const delay = 2500;
@ -260,6 +221,7 @@ const LoginSignUp = ({ activeLogin,
}, [loginFlag]); }, [loginFlag]);
const light = theme === "light"; const light = theme === "light";
return ( return (
isMobile ? <LoginSignUpMobile activeLogin={activeLogin}/>:
<div className="w-full flex items-center justify-center" style={{ height: '100vh', direction: 'rtl' }}> <div className="w-full flex items-center justify-center" style={{ height: '100vh', direction: 'rtl' }}>
<div className="w-3/4 border border-solid border-gray-200 flex rounded-xl"> <div className="w-3/4 border border-solid border-gray-200 flex rounded-xl">
{/* form */} {/* form */}
@ -425,13 +387,13 @@ const LoginSignUp = ({ activeLogin,
</div> </div>
<Link <Link
to={register == true ? '/register' : `/dashboard`} to={register == true ? '/register' : `/`}
className="Login-box-form-btn w-full h-12 rounded-lg bg-red52 text-white flex items-center justify-center mt-4" className="Login-box-form-btn w-full h-12 rounded-lg bg-red52 text-white flex items-center justify-center mt-4"
onClick={(e) => { onClick={(e) => {
checkOtp(e) checkOtp(e)
activeLogin() // activeLogin()
setTimeout(() => window.location.reload(), 200)
}} }}
> >
تایید تایید
@ -511,6 +473,7 @@ const LoginSignUp = ({ activeLogin,
const mapStateToProps = (state) => ({ const mapStateToProps = (state) => ({
loginFlag : state.user.status, loginFlag : state.user.status,
isMobile: state.publicApi.isMobile,
}); });
const mapDispatchToProps = { const mapDispatchToProps = {

@ -0,0 +1,405 @@
import React, { useEffect, useState, useRef } from "react";
import { Link } from "react-router-dom";
import logo from "../../../assets/img/logo.png";
import { useNavigate } from "react-router-dom";
import Input from "../../../components/input/signUpInput";
import onInput from "../../../utils/onInput";
import Timer from "../../../components/Timer";
import { connect } from "react-redux";
import { user, publicApi } from "../../../redux/actions";
const LoginSignUpMobile = ({
activeLogin,
sendOtp,
sendPhoneNumber,
loginFlag,
theme,
headerOptions,
setHeaderOptions,
isMobile,
}) => {
const [steps, setSteps] = useState(0);
const [index, setIndex] = useState(1);
const [register, setRegister] = useState(false);
const timeoutRef = useRef(null);
const focusHandler = (id) => {
let inputs = document.querySelectorAll(".Login-box-form-item");
let label = document.querySelectorAll(".Login-box-form-item-label");
let line = document.querySelectorAll(".Login-box-form-item-line");
inputs[id].style.borderColor = "#df1452";
inputs[id].style.backgroundColor = "#fff";
label[id].style.transform = "translate(-10px,-27px)";
label[id].style.color = "#df1452";
line[id].style.backgroundColor = "#fff";
};
const blurHandler = (id) => {
let inputsBox = document.querySelectorAll(".Login-box-form-item");
let inputs = document.querySelectorAll(".Login-box-form-item-input");
let label = document.querySelectorAll(".Login-box-form-item-label");
let line = document.querySelectorAll(".Login-box-form-item-line");
if (inputs[id].value === "") {
inputsBox[id].style.borderColor = "#EBEBEB";
label[id].style.transform = "translate(0px,0px)";
label[id].style.color = "#959595";
line[id].style.backgroundColor = "#EBEBEB";
}
};
const [level, setLevel] = useState("phonenumber");
const [signUpFields, setSignUpFiels] = useState({});
const [error, setError] = useState("");
const [resend, setResend] = useState(false);
const navigate = useNavigate();
const otp1 = useRef();
const otp2 = useRef();
const otp3 = useRef();
const otp4 = useRef();
const onChange = (name, value) => {
setSignUpFiels({ ...signUpFields, [name]: value });
switch (name) {
case "otp1":
if (value) {
otp2.current.focus();
}
break;
case "otp2":
if (value) {
otp3.current.focus();
} else {
otp1.current.focus();
}
break;
case "otp3":
if (value) {
otp4.current.focus();
} else {
otp2.current.focus();
}
break;
case "otp4":
if (value) {
checkOtp();
} else {
otp3.current.focus();
}
break;
default:
break;
}
};
const checkPhoneNumber = (e) => {
if (
signUpFields?.cellphone?.slice(0, 2) === "09" &&
signUpFields?.cellphone.length === 11
) {
setSteps(2)
sendPhoneNumber({ cellphone: signUpFields?.cellphone });
setError(undefined);
console.log(signUpFields.cellphone)
} else {
setError("شماره موبایل خود را چک کنید.");
}
};
const checkOtp = () => {
if (
signUpFields?.otp1 &&
signUpFields?.otp2 &&
signUpFields?.otp3 &&
signUpFields?.otp4
) {
sendOtp({
cellphone: signUpFields?.cellphone,
otp:
signUpFields?.otp1 +
signUpFields?.otp2 +
signUpFields?.otp3 +
signUpFields?.otp4,
userToken: "2",
applicationToken: "22",
});
setError(undefined);
} else {
setError("کد وارد شده را چک کنید.");
}
};
const numberInput = useRef();
// useEffect(() => {
// // numberInput.current.focus();
// setHeaderOptions(headerOptions);
// }, []);
useEffect(() => {
if (signUpFields?.otp?.length === 4) {
sendOtp({
cellphone: signUpFields?.cellphone,
otp: signUpFields?.otp,
userToken: "2",
applicationToken: "22",
});
}
}, [signUpFields]);
useEffect(() => {
if (level === "phonenumber") {
// numberInput.current.focus();
} else {
// otpInput.current.focus();
}
}, [level]);
useEffect(() => {
if (loginFlag) {
navigate("/");
}
}, [loginFlag]);
const light = theme === "light";
return (
<div className="w-full flex items-center justify-center" style={{ height: '100vh', direction: 'rtl' }}>
<div className="w-fullflex rounded-xl">
{/* form */}
<div className="flex w-full border-0 border-l border-solid border flex-col items-center p-6">
<div className="h-12 w-full flex justify-end">
{steps != 0 &&
<div className="w-12 h-full bg-gray-200 rounded-xl flex items-center justify-center text-gray-500 m-0 text-2xl font-light cursor-pointer" onClick={() => setSteps(steps - 1)}>
{`>`}
</div>
}
</div>
<img src={logo} className="w-1/3 m-6" />
<div className="flex flex-col items-start justify-start leading-normal">
{
steps == 2 ? <h1 className="text-red26 text-lg font-bold">تاییدیه ثبت نام</h1> : <>
<h1 className="text-red26 text-lg font-bold">ورود یا ثبت نام</h1>
<h1 className="text-red26 text-lg font-bold">سامانه ثبت نام مدارس موسسه علمی اندیشمند</h1>
</>
}
<p className="text-gray-500 text-sm mt-2">
{
steps == 2 ? <div>
یک کد چهار رقمی تا &nbsp;{" "}
<Timer seconds={120} refresh={setResend} /> &nbsp; دیگر برای شماره
&nbsp;{" "}
<span className="text-greenBA text-sm">
{signUpFields?.cellphone}
</span>{" "}
&nbsp; ارسال خواهد شد.
</div> : <div>
کاربر گرامی لطفا یکی از دو گزینه زیر را انتخاب نمایید.
<br />
در صورتی که عضو نیستید روی دکمه ثبت نام بزنید
</div>
}
</p>
{
steps == 0 &&
<>
<Link
to=""
className="Login-box-form-btn w-full h-12 rounded-lg bg-red52 text-white flex items-center justify-center mt-6"
onClick={() => {
setSteps(1);
}}
>
ورود
</Link>
<Link
to=""
className="Login-box-form-btn w-full h-12 rounded-lg border border-solid border-red52 text-red52 flex items-center justify-center mt-4"
onClick={() => {
setSteps(1);
setRegister(true);
}}
>
ثبت نام
</Link>
</>
}
{
steps == 1 &&
<>
<Input
title={"شماره موبایل"}
name="cellphone"
regex={onInput.numberOnly}
onChange={(name, value) => onChange(name, value)}
value={signUpFields?.cellphone}
maxLength="11"
direction="ltr"
/>
<span className="text-red-500 text-xs">{error}</span>
<Link
to=""
className="Login-box-form-btn w-full h-12 rounded-lg bg-red52 text-white flex items-center justify-center mt-4"
onClick={(e) => {
// setSteps(2);
checkPhoneNumber(e)
}}
>
ارسال کد تاییدیه
</Link>
</>
}
{
steps == 2 &&
<>
<div className="w-full flex flex-col mt-5">
<div className="w-full flex flex-row-reverse justify-center">
<input
inputMode="numeric"
style={{ direction: "ltr" }}
name="otp1"
className="bg-red82OP rounded-md p-4 w-16 text-md text-center text-blueC0 mx-1"
onChange={(e) =>
onChange(
e.target.name,
(e.target.value = onInput.numberOnly(e.target.value))
)
}
maxlength="1"
ref={otp1}
/>
<input
inputMode="numeric"
style={{ direction: "ltr" }}
name="otp2"
className="bg-red82OP rounded-md p-4 w-16 text-md text-center text-blueC0 mx-1"
onChange={(e) =>
onChange(
e.target.name,
(e.target.value = onInput.numberOnly(e.target.value))
)
}
maxlength="1"
ref={otp2}
/>
<input
inputMode="numeric"
style={{ direction: "ltr" }}
name="otp3"
className="bg-red82OP rounded-md p-4 w-16 text-md text-center text-blueC0 mx-1"
onChange={(e) =>
onChange(
e.target.name,
(e.target.value = onInput.numberOnly(e.target.value))
)
}
maxlength="1"
ref={otp3}
/>
<input
inputMode="numeric"
style={{ direction: "ltr" }}
name="otp4"
className="bg-red82OP rounded-md p-4 w-16 text-md text-center text-blueC0 mx-1"
onChange={(e) =>
onChange(
e.target.name,
(e.target.value = onInput.englishAndNumberWithoutSpace(e.target.value))
)
}
maxlength="1"
ref={otp4}
/>
</div>
<Link
to={register == true ? '/register' : `/`}
className="Login-box-form-btn w-full h-12 rounded-lg bg-red52 text-white flex items-center justify-center mt-4"
onClick={(e) => {
checkOtp(e)
activeLogin()
}}
>
تایید
</Link>
<div className="mt-2 flex flex-row text-center w-full justify-center">
<div className="text-xs text-gray1">
شماره خود را اشتباه وارد کردید؟{" "}
<button
className="bg-transparent border-none text-greenBA font-medium"
onClick={() => setLevel("phonenumber")}
>
اصلاح شماره تلفن
</button>
</div>
</div>
</div>
</>
}
<div className="w-full flex flex-col items-center justify-center">
<p className="w-3/5 text-xs my-20 text-center text-red26">
ثبت نام شما در سامانه به منزله قبول
<Link to="" className="font-bold"> شرایط و قوانین استفاده </Link>
میباشد
</p>
<p className="text-gray-300 text-xs">1401 - 1400</p>
</div>
</div>
</div>
</div>
</div>
);
};
const mapStateToProps = (state) => ({
loginFlag : state.user.status,
isMobile: state.publicApi.isMobile,
});
const mapDispatchToProps = {
sendOtp: user.otp_login,
sendPhoneNumber: user.otp,
setHeaderOptions: publicApi.setHeaderOptions,
};
export default connect(
mapStateToProps,
mapDispatchToProps
)(LoginSignUpMobile);

@ -1,6 +1,6 @@
import React from "react"; import React from "react";
const AddQuestionnaireCourse = ({submitOnClick, nameOnChange, questionQuantityOnChange, coefficientOnChange, closeOnClick}) => { const AddQuestionnaireCourse = ({submitOnClick, nameOnChange, questionStart, questionEnd, coefficientOnChange, closeOnClick}) => {
return( return(
<div className="w-full z-10 fixed h-screen backdrop-blur flex items-center -mt-10 justify-center"> <div className="w-full z-10 fixed h-screen backdrop-blur flex items-center -mt-10 justify-center">
<div className="w-1/2 bg-white rounded-xl flex flex-col shadow-lg p-6"> <div className="w-1/2 bg-white rounded-xl flex flex-col shadow-lg p-6">
@ -24,8 +24,11 @@ const AddQuestionnaireCourse = ({submitOnClick, nameOnChange, questionQuantityOn
<input type='text' placeholder="نام درس..." className="w-4/5 p-4 ml-2 rounded border border-red52 h-12 text-red26 outline-none" <input type='text' placeholder="نام درس..." className="w-4/5 p-4 ml-2 rounded border border-red52 h-12 text-red26 outline-none"
onChange={nameOnChange} onChange={nameOnChange}
/> />
<input type='number' placeholder="تعداد سوال..." className="w-4/5 p-4 ml-2 rounded border border-red52 h-12 text-red26 outline-none" <input type='number' placeholder="از سوال..." className="w-2/5 p-4 ml-2 rounded border border-red52 h-12 text-red26 outline-none"
onChange={questionQuantityOnChange} onChange={questionStart}
/>
<input type='number' placeholder="تا سوال..." className="w-2/5 p-4 ml-2 rounded border border-red52 h-12 text-red26 outline-none"
onChange={questionEnd}
/> />
<input type='number' placeholder="ضریب ..." className="w-4/5 p-4 ml-2 rounded border border-red52 h-12 text-red26 outline-none" <input type='number' placeholder="ضریب ..." className="w-4/5 p-4 ml-2 rounded border border-red52 h-12 text-red26 outline-none"
onChange={coefficientOnChange} onChange={coefficientOnChange}

@ -3,6 +3,8 @@ import Stepper from '../../components/Stepper';
import AddGradeGroup from './views/AddGradeGroup'; import AddGradeGroup from './views/AddGradeGroup';
import AddExamDescription from './views/AddDescription'; import AddExamDescription from './views/AddDescription';
import AddQuestions from './views/addQuestions'; import AddQuestions from './views/addQuestions';
import ViewExam from './views/ViewExam';
import OkExam from './views/OkExam';
const AddExam = () => { const AddExam = () => {
const [activeStep, setActiveStep] = useState([true, false, false, false, false]); const [activeStep, setActiveStep] = useState([true, false, false, false, false]);
@ -54,7 +56,11 @@ const AddExam = () => {
stepClick={() => {setStep(3); setActiveStep([true, true, true, true, false, false])}} stepClick={() => {setStep(3); setActiveStep([true, true, true, true, false, false])}}
backStep={() => backStep()} backStep={() => backStep()}
/>, />,
'', <ViewExam
stepClick={() => {setStep(4); setActiveStep([true, true, true, true, true, false])}}
backStep={() => backStep()}
/>,
<OkExam />
] ]
return( return(

@ -537,7 +537,7 @@ const AddQuestionsFromBank = ({ grades, addExamState, dispatch, stepClick, backS
title='مرحله بعدی' title='مرحله بعدی'
className='w-1/12' className='w-1/12'
onClick={() => { onClick={() => {
dispatch({ type: 'ADD_EXAM_DESCRIPTION', payload });
stepClick() stepClick()
}} }}

@ -0,0 +1,66 @@
import React, { useEffect, useState } from "react";
import { connect } from "react-redux";
import { Link } from "react-router-dom";
import AddQuestionnaireExam from "./addQuestionnaireExam";
import AddQuestionsFromBank from "./AddQuestionsFromBank";
const OkExam = ({ addExamState, stepClick, backStep }) => {
const grades = [
'',
'اول',
'دوم',
'سوم',
'چهارم',
'پنجم',
'ششم',
'هفتم',
'هشتم',
'نهم',
'دهم',
'یازدهم',
'دوازدهم',
]
const optionNum = [
'',
'الف',
'ب',
'پ',
'ت',
'ث',
'ج',
'چ',
'ح',
]
return (
<div className="w-[95%] flex items-center justify-center flex-col py-40 mx-10">
<div className="w-2/5 bg-white rounded-xl flex flex-col items-center justify-center p-6 py-10 border border-gray-200">
<div className="w-52 rounded-full flex items-center justify-center h-52 bg-green-500">
<svg width="237" height="237" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7.75 12L10.58 14.83L16.25 9.17004" stroke="#fff" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
</svg>
</div>
<h1 className="text-xl font-bold w-full px-6 py-10">
آزمون {addExamState.name} با موفقیت به پایگاه داده افزوده شد
</h1>
<div className="flex justify-between w-3/5">
<Link to='/adminpanel' className="text-red52 w-full py-4 flex justify-center ml-2">
بازگشت به پنل ادمین
</Link>
<button className="text-white rounded-xl w-full py-4 flex justify-center bg-green-400 mr-2">
ساخت آزمون دیگر
</button>
</div>
</div>
</div>
)
}
const mapStateToProps = (state) => ({
grades: state.publicApi.grades,
addExamState: state.addExamReduser
})
export default connect(mapStateToProps)(OkExam);

@ -0,0 +1,152 @@
import React, { useEffect, useState } from "react";
import { connect } from "react-redux";
import { Worker } from '@react-pdf-viewer/core';
import fizikPdf from '../../../assets/sample.pdf'
import pdfpdf from '../../../assets/fizik.pdf'
import { Viewer } from '@react-pdf-viewer/core';
// Import the styles
import '@react-pdf-viewer/core/lib/styles/index.css';
import Preview from "../../../components/AnswerSheet/preview";
const ViewExam = ({ addExamState, stepClick, backStep }) => {
useEffect(() => {
window.scrollTo(0, 0);
console.log(addExamState.type)
}, [])
const grades = [
'',
'اول',
'دوم',
'سوم',
'چهارم',
'پنجم',
'ششم',
'هفتم',
'هشتم',
'نهم',
'دهم',
'یازدهم',
'دوازدهم',
]
const optionNum = [
'',
'الف',
'ب',
'پ',
'ت',
'ث',
'ج',
'چ',
'ح',
]
const [selectedCourse, setSelectedCourse] = useState(addExamState?.questionnaires[0]);
const [numPages, setNumPages] = useState(1);
function onDocumentLoadSuccess({ numPages }) {
setNumPages(numPages);
}
return (
<div className="w-[95%] flex flex-col mx-10">
<div className="w-4/5 py-6 flex items-center">
<h1 className="text-2xl font-bold ml-6">آزمون {addExamState.name}</h1>
<h3 className="text-gray-500"> پایه {grades[addExamState.grade]}</h3>
</div>
{addExamState.type !== 'pdf' ? <div className="w-full flex flex-col text-right">
{
addExamState.courses.map((item) => (
<div className="flex flex-col w-full py-6 border-b border-gray-400">
<h1 className="text-xl">سوالات {item.title}</h1>
<p className="text-gray-500 pt-2">ضریب {item.coefficient}</p>
{
item.selectedQuestions.map((question) => (
<div className="flex flex-col w-full py-4 border-b border-gray-200" key={`PISHNAMAYESH__${question.questionId}`}>
<div className="flex items-start pb-4">
<h1 className="text-xl">{question.title}</h1>
<p className="w-1/12 pr-4">{question.score} نمره</p>
</div>
{
question.options.map((option) => (
<div className="flex w-full my-2 items-center">
<div className={`${option.isAnswer ? 'bg-green-400 text-white' : 'bg-gray-300'} w-16 h-14 text-xl flex items-center justify-center rounded-xl rounded-l-none`}>
{optionNum[option.id]}
</div>
<div className={`w-1/4 flex items-center px-6 ${option.isAnswer ? 'bg-green-200' : 'bg-gray-200'} h-14 rounded-xl rounded-r-none`}>
{option.title}
</div>
</div>
))
}
</div>
))
}
</div>
))
}
</div> :
addExamState.type === 'pdf' &&
<div className="flex flex-col w-full items-center">
<h1 className="w-full text-right pb-4 text-lg font-bold">دفترچه ها</h1>
<div className="w-full flex flex-wrap">
{
addExamState?.questionnaires?.map((item) => (
<div
className={`flex flex-col ${selectedCourse.id === item?.id ? 'bg-pinkF5 border border-red52 text-red52' : 'bg-white border border-gray-300 text-blue3A'} items-center justify-center w-36 h-32 mx-2 font-bold rounded-xl cursor-pointer`}
onClick={() => setSelectedCourse(item)}
>
<p className="text-red52">
{item.name}
</p>
</div>
))
}
</div>
<div className="flex w-full border-t border-gray-200 mt-10">
<div className="w-1/2 border-l border-gray-200 py-20 " style={{ height: '750px' }}>
<Worker workerUrl="https://unpkg.com/pdfjs-dist@2.13.216/build/pdf.worker.min.js">
<Viewer fileUrl={selectedCourse.fileUrl} />
</Worker>
</div>
<div className="w-1/2 my-20 flex justify-center overflow-x-hidden overflow-scroll" style={{height: '600px'}}>
<div className="w-2/3">
<Preview answers={selectedCourse.answers}/>
</div>
</div>
</div>
</div>
}
<div className="w-full flex justify-end mt-6">
<button className="py-4 px-6 rounded-lg text-red52 mr-4"
onClick={() => backStep()}>
بازگشت به مرحله قبلی
</button>
<button className="bg-red52 py-4 px-6 rounded-lg text-white mr-4"
onClick={() => stepClick()}>
تایید آزمون
</button>
</div>
</div>
)
}
const mapStateToProps = (state) => ({
grades: state.publicApi.grades,
addExamState: state.addExamReduser
})
export default connect(mapStateToProps)(ViewExam);

@ -11,11 +11,10 @@ import AddQuestionnaireCourse from "../components/addQuestionnaireCourse";
import { DragDropContext } from "react-beautiful-dnd"; import { DragDropContext } from "react-beautiful-dnd";
import { Droppable } from "react-beautiful-dnd"; import { Droppable } from "react-beautiful-dnd";
import { Draggable } from "react-beautiful-dnd"; import { Draggable } from "react-beautiful-dnd";
import { toMap } from "draft-js/lib/DefaultDraftBlockRenderMap";
const AddQuestionnaireExam = ({ grades, addExamState, dispatch, stepClick, backStep }) => { const AddQuestionnaireExam = ({ grades, addExamState, dispatch, stepClick, backStep }) => {
const [name, setName] = useState(null);
const [type, setType] = useState(null);
const [description, setDescription] = useState(null);
const [questionarePopUp, setQuestionairePopUp] = useState(false); const [questionarePopUp, setQuestionairePopUp] = useState(false);
const [addCoursePopup, setAddCoursePopup] = useState(false); const [addCoursePopup, setAddCoursePopup] = useState(false);
const [newQuestionaire, setNewQuestionaire] = useState({ const [newQuestionaire, setNewQuestionaire] = useState({
@ -31,7 +30,7 @@ const AddQuestionnaireExam = ({ grades, addExamState, dispatch, stepClick, backS
}); });
const [answers, setAnswers] = useState(null); const [answers, setAnswers] = useState(null);
const [newCourse, setNewCourse] = useState({ const [newCourse, setNewCourse] = useState({
id: addExamState.questionairesCourses.length + 1, id: selectedQuestionare.courses.length + selectedQuestionare.id + 1,
questionnaireId: selectedQuestionare.id, questionnaireId: selectedQuestionare.id,
questionsQuantity: 20, questionsQuantity: 20,
name: '', name: '',
@ -49,12 +48,15 @@ const AddQuestionnaireExam = ({ grades, addExamState, dispatch, stepClick, backS
// console.log(newQuestionaire) // console.log(newQuestionaire)
// console.log(addExamState.questionnaires) // console.log(addExamState.questionnaires)
console.log(newCourse) console.log(newCourse)
console.log(addExamState.questionairesCourses) console.log(selectedQuestionare)
console.log(selectedCourse) console.log(selectedCourse.id)
console.log(answers) console.log(answers)
const [fakeState, setFakeState] = useState(2); const [fakeState, setFakeState] = useState(2);
useEffect(() => {
setSelectedCourse(selectedCourse)
setFakeState(fakeState + 15)
}, [addExamState])
useEffect(() => { useEffect(() => {
// questoinaresLists.map(item => showCoursesInList.push(false)); // questoinaresLists.map(item => showCoursesInList.push(false));
@ -64,7 +66,6 @@ const AddQuestionnaireExam = ({ grades, addExamState, dispatch, stepClick, backS
}, [answers]) }, [answers])
const payload = { name: name, description: description, type: type };
@ -169,7 +170,8 @@ const AddQuestionnaireExam = ({ grades, addExamState, dispatch, stepClick, backS
closeOnClick={() => setAddCoursePopup(false)} closeOnClick={() => setAddCoursePopup(false)}
nameOnChange={e => setNewCourse({ ...newCourse, name: e.target.value })} nameOnChange={e => setNewCourse({ ...newCourse, name: e.target.value })}
coefficientOnChange={e => setNewCourse({ ...newCourse, coefficient: e.target.vlaue })} coefficientOnChange={e => setNewCourse({ ...newCourse, coefficient: e.target.vlaue })}
questionQuantityOnChange={e => setNewCourse({ ...newCourse, questionsQuantity: e.target.value, questionnaireId: selectedQuestionare.id })} questionEnd={e => setNewCourse({ ...newCourse, questionEnd: e.target.value, questionnaireId: selectedQuestionare.id })}
questionStart={e => setNewCourse({ ...newCourse, questionStart: e.target.value, questionnaireId: selectedQuestionare.id, id: selectedQuestionare.id + selectedCourse.id + 1 })}
submitOnClick={() => { dispatch({ type: 'ADD_QUESTIONNAIRE_COURSES', payload: newCourse }); setAddCoursePopup(false); setFakeState(fakeState + 356) }} submitOnClick={() => { dispatch({ type: 'ADD_QUESTIONNAIRE_COURSES', payload: newCourse }); setAddCoursePopup(false); setFakeState(fakeState + 356) }}
/> />
@ -222,7 +224,7 @@ const AddQuestionnaireExam = ({ grades, addExamState, dispatch, stepClick, backS
<div <div
{...provided.draggableProps} {...provided.dragHandleProps} ref={provided.innerRef} {...provided.draggableProps} {...provided.dragHandleProps} ref={provided.innerRef}
className={`flex flex-col ${selectedQuestionare.id === item.id ? 'bg-pinkF5 border border-red52 text-red52' : 'bg-white border border-gray-300 text-blue3A'} items-center justify-center w-36 h-32 mx-2 font-bold rounded-xl cursor-pointer`} className={`flex flex-col ${selectedQuestionare.id === item.id ? 'bg-pinkF5 border border-red52 text-red52' : 'bg-white border border-gray-300 text-blue3A'} items-center justify-center w-36 h-32 mx-2 font-bold rounded-xl cursor-pointer`}
onClick={() => setSelectedQuestionare({ id: item.id, name: item.name, courses: addExamState.questionairesCourses.filter(itm => itm.questionnaireId == item.id) })} onClick={() => setSelectedQuestionare({ id: item.id, name: item.name, courses: item.courses})}
> >
<p className="text-red52"> <p className="text-red52">
@ -271,9 +273,9 @@ const AddQuestionnaireExam = ({ grades, addExamState, dispatch, stepClick, backS
<div className="w-4/5 "> <div className="w-4/5 ">
{ {
addExamState.questionairesCourses.filter(itm => itm.questionnaireId == selectedQuestionare.id).map( addExamState.questionnaires.find(itm => itm.id == selectedQuestionare.id)?.courses.map(
(item) => ( (item) => (
<SelectedCourse title={item.name} coefficient={item.coefficient} questionQuantity={item.questionsQuantity} <SelectedCourse title={item.name} coefficient={item.coefficient} questionQuantity={item.questionEnd - item.questionStart}
onClick={() => { setSelectedCourse(item); console.log(selectedCourse) }} /> onClick={() => { setSelectedCourse(item); console.log(selectedCourse) }} />
) )
) )
@ -291,8 +293,11 @@ const AddQuestionnaireExam = ({ grades, addExamState, dispatch, stepClick, backS
</div> </div>
<div className="w-1/2 flex justify-center"> <div className="w-1/2 flex justify-center">
<div className="w-4/5 py-8"> <div className="w-4/5 py-8">
<AnswerSheet questionsQuantity={selectedCourse.questionsQuantity} optionsQuantity={4} selectedCourseId={selectedCourse.id} <AnswerSheet selectedCourseId={selectedCourse.id}
passAnswers={data => { setAnswers(data); setFakeState(fakeState - 2) }} /> selectedQId={selectedQuestionare.id}
questionEnd={selectedCourse.questionEnd} questionStart={selectedCourse.questionStart}
passAnswers={data => dispatch({type: 'ADD_ANSWERS', payload: data})} />
</div> </div>
</div> </div>
@ -305,7 +310,7 @@ const AddQuestionnaireExam = ({ grades, addExamState, dispatch, stepClick, backS
title='مرحله بعدی' title='مرحله بعدی'
className='w-1/12' className='w-1/12'
onClick={() => { onClick={() => {
dispatch({ type: 'ADD_EXAM_DESCRIPTION', payload });
stepClick() stepClick()
}} }}

@ -12,9 +12,11 @@ import FileInput from "../../components/fileInput";
import Button from "../../components/Button"; import Button from "../../components/Button";
import Stepper from "../../components/Stepper"; import Stepper from "../../components/Stepper";
import UserInfo from "../dashboard2/UserInfo"; import UserInfo from "../dashboard2/UserInfo";
import { connect } from "react-redux";
import MobileRegister from './mobile'
const Register = ({ activeLogin }) => { const Register = ({ activeLogin, isMobile }) => {
const [steps, setSteps] = useState(0); const [steps, setSteps] = useState(0);
const [index, setIndex] = useState(1); const [index, setIndex] = useState(1);
const [register, setRegister] = useState(false); const [register, setRegister] = useState(false);
@ -268,6 +270,7 @@ const Register = ({ activeLogin }) => {
] ]
return ( return (
isMobile ? <MobileRegister /> :
<div className="flex justify-center mb-4" style={{ direction: 'rtl', marginTop: '8.5%', marginRight: '6.5%', width: '93.5%', marginRight: '6.5%' }}> <div className="flex justify-center mb-4" style={{ direction: 'rtl', marginTop: '8.5%', marginRight: '6.5%', width: '93.5%', marginRight: '6.5%' }}>
<div className="w-11/12 flex"> <div className="w-11/12 flex">
@ -716,5 +719,9 @@ const Register = ({ activeLogin }) => {
); );
}; };
const mapStateToProps = (state) => ({
isMobile: state.publicApi.isMobile,
})
export default Register;
export default connect(mapStateToProps)(Register);

@ -0,0 +1,722 @@
import React, { useEffect, useState, useRef } from "react";
import { Link } from "react-router-dom";
import Input from "../../../components/input";
import FileInput from "../../../components/fileInput";
import Button from "../../../components/Button";
import Stepper from "../../../components/Stepper";
import { connect } from "react-redux";
const MobileRegister = ({ activeLogin, isMobile }) => {
const [steps, setSteps] = useState(0);
const [index, setIndex] = useState(1);
const [register, setRegister] = useState(false);
const timeoutRef = useRef(null);
const [activeStep, setActiveStep] = useState([true, false, false, false]);
const [error, setError] = useState('');
const [userInfo, setUserInfo] = useState({
name: null,
familyName: null,
nationalId: null,
birthDate: null,
sex: null,
grade: null,
schoolName: null,
city: null,
state: null,
fatherName: null,
fatherNationalId: null,
fatherFamilyName: null,
fatherJob: null,
fatherMajor: null,
fatherPhoneNumber: null,
fatherJobAddress: null,
fatherJobPhoneNumber: null,
motherName: null,
motherNationalId: null,
motherFamilyName: null,
motherJob: null,
motherMajor: null,
motherPhoneNumber: null,
motherJobAddress: null,
motherJobPhoneNumber: null,
familyNumber: null,
address: null,
homePhoneNumber: null,
});
const finalViewInfo = [
{
title: 'نام',
value: userInfo.name
},
{
title: 'نام خانوادگی',
value: userInfo.familyName
},
{
title: 'جنسیت',
value: userInfo.sex
},
{
title: 'کد ملی',
value: userInfo.nationalId
},
{
title: 'تاریخ تولد',
value: userInfo.birthDate
},
{
title: 'نام مدرسه ',
value: userInfo.schoolName
},
{
title: 'شهر',
value: userInfo.city
},
{
title: 'منطقه',
value: userInfo.state
},
{
title: 'نام',
value: userInfo.fatherName
},
{
title: 'نام خانوادگی',
value: userInfo.fatherFamilyName
},
{
title: 'کدملی',
value: userInfo.fatherNationalId
},
{
title: 'مدرک تحصیلی',
value: userInfo.fatherMajor
},
{
title: 'تلفن همراه',
value: userInfo.fatherPhoneNumber
},
{
title: 'شغل',
value: userInfo.fatherJob
},
{
title: 'محل کار',
value: userInfo.fatherJobAddress
},
{
title: 'تلفن محل کار',
value: userInfo.fatherJobPhoneNumber
},
{
title: 'نام',
value: userInfo.motherName
},
{
title: 'نام خانوادگی',
value: userInfo.motherFamilyName
},
{
title: 'کدملی',
value: userInfo.motherNationalId
},
{
title: 'مدرک تحصیلی',
value: userInfo.motherMajor
},
{
title: 'تلفن همراه',
value: userInfo.motherPhoneNumber
},
{
title: 'شغل',
value: userInfo.motherJob
},
{
title: 'محل کار',
value: userInfo.motherJobAddress
},
{
title: 'تلفن محل کار',
value: userInfo.motherJobPhoneNumber
},
{
title: 'تعداد افراد خانواده',
value: userInfo.familyNumber
},
{
title: 'نشانی محل سکونت',
value: userInfo.address
},
{
title: 'تلفن ثابت',
value: userInfo.homePhoneNumber
},
];
const focusHandler = (id) => {
let inputs = document.querySelectorAll(".Login-box-form-item");
let label = document.querySelectorAll(".Login-box-form-item-label");
let line = document.querySelectorAll(".Login-box-form-item-line");
inputs[id].style.borderColor = "#df1452";
inputs[id].style.backgroundColor = "#fff";
label[id].style.transform = "translate(-10px,-27px)";
label[id].style.color = "#df1452";
line[id].style.backgroundColor = "#fff";
}
const blurHandler = (id) => {
let inputsBox = document.querySelectorAll(".Login-box-form-item");
let inputs = document.querySelectorAll(".Login-box-form-item-input");
let label = document.querySelectorAll(".Login-box-form-item-label");
let line = document.querySelectorAll(".Login-box-form-item-line");
if (inputs[id].value === "") {
inputsBox[id].style.borderColor = "#EBEBEB";
label[id].style.transform = "translate(0px,0px)";
label[id].style.color = "#959595";
line[id].style.backgroundColor = "#EBEBEB";
}
};
const stepCont = [
{
title: '',
active: activeStep[0]
},
{
title: '',
active: activeStep[1]
},
{
title: '',
active: activeStep[2]
},
{
title: '',
active: activeStep[3]
},
]
const grades = [
{
id: 0,
title: ''
},
{
id: 1,
title: 'پایه اول'
},
{
id: 2,
title: 'پایه دوم'
},
{
id: 3,
title: 'پایه سوم'
},
{
id: 4,
title: 'پایه چهارم'
},
{
id: 5,
title: 'پایه پنجم'
},
{
id: 6,
title: 'پایه ششم'
},
{
id: 7,
title: 'پایه هفتم'
},
{
id: 8,
title: 'پایه هشتم'
},
{
id: 9,
title: 'پایه نهم'
},
{
id: 10,
title: 'پایه دهم'
},
{
id: 11,
title: 'پایه یازدهم'
},
{
id: 12,
title: 'پایه دوازدهم'
},
]
return (
<div className="flex justify-center mb-4" style={{ direction: 'rtl', marginTop: '8.5%', marginRight: '6.5%', width: '93.5%', marginRight: '6.5%' }}>
<div className="w-11/12 flex flex-col ">
{/* form */}
{console.log(userInfo)}
<div className="flex w-full border-0 border-l border-solid border flex-col items-center p-6">
{/* <img src={logo} className="w-1/2 m-4 mt-0" /> */}
<div className="flex flex-col items-center justify-start leading-normal">
<p className="w-full text-xl text-red52 font-bold">
{/* سامانه ثبت نام مدارس موسسه علمی اندیشمند */}
تکمیل اطلاعات پروفایل
</p>
<div className="flex flex-col mt-6">
{/* {
stepCont.map((item) => (
<div key={`step__${item.step}`} className="flex my-2 items-center ">
<div className="ml-2">
<div className={`w-6 h-6 rounded-full border border-solid border-gray-200 ${steps == item.step ? 'bg-red52' : ''}`}>
</div>
<span
className=" w-2 mt-2 border-r-4 border-solid border-red46OP"
style={{
// transform: "translateX(-1px)",
}}
></span>
</div>
<h1 className="text-gray-400 font-bold">{item.title}</h1>
</div>
)
)
} */}
<Stepper count={4} currentStep={steps} steps={stepCont} direction="horizontal"/>
</div>
</div>
</div>
{/* Content */}
<div className="w-4/5 mx-10 flex flex-col items-start text-right b">
{
steps == 0 &&
<form>
<div className="w-full px-10 pb-6 border-b border-solid border-gray-200">
<div className="mb-4">
<h1 className="font-black">مشخصات هویتی دانش آموز</h1>
<p className="font-bold text-gray-300 text-sm">اطلاعات هویتی دانش آموز را با دقت تکمیل و عکس مدارک را بارگزاری نمایید</p>
</div>
<div className="flex">
<div className="flex w-2/5 ">
<div className="ml-2">
<Input title="نام" borderType="rounded" gapSize="8" direction='rtl' id={0} />
<Input title="کدملی" borderType="rounded" gapSize="12" id={1} type='number' />
<Input title="جنسیت" borderType="rounded" gapSize="16" id={2} />
</div>
<div className="mr-2">
<Input title="نام خانوادگی" borderType="rounded" id={3} direction='rtl' />
<Input title="تاریخ تولد" borderType="rounded" gapSize="16" id={4} type='number' />
</div>
</div>
<div className="w-3/5 flex justify-center">
<div className="w-2/5 mx-4">
<FileInput title="بارگزاری صفحه اول شناسنامه" id={1} />
</div>
<div className="w-2/5 mx-4">
<FileInput title="بارگزاری عکس پرسنلی" id={2} />
</div>
</div>
</div>
</div>
<div className="w-full px-10 py-10 border-b flex items-center border-solid border-gray-200">
<div className="">
<h1 className="font-black">پایه تحصیلی</h1>
<p className="font-bold text-gray-300 text-sm">لطفا پایه تحصیلی دانش آموز را وارد کنید</p>
</div>
<select className="bg-white border border-solid border-gray-300 w-48 p-3 rounded-lg text-gray-400 outline-red52 mx-6">
{grades.map((item) => (
<option key={`Grade__${item.id}`}>{item.title}</option>
))}
</select>
</div>
<div className="w-full px-10 py-8 flex flex-col ">
<div className="mb-4">
<h1 className="font-black">مشخصات هویتی دانش آموز</h1>
<p className="font-bold text-gray-300 text-sm">اطلاعات هویتی دانش آموز را با دقت تکمیل و عکس مدارک را بارگزاری نمایید</p>
</div>
<div className="flex justify-between items-center">
<Input title="نام مدرسه" borderType="rounded" gapSize="20" direction='rtl' id={5} />
<select className="bg-white border border-solid border-gray-200 w-full px-3 rounded text-gray-400 outline-red52 mx-2 h-12 mt-6">
{grades.map((item) => (
<option key={`Grade__${item.id}`}>{item.title}</option>
))}
</select>
<Input title="شهر" borderType="rounded" gapSize="8" direction='rtl' id={6} />
<Input title="منطقه" borderType="rounded" gapSize="12" id={7} type='number' />
<Input title="استان" borderType="rounded" gapSize="12" id={8} type='number' />
</div>
<div className="flex pt-10 justify-end">
<div className="w-40">
<Button borderType='rounded' title='مرحله بعد' onClick={() => {
const inputs = document.querySelectorAll('.Login-box-form-item-input')
if (inputs[0].value) {
setSteps(1)
setActiveStep([true, true, false, false])
setError('')
} else {
alert('لطفا تمامی فیلد ها را پر کنید')
}
setUserInfo(prevState => {
return {
...prevState,
name: document.getElementById('Login-box-form-item-input-name0').value,
nationalId: document.getElementById('Login-box-form-item-input-name1').value,
sex: document.getElementById('Login-box-form-item-input-name2').value,
familyName: document.getElementById('Login-box-form-item-input-name3').value,
birthDate: document.getElementById('Login-box-form-item-input-name4').value,
schoolName: document.getElementById('Login-box-form-item-input-name5').value,
city: document.getElementById('Login-box-form-item-input-name6').value,
state: document.getElementById('Login-box-form-item-input-name7').value,
}
})
}} />
</div>
</div>
</div>
</form>
}
{
steps == 1 &&
<form>
<div className="w-full px-10 pb-6 border-b border-solid border-gray-200">
<div className="mb-4">
<h1 className="font-black">مشخصات هویتی پدر</h1>
<p className="font-bold text-gray-300 text-sm">لطفا اطلاعات مربوط هویتی پدر را وارد کنید</p>
</div>
<div className="flex">
<Input title="نام" borderType="rounded" gapSize="8" direction='rtl' id={0} />
<Input title="کدملی" borderType="rounded" gapSize="12" id={1} type='number' />
<Input title="نام خانوادگی" borderType="rounded" id={2} direction='rtl' />
<Input title="مدرک نحصیلی" borderType="rounded" gapSize="20" id={3} />
</div>
<div className="flex">
<Input title="تلفن همراه" borderType="rounded" type='number' id={4} />
<Input title="شغل" borderType="rounded" direction='rtl' gapSize="8" id={5} />
<Input title="محل کار" borderType="rounded" id={6} direction='rtl' />
<Input title="تلفن محل کار" borderType="rounded" gapSize="28" id={7} type='number' />
</div>
</div>
<div className="w-full px-10 py-6 border-b border-solid border-gray-200">
<div className="mb-4">
<h1 className="font-black">مشخصات هویتی مادر</h1>
<p className="font-bold text-gray-300 text-sm">لطفا اطلاعات مربوط هویتی مادر را وارد کنید</p>
</div>
<div className="flex">
<Input title="نام" borderType="rounded" gapSize="8" direction='rtl' id={8} />
<Input title="کدملی" borderType="rounded" gapSize="12" id={9} type='number' />
<Input title="نام خانوادگی" borderType="rounded" id={10} direction='rtl' />
<Input title="مدرک نحصیلی" borderType="rounded" gapSize="20" id={11} />
</div>
<div className="flex">
<Input title="تلفن همراه" borderType="rounded" type='number' id={12} />
<Input title="شغل" borderType="rounded" direction='rtl' gapSize="8" id={13} />
<Input title="محل کار" borderType="rounded" id={14} direction='rtl' />
<Input title="تلفن محل کار" borderType="rounded" gapSize="28" id={15} type='number' />
</div>
</div>
<div className="w-full px-10 py-8 flex flex-col ">
<div className="mb-4">
<h1 className="font-black">زندگی با خانواده </h1>
<p className="font-bold text-gray-300 text-sm">در این قسمت مشخص کنید دانشس آموز به همراه چه کسانی زندگی میکند </p>
</div>
<div className="flex justify-between items-center">
<div className="w-4/5 flex">
<select className="bg-white border border-solid border-gray-200 w-full px-3 rounded text-gray-400 outline-red52 mx-2 h-12 mt-6">
{grades.map((item) => (
<option key={`Grade__${item.id}`}>{item.title}</option>
))}
</select>
<Input title="تعداد افراد خانواده" borderType="rounded" type='number' gapSize="40" direction='rtl' id={16} />
</div>
<Input title="نشانی محل سکونت" borderType="rounded" gapSize="40" id={17} />
</div>
<div className="flex justify-start items-center">
<div className="w-2/5 flex">
<Input title="تلفن ثابت" borderType="rounded" type='number' gapSize="40" direction='rtl' id={18} className="w-1/2" />
<Input title="تعداد افراد خانواده" borderType="rounded" type='number' gapSize="40" direction='rtl' id={19} className="w-1/2" />
</div>
</div>
<div className="flex pt-10 justify-end">
<div className="w-40 mx-4">
<Button borderType='rounded' title='بازگشت به مرحله قبل' type='outlined' onClick={() => {
setSteps(0);
setActiveStep([true, false, false, false])
}} />
</div>
<div className="w-40">
<Button borderType='rounded' title='مرحله بعد' onClick={() => {
const inputs = document.querySelectorAll('.Login-box-form-item-input')
if (inputs[0].value) {
setSteps(2);
setActiveStep([true, true, true, false])
} else {
alert('لطفا تمامی فیلد ها را پر کنید')
}
setUserInfo(prevState => {
return {
...prevState,
fatherName: document.getElementById('Login-box-form-item-input-name0').value,
fatherNationalId: document.getElementById('Login-box-form-item-input-name1').value,
fatherFamilyName: document.getElementById('Login-box-form-item-input-name2').value,
fatherMajor: document.getElementById('Login-box-form-item-input-name3').value,
fatherPhoneNumber: document.getElementById('Login-box-form-item-input-name4').value,
fatherJob: document.getElementById('Login-box-form-item-input-name5').value,
fatherJobAddress: document.getElementById('Login-box-form-item-input-name6').value,
fatherJobPhoneNumber: document.getElementById('Login-box-form-item-input-name7').value,
motherName: document.getElementById('Login-box-form-item-input-name8').value,
motherNationalId: document.getElementById('Login-box-form-item-input-name9').value,
motherFamilyName: document.getElementById('Login-box-form-item-input-name10').value,
motherMajor: document.getElementById('Login-box-form-item-input-name11').value,
motherPhoneNumber: document.getElementById('Login-box-form-item-input-name12').value,
motherJob: document.getElementById('Login-box-form-item-input-name13').value,
motherJobAddress: document.getElementById('Login-box-form-item-input-name14').value,
motherJobPhoneNumber: document.getElementById('Login-box-form-item-input-name15').value,
familyNumber: document.getElementById('Login-box-form-item-input-name16').value,
address: document.getElementById('Login-box-form-item-input-name17').value,
homePhoneNumber: document.getElementById('Login-box-form-item-input-name18').value,
}
})
}} />
</div>
</div>
</div>
</form>
}
{
steps == 2 &&
<>
<div className="w-full px-10 pb-6 border-b border-solid border-gray-200">
<div className="mb-4">
<h1 className="font-black">قوانین و مقررات ثبت نام</h1>
<p className="font-bold text-gray-300 text-sm">لطفا اطلاعات مربوط هویتی پدر را وارد کنید</p>
</div>
<p className="text-gray-500">
بند اول: موارد مربوط به آموزش مخاطبین
پیر مردی هر روز تو محله می دید پسر کی با کفش های پاره و پای برهنه با توپ پلاستیکی فوتبال بازی می کند، روزی رفت ی کتانی نو خرید و اومد و به پسرک گفت بیا این کفشا رو بپوشپسرک کفشا رو پوشید و خوشحال رو به پیر مرد کرد و گفت: شما خدایید؟! پیر مرد لبش را گزید و گفت نه! پسرک گفت پس دوست خدایی، چون من دیشب فقط به خدا گفتم كه کفش ندارم
هر نفسی که فرو می بریم، مرگی را که مدام به ما دست اندازی میکند پس میزند... در نهایت این مرگ است که باید پیروز شود، زیرا از هنگام تولد بخشی از سرنوشت ما شده و فقط مدت کوتاهی پیش از بلعیدن طعمه اش، با آن بازی می کند. با این همه، ما تا آنجا که ممکن است، با علاقه فراوان و دلواپسی زیاد به زندگی ادامه می دهیم، همان طور که تا آنجا که ممکن است طولانی تر در یک حباب صابون می دمیم تا بزرگتر شود، گر چه با قطعیتی تمام می دانیم که خواهد ترکید.
پیر مردی هر روز تو محله می دید پسر کی با کفش های پاره و پای برهنه با توپ پلاستیکی فوتبال بازی می کند، روزی رفت ی کتانی نو خرید و اومد و به پسرک گفت بیا این کفشا رو بپوشپسرک کفشا رو پوشید و خوشحال رو به پیر مرد کرد و گفت: شما خدایید؟! پیر مرد لبش را گزید و گفت نه! پسرک گفت پس دوست خدایی، چون من دیشب فقط به خدا گفتم كه کفش ندارم
بند دوم: موارد مربوط به آموزش مخاطبین
خالد حسینی تو رمان باد بادک باز مینویسه : ﻣﺮﺩ ﺁﻫﺴﺘﻪ ﺩﺭ ﮔﻮﺵ ﻓﺮﺯﻧﺪ ﺗﺎﺯﻩ ﺑﻪ ﺑﻠﻮﻍ ﺭﺳﯿﺪﻩ ﺍﺵ ﺑﺮﺍﯼ ﭘﻨﺪ ﭼﻨﯿﻦ ﻧﺠﻮﺍ ﮐﺮﺩ : ﭘﺴﺮﻡ ﺩﺭ ﺯﻧﺪﮔﯽ ﻫﺮﮔﺰ ﺩﺯﺩﯼ ﻧﮑﻦ ﭘﺴﺮ ﻣﺘﻌﺠﺐ ﻣﺒﻬﻮﺕ ﺑﻪ ﭘﺪﺭ ﻧﮕﺎﻩ ﮐﺮﺩ ﺑﺪﯾﻦ ﻣﻌﻨﺎ ﮐﻪ ﺍﻭ ﻫﺮﮔﺰ ﺩﺳﺖ ﮐﺞ ﻧﺪﺍﺷﺘﻪ ﭘﺪﺭ ﺑﻪ ﻧﮕﺎﻩ ﻣﺘﻌﺠﺐ ﻓﺮﺯﻧﺪ ﻟﺒﺨﻨﺪﯼ ﺯﺩ ﺍﺩﺍﻣﻪ ﺩﺍﺩ : ﺩﺭ ﺯﻧﺪﮔﯽ ﺩﺭﻭﻍ ﻧﮕﻮ ﭼﺮﺍ ﮐﻪ ﺍﮔﺮ ﮔﻔﺘﯽ ﺻﺪﺍﻗﺖ ﺭﺍ ﺩﺯﺩﯾﺪﻩ ﺍﯼ، ﺧﯿﺎﻧﺖ ﻧﮑﻦ ﮐﻪ ﺍﮔﺮ ﮐﺮﺩﯼ ﻋﺸﻖ ﺭﺍ ﺩﺯﺩﯾﺪﻩ ﺍﯼ، ﺧﺸﻮﻧﺖ ﻧﮑﻦ ﺍﮔﺮ ﮐﺮﺩﯼ ﻣﺤﺒﺖ ﺭﺍ ﺩﺯﺩﯾﺪﻩ ﺍﯼ، ﻧﺎ ﺣﻖ ﻧﮕﻮ ﺍﮔﺮ ﮔﻔﺘﯽ ﺣﻖ ﺭﺍ ﺩﺯﺩﯾﺪﻩ ﺍﯼ، ﺑﯽ ﺣﯿﺎﯾﯽ ﻧﮑﻦ ﺍﮔﺮ ﮐﺮﺩﯼ ﺷﺮﺍﻓﺖ ﺭﺍ ﺩﺯﺩﯾﺪﻩ ﺍی... ﭘﺲ ﺩﺭ ﺯﻧﺪﮔﯽ ﻓﻘﻂ ﺩﺯﺩﯼ نکن
پیر مردی هر روز تو محله می دید پسر کی با کفش های پاره و پای برهنه با توپ پلاستیکی فوتبال بازی می کند، روزی رفت ی کتانی نو خرید و اومد و به پسرک گفت بیا این کفشا رو بپوشپسرک کفشا رو پوشید و خوشحال رو به پیر مرد کرد و گفت: شما خدایید؟! پیر مرد لبش را گزید و گفت نه! پسرک گفت پس دوست خدایی، چون من دیشب فقط به خدا گفتم كه کفش ندارم
هر نفسی که فرو می بریم، مرگی را که مدام به ما دست اندازی میکند پس میزند... در نهایت این مرگ است که باید پیروز شود، زیرا از هنگام تولد بخشی از سرنوشت ما شده و فقط مدت کوتاهی پیش از بلعیدن طعمه اش، با آن بازی می کند. با این همه، ما تا آنجا که ممکن است، با علاقه فراوان و دلواپسی زیاد به زندگی ادامه می دهیم، همان طور که تا آنجا که ممکن است طولانی تر در یک حباب صابون می دمیم تا بزرگتر شود، گر چه با قطعیتی تمام می دانیم که خواهد ترکید.
پیر مردی هر روز تو محله می دید پسر کی با کفش های پاره و پای برهنه با توپ پلاستیکی فوتبال بازی می کند، روزی رفت ی کتانی نو خرید و اومد و به پسرک گفت بیا این کفشا رو بپوشپسرک کفشا رو پوشید و خوشحال رو به پیر مرد کرد و گفت: شما خدایید؟! پیر مرد لبش را گزید و گفت نه! پسرک گفت پس دوست خدایی، چون من دیشب فقط به خدا گفتم كه کفش ندارم
بند سوم: موارد مربوط به آموزش مخاطبین
خالد حسینی تو رمان باد بادک باز مینویسه : ﻣﺮﺩ ﺁﻫﺴﺘﻪ ﺩﺭ ﮔﻮﺵ ﻓﺮﺯﻧﺪ ﺗﺎﺯﻩ ﺑﻪ ﺑﻠﻮﻍ ﺭﺳﯿﺪﻩ ﺍﺵ ﺑﺮﺍﯼ ﭘﻨﺪ ﭼﻨﯿﻦ ﻧﺠﻮﺍ ﮐﺮﺩ : ﭘﺴﺮﻡ ﺩﺭ ﺯﻧﺪﮔﯽ ﻫﺮﮔﺰ ﺩﺯﺩﯼ ﻧﮑﻦ ﭘﺴﺮ ﻣﺘﻌﺠﺐ ﻣﺒﻬﻮﺕ ﺑﻪ ﭘﺪﺭ ﻧﮕﺎﻩ ﮐﺮﺩ ﺑﺪﯾﻦ ﻣﻌﻨﺎ ﮐﻪ ﺍﻭ ﻫﺮﮔﺰ ﺩﺳﺖ ﮐﺞ ﻧﺪﺍﺷﺘﻪ ﭘﺪﺭ ﺑﻪ ﻧﮕﺎﻩ ﻣﺘﻌﺠﺐ ﻓﺮﺯﻧﺪ ﻟﺒﺨﻨﺪﯼ ﺯﺩ ﺍﺩﺍﻣﻪ ﺩﺍﺩ : ﺩﺭ ﺯﻧﺪﮔﯽ ﺩﺭﻭﻍ ﻧﮕﻮ ﭼﺮﺍ ﮐﻪ ﺍﮔﺮ ﮔﻔﺘﯽ ﺻﺪﺍﻗﺖ ﺭﺍ ﺩﺯﺩﯾﺪﻩ ﺍﯼ، ﺧﯿﺎﻧﺖ ﻧﮑﻦ ﮐﻪ ﺍﮔﺮ ﮐﺮﺩﯼ ﻋﺸﻖ ﺭﺍ ﺩﺯﺩﯾﺪﻩ ﺍﯼ، ﺧﺸﻮﻧﺖ ﻧﮑﻦ ﺍﮔﺮ ﮐﺮﺩﯼ ﻣﺤﺒﺖ ﺭﺍ ﺩﺯﺩﯾﺪﻩ ﺍﯼ، ﻧﺎ ﺣﻖ ﻧﮕﻮ ﺍﮔﺮ ﮔﻔﺘﯽ ﺣﻖ ﺭﺍ ﺩﺯﺩﯾﺪﻩ ﺍﯼ، ﺑﯽ ﺣﯿﺎﯾﯽ ﻧﮑﻦ ﺍﮔﺮ ﮐﺮﺩﯼ ﺷﺮﺍﻓﺖ ﺭﺍ ﺩﺯﺩﯾﺪﻩ ﺍی... ﭘﺲ ﺩﺭ ﺯﻧﺪﮔﯽ ﻓﻘﻂ ﺩﺯﺩﯼ نکن
</p>
</div>
<div className="flex items-center px-10 py-6">
<input type="checkbox" className="w-6 h-6" />
<label className="mr-4 font-bold text-gray-500">
اینجانبان
<span className="text-red52 font-bold"> {userInfo.fatherName} {userInfo.fatherFamilyName} </span>
و
<span className="text-red52 font-bold"> {userInfo.motherName} {userInfo.motherFamilyName} </span>
سرپرست های دانش آموز
<span className="text-red52 font-bold"> {userInfo.name} {userInfo.familyName} </span>
با قوانین و مقررات موافقت نموده و تمامی موارد به عهده اینجانب میباشد
</label>
</div>
<div className="w-full flex pt-10 justify-end">
<div className="w-40 mx-4">
<Button borderType='rounded' title='بازگشت به مرحله قبل' type='outlined' onClick={() => {
setSteps(1);
setActiveStep([true, true, false, false])
}} />
</div>
<div className="w-40">
<Button borderType='rounded' title='مرحله بعد' onClick={() => {
setSteps(3);
setActiveStep([true, true, true, true])
}} />
</div>
</div>
</>
}
{
steps == 3 &&
<>
<div className="w-full px-10 pb-6 border-b border-solid border-gray-200">
<div className="mb-4 pb-4">
<h1 className="font-black">تایید اطلاعات</h1>
<p className="font-bold text-gray-300 text-sm">لطفا اطلاعاتی که وارد کرده اید را چک کنید</p>
</div>
<div className="flex flex-col border-b border-solid border-gray-300 leading-7 pb-6">
<h1 className="font-bold mb-2 text-lg">مشخصات دانش آموز</h1>
{
finalViewInfo.slice(0,8).map(item => (
<div className="flex items-center">
<h3 className="text-red26 font-bold">{item.title}</h3> : <p className="mr-2 text-red52">{item.value}</p>
</div>
))
}
</div>
<div className="flex flex-col border-b border-solid border-gray-300 leading-7 py-6">
<h1 className="font-bold mb-2 text-lg">مشخصات پدر دانش آموز</h1>
{
finalViewInfo.slice(8,16).map(item => (
<div className="flex items-center">
<h3 className="text-red26 font-bold">{item.title}</h3> : <p className="mr-2 text-red52">{item.value}</p>
</div>
))
}
</div>
<div className="flex flex-col border-b border-solid border-gray-300 leading-7 py-6">
<h1 className="font-bold mb-2 text-lg">مشخصات مادر دانش آموز</h1>
{
finalViewInfo.slice(16,24).map(item => (
<div className="flex items-center">
<h3 className="text-red26 font-bold">{item.title}</h3> : <p className="mr-2 text-red52">{item.value}</p>
</div>
))
}
</div>
<div className="flex flex-col border-b border-solid border-gray-300 leading-7 py-6">
<h1 className="font-bold mb-2 text-lg">مشخصات خانواده دانش آموز</h1>
{
finalViewInfo.slice(24,27).map(item => (
<div className="flex items-center">
<h3 className="text-red26 font-bold">{item.title}</h3> : <p className="mr-2 text-red52">{item.value}</p>
</div>
))
}
</div>
</div>
<div className="w-full flex pt-10 justify-end">
<div className="w-40 mx-4">
<Button borderType='rounded' title='بازگشت به مرحله قبل' type='outlined' onClick={() => {
setSteps(2)
setActiveStep([true, true, true, false])
}} />
</div>
<div className="w-40">
<Button borderType='rounded' title='ورود' to='/dashboard' onClick={() =>
activeLogin()
} />
</div>
</div>
</>
}
</div>
</div>
</div>
);
};
const mapStateToProps = (state) => ({
isMobile: state.publicApi.isMobile,
})
export default connect(mapStateToProps)(MobileRegister);

@ -359,6 +359,9 @@ if (!isMobile){
}, },
] ]
}); });
if(gameId !== 2){
setPopUp(true)
}
console.log(gameId) console.log(gameId)
}} }}
@ -385,7 +388,8 @@ if (!isMobile){
count: 1, count: 1,
}); });
setPopUp(false) setTimeout(() => setPopUp(false), 1)
console.log(popup)
console.log(product.id) console.log(product.id)
} }
} }
@ -622,7 +626,7 @@ if (!isMobile){
}, },
] ]
}); });
// setPopUp(true); setPopUp(true);
// console.log(gameId) // console.log(gameId)
}} }}
> >

@ -1412,6 +1412,11 @@
"schema-utils" "^3.0.0" "schema-utils" "^3.0.0"
"source-map" "^0.7.3" "source-map" "^0.7.3"
"@react-pdf-viewer/core@^3.1.2":
"integrity" "sha512-tctjW98NjIN/BaZO42r0ZPx63H41EubU/n+E9nS1zS/3K/xrILQU5s+UP0WqEYoBFNs/mMI7pTJWsxV4WUhdDg=="
"resolved" "https://registry.npmjs.org/@react-pdf-viewer/core/-/core-3.1.2.tgz"
"version" "3.1.2"
"@rollup/plugin-babel@^5.2.0": "@rollup/plugin-babel@^5.2.0":
"integrity" "sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw==" "integrity" "sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw=="
"resolved" "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz" "resolved" "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz"
@ -6916,6 +6921,13 @@
"ieee754" "^1.1.12" "ieee754" "^1.1.12"
"resolve-protobuf-schema" "^2.1.0" "resolve-protobuf-schema" "^2.1.0"
"pdfjs-dist@^2.13.216", "pdfjs-dist@^2.6.347":
"integrity" "sha512-qn/9a/3IHIKZarTK6ajeeFXBkG15Lg1Fx99PxU09PAU2i874X8mTcHJYyDJxu7WDfNhV6hM7bRQBZU384anoqQ=="
"resolved" "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-2.13.216.tgz"
"version" "2.13.216"
dependencies:
"web-streams-polyfill" "^3.2.0"
"performance-now@^2.1.0": "performance-now@^2.1.0":
"integrity" "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" "integrity" "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
"resolved" "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" "resolved" "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz"
@ -7720,7 +7732,7 @@
"strip-ansi" "^6.0.1" "strip-ansi" "^6.0.1"
"text-table" "^0.2.0" "text-table" "^0.2.0"
"react-dom@*", "react-dom@^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0", "react-dom@^15.0.0 || ^16.0.0 || ^17.0.0", "react-dom@^16.11.0", "react-dom@^16.8.5 || ^17.0.0", "react-dom@^17.0.2", "react-dom@>=0.14.0", "react-dom@>=16", "react-dom@>=16.8", "react-dom@>=16.8.0", "react-dom@0.13.x || 0.14.x || ^15.0.0-0 || 15.x.x || ^16.0.0-0 || ^16.x.x || ^17.x.x": "react-dom@*", "react-dom@^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0", "react-dom@^15.0.0 || ^16.0.0 || ^17.0.0", "react-dom@^16.11.0", "react-dom@^16.8.0 || ^17.0.0", "react-dom@^16.8.5 || ^17.0.0", "react-dom@^17.0.2", "react-dom@>=0.14.0", "react-dom@>=16", "react-dom@>=16.8", "react-dom@>=16.8.0", "react-dom@0.13.x || 0.14.x || ^15.0.0-0 || 15.x.x || ^16.0.0-0 || ^16.x.x || ^17.x.x":
"integrity" "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==" "integrity" "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA=="
"resolved" "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" "resolved" "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz"
"version" "17.0.2" "version" "17.0.2"
@ -9335,6 +9347,11 @@
dependencies: dependencies:
"defaults" "^1.0.3" "defaults" "^1.0.3"
"web-streams-polyfill@^3.2.0":
"integrity" "sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA=="
"resolved" "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz"
"version" "3.2.0"
"web-vitals@^2.1.2": "web-vitals@^2.1.2":
"integrity" "sha512-nZnEH8dj+vJFqCRYdvYv0a59iLXsb8jJkt+xvXfwgnkyPdsSLtKNlYmtTDiHmTNGXeSXtpjTTUcNvFtrAk6VMQ==" "integrity" "sha512-nZnEH8dj+vJFqCRYdvYv0a59iLXsb8jJkt+xvXfwgnkyPdsSLtKNlYmtTDiHmTNGXeSXtpjTTUcNvFtrAk6VMQ=="
"resolved" "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.2.tgz" "resolved" "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.2.tgz"

Loading…
Cancel
Save