[gitlab] refactor: separate resolvability flows

GitOrigin-RevId: 6c4e826d3471d8a06071c4979784f59f7ac2b8f0
This commit is contained in:
Ivan Semenov
2025-09-11 14:45:50 +00:00
committed by intellij-monorepo-bot
parent c6a914224c
commit 8c03bec6fe
3 changed files with 12 additions and 10 deletions
@@ -25,7 +25,8 @@ interface GitLabDiscussion {
val notes: StateFlow<List<GitLabNote>>
val canAddDraftNotes: Boolean
val canResolve: Boolean
val resolvable: StateFlow<Boolean>
val resolveAllowed: Boolean
val canAddNotes: StateFlow<Boolean>
val resolved: StateFlow<Boolean>
@@ -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<Boolean> =
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<Boolean> =
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)"
}
@@ -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<Boolean> = taskLauncher.busy
override val isResolved: StateFlow<Boolean> = discussion.resolved
override val canChangeResolvedState: StateFlow<Boolean> = MutableStateFlow(discussion.canResolve)
override val canChangeResolvedState: StateFlow<Boolean> = discussion.resolvable.mapState { it && discussion.resolveAllowed }
override val collapsible: Flow<Boolean> = isResolved
@@ -54,7 +54,7 @@ internal class GitLabMergeRequestDiscussionViewModelBase(
private val expandRequested = MutableStateFlow(false)
override val isResolved: StateFlow<Boolean> = discussion.resolved
override val canChangeResolvedState: StateFlow<Boolean> = MutableStateFlow(discussion.canResolve)
override val canChangeResolvedState: StateFlow<Boolean> = discussion.resolvable.mapState { it && discussion.resolveAllowed }
override val replyVm: StateFlow<GitLabDiscussionReplyViewModel?> =
discussion.canAddNotes.mapScoped { canAddNotes ->