Created
January 8, 2021 15:35
-
-
Save ngallazzi/080d34ab06c4c59b2be309103bea18ad to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class BooksViewModel( | |
private val getBooksUseCase: GetBooksUseCase, | |
private val getBookmarksUseCase: GetBookmarksUseCase, | |
private val bookmarkBookUseCase: BookmarkBookUseCase, | |
private val unbookmarkBookUseCase: UnbookmarkBookUseCase, | |
private val mapper: BookWithStatusMapper | |
) : ViewModel() { | |
private val _dataLoading = MutableLiveData(true) | |
val dataLoading: LiveData<Boolean> = _dataLoading | |
private val _books = MutableLiveData<List<BookWithStatus>>() | |
val books = _books | |
private val _error = MutableLiveData<String>() | |
val error: LiveData<String> = _error | |
private val _remoteBooks = arrayListOf<Volume>() | |
// Getting books with uncle bob as default author :) | |
fun getBooks(author: String) { | |
viewModelScope.launch { | |
_dataLoading.postValue(true) | |
when (val booksResult = getBooksUseCase.invoke(author)) { | |
is Result.Success -> { | |
_remoteBooks.clear() | |
_remoteBooks.addAll(booksResult.data) | |
val bookmarksFlow = getBookmarksUseCase.invoke() | |
bookmarksFlow.collect { bookmarks -> | |
books.value = mapper.fromVolumeToBookWithStatus(_remoteBooks, bookmarks) | |
_dataLoading.postValue(false) | |
} | |
} | |
is Result.Error -> { | |
_dataLoading.postValue(false) | |
books.value = emptyList() | |
_error.postValue(booksResult.exception.message) | |
} | |
} | |
} | |
} | |
fun bookmark(book: BookWithStatus) { | |
viewModelScope.launch { | |
bookmarkBookUseCase.invoke(mapper.fromBookWithStatusToVolume(book)) | |
} | |
} | |
fun unbookmark(book: BookWithStatus) { | |
viewModelScope.launch { | |
unbookmarkBookUseCase.invoke(mapper.fromBookWithStatusToVolume(book)) | |
} | |
} | |
class BooksViewModelFactory( | |
private val getBooksUseCase: GetBooksUseCase, | |
private val getBookmarksUseCase: GetBookmarksUseCase, | |
private val bookmarkBookUseCase: BookmarkBookUseCase, | |
private val unbookmarkBookUseCase: UnbookmarkBookUseCase, | |
private val mapper: BookWithStatusMapper | |
) : | |
ViewModelProvider.NewInstanceFactory() { | |
@Suppress("UNCHECKED_CAST") | |
override fun <T : ViewModel?> create(modelClass: Class<T>): T { | |
return BooksViewModel( | |
getBooksUseCase, | |
getBookmarksUseCase, | |
bookmarkBookUseCase, | |
unbookmarkBookUseCase, | |
mapper | |
) as T | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment