import 'package:meta/meta.dart'; import 'package:mobx/mobx.dart'; import '../../domain/entities/album.dart'; import '../../domain/entities/artist.dart'; import '../../domain/entities/song.dart'; import '../../domain/repositories/music_data_repository.dart'; part 'music_data_store.g.dart'; class MusicDataStore extends _MusicDataStore with _$MusicDataStore { MusicDataStore({@required MusicDataRepository musicDataRepository}) : super(musicDataRepository); } abstract class _MusicDataStore with Store { _MusicDataStore(this._musicDataRepository); final MusicDataRepository _musicDataRepository; bool _initialized = false; @observable ObservableList artists = [].asObservable(); @observable bool isFetchingArtists = false; @observable ObservableList albums = [].asObservable(); @observable bool isFetchingAlbums = false; @observable ObservableList songs = [].asObservable(); @observable bool isFetchingSongs = false; @observable bool isUpdatingDatabase = false; @observable ObservableList albumSongs = [].asObservable(); @action void init() { if (!_initialized) { print('MusicDataStore.init'); fetchArtists(); fetchAlbums(); fetchSongs(); _initialized = true; } } @action Future updateDatabase() async { isUpdatingDatabase = true; await _musicDataRepository.updateDatabase(); await Future.wait([ fetchArtists(), fetchAlbums(), fetchSongs(), ]); isUpdatingDatabase = false; } @action Future fetchArtists() async { isFetchingArtists = true; final result = await _musicDataRepository.getArtists(); result.fold( (_) => artists = [].asObservable(), (artistList) { artists.clear(); artists.addAll(artistList); }, ); isFetchingArtists = false; } @action Future fetchAlbums() async { isFetchingAlbums = true; final result = await _musicDataRepository.getAlbums(); result.fold( (_) => albums = [].asObservable(), (albumList) { albums.clear(); albums.addAll(albumList); }, ); isFetchingAlbums = false; } @action Future fetchSongs() async { isFetchingSongs = true; final result = await _musicDataRepository.getSongs(); result.fold( (_) => songs = [].asObservable(), (songList) { songs.clear(); songs.addAll(songList); }, ); isFetchingSongs = false; } @action Future fetchSongsFromAlbum(Album album) async { final result = await _musicDataRepository.getSongsFromAlbum(album); albumSongs.clear(); result.fold( (_) => albumSongs = [].asObservable(), (songList) => albumSongs.addAll(songList), ); } }