import { each, pluck, difference, union } from 'lodash'; import http from '../services/http'; export default { state: { songs: [], length: 0, fmtLength: '', }, /** * All songs favorite'd by the current user. * * @return {Array.} */ get all() { return this.state.songs; }, clear() { this.state.songs = []; }, /** * Toggle like/unlike a song. * A request to the server will be made. * * @param {Object} song * @param {?Function} cb */ toggleOne(song, cb = null) { // Don't wait for the HTTP response to update the status, just toggle right away. // This may cause a minor problem if the request fails somehow, but do we care? song.liked = !song.liked; if (song.liked) { this.add(song); } else { this.remove(song); } http.post('interaction/like', { song: song.id }, () => { if (cb) { cb(); } }); }, /** * Add a song into the store. * * @param {Object} song */ add(song) { this.state.songs.push(song); }, /** * Remove a song from the store. * * @param {Object} song */ remove(song) { this.state.songs = difference(this.state.songs, [song]); }, /** * Like a bunch of songs. * * @param {Array.} songs * @param {?Function} cb */ like(songs, cb = null) { // Don't wait for the HTTP response to update the status, just set them to Liked right away. // This may cause a minor problem if the request fails somehow, but do we care? each(songs, song => song.liked = true); this.state.songs = union(this.state.songs, songs); http.post('interaction/batch/like', { songs: pluck(songs, 'id') }, () => { if (cb) { cb(); } }); }, /** * Unlike a bunch of songs. * * @param {Array.} songs * @param {?Function} cb */ unlike(songs, cb = null) { // Don't wait for the HTTP response to update the status, just set them to Unliked right away. // This may cause a minor problem if the request fails somehow, but do we care? each(songs, song => song.liked = false); this.state.songs = difference(this.state.songs, songs); http.post('interaction/batch/unlike', { songs: pluck(songs, 'id') }, () => { if (cb) { cb(); } }); }, };