Merge pull request #2405 from manaflow-ai/issue-2388-sidebar-layout-regression
Fix duplicate sidebar git metadata publishes
This commit is contained in:
commit
6e6a2c95b5
3 changed files with 206 additions and 17 deletions
|
|
@ -112,7 +112,7 @@ func cmuxInheritedSurfaceConfig(
|
|||
return config
|
||||
}
|
||||
|
||||
struct SidebarStatusEntry {
|
||||
struct SidebarStatusEntry: Equatable {
|
||||
let key: String
|
||||
let value: String
|
||||
let icon: String?
|
||||
|
|
@ -143,7 +143,7 @@ struct SidebarStatusEntry {
|
|||
}
|
||||
}
|
||||
|
||||
struct SidebarMetadataBlock {
|
||||
struct SidebarMetadataBlock: Equatable {
|
||||
let key: String
|
||||
let markdown: String
|
||||
let priority: Int
|
||||
|
|
@ -4896,23 +4896,31 @@ enum SidebarLogLevel: String {
|
|||
case error
|
||||
}
|
||||
|
||||
struct SidebarLogEntry {
|
||||
struct SidebarLogEntry: Equatable {
|
||||
let message: String
|
||||
let level: SidebarLogLevel
|
||||
let source: String?
|
||||
let timestamp: Date
|
||||
}
|
||||
|
||||
struct SidebarProgressState {
|
||||
struct SidebarProgressState: Equatable {
|
||||
let value: Double
|
||||
let label: String?
|
||||
}
|
||||
|
||||
struct SidebarGitBranchState {
|
||||
struct SidebarGitBranchState: Equatable {
|
||||
let branch: String
|
||||
let isDirty: Bool
|
||||
}
|
||||
|
||||
private struct SidebarPanelObservationState: Equatable {
|
||||
let panelIds: [UUID]
|
||||
|
||||
init(panels: [UUID: any Panel]) {
|
||||
panelIds = panels.keys.sorted { $0.uuidString < $1.uuidString }
|
||||
}
|
||||
}
|
||||
|
||||
enum WorkspaceRemoteConnectionState: String {
|
||||
case disconnected
|
||||
case connecting
|
||||
|
|
@ -5583,6 +5591,47 @@ final class Workspace: Identifiable, ObservableObject {
|
|||
var agentPIDs: [String: pid_t] = [:]
|
||||
private var restoredTerminalScrollbackByPanelId: [UUID: String] = [:]
|
||||
|
||||
private func sidebarObservationSignal<Value: Equatable>(
|
||||
_ publisher: Published<Value>.Publisher
|
||||
) -> AnyPublisher<Void, Never> {
|
||||
publisher
|
||||
.dropFirst()
|
||||
.removeDuplicates()
|
||||
.map { _ in () }
|
||||
.eraseToAnyPublisher()
|
||||
}
|
||||
|
||||
lazy var sidebarObservationPublisher: AnyPublisher<Void, Never> = {
|
||||
let publishers: [AnyPublisher<Void, Never>] = [
|
||||
sidebarObservationSignal($title),
|
||||
sidebarObservationSignal($isPinned),
|
||||
sidebarObservationSignal($customColor),
|
||||
sidebarObservationSignal($currentDirectory),
|
||||
$panels
|
||||
.map(SidebarPanelObservationState.init)
|
||||
.dropFirst()
|
||||
.removeDuplicates()
|
||||
.map { _ in () }
|
||||
.eraseToAnyPublisher(),
|
||||
sidebarObservationSignal($panelDirectories),
|
||||
sidebarObservationSignal($statusEntries),
|
||||
sidebarObservationSignal($metadataBlocks),
|
||||
sidebarObservationSignal($logEntries),
|
||||
sidebarObservationSignal($progress),
|
||||
sidebarObservationSignal($gitBranch),
|
||||
sidebarObservationSignal($panelGitBranches),
|
||||
sidebarObservationSignal($pullRequest),
|
||||
sidebarObservationSignal($panelPullRequests),
|
||||
sidebarObservationSignal($remoteConfiguration),
|
||||
sidebarObservationSignal($remoteConnectionState),
|
||||
sidebarObservationSignal($remoteConnectionDetail),
|
||||
sidebarObservationSignal($activeRemoteTerminalSessionCount),
|
||||
sidebarObservationSignal($listeningPorts),
|
||||
]
|
||||
|
||||
return Publishers.MergeMany(publishers).eraseToAnyPublisher()
|
||||
}()
|
||||
|
||||
private static func isProxyOnlyRemoteError(_ detail: String) -> Bool {
|
||||
let lowered = detail.lowercased()
|
||||
return lowered.contains("remote proxy")
|
||||
|
|
@ -6449,22 +6498,32 @@ final class Workspace: Identifiable, ObservableObject {
|
|||
panelGitBranches[panelId] = state
|
||||
}
|
||||
if branchChanged {
|
||||
panelPullRequests.removeValue(forKey: panelId)
|
||||
if panelId == focusedPanelId {
|
||||
if panelPullRequests[panelId] != nil {
|
||||
panelPullRequests.removeValue(forKey: panelId)
|
||||
}
|
||||
if panelId == focusedPanelId, pullRequest != nil {
|
||||
pullRequest = nil
|
||||
}
|
||||
}
|
||||
if panelId == focusedPanelId {
|
||||
if panelId == focusedPanelId, gitBranch != state {
|
||||
gitBranch = state
|
||||
}
|
||||
}
|
||||
|
||||
func clearPanelGitBranch(panelId: UUID) {
|
||||
panelGitBranches.removeValue(forKey: panelId)
|
||||
panelPullRequests.removeValue(forKey: panelId)
|
||||
if panelGitBranches[panelId] != nil {
|
||||
panelGitBranches.removeValue(forKey: panelId)
|
||||
}
|
||||
if panelPullRequests[panelId] != nil {
|
||||
panelPullRequests.removeValue(forKey: panelId)
|
||||
}
|
||||
if panelId == focusedPanelId {
|
||||
gitBranch = nil
|
||||
pullRequest = nil
|
||||
if gitBranch != nil {
|
||||
gitBranch = nil
|
||||
}
|
||||
if pullRequest != nil {
|
||||
pullRequest = nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -6520,14 +6579,16 @@ final class Workspace: Identifiable, ObservableObject {
|
|||
if existing != state {
|
||||
panelPullRequests[panelId] = state
|
||||
}
|
||||
if panelId == focusedPanelId {
|
||||
if panelId == focusedPanelId, pullRequest != state {
|
||||
pullRequest = state
|
||||
}
|
||||
}
|
||||
|
||||
func clearPanelPullRequest(panelId: UUID) {
|
||||
panelPullRequests.removeValue(forKey: panelId)
|
||||
if panelId == focusedPanelId {
|
||||
if panelPullRequests[panelId] != nil {
|
||||
panelPullRequests.removeValue(forKey: panelId)
|
||||
}
|
||||
if panelId == focusedPanelId, pullRequest != nil {
|
||||
pullRequest = nil
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue