taler-ios

iOS apps for GNU Taler (wallet)
Log | Files | Refs | README | LICENSE

commit b686657cf603f21a3ee9c915256ab39eaf7e97ef
parent 6ab20e6c9be8a1d85b442c0181ff8263336e4613
Author: Marc Stibane <marc@taler.net>
Date:   Fri, 27 Jun 2025 06:50:09 +0200

Restore

Diffstat:
MTalerWallet1/Views/Settings/BackupView.swift | 71+++++++++++++++++++++++++++++++++++++++++++++++++++--------------------
1 file changed, 51 insertions(+), 20 deletions(-)

diff --git a/TalerWallet1/Views/Settings/BackupView.swift b/TalerWallet1/Views/Settings/BackupView.swift @@ -9,7 +9,15 @@ import SwiftUI import taler_swift import SymLog -let PREFIX = "Taler-" +let BACKUP = "Taler-" +let PREFIX = "file://" + +extension String { + func deletingPrefix(_ prefix: String) -> String { + guard self.hasPrefix(prefix) else { return self } + return String(self.dropFirst(prefix.count)) + } +} /// This view shows the list of backups struct BackupView: View { @@ -24,17 +32,25 @@ struct BackupView: View { @State private var amountLastUsed = Amount.zero(currency: EMPTYSTRING) // needed for Deposit, ignore @State private var created: Bool = false + @State private var restored: Bool = false @State private var files: [String] = [] @State private var filename: String = "" @State private var selectedBackup: String? = nil @State private var showRestoreAlert: Bool = false + private func restoreBackup(_ path: String) { + restored = true + Task { + try? await model.importDbFromFile(path: path) + } + } + private func createBackup() { created = true Task { let dateString = Date().iso - let stem = String(PREFIX + dateString) + let stem = String(BACKUP + dateString) if let backupFile = try? await model.exportDbToFile(stem: stem) { filename = backupFile } @@ -44,24 +60,28 @@ struct BackupView: View { private var dismissAlertButton: some View { Button("Cancel", role: .cancel) { showRestoreAlert = false - selectedBackup = nil + withAnimation { selectedBackup = nil } } } private var resetButton: some View { Button("Restore", role: .destructive) { // TODO: WalletColors().errorColor // didReset = true - showRestoreAlert = false - Task { // runs on MainActor - symLog.log("❗️Restore \(selectedBackup)❗️") -// try? await model.resetWalletCore() - selectedBackup = nil + if let selectedBackup, let docDirUrl = URL.docDirUrl { + showRestoreAlert = false +// symLog.log("❗️Restore \(selectedBackup)❗️") +// if #available(iOS 16.0, *) { +// backupPath = docDirUrl.appending(component: selectedBackup) +// } + let backupPath = docDirUrl.appendingPathComponent(selectedBackup).absoluteString + let path = backupPath.deletingPrefix(PREFIX) + symLog.log("❗️Restore \(path)❗️") + restoreBackup(path) + withAnimation { self.selectedBackup = nil } } } } - - @MainActor private func viewDidLoad() async { let fm = FileManager.default @@ -69,7 +89,8 @@ struct BackupView: View { if let contentsOfDocDir = try? fm.contentsOfDirectory(at: docDirUrl, includingPropertiesForKeys: nil, options: []) { - withAnimation { files = contentsOfDocDir.map { $0.lastPathComponent } } + let filenames = contentsOfDocDir.map { $0.lastPathComponent } + withAnimation { files = filenames } } } } @@ -88,7 +109,8 @@ struct BackupView: View { let restoreHint = Text("To restore your digital money, connect your iPhone to your computer, then use the Files dialog and copy a previously saved backup from your computer into the Taler Wallet.") - let backups = files.filter { $0.hasPrefix(PREFIX) } + let backups = files.filter { $0.hasPrefix(BACKUP) } + let hasBackups = !backups.isEmpty List { Section { backupHint @@ -100,17 +122,26 @@ struct BackupView: View { .disabled(created) restoreHint } -#if DEBUG - Text(filename) -#endif - if !backups.isEmpty { + if hasBackups { Section { ForEach(backups, id: \.self) { file in - Text(file) - .onTapGesture { - selectedBackup = file - } + let isSelected = file == selectedBackup + HStack { + Text(file) + .padding(.vertical, 2) + Spacer() + } + .background { + Color.primary.opacity(isSelected ? 0.2 : 0.05) + } + .onTapGesture { + withAnimation { selectedBackup = file } + showRestoreAlert = true + } } + } header: { + Text("Available for restore:") + .talerFont(.title3) } } }