mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 08:08:55 +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