diff --git a/src/components/Candidate/Candidate.js b/src/components/Candidate/Candidate.js index a8f7695b..bfe552e6 100644 --- a/src/components/Candidate/Candidate.js +++ b/src/components/Candidate/Candidate.js @@ -4,7 +4,6 @@ import {useSelector, useDispatch} from 'react-redux' import { currentCandidate, selectCurrentCandidate, - auth } from '../../redux/outstaffingSlice' import {getRole} from '../../redux/roleSlice' import {useState} from 'react' @@ -16,10 +15,11 @@ import SkillSection from '../SkillSection/SkillSection' import front from '../../images/front_end.png' import back from '../../images/back_end.png' import design from '../../images/design.png' -import {fetchGet} from '../../server/server' + import {Footer} from '../Footer/Footer' import './candidate.scss' +import {useRequest} from "../../hooks/useRequest"; const Candidate = () => { const {id: candidateId} = useParams(); @@ -28,16 +28,15 @@ const Candidate = () => { const role = useSelector(getRole); const [activeSnippet, setActiveSnippet] = useState(true); + const {apiRequest} = useRequest(); + useEffect(() => { window.scrollTo(0, 0) }, []); useEffect(() => { - fetchGet({ - link: `${process.env.REACT_APP_API_URL}/api/profile/${candidateId}`, + apiRequest(`/profile/${candidateId}`,{ params: Number(candidateId), - role, - logout: () => dispatch(auth(false)) }).then((el) => dispatch(currentCandidate(el))) }, [dispatch, candidateId]); diff --git a/src/components/Home/Home.js b/src/components/Home/Home.js index 3a2d4037..ef0e5bfc 100644 --- a/src/components/Home/Home.js +++ b/src/components/Home/Home.js @@ -12,33 +12,27 @@ import {getRole} from '../../redux/roleSlice' import {useRequest} from "../../hooks/useRequest"; + const Home = () => { const [isLoadingMore, setIsLoadingMore] = useState(false); const [index, setIndex] = useState(4); const dispatch = useDispatch(); - const role = useSelector(getRole); const {apiRequest} = useRequest(); useEffect(() => { setIsLoadingMore(true); - apiRequest('/profile',{ - //Корс блокирует все фильтры в гет параметрах - params: {"offset": 1000}, - role, - // logout: () => dispatch(auth(false)) + apiRequest('/profile', { + params: {limit: 1000}, }).then((profileArr) => { dispatch(profiles(profileArr)); setIsLoadingMore(false) }); - apiRequest('/skills/skills-on-main-page',{ - - role, - // logout: () => dispatch(auth(false)) + apiRequest('/skills/skills-on-main-page', { }).then((skills) => { if (!skills) { return [] diff --git a/src/components/Loader/loader.scss b/src/components/Loader/loader.scss index 582922fa..8793f929 100644 --- a/src/components/Loader/loader.scss +++ b/src/components/Loader/loader.scss @@ -4,7 +4,7 @@ display: flex; justify-content: center; align-items: center; - + position: relative; &:hover { path { fill: #6aaf5c; diff --git a/src/components/OutstaffingBlock/OutstaffingBlock.js b/src/components/OutstaffingBlock/OutstaffingBlock.js index 9afb1445..bde293e1 100644 --- a/src/components/OutstaffingBlock/OutstaffingBlock.js +++ b/src/components/OutstaffingBlock/OutstaffingBlock.js @@ -1,43 +1,38 @@ import React from 'react' import OutsideClickHandler from 'react-outside-click-handler' -import { useDispatch, useSelector } from 'react-redux' +import {useDispatch, useSelector} from 'react-redux' import { selectItems, selectedItems, filteredCandidates, - auth } from '../../redux/outstaffingSlice' -import { fetchGet } from '../../server/server' - -import { getRole } from '../../redux/roleSlice' +import {useRequest} from "../../hooks/useRequest"; import './outstaffingBlock.scss' -const handlePositionClick = ({ - dispatch, - positionId, - isSelected, - onSelect, - role -}) => { + +const handlePositionClick = ( + { + dispatch, + positionId, + isSelected, + onSelect, + apiRequest + }) => { if (isSelected) { - fetchGet({ - link: `${process.env.REACT_APP_API_URL}/api/profile?limit=`, - params: 4, - role, - logout: () => dispatch(auth(false)) + apiRequest('/profile', { + params: {limit: 1000}, }).then((profileArr) => { dispatch(filteredCandidates(profileArr)); dispatch(selectedItems([])); onSelect(positionId) }) } else { - fetchGet({ - link: `${process.env.REACT_APP_API_URL}/api/profile?position_id=`, - params: positionId, - role, - logout: () => dispatch(auth(false)) + apiRequest('/profile', { + params: { + limit: '1000', + position_id: positionId}, }).then((el) => { dispatch(filteredCandidates(el)); dispatch(selectedItems([])); @@ -46,25 +41,27 @@ const handlePositionClick = ({ } }; -const OutstaffingBlock = ({ - dataTags = [], - selected, - img, - header, - positionId, - isSelected, - onSelect -}) => { +const OutstaffingBlock = ( + { + dataTags = [], + selected, + img, + header, + positionId, + isSelected, + onSelect + }) => { - const role = useSelector(getRole); const dispatch = useDispatch(); const itemsArr = useSelector(selectItems); + const {apiRequest} = useRequest(); + const handleBlockClick = (item, id) => { if (!itemsArr.find((el) => item === el.value)) { - dispatch(selectedItems([...itemsArr, { id, value: item, label: item }])) + dispatch(selectedItems([...itemsArr, {id, value: item, label: item}])) } }; @@ -81,56 +78,56 @@ const OutstaffingBlock = ({ }); return ( - { - isSelected && onSelect(null) - }} - > -
{ + isSelected && onSelect(null) + }} >
- handlePositionClick({ - dispatch, - positionId, - isSelected, - onSelect, - role - }) - } + className={`outstaffing-block${ + isSelected ? ' outstaffing-block__selected' : '' + }`} > -

{header}

- img +
+ handlePositionClick({ + dispatch, + positionId, + isSelected, + onSelect, + apiRequest + }) + } + > +

{header}

+ img +
+
+

# Популярный стек

+ {dataTags && ( +
    + {dataTags.map((item) => ( +
  • handleBlockClick(item.value, item.id)} + > + {item.value} +
  • + ))} +
+ )} +
-
-

# Популярный стек

- {dataTags && ( -
    - {dataTags.map((item) => ( -
  • handleBlockClick(item.value, item.id)} - > - {item.value} -
  • - ))} -
- )} -
-
-
+ ) }; diff --git a/src/components/ProfileCalendar/ProfileCalendar.js b/src/components/ProfileCalendar/ProfileCalendar.js index ae5899b3..4600566f 100644 --- a/src/components/ProfileCalendar/ProfileCalendar.js +++ b/src/components/ProfileCalendar/ProfileCalendar.js @@ -2,7 +2,6 @@ import React, { useEffect, useState } from 'react' import {useDispatch, useSelector} from 'react-redux' import { getProfileInfo } from '../../redux/outstaffingSlice' import { setReportDate } from '../../redux/reportSlice'; -import {fetchGet} from "../../server/server"; import arrow from "../../images/right-arrow.png"; import { Link } from 'react-router-dom' import moment from "moment"; @@ -12,40 +11,42 @@ import {ProfileCalendarComponent} from "./ProfileCalendarComponent"; import { Footer } from '../Footer/Footer' import './profileCalendar.scss' +import {useRequest} from "../../hooks/useRequest"; export const ProfileCalendar = () => { const dispatch = useDispatch(); - const profileInfo = useSelector(getProfileInfo) - const [month, setMonth] = useState('') - const [reports, setReports] = useState([]) - const [totalHours, setTotalHours] = useState(0) - const [value, setValue] = useState(moment()) - const [requestDates, setRequestDates] = useState('') + const profileInfo = useSelector(getProfileInfo); + const [month, setMonth] = useState(''); + const [reports, setReports] = useState([]); + const [totalHours, setTotalHours] = useState(0); + const [value, setValue] = useState(moment()); + const [requestDates, setRequestDates] = useState(''); + + const {apiRequest} = useRequest(); useEffect(() => { setRequestDates(getReports(value)) - }) + }); useEffect(async () => { if (!requestDates) { return } - const response = await fetchGet({ - link: `${process.env.REACT_APP_API_URL}/api/reports/reports-by-date?${requestDates}&user_id=${localStorage.getItem('id')}`, - }).then((reports) => { - let spendTime = 0 - reports.map((report)=> { - if (report.spendTime) { - spendTime += Number(report.spendTime) - } + apiRequest(`/reports/reports-by-date?${requestDates}&user_id=${localStorage.getItem('id')}`) + .then((reports) => { + let spendTime = 0; + reports.map((report) => { + if (report.spendTime) { + spendTime += Number(report.spendTime) + } + }); + setTotalHours(spendTime); + setReports(reports) }) - setTotalHours(spendTime) - setReports(reports) - }) - },[requestDates]) + }, [requestDates]); useEffect(() => { setMonth(currentMonth) - }, [month]) + }, [month]); return (
diff --git a/src/components/ReportForm/ReportForm.js b/src/components/ReportForm/ReportForm.js index df618b6a..345b3f01 100644 --- a/src/components/ReportForm/ReportForm.js +++ b/src/components/ReportForm/ReportForm.js @@ -28,7 +28,6 @@ const getCreatedDate = (day) => { const ReportForm = () => { const dispatch = useDispatch(); - const navigate = useNavigate(); const reportDate = useSelector(getReportDate); const role = useSelector(getRole); diff --git a/src/components/Select/TagSelect.js b/src/components/Select/TagSelect.js index a4bc7a63..5f78d4ca 100644 --- a/src/components/Select/TagSelect.js +++ b/src/components/Select/TagSelect.js @@ -1,41 +1,39 @@ -import React, { useState } from 'react' -import { useSelector, useDispatch } from 'react-redux' +import React, {useState} from 'react' +import {useSelector, useDispatch} from 'react-redux' import Select from 'react-select' -import { Loader } from '../Loader/Loader' -import style from './TagSelect.module.css' +import {Loader} from '../Loader/Loader' +import {useRequest} from "../../hooks/useRequest"; import { selectedItems, selectItems, selectTags, filteredCandidates, - setPositionId, - auth + setPositionId } from '../../redux/outstaffingSlice' -import { fetchGet } from '../../server/server' -import { getRole } from '../../redux/roleSlice' +import style from './TagSelect.module.css' + const TagSelect = () => { - const role = useSelector(getRole); const [searchLoading, setSearchLoading] = useState(false); const dispatch = useDispatch(); - const itemsArr = useSelector(selectItems); + const {apiRequest} = useRequest(); + const itemsArr = useSelector(selectItems); const tagsArr = useSelector(selectTags); - const handleSubmit = ({ dispatch, setSearchLoading }) => { + const handleSubmit = ({dispatch, setSearchLoading}) => { setSearchLoading(true); dispatch(setPositionId(null)); const filterItemsId = itemsArr.map((item) => item.id).join(); + const params = filterItemsId ? {skill: filterItemsId} : ''; - fetchGet({ - link: `${process.env.REACT_APP_API_URL}/api/profile?skills=`, - params: filterItemsId, - role, - logout: () => dispatch(auth(false)) + + apiRequest('/profile', { + params: {...params, limit: 1000}, }).then((el) => { dispatch(filteredCandidates(el)); setSearchLoading(false) @@ -45,44 +43,44 @@ const TagSelect = () => { }; return ( - <> -
-
-
-

- Найти специалиста по навыкам -

-
- {console.log(value) ;return dispatch(selectedItems(value))}} + isMulti + name='tags' + className={style.select} + classNamePrefix={style.select} + options={ + tagsArr && + tagsArr.flat().map((item) => { + return { + id: item.id, + value: item.value, + label: item.value + } + }) } - }) - } - /> - + /> + +
- -
- +
+ ) }; diff --git a/src/components/features/bookkeeping/ActContent/ActContent.js b/src/components/features/bookkeeping/ActContent/ActContent.js index 34ff850a..f79ccc38 100644 --- a/src/components/features/bookkeeping/ActContent/ActContent.js +++ b/src/components/features/bookkeeping/ActContent/ActContent.js @@ -1,102 +1,101 @@ -import React, { useEffect, useState } from 'react'; -import { ContentTitle } from "../ContentTitle/ContentTitle" -import { ContentButton } from "../ContentButton/ContentButton" -import { BookkeepingFormField } from "../BookkeepingFormField/BookkeepingFormField" -import { BookkepingSelect } from '../BookkepingSelect/BookkepingSelect'; -import { BookkepingInput } from '../BookkepingInput/BookkepingInput'; -import { fetchGet } from '../../../../server/server' -import { Link } from "react-router-dom" +import React, {useEffect, useState} from 'react'; +import {Link} from "react-router-dom" +import {ContentTitle} from "../ContentTitle/ContentTitle" +import {ContentButton} from "../ContentButton/ContentButton" +import {BookkeepingFormField} from "../BookkeepingFormField/BookkeepingFormField" +import {BookkepingSelect} from '../BookkepingSelect/BookkepingSelect'; +import {BookkepingInput} from '../BookkepingInput/BookkepingInput'; + +import {useRequest} from "../../../../hooks/useRequest"; + import "./actContent.css" -export const ActContent = ()=> { - - const [templates, setTemplates] = useState([]) - const [selectedTemplate, setSelectedTemplate] = useState() - const [templatedFields, setTemplatedFields] = useState([]) +export const ActContent = () => { - useEffect(() => { - fetchGet({ - link: `${process.env.REACT_APP_API_URL}/api/template/get-template-list`, - }).then((res) => { - setTemplates(res) - }) - }, []) + const [templates, setTemplates] = useState([]); + const [selectedTemplate, setSelectedTemplate] = useState(); + const [templatedFields, setTemplatedFields] = useState([]); - useEffect(() => { - if (selectedTemplate === undefined) { - return - } - fetchGet({ - link: `${process.env.REACT_APP_API_URL}/api/template/get-template-fields?template_id=${selectedTemplate}`, - }) - .then((res) => { - setTemplatedFields(res[0].templateDocumentFields) - }) - }, [selectedTemplate]) + const {apiRequest} = useRequest(); + + useEffect(() => { + apiRequest('/template/get-template-list') + .then(res => setTemplates(res)) + }, []); + + useEffect(() => { + if (selectedTemplate === undefined) { + return + } + apiRequest(`/template/get-template-fields?template_id=${selectedTemplate}`) + .then(res => setTemplatedFields(res[0].templateDocumentFields)) + }, [selectedTemplate]); - + return ( +
+
+ +
+
+
+
Создание акта №
+ + от + +
- return( -
-
- -
- -
-
Создание акта №
- - от - -
+ { + } + }} + /> - {} - }} - /> - - {templatedFields.map((field, index ) => - - )} + {templatedFields.map((field, index) => + + )} - -
- Сохранить - -
- Отменить -
- -
- -
+
+ Сохранить + +
+ Отменить +
+ +
+ +
-
- ) -} \ No newline at end of file +
+ ) +}; \ No newline at end of file diff --git a/src/components/features/bookkeeping/ContractContent/ContractContent.js b/src/components/features/bookkeeping/ContractContent/ContractContent.js index 1569fbaa..93804d46 100644 --- a/src/components/features/bookkeeping/ContractContent/ContractContent.js +++ b/src/components/features/bookkeeping/ContractContent/ContractContent.js @@ -1,97 +1,98 @@ -import React, { useEffect, useState } from "react"; -import { ContentTitle } from "../ContentTitle/ContentTitle" -import { ContentButton } from "../ContentButton/ContentButton" -import { BookkeepingFormField } from "../BookkeepingFormField/BookkeepingFormField" -import { BookkepingSelect } from '../BookkepingSelect/BookkepingSelect'; -import { BookkepingInput } from '../BookkepingInput/BookkepingInput'; -import { fetchGet } from '../../../../server/server' -import { Link } from "react-router-dom" +import React, {useEffect, useState} from "react"; +import {ContentTitle} from "../ContentTitle/ContentTitle" +import {ContentButton} from "../ContentButton/ContentButton" +import {BookkeepingFormField} from "../BookkeepingFormField/BookkeepingFormField" +import {BookkepingSelect} from '../BookkepingSelect/BookkepingSelect'; +import {BookkepingInput} from '../BookkepingInput/BookkepingInput'; +import {Link} from "react-router-dom" +import {useRequest} from "../../../../hooks/useRequest"; export const ContractContent = () => { - const [templates, setTemplates] = useState([]) - const [selectedTemplate, setSelectedTemplate] = useState() - const [templatedFields, setTemplatedFields] = useState([]) - - useEffect(() => { - fetchGet({ - link: `${process.env.REACT_APP_API_URL}/api/document/get-document-list`, - }).then((res) => { - setTemplates(res) - }) - }, []) + const [templates, setTemplates] = useState([]); + const [selectedTemplate, setSelectedTemplate] = useState(); + const [templatedFields, setTemplatedFields] = useState([]); - useEffect(() => { - if (selectedTemplate === undefined) { - return - } - fetchGet({ - link: `${process.env.REACT_APP_API_URL}/api/document/get-document?document_id=${selectedTemplate}`, - }) - .then((res) => { - setTemplatedFields(res[0].templateDocumentFields) - }) - }, [selectedTemplate]) + const {apiRequest} = useRequest(); - return ( -
-
- -
- + useEffect(() => { + apiRequest(`/document/get-document-list`) + .then(res => setTemplates(res)) + }, []); -
-
-
Создание договора №
- - от - -
- {} - }} - /> - - {templatedFields.map((field, index ) => - - )} + useEffect(() => { + if (selectedTemplate === undefined) { + return + } + apiRequest(`/document/get-document?document_id=${selectedTemplate}`) + .then(res => setTemplatedFields(res[0].templateDocumentFields) + ) + }, [selectedTemplate]); -
- Сохранить - -
- Отменить -
- -
- -
+ return ( +
+
+ +
+ + +
+
+
Создание договора №
+ + от + +
+ { + } + }} + /> + + {templatedFields.map((field, index) => + + )} + +
+ Сохранить + +
+ Отменить +
+ +
+ +
-
- ) -} \ No newline at end of file +
+ ) +}; \ No newline at end of file diff --git a/src/components/features/quiz/HeaderQuiz.js b/src/components/features/quiz/HeaderQuiz.js index 76be63a6..febcfe65 100644 --- a/src/components/features/quiz/HeaderQuiz.js +++ b/src/components/features/quiz/HeaderQuiz.js @@ -1,50 +1,46 @@ -import {useEffect} from 'react' -import {useDispatch} from 'react-redux' -import {useSelector} from 'react-redux' -import {fetchGet} from '../../../server/server' +import React, {useEffect} from 'react' +import {useDispatch, useSelector} from 'react-redux' +import {selectUserInfo, setQuestionnairesList, setUserInfo} from "../../../redux/quizSlice"; +import {useRequest} from "../../../hooks/useRequest"; import './quiz.scss' -import {selectUserInfo, setQuestionnairesList, setUserInfo,} from "../../../redux/quizSlice"; export const HeaderQuiz = ({header}) => { - const dispatch = useDispatch() - const userId = localStorage.getItem('id'); - const userInfo = useSelector(selectUserInfo); + const dispatch = useDispatch(); + const userId = localStorage.getItem('id'); + const userInfo = useSelector(selectUserInfo); - useEffect(() => { - dispatch(setUserInfo(userId)) - }, [dispatch]) + const {apiRequest} = useRequest(); - useEffect(() => { - fetchGet({ - link: `${process.env.REACT_APP_API_URL}/api/user-questionnaire/questionnaires-list?user_id=${userId}`, - Origin: `${process.env.REACT_APP_BASE_URL}`, - } - ).then(response => { - dispatch(setQuestionnairesList(response)) - }) - }, [dispatch]) + useEffect(() => { + dispatch(setUserInfo(userId)) + }, [dispatch]); - return ( -
- { userInfo?.status === 500 ?
{userInfo.message}
: -
-
- {!userInfo ?

Loading...

: - <> - {header &&

Добрый день, {userInfo.fio}

} -
-
+ useEffect(() => { + apiRequest(`/user-questionnaire/questionnaires-list?user_id=${userId}`) + .then(res => dispatch(setQuestionnairesList(res))) + }, [dispatch]); + + return ( +
+ {userInfo?.status === 500 ?
{userInfo.message}
: +
+
+ {!userInfo ?

Loading...

: + <> + {header &&

Добрый день, {userInfo.fio}

} +
+
{userInfo.photo}/ -
-
{userInfo.fio}
-
{userInfo.position_name}
-
- - } +
+
{userInfo.fio}
+
{userInfo.position_name}
+
+ + } +
-
- } -
- ) -} + } +
+ ) +}; diff --git a/src/components/features/quiz/Instructions.js b/src/components/features/quiz/Instructions.js index 1b266508..08a7c057 100644 --- a/src/components/features/quiz/Instructions.js +++ b/src/components/features/quiz/Instructions.js @@ -5,23 +5,26 @@ import './quiz.scss' import {useEffect, useState} from "react"; import {useSelector} from "react-redux"; import {selectedTest} from "../../../redux/quizSlice"; -import {fetchGet} from "../../../server/server"; + +import {useRequest} from "../../../hooks/useRequest"; export const Instruction = () => { - const [countQuestions, setCountQuestions] = useState(null) - const test = useSelector(selectedTest) + const [countQuestions, setCountQuestions] = useState(null); + const test = useSelector(selectedTest); - useEffect(async () => { + const {apiRequest} = useRequest(); - const response = await fetchGet({ - link: `${process.env.REACT_APP_API_URL}/api/user-questionnaire/get-question-number?user_questionnaire_uuid=${test.uuid}`, - Origin: `${process.env.REACT_APP_BASE_URL}`, - } - ) - setCountQuestions(response.question_number) + useEffect( () => { - }, []) + apiRequest('/user-questionnaire/get-question-number', { + params: {user_questionnaire_uuid: test.uuid}, + + } + ).then((res)=> setCountQuestions(res.question_number)) + + + }, []); return (
@@ -49,5 +52,5 @@ export const Instruction = () => {
) -} +}; diff --git a/src/components/features/quiz/Results.js b/src/components/features/quiz/Results.js index ba7612b8..d475fd05 100644 --- a/src/components/features/quiz/Results.js +++ b/src/components/features/quiz/Results.js @@ -1,37 +1,35 @@ import React, {useEffect, useState} from 'react'; import {useDispatch, useSelector} from "react-redux"; import {fetchResultTest, selectedTest, selectResult} from "../../../redux/quizSlice"; -import {fetchGet} from "../../../server/server"; +import {useRequest} from "../../../hooks/useRequest"; export const Results = () => { - const result = useSelector(selectResult); - const test = useSelector(selectedTest); - const [maxScore, setMaxScore] = useState(''); - const dispatch = useDispatch(); + const result = useSelector(selectResult); + const test = useSelector(selectedTest); + const [maxScore, setMaxScore] = useState(''); + const dispatch = useDispatch(); + const {apiRequest} = useRequest(); - useEffect(async () => { - dispatch(fetchResultTest(test.uuid)); - const response = await fetchGet({ - link: `${process.env.REACT_APP_API_URL}/api/user-questionnaire/get-points-number?user_questionnaire_uuid=${test.uuid}`, - Origin: `${process.env.REACT_APP_BASE_URL}`, - } - ); - setMaxScore(response.sum_point) - }, []); + useEffect(async () => { + dispatch(fetchResultTest(test.uuid)); + apiRequest(`/user-questionnaire/get-points-number?user_questionnaire_uuid=${test.uuid}`) + .then((res) => setMaxScore(res.sum_point)); - return ( -
+ }, []); + + return ( +
{ - !result ?

Ожидайте результата...

: + !result ?

Ожидайте результата...

: -
+
Благодарим за прохождение теста
Ваш Результат: {result.score} из {maxScore}
-
+ className="result__score">{result.score} из {maxScore}
+
} -
- ); +
+ ); }; diff --git a/src/components/features/quiz/Task.js b/src/components/features/quiz/Task.js index 8658d14c..2ba3b07a 100644 --- a/src/components/features/quiz/Task.js +++ b/src/components/features/quiz/Task.js @@ -1,11 +1,11 @@ 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 { - fetchGetAnswers, - selectAnswer, - selectedTest + fetchGetAnswers, + selectAnswer, + selectedTest } from '../../../redux/quizSlice' import {Progressbar} from './ProgressbarQuiz' @@ -13,140 +13,141 @@ import {GetOptionTask} from './GetOptionTask' import {fetchUserAnswersMany, fetchUserAnswerOne} from './../../../redux/quizSlice' -import {fetchGet} from "../../../server/server"; import './quiz.scss' +import {useRequest} from "../../../hooks/useRequest"; export const TaskQuiz = () => { - const navigate = useNavigate(); - const dispatch = useDispatch(); + const navigate = useNavigate(); + const dispatch = useDispatch(); - const listAnswers = useSelector(selectAnswer); - const dataTest = useSelector(selectedTest); + const listAnswers = useSelector(selectAnswer); + const dataTest = useSelector(selectedTest); - const [index, setIndex] = useState(0); - const [checkedValues, setCheckedValues] = useState([]); - const [stripValue, setStripValue] = useState(0); - const [inputValue, setInputValue] = useState(''); - const [questions, setQuestions] = useState([]); + const [index, setIndex] = useState(0); + const [checkedValues, setCheckedValues] = useState([]); + const [stripValue, setStripValue] = useState(0); + const [inputValue, setInputValue] = useState(''); + const [questions, setQuestions] = useState([]); - const id = localStorage.getItem('id'); + const {apiRequest} = useRequest(); - useEffect( () => { - const response = fetchGet({ - link: `${process.env.REACT_APP_API_URL}/api/question/get-questions?uuid=${dataTest.uuid}`, - Origin: `${process.env.REACT_APP_BASE_URL}`, - } - ); - setQuestions(response); - dispatch(fetchGetAnswers(response[0].id)); - setStripValue((+index + 1) * 100 / response.length) - }, [dispatch]); + const id = localStorage.getItem('id'); - const nextQuestion = async (e) => { - e.preventDefault(); + useEffect(() => { + apiRequest(`/question/get-questions?uuid=${dataTest.uuid}`) + .then((response) => { + setQuestions(response); + dispatch(fetchGetAnswers(response[0].id)); + setStripValue((+index + 1) * 100 / response.length) + }) + }, [dispatch]); - //Проверка на валидацию ответов - if (checkedValues.length || inputValue) { - switch (questions[index].question_type_id) { - case '3': - dispatch(fetchUserAnswersMany(checkedValues)); - break; - case '2': - case '1': - case '4': - dispatch(fetchUserAnswerOne(checkedValues)); - break; - default: - break; - } + const nextQuestion = async (e) => { + e.preventDefault(); - //Проверка на существование следующего запроса - if (index < questions.length - 1) { - await dispatch(fetchGetAnswers(questions[index + 1].id)); - setIndex(prev => prev >= questions.length - 1 ? prev : prev + 1); - setStripValue((prev => prev + (100 / questions.length))); - setCheckedValues([]); - setInputValue('') - } else { - navigate(`/quiz-result`); - alert("Тест пройден!") - } - - } else { - alert("Вы не ответили на вопрос") - } - }; - - const handleChange = (e) => { - const checked = e.target.checked; + //Проверка на валидацию ответов + if (checkedValues.length || inputValue) { switch (questions[index].question_type_id) { - case '3': - checked ? setCheckedValues(prev => [...prev, { - user_id: id, - user_questionnaire_uuid: dataTest.uuid, - question_id: questions[index].id, - response_body: e.target.value - }]) : - setCheckedValues(prev => [...prev.filter(item => item.response_body !== e.target.value)]); - break; - case '1': - case '2': - case '4': - setCheckedValues([{ - user_id: id, - user_questionnaire_uuid: dataTest.uuid, - question_id: questions[index].id, - response_body: e.target.value - }]) + case '3': + dispatch(fetchUserAnswersMany(checkedValues)); + break; + case '2': + case '1': + case '4': + dispatch(fetchUserAnswerOne(checkedValues)); + break; + default: + break; } - }; + + //Проверка на существование следующего запроса + if (index < questions.length - 1) { + await dispatch(fetchGetAnswers(questions[index + 1].id)); + setIndex(prev => prev >= questions.length - 1 ? prev : prev + 1); + setStripValue((prev => prev + (100 / questions.length))); + setCheckedValues([]); + setInputValue('') + } else { + navigate(`/quiz-result`); + alert("Тест пройден!") + } + + } else { + alert("Вы не ответили на вопрос") + } + }; + + const handleChange = (e) => { + const checked = e.target.checked; + switch (questions[index].question_type_id) { + case '3': + checked ? setCheckedValues(prev => [...prev, { + user_id: id, + user_questionnaire_uuid: dataTest.uuid, + question_id: questions[index].id, + response_body: e.target.value + }]) : + setCheckedValues(prev => [...prev.filter(item => item.response_body !== e.target.value)]); + break; + case '1': + case '2': + case '4': + setCheckedValues([{ + user_id: id, + user_questionnaire_uuid: dataTest.uuid, + question_id: questions[index].id, + response_body: e.target.value + }]) + } + }; - return ( - + return ( +
- {!questions.length || !stripValue || !listAnswers.length ? -

Loading....

- : -
+ {!questions.length || !stripValue || !listAnswers.length ? +

Loading....

+ : +
- {/* */} + {/* */}

{questions[index].question_body}

-
- { - questions[index].question_type_id === 1 ? - - : - listAnswers.map((answer) => ( - - )) - } -
- {questions.length !== index + 1 && - } - {questions.length === index + 1 && } -
- +
+ { + questions[index].question_type_id === 1 ? + + : + listAnswers.map((answer) => ( + + )) + } +
+ {questions.length !== index + 1 && + } + {questions.length === index + 1 && + } +
+
-
- } +
+ }
-
- ) +
+ ) }; diff --git a/src/hooks/useLogout.js b/src/hooks/useLogout.js index 5d46922a..84fd7afe 100644 --- a/src/hooks/useLogout.js +++ b/src/hooks/useLogout.js @@ -1,4 +1,3 @@ -import React from "react"; import {useDispatch, useSelector} from "react-redux"; import {getRole} from "../redux/roleSlice"; import {useNavigate} from "react-router-dom"; @@ -12,7 +11,6 @@ export const useLogout = () => { const logout = () => { localStorage.clear(); dispatch(auth(false)); - console.log('logout') navigate(userRole === 'ROLE_DEV' ? '/authdev' : '/auth') }; diff --git a/src/hooks/useRequest.js b/src/hooks/useRequest.js index 07fa0054..fd0c78f2 100644 --- a/src/hooks/useRequest.js +++ b/src/hooks/useRequest.js @@ -1,7 +1,5 @@ -import React from "react"; import axios from 'axios'; import {getToken, urlHasParams} from "../helper"; -import {useNavigate} from "react-router"; import {useLogout} from "./useLogout"; @@ -38,7 +36,6 @@ export const useRequest = () => { }) .then(response => new Promise(resolve => { if (response.data.redirect || response.status === 401) { - console.log(response, 'LOGUTATAT') logout() } return resolve(response) diff --git a/src/pages/FormPage.js b/src/pages/FormPage.js index e4b769d1..1c525ded 100644 --- a/src/pages/FormPage.js +++ b/src/pages/FormPage.js @@ -4,13 +4,11 @@ import {useParams, useNavigate} from 'react-router-dom' import { currentCandidate, selectCurrentCandidate, - auth } from '../redux/outstaffingSlice' import SVG from 'react-inlinesvg' import {WithLogout} from '../hoc/withLogout' import Form from '../components/Form/Form' import {LEVELS, SKILLS} from '../components/constants/constants' -import {fetchGet} from '../server/server' import {Footer} from '../components/Footer/Footer' import arrow from '../images/right-arrow.png' @@ -18,7 +16,7 @@ import rectangle from '../images/rectangle_secondPage.png' import telegramIcon from '../images/telegram-icon.svg' import './formPage.scss' -import {getRole} from '../redux/roleSlice' +import {useRequest} from "../hooks/useRequest"; const FormPage = () => { @@ -26,20 +24,19 @@ const FormPage = () => { const navigate = useNavigate(); const dispatch = useDispatch(); const candidate = useSelector(selectCurrentCandidate); - const role = useSelector(getRole); + + + const {apiRequest} = useRequest(); const goBack = () => { navigate(-1) }; if (!candidate.id) { - fetchGet({ - link: `${process.env.REACT_APP_API_URL}/api/profile/`, - params: Number(params.id), - navigate, - role, - logout: () => dispatch(auth(false)) - }).then((el) => dispatch(currentCandidate(el))) + apiRequest('/api/profile', { + params: Number(params.id) + }) + .then((el) => dispatch(currentCandidate(el))) } return ( diff --git a/src/pages/Summary/Summary.js b/src/pages/Summary/Summary.js index a8705472..537df491 100644 --- a/src/pages/Summary/Summary.js +++ b/src/pages/Summary/Summary.js @@ -1,104 +1,101 @@ import React, {useEffect, useState} from 'react'; +import {useSelector} from "react-redux"; import {ProfileHeader} from "../../components/ProfileHeader/ProfileHeader"; import {getProfileInfo} from "../../redux/outstaffingSlice"; -import {useSelector} from "react-redux"; -import {transformHtml} from "../../helper"; import {Footer} from '../../components/Footer/Footer' +import {transformHtml} from "../../helper"; + +import {useRequest} from "../../hooks/useRequest"; import arrow from "../../images/right-arrow.png"; import rightArrow from "../../images/arrowRight.png" import gitImgItem from "../../images/gitItemImg.png" -import {fetchGet} from "../../server/server"; - import './summary.scss' - - export const Summary = () => { - const profileInfo = useSelector(getProfileInfo); - const [openGit, setOpenGit] = useState(false); - const [gitInfo, setGitInfo] = useState([]); - useEffect(() => { - fetchGet({ - link: `${process.env.REACT_APP_API_URL}/api/profile/portfolio-projects?card_id=${localStorage.getItem('cardId')}`, - }).then((responseGit) => { - setGitInfo(responseGit) - }) - }, []); - return( -
- -
-
-

Ваше резюме {openGit && - Git}

- {openGit &&
setOpenGit(false)}> - arrow -

Вернуться

-
} -
-
- avatar -

{profileInfo.fio} {profileInfo.specification}

-
- {!openGit && - - } -
-
- {!openGit && -
-
-

Основной стек

- -
-
-
- {profileInfo.skillValues && profileInfo.skillValues.map((skill) => { - return {skill.skill.name} - })} -
-
-
- } - {profileInfo.vc_text && !openGit && -
-
- } - {openGit && -
-
-

Страница портфолио кода разработчика

- -
-
- {gitInfo.length && gitInfo.map((itemGit) => { - return
-
-
- gitImg -
-

{itemGit.title}

-

{itemGit.description}

-
-
-
- -

{itemGit.main_stack}

-
-
- - arrowRight - -
- }) - } -
-
- } + const profileInfo = useSelector(getProfileInfo); + const [openGit, setOpenGit] = useState(false); + const [gitInfo, setGitInfo] = useState([]); + + const {apiRequest} = useRequest(); + useEffect(() => { + apiRequest(`/profile/portfolio-projects?card_id=${localStorage.getItem('cardId')}`) + .then(responseGit => setGitInfo(responseGit)) + }, [apiRequest]); + return ( +
+ +
+
+

Ваше резюме {openGit && - Git}

+ {openGit &&
setOpenGit(false)}> + arrow +

Вернуться

+
} +
+
+ avatar +

{profileInfo.fio} {profileInfo.specification}

+
+ {!openGit && + + }
-
+
+ {!openGit && +
+
+

Основной стек

+ +
+
+
+ {profileInfo.skillValues && profileInfo.skillValues.map((skill) => + {skill.skill.name} + )} +
+
+
+ } + {profileInfo.vc_text && !openGit && +
+
+ } + {openGit && +
+
+

Страница портфолио кода разработчика

+ +
+
+ {gitInfo.length && gitInfo.map((itemGit) => { + return
+
+
+ gitImg +
+

{itemGit.title}

+

{itemGit.description}

+
+
+
+ +

{itemGit.main_stack}

+
+
+ + arrowRight + +
+ }) + } +
+
+ }
- ) +
+ ) };