import 'package:dartz/dartz.dart'; import 'package:meta/meta.dart'; import 'package:mobx/mobx.dart'; import 'package:mosh/domain/usecases/play_song.dart'; import '../../core/error/failures.dart'; import '../../domain/entities/album.dart'; import '../../domain/entities/song.dart'; import '../../domain/repositories/audio_repository.dart'; import '../../domain/repositories/music_data_repository.dart'; import '../../domain/usecases/get_albums.dart'; import '../../domain/usecases/get_songs.dart'; import '../../domain/usecases/update_database.dart'; part 'music_store.g.dart'; class MusicStore extends _MusicStore with _$MusicStore { MusicStore({@required MusicDataRepository musicDataRepository, @required AudioRepository audioRepository}) : super(musicDataRepository, audioRepository); } abstract class _MusicStore with Store { _MusicStore(MusicDataRepository _musicDataRepository, AudioRepository _audioRepository) : _updateDatabase = UpdateDatabase(_musicDataRepository), _getAlbums = GetAlbums(_musicDataRepository), _getSongs = GetSongs(_musicDataRepository), _playSong = PlaySong(_audioRepository); final UpdateDatabase _updateDatabase; final GetAlbums _getAlbums; final GetSongs _getSongs; final PlaySong _playSong; @observable ObservableFuture> albumsFuture; @observable ObservableList songs = [].asObservable(); @observable bool isFetchingSongs = false; @observable bool isUpdatingDatabase = false; @action Future updateDatabase() async { isUpdatingDatabase = true; await _updateDatabase(); await Future.wait([ fetchAlbums(), fetchSongs(), ]); isUpdatingDatabase = false; } @action Future fetchAlbums() async { albumsFuture = ObservableFuture>( _getAlbums().then( (Either> either) => either.fold( (_) => [], (List a) => a, ), ), ); } @action Future fetchSongs() async { isFetchingSongs = true; final result = await _getSongs(); result.fold( (_) => songs = [].asObservable(), (songList) { songs.clear(); songs.addAll(songList); }, ); isFetchingSongs = false; } @action Future playSong(int index, List songList) async { await _playSong(Params(index, songList)); } }