1
0
Fork 0
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:
Konstantin Ivanov 2024-08-29 13:19:31 +02:00 committed by GitHub
parent 6bb9ef1716
commit fdbdc20f21
Signed by: github
GPG key ID: B5690EEEBB952194
35 changed files with 403 additions and 76 deletions

View file

@ -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
)
}

View file

@ -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
)
}

View file

@ -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 ->

View file

@ -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 {

View file

@ -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

View file

@ -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
}

View file

@ -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(

View file

@ -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

View file

@ -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")
}
}
}
}

View file

@ -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)
}
}

View file

@ -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()

View file

@ -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.

View file

@ -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,

View file

@ -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) {

View file

@ -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,

View file

@ -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>

View file

@ -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)
}
}

View file

@ -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

View file

@ -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)
}

View file

@ -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)
}
}
}

View file

@ -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"

View file

@ -12,4 +12,5 @@ message SpacePreference {
optional string defaultObjectTypeKey = 1;
repeated string pinnedObjectTypeIds = 2;
optional string lastOpenedObject = 3;
optional string lastSearchQuery = 4;
}

View file

@ -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() {

View file

@ -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
}
}

View file

@ -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,

View file

@ -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,

View file

@ -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
}

View file

@ -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
)
)
}
)
}
}

View file

@ -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
}
}

View file

@ -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()
}

View file

@ -124,7 +124,8 @@ class CollectionCreateAndAddObjectTest: ObjectSetViewModelTestSetup() {
permissions = permissions,
analyticSpaceHelperDelegate = analyticSpaceHelperDelegate,
spaceSyncAndP2PStatusProvider = spaceSyncAndP2PStatusProvider,
clearLastOpenedObject = clearLastOpenedObject
clearLastOpenedObject = clearLastOpenedObject,
getLastSearchQuery = getLastSearchQuery
)
stubNetworkMode()
stubObservePermissions()

View file

@ -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
)
}

View file

@ -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
)
}

View file

@ -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 {

View file

@ -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
)
}