index.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. import * as action from '../../actions'
  2. import { useEffect, useState, useCallback } from 'react';
  3. import { connect } from 'react-redux';
  4. import { useDropzone } from 'react-dropzone'
  5. import { sortableContainer, sortableElement } from 'react-sortable-hoc';
  6. import { arrayMoveImmutable } from 'array-move';
  7. const Track = ({ track, playlist, player, setTrack, playTrack, pauseTrack }) => {
  8. let [_player, setPlayer] = useState()
  9. let [isPlay, setPlay] = useState(true)
  10. useEffect(() => setPlayer(player), [player])
  11. return (
  12. <li style={{ border: '1px solid black', display: 'flex', alignItems: 'center' }}>
  13. <div style={{ marginRight: '2%', padding: '2%' }}>
  14. {isPlay && _player?.isPlaying && _player.track?._id === track._id ?
  15. <button style={{ fontSize: '3vh' }} onClick={() => { pauseTrack(); setPlay(false) }}>{`\u23F8`}</button> :
  16. <button
  17. style={{ fontSize: '3vh' }}
  18. onClick={() => {
  19. if (track?._id !== _player?.track?._id) {
  20. //setTrack(track, (playlist.constructor.name === 'Array'? playlist : playlist.tracks))
  21. console.log('setting playlist', playlist)
  22. setTrack(track, playlist)
  23. }
  24. playTrack()
  25. setPlay(true)
  26. }}
  27. >{`\u23F5`}</button>
  28. }
  29. </div>
  30. <div style={{ textAlign: 'left' }}>
  31. <h5>{track.id3.artist || 'Artist: unknown'}</h5>
  32. <h6>{track.id3.album || 'Album: unknown'}</h6>
  33. <h5>{track.id3.title || track.originalFileName}</h5>
  34. </div>
  35. </li>
  36. )
  37. }
  38. const TrackConnect = connect(
  39. state => ({
  40. player: state.player || {},
  41. }),
  42. {
  43. setTrack: action.setTrack,
  44. pauseTrack: action.pauseTrack,
  45. playTrack: action.playTrack
  46. }
  47. )(Track)
  48. const SortableItem = sortableElement(TrackConnect);
  49. const SortableContainer = sortableContainer(({ children }) => { return <ul>{children}</ul> });
  50. const Playlist = ({ player, playlist, setPlaylist, updPlaylist, setIndex }) => {
  51. let [_tracks, setTracks] = useState()
  52. let [_player, setPlayer] = useState()
  53. let [_playlist, _setPlaylist] = useState()
  54. useEffect(() => setPlayer(player), [player])
  55. useEffect(() => {
  56. setTracks(playlist[0]?.tracks)
  57. if(_playlist) {
  58. _setPlaylist(_playlist)
  59. } else {
  60. _setPlaylist(playlist[0])
  61. }
  62. console.log('11PLAYLIST OLD - NEW',playlist, _playlist)
  63. console.log('PLAYLIST OLD - NEW',playlist, _playlist)
  64. }, [playlist])
  65. const onSortEnd = ({ oldIndex, newIndex }) => {
  66. let newArr = arrayMoveImmutable(_tracks, oldIndex, newIndex)
  67. setTracks(newArr)
  68. updPlaylist(playlist[0]._id, newArr.map(track => ({ _id: track._id })))
  69. if(_player?.playlist?._id === _playlist?._id) {
  70. console.log('sovpadaet')
  71. let newObj = {..._player.playlist, 'tracks': newArr}
  72. setPlaylist(newObj)
  73. if (_player?.track) {
  74. let newInd = newArr.map((item) => item._id).indexOf(_player?.track?._id)
  75. setIndex(newInd)
  76. }
  77. }
  78. };
  79. return (
  80. <>
  81. <h2>{playlist[0]?.name || 'Playlist'}</h2>
  82. <SortableContainer onSortEnd={onSortEnd}>
  83. {/* {(_tracks || []).map((track, index) => <SortableItem index={index} track={track} playlist={playlist[0]?.tracks} />)} */}
  84. {(_tracks || []).map((track, index) => <SortableItem index={index} track={track} playlist={playlist[0]} />)}
  85. </SortableContainer>
  86. </>
  87. )
  88. }
  89. export const PlaylistConnect = connect(
  90. state => ({
  91. playlist: state.promise.playlistTracks?.payload || [],
  92. player: state.player || {}
  93. }),
  94. {
  95. updPlaylist: action.actionUpdatePlaylist,
  96. setPlaylist: action.setPlaylist,
  97. setIndex: action.setIndex
  98. }
  99. )(Playlist)
  100. const PlaylistTrackDropzone = ({ playlist, uploadTrack }) => {
  101. let [playlistId, setPlaylistId] = useState()
  102. useEffect(() => {
  103. setPlaylistId(playlist[0]?._id)
  104. }, [playlist])
  105. const onDrop = useCallback(acceptedFiles => {
  106. uploadTrack(acceptedFiles[0], playlistId)
  107. }, [uploadTrack, playlistId])
  108. const { getRootProps, isDragActive } = useDropzone({ onDrop })
  109. return (
  110. <div
  111. {...getRootProps()}
  112. style={{ height: 'fit-content', border: `${isDragActive ? '1px solid mediumseagreen' : '1px solid black'}` }}
  113. >
  114. {isDragActive ? <small>...drag here</small> : <small>to upload drag track here</small>}
  115. <PlaylistConnect />
  116. </div>
  117. )
  118. }
  119. const PlaylistTrackDropzoneConnect = connect(
  120. state => ({ playlist: state.promise.playlistTracks?.payload || [] }),
  121. { uploadTrack: action.actionUploadUserTrack }
  122. )(PlaylistTrackDropzone)
  123. const PlaylistPage = ({ match: { params: { _id } }, getTracks }) => {
  124. useEffect(() => { getTracks(_id.substring(1)) }, [_id, getTracks])
  125. return (<PlaylistTrackDropzoneConnect />)
  126. }
  127. export const PlaylistPageConnect = connect(null, { getTracks: action.actionGetPlaylistById })(PlaylistPage)
  128. const UserTracks = ({ user, tracks }) => {
  129. let tracksRev = [...tracks].reverse()
  130. return (
  131. <>
  132. <h2>{user.login || 'My'} tracks:</h2>
  133. <ul>{(tracksRev || []).map(track => <TrackConnect track={track} playlist={tracksRev} />)}</ul>
  134. </>
  135. )
  136. }
  137. const UserTracksConnect = connect(state => ({
  138. tracks: state.promise.userTracks?.payload || [],
  139. user: state.promise.userData?.payload || {}
  140. })
  141. )(UserTracks)
  142. const UserTracksDropzone = ({ onLoad }) => {
  143. const onDrop = useCallback(acceptedFiles => {
  144. onLoad(acceptedFiles[0])
  145. }, [onLoad])
  146. const { getRootProps, isDragActive } = useDropzone({ onDrop })
  147. return (
  148. <div
  149. {...getRootProps()}
  150. style={{ height: 'fit-content', border: `${isDragActive ? '1px solid mediumseagreen' : '1px solid black'}` }}
  151. >
  152. {isDragActive ? <small>...drag here</small> : <small>to upload drag track here</small>}
  153. <UserTracksConnect />
  154. </div>
  155. )
  156. }
  157. export const UserTrackDropzoneConnect = connect(null, { onLoad: action.actionUploadUserTrack })(UserTracksDropzone)
  158. const UserTracksPage = ({ match: { params: { _id } }, getUserTracks }) => {
  159. useEffect(() => { getUserTracks() }, [_id, getUserTracks])
  160. return (<UserTrackDropzoneConnect />)
  161. }
  162. export const UserTracksPageConnect = connect(null, { getUserTracks: action.actionGetUserTracks })(UserTracksPage)