import React from 'react';
import Integration, { IntegrationFeature, IntegrationAlbum, IntegrationArtist, IntegrationTrack } from '../Integration';
import StoreLinkIcon from '../../../components/common/StoreLinkIcon';
import { IntegrationWith } from '../../../api/api';
enum SearchType {
Track = 'track',
Artist = 'artist',
Album = 'album',
};
export default class SpotifyClientCreds extends Integration {
integrationId: number;
constructor(integrationId: number) {
super(integrationId);
this.integrationId = integrationId;
}
getFeatures(): IntegrationFeature[] {
return [
IntegrationFeature.Test,
IntegrationFeature.SearchTrack,
IntegrationFeature.SearchAlbum,
IntegrationFeature.SearchArtist,
]
}
getIcon(props: any) {
return
}
providesStoreLink() {
return IntegrationWith.Spotify;
}
async test(testParams: {}) {
const response = await fetch(
(process.env.REACT_APP_BACKEND || "") +
`/integrations/${this.integrationId}/v1/search?q=queens&type=artist`);
if (!response.ok) {
throw new Error("Spotify Client Credentials test failed: " + JSON.stringify(response));
}
console.log("Spotify test response:", await response.json())
}
async searchTrack(query: string, limit: number): Promise {
return this.search(query, SearchType.Track, limit);
}
async searchAlbum(query: string, limit: number): Promise {
return this.search(query, SearchType.Album, limit);
}
async searchArtist(query: string, limit: number): Promise {
return this.search(query, SearchType.Artist, limit);
}
async search(query: string, type: SearchType, limit: number):
Promise {
const response = await fetch(
(process.env.REACT_APP_BACKEND || "") +
`/integrations/${this.integrationId}/v1/search?q=${encodeURIComponent(query)}&type=${type}&limit=${limit}`);
if (!response.ok) {
throw new Error("Spotify Client Credentials search failed: " + JSON.stringify(response));
}
let json = await response.json();
console.log("Response:", json);
switch(type) {
case SearchType.Track: {
return json.tracks.items.map((r: any): IntegrationTrack => {
return {
title: r.name,
url: r.external_urls.spotify,
artist: {
name: r.artists && r.artists[0].name,
url: r.artists && r.artists[0].external_urls.spotify,
},
album: {
name: r.album && r.album.name,
url: r.album && r.album.external_urls.spotify,
}
}
})
}
case SearchType.Artist: {
return json.artists.items.map((r: any): IntegrationArtist => {
return {
name: r.name,
url: r.external_urls.spotify,
}
})
}
case SearchType.Album: {
return json.albums.items.map((r: any): IntegrationAlbum => {
return {
name: r.name,
url: r.external_urls.spotify,
artist: {
name: r.artists[0].name,
url: r.artists[0].external_urls.spotify,
},
}
})
}
}
}
}