1
0
Fork 0
mirror of https://github.com/anyproto/anytype-kotlin.git synced 2025-06-08 05:47:05 +09:00

DROID-3622 Widgets | Fix | Do not suggest "Chat" widgets for spaces without chat (#2443)

This commit is contained in:
Evgenii Kozlov 2025-05-23 14:29:20 +02:00 committed by GitHub
parent 4045eee83c
commit 501c395c4e
Signed by: github
GPG key ID: B5690EEEBB952194
2 changed files with 63 additions and 35 deletions

View file

@ -17,6 +17,7 @@ import com.anytypeio.anytype.domain.base.getOrDefault
import com.anytypeio.anytype.domain.base.onSuccess
import com.anytypeio.anytype.domain.block.interactor.sets.GetObjectTypes
import com.anytypeio.anytype.domain.misc.UrlBuilder
import com.anytypeio.anytype.domain.multiplayer.SpaceViewSubscriptionContainer
import com.anytypeio.anytype.domain.objects.StoreOfObjectTypes
import com.anytypeio.anytype.domain.primitives.FieldParser
import com.anytypeio.anytype.domain.search.SearchObjects
@ -36,7 +37,9 @@ import com.anytypeio.anytype.presentation.widgets.source.SuggestWidgetObjectType
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.emitAll
import kotlinx.coroutines.flow.filterIsInstance
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.take
import kotlinx.coroutines.launch
import timber.log.Timber
@ -51,7 +54,8 @@ class SelectWidgetSourceViewModel(
private val analyticSpaceHelperDelegate: AnalyticSpaceHelperDelegate,
private val storeOfObjectTypes: StoreOfObjectTypes,
private val getSuggestedWidgetTypes: GetSuggestedWidgetTypes,
private val fieldParser: FieldParser
private val fieldParser: FieldParser,
private val spaceViews: SpaceViewSubscriptionContainer
) : ObjectSearchViewModel(
vmParams = vmParams,
urlBuilder = urlBuilder,
@ -63,41 +67,58 @@ class SelectWidgetSourceViewModel(
storeOfObjectTypes = storeOfObjectTypes
) {
val suggested = MutableStateFlow<SuggestedWidgetsState>(SuggestedWidgetsState.Init)
private val suggested = MutableStateFlow<SuggestedWidgetsState>(SuggestedWidgetsState.Init)
val isDismissed = MutableStateFlow(false)
var config : Config = Config.None
val viewState = combine(
stateData
.asFlow(),
suggested.filterIsInstance<SuggestedWidgetsState.Default>()
) { state, suggested ->
when(state) {
is ObjectSearchView.Success -> {
state.copy(
objects = buildList {
val query = userInput.value
addAll(resolveSuggestedResults(suggested, query))
// Widgets from existing objects
add(ObjectSearchSection.SelectWidgetSource.FromMyObjects)
addAll(state.objects)
val viewState = flow {
val hasChat = !spaceViews.get(vmParams.space)?.chatId.isNullOrEmpty()
emitAll(
combine(
stateData
.asFlow(),
suggested.filterIsInstance<SuggestedWidgetsState.Default>()
) { state, suggested ->
when(state) {
is ObjectSearchView.Success -> {
state.copy(
objects = buildList {
val query = userInput.value
addAll(
resolveSuggestedResults(
suggested = suggested,
query = query,
hasChat = hasChat
)
)
// Widgets from existing objects
add(ObjectSearchSection.SelectWidgetSource.FromMyObjects)
addAll(state.objects)
}
)
}
)
}
is ObjectSearchView.NoResults -> {
val query = state.searchText
val result = buildList<DefaultSearchItem> {
addAll(resolveSuggestedResults(suggested, query))
}
if (result.isNotEmpty()) {
ObjectSearchView.Success(result)
} else {
state
is ObjectSearchView.NoResults -> {
val query = state.searchText
val result = buildList {
addAll(
resolveSuggestedResults(
suggested = suggested,
query = query,
hasChat = hasChat
)
)
}
if (result.isNotEmpty()) {
ObjectSearchView.Success(result)
} else {
state
}
}
else -> state
}
}
else -> state
}
)
}
init {
@ -113,7 +134,8 @@ class SelectWidgetSourceViewModel(
private fun resolveSuggestedResults(
suggested: SuggestedWidgetsState.Default,
query: String
query: String,
hasChat: Boolean
) = buildList {
// Adding system widgets if matched by query
@ -130,7 +152,7 @@ class SelectWidgetSourceViewModel(
if (contains(BundledWidgetSourceIds.ALL_OBJECTS)) {
add(BundledWidgetSourceView.AllObjects)
}
if (contains(BundledWidgetSourceIds.CHAT)) {
if (contains(BundledWidgetSourceIds.CHAT) && hasChat) {
add(BundledWidgetSourceView.Chat)
}
if (contains(BundledWidgetSourceIds.RECENT)) {
@ -428,7 +450,8 @@ class SelectWidgetSourceViewModel(
private val analyticSpaceHelperDelegate: AnalyticSpaceHelperDelegate,
private val fieldParser: FieldParser,
private val storeOfObjectTypes: StoreOfObjectTypes,
private val getSuggestedWidgetTypes: GetSuggestedWidgetTypes
private val getSuggestedWidgetTypes: GetSuggestedWidgetTypes,
private val spaceViews: SpaceViewSubscriptionContainer
) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
@ -443,7 +466,8 @@ class SelectWidgetSourceViewModel(
analyticSpaceHelperDelegate = analyticSpaceHelperDelegate,
fieldParser = fieldParser,
storeOfObjectTypes = storeOfObjectTypes,
getSuggestedWidgetTypes = getSuggestedWidgetTypes
getSuggestedWidgetTypes = getSuggestedWidgetTypes,
spaceViews = spaceViews
) as T
}
}