diff --git a/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/data/GitLabDiscussion.kt b/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/data/GitLabDiscussion.kt index c1f57ea12259..afb3f55c5920 100644 --- a/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/data/GitLabDiscussion.kt +++ b/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/data/GitLabDiscussion.kt @@ -25,7 +25,8 @@ interface GitLabDiscussion { val notes: StateFlow> val canAddDraftNotes: Boolean - val canResolve: Boolean + val resolvable: StateFlow + val resolveAllowed: Boolean val canAddNotes: StateFlow val resolved: StateFlow @@ -116,8 +117,12 @@ class LoadedGitLabDiscussion( mr.details.value.userPermissions.createNote && (glMetadata?.let { GitLabVersion(16, 3) <= it.version } ?: false) - // a little cheat that greatly simplifies the implementation - override val canResolve: Boolean = discussionData.notes.first().resolvable && discussionData.notes.first().userPermissions.resolveNote + + override val resolvable: StateFlow = + loadedNotes.mapState { it.firstOrNull()?.resolvable ?: false } + + // a little cheat that simplifies the implementation + override val resolveAllowed: Boolean = discussionData.notes.first().userPermissions.resolveNote override val resolved: StateFlow = loadedNotes.mapState { it.firstOrNull()?.resolved ?: false } @@ -166,5 +171,5 @@ class LoadedGitLabDiscussion( } override fun toString(): String = - "LoadedGitLabDiscussion(id='$id', createdAt=$createdAt, canAddNotes=$canAddNotes, canResolve=$canResolve)" + "LoadedGitLabDiscussion(id='$id', createdAt=$createdAt)" } \ No newline at end of file diff --git a/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/ui/timeline/GitLabMergeRequestTimelineDiscussionViewModel.kt b/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/ui/timeline/GitLabMergeRequestTimelineDiscussionViewModel.kt index 359c6e63e7c2..f66fdec72dc2 100644 --- a/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/ui/timeline/GitLabMergeRequestTimelineDiscussionViewModel.kt +++ b/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/mergerequest/ui/timeline/GitLabMergeRequestTimelineDiscussionViewModel.kt @@ -1,10 +1,7 @@ // Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.plugins.gitlab.mergerequest.ui.timeline -import com.intellij.collaboration.async.launchNow -import com.intellij.collaboration.async.mapModelsToViewModels -import com.intellij.collaboration.async.mapScoped -import com.intellij.collaboration.async.modelFlow +import com.intellij.collaboration.async.* import com.intellij.collaboration.ui.codereview.timeline.CollapsibleTimelineItemViewModel import com.intellij.collaboration.ui.codereview.timeline.thread.CodeReviewFoldableThreadViewModel import com.intellij.collaboration.ui.codereview.timeline.thread.CodeReviewResolvableItemViewModel @@ -89,7 +86,7 @@ class GitLabMergeRequestTimelineDiscussionViewModelImpl( override val isBusy: StateFlow = taskLauncher.busy override val isResolved: StateFlow = discussion.resolved - override val canChangeResolvedState: StateFlow = MutableStateFlow(discussion.canResolve) + override val canChangeResolvedState: StateFlow = discussion.resolvable.mapState { it && discussion.resolveAllowed } override val collapsible: Flow = isResolved diff --git a/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/ui/comment/GitLabMergeRequestDiscussionViewModel.kt b/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/ui/comment/GitLabMergeRequestDiscussionViewModel.kt index bb47054d69e9..a49f896880d2 100644 --- a/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/ui/comment/GitLabMergeRequestDiscussionViewModel.kt +++ b/plugins/gitlab/gitlab-core/src/org/jetbrains/plugins/gitlab/ui/comment/GitLabMergeRequestDiscussionViewModel.kt @@ -54,7 +54,7 @@ internal class GitLabMergeRequestDiscussionViewModelBase( private val expandRequested = MutableStateFlow(false) override val isResolved: StateFlow = discussion.resolved - override val canChangeResolvedState: StateFlow = MutableStateFlow(discussion.canResolve) + override val canChangeResolvedState: StateFlow = discussion.resolvable.mapState { it && discussion.resolveAllowed } override val replyVm: StateFlow = discussion.canAddNotes.mapScoped { canAddNotes ->