mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-31 06:17:57 +01:00 
			
		
		
		
	Fix no sources while migrating alongside UI and code cleanup (#2155)
This commit is contained in:
		| @@ -13,7 +13,7 @@ import eu.kanade.presentation.util.Screen | ||||
| import eu.kanade.tachiyomi.ui.manga.MangaScreen | ||||
| import eu.kanade.tachiyomi.util.system.toast | ||||
| import kotlinx.coroutines.flow.collectLatest | ||||
| import mihon.feature.migration.MigrateMangaConfigScreen | ||||
| import mihon.feature.migration.config.MigrationConfigScreen | ||||
| import tachiyomi.i18n.MR | ||||
| import tachiyomi.presentation.core.screens.LoadingScreen | ||||
|  | ||||
| @@ -38,7 +38,7 @@ data class MigrateMangaScreen( | ||||
|             navigateUp = navigator::pop, | ||||
|             title = state.source!!.name, | ||||
|             state = state, | ||||
|             onClickItem = { navigator.push(MigrateMangaConfigScreen(it.id)) }, | ||||
|             onClickItem = { navigator.push(MigrationConfigScreen(it.id)) }, | ||||
|             onClickCover = { navigator.push(MangaScreen(it.id)) }, | ||||
|         ) | ||||
|  | ||||
|   | ||||
| @@ -59,7 +59,7 @@ import eu.kanade.tachiyomi.util.system.toShareIntent | ||||
| import eu.kanade.tachiyomi.util.system.toast | ||||
| import kotlinx.coroutines.launch | ||||
| import logcat.LogPriority | ||||
| import mihon.feature.migration.MigrateMangaConfigScreen | ||||
| import mihon.feature.migration.config.MigrationConfigScreen | ||||
| import tachiyomi.core.common.i18n.stringResource | ||||
| import tachiyomi.core.common.util.lang.withIOContext | ||||
| import tachiyomi.core.common.util.system.logcat | ||||
| @@ -163,7 +163,7 @@ class MangaScreen( | ||||
|                 successState.manga.favorite | ||||
|             }, | ||||
|             onMigrateClicked = { | ||||
|                 navigator.push(MigrateMangaConfigScreen(successState.manga.id)) | ||||
|                 navigator.push(MigrationConfigScreen(successState.manga.id)) | ||||
|             }.takeIf { successState.manga.favorite }, | ||||
|             onEditNotesClicked = { navigator.push(MangaNotesScreen(manga = successState.manga)) }, | ||||
|             onMultiBookmarkClicked = screenModel::bookmarkChapters, | ||||
|   | ||||
| @@ -48,6 +48,17 @@ object LocaleHelper { | ||||
|         return Locale.forLanguageTag(normalizedLang).displayName | ||||
|     } | ||||
|  | ||||
|     fun getShortDisplayName(lang: String?, uppercase: Boolean = false): String { | ||||
|         return when (lang) { | ||||
|             null -> "" | ||||
|             "es-419" -> "es-la" | ||||
|             "zh-CN" -> "zh-hans" | ||||
|             "zh-TW" -> "zh-hant" | ||||
|             else -> lang | ||||
|         } | ||||
|             .let { if (uppercase) it.uppercase(Locale.ENGLISH) else it } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns display name of a string language code. | ||||
|      * | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| package mihon.feature.migration | ||||
| package mihon.feature.migration.config | ||||
| 
 | ||||
| import androidx.compose.foundation.clickable | ||||
| import androidx.compose.foundation.layout.Arrangement | ||||
| @@ -28,7 +28,6 @@ import androidx.compose.runtime.getValue | ||||
| import androidx.compose.runtime.remember | ||||
| import androidx.compose.ui.Alignment | ||||
| import androidx.compose.ui.Modifier | ||||
| import androidx.compose.ui.draw.alpha | ||||
| import androidx.compose.ui.graphics.Color | ||||
| import androidx.compose.ui.text.style.TextOverflow | ||||
| import androidx.compose.ui.unit.dp | ||||
| @@ -47,7 +46,7 @@ import eu.kanade.tachiyomi.source.online.HttpSource | ||||
| import eu.kanade.tachiyomi.ui.browse.migration.search.MigrateSearchScreen | ||||
| import eu.kanade.tachiyomi.util.system.LocaleHelper | ||||
| import kotlinx.collections.immutable.persistentListOf | ||||
| import kotlinx.coroutines.flow.updateAndGet | ||||
| import kotlinx.coroutines.flow.update | ||||
| import sh.calvin.reorderable.ReorderableCollectionItemScope | ||||
| import sh.calvin.reorderable.ReorderableItem | ||||
| import sh.calvin.reorderable.ReorderableLazyListState | ||||
| @@ -58,7 +57,6 @@ import tachiyomi.domain.source.service.SourceManager | ||||
| import tachiyomi.i18n.MR | ||||
| import tachiyomi.presentation.core.components.FastScrollLazyColumn | ||||
| import tachiyomi.presentation.core.components.Pill | ||||
| import tachiyomi.presentation.core.components.material.DISABLED_ALPHA | ||||
| import tachiyomi.presentation.core.components.material.ExtendedFloatingActionButton | ||||
| import tachiyomi.presentation.core.components.material.Scaffold | ||||
| import tachiyomi.presentation.core.components.material.padding | ||||
| @@ -67,7 +65,7 @@ import tachiyomi.presentation.core.util.shouldExpandFAB | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| 
 | ||||
| class MigrateMangaConfigScreen(private val mangaId: Long) : Screen() { | ||||
| class MigrationConfigScreen(private val mangaId: Long) : Screen() { | ||||
| 
 | ||||
|     @Composable | ||||
|     override fun Content() { | ||||
| @@ -118,7 +116,10 @@ class MigrateMangaConfigScreen(private val mangaId: Long) : Screen() { | ||||
|                 ExtendedFloatingActionButton( | ||||
|                     text = { Text(text = stringResource(MR.strings.migrationConfigScreen_continueButtonText)) }, | ||||
|                     icon = { Icon(imageVector = Icons.AutoMirrored.Outlined.ArrowForward, contentDescription = null) }, | ||||
|                     onClick = { navigator.replace(MigrateSearchScreen(mangaId)) }, | ||||
|                     onClick = { | ||||
|                         screenModel.saveSources() | ||||
|                         navigator.replace(MigrateSearchScreen(mangaId)) | ||||
|                     }, | ||||
|                     expanded = lazyListState.shouldExpandFAB(), | ||||
|                 ) | ||||
|             }, | ||||
| @@ -162,9 +163,8 @@ class MigrateMangaConfigScreen(private val mangaId: Long) : Screen() { | ||||
|                         SourceItemContainer( | ||||
|                             firstItem = index == 0, | ||||
|                             lastItem = index == (sources.size - 1), | ||||
|                             source = item.source, | ||||
|                             source = item, | ||||
|                             showLanguage = showLanguage, | ||||
|                             isSelected = item.isSelected, | ||||
|                             dragEnabled = selectedSourceList && sources.size > 1, | ||||
|                             state = reorderableState, | ||||
|                             key = { if (selectedSourceList) it.id else "available-${it.id}" }, | ||||
| @@ -180,12 +180,11 @@ class MigrateMangaConfigScreen(private val mangaId: Long) : Screen() { | ||||
|     private fun LazyItemScope.SourceItemContainer( | ||||
|         firstItem: Boolean, | ||||
|         lastItem: Boolean, | ||||
|         source: Source, | ||||
|         source: MigrationSource, | ||||
|         showLanguage: Boolean, | ||||
|         isSelected: Boolean, | ||||
|         dragEnabled: Boolean, | ||||
|         state: ReorderableLazyListState, | ||||
|         key: (Source) -> Any, | ||||
|         key: (MigrationSource) -> Any, | ||||
|         onClick: () -> Unit, | ||||
|     ) { | ||||
|         val shape = remember(firstItem, lastItem) { | ||||
| @@ -208,7 +207,6 @@ class MigrateMangaConfigScreen(private val mangaId: Long) : Screen() { | ||||
|                 SourceItem( | ||||
|                     source = source, | ||||
|                     showLanguage = showLanguage, | ||||
|                     isSelected = isSelected, | ||||
|                     dragEnabled = dragEnabled, | ||||
|                     scope = this@ReorderableItem, | ||||
|                     onClick = onClick, | ||||
| @@ -223,9 +221,8 @@ class MigrateMangaConfigScreen(private val mangaId: Long) : Screen() { | ||||
| 
 | ||||
|     @Composable | ||||
|     private fun SourceItem( | ||||
|         source: Source, | ||||
|         source: MigrationSource, | ||||
|         showLanguage: Boolean, | ||||
|         isSelected: Boolean, | ||||
|         dragEnabled: Boolean, | ||||
|         scope: ReorderableCollectionItemScope, | ||||
|         onClick: () -> Unit, | ||||
| @@ -236,7 +233,7 @@ class MigrateMangaConfigScreen(private val mangaId: Long) : Screen() { | ||||
|                     horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), | ||||
|                     verticalAlignment = Alignment.CenterVertically, | ||||
|                 ) { | ||||
|                     SourceIcon(source = source) | ||||
|                     SourceIcon(source = source.source) | ||||
|                     Text( | ||||
|                         text = source.name, | ||||
|                         maxLines = 1, | ||||
| @@ -246,7 +243,7 @@ class MigrateMangaConfigScreen(private val mangaId: Long) : Screen() { | ||||
|                     ) | ||||
|                     if (showLanguage) { | ||||
|                         Pill( | ||||
|                             text = LocaleHelper.getLocalizedDisplayName(source.lang), | ||||
|                             text = LocaleHelper.getShortDisplayName(source.shortLanguage, uppercase = true), | ||||
|                             style = MaterialTheme.typography.bodySmall, | ||||
|                         ) | ||||
|                     } | ||||
| @@ -268,9 +265,7 @@ class MigrateMangaConfigScreen(private val mangaId: Long) : Screen() { | ||||
|             colors = ListItemDefaults.colors( | ||||
|                 containerColor = Color.Transparent, | ||||
|             ), | ||||
|             modifier = Modifier | ||||
|                 .clickable(onClick = onClick) | ||||
|                 .alpha(if (isSelected) 1f else DISABLED_ALPHA), | ||||
|             modifier = Modifier.clickable(onClick = onClick), | ||||
|         ) | ||||
|     } | ||||
| 
 | ||||
| @@ -288,22 +283,18 @@ class MigrateMangaConfigScreen(private val mangaId: Long) : Screen() { | ||||
|         private val sourcesComparator = { includedSources: List<Long> -> | ||||
|             compareBy<MigrationSource>( | ||||
|                 { !it.isSelected }, | ||||
|                 { includedSources.indexOf(it.source.id) }, | ||||
|                 { with(it.source) { "$name (${LocaleHelper.getLocalizedDisplayName(lang)})" } }, | ||||
|                 { includedSources.indexOf(it.id) }, | ||||
|                 { with(it) { "$name ($shortLanguage)" } }, | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         private fun updateSources(save: Boolean = true, action: (List<MigrationSource>) -> List<MigrationSource>) { | ||||
|             val state = mutableState.updateAndGet { state -> | ||||
|             mutableState.update { state -> | ||||
|                 val updatedSources = action(state.sources) | ||||
|                 val includedSources = updatedSources.mapNotNull { if (!it.isSelected) null else it.id } | ||||
|                 state.copy(sources = updatedSources.sortedWith(sourcesComparator(includedSources))) | ||||
|             } | ||||
|             if (!save) return | ||||
|             state.sources | ||||
|                 .filter { source -> source.isSelected } | ||||
|                 .map { source -> source.source.id } | ||||
|                 .let { sources -> sourcePreferences.migrationSources().set(sources) } | ||||
|             if (save) saveSources() | ||||
|         } | ||||
| 
 | ||||
|         private fun initSources() { | ||||
| @@ -374,6 +365,13 @@ class MigrateMangaConfigScreen(private val mangaId: Long) : Screen() { | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         fun saveSources() { | ||||
|             state.value.sources | ||||
|                 .filter { source -> source.isSelected } | ||||
|                 .map { source -> source.source.id } | ||||
|                 .let { sources -> sourcePreferences.migrationSources().set(sources) } | ||||
|         } | ||||
| 
 | ||||
|         data class State( | ||||
|             val sources: List<MigrationSource> = emptyList(), | ||||
|         ) | ||||
| @@ -390,7 +388,12 @@ class MigrateMangaConfigScreen(private val mangaId: Long) : Screen() { | ||||
|         val source: Source, | ||||
|         val isSelected: Boolean, | ||||
|     ) { | ||||
|         val id = source.id | ||||
|         val visualName = source.visualName | ||||
|         val id: Long | ||||
|             inline get() = source.id | ||||
| 
 | ||||
|         val name: String | ||||
|             inline get() = source.name | ||||
| 
 | ||||
|         val shortLanguage: String = LocaleHelper.getShortDisplayName(source.lang) | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user