mirror of
https://github.com/anyproto/anytype-kotlin.git
synced 2025-06-08 05:47:05 +09:00
DROID-2734 Global search | Save last search phrase (#1518)
This commit is contained in:
parent
6bb9ef1716
commit
fdbdc20f21
35 changed files with 403 additions and 76 deletions
|
@ -82,6 +82,7 @@ import com.anytypeio.anytype.domain.page.bookmark.CreateBookmarkBlock
|
|||
import com.anytypeio.anytype.domain.page.bookmark.SetupBookmark
|
||||
import com.anytypeio.anytype.domain.relations.AddRelationToObject
|
||||
import com.anytypeio.anytype.domain.relations.SetRelationKey
|
||||
import com.anytypeio.anytype.domain.search.GetLastSearchQuery
|
||||
import com.anytypeio.anytype.domain.search.SearchObjects
|
||||
import com.anytypeio.anytype.domain.sets.FindObjectSetForType
|
||||
import com.anytypeio.anytype.domain.table.CreateTable
|
||||
|
@ -297,6 +298,9 @@ open class EditorTestSetup {
|
|||
@Mock
|
||||
lateinit var spaceSyncAndP2PStatusProvider: SpaceSyncAndP2PStatusProvider
|
||||
|
||||
@Mock
|
||||
lateinit var getLastSearchQuery: GetLastSearchQuery
|
||||
|
||||
lateinit var interceptFileLimitEvents: InterceptFileLimitEvents
|
||||
|
||||
lateinit var addRelationToObject: AddRelationToObject
|
||||
|
@ -506,7 +510,8 @@ open class EditorTestSetup {
|
|||
syncStatusProvider = spaceSyncAndP2PStatusProvider,
|
||||
analyticSpaceHelperDelegate = analyticSpaceHelperDelegate,
|
||||
clearLastOpenedObject = clearLastOpenedObject,
|
||||
getNetworkMode = getNetworkMode
|
||||
getNetworkMode = getNetworkMode,
|
||||
getLastSearchQuery = getLastSearchQuery
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
@ -48,6 +48,7 @@ import com.anytypeio.anytype.domain.page.CloseBlock
|
|||
import com.anytypeio.anytype.domain.page.CreateObject
|
||||
import com.anytypeio.anytype.domain.search.CancelSearchSubscription
|
||||
import com.anytypeio.anytype.domain.search.DataViewSubscriptionContainer
|
||||
import com.anytypeio.anytype.domain.search.GetLastSearchQuery
|
||||
import com.anytypeio.anytype.domain.search.SubscriptionEventChannel
|
||||
import com.anytypeio.anytype.domain.sets.OpenObjectSet
|
||||
import com.anytypeio.anytype.domain.sets.SetQueryToObjectSet
|
||||
|
@ -185,6 +186,9 @@ abstract class TestObjectSetSetup {
|
|||
@Mock
|
||||
lateinit var clearLastOpenedObject: ClearLastOpenedObject
|
||||
|
||||
@Mock
|
||||
lateinit var getLastSearchQuery: GetLastSearchQuery
|
||||
|
||||
private lateinit var getTemplates: GetTemplates
|
||||
private lateinit var getDefaultObjectType: GetDefaultObjectType
|
||||
|
||||
|
@ -312,7 +316,8 @@ abstract class TestObjectSetSetup {
|
|||
permissions = permissions,
|
||||
analyticSpaceHelperDelegate = analyticSpaceHelperDelegate,
|
||||
spaceSyncAndP2PStatusProvider = spaceSyncAndP2PStatusProvider,
|
||||
clearLastOpenedObject = clearLastOpenedObject
|
||||
clearLastOpenedObject = clearLastOpenedObject,
|
||||
getLastSearchQuery = getLastSearchQuery
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
@ -110,6 +110,7 @@ import com.anytypeio.anytype.presentation.objects.SelectObjectTypeViewModel
|
|||
import com.anytypeio.anytype.presentation.relations.option.CreateOrEditOptionViewModel
|
||||
import com.anytypeio.anytype.presentation.relations.value.`object`.ObjectValueViewModel
|
||||
import com.anytypeio.anytype.presentation.relations.value.tagstatus.TagOrStatusValueViewModel
|
||||
import com.anytypeio.anytype.presentation.search.GlobalSearchViewModel
|
||||
import com.anytypeio.anytype.presentation.sets.ObjectSetViewModel
|
||||
import com.anytypeio.anytype.presentation.spaces.SpaceSettingsViewModel
|
||||
import com.anytypeio.anytype.ui.relations.RelationEditParameters
|
||||
|
@ -322,10 +323,10 @@ class ComponentManager(
|
|||
.build()
|
||||
}
|
||||
|
||||
val globalSearchComponent = Component {
|
||||
val globalSearchComponent = ComponentWithParams { params: GlobalSearchViewModel.VmParams ->
|
||||
DaggerGlobalSearchComponent
|
||||
.factory()
|
||||
.create(findComponentDependencies())
|
||||
.create(params, findComponentDependencies())
|
||||
}
|
||||
|
||||
val objectSetComponent = ComponentMapWithParam { param: DefaultComponentParam ->
|
||||
|
|
|
@ -80,6 +80,7 @@ import com.anytypeio.anytype.domain.page.bookmark.SetupBookmark
|
|||
import com.anytypeio.anytype.domain.relations.AddFileToObject
|
||||
import com.anytypeio.anytype.domain.relations.AddRelationToObject
|
||||
import com.anytypeio.anytype.domain.relations.SetRelationKey
|
||||
import com.anytypeio.anytype.domain.search.GetLastSearchQuery
|
||||
import com.anytypeio.anytype.domain.search.SearchObjects
|
||||
import com.anytypeio.anytype.domain.sets.FindObjectSetForType
|
||||
import com.anytypeio.anytype.domain.table.CreateTable
|
||||
|
@ -292,7 +293,8 @@ object EditorSessionModule {
|
|||
analyticSpaceHelperDelegate: AnalyticSpaceHelperDelegate,
|
||||
syncStatusProvider: SpaceSyncAndP2PStatusProvider,
|
||||
getNetworkMode: GetNetworkMode,
|
||||
clearLastOpenedObject: ClearLastOpenedObject
|
||||
clearLastOpenedObject: ClearLastOpenedObject,
|
||||
getLastSearchQuery: GetLastSearchQuery
|
||||
): EditorViewModelFactory = EditorViewModelFactory(
|
||||
params = params,
|
||||
permissions = permissions,
|
||||
|
@ -338,7 +340,8 @@ object EditorSessionModule {
|
|||
getNetworkMode = getNetworkMode,
|
||||
analyticSpaceHelperDelegate = analyticSpaceHelperDelegate,
|
||||
clearLastOpenedObject = clearLastOpenedObject,
|
||||
syncStatusProvider = syncStatusProvider
|
||||
syncStatusProvider = syncStatusProvider,
|
||||
getLastSearchQuery = getLastSearchQuery
|
||||
)
|
||||
|
||||
@JvmStatic
|
||||
|
@ -1201,6 +1204,14 @@ object EditorUseCaseModule {
|
|||
spaceManager = spaceManager
|
||||
)
|
||||
|
||||
@JvmStatic
|
||||
@Provides
|
||||
@PerScreen
|
||||
fun provideGetLastSearchQueryUseCase(
|
||||
repo: UserSettingsRepository,
|
||||
dispatchers: AppCoroutineDispatchers
|
||||
): GetLastSearchQuery = GetLastSearchQuery(repo, dispatchers)
|
||||
|
||||
@Module
|
||||
interface Bindings {
|
||||
|
||||
|
|
|
@ -57,6 +57,7 @@ import com.anytypeio.anytype.domain.relations.AddRelationToObject
|
|||
import com.anytypeio.anytype.domain.relations.DeleteRelationFromDataView
|
||||
import com.anytypeio.anytype.domain.search.CancelSearchSubscription
|
||||
import com.anytypeio.anytype.domain.search.DataViewSubscriptionContainer
|
||||
import com.anytypeio.anytype.domain.search.GetLastSearchQuery
|
||||
import com.anytypeio.anytype.domain.search.SearchObjects
|
||||
import com.anytypeio.anytype.domain.search.SubscriptionEventChannel
|
||||
import com.anytypeio.anytype.domain.sets.OpenObjectSet
|
||||
|
@ -245,7 +246,8 @@ object ObjectSetModule {
|
|||
permissions: UserPermissionProvider,
|
||||
clearLastOpenedObject: ClearLastOpenedObject,
|
||||
analyticSpaceHelperDelegate: AnalyticSpaceHelperDelegate,
|
||||
spaceSyncAndP2PStatusProvider: SpaceSyncAndP2PStatusProvider
|
||||
spaceSyncAndP2PStatusProvider: SpaceSyncAndP2PStatusProvider,
|
||||
getLastSearchQuery: GetLastSearchQuery
|
||||
): ObjectSetViewModelFactory = ObjectSetViewModelFactory(
|
||||
params = params,
|
||||
openObjectSet = openObjectSet,
|
||||
|
@ -287,9 +289,18 @@ object ObjectSetModule {
|
|||
permissions = permissions,
|
||||
analyticSpaceHelperDelegate = analyticSpaceHelperDelegate,
|
||||
spaceSyncAndP2PStatusProvider = spaceSyncAndP2PStatusProvider,
|
||||
clearLastOpenedObject = clearLastOpenedObject
|
||||
clearLastOpenedObject = clearLastOpenedObject,
|
||||
getLastSearchQuery = getLastSearchQuery
|
||||
)
|
||||
|
||||
@JvmStatic
|
||||
@Provides
|
||||
@PerScreen
|
||||
fun provideGetLastSearchQuery(
|
||||
repo: UserSettingsRepository,
|
||||
dispatchers: AppCoroutineDispatchers
|
||||
): GetLastSearchQuery = GetLastSearchQuery(repo, dispatchers)
|
||||
|
||||
@JvmStatic
|
||||
@Provides
|
||||
@PerScreen
|
||||
|
|
|
@ -6,14 +6,15 @@ import com.anytypeio.anytype.core_utils.di.scope.PerScreen
|
|||
import com.anytypeio.anytype.di.common.ComponentDependencies
|
||||
import com.anytypeio.anytype.domain.base.AppCoroutineDispatchers
|
||||
import com.anytypeio.anytype.domain.block.repo.BlockRepository
|
||||
import com.anytypeio.anytype.domain.config.UserSettingsRepository
|
||||
import com.anytypeio.anytype.domain.misc.UrlBuilder
|
||||
import com.anytypeio.anytype.domain.objects.StoreOfObjectTypes
|
||||
import com.anytypeio.anytype.domain.objects.StoreOfRelations
|
||||
import com.anytypeio.anytype.domain.workspace.SpaceManager
|
||||
import com.anytypeio.anytype.presentation.analytics.AnalyticSpaceHelperDelegate
|
||||
import com.anytypeio.anytype.presentation.search.GlobalSearchViewModel
|
||||
import com.anytypeio.anytype.ui.search.GlobalSearchFragment
|
||||
import dagger.Binds
|
||||
import dagger.BindsInstance
|
||||
import dagger.Component
|
||||
import dagger.Module
|
||||
|
||||
|
@ -28,8 +29,12 @@ import dagger.Module
|
|||
interface GlobalSearchComponent {
|
||||
@Component.Factory
|
||||
interface Factory {
|
||||
fun create(dependencies: GlobalSearchDependencies): GlobalSearchComponent
|
||||
fun create(
|
||||
@BindsInstance vmParams: GlobalSearchViewModel.VmParams,
|
||||
dependencies: GlobalSearchDependencies
|
||||
): GlobalSearchComponent
|
||||
}
|
||||
|
||||
fun inject(fragment: GlobalSearchFragment)
|
||||
}
|
||||
|
||||
|
@ -49,7 +54,7 @@ interface GlobalSearchDependencies : ComponentDependencies {
|
|||
fun dispatchers(): AppCoroutineDispatchers
|
||||
fun storeOfObjectTypes(): StoreOfObjectTypes
|
||||
fun storeOfRelations(): StoreOfRelations
|
||||
fun spaceManager(): SpaceManager
|
||||
fun analytics(): Analytics
|
||||
fun analyticsHelper() : AnalyticSpaceHelperDelegate
|
||||
fun analyticsHelper(): AnalyticSpaceHelperDelegate
|
||||
fun userSettingsRepository(): UserSettingsRepository
|
||||
}
|
|
@ -12,6 +12,7 @@ import com.anytypeio.anytype.ui.auth.account.DeletedAccountFragment
|
|||
import com.anytypeio.anytype.ui.editor.EditorFragment
|
||||
import com.anytypeio.anytype.ui.editor.EditorModalFragment
|
||||
import com.anytypeio.anytype.ui.library.LibraryFragment
|
||||
import com.anytypeio.anytype.ui.search.GlobalSearchFragment
|
||||
import com.anytypeio.anytype.ui.sets.ObjectSetFragment
|
||||
import com.anytypeio.anytype.ui.settings.RemoteFilesManageFragment
|
||||
import com.anytypeio.anytype.ui.templates.EditorTemplateFragment.Companion.TYPE_TEMPLATE_EDIT
|
||||
|
@ -134,11 +135,17 @@ class Navigator : AppNavigation {
|
|||
}
|
||||
}
|
||||
|
||||
override fun openPageSearch() {
|
||||
override fun openPageSearch(initialQuery: String, space: Id) {
|
||||
// Old search
|
||||
// navController?.navigate(R.id.pageSearchFragment)
|
||||
// Uncomment to use new search
|
||||
navController?.navigate(R.id.globalSearchScreen)
|
||||
navController?.navigate(
|
||||
R.id.globalSearchScreen,
|
||||
GlobalSearchFragment.args(
|
||||
initialQuery = initialQuery,
|
||||
space = space
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
override fun openObjectSet(
|
||||
|
|
|
@ -38,7 +38,10 @@ class NavigationRouter(
|
|||
)
|
||||
is AppNavigation.Command.Exit -> navigation.exit()
|
||||
is AppNavigation.Command.ExitToDesktop -> navigation.exitToDesktop()
|
||||
is AppNavigation.Command.OpenPageSearch -> navigation.openPageSearch()
|
||||
is AppNavigation.Command.OpenPageSearch -> navigation.openPageSearch(
|
||||
initialQuery = command.initialQuery,
|
||||
space = command.space
|
||||
)
|
||||
is AppNavigation.Command.OpenUpdateAppScreen -> navigation.openUpdateAppScreen()
|
||||
is AppNavigation.Command.DeletedAccountScreen -> navigation.deletedAccountScreen(
|
||||
command.deadline
|
||||
|
|
|
@ -92,10 +92,7 @@ class HomeScreenFragment : BaseComposeFragment() {
|
|||
onWidgetSourceClicked = vm::onWidgetSourceClicked,
|
||||
onChangeWidgetView = vm::onChangeCurrentWidgetView,
|
||||
onToggleExpandedWidgetState = vm::onToggleCollapsedWidgetState,
|
||||
onSearchClicked = {
|
||||
vm.onSearchIconClicked()
|
||||
runCatching { navigation().openPageSearch() }
|
||||
},
|
||||
onSearchClicked = vm::onSearchIconClicked,
|
||||
onLibraryClicked = {
|
||||
vm.onLibraryClicked()
|
||||
},
|
||||
|
@ -322,6 +319,16 @@ class HomeScreenFragment : BaseComposeFragment() {
|
|||
}
|
||||
dialog.show(childFragmentManager, "object-create-dialog")
|
||||
}
|
||||
is Command.OpenGlobalSearchScreen -> {
|
||||
runCatching {
|
||||
navigation().openPageSearch(
|
||||
initialQuery = command.initialQuery,
|
||||
space = command.space
|
||||
)
|
||||
}.onFailure {
|
||||
Timber.e(it, "Error while opening global search screen")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -4,17 +4,20 @@ import android.os.Bundle
|
|||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.compose.foundation.layout.ExperimentalLayoutApi
|
||||
import androidx.compose.material.MaterialTheme
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.rememberCoroutineScope
|
||||
import androidx.compose.ui.platform.ComposeView
|
||||
import androidx.compose.ui.platform.ViewCompositionStrategy
|
||||
import androidx.core.os.bundleOf
|
||||
import androidx.fragment.app.viewModels
|
||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||
import androidx.navigation.fragment.findNavController
|
||||
import com.anytypeio.anytype.R
|
||||
import com.anytypeio.anytype.core_models.Id
|
||||
import com.anytypeio.anytype.core_models.primitives.SpaceId
|
||||
import com.anytypeio.anytype.core_ui.extensions.isKeyboardVisible
|
||||
import com.anytypeio.anytype.core_utils.ext.argString
|
||||
import com.anytypeio.anytype.core_utils.ext.setupBottomSheetBehavior
|
||||
import com.anytypeio.anytype.core_utils.ui.BaseBottomSheetComposeFragment
|
||||
import com.anytypeio.anytype.di.common.componentManager
|
||||
|
@ -34,6 +37,9 @@ class GlobalSearchFragment : BaseBottomSheetComposeFragment() {
|
|||
|
||||
private val vm by viewModels<GlobalSearchViewModel> { factory }
|
||||
|
||||
private val initialQuery get() = argString(ARG_INITIAL_STATE)
|
||||
private val space get() = argString(ARG_SPACE)
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater,
|
||||
container: ViewGroup?,
|
||||
|
@ -64,7 +70,7 @@ class GlobalSearchFragment : BaseBottomSheetComposeFragment() {
|
|||
}
|
||||
LaunchedEffect(Unit) {
|
||||
vm.navigation.collect { nav ->
|
||||
when(nav) {
|
||||
when (nav) {
|
||||
is OpenObjectNavigation.OpenEditor -> {
|
||||
findNavController().navigate(
|
||||
R.id.objectNavigation,
|
||||
|
@ -74,6 +80,7 @@ class GlobalSearchFragment : BaseBottomSheetComposeFragment() {
|
|||
)
|
||||
)
|
||||
}
|
||||
|
||||
is OpenObjectNavigation.OpenDataView -> {
|
||||
findNavController().navigate(
|
||||
R.id.dataViewNavigation,
|
||||
|
@ -83,6 +90,7 @@ class GlobalSearchFragment : BaseBottomSheetComposeFragment() {
|
|||
)
|
||||
)
|
||||
}
|
||||
|
||||
else -> {
|
||||
// Do nothing.
|
||||
}
|
||||
|
@ -98,13 +106,23 @@ class GlobalSearchFragment : BaseBottomSheetComposeFragment() {
|
|||
}
|
||||
|
||||
override fun injectDependencies() {
|
||||
componentManager().globalSearchComponent.get().inject(this)
|
||||
val params = GlobalSearchViewModel.VmParams(
|
||||
initialQuery = initialQuery,
|
||||
space = SpaceId(space)
|
||||
)
|
||||
componentManager().globalSearchComponent.get(params).inject(this)
|
||||
}
|
||||
|
||||
override fun releaseDependencies() {
|
||||
componentManager().globalSearchComponent.release()
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val KEYBOARD_HIDE_DELAY = 300L
|
||||
|
||||
const val ARG_INITIAL_STATE = "arg.global.search.initial_state"
|
||||
const val ARG_SPACE = "arg.global.search.space"
|
||||
fun args(initialQuery: String, space: Id): Bundle =
|
||||
bundleOf(ARG_INITIAL_STATE to initialQuery, ARG_SPACE to space)
|
||||
}
|
||||
}
|
|
@ -58,6 +58,7 @@ import androidx.compose.ui.res.painterResource
|
|||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.AnnotatedString
|
||||
import androidx.compose.ui.text.SpanStyle
|
||||
import androidx.compose.ui.text.TextRange
|
||||
import androidx.compose.ui.text.TextStyle
|
||||
import androidx.compose.ui.text.buildAnnotatedString
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
|
@ -128,6 +129,10 @@ fun GlobalSearchScreen(
|
|||
|
||||
var query by remember { mutableStateOf(TextFieldValue()) }
|
||||
|
||||
if (state is GlobalSearchViewModel.ViewState.Init) {
|
||||
query = TextFieldValue(text = state.query, selection = TextRange(start = 0, end = state.query.length))
|
||||
}
|
||||
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
|
|
|
@ -85,7 +85,9 @@ class RemoteFilesManageFragment : BaseBottomSheetComposeFragment() {
|
|||
space = command.space
|
||||
)
|
||||
is CollectionViewModel.Command.ToDesktop -> navigation.exitToDesktop()
|
||||
is CollectionViewModel.Command.ToSearch -> navigation.openPageSearch()
|
||||
is CollectionViewModel.Command.ToSearch -> {
|
||||
// Do nothing.
|
||||
}
|
||||
is CollectionViewModel.Command.Exit -> exit()
|
||||
is CollectionViewModel.Command.SelectSpace -> {
|
||||
// Do nothing.
|
||||
|
|
|
@ -71,6 +71,9 @@ class CollectionFragment : BaseComposeFragment() {
|
|||
}
|
||||
}
|
||||
dialog.show(childFragmentManager, "fullscreen-widget-create-object-of-type-dialog")
|
||||
},
|
||||
onSearchClicked = {
|
||||
vm.onSearchClicked(space)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
@ -101,7 +104,10 @@ class CollectionFragment : BaseComposeFragment() {
|
|||
space = space
|
||||
)
|
||||
is Command.ToDesktop -> navigation.exitToDesktop()
|
||||
is Command.ToSearch -> navigation.openPageSearch()
|
||||
is Command.ToSearch -> navigation.openPageSearch(
|
||||
initialQuery = command.initialQuery,
|
||||
space = command.space
|
||||
)
|
||||
is Command.SelectSpace -> {
|
||||
findNavController().navigate(
|
||||
R.id.selectSpaceScreen,
|
||||
|
|
|
@ -119,7 +119,8 @@ import org.burnoutcrew.reorderable.reorderable
|
|||
fun ScreenContent(
|
||||
vm: CollectionViewModel,
|
||||
uiState: CollectionUiState,
|
||||
onCreateObjectLongClicked: () -> Unit
|
||||
onCreateObjectLongClicked: () -> Unit,
|
||||
onSearchClicked: () -> Unit
|
||||
) {
|
||||
Box(
|
||||
Modifier.background(color = colorResource(R.color.background_primary))
|
||||
|
@ -144,7 +145,7 @@ fun ScreenContent(
|
|||
BottomNavigationMenu(
|
||||
backClick = { vm.onPrevClicked() },
|
||||
homeClick = { vm.onHomeClicked() },
|
||||
searchClick = { vm.onSearchClicked() },
|
||||
searchClick = onSearchClicked,
|
||||
addDocClick = { vm.onAddClicked(null) },
|
||||
onCreateObjectLongClicked = onCreateObjectLongClicked,
|
||||
onProfileClicked = vm::onProfileClicked,
|
||||
|
@ -585,7 +586,8 @@ fun CollectionItem(
|
|||
@Composable
|
||||
fun CollectionScreen(
|
||||
vm: CollectionViewModel,
|
||||
onCreateObjectLongClicked: () -> Unit
|
||||
onCreateObjectLongClicked: () -> Unit,
|
||||
onSearchClicked: () -> Unit
|
||||
) {
|
||||
|
||||
val uiState by vm.uiState.collectAsStateWithLifecycle()
|
||||
|
@ -604,7 +606,12 @@ fun CollectionScreen(
|
|||
sheetContent = { BlockWidget(localDensity, vm, state) },
|
||||
sheetPeekHeight = 0.dp
|
||||
) {
|
||||
ScreenContent(vm, state, onCreateObjectLongClicked)
|
||||
ScreenContent(
|
||||
vm = vm,
|
||||
uiState = state,
|
||||
onCreateObjectLongClicked = onCreateObjectLongClicked,
|
||||
onSearchClicked = onSearchClicked
|
||||
)
|
||||
|
||||
LaunchedEffect(state) {
|
||||
|
||||
|
|
|
@ -521,7 +521,8 @@ sealed class Command {
|
|||
val sorts: List<DVSort>,
|
||||
val filters: List<DVFilter>,
|
||||
val withMeta: Boolean,
|
||||
val withMetaRelationDetails: Boolean
|
||||
val withMetaRelationDetails: Boolean,
|
||||
val space: SpaceId
|
||||
) {
|
||||
data class Result(
|
||||
val obj: Id,
|
||||
|
|
|
@ -21,6 +21,10 @@ interface UserSettingsCache {
|
|||
suspend fun getLastOpenedObject(space: SpaceId) : Id?
|
||||
suspend fun clearLastOpenedObject(space: SpaceId)
|
||||
|
||||
suspend fun setLastSearchQuery(query: String, space: SpaceId)
|
||||
suspend fun getLastSearchQuery(space: SpaceId): String
|
||||
suspend fun clearLastSearchQuery(space: SpaceId)
|
||||
|
||||
suspend fun setWallpaper(space: Id, wallpaper: Wallpaper)
|
||||
suspend fun getWallpaper(space: Id) : Wallpaper
|
||||
suspend fun getWallpapers(): Map<Id, Wallpaper>
|
||||
|
|
|
@ -73,4 +73,16 @@ class UserSettingsDataRepository(private val cache: UserSettingsCache) : UserSet
|
|||
override suspend fun clearLastOpenedObject(space: SpaceId) {
|
||||
cache.clearLastOpenedObject(space)
|
||||
}
|
||||
|
||||
override suspend fun setLastSearchQuery(query: String, space: SpaceId) {
|
||||
cache.setLastSearchQuery(query, space)
|
||||
}
|
||||
|
||||
override suspend fun getLastSearchQuery(space: SpaceId): String {
|
||||
return cache.getLastSearchQuery(space)
|
||||
}
|
||||
|
||||
override suspend fun clearLastSearchQuery(space: SpaceId) {
|
||||
cache.clearLastSearchQuery(space)
|
||||
}
|
||||
}
|
|
@ -27,6 +27,10 @@ interface UserSettingsRepository {
|
|||
suspend fun getLastOpenedObject(space: SpaceId) : Id?
|
||||
suspend fun clearLastOpenedObject(space: SpaceId)
|
||||
|
||||
suspend fun setLastSearchQuery(query: String, space: SpaceId)
|
||||
suspend fun getLastSearchQuery(space: SpaceId): String
|
||||
suspend fun clearLastSearchQuery(space: SpaceId)
|
||||
|
||||
suspend fun setThemeMode(mode: ThemeMode)
|
||||
suspend fun getThemeMode(): ThemeMode
|
||||
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
package com.anytypeio.anytype.domain.search
|
||||
|
||||
import com.anytypeio.anytype.core_models.primitives.SpaceId
|
||||
import com.anytypeio.anytype.domain.base.AppCoroutineDispatchers
|
||||
import com.anytypeio.anytype.domain.base.ResultInteractor
|
||||
import com.anytypeio.anytype.domain.config.UserSettingsRepository
|
||||
import javax.inject.Inject
|
||||
|
||||
class GetLastSearchQuery @Inject constructor(
|
||||
private val settings: UserSettingsRepository,
|
||||
dispatchers: AppCoroutineDispatchers
|
||||
) : ResultInteractor<GetLastSearchQuery.Params, String>(dispatchers.io) {
|
||||
|
||||
override suspend fun doWork(params: Params): String {
|
||||
return settings.getLastSearchQuery(space = params.space)
|
||||
}
|
||||
|
||||
data class Params(val space: SpaceId)
|
||||
}
|
|
@ -4,13 +4,17 @@ import com.anytypeio.anytype.core_models.Command
|
|||
import com.anytypeio.anytype.domain.base.AppCoroutineDispatchers
|
||||
import com.anytypeio.anytype.domain.base.ResultInteractor
|
||||
import com.anytypeio.anytype.domain.block.repo.BlockRepository
|
||||
import com.anytypeio.anytype.domain.config.UserSettingsRepository
|
||||
import javax.inject.Inject
|
||||
|
||||
class SearchWithMeta @Inject constructor(
|
||||
private val repo: BlockRepository,
|
||||
private val dispatchers: AppCoroutineDispatchers
|
||||
private val dispatchers: AppCoroutineDispatchers,
|
||||
private val settings: UserSettingsRepository
|
||||
) : ResultInteractor<Command.SearchWithMeta, List<Command.SearchWithMeta.Result>>(dispatchers.io) {
|
||||
override suspend fun doWork(params: Command.SearchWithMeta): List<Command.SearchWithMeta.Result> {
|
||||
return repo.searchObjectWithMeta(command = params)
|
||||
return repo.searchObjectWithMeta(command = params).also {
|
||||
settings.setLastSearchQuery(query = params.query, space = params.space)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -312,6 +312,54 @@ class DefaultUserSettingsCache(
|
|||
}
|
||||
}
|
||||
|
||||
override suspend fun setLastSearchQuery(query: String, space: SpaceId) {
|
||||
context.spacePrefsStore.updateData { existingPreferences ->
|
||||
val givenSpacePreference = existingPreferences
|
||||
.preferences
|
||||
.getOrDefault(
|
||||
key = space.id,
|
||||
defaultValue = SpacePreference()
|
||||
)
|
||||
val updated = givenSpacePreference.copy(
|
||||
lastSearchQuery = query
|
||||
)
|
||||
val result = buildMap {
|
||||
putAll(existingPreferences.preferences)
|
||||
put(key = space.id, updated)
|
||||
}
|
||||
SpacePreferences(preferences = result)
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun getLastSearchQuery(space: SpaceId): String {
|
||||
return context.spacePrefsStore
|
||||
.data
|
||||
.map { preferences ->
|
||||
preferences
|
||||
.preferences[space.id]
|
||||
?.lastSearchQuery.orEmpty()
|
||||
}
|
||||
.first()
|
||||
}
|
||||
|
||||
override suspend fun clearLastSearchQuery(space: SpaceId) {
|
||||
context.spacePrefsStore.updateData { existingPreferences ->
|
||||
val givenSpacePreference = existingPreferences
|
||||
.preferences
|
||||
.getOrDefault(key = space.id, defaultValue = SpacePreference())
|
||||
val updated = givenSpacePreference.copy(
|
||||
lastSearchQuery = null
|
||||
)
|
||||
val result = buildMap {
|
||||
putAll(existingPreferences.preferences)
|
||||
put(key = space.id, updated)
|
||||
}
|
||||
SpacePreferences(
|
||||
preferences = result
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val CURRENT_SPACE_KEY = "prefs.user_settings.current_space"
|
||||
const val DEFAULT_OBJECT_TYPE_ID_KEY = "prefs.user_settings.default_object_type.id"
|
||||
|
|
|
@ -12,4 +12,5 @@ message SpacePreference {
|
|||
optional string defaultObjectTypeKey = 1;
|
||||
repeated string pinnedObjectTypeIds = 2;
|
||||
optional string lastOpenedObject = 3;
|
||||
optional string lastSearchQuery = 4;
|
||||
}
|
|
@ -98,6 +98,7 @@ import com.anytypeio.anytype.domain.page.CreateObject
|
|||
import com.anytypeio.anytype.domain.page.CreateObjectAsMentionOrLink
|
||||
import com.anytypeio.anytype.domain.page.OpenPage
|
||||
import com.anytypeio.anytype.domain.relations.AddRelationToObject
|
||||
import com.anytypeio.anytype.domain.search.GetLastSearchQuery
|
||||
import com.anytypeio.anytype.domain.search.SearchObjects
|
||||
import com.anytypeio.anytype.domain.sets.FindObjectSetForType
|
||||
import com.anytypeio.anytype.domain.templates.ApplyTemplate
|
||||
|
@ -331,7 +332,8 @@ class EditorViewModel(
|
|||
private val getNetworkMode: GetNetworkMode,
|
||||
private val clearLastOpenedObject: ClearLastOpenedObject,
|
||||
private val analyticSpaceHelperDelegate: AnalyticSpaceHelperDelegate,
|
||||
private val spaceSyncAndP2PStatusProvider: SpaceSyncAndP2PStatusProvider
|
||||
private val spaceSyncAndP2PStatusProvider: SpaceSyncAndP2PStatusProvider,
|
||||
private val getLastSearchQuery: GetLastSearchQuery
|
||||
) : ViewStateViewModel<ViewState>(),
|
||||
PickerListener,
|
||||
SupportNavigation<EventWrapper<AppNavigation.Command>>,
|
||||
|
@ -4301,7 +4303,33 @@ class EditorViewModel(
|
|||
eventName = searchScreenShow,
|
||||
props = Props(mapOf(EventsPropertiesKey.route to EventsDictionary.Routes.navigation))
|
||||
)
|
||||
navigation.postValue(EventWrapper(AppNavigation.Command.OpenPageSearch))
|
||||
|
||||
viewModelScope.launch {
|
||||
val params = GetLastSearchQuery.Params(space = vmParams.space)
|
||||
getLastSearchQuery.async(params).fold(
|
||||
onSuccess = { query ->
|
||||
navigation.postValue(
|
||||
EventWrapper(
|
||||
AppNavigation.Command.OpenPageSearch(
|
||||
initialQuery = query,
|
||||
space = vmParams.space.id
|
||||
)
|
||||
)
|
||||
)
|
||||
},
|
||||
onFailure = {
|
||||
Timber.e(it, "Error while getting last search query")
|
||||
navigation.postValue(
|
||||
EventWrapper(
|
||||
AppNavigation.Command.OpenPageSearch(
|
||||
initialQuery = "",
|
||||
space = vmParams.space.id
|
||||
)
|
||||
)
|
||||
)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun onMultiSelectModeBlockClicked() {
|
||||
|
|
|
@ -34,6 +34,7 @@ import com.anytypeio.anytype.domain.page.CreateObject
|
|||
import com.anytypeio.anytype.domain.page.CreateObjectAsMentionOrLink
|
||||
import com.anytypeio.anytype.domain.page.OpenPage
|
||||
import com.anytypeio.anytype.domain.relations.AddRelationToObject
|
||||
import com.anytypeio.anytype.domain.search.GetLastSearchQuery
|
||||
import com.anytypeio.anytype.domain.search.SearchObjects
|
||||
import com.anytypeio.anytype.domain.sets.FindObjectSetForType
|
||||
import com.anytypeio.anytype.domain.templates.ApplyTemplate
|
||||
|
@ -97,7 +98,8 @@ open class EditorViewModelFactory @Inject constructor(
|
|||
private val getNetworkMode: GetNetworkMode,
|
||||
private val clearLastOpenedObject: ClearLastOpenedObject,
|
||||
private val analyticSpaceHelperDelegate: AnalyticSpaceHelperDelegate,
|
||||
private val syncStatusProvider: SpaceSyncAndP2PStatusProvider
|
||||
private val syncStatusProvider: SpaceSyncAndP2PStatusProvider,
|
||||
private val getLastSearchQuery: GetLastSearchQuery
|
||||
) : ViewModelProvider.Factory {
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
|
@ -147,7 +149,8 @@ open class EditorViewModelFactory @Inject constructor(
|
|||
spaceSyncAndP2PStatusProvider = syncStatusProvider,
|
||||
getNetworkMode = getNetworkMode,
|
||||
analyticSpaceHelperDelegate = analyticSpaceHelperDelegate,
|
||||
clearLastOpenedObject = clearLastOpenedObject
|
||||
clearLastOpenedObject = clearLastOpenedObject,
|
||||
getLastSearchQuery = getLastSearchQuery
|
||||
) as T
|
||||
}
|
||||
}
|
|
@ -58,6 +58,7 @@ import com.anytypeio.anytype.domain.objects.StoreOfObjectTypes
|
|||
import com.anytypeio.anytype.domain.objects.StoreOfRelations
|
||||
import com.anytypeio.anytype.domain.page.CloseBlock
|
||||
import com.anytypeio.anytype.domain.page.CreateObject
|
||||
import com.anytypeio.anytype.domain.search.GetLastSearchQuery
|
||||
import com.anytypeio.anytype.domain.search.SearchObjects
|
||||
import com.anytypeio.anytype.domain.spaces.GetSpaceView
|
||||
import com.anytypeio.anytype.domain.types.GetPinnedObjectTypes
|
||||
|
@ -194,7 +195,8 @@ class HomeScreenViewModel(
|
|||
private val payloadDelegator: PayloadDelegator,
|
||||
private val createBlock: CreateBlock,
|
||||
private val dateProvider: DateProvider,
|
||||
private val addObjectToCollection: AddObjectToCollection
|
||||
private val addObjectToCollection: AddObjectToCollection,
|
||||
private val getLastSearchQuery: GetLastSearchQuery
|
||||
) : NavigationViewModel<HomeScreenViewModel.Navigation>(),
|
||||
Reducer<ObjectView, Payload>,
|
||||
WidgetActiveViewStateHolder by widgetActiveViewStateHolder,
|
||||
|
@ -1669,6 +1671,29 @@ class HomeScreenViewModel(
|
|||
}
|
||||
|
||||
fun onSearchIconClicked() {
|
||||
viewModelScope.launch {
|
||||
val space = spaceManager.get()
|
||||
val params = GetLastSearchQuery.Params(space = SpaceId(space))
|
||||
getLastSearchQuery.async(params).fold(
|
||||
onSuccess = { query ->
|
||||
commands.emit(
|
||||
Command.OpenGlobalSearchScreen(
|
||||
initialQuery = query,
|
||||
space = space
|
||||
)
|
||||
)
|
||||
},
|
||||
onFailure = {
|
||||
Timber.e(it, "Error while getting last search query")
|
||||
commands.emit(
|
||||
Command.OpenGlobalSearchScreen(
|
||||
initialQuery = "",
|
||||
space = space
|
||||
)
|
||||
)
|
||||
}
|
||||
)
|
||||
}
|
||||
viewModelScope.sendEvent(
|
||||
analytics = analytics,
|
||||
eventName = EventsDictionary.searchScreenShow,
|
||||
|
@ -2046,7 +2071,8 @@ class HomeScreenViewModel(
|
|||
private val createBlock: CreateBlock,
|
||||
private val dateProvider: DateProvider,
|
||||
private val coverImageHashProvider: CoverImageHashProvider,
|
||||
private val addObjectToCollection: AddObjectToCollection
|
||||
private val addObjectToCollection: AddObjectToCollection,
|
||||
private val getLastSearchQuery: GetLastSearchQuery
|
||||
) : ViewModelProvider.Factory {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
override fun <T : ViewModel> create(modelClass: Class<T>): T = HomeScreenViewModel(
|
||||
|
@ -2093,7 +2119,8 @@ class HomeScreenViewModel(
|
|||
payloadDelegator = payloadDelegator,
|
||||
createBlock = createBlock,
|
||||
dateProvider = dateProvider,
|
||||
addObjectToCollection = addObjectToCollection
|
||||
addObjectToCollection = addObjectToCollection,
|
||||
getLastSearchQuery = getLastSearchQuery
|
||||
) as T
|
||||
}
|
||||
|
||||
|
@ -2136,6 +2163,8 @@ sealed class Command {
|
|||
|
||||
data class OpenObjectCreateDialog(val space: SpaceId) : Command()
|
||||
|
||||
data class OpenGlobalSearchScreen(val initialQuery: String, val space: Id) : Command()
|
||||
|
||||
data class SelectWidgetType(
|
||||
val ctx: Id,
|
||||
val source: Id,
|
||||
|
|
|
@ -36,7 +36,7 @@ interface AppNavigation {
|
|||
|
||||
fun exit()
|
||||
fun exitToDesktop()
|
||||
fun openPageSearch()
|
||||
fun openPageSearch(initialQuery: String, space: Id)
|
||||
fun openUpdateAppScreen()
|
||||
fun openRemoteFilesManageScreen(subscription: Id)
|
||||
|
||||
|
@ -69,7 +69,10 @@ interface AppNavigation {
|
|||
object OpenSettings : Command()
|
||||
object MigrationErrorScreen: Command()
|
||||
|
||||
object OpenPageSearch : Command()
|
||||
data class OpenPageSearch(
|
||||
val initialQuery: String,
|
||||
val space: Id
|
||||
) : Command()
|
||||
|
||||
data class OpenSetOrCollection(
|
||||
val target: Id,
|
||||
|
|
|
@ -34,7 +34,6 @@ import com.anytypeio.anytype.domain.misc.UrlBuilder
|
|||
import com.anytypeio.anytype.domain.objects.StoreOfObjectTypes
|
||||
import com.anytypeio.anytype.domain.objects.StoreOfRelations
|
||||
import com.anytypeio.anytype.domain.search.SearchWithMeta
|
||||
import com.anytypeio.anytype.domain.workspace.SpaceManager
|
||||
import com.anytypeio.anytype.presentation.analytics.AnalyticSpaceHelperDelegate
|
||||
import com.anytypeio.anytype.presentation.common.BaseViewModel
|
||||
import com.anytypeio.anytype.presentation.extension.sendAnalyticsSearchBacklinksEvent
|
||||
|
@ -62,16 +61,16 @@ import kotlinx.coroutines.launch
|
|||
import timber.log.Timber
|
||||
|
||||
class GlobalSearchViewModel(
|
||||
private val vmParams: VmParams,
|
||||
private val searchWithMeta: SearchWithMeta,
|
||||
private val storeOfObjectTypes: StoreOfObjectTypes,
|
||||
private val storeOfRelations: StoreOfRelations,
|
||||
private val spaceManager: SpaceManager,
|
||||
private val urlBuilder: UrlBuilder,
|
||||
private val analytics: Analytics,
|
||||
private val analyticSpaceHelperDelegate: AnalyticSpaceHelperDelegate
|
||||
private val analyticSpaceHelperDelegate: AnalyticSpaceHelperDelegate,
|
||||
) : BaseViewModel(), AnalyticSpaceHelperDelegate by analyticSpaceHelperDelegate {
|
||||
|
||||
private val userInput = MutableStateFlow(EMPTY_STRING_VALUE)
|
||||
private val userInput = MutableStateFlow(vmParams.initialQuery)
|
||||
private val searchQuery = userInput
|
||||
.take(1)
|
||||
.onCompletion {
|
||||
|
@ -90,13 +89,17 @@ class GlobalSearchViewModel(
|
|||
}.flatMapLatest { (mode, query) ->
|
||||
when(mode) {
|
||||
is Mode.Default -> {
|
||||
buildDefaultSearchFlow(query)
|
||||
buildDefaultSearchFlow(query = query, space = vmParams.space)
|
||||
}
|
||||
is Mode.Related -> {
|
||||
buildRelatedSearchFlow(query, mode)
|
||||
buildRelatedSearchFlow(query = query, mode = mode, space = vmParams.space)
|
||||
}
|
||||
}
|
||||
}.scan<ViewState, ViewState>(initial = ViewState.Init) { curr, new ->
|
||||
}.scan<ViewState, ViewState>(
|
||||
initial = ViewState.Init(
|
||||
query = vmParams.initialQuery
|
||||
)
|
||||
) { curr, new ->
|
||||
when(new) {
|
||||
is ViewState.Default -> {
|
||||
if (new.isLoading) {
|
||||
|
@ -121,12 +124,13 @@ class GlobalSearchViewModel(
|
|||
}.stateIn(
|
||||
scope = viewModelScope,
|
||||
started = SharingStarted.WhileSubscribed(),
|
||||
initialValue = ViewState.Init
|
||||
initialValue = ViewState.Init("")
|
||||
)
|
||||
|
||||
private suspend fun buildRelatedSearchFlow(
|
||||
query: String,
|
||||
mode: Mode.Related
|
||||
mode: Mode.Related,
|
||||
space: SpaceId
|
||||
) = searchWithMeta
|
||||
.stream(
|
||||
Command.SearchWithMeta(
|
||||
|
@ -137,7 +141,7 @@ class GlobalSearchViewModel(
|
|||
filters = buildList {
|
||||
addAll(
|
||||
ObjectSearchConstants.filterSearchObjects(
|
||||
spaces = listOf(spaceManager.get())
|
||||
spaces = listOf(vmParams.space.id)
|
||||
)
|
||||
)
|
||||
add(
|
||||
|
@ -153,7 +157,8 @@ class GlobalSearchViewModel(
|
|||
},
|
||||
sorts = ObjectSearchConstants.sortsSearchObjects,
|
||||
withMetaRelationDetails = false,
|
||||
withMeta = false
|
||||
withMeta = false,
|
||||
space = space
|
||||
)
|
||||
).map { result ->
|
||||
when (result) {
|
||||
|
@ -186,7 +191,7 @@ class GlobalSearchViewModel(
|
|||
}
|
||||
}
|
||||
|
||||
private suspend fun buildDefaultSearchFlow(query: String) = searchWithMeta
|
||||
private suspend fun buildDefaultSearchFlow(query: String, space: SpaceId) = searchWithMeta
|
||||
.stream(
|
||||
Command.SearchWithMeta(
|
||||
query = query,
|
||||
|
@ -195,11 +200,12 @@ class GlobalSearchViewModel(
|
|||
keys = DEFAULT_KEYS,
|
||||
filters = ObjectSearchConstants.filterSearchObjects(
|
||||
// TODO add tech space?
|
||||
spaces = listOf(spaceManager.get())
|
||||
spaces = listOf(space.id)
|
||||
),
|
||||
sorts = ObjectSearchConstants.sortsSearchObjects,
|
||||
withMetaRelationDetails = true,
|
||||
withMeta = true
|
||||
withMeta = true,
|
||||
space = space
|
||||
)
|
||||
).map { result ->
|
||||
when (result) {
|
||||
|
@ -250,7 +256,7 @@ class GlobalSearchViewModel(
|
|||
viewModelScope.launch {
|
||||
sendAnalyticsSearchResultEvent(
|
||||
analytics = analytics,
|
||||
spaceParams = provideParams(spaceManager.get())
|
||||
spaceParams = provideParams(vmParams.space.id)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -270,16 +276,18 @@ class GlobalSearchViewModel(
|
|||
viewModelScope.launch {
|
||||
sendAnalyticsSearchBacklinksEvent(
|
||||
analytics = analytics,
|
||||
spaceParams = provideParams(spaceManager.get())
|
||||
spaceParams = provideParams(vmParams.space.id)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
data class VmParams(val initialQuery: String, val space: SpaceId)
|
||||
|
||||
class Factory @Inject constructor(
|
||||
private val vmParams: VmParams,
|
||||
private val searchWithMeta: SearchWithMeta,
|
||||
private val storeOfObjectTypes: StoreOfObjectTypes,
|
||||
private val storeOfRelations: StoreOfRelations,
|
||||
private val spaceManager: SpaceManager,
|
||||
private val urlBuilder: UrlBuilder,
|
||||
private val analytics: Analytics,
|
||||
private val analyticSpaceHelperDelegate: AnalyticSpaceHelperDelegate
|
||||
|
@ -287,10 +295,10 @@ class GlobalSearchViewModel(
|
|||
@Suppress("UNCHECKED_CAST")
|
||||
override fun <T : ViewModel> create(modelClass: Class<T>): T {
|
||||
return GlobalSearchViewModel(
|
||||
vmParams = vmParams,
|
||||
searchWithMeta = searchWithMeta,
|
||||
storeOfObjectTypes = storeOfObjectTypes,
|
||||
storeOfRelations = storeOfRelations,
|
||||
spaceManager = spaceManager,
|
||||
urlBuilder = urlBuilder,
|
||||
analytics = analytics,
|
||||
analyticSpaceHelperDelegate = analyticSpaceHelperDelegate
|
||||
|
@ -317,7 +325,9 @@ class GlobalSearchViewModel(
|
|||
abstract val views: List<GlobalSearchItemView>
|
||||
abstract val isLoading: Boolean
|
||||
|
||||
data object Init: ViewState() {
|
||||
data class Init(
|
||||
val query: String = EMPTY_STRING_VALUE
|
||||
): ViewState() {
|
||||
override val views: List<GlobalSearchItemView> = emptyList()
|
||||
override val isLoading: Boolean = false
|
||||
}
|
||||
|
|
|
@ -57,6 +57,7 @@ import com.anytypeio.anytype.domain.page.CloseBlock
|
|||
import com.anytypeio.anytype.domain.page.CreateObject
|
||||
import com.anytypeio.anytype.domain.search.DataViewState
|
||||
import com.anytypeio.anytype.domain.search.DataViewSubscriptionContainer
|
||||
import com.anytypeio.anytype.domain.search.GetLastSearchQuery
|
||||
import com.anytypeio.anytype.domain.sets.OpenObjectSet
|
||||
import com.anytypeio.anytype.domain.sets.SetQueryToObjectSet
|
||||
import com.anytypeio.anytype.domain.templates.CreateTemplate
|
||||
|
@ -108,6 +109,7 @@ import com.anytypeio.anytype.presentation.templates.TemplateView
|
|||
import com.anytypeio.anytype.presentation.util.Dispatcher
|
||||
import com.anytypeio.anytype.presentation.widgets.TypeTemplatesWidgetUI
|
||||
import com.anytypeio.anytype.presentation.widgets.TypeTemplatesWidgetUIAction
|
||||
import com.anytypeio.anytype.presentation.widgets.collection.CollectionViewModel.Command
|
||||
import com.anytypeio.anytype.presentation.widgets.enterEditing
|
||||
import com.anytypeio.anytype.presentation.widgets.exitEditing
|
||||
import com.anytypeio.anytype.presentation.widgets.hideMoreMenu
|
||||
|
@ -180,6 +182,7 @@ class ObjectSetViewModel(
|
|||
private val analyticSpaceHelperDelegate: AnalyticSpaceHelperDelegate,
|
||||
private val spaceSyncAndP2PStatusProvider: SpaceSyncAndP2PStatusProvider,
|
||||
private val clearLastOpenedObject: ClearLastOpenedObject,
|
||||
private val getLastSearchQuery: GetLastSearchQuery
|
||||
) : ViewModel(), SupportNavigation<EventWrapper<AppNavigation.Command>>,
|
||||
ViewerDelegate by viewerDelegate,
|
||||
AnalyticSpaceHelperDelegate by analyticSpaceHelperDelegate
|
||||
|
@ -1652,9 +1655,25 @@ class ObjectSetViewModel(
|
|||
props = Props(mapOf(EventsPropertiesKey.route to EventsDictionary.Routes.navigation))
|
||||
)
|
||||
viewModelScope.launch {
|
||||
closeBlock.async(context).fold(
|
||||
onSuccess = { dispatch(AppNavigation.Command.OpenPageSearch) },
|
||||
onFailure = { Timber.e(it, "Error while closing object set: $context") }
|
||||
val params = GetLastSearchQuery.Params(space = vmParams.space)
|
||||
getLastSearchQuery.async(params).fold(
|
||||
onSuccess = { query ->
|
||||
dispatch(
|
||||
AppNavigation.Command.OpenPageSearch(
|
||||
initialQuery = query,
|
||||
space = vmParams.space.id
|
||||
)
|
||||
)
|
||||
},
|
||||
onFailure = {
|
||||
Timber.e(it, "Error while getting last search query")
|
||||
dispatch(
|
||||
AppNavigation.Command.OpenPageSearch(
|
||||
initialQuery = "",
|
||||
space = vmParams.space.id
|
||||
)
|
||||
)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,6 +27,7 @@ import com.anytypeio.anytype.domain.objects.StoreOfRelations
|
|||
import com.anytypeio.anytype.domain.page.CloseBlock
|
||||
import com.anytypeio.anytype.domain.page.CreateObject
|
||||
import com.anytypeio.anytype.domain.search.DataViewSubscriptionContainer
|
||||
import com.anytypeio.anytype.domain.search.GetLastSearchQuery
|
||||
import com.anytypeio.anytype.domain.sets.OpenObjectSet
|
||||
import com.anytypeio.anytype.domain.sets.SetQueryToObjectSet
|
||||
import com.anytypeio.anytype.domain.templates.CreateTemplate
|
||||
|
@ -83,7 +84,8 @@ class ObjectSetViewModelFactory(
|
|||
private val dateProvider: DateProvider,
|
||||
private val spaceSyncAndP2PStatusProvider: SpaceSyncAndP2PStatusProvider,
|
||||
private val analyticSpaceHelperDelegate: AnalyticSpaceHelperDelegate,
|
||||
private val clearLastOpenedObject: ClearLastOpenedObject
|
||||
private val clearLastOpenedObject: ClearLastOpenedObject,
|
||||
private val getLastSearchQuery: GetLastSearchQuery
|
||||
) : ViewModelProvider.Factory {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
override fun <T : ViewModel> create(modelClass: Class<T>): T {
|
||||
|
@ -128,7 +130,8 @@ class ObjectSetViewModelFactory(
|
|||
dateProvider = dateProvider,
|
||||
analyticSpaceHelperDelegate = analyticSpaceHelperDelegate,
|
||||
spaceSyncAndP2PStatusProvider = spaceSyncAndP2PStatusProvider,
|
||||
clearLastOpenedObject = clearLastOpenedObject
|
||||
clearLastOpenedObject = clearLastOpenedObject,
|
||||
getLastSearchQuery = getLastSearchQuery
|
||||
) as T
|
||||
}
|
||||
}
|
|
@ -16,6 +16,7 @@ import com.anytypeio.anytype.core_models.Payload
|
|||
import com.anytypeio.anytype.core_models.Position
|
||||
import com.anytypeio.anytype.core_models.Relations
|
||||
import com.anytypeio.anytype.core_models.ext.process
|
||||
import com.anytypeio.anytype.core_models.primitives.SpaceId
|
||||
import com.anytypeio.anytype.core_utils.ext.cancel
|
||||
import com.anytypeio.anytype.core_utils.ext.replace
|
||||
import com.anytypeio.anytype.domain.base.AppCoroutineDispatchers
|
||||
|
@ -38,6 +39,7 @@ import com.anytypeio.anytype.domain.objects.DeleteObjects
|
|||
import com.anytypeio.anytype.domain.objects.SetObjectListIsArchived
|
||||
import com.anytypeio.anytype.domain.objects.StoreOfObjectTypes
|
||||
import com.anytypeio.anytype.domain.page.CreateObject
|
||||
import com.anytypeio.anytype.domain.search.GetLastSearchQuery
|
||||
import com.anytypeio.anytype.domain.spaces.GetSpaceView
|
||||
import com.anytypeio.anytype.domain.workspace.SpaceManager
|
||||
import com.anytypeio.anytype.domain.workspace.getSpaceWithTechSpace
|
||||
|
@ -45,6 +47,7 @@ import com.anytypeio.anytype.presentation.analytics.AnalyticSpaceHelperDelegate
|
|||
import com.anytypeio.anytype.presentation.extension.sendAnalyticsObjectCreateEvent
|
||||
import com.anytypeio.anytype.presentation.extension.sendDeletionWarning
|
||||
import com.anytypeio.anytype.presentation.extension.sendScreenHomeEvent
|
||||
import com.anytypeio.anytype.presentation.home.Command
|
||||
import com.anytypeio.anytype.presentation.home.HomeScreenViewModel.Companion.HOME_SCREEN_PROFILE_OBJECT_SUBSCRIPTION
|
||||
import com.anytypeio.anytype.presentation.home.OpenObjectNavigation
|
||||
import com.anytypeio.anytype.presentation.home.navigation
|
||||
|
@ -107,7 +110,8 @@ class CollectionViewModel(
|
|||
private val spaceManager: SpaceManager,
|
||||
private val getSpaceView: GetSpaceView,
|
||||
private val dateTypeNameProvider: DateTypeNameProvider,
|
||||
private val analyticSpaceHelperDelegate: AnalyticSpaceHelperDelegate
|
||||
private val analyticSpaceHelperDelegate: AnalyticSpaceHelperDelegate,
|
||||
private val getLastSearchQuery: GetLastSearchQuery
|
||||
) : ViewModel(), Reducer<CoreObjectView, Payload>, AnalyticSpaceHelperDelegate by analyticSpaceHelperDelegate {
|
||||
|
||||
val payloads: Flow<Payload>
|
||||
|
@ -823,14 +827,33 @@ class CollectionViewModel(
|
|||
}
|
||||
}
|
||||
|
||||
fun onSearchClicked() {
|
||||
fun onSearchClicked(space: Id) {
|
||||
viewModelScope.sendEvent(
|
||||
analytics = analytics,
|
||||
eventName = EventsDictionary.searchScreenShow,
|
||||
props = Props(mapOf(EventsPropertiesKey.route to EventsDictionary.Routes.navigation))
|
||||
)
|
||||
launch {
|
||||
commands.emit(Command.ToSearch)
|
||||
viewModelScope.launch {
|
||||
val params = GetLastSearchQuery.Params(space = SpaceId(space))
|
||||
getLastSearchQuery.async(params).fold(
|
||||
onSuccess = { query ->
|
||||
commands.emit(
|
||||
Command.ToSearch(
|
||||
initialQuery = query,
|
||||
space = space
|
||||
)
|
||||
)
|
||||
},
|
||||
onFailure = {
|
||||
Timber.e(it, "Error while getting last search query")
|
||||
commands.emit(
|
||||
Command.ToSearch(
|
||||
initialQuery = "",
|
||||
space = space
|
||||
)
|
||||
)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -944,7 +967,8 @@ class CollectionViewModel(
|
|||
private val spaceManager: SpaceManager,
|
||||
private val getSpaceView: GetSpaceView,
|
||||
private val dateTypeNameProvider: DateTypeNameProvider,
|
||||
private val analyticSpaceHelperDelegate: AnalyticSpaceHelperDelegate
|
||||
private val analyticSpaceHelperDelegate: AnalyticSpaceHelperDelegate,
|
||||
private val getLastSearchQuery: GetLastSearchQuery
|
||||
) : ViewModelProvider.Factory {
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
|
@ -970,7 +994,8 @@ class CollectionViewModel(
|
|||
spaceManager = spaceManager,
|
||||
getSpaceView = getSpaceView,
|
||||
dateTypeNameProvider = dateTypeNameProvider,
|
||||
analyticSpaceHelperDelegate = analyticSpaceHelperDelegate
|
||||
analyticSpaceHelperDelegate = analyticSpaceHelperDelegate,
|
||||
getLastSearchQuery = getLastSearchQuery
|
||||
) as T
|
||||
}
|
||||
}
|
||||
|
@ -982,7 +1007,7 @@ class CollectionViewModel(
|
|||
data class LaunchObjectSet(val target: Id, val space: Id) : Command()
|
||||
|
||||
data object ToDesktop : Command()
|
||||
data object ToSearch : Command()
|
||||
data class ToSearch(val initialQuery: String, val space: Id) : Command()
|
||||
data object SelectSpace : Command()
|
||||
data object Exit : Command()
|
||||
}
|
||||
|
|
|
@ -124,7 +124,8 @@ class CollectionCreateAndAddObjectTest: ObjectSetViewModelTestSetup() {
|
|||
permissions = permissions,
|
||||
analyticSpaceHelperDelegate = analyticSpaceHelperDelegate,
|
||||
spaceSyncAndP2PStatusProvider = spaceSyncAndP2PStatusProvider,
|
||||
clearLastOpenedObject = clearLastOpenedObject
|
||||
clearLastOpenedObject = clearLastOpenedObject,
|
||||
getLastSearchQuery = getLastSearchQuery
|
||||
)
|
||||
stubNetworkMode()
|
||||
stubObservePermissions()
|
||||
|
|
|
@ -87,6 +87,7 @@ import com.anytypeio.anytype.domain.page.bookmark.CreateBookmarkBlock
|
|||
import com.anytypeio.anytype.domain.page.bookmark.SetupBookmark
|
||||
import com.anytypeio.anytype.domain.relations.AddRelationToObject
|
||||
import com.anytypeio.anytype.domain.relations.SetRelationKey
|
||||
import com.anytypeio.anytype.domain.search.GetLastSearchQuery
|
||||
import com.anytypeio.anytype.domain.search.SearchObjects
|
||||
import com.anytypeio.anytype.domain.sets.FindObjectSetForType
|
||||
import com.anytypeio.anytype.domain.table.CreateTable
|
||||
|
@ -364,6 +365,9 @@ open class EditorViewModelTest {
|
|||
@Mock
|
||||
lateinit var spaceSyncAndP2PStatusProvider: SpaceSyncAndP2PStatusProvider
|
||||
|
||||
@Mock
|
||||
lateinit var getLastSearchQuery: GetLastSearchQuery
|
||||
|
||||
lateinit var vm: EditorViewModel
|
||||
|
||||
private lateinit var builder: UrlBuilder
|
||||
|
@ -3960,7 +3964,8 @@ open class EditorViewModelTest {
|
|||
analyticSpaceHelperDelegate = analyticSpaceHelperDelegate,
|
||||
spaceSyncAndP2PStatusProvider = spaceSyncAndP2PStatusProvider,
|
||||
clearLastOpenedObject = clearLastOpenedObject,
|
||||
getNetworkMode = getNetworkMode
|
||||
getNetworkMode = getNetworkMode,
|
||||
getLastSearchQuery = getLastSearchQuery
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
@ -78,6 +78,7 @@ import com.anytypeio.anytype.domain.page.bookmark.CreateBookmarkBlock
|
|||
import com.anytypeio.anytype.domain.page.bookmark.SetupBookmark
|
||||
import com.anytypeio.anytype.domain.relations.AddRelationToObject
|
||||
import com.anytypeio.anytype.domain.relations.SetRelationKey
|
||||
import com.anytypeio.anytype.domain.search.GetLastSearchQuery
|
||||
import com.anytypeio.anytype.domain.search.SearchObjects
|
||||
import com.anytypeio.anytype.domain.sets.FindObjectSetForType
|
||||
import com.anytypeio.anytype.domain.table.CreateTable
|
||||
|
@ -292,6 +293,9 @@ open class EditorPresentationTestSetup {
|
|||
@Mock
|
||||
lateinit var convertObjectToCollection: ConvertObjectToCollection
|
||||
|
||||
@Mock
|
||||
lateinit var getLastSearchQuery: GetLastSearchQuery
|
||||
|
||||
lateinit var tableDelegate: EditorTableDelegate
|
||||
|
||||
lateinit var dispatcher: Dispatcher<Payload>
|
||||
|
@ -499,7 +503,8 @@ open class EditorPresentationTestSetup {
|
|||
analyticSpaceHelperDelegate = analyticSpaceHelperDelegate,
|
||||
clearLastOpenedObject = clearLastOpenedObject,
|
||||
spaceSyncAndP2PStatusProvider = spaceSyncAndP2PStatusProvider,
|
||||
getNetworkMode = getNetworkMode
|
||||
getNetworkMode = getNetworkMode,
|
||||
getLastSearchQuery = getLastSearchQuery
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
@ -56,6 +56,7 @@ import com.anytypeio.anytype.domain.objects.StoreOfObjectTypes
|
|||
import com.anytypeio.anytype.domain.objects.StoreOfRelations
|
||||
import com.anytypeio.anytype.domain.page.CloseBlock
|
||||
import com.anytypeio.anytype.domain.page.CreateObject
|
||||
import com.anytypeio.anytype.domain.search.GetLastSearchQuery
|
||||
import com.anytypeio.anytype.domain.search.SearchObjects
|
||||
import com.anytypeio.anytype.domain.spaces.GetSpaceView
|
||||
import com.anytypeio.anytype.domain.types.GetPinnedObjectTypes
|
||||
|
@ -243,6 +244,9 @@ class HomeScreenViewModelTest {
|
|||
@Mock
|
||||
lateinit var addObjectToCollection: AddObjectToCollection
|
||||
|
||||
@Mock
|
||||
lateinit var getLastSearchQuery: GetLastSearchQuery
|
||||
|
||||
lateinit var userPermissionProvider: UserPermissionProvider
|
||||
|
||||
private val objectPayloadDispatcher = Dispatcher.Default<Payload>()
|
||||
|
@ -2939,7 +2943,8 @@ class HomeScreenViewModelTest {
|
|||
createBlock = createBlock,
|
||||
createDataViewObject = createDataViewObject,
|
||||
dateProvider = dateProvider,
|
||||
addObjectToCollection = addObjectToCollection
|
||||
addObjectToCollection = addObjectToCollection,
|
||||
getLastSearchQuery = getLastSearchQuery
|
||||
)
|
||||
|
||||
companion object {
|
||||
|
|
|
@ -57,6 +57,7 @@ import com.anytypeio.anytype.domain.page.CloseBlock
|
|||
import com.anytypeio.anytype.domain.page.CreateObject
|
||||
import com.anytypeio.anytype.domain.search.CancelSearchSubscription
|
||||
import com.anytypeio.anytype.domain.search.DataViewSubscriptionContainer
|
||||
import com.anytypeio.anytype.domain.search.GetLastSearchQuery
|
||||
import com.anytypeio.anytype.domain.search.SubscriptionEventChannel
|
||||
import com.anytypeio.anytype.domain.sets.OpenObjectSet
|
||||
import com.anytypeio.anytype.domain.sets.SetQueryToObjectSet
|
||||
|
@ -212,6 +213,9 @@ open class ObjectSetViewModelTestSetup {
|
|||
@Mock
|
||||
lateinit var spaceSyncAndP2PStatusProvider: SpaceSyncAndP2PStatusProvider
|
||||
|
||||
@Mock
|
||||
lateinit var getLastSearchQuery: GetLastSearchQuery
|
||||
|
||||
var permissions: UserPermissionProvider = UserPermissionProviderStub()
|
||||
|
||||
lateinit var spaceConfig: Config
|
||||
|
@ -303,7 +307,8 @@ open class ObjectSetViewModelTestSetup {
|
|||
permissions = permissions,
|
||||
analyticSpaceHelperDelegate = analyticSpaceHelperDelegate,
|
||||
spaceSyncAndP2PStatusProvider = spaceSyncAndP2PStatusProvider,
|
||||
clearLastOpenedObject = clearLastOpenedObject
|
||||
clearLastOpenedObject = clearLastOpenedObject,
|
||||
getLastSearchQuery = getLastSearchQuery
|
||||
)
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue