You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. import React, { useState } from "react";
  2. import { Checkbox, FormControlLabel, MenuItem, Select } from "@mui/material";
  3. import { useTranslation } from "react-i18next";
  4. import uploadIcon from "../../assets/images/upload.png";
  5. import IconButton from "../../components/IconButton/IconButton";
  6. import { useSelector, useDispatch } from "react-redux";
  7. import { selectCategories } from "../../store/selectors/categoriesSelector";
  8. import { useEffect } from "react";
  9. import { setCategoriesReq } from "../../store/actions/categories/categoriesAction";
  10. import {
  11. changeTagIsCheckedValue,
  12. resetIsCheckedTagsValue,
  13. setTagsReq,
  14. } from "../../store/actions/tags/tagsAction";
  15. import { selectTags } from "../../store/selectors/tagsSelector";
  16. import { uploadFileReq } from "../../store/actions/uploadFile/uploadFileActions";
  17. const FilesPage = () => {
  18. const [dropzoneActive, setDropzoneActive] = useState(false);
  19. const [pdfFile, setPdfFile] = useState(null);
  20. const dispatch = useDispatch();
  21. const categories = useSelector(selectCategories);
  22. const tags = useSelector(selectTags);
  23. const [selectedCategory, setSelectedCategory] = useState(null);
  24. const { t } = useTranslation();
  25. useEffect(() => {
  26. dispatch(setCategoriesReq());
  27. dispatch(setTagsReq());
  28. }, []);
  29. const onSuccessUploadFile = () => {
  30. dispatch(resetIsCheckedTagsValue())
  31. setPdfFile(null)
  32. }
  33. const handleDrop = (e) => {
  34. e.preventDefault();
  35. const selectedFile = e.dataTransfer.files[0];
  36. setPdfFile(selectedFile);
  37. };
  38. const handleChangeInputFile = (e) => {
  39. const selectedFile = e.target.files[0];
  40. setPdfFile(selectedFile);
  41. };
  42. const selectCategoryHandler = (e) => {
  43. setSelectedCategory(e.target.value);
  44. };
  45. const onChangeTagsCheckbox = (id) => {
  46. dispatch(changeTagIsCheckedValue(id));
  47. };
  48. const uploadFileHandler = () => {
  49. const tagsIds = tags
  50. .filter((tag) => tag.isChecked === true)
  51. .map((tag) => Number(tag.id));
  52. dispatch(
  53. uploadFileReq({
  54. categoryId: selectedCategory,
  55. tagsIds,
  56. fileToUpload: pdfFile,
  57. onSuccessUploadFile
  58. })
  59. );
  60. };
  61. return (
  62. <div className="files-page">
  63. <div className="files-page-card">
  64. <div className="files-page-card-title">
  65. <h1>Categories</h1>
  66. </div>
  67. <div className="files-page-card-content">
  68. <Select
  69. labelId="files-page-card-content-select"
  70. id="files-page-card-content-selectt"
  71. sx={{ width: "100%" }}
  72. onChange={selectCategoryHandler}
  73. value={selectedCategory}
  74. >
  75. {categories &&
  76. categories.map((category, index) => (
  77. <MenuItem
  78. key={index}
  79. sx={{ textAlign: "left" }}
  80. value={category.id}
  81. >
  82. {category.name}
  83. </MenuItem>
  84. ))}
  85. </Select>
  86. </div>
  87. </div>
  88. <div className="files-page-card">
  89. <div className="files-page-card-title">
  90. <h1>Tags</h1>
  91. </div>
  92. <div className="files-page-card-content">
  93. <div className="files-page-card-content-checkboxes">
  94. {tags &&
  95. tags.map((tag) => (
  96. <FormControlLabel
  97. key={tag.id}
  98. control={
  99. <Checkbox
  100. value={tag.name}
  101. checked={tag.isChecked}
  102. onChange={onChangeTagsCheckbox.bind(this, tag.id)}
  103. className="create-ad-second-step-checkbox"
  104. />
  105. }
  106. label={tag.name}
  107. />
  108. ))}
  109. </div>
  110. </div>
  111. </div>
  112. <div className="files-page-card">
  113. <div className="files-page-card-title">
  114. <h1>Drag & Drop File</h1>
  115. </div>
  116. <div className="files-page-card-content">
  117. <div
  118. className="uploadCV-input"
  119. onDragOver={(e) => {
  120. setDropzoneActive(true);
  121. e.preventDefault();
  122. }}
  123. onDragLeave={(e) => {
  124. setDropzoneActive(false);
  125. e.preventDefault();
  126. }}
  127. onDrop={(e) => handleDrop(e)}
  128. style={{
  129. backgroundColor: dropzoneActive ? "#F4F4F4" : "#ffffff",
  130. }}
  131. >
  132. <div className="uploadCV-input-sub-container">
  133. <img src={uploadIcon} />
  134. <div className="uploadCV-input-sub-container">
  135. {pdfFile !== null ? (
  136. <p>{pdfFile.name}</p>
  137. ) : (
  138. <>
  139. <p>
  140. {t("ads.dragPdf1")} &nbsp;
  141. <label
  142. htmlFor="upload-file"
  143. style={{
  144. cursor: "pointer",
  145. textDecoration: "underline",
  146. color: "#1E92D0",
  147. }}
  148. >
  149. {t("common.search")}
  150. </label>
  151. &nbsp;{t("ads.dragPdf2")}
  152. </p>
  153. <input
  154. type="file"
  155. name="photo"
  156. id="upload-file"
  157. style={{ display: "none", zIndex: -1 }}
  158. value={pdfFile}
  159. data-testid="apply-for-ad-modal-fourth-stage-pdf-input"
  160. accept=".pdf"
  161. onChange={handleChangeInputFile}
  162. />
  163. </>
  164. )}
  165. </div>
  166. </div>
  167. </div>
  168. </div>
  169. </div>
  170. <div className="files-page-card">
  171. <div className="files-page-card-add-button">
  172. <IconButton
  173. className="c-btn ads-page-btn c-btn--primary add-ad-btn"
  174. onClick={uploadFileHandler}
  175. >
  176. + {t("files.addFile")}
  177. </IconButton>
  178. </div>
  179. </div>
  180. </div>
  181. );
  182. };
  183. export default FilesPage;