mirror of
https://github.com/mihonapp/mihon.git
synced 2025-11-11 11:38:56 +01:00
Cleanup logic in UpdatesPresenter (#8035)
This commit is contained in:
@@ -93,8 +93,7 @@ fun UpdateScreen(
|
||||
onMultiBookmarkClicked = presenter::bookmarkUpdates,
|
||||
onMultiMarkAsReadClicked = presenter::markUpdatesRead,
|
||||
onMultiDeleteClicked = {
|
||||
val updateItems = presenter.selected.map { it.item }
|
||||
presenter.dialog = Dialog.DeleteConfirmation(updateItems)
|
||||
presenter.dialog = Dialog.DeleteConfirmation(it)
|
||||
},
|
||||
)
|
||||
},
|
||||
@@ -261,7 +260,7 @@ private fun UpdatesAppBar(
|
||||
|
||||
@Composable
|
||||
private fun UpdatesBottomBar(
|
||||
selected: List<UpdatesUiModel.Item>,
|
||||
selected: List<UpdatesItem>,
|
||||
onDownloadChapter: (List<UpdatesItem>, ChapterDownloadAction) -> Unit,
|
||||
onMultiBookmarkClicked: (List<UpdatesItem>, bookmark: Boolean) -> Unit,
|
||||
onMultiMarkAsReadClicked: (List<UpdatesItem>, read: Boolean) -> Unit,
|
||||
@@ -271,25 +270,25 @@ private fun UpdatesBottomBar(
|
||||
visible = selected.isNotEmpty(),
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
onBookmarkClicked = {
|
||||
onMultiBookmarkClicked.invoke(selected.map { it.item }, true)
|
||||
}.takeIf { selected.any { !it.item.update.bookmark } },
|
||||
onMultiBookmarkClicked.invoke(selected, true)
|
||||
}.takeIf { selected.any { !it.update.bookmark } },
|
||||
onRemoveBookmarkClicked = {
|
||||
onMultiBookmarkClicked.invoke(selected.map { it.item }, false)
|
||||
}.takeIf { selected.all { it.item.update.bookmark } },
|
||||
onMultiBookmarkClicked.invoke(selected, false)
|
||||
}.takeIf { selected.all { it.update.bookmark } },
|
||||
onMarkAsReadClicked = {
|
||||
onMultiMarkAsReadClicked(selected.map { it.item }, true)
|
||||
}.takeIf { selected.any { !it.item.update.read } },
|
||||
onMultiMarkAsReadClicked(selected, true)
|
||||
}.takeIf { selected.any { !it.update.read } },
|
||||
onMarkAsUnreadClicked = {
|
||||
onMultiMarkAsReadClicked(selected.map { it.item }, false)
|
||||
}.takeIf { selected.any { it.item.update.read } },
|
||||
onMultiMarkAsReadClicked(selected, false)
|
||||
}.takeIf { selected.any { it.update.read } },
|
||||
onDownloadClicked = {
|
||||
onDownloadChapter(selected.map { it.item }, ChapterDownloadAction.START)
|
||||
onDownloadChapter(selected, ChapterDownloadAction.START)
|
||||
}.takeIf {
|
||||
selected.any { it.item.downloadStateProvider() != Download.State.DOWNLOADED }
|
||||
selected.any { it.downloadStateProvider() != Download.State.DOWNLOADED }
|
||||
},
|
||||
onDeleteClicked = {
|
||||
onMultiDeleteClicked(selected.map { it.item })
|
||||
}.takeIf { selected.any { it.item.downloadStateProvider() == Download.State.DOWNLOADED } },
|
||||
onMultiDeleteClicked(selected)
|
||||
}.takeIf { selected.any { it.downloadStateProvider() == Download.State.DOWNLOADED } },
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -5,24 +5,47 @@ import androidx.compose.runtime.derivedStateOf
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.setValue
|
||||
import eu.kanade.core.util.insertSeparators
|
||||
import eu.kanade.tachiyomi.ui.recent.updates.UpdatesItem
|
||||
import eu.kanade.tachiyomi.ui.recent.updates.UpdatesPresenter
|
||||
import eu.kanade.tachiyomi.util.lang.toDateKey
|
||||
import java.util.Date
|
||||
|
||||
@Stable
|
||||
interface UpdatesState {
|
||||
val isLoading: Boolean
|
||||
val uiModels: List<UpdatesUiModel>
|
||||
val selected: List<UpdatesUiModel.Item>
|
||||
val items: List<UpdatesItem>
|
||||
val selected: List<UpdatesItem>
|
||||
val selectionMode: Boolean
|
||||
val uiModels: List<UpdatesUiModel>
|
||||
var dialog: UpdatesPresenter.Dialog?
|
||||
}
|
||||
fun UpdatesState(): UpdatesState = UpdatesStateImpl()
|
||||
class UpdatesStateImpl : UpdatesState {
|
||||
override var isLoading: Boolean by mutableStateOf(true)
|
||||
override var uiModels: List<UpdatesUiModel> by mutableStateOf(emptyList())
|
||||
override val selected: List<UpdatesUiModel.Item> by derivedStateOf {
|
||||
uiModels.filterIsInstance<UpdatesUiModel.Item>()
|
||||
.filter { it.item.selected }
|
||||
override var items: List<UpdatesItem> by mutableStateOf(emptyList())
|
||||
override val selected: List<UpdatesItem> by derivedStateOf {
|
||||
items.filter { it.selected }
|
||||
}
|
||||
override val selectionMode: Boolean by derivedStateOf { selected.isNotEmpty() }
|
||||
override val uiModels: List<UpdatesUiModel> by derivedStateOf {
|
||||
items.toUpdateUiModel()
|
||||
}
|
||||
override var dialog: UpdatesPresenter.Dialog? by mutableStateOf(null)
|
||||
}
|
||||
|
||||
fun List<UpdatesItem>.toUpdateUiModel(): List<UpdatesUiModel> {
|
||||
return this.map {
|
||||
UpdatesUiModel.Item(it)
|
||||
}
|
||||
.insertSeparators { before, after ->
|
||||
val beforeDate = before?.item?.update?.dateFetch?.toDateKey() ?: Date(0)
|
||||
val afterDate = after?.item?.update?.dateFetch?.toDateKey() ?: Date(0)
|
||||
when {
|
||||
beforeDate.time != afterDate.time && afterDate.time != 0L ->
|
||||
UpdatesUiModel.Header(afterDate)
|
||||
// Return null to avoid adding a separator between two items.
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user