diff --git a/app/src/main/java/eu/kanade/presentation/manga/DuplicateMangaDialog.kt b/app/src/main/java/eu/kanade/presentation/manga/DuplicateMangaDialog.kt index e3ff20ad2..859bb5820 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/DuplicateMangaDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/DuplicateMangaDialog.kt @@ -57,3 +57,60 @@ fun DuplicateMangaDialog( }, ) } + +// KMK --> +@Composable +fun AllowDuplicateDialog( + onDismissRequest: () -> Unit, + onAllowDuplicate: () -> Unit, + onSkipDuplicate: () -> Unit, + onOpenManga: () -> Unit = { }, +) { + AlertDialog( + onDismissRequest = onDismissRequest, + dismissButton = { + TextButton(onClick = onDismissRequest) { + Text(text = stringResource(MR.strings.action_cancel)) + } + }, + title = { + Text(text = stringResource(MR.strings.are_you_sure)) + }, + text = { + Text(text = stringResource(MR.strings.confirm_add_duplicate_manga)) + }, + confirmButton = { + FlowRow( + horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), + ) { + TextButton( + onClick = { + onDismissRequest() + onOpenManga() + }, + ) { + Text(text = stringResource(MR.strings.action_show_manga)) + } + + TextButton( + onClick = { + onDismissRequest() + onSkipDuplicate() + }, + ) { + Text(text = stringResource(MR.strings.action_skip_duplicate_manga)) + } + + TextButton( + onClick = { + onDismissRequest() + onAllowDuplicate() + }, + ) { + Text(text = stringResource(MR.strings.action_allow_duplicate_manga)) + } + } + }, + ) +} +// KMK <-- diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreen.kt index 76f5dbcfd..45bd99013 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreen.kt @@ -45,6 +45,7 @@ import eu.kanade.presentation.browse.components.SavedSearchCreateDialog import eu.kanade.presentation.browse.components.SavedSearchDeleteDialog import eu.kanade.presentation.browse.components.SelectionToolbar import eu.kanade.presentation.category.components.ChangeCategoryDialog +import eu.kanade.presentation.manga.AllowDuplicateDialog import eu.kanade.presentation.manga.DuplicateMangaDialog import eu.kanade.presentation.util.AssistContentScreen import eu.kanade.presentation.util.Screen @@ -395,6 +396,17 @@ data class BrowseSourceScreen( }, ) } + is BrowseSourceScreenModel.Dialog.AllowDuplicate -> { + AllowDuplicateDialog( + onDismissRequest = onDismissRequest, + onAllowDuplicate = { + screenModel.addFavoriteDuplicate() + }, + onSkipDuplicate = { + screenModel.addFavoriteDuplicate(skipDuplicate = true) + }, + ) + } // KMK <-- else -> {} } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt index 59a7f33c2..b19ffbde4 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt @@ -477,7 +477,16 @@ open class BrowseSourceScreenModel( fun addFavorite() { screenModelScope.launch { - val mangaList = state.value.selection + if (hasDuplicateLibraryMangas(state.value.selection)) + setDialog(Dialog.AllowDuplicate) + else + addFavoriteDuplicate() + } + } + + fun addFavoriteDuplicate(skipDuplicate: Boolean = false) { + screenModelScope.launch { + val mangaList = if (skipDuplicate) getNotDuplicateLibraryMangas() else state.value.selection val categories = getCategories() val defaultCategoryId = libraryPreferences.defaultCategory().get() val defaultCategory = categories.find { it.id == defaultCategoryId.toLong() } @@ -574,6 +583,18 @@ open class BrowseSourceScreenModel( val common = mangaCategories.reduce { set1, set2 -> set1.intersect(set2) } return mangaCategories.flatten().distinct().subtract(common) } + + private suspend fun getNotDuplicateLibraryMangas(): List { + return state.value.selection.filterNot { manga -> + getDuplicateLibraryManga.await(manga).isNotEmpty() + } + } + + private suspend fun hasDuplicateLibraryMangas(mangas: List): Boolean { + return mangas.fastAny { manga -> + getDuplicateLibraryManga.await(manga).isNotEmpty() + } + } // KMK <-- sealed interface Dialog { @@ -595,6 +616,7 @@ open class BrowseSourceScreenModel( val mangas: List, val initialSelection: ImmutableList>, ) : Dialog + data object AllowDuplicate : Dialog // KMK <-- } diff --git a/i18n/src/commonMain/resources/MR/base/strings.xml b/i18n/src/commonMain/resources/MR/base/strings.xml index 78ef237d9..3d3cc7866 100644 --- a/i18n/src/commonMain/resources/MR/base/strings.xml +++ b/i18n/src/commonMain/resources/MR/base/strings.xml @@ -689,6 +689,8 @@ Source not installed: %1$s Add to library? No description + Allow duplicate + Skip duplicate Chapter %1$s