選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

offersSaga.js 9.5KB

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