2020-03-28 09:39:31 +01:00
|
|
|
import 'package:dartz/dartz.dart';
|
2020-04-06 22:33:26 +02:00
|
|
|
import 'package:meta/meta.dart';
|
2020-03-28 09:39:31 +01:00
|
|
|
import 'package:mobx/mobx.dart';
|
2020-04-06 22:33:26 +02:00
|
|
|
import 'package:mosh/domain/usecases/play_song.dart';
|
2020-03-28 09:39:31 +01:00
|
|
|
|
|
|
|
import '../../core/error/failures.dart';
|
|
|
|
import '../../domain/entities/album.dart';
|
2020-04-03 13:55:15 +02:00
|
|
|
import '../../domain/entities/song.dart';
|
2020-04-06 22:33:26 +02:00
|
|
|
import '../../domain/repositories/audio_repository.dart';
|
2020-03-28 09:39:31 +01:00
|
|
|
import '../../domain/repositories/music_data_repository.dart';
|
|
|
|
import '../../domain/usecases/get_albums.dart';
|
2020-04-03 13:55:15 +02:00
|
|
|
import '../../domain/usecases/get_songs.dart';
|
2020-03-28 09:39:31 +01:00
|
|
|
import '../../domain/usecases/update_database.dart';
|
|
|
|
|
2020-04-07 21:25:01 +02:00
|
|
|
part 'music_data_store.g.dart';
|
2020-03-28 09:39:31 +01:00
|
|
|
|
2020-04-07 21:25:01 +02:00
|
|
|
class MusicDataStore extends _MusicStore with _$MusicDataStore {
|
|
|
|
MusicDataStore({@required MusicDataRepository musicDataRepository, @required AudioRepository audioRepository})
|
2020-04-06 22:33:26 +02:00
|
|
|
: super(musicDataRepository, audioRepository);
|
2020-03-28 09:39:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
abstract class _MusicStore with Store {
|
2020-04-06 22:33:26 +02:00
|
|
|
_MusicStore(MusicDataRepository _musicDataRepository, AudioRepository _audioRepository)
|
2020-03-28 09:39:31 +01:00
|
|
|
: _updateDatabase = UpdateDatabase(_musicDataRepository),
|
2020-04-03 13:55:15 +02:00
|
|
|
_getAlbums = GetAlbums(_musicDataRepository),
|
2020-04-06 22:33:26 +02:00
|
|
|
_getSongs = GetSongs(_musicDataRepository),
|
|
|
|
_playSong = PlaySong(_audioRepository);
|
2020-03-28 09:39:31 +01:00
|
|
|
|
|
|
|
final UpdateDatabase _updateDatabase;
|
|
|
|
final GetAlbums _getAlbums;
|
2020-04-03 13:55:15 +02:00
|
|
|
final GetSongs _getSongs;
|
2020-04-06 22:33:26 +02:00
|
|
|
final PlaySong _playSong;
|
2020-03-28 09:39:31 +01:00
|
|
|
|
|
|
|
@observable
|
|
|
|
ObservableFuture<List<Album>> albumsFuture;
|
|
|
|
|
2020-04-03 13:55:15 +02:00
|
|
|
@observable
|
|
|
|
ObservableList<Song> songs = <Song>[].asObservable();
|
2020-04-04 21:54:43 +02:00
|
|
|
|
2020-04-03 13:55:15 +02:00
|
|
|
@observable
|
|
|
|
bool isFetchingSongs = false;
|
|
|
|
|
2020-03-30 23:19:02 +02:00
|
|
|
@observable
|
|
|
|
bool isUpdatingDatabase = false;
|
|
|
|
|
2020-03-28 09:39:31 +01:00
|
|
|
@action
|
|
|
|
Future<void> updateDatabase() async {
|
2020-03-30 23:19:02 +02:00
|
|
|
isUpdatingDatabase = true;
|
2020-04-02 17:40:58 +02:00
|
|
|
await _updateDatabase();
|
2020-04-04 21:02:42 +02:00
|
|
|
await Future.wait([
|
|
|
|
fetchAlbums(),
|
|
|
|
fetchSongs(),
|
|
|
|
]);
|
2020-03-30 23:19:02 +02:00
|
|
|
isUpdatingDatabase = false;
|
2020-03-28 09:39:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@action
|
2020-04-03 15:51:43 +02:00
|
|
|
Future<void> fetchAlbums() async {
|
2020-04-03 13:55:15 +02:00
|
|
|
albumsFuture = ObservableFuture<List<Album>>(
|
|
|
|
_getAlbums().then(
|
|
|
|
(Either<Failure, List<Album>> either) => either.fold(
|
|
|
|
(_) => [],
|
|
|
|
(List<Album> a) => a,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
);
|
2020-03-28 09:39:31 +01:00
|
|
|
}
|
2020-04-03 13:55:15 +02:00
|
|
|
|
2020-04-03 15:51:43 +02:00
|
|
|
@action
|
2020-04-03 13:55:15 +02:00
|
|
|
Future<void> fetchSongs() async {
|
|
|
|
isFetchingSongs = true;
|
|
|
|
final result = await _getSongs();
|
|
|
|
|
|
|
|
result.fold(
|
|
|
|
(_) => songs = <Song>[].asObservable(),
|
2020-04-04 21:54:43 +02:00
|
|
|
(songList) {
|
|
|
|
songs.clear();
|
|
|
|
songs.addAll(songList);
|
|
|
|
},
|
2020-04-03 13:55:15 +02:00
|
|
|
);
|
2020-04-04 21:54:43 +02:00
|
|
|
|
2020-04-03 13:55:15 +02:00
|
|
|
isFetchingSongs = false;
|
|
|
|
}
|
2020-04-06 22:33:26 +02:00
|
|
|
|
|
|
|
@action
|
|
|
|
Future<void> playSong(int index, List<Song> songList) async {
|
|
|
|
await _playSong(Params(index, songList));
|
|
|
|
}
|
2020-03-28 09:39:31 +01:00
|
|
|
}
|