Resolve dir for termninal drop
This commit is contained in:
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)
|
||||
|
||||
Reference in new issue
Block a user