index.js 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. import { jwtDecode, gql, backendURL, store } from '../App'
  2. const audio = new Audio()
  3. const actionTrackSet = (track, audio, playlist) =>
  4. ({
  5. type: 'SET_TRACK',
  6. track: track,
  7. playlist: playlist,
  8. duration: audio.duration,
  9. currentTime: audio.currentTime,
  10. volume: audio.volume
  11. })
  12. const actionTrackSetDuration = (time) => {
  13. return ({ type: 'SET_DURATION', duration: time })
  14. }
  15. const actionTrackSetCurrTime = (time) => {
  16. return ({ type: 'SET_CURRTIME', currentTime: time })
  17. }
  18. const actionTrackSetVolume = (value) => ({ type: 'SET_VOLUME', volume: value })
  19. const actionTrackPlay = () => ({ type: 'PLAY_TRACK' })
  20. const actionTrackPause = (currentTime) => ({ type: 'PAUSE_TRACK', currentTime: currentTime })
  21. const actionPlaylistSet = (playlist) => ({type: 'SET_PLAYLIST', playlist: playlist})
  22. const actionSetPlaylistIndex = (index) => ({type: 'SET_INDEX', playlistIndex: index})
  23. export const setPlaylist = (playlist) => dispatch => dispatch(actionPlaylistSet(playlist))
  24. export const setIndex = (index) => dispatch => dispatch(actionSetPlaylistIndex(index))
  25. export const setTrack = (track, playlist) =>
  26. dispatch => {
  27. audio.src = backendURL + '/' + track.url
  28. dispatch(actionTrackSet(track, audio, playlist))
  29. }
  30. export const switchTrack = (isForward, currentTrackIndex, playlist) =>
  31. dispatch => {
  32. if (isForward ? currentTrackIndex < playlist.length - 1 : currentTrackIndex > 0) {
  33. dispatch(setTrack(playlist[currentTrackIndex + (isForward ? 1 : -1)], playlist))
  34. dispatch(playTrack())
  35. } else if (currentTrackIndex === (isForward ? playlist.length - 1 : 0)) {
  36. dispatch(setTrack(playlist[isForward ? 0 : playlist.length - 1], playlist))
  37. dispatch(playTrack())
  38. }
  39. }
  40. export const playTrack = () =>
  41. dispatch => {
  42. console.log('NOW PLAYIN')
  43. dispatch(actionTrackPlay())
  44. audio.play()
  45. }
  46. export const pauseTrack = () =>
  47. dispatch => {
  48. console.log('NOW PAUSE')
  49. dispatch(actionTrackPause(audio.currentTime))
  50. audio.pause()
  51. }
  52. export const setTrackVolume = (volume) =>
  53. dispatch => {
  54. audio.volume = volume
  55. dispatch(actionTrackSetVolume(volume))
  56. }
  57. audio.addEventListener('ended', (e) => console.log('TRACK ended', e.target.src))
  58. audio.ondurationchange = (e) => store.dispatch(actionTrackSetDuration(e.target.duration))
  59. audio.ontimeupdate = (e) => store.dispatch(actionTrackSetCurrTime(e.target.currentTime))
  60. const actionPending = name => ({ type: 'PROMISE', status: 'PENDING', name })
  61. const actionResolved = (name, payload) => ({ type: 'PROMISE', status: 'RESOLVED', name, payload })
  62. const actionRejected = (name, error) => ({ type: 'PROMISE', status: 'REJECTED', name, error })
  63. export const actionPromise = (name, promise) =>
  64. async dispatch => {
  65. dispatch(actionPending(name))
  66. try {
  67. let payload = await promise
  68. dispatch(actionResolved(name, payload))
  69. return payload
  70. }
  71. catch (error) {
  72. dispatch(actionRejected(name, error))
  73. }
  74. }
  75. export const actionAuthLogin = token => ({ type: 'AUTH_LOGIN', token })
  76. export const actionAuthLogout = () => ({ type: 'AUTH_LOGOUT' })
  77. export const actionLogin = (login, password) =>
  78. actionPromise('login', gql(`
  79. query log($login:String!, $password:String!) {
  80. login(login: $login, password: $password)
  81. }`, { login, password }))
  82. export const actionFullLogin = (login = 'tst', password = '123') =>
  83. async dispatch => {
  84. let token = await dispatch(actionLogin(login, password))
  85. if (token) {
  86. await dispatch(actionAuthLogin(token))
  87. await dispatch(actionGetUserData())
  88. dispatch(actionGetUserPlaylists())
  89. dispatch(actionGetUserTracks())
  90. }
  91. }
  92. export const actionRegister = (login, password) =>
  93. actionPromise('registration', gql(`
  94. mutation register($login:String!, $password:String!) {
  95. createUser(login: $login, password: $password) {
  96. login, _id
  97. }
  98. }
  99. `, { login, password })
  100. )
  101. export const actionFullRegister = (login = 'tst', password = '123') =>
  102. async dispatch => {
  103. await dispatch(actionRegister(login, password))
  104. await dispatch(actionFullLogin(login, password))
  105. }
  106. export const actionGetUserData = () => {
  107. let _id = jwtDecode(localStorage.authToken).sub.id
  108. return (
  109. actionPromise('userData', gql(`
  110. query($userId: String!) {
  111. UserFindOne(query: $userId){
  112. login, _id, avatar {_id, url, originalFileName}
  113. }
  114. }
  115. `, { userId: JSON.stringify([{ _id }]) }))
  116. )
  117. }
  118. export const actionGetUserPlaylists = () => {
  119. let _id = jwtDecode(localStorage.authToken).sub.id
  120. return (
  121. actionPromise('userPlaylists', gql(`
  122. query getPlaylistByOwnerId($ownerId:String!) {
  123. PlaylistFind(query: $ownerId) {
  124. _id, name
  125. }
  126. }
  127. `, { ownerId: JSON.stringify([{ ___owner: _id }]) }))
  128. )
  129. }
  130. export const actionGetPlaylistById = (_id) =>
  131. actionPromise('playlistTracks', gql(`
  132. query playlistById($playlistId: String!) {
  133. PlaylistFind(query: $playlistId) {
  134. _id,
  135. name,
  136. tracks {
  137. _id, url, originalFileName,
  138. id3{ title, artist, album },
  139. }
  140. }
  141. }
  142. `, { playlistId: JSON.stringify([{ _id }]) }))
  143. export const actionGetUserTracks = () => {
  144. let _id = jwtDecode(localStorage.authToken).sub.id
  145. return (
  146. actionPromise('userTracks', gql(`
  147. query getUserTracks($ownerId: String!) {
  148. TrackFind(query: $ownerId) {
  149. _id, originalFileName, url,
  150. id3 { title, artist, album }
  151. }
  152. }
  153. `, { ownerId: JSON.stringify([{ ___owner: _id }]) }))
  154. )
  155. }
  156. export const actionAddPlaylist = playlistName =>
  157. async dispatch => {
  158. await dispatch(actionPromise('addPlaylist', gql(`
  159. mutation addPlaylist ($playlistName: String!){
  160. PlaylistUpsert(playlist: {name: $playlistName}) {
  161. _id, name
  162. }
  163. }
  164. `, { playlistName: playlistName })))
  165. dispatch(actionGetUserPlaylists())
  166. }
  167. export const actionLoadFile = (file, type) => {
  168. let fd = new FormData()
  169. console.log('TYPE', type)
  170. fd.append(type === 'upload' ? 'photo' : type, file)
  171. return (
  172. actionPromise('loadFile', fetch(backendURL + `/${type}`, {
  173. method: "POST",
  174. headers: localStorage.authToken ? { Authorization: 'Bearer ' + localStorage.authToken } : {},
  175. body: fd
  176. })
  177. .then(res => res.json())
  178. )
  179. )
  180. }
  181. export const actionUpdatePlaylist = (playlistId, updPlaylist) =>
  182. async dispatch => {
  183. await dispatch(actionPromise('trackToPlaylist', gql(`
  184. mutation($playlistId: ID, $newTracks: [TrackInput]) {
  185. PlaylistUpsert(playlist:{ _id: $playlistId, tracks: $newTracks}) {
  186. _id, name, tracks { _id, originalFileName, }
  187. }
  188. }
  189. `, { playlistId: playlistId, newTracks: updPlaylist }))
  190. )
  191. await dispatch(actionGetPlaylistById(playlistId))
  192. }
  193. export const actionUploadUserTrack = (file, playlistId) =>
  194. async (dispatch, getState) => {
  195. await dispatch(actionLoadFile(file, 'track'))
  196. if (!playlistId) {
  197. dispatch(actionGetUserTracks())
  198. } else {
  199. console.log('UPLOADING TO PLAYLIS')
  200. let updPlaylist = []
  201. let oldPlaylist = getState().promise.playlistTracks.payload[0].tracks
  202. if (oldPlaylist) {
  203. //console.log('id pashet', oldPlaylist)
  204. oldPlaylist.forEach(track => updPlaylist.push({ _id: track._id }))
  205. }
  206. updPlaylist.unshift({ _id: getState().promise.loadFile.payload?._id })
  207. console.log('UPDATED PLST', updPlaylist)
  208. await dispatch(actionUpdatePlaylist(playlistId, updPlaylist))
  209. }
  210. }
  211. export const actionUploadAvatar = (file) =>
  212. async (dispatch, getState) => {
  213. await dispatch(actionLoadFile(file, 'upload'))
  214. await dispatch(actionPromise('setAvatar', gql(`
  215. mutation {
  216. UserUpsert(user:{_id: "${jwtDecode(localStorage.authToken).sub.id}", avatar: {_id: "${getState().promise?.loadFile?.payload?._id}"}}){
  217. _id, login, avatar{
  218. _id, url
  219. }
  220. }
  221. }
  222. `)))
  223. dispatch(actionGetUserData())
  224. }