import Service from '@ember/service' ; import { task } from 'ember-concurrency-decorators' ; import fetch from 'fetch' ; import config from 'client/config/environment' ; import serializeTrackAlbum from 'client/src/serializers/trackAlbum' ; import serializePlaylist from 'client/src/serializers/playlist' ; import serializeArtist from 'client/src/serializers/artist' ; import Track from 'client/src/pojo/track' ; import Playlist from 'client/src/pojo/playlist' ; import Artist from 'client/src/pojo/artist' ; import { alias } from '@ember-decorators/object/computed' ; export default class DataSearchService extends Service { @ alias ( '_load.isRunning' ) isLoading : boolean ; host : any = config . apiServer ; endpoint : string = '/api/spotify/v1/search/' ; keyword : string = '' ; playlists : Playlist [ ] = [ ] ; tracks : Track [ ] = [ ] ; artists : Artist [ ] = [ ] ; artist = null ; controller : AbortController ; signal : AbortSignal ; _task : any ; constructor ( ) { super ( ... arguments ) ; this . controller = new AbortController ( ) ; this . controller . signal ; this . signal = this . controller . signal ; } param keyword load ( keyword ) { if ( this . _task ) { this . _task . cancel ( ) ; } if ( this . controller ) { this . controller . abort ( ) ; this . controller = new AbortController ( ) ; this . signal = this . controller . signal ; } this . _task = this . _load . perform ( keyword ) ; return this . _task ; } @ task * _load ( keyword ) { this . clear ( ) ; if ( ! keyword . length ) { return ; } const options = { method : 'get' , signal : this . signal } ; const response = yield fetch ( this . host + this . endpoint + keyword , options ) ; const { data } = yield response . json ( ) ; const playlists = data . table . playlists . items . slice ( 0 , 10 ) . map ( serializePlaylist ) ; const artists = data . table . artists . items . slice ( 0 , 10 ) . map ( serializeArtist ) ; const tracks = data . table . tracks . items . map ( serializeTrackAlbum ) ; this . artists . pushObjects ( artists ) ; this . playlists . pushObjects ( playlists ) ; this . tracks . pushObjects ( tracks ) ; } /**
    * reset search state
    */ clear ( ) { this . playlists . clear ( ) ; this . artists . clear ( ) ; this . tracks . clear ( ) ; } } declare module '@ember/service' { interface Registry { 'data/search' : DataSearchService ; } }