From 33200dcad81d78c53f00ef04f4828eb35dff4fc7 Mon Sep 17 00:00:00 2001 From: Kaede Akino Date: Sat, 19 Sep 2026 14:14:16 +0800 Subject: [PATCH] Resolve dir for termninal drop --- .../WorkspaceUploadNoticeTests.swift | 18 ++++++++++++++++++ .../WorkspaceUploadNotice+Presentation.swift | 8 ++++++++ .../Terminal/TerminalPlaceholderView.swift | 5 +++-- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/FrameworkTests/WorkspaceUploadNoticeTests.swift b/FrameworkTests/WorkspaceUploadNoticeTests.swift index e3ac6871..70f27077 100644 --- a/FrameworkTests/WorkspaceUploadNoticeTests.swift +++ b/FrameworkTests/WorkspaceUploadNoticeTests.swift @@ -1,4 +1,5 @@ import TermindApplication +import TermindDomain import TermindPresentation import Testing @@ -37,4 +38,21 @@ struct WorkspaceUploadNoticeTests { #expect(!queued.isRejected) #expect(WorkspaceUploadNotice.rejected("Denied").isRejected) } + + @Test func uploadNoticeAbbreviatesResolvedHomePaths() { + let home: RemoteHomeResolutionState = .resolved("/home/user") + + #expect(WorkspaceUploadNotice.preparing("/home/user").detail(home: home) == "~") + #expect(WorkspaceUploadNotice.preparing("/home/user/project").detail(home: home) == "~/project") + #expect(WorkspaceUploadNotice.queued(2, "/home/user/project").detail(home: home) == "~/project") + } + + @Test func uploadNoticePreservesPathsOutsideOrWithoutAResolvedHome() { + let preparing = WorkspaceUploadNotice.preparing("/srv/project") + let rejected = WorkspaceUploadNotice.rejected("Denied") + + #expect(preparing.detail(home: .resolved("/home/user")) == "/srv/project") + #expect(preparing.detail(home: .unavailable) == "/srv/project") + #expect(rejected.detail(home: .resolved("/home/user")) == "Denied") + } } diff --git a/Frameworks/TermindPresentation/WorkspaceUploadNotice+Presentation.swift b/Frameworks/TermindPresentation/WorkspaceUploadNotice+Presentation.swift index f05bcbc3..8e4dbf6c 100644 --- a/Frameworks/TermindPresentation/WorkspaceUploadNotice+Presentation.swift +++ b/Frameworks/TermindPresentation/WorkspaceUploadNotice+Presentation.swift @@ -1,5 +1,6 @@ import Foundation import TermindApplication +import TermindDomain extension WorkspaceUploadNotice { public var isRejected: Bool { @@ -32,4 +33,11 @@ extension WorkspaceUploadNotice { case .rejected(let reason): reason } } + + public func detail(home: RemoteHomeResolutionState) -> String { + switch self { + case .preparing(let path), .queued(_, let path): RemotePath.displayed(path, home: home) + case .rejected(let reason): reason + } + } } diff --git a/TFM/Features/Terminal/TerminalPlaceholderView.swift b/TFM/Features/Terminal/TerminalPlaceholderView.swift index 6a1e06ef..055a950a 100644 --- a/TFM/Features/Terminal/TerminalPlaceholderView.swift +++ b/TFM/Features/Terminal/TerminalPlaceholderView.swift @@ -99,7 +99,7 @@ struct TerminalPlaceholderView: View { @ViewBuilder private var uploadDecoration: some View { if let uploadNotice { - TerminalUploadOverlay(notice: uploadNotice) + TerminalUploadOverlay(notice: uploadNotice, homeResolution: sshSession.homeResolution) // Above the floating status capsule, not on top of it. .padding(.bottom, Metrics.StatusBar.overlayClearance) .transition(.opacity.combined(with: .scale(scale: 0.97))) @@ -346,12 +346,13 @@ struct TerminalPlaceholderView: View { private struct TerminalUploadOverlay: View { let notice: WorkspaceUploadNotice + let homeResolution: RemoteHomeResolutionState var body: some View { VStack(spacing: Metrics.Space.s) { symbol Text(notice.title).font(.headline) - Text(notice.detail) + Text(notice.detail(home: homeResolution)) .font(notice.isRejected ? .caption : .caption.monospaced()) .foregroundStyle(.secondary) .lineLimit(2)