index.js 8.7 KB

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