react-spotify-api/src/views/ArtistSearch.jsx

98 lines
2.7 KiB
React
Raw Normal View History

2019-12-13 15:53:32 -05:00
import React, { useState, useEffect } from 'react'
2019-12-14 18:05:19 -05:00
import SpotifyWebApi from 'spotify-web-api-js'
import Artist from '../components/Artist'
import history from '../history.js'
2019-12-14 18:05:19 -05:00
import './ArtistSearch.scss'
const spotifyApi = new SpotifyWebApi()
2019-12-13 15:53:32 -05:00
2019-12-17 00:35:05 -05:00
const searchIcon = (
<svg viewBox="0 0 70 70" xmlns="http://www.w3.org/2000/svg">
<g>
<title>Layer 2</title>
<circle fillOpacity="0" id="svg_2" r="14.22443" cy="15.72443" cx="15.72443" strokeWidth="3" stroke="#cccccc" fill="#000000"/>
<line stroke="#cccccc" id="svg_4" y2="30.20002" x2="29.72541" y1="26.64045" x1="26.16584" fillOpacity="0" strokeLinecap="null" strokeLinejoin="null" strokeDasharray="null" strokeWidth="3" fill="none"/>
<line id="svg_6" y2="29.96271" x2="29.72541" y1="40.64143" x1="40.87873" fillOpacity="0" strokeLinecap="null" strokeLinejoin="null" strokeDasharray="null" strokeWidth="6" stroke="#cccccc" fill="none"/>
</g>
</svg>
)
function ArtistSearch({ props }) {
2019-12-14 12:32:28 -05:00
let [search, setSearch] = useState(null)
2019-12-14 18:05:19 -05:00
let [artists, setArtists] = useState(null)
2019-12-15 23:10:25 -05:00
let [token, setToken] = useState(null)
2019-12-13 15:53:32 -05:00
2019-12-15 23:10:25 -05:00
// Retrieve access token from url
2019-12-13 15:53:32 -05:00
useEffect(() => {
const search = window.location.search
const params = new URLSearchParams(search)
2019-12-14 18:05:19 -05:00
const token = params.get('access_token')
2019-12-15 23:10:25 -05:00
setToken(token)
2019-12-14 18:05:19 -05:00
spotifyApi.setAccessToken(token)
2019-12-13 15:53:32 -05:00
}, [])
2019-12-15 23:10:25 -05:00
// Search artists
2019-12-14 12:32:28 -05:00
useEffect(() => {
2019-12-17 00:35:05 -05:00
if (search && search.length > 0) {
2019-12-14 18:05:19 -05:00
spotifyApi.searchArtists(search)
.then(function(data) {
setArtists(data.artists.items)
}, function(err) {
console.error(err);
})
}
2019-12-17 00:35:05 -05:00
else {
setArtists(null)
}
2019-12-14 12:32:28 -05:00
}, [search])
2019-12-15 23:10:25 -05:00
// Load search term from props
useEffect(() => {
setSearch(props.searchTerm)
}, [props.searchTerm])
2019-12-15 23:10:25 -05:00
// Save token in Router state
useEffect(() => {
props.tokenCb(token)
}, [props, token])
// Save search term
2019-12-14 12:32:28 -05:00
const handleChange = e => {
setSearch(e.currentTarget.value)
props.searchCb(e.currentTarget.value)
}
2019-12-15 23:10:25 -05:00
// Save artist id in Router state
const albumsCallback = id => {
props.idCb(id)
history.push('/albums')
2019-12-14 12:32:28 -05:00
}
2019-12-13 15:53:32 -05:00
return (
2019-12-16 18:38:48 -05:00
<div className="spotify">
2019-12-13 15:53:32 -05:00
<h1>Artist search</h1>
2019-12-17 00:35:05 -05:00
<div className='search-field'>
<input placeholder='Search for an artist...' onChange={handleChange} />
{searchIcon}
</div>
2019-12-14 18:05:19 -05:00
{artists && (
<div className='artists'>
<ul className='list'>
{artists.map((artist, index) => (
<li className='list-item' key={index}>
<Artist props={artist} callback={albumsCallback} />
2019-12-14 18:05:19 -05:00
</li>
))}
</ul>
</div>
)}
2019-12-13 15:53:32 -05:00
</div>
)
}
export default ArtistSearch