Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

CreateAdPage.js 4.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. import React, { useState } from "react";
  2. import { useRef } from "react";
  3. import { useEffect } from "react";
  4. import { useDispatch, useSelector } from "react-redux";
  5. import plusIcon from "../../assets/images/plus.png";
  6. import {
  7. resetIsCheckedAddAdValue,
  8. setTechnologiesAddAdReq,
  9. } from "../../store/actions/addAdTechnologies/addAdTechnologiesActions";
  10. import { setCreateAdReq } from "../../store/actions/createAd/createAdActions";
  11. import CreateAdFirstStep from "./CreateAdFirstStep";
  12. import CreateAdSecondStep from "./CreateAdSecondStep";
  13. import CreateAdThirdStep from "./CreateAdThirdStep";
  14. import { useHistory } from "react-router-dom";
  15. import { ADS_PAGE } from "../../constants/pages";
  16. import { useTranslation } from "react-i18next";
  17. const CreateAdPage = () => {
  18. const [stage, setStage] = useState(1);
  19. const [title, setTitle] = useState("");
  20. const [employmentType, setEmploymentType] = useState("Work");
  21. const [workHour, setWorkHour] = useState("FullTime");
  22. const [expiredAt, setExpiredAt] = useState("");
  23. const [experience, setExperience] = useState(0);
  24. const childRef = useRef();
  25. const history = useHistory();
  26. const { t } = useTranslation();
  27. const technologies = useSelector(
  28. (state) => state.addAdTechnologies.technologies
  29. );
  30. const dispatch = useDispatch();
  31. useEffect(() => {
  32. dispatch(setTechnologiesAddAdReq());
  33. }, []);
  34. const createAd = (keyResponsibilities, requirements, offer) => {
  35. const onSuccessAddAd = () => {
  36. setStage(1);
  37. setTitle("");
  38. setEmploymentType("Work");
  39. setWorkHour("FullTime");
  40. setExpiredAt("");
  41. setExperience(0);
  42. dispatch(resetIsCheckedAddAdValue());
  43. history.push(ADS_PAGE);
  44. };
  45. const technologiesIds = technologies
  46. .filter((x) => x.isChecked === true)
  47. .map((x) => x.technologyId);
  48. dispatch(
  49. setCreateAdReq({
  50. title,
  51. minimumExperience: experience,
  52. createdAt: new Date(),
  53. expiredAt,
  54. keyResponsibilities,
  55. requirements,
  56. offer,
  57. workHour,
  58. employmentType,
  59. technologiesIds,
  60. onSuccessAddAd,
  61. })
  62. );
  63. };
  64. const backClickHandler = () => {
  65. if (stage === 1) {
  66. return;
  67. }
  68. setStage((oldState) => oldState - 1);
  69. };
  70. const forwardClickHandler = () => {
  71. if (stage === 1 && (title === "" || expiredAt === "")) {
  72. return;
  73. }
  74. if (stage === 2) {
  75. const checkedTechnologies = technologies.filter(
  76. (x) => x.isChecked === true
  77. );
  78. if (checkedTechnologies.length === 0) {
  79. return;
  80. }
  81. }
  82. if (stage === 3) {
  83. const {
  84. keyResponsibilities: k,
  85. requirements: r,
  86. offer: o,
  87. } = childRef.current();
  88. if (k === "" || r === "" || o === "") return;
  89. createAd(k, r, o);
  90. }
  91. if (stage < 3) {
  92. setStage((oldState) => oldState + 1);
  93. return;
  94. }
  95. };
  96. return (
  97. <div className="create-job-page" data-testid="create-job-page">
  98. <div className="create-job-page-content">
  99. <div className="create-job-page-content-header">
  100. <img
  101. src={plusIcon}
  102. alt="plus"
  103. style={{ width: "18px", height: "18px" }}
  104. />
  105. <h2>{t("ads.adding")}</h2>
  106. <h2>
  107. <sub> | {t("ads.ad")}</sub>
  108. </h2>
  109. </div>
  110. <div className="create-job-steps">
  111. {stage === 1 && (
  112. <CreateAdFirstStep
  113. title={title}
  114. setTitle={setTitle}
  115. employmentType={employmentType}
  116. setEmploymentType={setEmploymentType}
  117. workHour={workHour}
  118. setWorkHour={setWorkHour}
  119. expiredAt={expiredAt}
  120. setExpiredAt={setExpiredAt}
  121. />
  122. )}
  123. {stage === 2 && (
  124. <CreateAdSecondStep
  125. technologies={technologies}
  126. experience={experience}
  127. setExperience={setExperience}
  128. />
  129. )}
  130. {stage === 3 && <CreateAdThirdStep childRef={childRef} />}
  131. </div>
  132. <div className="create-job-buttons" style={{ marginBottom: "2rem" }}>
  133. <button
  134. className="create-job-buttons-back"
  135. disabled={stage === 1}
  136. onClick={backClickHandler}
  137. >
  138. {t("common.back")}
  139. </button>
  140. <button
  141. className="create-job-buttons-forward"
  142. onClick={forwardClickHandler}
  143. >
  144. {t("common.continue")}
  145. </button>
  146. </div>
  147. </div>
  148. <div className="create-ad-go-back">
  149. <button onClick={() => history.push(ADS_PAGE)}>
  150. {t("ads.backToAds")}
  151. </button>
  152. </div>
  153. </div>
  154. );
  155. };
  156. export default CreateAdPage;