Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

finished displaying filtered tracks after clicking apply button #108

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 21 additions & 7 deletions frontend/src/components/ContentCheckBox.jsx
Original file line number Diff line number Diff line change
@@ -1,27 +1,35 @@
import React, { useState } from "react";
import { useNavigate } from "react-router-dom";

const ContentCheckbox = ({ playlistData }) => {
const navigate = useNavigate();
const [filteredTracks, setFilteredTracks] = useState([]);
const [yesChecked, setYesChecked] = useState(false);
const [noChecked, setNoChecked] = useState(false);


console.log(playlistData)
const applyButtonHandler = (e) => {
e.preventDefault();
console.log(filteredTracks)
setFilteredTracks(filteredTracks)
navigate('/app/filteredPlaylist',{state:{filteredTracks}});
};

function yesClickHandler() {
console.log(playlistData.tracks.items)
console.log(playlistData.tracks.items[0].track.explicit)
const selectedTracks = playlistData.tracks.items.filter(
const selectedTracks = playlistData.filter(
(track) => track.track.explicit === true
);
console.log(selectedTracks)
setFilteredTracks(selectedTracks);
setNoChecked(false);
setYesChecked(true);
}

function noClickHandler() {
console.log(playlistData.tracks.items);
console.log(playlistData.tracks.items[0].track.explicit);
const selectedTracks = playlistData.tracks.items.filter(
const selectedTracks = playlistData.filter(
(track) => track.track.explicit === false
);

console.log(selectedTracks);
setFilteredTracks(selectedTracks);
setYesChecked(false);
Expand All @@ -42,6 +50,12 @@ const ContentCheckbox = ({ playlistData }) => {
No
<input type="checkbox" checked={noChecked} onChange={noClickHandler} />
</label>
<div>
<button
onClick={(e)=>applyButtonHandler(e)}
>Apply to playlist
</button>
</div>
</div>
);
};
Expand Down
24 changes: 16 additions & 8 deletions frontend/src/components/DurationFilter.jsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { useState } from "react";
import ContentCheckbox from "./ContentCheckBox";

const DurationFilter = ({playlistData}) => {
const [range, setRange] = useState(0);
Expand All @@ -10,7 +11,6 @@ function handleChange(e) {
setRange(parseInt(e.target.value));
//1minute
if(range===0){

const selectedTracks = playlistData.tracks.items.filter(
(track) => track.track.duration_ms<=60000);
//console.log(selectedTracks)
Expand All @@ -28,41 +28,48 @@ function handleChange(e) {
console.log(playlistData.tracks.items)
const selectedTracks = playlistData.tracks.items.filter(
(track) => track.track.duration_ms<=180000);
console.log(selectedTracks)}
console.log(selectedTracks)
setFilteredTracks(selectedTracks)}
//4minutes
else if(range===3){
const selectedTracks = playlistData.tracks.items.filter(
(track) => track.track.duration_ms<=240000);
console.log(selectedTracks)}
console.log(selectedTracks)
setFilteredTracks(selectedTracks)}
//5minutes
else if(range===4){
const selectedTracks = playlistData.tracks.items.filter(
(track) => track.track.duration_ms<=300000);
console.log(selectedTracks)}
console.log(selectedTracks)
setFilteredTracks(selectedTracks)}
//6minutes
else if(range===5){
const selectedTracks = playlistData.tracks.items.filter(
(track) => track.track.duration_ms<=360000);
console.log(selectedTracks)}
console.log(selectedTracks)
setFilteredTracks(selectedTracks)}
//7minutes
else if(range===6){
const selectedTracks = playlistData.tracks.items.filter(
(track) => track.track.duration_ms<=420000);
console.log(selectedTracks)}
console.log(selectedTracks)
setFilteredTracks(selectedTracks)}
//8minutes
else if(range===7){
console.log(range)
console.log(playlistData.tracks.items[0].track.duration_ms)
const selectedTracks = playlistData.tracks.items.filter(
(track) => track.track.duration_ms<=480000);
console.log(selectedTracks)}
console.log(selectedTracks)
setFilteredTracks(selectedTracks)}
//9minutes
else if(range===8){
console.log(range)
console.log(playlistData.tracks.items[0].track.duration_ms)
const selectedTracks = playlistData.tracks.items.filter(
(track) => track.track.duration_ms<=540000);
console.log(selectedTracks)}
console.log(selectedTracks)
setFilteredTracks(selectedTracks)}
//10minutes
else if(range===8){
console.log(range)
Expand All @@ -84,6 +91,7 @@ function handleChange(e) {
onChange={(e) => handleChange(e)}
/>
<p style={{textAlign:"center"}}>{range}min</p>
<ContentCheckbox playlistData={filteredTracks} />
</div>
);
};
Expand Down
4 changes: 0 additions & 4 deletions frontend/src/components/DynamicGenres.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,6 @@ const genresUrl =

const clickHandlerBtn = (e) => {
e.preventDefault();
console.log(selectedGenre)
//console.log(playlistData.tracks.items[0].artists[0].genres);

if (playlistData && playlistData.tracks && playlistData.tracks.items) {
let filtered = playlistData.tracks.items.filter(track => {
// Check if the track, artists, and genres are defined before accessing them
Expand Down Expand Up @@ -86,7 +83,6 @@ const genresUrl =
>
Click
</button>
{console.log(filteredTracks)}
{showFilteredTracks &&
(filteredTracks.length > 0 ? (
filteredTracks.tracks.items.map((track, trackIndex) => (
Expand Down
88 changes: 88 additions & 0 deletions frontend/src/components/FilteredTracksDisplay.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
import React, { useState, useEffect } from "react";

function formatDuration(durationInMilliseconds) {
const minutes = Math.floor(durationInMilliseconds / 60000);
const seconds = ((durationInMilliseconds % 60000) / 1000).toFixed(0);
return `${minutes}:${seconds < 10 ? "0" : ""}${seconds}`;
}
const FilteredTracksDisplay = ({filteredTracks})=>{

const [playTracks, setPlayTracks] = useState(false);
const [uri, setUri] = useState("");
const [urlTrack, setUrlTrack] = useState();

useEffect(() => {
console.log(uri);
window.onSpotifyIframeApiReady = (IFrameAPI) => {
const element = document.getElementById("embed-iframe");
const options = {
uri: uri,
};
const callback = (EmbedController) => {};
IFrameAPI.createController(element, options, callback);
};

// Clean up on component unmount
return () => {
delete window.onSpotifyIframeApiReady;
};
}, [uri]);

const handlePlay = (spotifyUri, spotifyUrl) => {
setUri(spotifyUri);
setUrlTrack(spotifyUrl);
console.log(urlTrack);
setPlayTracks(true);
};

if (!filteredTracks) {
return <div>Loading...</div>;
}

return(
<div className=" mx-10">
<div className="grid grid-cols-1 gap-10 my-14 md:grid-cols-2 lg:grid-cols-4 md:gap-10 text-xl md:text-3xl md:mx-6">
{playTracks && (
<div id="embed-iframe">
<iframe
src={`https://open.spotify.com/embed/track/${urlTrack}`}
width="280"
height="100"
></iframe>
<button
style={{ position: "relative" }}
onClick={() => setPlayTracks(false)}
>
</button>
</div>
)}
{filteredTracks &&
filteredTracks.map((track,index)=>
<div key={index} className="grid grid-cols-2
md:gap-5
text-xl
md:text-3xl">
{track.track.album.images.length > 0 && (
<img
key={index}
src={track.track.album.images[0].url}
alt={`Album Cover for ${track.track.name}`}
style={{ cursor: "pointer" }}
onClick={() => handlePlay(track.track.uri, track.track.id)}
/>
)}
<div className="ml-6 sm:m-0 flex-rows">
<p className=" font-medium text-blue-400">{track.track.name}</p>
<p className=" text-gray-400 text-2xl">
{formatDuration(track.track.duration_ms)}
</p>
</div>
</div>
)}
</div>

</div>
)
}
export default FilteredTracksDisplay;
2 changes: 1 addition & 1 deletion frontend/src/components/Header.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ const Header = () => {
Authorization: `Bearer ${myAccessToken}`,
},
});
console.log(response);

const data = await response.json();
SetUserName(data.display_name);
};
Expand Down
4 changes: 2 additions & 2 deletions frontend/src/components/SharedPlaylistDisplay.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const SharedPlaylistDisplay = ({ playlistData }) => {
const [urlTrack, setUrlTrack] = useState();

useEffect(() => {
console.log(uri);

window.onSpotifyIframeApiReady = (IFrameAPI) => {
const element = document.getElementById("embed-iframe");
const options = {
Expand All @@ -29,9 +29,9 @@ const SharedPlaylistDisplay = ({ playlistData }) => {
}, [uri]);

const handlePlay = (spotifyUri, spotifyUrl) => {

setUri(spotifyUri);
setUrlTrack(spotifyUrl);
console.log(urlTrack);
setPlayTracks(true);
};

Expand Down
17 changes: 0 additions & 17 deletions frontend/src/components/dialogs/PlaylistTracksFilterModal.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { Dialog } from "@headlessui/react";
import GenreFilter from "../DynamicGenres";
import ContentCheckbox from "../ContentCheckBox";
import DurationFilter from "../DurationFilter";

function PlaylistTracksFilterModal({ isOpen, handleModalOpen, playlistData }) {
Expand All @@ -27,29 +26,13 @@ function PlaylistTracksFilterModal({ isOpen, handleModalOpen, playlistData }) {

<DurationFilter playlistData={playlistData}/>
</div>

<div className="m-3 text-lg">
<Dialog.Description className="text-lg">
{" "}
Is explicit
</Dialog.Description>

<ContentCheckbox playlistData={playlistData} />
</div>

<div className="flex flex-row justify-center m-auto my-4">
<button
className="ml-3 inline-flex justify-center rounded-md border-2 px-3 py-2 text-sm font-semibold text-black shadow-sm hover:bg-blue-700 sm:ml-3 sm:w-auto"
onClick={() => handleModalOpen(false)}
>
Clean
</button>
<button
className="ml-3 inline-flex justify-center rounded-md bg-light-blue-700 px-3 py-2 text-sm font-semibold text-black shadow-sm hover:bg-blue-700 sm:ml-3 sm:w-auto"
onClick={() => handleModalOpen(false)}
>
Apply to playlist
</button>
</div>
</Dialog.Panel>
</Dialog>
Expand Down
15 changes: 11 additions & 4 deletions frontend/src/components/screens/FilteredTracksScreen.jsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
import Header from "../Header";
import { useLocation } from "react-router-dom";
import FilteredTracksDisplay from "../FilteredTracksDisplay";

const FilteredTracksScreen = ()=>{
const location = useLocation()
const filteredTracks = location.state && location.state.filteredTracks;
console.log(filteredTracks)

return(
<div>
<div >
<Header/>
<h2 style={{color:"white"}}>FilteredTracksScreen</h2>
<h2 style={{color:"white"}}>FilteredTracksScreen</h2>
<FilteredTracksDisplay filteredTracks={filteredTracks}/>
</div>
)
)}

}
export default FilteredTracksScreen;
4 changes: 2 additions & 2 deletions frontend/src/config.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
export const redirectUri = "https://song-sieve-frontend.onrender.com/app"; // production
//export const redirectUri = "https://song-sieve-frontend.onrender.com/app"; // production

// export const redirectUri = "http://localhost:3000/app"; // development
export const redirectUri = "http://localhost:3000/app"; // development