Resolve dir for termninal drop

This commit is contained in:
Kaede Akino committed 2026-09-19 14:14:16 +08:00
1 parent ce76821842
commit 33200dcad8
3 files changed
+29 -2

No files matched your search

@@ -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")
}
}
@@ -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
}
}
}
@@ -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)