Je React/Redux leerreis is bijna ten einde. Dit artikel laat zien hoe je data ophaalt van de SoundCloud API en een eenvoudige muziekspeler bouwt. Spring in de bus, laten we beginnen met onze ontdekkingstocht!
Muzieklijst op SoundCloud
Data Ophalen en Weergeven
Nadat je bent geauthenticeerd met de SoundCloud API, is de volgende stap het ophalen en weergeven van de songdata.
Raadpleeg eerst de API-documentatie van SoundCloud om het API-eindpunt te bepalen voor het laden van de songlijst van de gebruiker. Na succesvolle authenticatie roepen we deze API aan en updaten we de data via de setTracks
actie.
Voeg in het bestand actions/auth.js
de componenten toe om de songlijst op te halen:
// ...
import { setTracks } from '../actions/track';
// ...
export function auth() {
return (dispatch) => {
SoundCloud.connect().then((session) => {
dispatch(fetchMe(session));
dispatch(fetchTracks(session));
});
}
}
// ...
function fetchTracks(session) {
return (dispatch) => {
fetch(`${API_HOST}/me/activities?limit=20&offset=0&oauth_token=${session.oauth_token}`)
.then((res) => res.json())
.then((data) => {
dispatch(setTracks(data.collection));
});
}
}
We roepen de activities
API aan en halen de eerste 20 elementen op. fetchTracks
wordt asynchroon uitgevoerd samen met fetchMe
(gebruikersinformatie ophalen) na succesvolle authenticatie.
Presenter Aanpassen en Track Component Creëren
Omdat de data van de echte API verschilt van de oorspronkelijke hardcoded data, moeten we de presenter van TrackList
aanpassen. Voor het gemak splitsen we het weergeven van tracks op in een nieuwe component genaamd Track
in het bestand components/TrackList/Track.js
:
import React, { PropTypes, Component } from 'react';
export default class Track extends Component {
static propTypes = {
track: PropTypes.object.isRequired
}
render() {
const { origin: { artwork_url, title } } = this.props.track;
return (
<div>
<img src={artwork_url} alt={`Albumhoes van het nummer ${title}`} />
<button onClick={this._play.bind(this)}>Play</button> {/* Play-knop hier toegevoegd */}
{title}
</div>
)
}
}
Deze component ontvangt een track
prop en geeft de artwork, titel en play-knop van het nummer weer.
Muziekspeler Bouwen
Om muziek af te spelen wanneer op de Play
-knop wordt geklikt, gebruiken we de Audio
tag van HTML5. Omdat het niet de bedoeling is om deze tag in elke Track
te plaatsen, plaatsen we deze in de higher-order component TrackList
.
Voeg in het bestand TrackList.js
de audio
tag toe:
// ...
render() {
// ...
return (
<div>
{/* ... */}
<audio id='player' ref={(player) => { this.player = player; }} src={activeTrack ? `${activeTrack.origin.stream_url}?client_id=${this.props.clientId}` : ''} ></audio> {/* activeTrack wordt gecontroleerd voordat het wordt gebruikt */}
{/* ... */}
</div>
);
}
// ...
State activeTrack
Toevoegen
Om te weten welk nummer wordt afgespeeld, hebben we een activeTrack
state in de tracks
reducer nodig. Deze state wordt bijgewerkt door de playTrack
actie.
Voeg in het bestand reducers/tracks.js
de activeTrack
state en de TRACK_PLAY
actie toe:
import {ActionTypes} from '../core/constants';
const initialState = {
tracks: [],
activeTrack: null
};
export default function(state = initialState, action) {
switch (action.type) {
case ActionTypes.SET_TRACKS:
return {...state, tracks: action.tracks};
case ActionTypes.TRACK_PLAY:
return {...state, activeTrack: action.track}
default:
return state;
}
}
Voeg in het bestand actions/track.js
de playTrack
actie toe:
// ...
export function playTrack(track) {
return {
type: ActionTypes.TRACK_PLAY,
track
};
}
Actie Verbinden met Component
Voeg de playTrack
actie toe aan @connect
van TrackList
en geef deze door aan Track
. Wanneer in Track
op de Play-knop wordt geklikt, wordt de playTrack
actie aangeroepen.
// ... Track.js
_play() {
this.props.play(this.props.track.origin);
}
// ...
Muziek Afspelen
Ten slotte controleren we in componentDidUpdate
van TrackList
de activeTrack
. Indien aanwezig, roepen we de play()
functie van de audio
tag aan om muziek af te spelen.
// ...TrackList.js
componentDidUpdate() {
if(this.props.tracks.activeTrack){
this.player.src = `${this.props.tracks.activeTrack.stream_url}?client_id=${this.props.clientId}`;
this.player.play();
}
}
//....
Zo hebben we de bouw van een eenvoudige muziekspeler met React/Redux voltooid.
Referentiemateriaal:
https://www.robinwieruch.de/the-soundcloud-client-in-react-redux/