From 2d09ddb679d993d0bfde252f16291daf28e163ba Mon Sep 17 00:00:00 2001 From: Evgenii Kozlov Date: Wed, 28 Apr 2021 17:19:55 +0300 Subject: [PATCH] Data View | Refact | Create-relation-and-add-it-to-data-view-view flow (#1435) --- .github/workflows/check.yml | 2 +- .../auth/repo/block/BlockDataRepository.kt | 2 +- .../data/auth/repo/block/BlockDataStore.kt | 2 +- .../data/auth/repo/block/BlockRemote.kt | 2 +- .../auth/repo/block/BlockRemoteDataStore.kt | 2 +- .../domain/block/repo/BlockRepository.kt | 2 +- .../interactor/AddDataViewRelation.kt | 10 +++--- .../middleware/block/BlockMiddleware.kt | 2 +- .../middleware/interactor/Middleware.kt | 4 +-- .../presentation/sets/ObjectSetReducer.kt | 25 +++---------- .../presentation/sets/ObjectSetViewModel.kt | 36 +++++++++++++++++-- 11 files changed, 52 insertions(+), 37 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 713853a7dd..dd0a368a75 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -1,7 +1,7 @@ on: pull_request: # add "synchronize" in "types", in order to trigger workflow for pull request commit(s) pushes. - types: [opened, synchronize] + types: [opened] branches: [develop] name: Run debug unit tests jobs: diff --git a/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockDataRepository.kt b/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockDataRepository.kt index 14b0e736a0..2f621202c6 100644 --- a/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockDataRepository.kt +++ b/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockDataRepository.kt @@ -294,7 +294,7 @@ class BlockDataRepository( target: Id, name: String, format: Relation.Format - ): Payload = factory.remote.addDataViewRelation( + ): Pair = factory.remote.addDataViewRelation( context = context, target = target, name = name, diff --git a/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockDataStore.kt b/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockDataStore.kt index 395d7b78c1..69e6e9d96a 100644 --- a/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockDataStore.kt +++ b/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockDataStore.kt @@ -88,7 +88,7 @@ interface BlockDataStore { target: Id, name: String, format: Relation.Format - ): Payload + ): Pair suspend fun updateDataViewViewer( context: Id, diff --git a/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockRemote.kt b/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockRemote.kt index a70558a286..16ba590258 100644 --- a/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockRemote.kt +++ b/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockRemote.kt @@ -89,7 +89,7 @@ interface BlockRemote { target: Id, name: String, format: Relation.Format - ): Payload + ): Pair suspend fun updateDataViewViewer( context: String, diff --git a/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockRemoteDataStore.kt b/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockRemoteDataStore.kt index 760fc980c2..ee33ad42d2 100644 --- a/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockRemoteDataStore.kt +++ b/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockRemoteDataStore.kt @@ -215,7 +215,7 @@ class BlockRemoteDataStore(private val remote: BlockRemote) : BlockDataStore { target: Id, name: String, format: Relation.Format - ): Payload = remote.addDataViewRelation( + ): Pair = remote.addDataViewRelation( context = context, target = target, name = name, diff --git a/domain/src/main/java/com/anytypeio/anytype/domain/block/repo/BlockRepository.kt b/domain/src/main/java/com/anytypeio/anytype/domain/block/repo/BlockRepository.kt index ccd1480dff..af55c2ec67 100644 --- a/domain/src/main/java/com/anytypeio/anytype/domain/block/repo/BlockRepository.kt +++ b/domain/src/main/java/com/anytypeio/anytype/domain/block/repo/BlockRepository.kt @@ -143,7 +143,7 @@ interface BlockRepository { target: Id, name: String, format: Relation.Format - ): Payload + ): Pair suspend fun updateDataViewViewer( context: Id, diff --git a/domain/src/main/java/com/anytypeio/anytype/domain/dataview/interactor/AddDataViewRelation.kt b/domain/src/main/java/com/anytypeio/anytype/domain/dataview/interactor/AddDataViewRelation.kt index 00f92e3b17..fa318e3834 100644 --- a/domain/src/main/java/com/anytypeio/anytype/domain/dataview/interactor/AddDataViewRelation.kt +++ b/domain/src/main/java/com/anytypeio/anytype/domain/dataview/interactor/AddDataViewRelation.kt @@ -1,15 +1,15 @@ package com.anytypeio.anytype.domain.dataview.interactor -import com.anytypeio.anytype.domain.base.BaseUseCase -import com.anytypeio.anytype.core_models.Relation -import com.anytypeio.anytype.domain.block.repo.BlockRepository import com.anytypeio.anytype.core_models.Id -import com.anytypeio.anytype.domain.dataview.interactor.AddDataViewRelation.Params import com.anytypeio.anytype.core_models.Payload +import com.anytypeio.anytype.core_models.Relation +import com.anytypeio.anytype.domain.base.BaseUseCase +import com.anytypeio.anytype.domain.block.repo.BlockRepository +import com.anytypeio.anytype.domain.dataview.interactor.AddDataViewRelation.Params class AddDataViewRelation( private val repo: BlockRepository -) : BaseUseCase() { +) : BaseUseCase, Params>() { override suspend fun run(params: Params) = safe { repo.addDataViewRelation( diff --git a/middleware/src/main/java/com/anytypeio/anytype/middleware/block/BlockMiddleware.kt b/middleware/src/main/java/com/anytypeio/anytype/middleware/block/BlockMiddleware.kt index a2c91ca26f..ef6c5d6ee5 100644 --- a/middleware/src/main/java/com/anytypeio/anytype/middleware/block/BlockMiddleware.kt +++ b/middleware/src/main/java/com/anytypeio/anytype/middleware/block/BlockMiddleware.kt @@ -236,7 +236,7 @@ class BlockMiddleware( target: String, name: String, format: Relation.Format - ): Payload = middleware.addDataViewRelation( + ): Pair = middleware.addDataViewRelation( context = context, target = target, format = format, diff --git a/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/Middleware.kt b/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/Middleware.kt index 687a2eebe2..1758b59e13 100644 --- a/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/Middleware.kt +++ b/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/Middleware.kt @@ -1045,7 +1045,7 @@ class Middleware( target: String, name: String, format: com.anytypeio.anytype.core_models.Relation.Format - ): Payload { + ): Pair { val relation = Relation( name = name, @@ -1061,7 +1061,7 @@ class Middleware( if (BuildConfig.DEBUG) logRequest(request) val response = service.blockDataViewRelationAdd(request) if (BuildConfig.DEBUG) logResponse(response) - return response.event.toPayload() + return Pair(response.relationKey, response.event.toPayload()) } @Throws(Exception::class) diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/ObjectSetReducer.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/ObjectSetReducer.kt index 0fe97a90b7..12a9a20b9d 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/ObjectSetReducer.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/ObjectSetReducer.kt @@ -1,7 +1,10 @@ package com.anytypeio.anytype.presentation.sets -import com.anytypeio.anytype.core_models.* +import com.anytypeio.anytype.core_models.DV +import com.anytypeio.anytype.core_models.DVViewer +import com.anytypeio.anytype.core_models.Event import com.anytypeio.anytype.core_models.Event.Command +import com.anytypeio.anytype.core_models.Id import com.anytypeio.anytype.presentation.extension.updateFields import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.* @@ -139,26 +142,6 @@ class ObjectSetReducer { relations = content.relations.toMutableList().apply { removeIf { it.key == event.key } add(event.relation) - }, - viewers = content.viewers.map { viewer -> - val new = viewer.viewerRelations.toMutableList().apply { - removeIf { it.key == event.key } - add( - DVViewerRelation( - key = event.key, - isVisible = true - ) - ) - } - viewer.copy(viewerRelations = new.toSet().toList()).apply { - // May cause data races. Consider some other solution. - effects.add( - SideEffect.ViewerUpdate( - target = block.id, - viewer = this - ) - ) - } } ) ) diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/ObjectSetViewModel.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/ObjectSetViewModel.kt index 1c1c5ff861..7fd7801b98 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/ObjectSetViewModel.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/ObjectSetViewModel.kt @@ -219,11 +219,42 @@ class ObjectSetViewModel( ) ).process( failure = { Timber.e(it, "Error while adding data view relation") }, - success = defaultPayloadConsumer + success = { (key, payload) -> + reducer.dispatch(payload.events).also { + proceedWithAddingNewRelationToCurrentViewer(relation = key) + } + } ) } } + private suspend fun proceedWithAddingNewRelationToCurrentViewer(relation: Id) { + val state = reducer.state.value + val block = state.dataview + val dv = block.content as DV + val viewer = dv.viewers.find { + it.id == session.currentViewerId + } ?: dv.viewers.first() + + updateDataViewViewer( + UpdateDataViewViewer.Params( + context = context, + target = block.id, + viewer = viewer.copy( + viewerRelations = viewer.viewerRelations + listOf( + DVViewerRelation( + key = relation, + isVisible = true + ) + ) + ) + ) + ).process( + success = defaultPayloadConsumer, + failure = { Timber.e(it, "Error while updating data view's viewer") } + ) + } + fun onTitleChanged(txt: String) { val target = header.value?.id checkNotNull(target) { "Title block was missing or not ready" } @@ -242,7 +273,8 @@ class ObjectSetViewModel( val state = reducer.state.value val block = state.dataview val dv = block.content as DV - val viewer = dv.viewers.find { it.id == session.currentViewerId }?.id ?: dv.viewers.first().id + val viewer = dv.viewers.find { it.id == session.currentViewerId }?.id + ?: dv.viewers.first().id when (cell) { is CellView.Description, is CellView.Number, is CellView.Email,