Files
Kisani/Features/Connect/ConnectViewModel.swift
Robin Kutesa c34dada2b5 Redesign ConnectView for UGreen NAS, default to SFTP
- Standalone IP field with hint labels below (matches UGreen connect pattern)
- Combined credentials card: username + hairline + password with show/hide eye
- Path field shows full absolute path (UGreen uses POSIX paths via SFTP)
- Default protocol changed from SMB → SFTP (UGreen absolute paths are SFTP-native)
- surfaceSunken background, protocol picker stays as secondary control
- Help button stub at bottom

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 11:11:52 +03:00

54 lines
1.7 KiB
Swift

import Foundation
enum ConnectField { case host, username, password, folder }
enum FieldState { case idle, valid, invalid }
@MainActor
final class ConnectViewModel: ObservableObject {
@Published var host = ""
@Published var username = ""
@Published var password = ""
@Published var remotePath = "/"
@Published var selectedProtocol: NASProtocol = .sftp
@Published var isVerifying = false
@Published var isConnected = false
@Published var verifyError: String? = nil
@Published var showFolderBrowser = false
var fieldState: FieldState {
isConnected ? .valid : (verifyError != nil ? .invalid : .idle)
}
var canConnect: Bool {
!host.isEmpty && !username.isEmpty && !password.isEmpty && !isVerifying
}
func verify() async {
isVerifying = true
isConnected = false
verifyError = nil
let connection = NASConnection(
host: host,
nasProtocol: selectedProtocol,
username: username,
password: password,
remotePath: remotePath
)
let service: any NASTransferProtocol = selectedProtocol == .smb ? SMBService() : SFTPService()
do {
try await service.connect(to: connection.host, port: connection.port,
username: connection.username, password: connection.password)
service.disconnect()
isConnected = true
ConnectionStore.shared.savedConnection = connection
} catch let e as BackupError {
verifyError = e.errorDescription
} catch {
verifyError = error.localizedDescription
}
isVerifying = false
}
}