diff --git a/domain/src/main/java/com/anytypeio/anytype/domain/objects/StoreOfRelations.kt b/domain/src/main/java/com/anytypeio/anytype/domain/objects/StoreOfRelations.kt index 70b3b8a7a7..22bbb458bb 100644 --- a/domain/src/main/java/com/anytypeio/anytype/domain/objects/StoreOfRelations.kt +++ b/domain/src/main/java/com/anytypeio/anytype/domain/objects/StoreOfRelations.kt @@ -6,6 +6,9 @@ import com.anytypeio.anytype.core_models.ObjectWrapper import com.anytypeio.anytype.core_models.Struct import com.anytypeio.anytype.domain.`object`.amend import com.anytypeio.anytype.domain.`object`.unset +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock @@ -20,6 +23,13 @@ interface StoreOfRelations { suspend fun set(target: Id, data: Struct) suspend fun remove(target: Id) suspend fun clear() + + fun trackChanges() : Flow + + sealed class TrackedEvent { + object Init : TrackedEvent() + object Change: TrackedEvent() + } } class DefaultStoreOfRelations : StoreOfRelations { @@ -28,6 +38,8 @@ class DefaultStoreOfRelations : StoreOfRelations { private val store = mutableMapOf() private val keysToIds = mutableMapOf() + private val updates = MutableSharedFlow() + override val size: Int get() = store.size override suspend fun getByKey(key: Key): ObjectWrapper.Relation? = mutex.withLock { @@ -55,6 +67,7 @@ class DefaultStoreOfRelations : StoreOfRelations { store[o.id] = current.amend(o.map) } } + updates.emit(StoreOfRelations.TrackedEvent.Change) } override suspend fun amend(target: Id, diff: Map): Unit = mutex.withLock { @@ -64,6 +77,7 @@ class DefaultStoreOfRelations : StoreOfRelations { } else { store[target] = ObjectWrapper.Relation(diff).also { keysToIds[it.key] = target } } + updates.emit(StoreOfRelations.TrackedEvent.Change) } override suspend fun set( @@ -71,6 +85,7 @@ class DefaultStoreOfRelations : StoreOfRelations { data: Map ): Unit = mutex.withLock { store[target] = ObjectWrapper.Relation(data).also { keysToIds[it.key] = target } + updates.emit(StoreOfRelations.TrackedEvent.Change) } override suspend fun unset( @@ -81,6 +96,7 @@ class DefaultStoreOfRelations : StoreOfRelations { if (current != null) { store[target] = current.unset(keys) } + updates.emit(StoreOfRelations.TrackedEvent.Change) } override suspend fun remove(target: Id) : Unit = mutex.withLock { @@ -89,10 +105,15 @@ class DefaultStoreOfRelations : StoreOfRelations { keysToIds.remove(current.key) store.remove(target) } + updates.emit(StoreOfRelations.TrackedEvent.Change) } override suspend fun clear(): Unit = mutex.withLock { keysToIds.clear() store.clear() } + + override fun trackChanges(): Flow = updates.onStart { + emit(StoreOfRelations.TrackedEvent.Init) + } } \ No newline at end of file diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/relations/RelationListViewModel.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/relations/RelationListViewModel.kt index 361bfc81fd..ba39f4deb9 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/relations/RelationListViewModel.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/relations/RelationListViewModel.kt @@ -65,9 +65,10 @@ class RelationListViewModel( ) jobs += viewModelScope.launch { combine( + storeOfRelations.trackChanges(), relationListProvider.links, relationListProvider.details - ) { relationLinks, details -> + ) { _, relationLinks, details -> val relations = relationLinks.mapNotNull { storeOfRelations.getByKey(it.key) } val detail = details.details[ctx] val values = detail?.map ?: emptyMap()