Skip to content

Commit f6a6086

Browse files
AntsyLichimkunet
authored andcommitted
Here lies "currentTab was used multiple times"
Fixes mihonapp#282
1 parent c778b12 commit f6a6086

File tree

8 files changed

+44
-27
lines changed

8 files changed

+44
-27
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ The format is a modified version of [Keep a Changelog](https://keepachangelog.co
1111
- `Other` - for technical stuff.
1212

1313
## [Unreleased]
14+
### Fixed
15+
- Fixed "currentTab was used multiple times"
1416

1517
## [v0.17.0] - 2024-10-26
1618
### Added

app/src/main/java/eu/kanade/presentation/components/TabbedScreen.kt

+2-9
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ import androidx.compose.foundation.layout.calculateStartPadding
77
import androidx.compose.foundation.layout.fillMaxSize
88
import androidx.compose.foundation.layout.padding
99
import androidx.compose.foundation.pager.HorizontalPager
10+
import androidx.compose.foundation.pager.PagerState
1011
import androidx.compose.foundation.pager.rememberPagerState
1112
import androidx.compose.material3.MaterialTheme
1213
import androidx.compose.material3.PrimaryTabRow
1314
import androidx.compose.material3.SnackbarHost
1415
import androidx.compose.material3.SnackbarHostState
1516
import androidx.compose.material3.Tab
1617
import androidx.compose.runtime.Composable
17-
import androidx.compose.runtime.LaunchedEffect
1818
import androidx.compose.runtime.remember
1919
import androidx.compose.runtime.rememberCoroutineScope
2020
import androidx.compose.ui.Alignment
@@ -33,20 +33,13 @@ import tachiyomi.presentation.core.i18n.stringResource
3333
fun TabbedScreen(
3434
titleRes: StringResource,
3535
tabs: ImmutableList<TabContent>,
36-
startIndex: Int? = null,
36+
state: PagerState = rememberPagerState { tabs.size },
3737
searchQuery: String? = null,
3838
onChangeSearchQuery: (String?) -> Unit = {},
3939
) {
4040
val scope = rememberCoroutineScope()
41-
val state = rememberPagerState { tabs.size }
4241
val snackbarHostState = remember { SnackbarHostState() }
4342

44-
LaunchedEffect(startIndex) {
45-
if (startIndex != null) {
46-
state.scrollToPage(startIndex)
47-
}
48-
}
49-
5043
Scaffold(
5144
topBar = {
5245
val tab = tabs[state.currentPage]

app/src/main/java/eu/kanade/tachiyomi/ui/browse/BrowseTab.kt

+26-9
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.ui.browse
33
import androidx.compose.animation.graphics.res.animatedVectorResource
44
import androidx.compose.animation.graphics.res.rememberAnimatedVectorPainter
55
import androidx.compose.animation.graphics.vector.AnimatedImageVector
6+
import androidx.compose.foundation.pager.rememberPagerState
67
import androidx.compose.runtime.Composable
78
import androidx.compose.runtime.LaunchedEffect
89
import androidx.compose.runtime.collectAsState
@@ -22,12 +23,14 @@ import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchScreen
2223
import eu.kanade.tachiyomi.ui.browse.source.sourcesTab
2324
import eu.kanade.tachiyomi.ui.main.MainActivity
2425
import kotlinx.collections.immutable.persistentListOf
26+
import kotlinx.coroutines.channels.BufferOverflow
27+
import kotlinx.coroutines.channels.Channel
28+
import kotlinx.coroutines.flow.collectLatest
29+
import kotlinx.coroutines.flow.receiveAsFlow
2530
import tachiyomi.i18n.MR
2631
import tachiyomi.presentation.core.i18n.stringResource
2732

28-
data class BrowseTab(
29-
private val toExtensions: Boolean = false,
30-
) : Tab {
33+
data object BrowseTab : Tab {
3134

3235
override val options: TabOptions
3336
@Composable
@@ -45,6 +48,12 @@ data class BrowseTab(
4548
navigator.push(GlobalSearchScreen())
4649
}
4750

51+
private val switchToExtensionTabChannel = Channel<Unit>(1, BufferOverflow.DROP_OLDEST)
52+
53+
fun showExtension() {
54+
switchToExtensionTabChannel.trySend(Unit)
55+
}
56+
4857
@Composable
4958
override fun Content() {
5059
val context = LocalContext.current
@@ -53,17 +62,25 @@ data class BrowseTab(
5362
val extensionsScreenModel = rememberScreenModel { ExtensionsScreenModel() }
5463
val extensionsState by extensionsScreenModel.state.collectAsState()
5564

65+
val tabs = persistentListOf(
66+
sourcesTab(),
67+
extensionsTab(extensionsScreenModel),
68+
migrateSourceTab(),
69+
)
70+
71+
val state = rememberPagerState { tabs.size }
72+
5673
TabbedScreen(
5774
titleRes = MR.strings.browse,
58-
tabs = persistentListOf(
59-
sourcesTab(),
60-
extensionsTab(extensionsScreenModel),
61-
migrateSourceTab(),
62-
),
63-
startIndex = 1.takeIf { toExtensions },
75+
tabs = tabs,
76+
state = state,
6477
searchQuery = extensionsState.searchQuery,
6578
onChangeSearchQuery = extensionsScreenModel::search,
6679
)
80+
LaunchedEffect(Unit) {
81+
switchToExtensionTabChannel.receiveAsFlow()
82+
.collectLatest { state.scrollToPage(1) }
83+
}
6784

6885
LaunchedEffect(Unit) {
6986
(context as? MainActivity)?.ready = true

app/src/main/java/eu/kanade/tachiyomi/ui/history/HistoryTab.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import tachiyomi.domain.chapter.model.Chapter
3232
import tachiyomi.i18n.MR
3333
import tachiyomi.presentation.core.i18n.stringResource
3434

35-
object HistoryTab : Tab {
35+
data object HistoryTab : Tab {
3636

3737
private val snackbarHostState = SnackbarHostState()
3838

app/src/main/java/eu/kanade/tachiyomi/ui/home/HomeScreen.kt

+10-5
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,11 @@ object HomeScreen : Screen() {
6969
private const val TAB_FADE_DURATION = 200
7070
private const val TAB_NAVIGATOR_KEY = "HomeTabs"
7171

72-
private val tabs = listOf(
72+
private val TABS = listOf(
7373
LibraryTab,
7474
UpdatesTab,
7575
HistoryTab,
76-
BrowseTab(),
76+
BrowseTab,
7777
MoreTab,
7878
)
7979

@@ -90,7 +90,7 @@ object HomeScreen : Screen() {
9090
startBar = {
9191
if (isTabletUi()) {
9292
NavigationRail {
93-
tabs.fastForEach {
93+
TABS.fastForEach {
9494
NavigationRailItem(it)
9595
}
9696
}
@@ -107,7 +107,7 @@ object HomeScreen : Screen() {
107107
exit = shrinkVertically(),
108108
) {
109109
NavigationBar {
110-
tabs.fastForEach {
110+
TABS.fastForEach {
111111
NavigationBarItem(it)
112112
}
113113
}
@@ -159,7 +159,12 @@ object HomeScreen : Screen() {
159159
is Tab.Library -> LibraryTab
160160
Tab.Updates -> UpdatesTab
161161
Tab.History -> HistoryTab
162-
is Tab.Browse -> BrowseTab(it.toExtensions)
162+
is Tab.Browse -> {
163+
if (it.toExtensions) {
164+
BrowseTab.showExtension()
165+
}
166+
BrowseTab
167+
}
163168
is Tab.More -> MoreTab
164169
}
165170

app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryTab.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ import tachiyomi.presentation.core.screens.EmptyScreenAction
6161
import tachiyomi.presentation.core.screens.LoadingScreen
6262
import tachiyomi.source.local.isLocal
6363

64-
object LibraryTab : Tab {
64+
data object LibraryTab : Tab {
6565

6666
override val options: TabOptions
6767
@Composable

app/src/main/java/eu/kanade/tachiyomi/ui/more/MoreTab.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ import tachiyomi.presentation.core.i18n.stringResource
3838
import uy.kohesive.injekt.Injekt
3939
import uy.kohesive.injekt.api.get
4040

41-
object MoreTab : Tab {
41+
data object MoreTab : Tab {
4242

4343
override val options: TabOptions
4444
@Composable

app/src/main/java/eu/kanade/tachiyomi/ui/updates/UpdatesTab.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import tachiyomi.core.common.i18n.stringResource
3131
import tachiyomi.i18n.MR
3232
import tachiyomi.presentation.core.i18n.stringResource
3333

34-
object UpdatesTab : Tab {
34+
data object UpdatesTab : Tab {
3535

3636
override val options: TabOptions
3737
@Composable

0 commit comments

Comments
 (0)