Handle manga loading better

This commit is contained in:
Syer10
2021-07-13 14:53:54 -04:00
parent c14608ad68
commit 4ac89a6482
2 changed files with 74 additions and 43 deletions

View File

@@ -41,6 +41,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import ca.gosyer.BuildConfig
import ca.gosyer.data.models.Manga
import ca.gosyer.ui.base.components.ErrorScreen
import ca.gosyer.ui.base.components.KtorImage
import ca.gosyer.ui.base.components.LoadingScreen
import ca.gosyer.ui.base.components.Toolbar
@@ -69,48 +70,65 @@ fun MangaMenu(mangaId: Long, backStack: BackStack<Route>? = null) {
val serverUrl by vm.serverUrl.collectAsState()
val dateTimeFormatter by vm.dateTimeFormatter.collectAsState()
Column(Modifier.background(MaterialTheme.colors.background)) {
Toolbar(stringResource("location_manga"), backStack, backStack != null)
Box {
Column(Modifier.background(MaterialTheme.colors.background)) {
Toolbar(stringResource("location_manga"), backStack, backStack != null)
Surface(Modifier.height(40.dp).fillMaxWidth()) {
Row(horizontalArrangement = Arrangement.SpaceBetween) {
Button(onClick = vm::toggleFavorite) {
Text(stringResource(if (manga?.inLibrary == true) "action_remove_favorite" else "action_favorite"))
}
Button(onClick = vm::refreshManga, enabled = !vm.isRefreshing.collectAsState().value) {
Text(stringResource("action_refresh_manga"))
manga.let { manga ->
if (manga != null) {
Surface(Modifier.height(40.dp).fillMaxWidth()) {
Row(horizontalArrangement = Arrangement.SpaceBetween) {
Button(onClick = vm::toggleFavorite) {
Text(stringResource(if (manga.inLibrary) "action_remove_favorite" else "action_favorite"))
}
Button(onClick = vm::refreshManga, enabled = !isLoading) {
Text(stringResource("action_refresh_manga"))
}
}
}
Box {
val state = rememberLazyListState()
LazyColumn(state = state) {
item {
MangaItem(manga, serverUrl)
}
if (chapters.isNotEmpty()) {
items(chapters) { chapter ->
ChapterItem(
chapter,
dateTimeFormatter::format,
onClick = { openReaderMenu(it, manga.id) },
toggleRead = vm::toggleRead,
toggleBookmarked = vm::toggleBookmarked,
markPreviousAsRead = vm::markPreviousRead,
downloadAChapter = vm::downloadChapter,
deleteDownload = vm::deleteDownload,
stopDownload = vm::deleteDownload
)
}
} else if (!isLoading) {
item {
ErrorScreen(
stringResource("no_chapters_found"),
Modifier.height(400.dp).fillMaxWidth(),
retry = vm::loadChapters
)
}
}
}
VerticalScrollbar(
modifier = Modifier.align(Alignment.CenterEnd).fillMaxHeight(),
adapter = rememberScrollbarAdapter(state)
)
}
} else if (!isLoading) {
ErrorScreen(stringResource("failed_manga_fetch"), retry = vm::loadManga)
}
}
}
manga?.let { manga ->
Box {
val state = rememberLazyListState()
LazyColumn(state = state) {
item {
MangaItem(manga, serverUrl)
}
items(chapters) { chapter ->
ChapterItem(
chapter,
dateTimeFormatter::format,
onClick = { openReaderMenu(it, manga.id) },
toggleRead = vm::toggleRead,
toggleBookmarked = vm::toggleBookmarked,
markPreviousAsRead = vm::markPreviousRead,
downloadAChapter = vm::downloadChapter,
deleteDownload = vm::deleteDownload,
stopDownload = vm::deleteDownload
)
}
}
VerticalScrollbar(
modifier = Modifier.align(Alignment.CenterEnd).fillMaxHeight(),
adapter = rememberScrollbarAdapter(state)
)
if (isLoading) {
LoadingScreen()
}
}
if (isLoading) {
LoadingScreen()
}
}
}

View File

@@ -53,9 +53,6 @@ class MangaMenuViewModel @Inject constructor(
private val _isLoading = MutableStateFlow(true)
val isLoading = _isLoading.asStateFlow()
private val _isRefreshing = MutableStateFlow(false)
val isRefreshing = _isRefreshing.asStateFlow()
val dateTimeFormatter = uiPreferences.dateFormat().changes()
.map {
getDateFormat(it)
@@ -84,11 +81,27 @@ class MangaMenuViewModel @Inject constructor(
}
}
fun loadManga() {
scope.launch {
_isLoading.value = true
refreshMangaAsync(params.mangaId).await() to refreshChaptersAsync(params.mangaId).await()
_isLoading.value = false
}
}
fun loadChapters() {
scope.launch {
_isLoading.value = true
refreshChaptersAsync(params.mangaId).await()
_isLoading.value = false
}
}
fun refreshManga() {
scope.launch {
_isRefreshing.value = true
_isLoading.value = true
refreshMangaAsync(params.mangaId, true).await() to refreshChaptersAsync(params.mangaId, true).await()
_isRefreshing.value = false
_isLoading.value = false
}
}