Переписываю спорные решения

This commit is contained in:
Дмитрий Савенко 2023-01-16 19:12:44 +03:00
parent e15ce861a3
commit 1d8b30370d
15 changed files with 97 additions and 223 deletions

View File

@ -42,20 +42,20 @@ const App = () => {
<Route exact path='/report' element={<ReportPage/>}/> <Route exact path='/report' element={<ReportPage/>}/>
<Route path='/report/:id' element={<SingleReportPage/>}/> <Route path='/report/:id' element={<SingleReportPage/>}/>
<Route path='/quiz' element={<QuizPage/>}/> <Route exact path='quiz'>
<Route path='/quiz-interjacent' element={<InterjacentPage/>}/> <Route index element={<QuizPage/>}/>
<Route path='/quiz-test' element={<QuizTestPage/>}/> <Route path='interjacent' element={<InterjacentPage/>}/>
<Route path='/quiz-instruction' element={<InstructionPage/>}/> <Route path='test' element={<QuizTestPage/>}/>
<Route path='/quiz-result' element={<ResultPage/>}/> <Route path='instruction' element={<InstructionPage/>}/>
<Route path='result' element={<ResultPage/>}/>
</Route>
<Route exact path='/profile' element={<Profile/>}> <Route exact path='profile'>
<Route index element={<Profile/>}/>
<Route exact path='calendar' element={<ProfileCalendarPage/>}/> <Route exact path='calendar' element={<ProfileCalendarPage/>}/>
<Route exact path='summary' element={<Summary/>}/> <Route exact path='summary' element={<Summary/>}/>
</Route> </Route>
{/*<Route component={() => <div>Page not found</div>} />*/}
{/*<Route path='*' component={() => <div>Page not found</div>}/>*/}
<Route path="*" element={<Navigate to="/" replace/>}/> <Route path="*" element={<Navigate to="/" replace/>}/>
</Routes> </Routes>
</Router> </Router>

View File

@ -2,7 +2,7 @@ import React from 'react'
import { Link } from 'react-router-dom' import { Link } from 'react-router-dom'
import { Achievement } from '../Achievement/Achievement' import { Achievement } from '../Achievement/Achievement'
import { LEVELS, SKILLS } from '../constants/constants' import { LEVELS, SKILLS } from '../../constants/constants'
import './candidateSidebar.scss' import './candidateSidebar.scss'

View File

@ -2,7 +2,7 @@ import React, { useEffect, useState } from 'react'
import male from '../../images/medium_male.png' import male from '../../images/medium_male.png'
import rectangle from '../../images/rectangle_secondPage.png' import rectangle from '../../images/rectangle_secondPage.png'
import { Link } from 'react-router-dom' import { Link } from 'react-router-dom'
import { LEVELS, SKILLS } from '../constants/constants' import { LEVELS, SKILLS } from '../../constants/constants'
import { import {
selectProfiles, selectProfiles,
selectFilteredCandidates, selectFilteredCandidates,

View File

@ -1,6 +1,4 @@
import React, { useState } from 'react' import React, { useState } from 'react'
import { fetchPost } from '../../server/server'
import { auth } from '../../redux/outstaffingSlice'
import {useParams, useNavigate} from 'react-router-dom' import {useParams, useNavigate} from 'react-router-dom'
import { Loader } from '../Loader/Loader' import { Loader } from '../Loader/Loader'
import PhoneInput from 'react-phone-input-2' import PhoneInput from 'react-phone-input-2'
@ -9,59 +7,57 @@ import './form.scss'
import { withSwalInstance } from 'sweetalert2-react' import { withSwalInstance } from 'sweetalert2-react'
import swal from 'sweetalert2' import swal from 'sweetalert2'
import { useSelector, useDispatch } from 'react-redux' import {useRequest} from "../../hooks/useRequest";
import { getRole } from '../../redux/roleSlice'
const SweetAlert = withSwalInstance(swal)
const SweetAlert = withSwalInstance(swal);
const Form = () => { const Form = () => {
const dispatch = useDispatch()
const navigate = useNavigate() const navigate = useNavigate();
const role = useSelector(getRole)
const urlParams = useParams() const urlParams = useParams();
const [status, setStatus] = useState(null) const [status, setStatus] = useState(null);
const [data, setData] = useState({ const [data, setData] = useState({
email: '', email: '',
phone: '', phone: '',
comment: '' comment: ''
}) });
const [isFetching, setIsFetching] = useState(false) const [isFetching, setIsFetching] = useState(false);
const {apiRequest} = useRequest();
const handleChange = (e) => { const handleChange = (e) => {
const { id, value } = e.target const { id, value } = e.target;
setData((prev) => ({ setData((prev) => ({
...prev, ...prev,
[id]: value [id]: value
})) }))
} };
const handleSubmit = (e) => { const handleSubmit = (e) => {
e.preventDefault() e.preventDefault();
setIsFetching(true) setIsFetching(true);
const formData = new FormData() const formData = new FormData();
formData.append('profile_id', urlParams.id) formData.append('profile_id', urlParams.id);
formData.append('email', data.email) formData.append('email', data.email);
formData.append('phone', data.phone) formData.append('phone', data.phone);
formData.append('comment', data.comment) formData.append('comment', data.comment);
fetchPost({ apiRequest('/interview-request/create-interview-request',{
link: `${process.env.REACT_APP_API_URL}/api/interview-request/create-interview-request`, method: 'POST',
params: { params: {
profile_id: urlParams.id, profile_id: urlParams.id,
...data ...data
}, }
}).then((res) => {
role, setStatus(res);
logout: () => dispatch(auth(false)) setIsFetching(false)
}).then((res) => }
res.json().then((resJSON) => {
setStatus(resJSON)
setIsFetching(false)
})
) )
} };
return ( return (
<> <>
@ -135,6 +131,6 @@ const Form = () => {
</div> </div>
</> </>
) )
} };
export default Form export default Form

View File

@ -18,13 +18,12 @@ export const ProfileCalendar = () => {
const [month, setMonth] = useState(''); const [month, setMonth] = useState('');
const [reports, setReports] = useState([]); const [reports, setReports] = useState([]);
const [totalHours, setTotalHours] = useState(0); const [totalHours, setTotalHours] = useState(0);
const [value, setValue] = useState(moment());
const [requestDates, setRequestDates] = useState(''); const [requestDates, setRequestDates] = useState('');
const {apiRequest} = useRequest(); const {apiRequest} = useRequest();
useEffect(() => { useEffect(() => {
setRequestDates(getReports(value)) setRequestDates(getReports(moment()))
}); });
useEffect(async () => { useEffect(async () => {
@ -69,7 +68,7 @@ export const ProfileCalendar = () => {
<div> <div>
<Link to='/report'> <Link to='/report'>
<button className='calendar__btn' onClick={() => { <button className='calendar__btn' onClick={() => {
dispatch(setReportDate(value)) dispatch(setReportDate(moment()))
}}>Заполнить отчет за день</button> }}>Заполнить отчет за день</button>
</Link> </Link>
</div> </div>

View File

@ -1,18 +1,16 @@
import React, {useState} from 'react' import React, {useState} from 'react'
import {useSelector, useDispatch} from 'react-redux' import {useSelector} from 'react-redux'
import {fetchPost} from '../../server/server' import {Link} from 'react-router-dom'
import {useNavigate, useParams, Redirect, Link} from 'react-router-dom'
import {Loader} from '../Loader/Loader' import {Loader} from '../Loader/Loader'
import {auth} from '../../redux/outstaffingSlice'
import {getReportDate} from '../../redux/reportSlice' import {getReportDate} from '../../redux/reportSlice'
import {getRole} from '../../redux/roleSlice'
import calendarIcon from '../../images/calendar_icon.png' import calendarIcon from '../../images/calendar_icon.png'
import ellipse from '../../images/ellipse.png' import ellipse from '../../images/ellipse.png'
import remove from '../../images/remove.png' import remove from '../../images/remove.png'
import addIcon from '../../images/addIcon.png' import addIcon from '../../images/addIcon.png'
import {currentMonthAndDay, getReports} from '../Calendar/calendarHelper' import {currentMonthAndDay} from '../Calendar/calendarHelper'
import './reportForm.scss' import './reportForm.scss'
import arrow from "../../images/right-arrow.png"; import arrow from "../../images/right-arrow.png";
import {useRequest} from "../../hooks/useRequest";
const getCreatedDate = (day) => { const getCreatedDate = (day) => {
if (day) { if (day) {
@ -27,10 +25,9 @@ const getCreatedDate = (day) => {
}; };
const ReportForm = () => { const ReportForm = () => {
const dispatch = useDispatch();
const reportDate = useSelector(getReportDate); const reportDate = useSelector(getReportDate);
const role = useSelector(getRole);
const {apiRequest} = useRequest();
const [isFetching, setIsFetching] = useState(false); const [isFetching, setIsFetching] = useState(false);
const [reportSuccess, setReportSuccess] = useState(false); const [reportSuccess, setReportSuccess] = useState(false);
@ -50,6 +47,29 @@ const ReportForm = () => {
} }
}; };
const handler = () => {
apiRequest('/reports/create', {
method: 'POST',
body: {
tasks: inputs,
difficulties: troublesInputValue,
tomorrow: scheduledInputValue,
created_at: getCreatedDate(reportDate),
status: 1,
},
}).then((res) => {
if (res.status === 200) {
setReportSuccess(true);
setTimeout(() => setReportSuccess(false), 2000)
}
setInputs(() => []);
setTroublesInputValue('');
setScheduledInputValue('');
setIsFetching(false);
setInputs(() => [{task: '', hours_spent: '', minutes_spent: 0}]);
})
};
return ( return (
<section className='report-form'> <section className='report-form'>
<div className='row'> <div className='row'>
@ -149,32 +169,7 @@ const ReportForm = () => {
<div className='row'> <div className='row'>
<div className='col-12'> <div className='col-12'>
<div className='report-form__footer'> <div className='report-form__footer'>
<button className='report-form__footer-btn' onClick={() => { <button className='report-form__footer-btn' onClick={() => handler()}>
fetchPost({
link: `${process.env.REACT_APP_API_URL}/api/reports/create`,
role,
body: {
tasks: inputs,
difficulties: troublesInputValue,
tomorrow: scheduledInputValue,
created_at: getCreatedDate(reportDate),
status: 1,
},
logout: () => dispatch(auth(false))
}).then((res) =>
res.json().then((resJSON) => {
if (res.status === 200) {
setReportSuccess(true);
setTimeout(() => setReportSuccess(false), 2000)
}
setInputs(() => []);
setTroublesInputValue('');
setScheduledInputValue('');
setIsFetching(false);
setInputs(() => [{task: '', hours_spent: '', minutes_spent: 0}]);
})
)
}}>
{isFetching ? <Loader/> : 'Отправить'} {isFetching ? <Loader/> : 'Отправить'}
</button> </button>
<p className='report-form__footer-text'> <p className='report-form__footer-text'>

View File

@ -6,7 +6,7 @@ import {selectedTest, selectUserInfo} from "../../../redux/quizSlice";
export const HeaderPageTestsQuiz = ({isVisibilityButton}) => { export const HeaderPageTestsQuiz = ({isVisibilityButton}) => {
const test = useSelector(selectedTest) const test = useSelector(selectedTest);
const userInfo = useSelector(selectUserInfo); const userInfo = useSelector(selectUserInfo);
return ( return (
@ -23,8 +23,8 @@ export const HeaderPageTestsQuiz = ({isVisibilityButton}) => {
</div> </div>
</div> </div>
{isVisibilityButton && {isVisibilityButton &&
<Link to={'/quiz-instruction'} className='quiz-btn quiz-btn_restriction'>Пройти</Link>} <Link to={'/quiz/instruction'} className='quiz-btn quiz-btn_restriction'>Пройти</Link>}
</div> </div>
</div> </div>
) )
} };

View File

@ -1,5 +1,4 @@
import {Link} from 'react-router-dom' import {Link} from 'react-router-dom'
import {CodeSnippetlighter} from '../../../pages/CodeSnippetPage'
import comment from './../../../images/comment.jpg' import comment from './../../../images/comment.jpg'
import './quiz.scss' import './quiz.scss'
import {useEffect, useState} from "react"; import {useEffect, useState} from "react";
@ -19,7 +18,6 @@ export const Instruction = () => {
apiRequest('/user-questionnaire/get-question-number', { apiRequest('/user-questionnaire/get-question-number', {
params: {user_questionnaire_uuid: test.uuid}, params: {user_questionnaire_uuid: test.uuid},
} }
).then((res)=> setCountQuestions(res.question_number)) ).then((res)=> setCountQuestions(res.question_number))
@ -39,7 +37,7 @@ export const Instruction = () => {
e e
lit, sed do eiusmod tempo lit, sed do eiusmod tempo
</div> </div>
<Link to="/quiz-test" className='instruction__btn quiz-btn quiz-btn_restriction'>Далее</Link> <Link to="/quiz/test" className='instruction__btn quiz-btn quiz-btn_restriction'>Далее</Link>
<div className="instruction__info"> <div className="instruction__info">
<div className="instruction__icon"> <div className="instruction__icon">
<img src={comment} alt=""/> <img src={comment} alt=""/>

View File

@ -7,7 +7,7 @@ import {setSelectedTest} from "../../../redux/quizSlice";
export const MyTestsQuiz = ({listTests}) => { export const MyTestsQuiz = ({listTests}) => {
const formationEndingOfScore = (score) => { const formationEndingOfScore = (score) => {
const lastNumber = score % 10 const lastNumber = score % 10;
if(score === 11 ||score === 12 ||score === 13 ||score === 14 ){ if(score === 11 ||score === 12 ||score === 13 ||score === 14 ){
return 'баллов' return 'баллов'
}else if(lastNumber === 2 || lastNumber === 3 || lastNumber === 4 ){ }else if(lastNumber === 2 || lastNumber === 3 || lastNumber === 4 ){
@ -17,10 +17,10 @@ export const MyTestsQuiz = ({listTests}) => {
}else{ }else{
return 'баллов' return 'баллов'
} }
} };
const dispatch = useDispatch() const dispatch = useDispatch();
const recordSelectedTest = (item) => dispatch(setSelectedTest(item)) const recordSelectedTest = (item) => dispatch(setSelectedTest(item));
return ( return (
<div className="my-tests"> <div className="my-tests">
@ -35,10 +35,10 @@ export const MyTestsQuiz = ({listTests}) => {
{item.questionnaire_title} {item.questionnaire_title}
</h3> </h3>
<div className="item-test__body test-data"> <div className="item-test__body test-data">
<Link to={'/quiz-interjacent'} className='quiz-btn' <Link to={'/quiz/interjacent'} className='quiz-btn'
onClick={() => recordSelectedTest(item)}>Пройти</Link> onClick={() => recordSelectedTest(item)}>Пройти</Link>
</div> </div>
</article> </article>;
case 2: case 2:
return <article className="my-tests__item item-test" key={item.questionnaire_title}> return <article className="my-tests__item item-test" key={item.questionnaire_title}>
<h3 className="item-test__name-test"> <h3 className="item-test__name-test">
@ -52,7 +52,7 @@ export const MyTestsQuiz = ({listTests}) => {
<div className="test-data__hr"></div> <div className="test-data__hr"></div>
<div className="test-data__score quiz-text">{item.score} {formationEndingOfScore(item.score)}</div> <div className="test-data__score quiz-text">{item.score} {formationEndingOfScore(item.score)}</div>
</div> </div>
</article> </article>;
case 3: case 3:
return <article className="my-tests__item item-test" key={item.questionnaire_title}> return <article className="my-tests__item item-test" key={item.questionnaire_title}>
<h3 className="item-test__name-test"> <h3 className="item-test__name-test">
@ -61,7 +61,7 @@ export const MyTestsQuiz = ({listTests}) => {
<div className="item-test__body test-data"> <div className="item-test__body test-data">
<div className='quiz-btn'>На проверке</div> <div className='quiz-btn'>На проверке</div>
</div> </div>
</article> </article>;
default: default:
break break
} }
@ -70,4 +70,4 @@ export const MyTestsQuiz = ({listTests}) => {
</div> </div>
</div> </div>
) )
} };

View File

@ -2,20 +2,15 @@ import React, {useEffect, useState} from 'react'
import {useNavigate} from "react-router-dom" import {useNavigate} from "react-router-dom"
import {useSelector, useDispatch} from 'react-redux' import {useSelector, useDispatch} from 'react-redux'
import { import {useRequest} from "../../../hooks/useRequest";
fetchGetAnswers,
selectAnswer,
selectedTest
} from '../../../redux/quizSlice'
import {Progressbar} from './ProgressbarQuiz' import {Progressbar} from './ProgressbarQuiz'
import {GetOptionTask} from './GetOptionTask' import {GetOptionTask} from './GetOptionTask'
import {fetchUserAnswersMany, fetchUserAnswerOne} from './../../../redux/quizSlice' import {
fetchUserAnswersMany, fetchUserAnswerOne, fetchGetAnswers, selectAnswer, selectedTest
} from './../../../redux/quizSlice'
import './quiz.scss' import './quiz.scss'
import {useRequest} from "../../../hooks/useRequest";
export const TaskQuiz = () => { export const TaskQuiz = () => {
@ -38,11 +33,12 @@ export const TaskQuiz = () => {
useEffect(() => { useEffect(() => {
apiRequest(`/question/get-questions?uuid=${dataTest.uuid}`) apiRequest(`/question/get-questions?uuid=${dataTest.uuid}`)
.then((response) => { .then((response) => {
console.log(response)
setQuestions(response); setQuestions(response);
dispatch(fetchGetAnswers(response[0].id)); dispatch(fetchGetAnswers(response[0].id));
setStripValue((+index + 1) * 100 / response.length) setStripValue((+index + 1) * 100 / response.length)
}) })
}, [dispatch]); }, [dispatch, apiRequest]);
const nextQuestion = async (e) => { const nextQuestion = async (e) => {
e.preventDefault(); e.preventDefault();
@ -70,7 +66,7 @@ export const TaskQuiz = () => {
setCheckedValues([]); setCheckedValues([]);
setInputValue('') setInputValue('')
} else { } else {
navigate(`/quiz-result`); navigate(`/quiz/result`);
alert("Тест пройден!") alert("Тест пройден!")
} }

View File

@ -8,7 +8,7 @@ import {
import SVG from 'react-inlinesvg' import SVG from 'react-inlinesvg'
import {WithLogout} from '../hoc/withLogout' import {WithLogout} from '../hoc/withLogout'
import Form from '../components/Form/Form' import Form from '../components/Form/Form'
import {LEVELS, SKILLS} from '../components/constants/constants' import {LEVELS, SKILLS} from '../constants/constants'
import {Footer} from '../components/Footer/Footer' import {Footer} from '../components/Footer/Footer'
import arrow from '../images/right-arrow.png' import arrow from '../images/right-arrow.png'

View File

@ -32,7 +32,7 @@ export const Profile = () => {
</div> </div>
</div> </div>
<div className='profile__items'> <div className='profile__items'>
<Link to={'/calendar'} className='item'> <Link to={'/profile/calendar'} className='item'>
<div className='item__about'> <div className='item__about'>
<img src={reportsIcon} alt='report'/> <img src={reportsIcon} alt='report'/>
<h3>Ваша отчетность</h3> <h3>Ваша отчетность</h3>
@ -44,7 +44,7 @@ export const Profile = () => {
</div> </div>
</div> </div>
</Link> </Link>
<Link to={'/summary'} className='item'> <Link to={'/profile/summary'} className='item'>
<div className='item__about'> <div className='item__about'>
<img src={summaryIcon} alt='summary'/> <img src={summaryIcon} alt='summary'/>
<h3>Данные и резюме</h3> <h3>Данные и резюме</h3>

View File

@ -70,17 +70,7 @@ export const fetchGetAnswers = createAsyncThunk(
) )
} }
); );
// export const fetchGetQuestion = createAsyncThunk(
// 'questions',
// async (uuid) => {
// const resp = await fetchGet({
// link: `${process.env.REACT_APP_API_URL}/api/question/get-questions?uuid=${uuid}`,
// Origin: `${process.env.REACT_APP_BASE_URL}`,
// }
// )
// return resp
// }
// )
export const fetchResultTest = createAsyncThunk( export const fetchResultTest = createAsyncThunk(
'result', 'result',
async (uuid) => { async (uuid) => {
@ -99,7 +89,7 @@ export const quizSlice = createSlice({
reducers: { reducers: {
setQuestionnairesList: (state, action) => { setQuestionnairesList: (state, action) => {
state.dataQuestionnairesOfUser = action.payload; state.dataQuestionnairesOfUser = action.payload;
state.passedTests = action.payload.filter(item=>item.status === 2) state.passedTests = action.payload.filter(item => item.status === 2)
}, },
setSelectedTest: (state, action) => { setSelectedTest: (state, action) => {
state.selectedTest = action.payload state.selectedTest = action.payload

View File

@ -1,85 +1,5 @@
import { withAuthRedirect } from './authRedirect' import { withAuthRedirect } from './authRedirect'
// export const fetchForm = withAuthRedirect(async (link, info) => {
// try {
// const response = await fetch(link, {
// method: 'POST',
// headers: {
// // 'Access-Control-Request-Headers': 'authorization',
// Authorization: `Bearer ${localStorage.getItem('auth_token')}`,
// Origin: `${process.env.REACT_APP_BASE_URL}`,
// 'Content-Type': 'application/json'
// },
// body: JSON.stringify(info)
// });
//
// return response
// } catch (error) {
// console.log('Query error', error)
// }
// });
// export const fetchAuth = async ({
// username,
// password,
// dispatch,
// catchError
// }) => {
// const apiURL = process.env.REACT_APP_API_URL;
// try {
// const response = await fetch(`${apiURL}/api/user/login`, {
// method: 'POST',
// mode: 'cors',
// headers: {
// 'Access-Control-Request-Headers': 'authorization',
// 'Content-Type': 'application/json'
// // Origin: `http://localhost`
// },
// body: JSON.stringify({
// username,
// password
// })
// });
//
// if (!response.ok) {
// catchError();
// return response.statusText
// }
//
// response.json().then((resJSON) => {
// localStorage.setItem('auth_token', resJSON.access_token);
// localStorage.setItem('id', resJSON.id);
// localStorage.setItem('cardId', resJSON.card_id);
// localStorage.setItem(
// 'access_token_expired_at',
// resJSON.access_token_expired_at
// );
// dispatch(resJSON)
// })
// } catch (error) {
// console.error('Error occured: ', error)
// }
// };
// export const fetchReportList = withAuthRedirect(async (link) => {
// try {
// const response = await fetch(
// `https://guild.loc/api/reports/index?user_id=26&fromDate=2021-10-18`,
// // link,
// {
// method: 'GET',
// headers: {
// Authorization: `Bearer ${localStorage.getItem('auth_token')}`
// }
// }
// );
// let data = await response.json();
//
// return data
// } catch (error) {
// console.log('Query error', error)
// }
// });
export const fetchGet = withAuthRedirect(async (link) => { export const fetchGet = withAuthRedirect(async (link) => {
try { try {
@ -96,23 +16,3 @@ export const fetchGet = withAuthRedirect(async (link) => {
console.log('Query error', error) console.log('Query error', error)
} }
}); });
export const fetchPost = withAuthRedirect(async (link, body) => {
console.log('i', body);
try {
const response = await fetch(link, {
method: 'POST',
headers: {
Authorization: `Bearer ${localStorage.getItem('auth_token')}`,
'Content-Type': 'application/json',
//Origin: `http://localhost:3000`
Origin: `${process.env.REACT_APP_BASE_URL}`
},
body: JSON.stringify(body)
});
return response
} catch (error) {
console.log('Query error', error)
}
});