|
@@ -1,33 +1,32 @@
|
|
|
import React, { useEffect, useState } from 'react';
|
|
|
import {
|
|
|
IconButton, List, ListItem, Typography,
|
|
|
- Slider, Stack,
|
|
|
+ Slider, Stack, Box, Pagination, PaginationItem,
|
|
|
} from '@mui/material';
|
|
|
-import { PlayCircle, VolumeUp } from '@mui/icons-material';
|
|
|
+import {
|
|
|
+ PauseRounded, PlayArrowRounded, PlayCircle, VolumeDown, VolumeUp,
|
|
|
+} from '@mui/icons-material';
|
|
|
import { useDispatch, useSelector } from 'react-redux';
|
|
|
import {
|
|
|
actionPause, actionPlay, actionSetAudio, actionSetCurrentTrackId,
|
|
|
} from '../../store/types/playerTypes';
|
|
|
+import { getGql } from '../../utils/getGql';
|
|
|
+import { BACKEND_URL } from '../../constants';
|
|
|
|
|
|
-export const TrackList = ({trackList}) => {
|
|
|
+export const TrackList = ({tracks, trackCount}) => {
|
|
|
const dispatch = useDispatch();
|
|
|
const playerState = useSelector(state => state.player);
|
|
|
- const [volume, setVolume] = useState(0);
|
|
|
- console.log(playerState);
|
|
|
+ const [trackList, setTrackList] = useState(tracks);
|
|
|
+ const [page, setPage] = useState(1);
|
|
|
+ console.log(trackList, page);
|
|
|
|
|
|
- const onVolumeChange = (id, value) => {
|
|
|
- if (playerState.currentPlayingTrackId === id) {
|
|
|
- setVolume(value / 100);
|
|
|
- playerState.audio.volume = volume;
|
|
|
- }
|
|
|
- };
|
|
|
useEffect(() => {
|
|
|
if (playerState.trackList.length === 0) {
|
|
|
return;
|
|
|
}
|
|
|
if (playerState.isPlaying) {
|
|
|
if (playerState.audio === null) {
|
|
|
- const {url} = playerState.trackList.find(track => track._id === playerState.currentPlayingTrackId);
|
|
|
+ const {url} = trackList.find(track => track._id === playerState.currentPlayingTrackId);
|
|
|
const audio = new Audio(url);
|
|
|
audio.play();
|
|
|
dispatch(actionSetAudio(audio));
|
|
@@ -40,11 +39,33 @@ export const TrackList = ({trackList}) => {
|
|
|
}, [playerState.isPlaying]);
|
|
|
|
|
|
useEffect(() => {
|
|
|
+ console.log('here', 1);
|
|
|
if (playerState.audio !== null) {
|
|
|
- const {url} = playerState.trackList.find(track => track._id === playerState.currentPlayingTrackId);
|
|
|
+ console.log('here', 2);
|
|
|
+ if (playerState.audio.duration === playerState.audio.currentTime) {
|
|
|
+ console.log('here', 3);
|
|
|
+
|
|
|
+ playerState.audio.addEventListener('onended', togglePlayPause);
|
|
|
+
|
|
|
+ return () => {
|
|
|
+ playerState.audio.removeEventListener('onended', togglePlayPause);
|
|
|
+ };
|
|
|
+ }
|
|
|
+ ;
|
|
|
+ }
|
|
|
+ }, [playerState.audio?.currentTime]);
|
|
|
+
|
|
|
+ useEffect(() => {
|
|
|
+ if (playerState.audio !== null) {
|
|
|
+ console.log(trackList, playerState.currentPlayingTrackId);
|
|
|
+ const {url} = trackList.find(track => track._id === playerState.currentPlayingTrackId);
|
|
|
const audio = new Audio(url);
|
|
|
audio.play();
|
|
|
dispatch(actionSetAudio(audio));
|
|
|
+ const id = playerState.currentPlayingTrackId;
|
|
|
+ dispatch(actionPlay({
|
|
|
+ trackList, id,
|
|
|
+ }));
|
|
|
}
|
|
|
}, [playerState.currentPlayingTrackId]);
|
|
|
|
|
@@ -60,32 +81,60 @@ export const TrackList = ({trackList}) => {
|
|
|
dispatch(actionPause());
|
|
|
}
|
|
|
};
|
|
|
+ useEffect(() => {
|
|
|
+ const gql = getGql(`${BACKEND_URL}/graphql`);
|
|
|
+ gql(`
|
|
|
+ query skipTracks($query: String) {
|
|
|
+ TrackFind(query: $query) {
|
|
|
+ _id url originalFileName
|
|
|
+ }
|
|
|
+ }
|
|
|
+ `, {query: JSON.stringify([{}, {skip: [(page - 1) * 100]}])})
|
|
|
+ .then(data => setTrackList(data.map(track => ({
|
|
|
+ ...track,
|
|
|
+ url: `${BACKEND_URL}/${track.url}`,
|
|
|
+ }))));
|
|
|
+ }, [page]);
|
|
|
+
|
|
|
+ const handleChange = (e, value) => {
|
|
|
+ setPage(value);
|
|
|
+ };
|
|
|
|
|
|
return (
|
|
|
- <List>
|
|
|
- {trackList.map(track => (
|
|
|
- <ListItem key={track._id}>
|
|
|
- <IconButton onClick={() => togglePlayPause(track._id)}>
|
|
|
- <PlayCircle/>
|
|
|
- </IconButton>
|
|
|
- <Typography>{track.originalFileName}</Typography>
|
|
|
- <Stack
|
|
|
- spacing={2}
|
|
|
- direction="row"
|
|
|
- sx={
|
|
|
- {ml: 2, width: 200}
|
|
|
- }
|
|
|
- >
|
|
|
- <VolumeUp/>
|
|
|
- <Slider
|
|
|
- max={100}
|
|
|
- arial-label="Volume"
|
|
|
- onChange={(e) => onVolumeChange(track._id, e.target.value)}
|
|
|
- value={volume * 100}
|
|
|
- />
|
|
|
- </Stack>
|
|
|
- </ListItem>
|
|
|
- ))}
|
|
|
- </List>
|
|
|
+ <Box>
|
|
|
+ <List>
|
|
|
+ {trackList.map(track => (
|
|
|
+ <ListItem key={track._id}>
|
|
|
+ <IconButton
|
|
|
+ onClick={() => togglePlayPause(track._id)}
|
|
|
+ >
|
|
|
+ {
|
|
|
+ playerState.isPlaying && track._id === playerState.currentPlayingTrackId
|
|
|
+ ? (<PauseRounded fontSize="large" color="primary"/>)
|
|
|
+ : (<PlayArrowRounded fontSize="large" color="primary"/>)
|
|
|
+ }
|
|
|
+ </IconButton>
|
|
|
+ <Typography>{track.originalFileName}</Typography>
|
|
|
+ </ListItem>
|
|
|
+ ))}
|
|
|
+ </List>
|
|
|
+ <Stack
|
|
|
+ spacing={2}
|
|
|
+ position="static"
|
|
|
+ bottom="0"
|
|
|
+ sx={{
|
|
|
+ display: 'flex',
|
|
|
+ alignItems: 'center',
|
|
|
+ mb: '3%',
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <Pagination
|
|
|
+ page={page}
|
|
|
+ count={Math.ceil(trackCount / 100)}
|
|
|
+ onChange={handleChange}
|
|
|
+ color="primary"
|
|
|
+ />
|
|
|
+ </Stack>
|
|
|
+ </Box>
|
|
|
);
|
|
|
};
|