Initial scaffold — NASBackup iOS app

Full project scaffold: XcodeGen project.yml, Core models/protocols/errors,
SMBService (kishikawakatsumi/SMBClient), SFTPService (Citadel 0.9.2),
PhotoLibraryService, LANMonitor, BackupEngine, BackgroundTaskManager,
all feature UIs (Login, Connect, Browse, Backup, History, Settings),
Shared components and theme. Builds clean with zero errors.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Robin Kutesa
2026-05-15 17:05:04 +03:00
commit b96711c535
44 changed files with 3412 additions and 0 deletions

View File

@@ -0,0 +1,36 @@
import Foundation
import LocalAuthentication
@MainActor
final class LoginViewModel: ObservableObject {
@Published var showMoreSheet = false
@Published var isAuthenticating = false
@Published var authError: String? = nil
var onAuthenticated: (() -> Void)?
func authenticateWithFaceID() {
isAuthenticating = true
authError = nil
let context = LAContext()
var error: NSError?
guard context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) else {
authError = "Face ID not available"
isAuthenticating = false
return
}
context.evaluatePolicy(
.deviceOwnerAuthenticationWithBiometrics,
localizedReason: "Sign in to NASBackup"
) { [weak self] success, evalError in
Task { @MainActor in
self?.isAuthenticating = false
if success {
self?.onAuthenticated?()
} else {
self?.authError = evalError?.localizedDescription ?? "Authentication failed"
}
}
}
}
}