DROID-2145 Objects | Fix | Sync pinned types and app shortcut actions (#795)

This commit is contained in:
Evgenii Kozlov 2024-01-24 13:54:36 +01:00 committed by GitHub
parent 47b46954ed
commit ecbc0886c4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 46 additions and 83 deletions

View File

@ -208,7 +208,7 @@ class DefaultUserSettingsCache(
.getOrDefault(key = space.id, defaultValue = SpacePreference())
val updated = givenSpacePreference.copy(
pinnedObjectTypeKeys = types.map { type -> type.id }
pinnedObjectTypeIds = types.map { type -> type.id }
)
val result = buildMap {
@ -228,7 +228,7 @@ class DefaultUserSettingsCache(
.map { preferences ->
preferences
.preferences[space.id]
?.pinnedObjectTypeKeys?.map { id -> TypeId(id) } ?: emptyList()
?.pinnedObjectTypeIds?.map { id -> TypeId(id) } ?: emptyList()
}
}

View File

@ -10,5 +10,5 @@ message SpacePreferences {
message SpacePreference {
optional string defaultObjectTypeKey = 1;
repeated string pinnedObjectTypeKeys = 2;
repeated string pinnedObjectTypeIds = 2;
}

View File

@ -21,6 +21,7 @@ import com.anytypeio.anytype.core_models.Relations
import com.anytypeio.anytype.core_models.WidgetLayout
import com.anytypeio.anytype.core_models.WidgetSession
import com.anytypeio.anytype.core_models.ext.process
import com.anytypeio.anytype.core_models.primitives.SpaceId
import com.anytypeio.anytype.core_models.primitives.TypeKey
import com.anytypeio.anytype.core_utils.ext.cancel
import com.anytypeio.anytype.core_utils.ext.replace
@ -47,6 +48,7 @@ import com.anytypeio.anytype.domain.page.CloseBlock
import com.anytypeio.anytype.domain.page.CreateObject
import com.anytypeio.anytype.domain.search.SearchObjects
import com.anytypeio.anytype.domain.spaces.GetSpaceView
import com.anytypeio.anytype.domain.types.GetPinnedObjectTypes
import com.anytypeio.anytype.domain.widgets.CreateWidget
import com.anytypeio.anytype.domain.widgets.DeleteWidget
import com.anytypeio.anytype.domain.widgets.GetWidgetSession
@ -156,7 +158,8 @@ class HomeScreenViewModel(
private val setWidgetActiveView: SetWidgetActiveView,
private val setObjectDetails: SetObjectDetails,
private val getSpaceView: GetSpaceView,
private val searchObjects: SearchObjects
private val searchObjects: SearchObjects,
private val getPinnedObjectTypes: GetPinnedObjectTypes
) : NavigationViewModel<HomeScreenViewModel.Navigation>(),
Reducer<ObjectView, Payload>,
WidgetActiveViewStateHolder by widgetActiveViewStateHolder,
@ -1127,15 +1130,33 @@ class HomeScreenViewModel(
private fun proceedWithSettingUpShortcuts() {
spaceManager
.observe()
.onEach { config ->
val defaultObjectType = getDefaultObjectType.async(Unit).getOrNull()
.flatMapLatest { config ->
getPinnedObjectTypes.flow(
GetPinnedObjectTypes.Params(space = SpaceId(config.space))
).map { pinned ->
config to pinned
}
}
.onEach { (config, pinned) ->
val keys = buildSet {
if (defaultObjectType != null) {
add(defaultObjectType.type.key)
pinned.forEach { typeId ->
val wrapper = storeOfObjectTypes.get(typeId.id)
val uniqueKey = wrapper?.uniqueKey
if (uniqueKey != null) {
add(wrapper.uniqueKey)
} else {
Timber.w("Could not found unique key for a pinned type: ${typeId.id}")
}
}
if (size < MAX_TYPE_COUNT_FOR_APP_ACTIONS && !contains(ObjectTypeUniqueKeys.NOTE)) {
add(ObjectTypeUniqueKeys.NOTE)
}
if (size < MAX_TYPE_COUNT_FOR_APP_ACTIONS && !contains(ObjectTypeUniqueKeys.PAGE)) {
add(ObjectTypeUniqueKeys.PAGE)
}
if (size < MAX_TYPE_COUNT_FOR_APP_ACTIONS && !contains(ObjectTypeUniqueKeys.TASK)) {
add(ObjectTypeUniqueKeys.TASK)
}
add(ObjectTypeUniqueKeys.NOTE)
add(ObjectTypeUniqueKeys.PAGE)
add(ObjectTypeUniqueKeys.TASK)
}
searchObjects(
SearchObjects.Params(
@ -1360,7 +1381,8 @@ class HomeScreenViewModel(
private val spaceWidgetContainer: SpaceWidgetContainer,
private val setObjectDetails: SetObjectDetails,
private val getSpaceView: GetSpaceView,
private val searchObjects: SearchObjects
private val searchObjects: SearchObjects,
private val getPinnedObjectTypes: GetPinnedObjectTypes
) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>): T = HomeScreenViewModel(
@ -1396,7 +1418,8 @@ class HomeScreenViewModel(
spaceWidgetContainer = spaceWidgetContainer,
setObjectDetails = setObjectDetails,
getSpaceView = getSpaceView,
searchObjects = searchObjects
searchObjects = searchObjects,
getPinnedObjectTypes = getPinnedObjectTypes
) as T
}
@ -1514,4 +1537,6 @@ fun ObjectWrapper.Basic.navigation() : OpenObjectNavigation {
OpenObjectNavigation.UnexpectedLayoutError(layout)
}
}
}
}
const val MAX_TYPE_COUNT_FOR_APP_ACTIONS = 4

View File

@ -251,19 +251,6 @@ class SelectObjectTypeViewModel(
proceedWithSettingPinnedTypes(
pinned = updatedPinnedTypes.map { type -> TypeId(type.id) }
)
viewModelScope.launch {
proceedWithUpdatingAppActions(
pinned = updatedPinnedTypes.mapNotNull { type ->
val obj = storeOfObjectTypes.get(type.id)
val key = obj?.uniqueKey
if (obj != null && key != null) {
key to obj.name.orEmpty()
} else {
null
}
}
)
}
}
}
@ -273,19 +260,6 @@ class SelectObjectTypeViewModel(
if (state is SelectTypeViewState.Content) {
val updatedPinnedTypes = pinned.value.filter { type -> type.id != typeView.id }
proceedWithSettingPinnedTypes(pinned = updatedPinnedTypes)
viewModelScope.launch {
proceedWithUpdatingAppActions(
pinned = updatedPinnedTypes.mapNotNull { type ->
val obj = storeOfObjectTypes.get(type.id)
val key = obj?.uniqueKey
if (obj != null && key != null) {
key to obj.name.orEmpty()
} else {
null
}
}
)
}
}
}
@ -298,19 +272,6 @@ class SelectObjectTypeViewModel(
swap(index1 = currentPosition, index2 = currentPosition.dec())
}
proceedWithSettingPinnedTypes(pinned = updatedPinnedTypes)
viewModelScope.launch {
proceedWithUpdatingAppActions(
pinned = updatedPinnedTypes.mapNotNull { type ->
val obj = storeOfObjectTypes.get(type.id)
val key = obj?.uniqueKey
if (obj != null && key != null) {
key to obj.name.orEmpty()
} else {
null
}
}
)
}
}
}
@ -323,19 +284,6 @@ class SelectObjectTypeViewModel(
swap(index1 = currentPosition, index2 = currentPosition.inc())
}
proceedWithSettingPinnedTypes(pinned = updatedPinnedTypes)
viewModelScope.launch {
proceedWithUpdatingAppActions(
pinned = updatedPinnedTypes.mapNotNull { type ->
val obj = storeOfObjectTypes.get(type.id)
val key = obj?.uniqueKey
if (obj != null && key != null) {
key to obj.name.orEmpty()
} else {
null
}
}
)
}
}
}
@ -357,19 +305,6 @@ class SelectObjectTypeViewModel(
}
}
private fun proceedWithUpdatingAppActions(pinned: List<Pair<Key, Name>>) {
if (pinned.isNotEmpty()) {
appActionManager.setup(
pinned.take(MAX_TYPE_COUNT_FOR_APP_ACTIONS).map { (key, name) ->
AppActionManager.Action.CreateNew(
type = TypeKey(key),
name = name
)
}
)
}
}
fun onSetDefaultObjectTypeClicked(typeView: SelectTypeView.Type) {
viewModelScope.launch {
setDefaultObjectType.async(
@ -588,6 +523,4 @@ sealed class SelectTypeView {
sealed class Command {
data class ShowTypeInstalledToast(val typeName: String) : Command()
data class DispatchObjectType(val type: ObjectWrapper.Type) : Command()
}
const val MAX_TYPE_COUNT_FOR_APP_ACTIONS = 3
}

View File

@ -49,6 +49,7 @@ import com.anytypeio.anytype.domain.page.CloseBlock
import com.anytypeio.anytype.domain.page.CreateObject
import com.anytypeio.anytype.domain.search.SearchObjects
import com.anytypeio.anytype.domain.spaces.GetSpaceView
import com.anytypeio.anytype.domain.types.GetPinnedObjectTypes
import com.anytypeio.anytype.domain.widgets.CreateWidget
import com.anytypeio.anytype.domain.widgets.DeleteWidget
import com.anytypeio.anytype.domain.widgets.GetWidgetSession
@ -193,6 +194,9 @@ class HomeScreenViewModelTest {
@Mock
lateinit var searchObjects: SearchObjects
@Mock
lateinit var getPinnedObjectTypes: GetPinnedObjectTypes
private val objectPayloadDispatcher = Dispatcher.Default<Payload>()
private val widgetEventDispatcher = Dispatcher.Default<WidgetDispatchEvent>()
@ -2814,7 +2818,8 @@ class HomeScreenViewModelTest {
spaceManager = spaceManager,
setObjectDetails = setObjectDetails,
getSpaceView = getSpaceView,
searchObjects = searchObjects
searchObjects = searchObjects,
getPinnedObjectTypes = getPinnedObjectTypes
)
companion object {