my-tracks.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import {SortableContainer,SortableElement} from "react-sortable-hoc";
  2. import {arrayMoveImmutable} from 'array-move';
  3. import {useState, useEffect, useRef, useCallback} from "react";
  4. import {connect} from "react-redux";
  5. import {CTrack} from "../track";
  6. import {CPlaylistDropZone} from "../tools";
  7. import {CPreloaded} from "../preloader";
  8. import {actionFullUploadPlaylists} from "../../actions";
  9. const SortableItem = SortableElement(CTrack);
  10. const SortableList = SortableContainer(({items}) => {
  11. return (
  12. <div>
  13. {items.map((value, index) =>
  14. <SortableItem key={`item-${value._id}`} index={index} trackIndex={index} track={value}/>)}
  15. </div>
  16. )
  17. });
  18. function SortableComponent({playlist:{name, tracks=[]}={},onLoad}) {
  19. // const [state, setState] = useState(tracks || [])
  20. const state = useRef(tracks || [])
  21. useEffect(() => {
  22. state.current = (tracks || [])
  23. },[tracks])
  24. const onSortEnd = useCallback(({oldIndex, newIndex}) => {
  25. state.current = (arrayMoveImmutable(state.current, oldIndex, newIndex))
  26. onLoad(state.current)
  27. },[])
  28. return (
  29. <div>
  30. <h2>{name}</h2>
  31. <SortableList axis={'y'} items={state.current} onSortEnd={onSortEnd}/>
  32. </div>
  33. )
  34. }
  35. const CSortableComponent = connect(state => ({ playlist: state?.promise?.playlistById?.payload || {}}),
  36. {onLoad:actionFullUploadPlaylists})
  37. (SortableComponent)
  38. export const MyPlaylistTracks = ({match:{params:{_id}}}) =>
  39. <>
  40. <CPlaylistDropZone />
  41. <CPreloaded promiseName='playlistById'>
  42. <CSortableComponent />
  43. </CPreloaded>
  44. </>
  45. //
  46. // const MyTracks = ({playlist={}}) => {
  47. // const{name, tracks=[]} = playlist
  48. // return (
  49. // <div className='Category'>
  50. // <h2>{name}</h2>
  51. // <CPreloaded promiseName='playlistById'>
  52. // {(tracks || []).map((track,index) => <CTrack key={index} trackIndex={index} track={track}/>)}
  53. // </CPreloaded>
  54. // </div>
  55. // )
  56. // }
  57. //
  58. // const CMyTracks = connect(state => ({playlist: state.promise.playlistById?.payload || {}}),)(MyTracks)
  59. //
  60. //
  61. // export const MyPlaylistTracks = ({match:{params:{_id}}}) =>
  62. // <>
  63. // <CPlaylistDropZone >
  64. // <CMyTracks />
  65. // </CPlaylistDropZone >
  66. // </>
  67. //