playlistById.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import React, {useState, useEffect} from 'react';
  2. import { ReactDOM } from 'react';
  3. import { store } from '../store/store';
  4. import { actionPlaylistById} from '../store/promiseReducer';
  5. import Button from 'react-bootstrap/Button';
  6. import Modal from 'react-bootstrap/Modal';
  7. import {Provider, connect} from 'react-redux';
  8. import { actionFullSetTrack, actionFullPlay} from '../store/playerReducer';
  9. import { Header } from './header';
  10. import { СNowPlayingPlayer } from './playing';
  11. function sendForm (url, data) {
  12. fetch(`http://player-api/api/${url}`, {
  13. method: 'POST',
  14. body: data,
  15. headers: {
  16. ...(localStorage.authToken ? {"Authorization": "Bearer " + localStorage.authToken} : {})
  17. },
  18. }).then(res => res.json())
  19. .then(data => {
  20. if(data.token) {
  21. console.log(data)
  22. return data
  23. } else {
  24. //console.log(data.login[0]);
  25. }
  26. })
  27. }
  28. function ShowModal (props) {
  29. const [tracks, setTrack] = useState(null);
  30. const PostLoadTracks = async(event) =>{
  31. event.preventDefault();
  32. const data = new FormData();
  33. data.append("id", store.getState().promise.plstById.payload.id);
  34. let i = 0;
  35. for (let track of tracks) {
  36. data.append(`tracks[${i++}]`, track);
  37. }
  38. sendForm('playlists/load-tracks', data);
  39. }
  40. return(
  41. <Modal
  42. {...props}
  43. size="lg"
  44. aria-labelledby="contained-modal-title-vcenter"
  45. centered
  46. >
  47. <Modal.Header closeButton>
  48. <Modal.Title id="contained-modal-title-vcenter">
  49. Add Tracks
  50. </Modal.Title>
  51. </Modal.Header>
  52. <Modal.Body >
  53. <form onSubmit={PostLoadTracks} className="authorization center align-items-center justify-content-center d-flex" id='loadTracksForm'>
  54. <div className="mb-3">
  55. <label className="form-label">Multiple files input example</label>
  56. <input className="form-control" accept=".mp3" type="file" id="formFileMultiple" multiple onChange={(e) => setTrack(e.target.files)}/>
  57. </div>
  58. </form>
  59. </Modal.Body>
  60. <Modal.Footer>
  61. <Button variant="outline-danger" type='submit' form='loadTracksForm' onClick={props.onHide}>Save</Button>
  62. </Modal.Footer>
  63. </Modal>)
  64. }
  65. let i =1;
  66. export let audio = new Audio();
  67. const Track = ({track: {name, file, id3, id} = {} }, key) =>
  68. <tr>
  69. <th scope="row">{i++}</th>
  70. <td>
  71. <button onClick={() => {
  72. audio.src = `http://player-api/storage/tracks/${file}`;
  73. store.dispatch(actionFullSetTrack({name, file, id3, id}));
  74. store.dispatch(actionFullPlay());
  75. }}>
  76. {name}
  77. </button>
  78. </td>
  79. <td>
  80. <a href='#/artist'>{id3.artist}</a>
  81. </td>
  82. <td>{id3.getAlbum}</td>
  83. </tr>
  84. const TracksAll = ({tracks=[]}) =>
  85. <table className="table table-dark table-striped table-dark table-hover">
  86. <thead>
  87. <tr>
  88. <th scope="col">#</th>
  89. <th scope="col">Track name</th>
  90. <th scope="col">Artist</th>
  91. <th scope="col">Album</th>
  92. </tr>
  93. </thead>
  94. <tbody>
  95. {tracks.map((tracks, i) => <Track key={i} track={tracks}/>)}
  96. </tbody>
  97. </table>
  98. const СAllTracks = connect(state => ({tracks: state.promise.plstById?.payload?.tracks || []}), )(TracksAll);
  99. export const PlaylistById = ({playlist = {}}) => {
  100. let id = window.location.href.split('/')[4];
  101. const getAnswer = async () => {
  102. await store.dispatch(actionPlaylistById(id));
  103. };
  104. useEffect(() => {
  105. getAnswer();
  106. }, []);
  107. const [modalShow, setModalShow] = React.useState(false);
  108. return(
  109. <>
  110. <Header/>
  111. <div className='d-flex justify-content-around'>
  112. <div>
  113. <h1 >Playlist</h1>
  114. <div className='d-flex justify-content-center'>
  115. <div className='me-4'>
  116. <img src={playlist.photo} width ='250px' alt='...'/>
  117. </div>
  118. <div>
  119. <p className='h4'>Название плейлиста: {playlist.name}</p>
  120. <p>Автор плейлиста: {playlist.user_name}</p>
  121. <p>{playlist?.tracks?.length} треков</p>
  122. <div className='d-flex'>
  123. <div> <button type="button" className="btn btn-light me-2">Перемешать</button></div>
  124. <div> <button type="button" className="btn btn-light">Добавить в библиотеку</button></div>
  125. </div>
  126. {playlist.user_id === store.getState().auth.user.id?
  127. (<>
  128. <Button variant="primary" onClick={() => setModalShow(true)}>
  129. Add Tracks
  130. </Button>
  131. <ShowModal
  132. show={modalShow}
  133. onHide={() => setModalShow(false)}
  134. /></>) : <></>}
  135. </div>
  136. </div>
  137. <СAllTracks/>
  138. </div>
  139. <СNowPlayingPlayer/>
  140. </div>
  141. </>
  142. )}