sagas.js 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. import { put, takeEvery, select, call } from "redux-saga/effects";
  2. import { gql, delay, queries } from "./../helpers/index";
  3. import {
  4. actionAboutMe,
  5. actionTracksToPlaylist,
  6. actionFindUserPlaylists,
  7. actionSearchResult,
  8. actionAuthLogin,
  9. actionFullLoadNewTracks,
  10. actionClearTracks,
  11. actionSkipTracks,
  12. actionLoadNewTracks,
  13. actionPromise,
  14. actionPending,
  15. actionRejected,
  16. actionResolved,
  17. actionPlaylistTracks,
  18. } from "./types";
  19. import {
  20. actionUploadFile,
  21. actionLoadTracksToPlaylist,
  22. actionFindPlaylistTracks,
  23. actionUserTracks,
  24. actionCreatePlaylist,
  25. actionUserPlaylists,
  26. actionChangePassword,
  27. actionUserUpdate,
  28. actionLogin,
  29. actionRegister,
  30. actionFindTracks,
  31. actionFindUser,
  32. } from "./index";
  33. function* promiseWorker(action) {
  34. const { name, promise } = action;
  35. yield put(actionPending(name));
  36. try {
  37. let data = yield promise;
  38. yield put(actionResolved(name, data));
  39. return data;
  40. } catch (error) {
  41. yield put(actionRejected(name, error));
  42. }
  43. }
  44. export function* promiseWatcher() {
  45. yield takeEvery("PROMISE_START", promiseWorker);
  46. }
  47. function* aboutMeWorker() {
  48. let { auth } = yield select();
  49. if (auth) {
  50. let { id } = auth?.payload?.sub;
  51. yield call(promiseWorker, actionFindUser(id));
  52. }
  53. }
  54. export function* aboutMeWatcher() {
  55. yield takeEvery("ABOUT_ME", aboutMeWorker);
  56. }
  57. function* routeWorker({ match }) {
  58. console.log(match);
  59. if (match.path in queries) {
  60. const { name, query, variables } = queries[match.path](match);
  61. yield call(promiseWorker, actionPromise(name, gql(query, variables)));
  62. }
  63. }
  64. export function* routeWatcher() {
  65. yield takeEvery("ROUTE", routeWorker);
  66. }
  67. function* loginWorker({ login, password }) {
  68. let token = yield call(promiseWorker, actionLogin(login, password));
  69. if (token) {
  70. yield put(actionAuthLogin(token));
  71. yield put(actionAboutMe());
  72. }
  73. window.location.reload();
  74. }
  75. export function* loginWatcher() {
  76. yield takeEvery("FULL_LOGIN", loginWorker);
  77. }
  78. function* loadNewTracksWorker({ newTracks }) {
  79. yield put(actionLoadNewTracks(newTracks));
  80. }
  81. export function* loadNewTracksWatcher() {
  82. yield takeEvery("FULL_ADD_TRACKS", loadNewTracksWorker);
  83. }
  84. function* addSkipTracksWorker({ skipTracks }) {
  85. yield put(actionSkipTracks(skipTracks));
  86. }
  87. export function* addSkipTracksWatcher() {
  88. yield takeEvery("FULL_ADD_SKIP", addSkipTracksWorker);
  89. }
  90. function* clearSkipTracksWorker() {
  91. yield put(actionClearTracks());
  92. }
  93. export function* clearSkipTracksWatcher() {
  94. yield takeEvery("FULL_CLEAR_SKIP", clearSkipTracksWorker);
  95. }
  96. function* findTracksWorker({ skip }) {
  97. let newTracks = yield call(promiseWorker, actionFindTracks(skip));
  98. if (newTracks) {
  99. yield put(actionFullLoadNewTracks(newTracks));
  100. }
  101. }
  102. export function* findTracksWatcher() {
  103. yield takeEvery("FIND_ALL_TRACKS", findTracksWorker);
  104. }
  105. function* registerWorker({ login, password }) {
  106. yield call(promiseWorker, actionRegister(login, password));
  107. let token = yield call(promiseWorker, actionLogin(login, password));
  108. if (token) {
  109. yield put(actionAuthLogin(token));
  110. let { auth } = yield select();
  111. let nick = login;
  112. if (nick.includes("@")) {
  113. nick = nick.substring(0, nick.indexOf("@"));
  114. if (nick.length > 8) {
  115. nick = nick.substring(0, 8);
  116. }
  117. }
  118. let { id } = auth?.payload?.sub;
  119. yield call(promiseWorker, actionUserUpdate({ _id: id, nick }));
  120. yield put(actionAboutMe());
  121. }
  122. }
  123. export function* registerWatcher() {
  124. yield takeEvery("FULL_REGISTER", registerWorker);
  125. }
  126. function* setAvatarWorker({ file }) {
  127. let { _id } = yield call(promiseWorker, actionUploadFile(file));
  128. let { auth } = yield select();
  129. if (auth) {
  130. let { id } = auth?.payload?.sub;
  131. yield call(promiseWorker, actionUserUpdate({ _id: id, avatar: { _id } }));
  132. yield put(actionAboutMe());
  133. }
  134. }
  135. export function* setAvatarWatcher() {
  136. yield takeEvery("SET_AVATAR", setAvatarWorker);
  137. }
  138. function* setNicknameWorker({ _id, nick }) {
  139. yield call(promiseWorker, actionUserUpdate({ _id, nick }));
  140. yield put(actionAboutMe());
  141. }
  142. export function* setNicknameWatcher() {
  143. yield takeEvery("SET_NICKNAME", setNicknameWorker);
  144. }
  145. function* setEmailWorker({ _id, login }) {
  146. yield call(promiseWorker, actionUserUpdate({ _id, login }));
  147. yield put(actionAboutMe());
  148. }
  149. export function* setEmailWatcher() {
  150. yield takeEvery("SET_EMAIL", setEmailWorker);
  151. }
  152. function* setNewPasswordWorker({ login, password, newPassword }) {
  153. yield call(promiseWorker, actionChangePassword(login, password, newPassword));
  154. yield put(actionAboutMe());
  155. }
  156. export function* setNewPasswordWatcher() {
  157. yield takeEvery("SET_NEW_PASSWORD", setNewPasswordWorker);
  158. }
  159. function* searchWorker({ text }) {
  160. yield put(actionSearchResult({ payload: null }));
  161. yield delay(2000);
  162. let payload = yield gql(
  163. `
  164. query searchTracks($query: String){
  165. TrackFind(query: $query) {
  166. _id url originalFileName
  167. id3 {
  168. title, artist
  169. }
  170. playlists {
  171. _id, name
  172. }
  173. owner {
  174. _id login nick
  175. }
  176. }
  177. }`,
  178. {
  179. query: JSON.stringify([
  180. {
  181. $or: [{ originalFileName: `/${text}/` }],
  182. },
  183. {
  184. sort: [{ name: 1 }],
  185. },
  186. ]),
  187. }
  188. );
  189. yield put(actionSearchResult({ payload }));
  190. }
  191. export function* searchWatcher() {
  192. yield takeEvery("SEARCH", searchWorker);
  193. }
  194. function* findPlaylistByOwnerWorker() {
  195. let { auth } = yield select();
  196. if (auth) {
  197. let { id } = auth?.payload?.sub;
  198. yield call(promiseWorker, actionUserPlaylists(id));
  199. }
  200. }
  201. export function* findPlaylistByOwnerWatcher() {
  202. yield takeEvery("FIND_PLAYLISTS", findPlaylistByOwnerWorker);
  203. }
  204. function* createPlaylistWorker({ name }) {
  205. let { auth } = yield select();
  206. if (auth) {
  207. yield call(promiseWorker, actionCreatePlaylist(name));
  208. yield put(actionFindUserPlaylists());
  209. }
  210. }
  211. export function* createPlaylistWatcher() {
  212. yield takeEvery("CREATE_PLAYLIST", createPlaylistWorker);
  213. }
  214. function* findUserTracksWorker({ _id }) {
  215. yield call(promiseWorker, actionUserTracks(_id));
  216. }
  217. export function* findUserTracksWatcher() {
  218. yield takeEvery("FIND_USER_TRACKS", findUserTracksWorker);
  219. }
  220. function* findPlaylistTracksWorker({ _id }) {
  221. yield call(promiseWorker, actionFindPlaylistTracks(_id));
  222. }
  223. export function* findPlaylistTracksWatcher() {
  224. yield takeEvery("PLAYLIST_TRACKS", findPlaylistTracksWorker);
  225. }
  226. function* loadTracksToPlaylistWorker({ idPlaylist, array }) {
  227. yield call(promiseWorker, actionLoadTracksToPlaylist(idPlaylist, array));
  228. yield put(actionPlaylistTracks(idPlaylist));
  229. }
  230. export function* loadTracksToPlaylistWatcher() {
  231. yield takeEvery("LOAD_TRACKS_PLAYLIST", loadTracksToPlaylistWorker);
  232. }
  233. const uploadedTracks = [];
  234. function* uploadTracksToPlaylistWorker({ file }) {
  235. const currentTracksPlaylist = [];
  236. let resultArray = [];
  237. let { route } = yield select();
  238. let idPlaylist = route?.params?._id;
  239. let { promise } = yield select();
  240. if (promise?.playlistTracks?.payload?.tracks) {
  241. promise?.playlistTracks?.payload?.tracks.map((playlistTrack) =>
  242. currentTracksPlaylist.push(playlistTrack)
  243. );
  244. }
  245. if (file) {
  246. let track = yield call(promiseWorker, actionUploadFile(file, "track"));
  247. uploadedTracks.push(track);
  248. let allUploadTracks = [...currentTracksPlaylist, ...uploadedTracks];
  249. allUploadTracks.map((uploadedTrack) =>
  250. resultArray.push({ _id: uploadedTrack?._id })
  251. );
  252. yield put(actionTracksToPlaylist(idPlaylist, resultArray));
  253. }
  254. }
  255. export function* uploadTracksToPlaylistWatcher() {
  256. yield takeEvery("UPLOAD_TRACKS", uploadTracksToPlaylistWorker);
  257. }