mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-31 14:27:57 +01:00 
			
		
		
		
	Reimplement extensions search
Not sure if I should abstract this out to per-tab though. Maybe when we need it...
This commit is contained in:
		| @@ -21,6 +21,8 @@ fun TabbedScreen( | ||||
|     @StringRes titleRes: Int, | ||||
|     tabs: List<TabContent>, | ||||
|     startIndex: Int? = null, | ||||
|     searchQuery: String? = null, | ||||
|     onChangeSearchQuery: (String?) -> Unit = {}, | ||||
|     incognitoMode: Boolean, | ||||
|     downloadedOnlyMode: Boolean, | ||||
| ) { | ||||
| @@ -35,12 +37,27 @@ fun TabbedScreen( | ||||
|  | ||||
|     Scaffold( | ||||
|         topBar = { | ||||
|             AppBar( | ||||
|                 title = stringResource(titleRes), | ||||
|                 actions = { | ||||
|                     AppBarActions(tabs[state.currentPage].actions) | ||||
|                 }, | ||||
|             ) | ||||
|             if (searchQuery == null) { | ||||
|                 AppBar( | ||||
|                     title = stringResource(titleRes), | ||||
|                     actions = { | ||||
|                         AppBarActions(tabs[state.currentPage].actions) | ||||
|                     }, | ||||
|                 ) | ||||
|             } else { | ||||
|                 SearchToolbar( | ||||
|                     searchQuery = searchQuery, | ||||
|                     onChangeSearchQuery = { | ||||
|                         onChangeSearchQuery(it) | ||||
|                     }, | ||||
|                     onClickCloseSearch = { | ||||
|                         onChangeSearchQuery(null) | ||||
|                     }, | ||||
|                     onClickResetSearch = { | ||||
|                         onChangeSearchQuery("") | ||||
|                     }, | ||||
|                 ) | ||||
|             } | ||||
|         }, | ||||
|     ) { paddingValues -> | ||||
|         Column(modifier = Modifier.padding(paddingValues)) { | ||||
|   | ||||
| @@ -5,6 +5,8 @@ import android.os.Bundle | ||||
| import android.view.View | ||||
| import androidx.compose.runtime.Composable | ||||
| import androidx.compose.runtime.LaunchedEffect | ||||
| import androidx.compose.runtime.collectAsState | ||||
| import androidx.compose.runtime.getValue | ||||
| import androidx.core.os.bundleOf | ||||
| import eu.kanade.presentation.components.TabbedScreen | ||||
| import eu.kanade.tachiyomi.R | ||||
| @@ -31,6 +33,8 @@ class BrowseController : FullComposeController<BrowsePresenter>, RootController | ||||
|  | ||||
|     @Composable | ||||
|     override fun ComposeContent() { | ||||
|         val query by presenter.extensionsPresenter.query.collectAsState() | ||||
|  | ||||
|         TabbedScreen( | ||||
|             titleRes = R.string.browse, | ||||
|             tabs = listOf( | ||||
| @@ -39,6 +43,8 @@ class BrowseController : FullComposeController<BrowsePresenter>, RootController | ||||
|                 migrateSourcesTab(router, presenter.migrationSourcesPresenter), | ||||
|             ), | ||||
|             startIndex = 1.takeIf { toExtensions }, | ||||
|             searchQuery = query, | ||||
|             onChangeSearchQuery = { presenter.extensionsPresenter.search(it) }, | ||||
|             incognitoMode = presenter.isIncognitoMode, | ||||
|             downloadedOnlyMode = presenter.isDownloadOnly, | ||||
|         ) | ||||
|   | ||||
| @@ -16,6 +16,8 @@ import eu.kanade.tachiyomi.util.lang.launchIO | ||||
| import eu.kanade.tachiyomi.util.system.LocaleHelper | ||||
| import kotlinx.coroutines.CoroutineScope | ||||
| import kotlinx.coroutines.flow.MutableStateFlow | ||||
| import kotlinx.coroutines.flow.StateFlow | ||||
| import kotlinx.coroutines.flow.asStateFlow | ||||
| import kotlinx.coroutines.flow.collectLatest | ||||
| import kotlinx.coroutines.flow.combine | ||||
| import kotlinx.coroutines.flow.launchIn | ||||
| @@ -33,7 +35,8 @@ class ExtensionsPresenter( | ||||
|     private val getExtensions: GetExtensionsByType = Injekt.get(), | ||||
| ) : ExtensionsState by state { | ||||
|  | ||||
|     private val _query: MutableStateFlow<String> = MutableStateFlow("") | ||||
|     private val _query: MutableStateFlow<String?> = MutableStateFlow(null) | ||||
|     val query: StateFlow<String?> = _query.asStateFlow() | ||||
|  | ||||
|     private var _currentDownloads = MutableStateFlow<Map<String, InstallStep>>(hashMapOf()) | ||||
|  | ||||
| @@ -77,8 +80,10 @@ class ExtensionsPresenter( | ||||
|                 getExtensions.subscribe(), | ||||
|                 _currentDownloads, | ||||
|             ) { query, (_updates, _installed, _available, _untrusted), downloads -> | ||||
|                 val searchQuery = query ?: "" | ||||
|  | ||||
|                 val languagesWithExtensions = _available | ||||
|                     .filter(queryFilter(query)) | ||||
|                     .filter(queryFilter(searchQuery)) | ||||
|                     .groupBy { LocaleHelper.getSourceDisplayName(it.lang, context) } | ||||
|                     .toSortedMap() | ||||
|                     .flatMap { (key, value) -> | ||||
| @@ -90,14 +95,14 @@ class ExtensionsPresenter( | ||||
|  | ||||
|                 val items = mutableListOf<ExtensionUiModel>() | ||||
|  | ||||
|                 val updates = _updates.filter(queryFilter(query)).map(extensionMapper(downloads)) | ||||
|                 val updates = _updates.filter(queryFilter(searchQuery)).map(extensionMapper(downloads)) | ||||
|                 if (updates.isNotEmpty()) { | ||||
|                     items.add(ExtensionUiModel.Header.Resource(R.string.ext_updates_pending)) | ||||
|                     items.addAll(updates) | ||||
|                 } | ||||
|  | ||||
|                 val installed = _installed.filter(queryFilter(query)).map(extensionMapper(downloads)) | ||||
|                 val untrusted = _untrusted.filter(queryFilter(query)).map(extensionMapper(downloads)) | ||||
|                 val installed = _installed.filter(queryFilter(searchQuery)).map(extensionMapper(downloads)) | ||||
|                 val untrusted = _untrusted.filter(queryFilter(searchQuery)).map(extensionMapper(downloads)) | ||||
|                 if (installed.isNotEmpty() || untrusted.isNotEmpty()) { | ||||
|                     items.add(ExtensionUiModel.Header.Resource(R.string.ext_installed)) | ||||
|                     items.addAll(installed) | ||||
| @@ -122,7 +127,7 @@ class ExtensionsPresenter( | ||||
|             .launchIn(presenterScope) | ||||
|     } | ||||
|  | ||||
|     fun search(query: String) { | ||||
|     fun search(query: String?) { | ||||
|         presenterScope.launchIO { | ||||
|             _query.emit(query) | ||||
|         } | ||||
|   | ||||
| @@ -25,10 +25,7 @@ fun extensionsTab( | ||||
|         AppBar.Action( | ||||
|             title = stringResource(R.string.action_search), | ||||
|             icon = Icons.Outlined.Search, | ||||
|             onClick = { | ||||
|                 // TODO: extensions search | ||||
|                 // presenter.search(query) | ||||
|             }, | ||||
|             onClick = { presenter.search("") }, | ||||
|         ), | ||||
|  | ||||
|         AppBar.Action( | ||||
|   | ||||
		Reference in New Issue
	
	Block a user