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.

offersSaga.js 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. import {
  2. attemptAddOffer,
  3. attemptEditOffer,
  4. attemptEditOfferAsAdmin,
  5. attemptFetchFeaturedOffers,
  6. attemptFetchOffers,
  7. attemptFetchOneOffer,
  8. attemptFetchProfileOffersAsAdmin,
  9. attemptPinOffer,
  10. attemptRemoveOffer,
  11. attemptRemoveOfferAsAdmin,
  12. } from "../../request/offersRequest";
  13. import {
  14. // OFFERS_ALL_FETCH,
  15. OFFERS_FEATURED_FETCH,
  16. OFFERS_FETCH,
  17. OFFERS_MINE_HEADER_FETCH,
  18. OFFERS_PROFILE_FETCH,
  19. OFFER_ADD,
  20. OFFER_EDIT,
  21. OFFER_PIN,
  22. OFFER_REMOVE,
  23. ONE_OFFER_FETCH,
  24. } from "../actions/offers/offersActionConstants";
  25. import {
  26. setOffers,
  27. setProfileOffers,
  28. fetchOneOfferSuccess,
  29. addOfferSuccess,
  30. fetchMineOffersSuccess,
  31. fetchProfileOffersSuccess,
  32. removeOfferSuccess,
  33. editOfferSuccess,
  34. fetchOffersSuccess,
  35. fetchOffersError,
  36. fetchMoreOffersSuccess,
  37. fetchMoreOffersError,
  38. addOfferError,
  39. fetchOneOfferError,
  40. fetchMineOffersError,
  41. fetchProfileOffersError,
  42. removeOfferError,
  43. editOfferError,
  44. clearFeaturedOffers,
  45. setMineHeaderOffers,
  46. fetchMineHeaderOffersSuccess,
  47. fetchMineHeaderOffersError,
  48. pinOfferSuccess,
  49. pinOfferError,
  50. addProfileOffers,
  51. clearSelectedOffer,
  52. // fetchAllOffersSuccess,
  53. // fetchAllOffersError,
  54. // setFeaturedOfferPage,
  55. } from "../actions/offers/offersActions";
  56. import { all, takeLatest, call, put, select } from "@redux-saga/core/effects";
  57. import {
  58. attemptFetchProfileOffers,
  59. attemptFetchMoreOffers,
  60. } from "../../request/offersRequest";
  61. import { convertQueryStringForBackend } from "../../util/helpers/queryHelpers";
  62. // import { setQueryString } from "../actions/filters/filtersActions";
  63. import {
  64. OFFERS_FETCH_MORE,
  65. OFFERS_MINE_FETCH,
  66. } from "../actions/offers/offersActionConstants";
  67. import {
  68. addOffers,
  69. addPinnedOffers,
  70. clearOffers,
  71. setMineOffers,
  72. setNoMoreOffersStatus,
  73. setPinnedOffers,
  74. setTotalOffers,
  75. } from "../actions/offers/offersActions";
  76. import { selectUserId } from "../selectors/loginSelectors";
  77. import {
  78. // selectFeaturedOfferPage,
  79. // selectOfferPage,
  80. selectOffers,
  81. selectPinnedOffers,
  82. selectTotalOffers,
  83. } from "../selectors/offersSelectors";
  84. // import history from "../utils/history";
  85. // import { NOT_FOUND_PAGE } from "../../constants/pages";
  86. import { makeErrorToastMessage } from "../utils/makeToastMessage";
  87. import i18next from "i18next";
  88. import {
  89. KEY_NAME,
  90. KEY_PAGE,
  91. KEY_SIZE,
  92. KEY_SORTBY,
  93. } from "../../constants/queryStringConstants";
  94. import { selectQueryString } from "../selectors/filtersSelectors";
  95. import { setQueryString } from "../actions/filters/filtersActions";
  96. function* fetchOffers(payload) {
  97. try {
  98. yield put(clearOffers());
  99. const newQueryString = new URLSearchParams(
  100. convertQueryStringForBackend(payload.payload.queryString)
  101. );
  102. const data = yield call(
  103. attemptFetchOffers,
  104. "?" + newQueryString.toString()
  105. );
  106. yield put(setTotalOffers(data.data.total));
  107. yield put(setOffers(data.data.offers.filter((offer) => !offer.pinned)));
  108. yield put(
  109. setPinnedOffers(data.data.offers.filter((offer) => offer.pinned))
  110. );
  111. yield put(fetchOffersSuccess());
  112. } catch (e) {
  113. yield put(fetchOffersError());
  114. yield call(console.log, e);
  115. }
  116. }
  117. function* fetchFeaturedOffers(payload) {
  118. try {
  119. yield put(clearFeaturedOffers());
  120. const newQueryString = new URLSearchParams(
  121. convertQueryStringForBackend(payload.payload.queryString)
  122. );
  123. const data = yield call(
  124. attemptFetchFeaturedOffers,
  125. "?" + newQueryString.toString()
  126. );
  127. yield put(setPinnedOffers(data.data));
  128. yield put(fetchOffersSuccess());
  129. } catch (e) {
  130. yield put(fetchOffersError());
  131. yield call(console.log, e);
  132. }
  133. }
  134. function* fetchMoreOffers(payload) {
  135. try {
  136. const data = yield call(
  137. attemptFetchMoreOffers,
  138. payload.payload?.page,
  139. payload.payload?.queryString
  140. );
  141. // if (payload.payload.queryString) {
  142. // yield put(setQueryString(payload.payload.queryString));
  143. // }
  144. const oldOffers = yield select(selectOffers);
  145. const oldPinnedOffers = yield select(selectPinnedOffers);
  146. const totalNumberOfOffers = yield select(selectTotalOffers);
  147. if (oldOffers.length + oldPinnedOffers.length < totalNumberOfOffers) {
  148. yield put(addOffers(data.data.items.regularOffers));
  149. yield put(addPinnedOffers(data.data.items.pinnedOffers));
  150. }
  151. if (
  152. data.data.items.pinnedOffers.length +
  153. data.data.items.regularOffers.length <
  154. 10 ||
  155. data.data.items.pinnedOffers.length +
  156. data.data.items.regularOffers.length >
  157. data.data.total
  158. ) {
  159. yield put(setNoMoreOffersStatus(true));
  160. }
  161. yield put(fetchMoreOffersSuccess());
  162. } catch (e) {
  163. yield put(fetchMoreOffersError());
  164. console.dir(e);
  165. }
  166. }
  167. function* createOffer(payload) {
  168. try {
  169. console.log(payload);
  170. const userId = yield select(selectUserId);
  171. const offerData = payload.payload.offerData;
  172. const formData = new FormData();
  173. formData.append("category[name]", offerData.category.name);
  174. formData.append(
  175. "condition",
  176. offerData.condition === "Novo"
  177. ? "novo"
  178. : offerData.condition === "Polovno"
  179. ? "polovno"
  180. : "kao novo"
  181. );
  182. formData.append("description", offerData.description);
  183. // formData.append("file", JSON.stringify(offerData.images))
  184. for (var i = 0; i < offerData.images.length; i++) {
  185. formData.append("file", offerData.images[i]);
  186. }
  187. formData.append("location[city]", offerData.location.city);
  188. formData.append("name", offerData.name);
  189. formData.append("subcategory", offerData.subcategory);
  190. console.log(formData);
  191. yield call(attemptAddOffer, userId, formData);
  192. yield put(addOfferSuccess());
  193. if (payload.payload.handleApiResponseSuccess) {
  194. yield call(payload.payload.handleApiResponseSuccess);
  195. }
  196. } catch (e) {
  197. yield put(addOfferError());
  198. console.dir(e);
  199. }
  200. }
  201. function* fetchOneOffer(payload) {
  202. try {
  203. let offerId = payload.payload;
  204. console.log("sagabb", payload.payload);
  205. const queryObject = new URLSearchParams();
  206. if (typeof payload.payload === "object") {
  207. offerId = payload.payload.offerId;
  208. queryObject.set("view", "true");
  209. }
  210. const data = yield call(attemptFetchOneOffer, {
  211. offerId,
  212. queryObject,
  213. });
  214. if (!data?.data) throw new Error();
  215. yield put(clearSelectedOffer());
  216. yield put(fetchOneOfferSuccess(data?.data));
  217. } catch (e) {
  218. console.log(e?.response?.status);
  219. // if (e.response.status === 400) {
  220. // yield call(history.push, NOT_FOUND_PAGE);
  221. // }
  222. yield call(makeErrorToastMessage, i18next.t("apiErrors.offerNotFound"));
  223. yield put(fetchOneOfferError());
  224. }
  225. }
  226. // function* createOffer(payload) {
  227. function* fetchMineOffers() {
  228. try {
  229. const userId = yield select(selectUserId);
  230. const data = yield call(attemptFetchProfileOffers, userId);
  231. yield put(setMineOffers(data.data.offers));
  232. yield put(setTotalOffers(data.data.total));
  233. yield put(fetchMineOffersSuccess());
  234. } catch (e) {
  235. yield put(fetchMineOffersError());
  236. console.dir(e);
  237. }
  238. }
  239. function* fetchMineHeaderOffers() {
  240. try {
  241. const userId = yield select(selectUserId);
  242. const data = yield call(attemptFetchProfileOffers, userId);
  243. yield put(setMineHeaderOffers(data.data.offers.slice(0, 2)));
  244. yield put(fetchMineHeaderOffersSuccess());
  245. } catch (e) {
  246. yield put(fetchMineHeaderOffersError());
  247. console.dir(e);
  248. }
  249. }
  250. function* fetchProfileOffers(payload) {
  251. try {
  252. console.log(payload.payload);
  253. let userId;
  254. if (typeof payload.payload === "object") {
  255. userId = payload.payload.idProfile;
  256. } else userId = payload.payload;
  257. if (!userId || userId?.length === 0)
  258. throw new Error("User id is not defined!");
  259. let queryString = new URLSearchParams();
  260. queryString.set(KEY_SIZE, 10);
  261. if (payload.payload[KEY_PAGE]) {
  262. queryString.set(KEY_PAGE, payload.payload.page);
  263. if (payload.payload.searchValue?.length > 0)
  264. queryString.set(KEY_NAME, payload.payload.searchValue);
  265. queryString.set(KEY_SORTBY, payload.payload.sortOption.queryString);
  266. yield put(setQueryString(queryString.toString()));
  267. } else {
  268. queryString = yield select(selectQueryString);
  269. }
  270. console.log(queryString.toString());
  271. let data;
  272. if (payload.payload.isAdmin) {
  273. data = yield call(
  274. attemptFetchProfileOffersAsAdmin,
  275. userId,
  276. convertQueryStringForBackend(queryString)
  277. );
  278. } else {
  279. data = yield call(
  280. attemptFetchProfileOffers,
  281. userId,
  282. convertQueryStringForBackend(queryString)
  283. );
  284. }
  285. if (payload.payload.append) {
  286. yield put(addProfileOffers(data.data.offers));
  287. } else {
  288. yield put(setProfileOffers(data.data.offers));
  289. }
  290. yield put(setTotalOffers(data.data.total));
  291. yield put(fetchProfileOffersSuccess());
  292. } catch (e) {
  293. console.dir(e);
  294. // if (e.response.status === 400) {
  295. // yield call(history.push, NOT_FOUND_PAGE);
  296. // }
  297. yield put(fetchProfileOffersError());
  298. }
  299. }
  300. function* removeOffer(payload) {
  301. try {
  302. const userId = yield select(selectUserId);
  303. const offerId = payload.payload.offerId;
  304. if (payload.payload.isAdmin) yield call(attemptRemoveOfferAsAdmin, offerId);
  305. else yield call(attemptRemoveOffer, userId, offerId);
  306. yield put(removeOfferSuccess());
  307. if (payload.payload.handleApiResponseSuccess) {
  308. yield call(payload.payload.handleApiResponseSuccess);
  309. }
  310. } catch (e) {
  311. yield put(removeOfferError());
  312. console.dir(e);
  313. }
  314. }
  315. function* pinOffer(payload) {
  316. try {
  317. const offerId = payload.payload.offerId;
  318. yield call(attemptPinOffer, offerId);
  319. yield put(pinOfferSuccess());
  320. if (payload.payload.handleApiResponseSuccess) {
  321. yield call(payload.payload.handleApiResponseSuccess);
  322. }
  323. } catch (e) {
  324. yield put(pinOfferError());
  325. console.dir(e);
  326. }
  327. }
  328. function* editOffer(payload) {
  329. try {
  330. const userId = yield select(selectUserId);
  331. const offerId = payload.payload.offerId;
  332. // const editedData = payload.payload.offerData;
  333. const offerData = payload.payload.offerData;
  334. const formData = new FormData();
  335. formData.append("category[name]", offerData.category.name);
  336. formData.append("condition", offerData.condition.toLowerCase());
  337. formData.append("description", offerData.description);
  338. // const oldImages = [];
  339. for (var i = 0; i < offerData.images.length; i++) {
  340. if (offerData.images[i] !== null) {
  341. if (typeof offerData.images[i] === "string") {
  342. formData.append("images[]", offerData.images[i]);
  343. } else {
  344. formData.append("file", offerData.images[i]);
  345. }
  346. }
  347. }
  348. // if (oldImages.length > 0) {
  349. // formData.append("images", JSON.stringify(oldImages));
  350. // }
  351. // if (oldImages.length === offerData.images.length) {
  352. // formData.append("file", "");
  353. // }
  354. formData.append("location[city]", offerData.location.city);
  355. formData.append("name", offerData.name);
  356. formData.append("subcategory", offerData.subcategory);
  357. if (payload.payload.isAdmin) {
  358. yield call(attemptEditOfferAsAdmin, offerId, formData);
  359. } else {
  360. yield call(attemptEditOffer, userId, offerId, formData);
  361. }
  362. yield put(editOfferSuccess());
  363. if (payload.payload.handleApiResponseSuccess) {
  364. yield call(payload.payload.handleApiResponseSuccess);
  365. }
  366. } catch (e) {
  367. yield put(editOfferError());
  368. console.dir(e);
  369. }
  370. }
  371. export default function* offersSaga() {
  372. yield all([
  373. takeLatest(OFFERS_FETCH, fetchOffers),
  374. takeLatest(OFFER_ADD, createOffer),
  375. takeLatest(ONE_OFFER_FETCH, fetchOneOffer),
  376. takeLatest(OFFERS_FETCH_MORE, fetchMoreOffers),
  377. takeLatest(OFFERS_MINE_FETCH, fetchMineOffers),
  378. takeLatest(OFFERS_PROFILE_FETCH, fetchProfileOffers),
  379. takeLatest(OFFER_REMOVE, removeOffer),
  380. takeLatest(OFFER_EDIT, editOffer),
  381. takeLatest(OFFERS_MINE_HEADER_FETCH, fetchMineHeaderOffers),
  382. takeLatest(OFFERS_FEATURED_FETCH, fetchFeaturedOffers),
  383. takeLatest(OFFER_PIN, pinOffer),
  384. // takeLatest(OFFERS_ALL_FETCH, fetchAllOffers),
  385. ]);
  386. }