package eu.kanade.presentation.components import androidx.annotation.StringRes import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.material3.Tab import androidx.compose.material3.TabRow import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import com.google.accompanist.pager.HorizontalPager import com.google.accompanist.pager.rememberPagerState import kotlinx.coroutines.launch @Composable fun TabbedScreen( @StringRes titleRes: Int, tabs: List, startIndex: Int? = null, searchQuery: String? = null, @StringRes placeholderRes: Int? = null, onChangeSearchQuery: (String?) -> Unit = {}, incognitoMode: Boolean, downloadedOnlyMode: Boolean, ) { val scope = rememberCoroutineScope() val state = rememberPagerState() LaunchedEffect(startIndex) { if (startIndex != null) { state.scrollToPage(startIndex) } } Scaffold( topBar = { if (searchQuery == null) { AppBar( title = stringResource(titleRes), actions = { AppBarActions(tabs[state.currentPage].actions) }, ) } else { SearchToolbar( searchQuery = searchQuery, placeholderText = placeholderRes?.let { stringResource(it) }, onChangeSearchQuery = { onChangeSearchQuery(it) }, onClickCloseSearch = { onChangeSearchQuery(null) }, onClickResetSearch = { onChangeSearchQuery("") }, ) } }, ) { paddingValues -> Column(modifier = Modifier.padding(paddingValues)) { TabRow( selectedTabIndex = state.currentPage, indicator = { TabIndicator(it[state.currentPage]) }, ) { tabs.forEachIndexed { index, tab -> Tab( selected = state.currentPage == index, onClick = { scope.launch { state.animateScrollToPage(index) } }, text = { TabText(stringResource(tab.titleRes), tab.badgeNumber, state.currentPage == index) }, ) } } AppStateBanners(downloadedOnlyMode, incognitoMode) HorizontalPager( count = tabs.size, modifier = Modifier.fillMaxSize(), state = state, verticalAlignment = Alignment.Top, ) { page -> tabs[page].content() } } } } data class TabContent( @StringRes val titleRes: Int, val badgeNumber: Int? = null, val actions: List = emptyList(), val content: @Composable () -> Unit, )