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.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. import { useMediaQuery, useTheme } from "@mui/material";
  2. import React from "react";
  3. import PropTypes from "prop-types";
  4. import { useRef } from "react";
  5. import arrow_left from "../../assets/images/arrow_left.png";
  6. import arrow_right from "../../assets/images/arrow_right.png";
  7. import Slider from "react-slick";
  8. // import Ad from "../../components/Ads/Ad";
  9. import { AD_DETAILS_PAGE } from "../../constants/pages";
  10. import StatsAd from "../../components/Ads/StatsAd";
  11. import { useDispatch } from "react-redux";
  12. import { useSelector } from "react-redux";
  13. import { useEffect } from "react";
  14. import { getStatsReq } from "../../store/actions/stats/statsActions";
  15. import { useTranslation } from "react-i18next";
  16. import { returni18nLevel } from "../../util/helpers/stringHelpers";
  17. // import ArchiveAd from "../../components/Ads/ArchiveAd";
  18. // import { AD_DETAILS_PAGE } from "../../constants/pages";
  19. const StatsPage = ({history}) => {
  20. const dispatch = useDispatch();
  21. const { stats } = useSelector((s) => s.stats);
  22. const { t } = useTranslation();
  23. useEffect(() => {
  24. dispatch(getStatsReq());
  25. }, [dispatch]);
  26. const theme = useTheme();
  27. const matches = useMediaQuery(theme.breakpoints.down("sm"));
  28. const sliderRef = useRef();
  29. var settings = {
  30. dots: false,
  31. infinite: false,
  32. speed: 500,
  33. initialSlide: 0,
  34. responsive: [
  35. {
  36. breakpoint: 1024,
  37. settings: {
  38. slidesToShow: 3,
  39. slidesToScroll: 3,
  40. infinite: false,
  41. dots: false,
  42. },
  43. },
  44. {
  45. breakpoint: 900,
  46. settings: {
  47. slidesToShow: 2,
  48. slidesToScroll: 2,
  49. initialSlide: 0,
  50. },
  51. },
  52. {
  53. breakpoint: 480,
  54. settings: {
  55. slidesToShow: 1,
  56. slidesToScroll: 1,
  57. },
  58. },
  59. ],
  60. };
  61. const arrowLeftHandler = () => {
  62. sliderRef.current.slickPrev();
  63. };
  64. const arrowRightHandler = () => {
  65. sliderRef.current.slickNext();
  66. };
  67. return (
  68. <div>
  69. <div className="l-t-rectangle"></div>
  70. <div className="r-b-rectangle"></div>
  71. <h1
  72. style={{ letterSpacing: "1px" }}
  73. className="page-heading px36-heading"
  74. >
  75. Statistika
  76. </h1>
  77. <div className="stats-section">
  78. <h2 className="section-header">Tok Selekcije</h2>
  79. <div className="stats-items">
  80. {stats.levels &&
  81. stats.levels.map((n) => (
  82. <div key={n.level} className="stats-item" data-testid="stats-item">
  83. <div className="stats-item-content">
  84. <h3>{n.countDone}</h3>
  85. <p>
  86. {returni18nLevel(n.level) != 'FD' && 'Obavljenih'}<br></br>{t('selectionLevels.done.'+returni18nLevel(n.level))}
  87. </p>
  88. </div>
  89. <div className="bottom-static"></div>
  90. </div>
  91. ))}
  92. </div>
  93. </div>
  94. <div className="stats-section">
  95. <h2 className="section-header">Odnosi</h2>
  96. <div className="stats-items-dynamic">
  97. {stats.levels &&
  98. stats.levels.map((n) => (
  99. <div key={n.level} className="stats-item" data-testid="stats-item2">
  100. <div className="stats-item-content">
  101. <h3>
  102. {n.countDone}
  103. <span style={{ padding: "0px 3px" }}>:</span>
  104. {n.countAll}
  105. </h3>
  106. <p>
  107. Broj {t('selectionLevels.done.'+returni18nLevel(n.level))}:<br></br>
  108. Broj kontaktiranih:
  109. </p>
  110. </div>
  111. <div className="bottom-dynamic">
  112. <div
  113. style={{ width: `${(n.countDone * 1.0 / n.countAll) * 100}%` }}
  114. className="bottom-loader-indicator"
  115. ></div>
  116. </div>
  117. </div>
  118. ))}
  119. </div>
  120. </div>
  121. <div className="stats-section">
  122. <h2 className="section-header">Prijavljeni po pozicijama</h2>
  123. </div>
  124. <div className="ads stat-ads">
  125. {stats.ads && stats.ads.length > 0 && (
  126. <div className="archived-ads">
  127. {/* <div className="archived-ads-header">
  128. <h2>{t("ads.archiveAds")}</h2>
  129. </div> */}
  130. <div className="archived-ads-ads">
  131. {!matches && (
  132. <div className="archived-ads-ads-a">
  133. <div className="archived-ads-ads-arrows">
  134. <button onClick={arrowLeftHandler} data-testid="left-arrow">
  135. <img src={arrow_left} alt="arrow-left" />
  136. </button>
  137. {stats.ads.length > 3 && (
  138. <button onClick={arrowRightHandler} data-testid="right-arrow">
  139. <img src={arrow_right} alt="arrow-right" />
  140. </button>
  141. )}
  142. </div>
  143. </div>
  144. )}
  145. <div className="archived-ads-ads-ad">
  146. <Slider
  147. ref={sliderRef}
  148. {...settings}
  149. slidesToShow={5}
  150. slidesToScroll={5}
  151. style={{ width: "100%" }}
  152. >
  153. {stats.ads.map((ad, index) => (
  154. <StatsAd
  155. count={ad.count}
  156. key={index}
  157. title={ad.title}
  158. minimumExperience={ad.minimumExperience}
  159. createdAt={ad.createdAt}
  160. expiredAt={ad.expiredAt}
  161. onShowAdDetails={() =>
  162. history.push(AD_DETAILS_PAGE.replace(":id", ad.id))
  163. }
  164. />
  165. ))}
  166. {/* {stats.ads.length <= 5 &&
  167. getDummyArchiveAds(archiveAds.length)} */}
  168. </Slider>
  169. </div>
  170. </div>
  171. {matches && (
  172. <div className="active-ads-ads-arrows">
  173. <button onClick={arrowLeftHandler} data-testid="left-arrow">
  174. <img src={arrow_left} alt="arrow-left" />
  175. </button>
  176. {stats.ads.length > 2 && (
  177. <button onClick={arrowRightHandler} data-testid="right-arrow">
  178. <img src={arrow_right} alt="arrow-right" />
  179. </button>
  180. )}
  181. </div>
  182. )}
  183. </div>
  184. )}
  185. </div>
  186. <div style={{ padding: "30px" }}></div>
  187. </div>
  188. );
  189. };
  190. export default StatsPage;
  191. StatsPage.propTypes = {
  192. history: PropTypes.shape({
  193. replace: PropTypes.func,
  194. push: PropTypes.func,
  195. location: PropTypes.shape({
  196. pathname: PropTypes.string,
  197. }),
  198. }),
  199. };