DROID-2145 Objects | Fix | Sync pinned types and app shortcut actions (#795)
This commit is contained in:
parent
47b46954ed
commit
ecbc0886c4
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -10,5 +10,5 @@ message SpacePreferences {
|
|||
|
||||
message SpacePreference {
|
||||
optional string defaultObjectTypeKey = 1;
|
||||
repeated string pinnedObjectTypeKeys = 2;
|
||||
repeated string pinnedObjectTypeIds = 2;
|
||||
}
|
|
@ -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
|
|
@ -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
|
||||
}
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue