diff --git a/BDKSwiftExampleWallet.xcodeproj/project.pbxproj b/BDKSwiftExampleWallet.xcodeproj/project.pbxproj index 106c3749..c6fed7c3 100644 --- a/BDKSwiftExampleWallet.xcodeproj/project.pbxproj +++ b/BDKSwiftExampleWallet.xcodeproj/project.pbxproj @@ -28,7 +28,7 @@ AE29ED112BBE318A00EB9C4F /* TransactionItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE29ED102BBE318A00EB9C4F /* TransactionItemView.swift */; }; AE29ED152BBE36C500EB9C4F /* TransactionListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE29ED142BBE36C500EB9C4F /* TransactionListViewModel.swift */; }; AE2ADD742B61E8F500C2A823 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE2ADD732B61E8F500C2A823 /* SettingsView.swift */; }; - AE2ADD762B61EFEB00C2A823 /* TabHomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE2ADD752B61EFEB00C2A823 /* TabHomeViewModel.swift */; }; + AE2ADD762B61EFEB00C2A823 /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE2ADD752B61EFEB00C2A823 /* HomeViewModel.swift */; }; AE2ADD782B61EFFF00C2A823 /* SettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE2ADD772B61EFFE00C2A823 /* SettingsViewModel.swift */; }; AE2B8C1D2A9678C900815B2F /* FeeService.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE2B8C1C2A9678C900815B2F /* FeeService.swift */; }; AE2B8C1F2A96797300815B2F /* RecommendedFees.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE2B8C1E2A96797300815B2F /* RecommendedFees.swift */; }; @@ -36,7 +36,7 @@ AE34DDAC2B6B31ED00F04AD4 /* SeedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE34DDAB2B6B31ED00F04AD4 /* SeedView.swift */; }; AE34DDAE2B6B320F00F04AD4 /* SeedViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE34DDAD2B6B320F00F04AD4 /* SeedViewModel.swift */; }; AE3646262BEDB01200B04E25 /* FileManager+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE3646252BEDB01200B04E25 /* FileManager+Extensions.swift */; }; - AE3902A42A3B4CD900BEC318 /* TabHomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE3902A32A3B4CD900BEC318 /* TabHomeView.swift */; }; + AE3902A42A3B4CD900BEC318 /* HomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE3902A32A3B4CD900BEC318 /* HomeView.swift */; }; AE49847C2A1BBBD6009951E2 /* BDKSwiftExampleWalletApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE49847B2A1BBBD6009951E2 /* BDKSwiftExampleWalletApp.swift */; }; AE4984802A1BBBD7009951E2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AE49847F2A1BBBD7009951E2 /* Assets.xcassets */; }; AE4984832A1BBBD7009951E2 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AE4984822A1BBBD7009951E2 /* Preview Assets.xcassets */; }; @@ -119,7 +119,7 @@ AE29ED102BBE318A00EB9C4F /* TransactionItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionItemView.swift; sourceTree = ""; }; AE29ED142BBE36C500EB9C4F /* TransactionListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionListViewModel.swift; sourceTree = ""; }; AE2ADD732B61E8F500C2A823 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = ""; }; - AE2ADD752B61EFEB00C2A823 /* TabHomeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabHomeViewModel.swift; sourceTree = ""; }; + AE2ADD752B61EFEB00C2A823 /* HomeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewModel.swift; sourceTree = ""; }; AE2ADD772B61EFFE00C2A823 /* SettingsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewModel.swift; sourceTree = ""; }; AE2B8C1C2A9678C900815B2F /* FeeService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeeService.swift; sourceTree = ""; }; AE2B8C1E2A96797300815B2F /* RecommendedFees.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendedFees.swift; sourceTree = ""; }; @@ -127,7 +127,7 @@ AE34DDAB2B6B31ED00F04AD4 /* SeedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SeedView.swift; sourceTree = ""; }; AE34DDAD2B6B320F00F04AD4 /* SeedViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SeedViewModel.swift; sourceTree = ""; }; AE3646252BEDB01200B04E25 /* FileManager+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FileManager+Extensions.swift"; sourceTree = ""; }; - AE3902A32A3B4CD900BEC318 /* TabHomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabHomeView.swift; sourceTree = ""; }; + AE3902A32A3B4CD900BEC318 /* HomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeView.swift; sourceTree = ""; }; AE4984782A1BBBD6009951E2 /* BDKSwiftExampleWallet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BDKSwiftExampleWallet.app; sourceTree = BUILT_PRODUCTS_DIR; }; AE49847B2A1BBBD6009951E2 /* BDKSwiftExampleWalletApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BDKSwiftExampleWalletApp.swift; sourceTree = ""; }; AE49847F2A1BBBD7009951E2 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; @@ -211,7 +211,7 @@ isa = PBXGroup; children = ( AE0C30F82A804B65008F1EAE /* OnboardingViewModel.swift */, - AE2ADD752B61EFEB00C2A823 /* TabHomeViewModel.swift */, + AE2ADD752B61EFEB00C2A823 /* HomeViewModel.swift */, AE0C30FA2A804B95008F1EAE /* WalletViewModel.swift */, AE2381BA2C61256000F6B00C /* Activity */, AE2381BB2C61256E00F6B00C /* Receive */, @@ -239,7 +239,7 @@ isa = PBXGroup; children = ( AED4CC0B2A1D3A9400CE1831 /* OnboardingView.swift */, - AE3902A32A3B4CD900BEC318 /* TabHomeView.swift */, + AE3902A32A3B4CD900BEC318 /* HomeView.swift */, AED4CC0F2A1D522100CE1831 /* WalletView.swift */, AE2381B62C61253200F6B00C /* Activity */, AE2381B92C61255100F6B00C /* Receive */, @@ -640,7 +640,7 @@ AEC2CF5A2ABFBA19008065E4 /* BuildTransactionViewModel.swift in Sources */, AE2B8C1F2A96797300815B2F /* RecommendedFees.swift in Sources */, AE7F670C2A7451D700CED561 /* CurrencyCode.swift in Sources */, - AE2ADD762B61EFEB00C2A823 /* TabHomeViewModel.swift in Sources */, + AE2ADD762B61EFEB00C2A823 /* HomeViewModel.swift in Sources */, AE783A032AB4ECC2005F0CBA /* AddressView.swift in Sources */, AE7F67052A7446B600CED561 /* PriceService.swift in Sources */, AEAB03132ABDDBF4000C9528 /* AmountViewModel.swift in Sources */, @@ -685,7 +685,7 @@ AE29ED112BBE318A00EB9C4F /* TransactionItemView.swift in Sources */, AE34DDAE2B6B320F00F04AD4 /* SeedViewModel.swift in Sources */, AE0C30F92A804B65008F1EAE /* OnboardingViewModel.swift in Sources */, - AE3902A42A3B4CD900BEC318 /* TabHomeView.swift in Sources */, + AE3902A42A3B4CD900BEC318 /* HomeView.swift in Sources */, AE0C30FD2A804BC1008F1EAE /* ReceiveViewModel.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/BDKSwiftExampleWallet/App/BDKSwiftExampleWalletApp.swift b/BDKSwiftExampleWallet/App/BDKSwiftExampleWalletApp.swift index 47eeeefc..ef0e15d7 100644 --- a/BDKSwiftExampleWallet/App/BDKSwiftExampleWalletApp.swift +++ b/BDKSwiftExampleWallet/App/BDKSwiftExampleWalletApp.swift @@ -17,7 +17,7 @@ struct BDKSwiftExampleWalletApp: App { if isOnboarding { OnboardingView(viewModel: .init(bdkClient: .live)) } else { - TabHomeView(viewModel: .init(bdkClient: .live)) + HomeView(viewModel: .init(bdkClient: .live)) } } } diff --git a/BDKSwiftExampleWallet/Resources/Localizable.xcstrings b/BDKSwiftExampleWallet/Resources/Localizable.xcstrings index cc2515f1..8c2c4590 100644 --- a/BDKSwiftExampleWallet/Resources/Localizable.xcstrings +++ b/BDKSwiftExampleWallet/Resources/Localizable.xcstrings @@ -386,6 +386,9 @@ }, "Full Scan" : { + }, + "HomeView Error" : { + }, "Navigation Title" : { @@ -609,6 +612,7 @@ } }, "TabView Error" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { diff --git a/BDKSwiftExampleWallet/View Model/HomeViewModel.swift b/BDKSwiftExampleWallet/View Model/HomeViewModel.swift new file mode 100644 index 00000000..a0637e65 --- /dev/null +++ b/BDKSwiftExampleWallet/View Model/HomeViewModel.swift @@ -0,0 +1,38 @@ +// +// HomeViewModel.swift +// BDKSwiftExampleWallet +// +// Created by Matthew Ramsden on 1/24/24. +// + +import BitcoinDevKit +import Foundation + +@MainActor +@Observable +class HomeViewModel: ObservableObject { + let bdkClient: BDKClient + + var homeViewError: AppError? + var showingHomeViewErrorAlert = false + + init(bdkClient: BDKClient = .live) { + self.bdkClient = bdkClient + } + + func loadWallet() { + do { + try bdkClient.loadWallet() + } catch let error as DescriptorError { + self.homeViewError = .generic(message: error.localizedDescription) + self.showingHomeViewErrorAlert = true + } catch let error as LoadWithPersistError { + self.homeViewError = .generic(message: error.localizedDescription) + self.showingHomeViewErrorAlert = true + } catch { + self.homeViewError = .generic(message: error.localizedDescription) + self.showingHomeViewErrorAlert = true + } + } + +} diff --git a/BDKSwiftExampleWallet/View Model/TabHomeViewModel.swift b/BDKSwiftExampleWallet/View Model/TabHomeViewModel.swift deleted file mode 100644 index 67d46f9e..00000000 --- a/BDKSwiftExampleWallet/View Model/TabHomeViewModel.swift +++ /dev/null @@ -1,38 +0,0 @@ -// -// TabHomeViewModel.swift -// BDKSwiftExampleWallet -// -// Created by Matthew Ramsden on 1/24/24. -// - -import BitcoinDevKit -import Foundation - -@MainActor -@Observable -class TabHomeViewModel: ObservableObject { - let bdkClient: BDKClient - - var tabViewError: AppError? - var showingTabViewErrorAlert = false - - init(bdkClient: BDKClient = .live) { - self.bdkClient = bdkClient - } - - func loadWallet() { - do { - try bdkClient.loadWallet() - } catch let error as DescriptorError { - self.tabViewError = .generic(message: error.localizedDescription) - self.showingTabViewErrorAlert = true - } catch let error as LoadWithPersistError { - self.tabViewError = .generic(message: error.localizedDescription) - self.showingTabViewErrorAlert = true - } catch { - self.tabViewError = .generic(message: error.localizedDescription) - self.showingTabViewErrorAlert = true - } - } - -} diff --git a/BDKSwiftExampleWallet/View/TabHomeView.swift b/BDKSwiftExampleWallet/View/HomeView.swift similarity index 51% rename from BDKSwiftExampleWallet/View/TabHomeView.swift rename to BDKSwiftExampleWallet/View/HomeView.swift index 1960a241..d18a90b8 100644 --- a/BDKSwiftExampleWallet/View/TabHomeView.swift +++ b/BDKSwiftExampleWallet/View/HomeView.swift @@ -1,5 +1,5 @@ // -// TabHomeView.swift +// HomeView.swift // BDKSwiftExampleWallet // // Created by Matthew Ramsden on 6/15/23. @@ -7,38 +7,32 @@ import SwiftUI -struct TabHomeView: View { - @Bindable var viewModel: TabHomeViewModel +struct HomeView: View { + @Bindable var viewModel: HomeViewModel var body: some View { ZStack { Color(uiColor: UIColor.systemBackground) - TabView { - WalletView( - viewModel: .init( - priceClient: .live, - bdkClient: .live - ) + WalletView( + viewModel: .init( + priceClient: .live, + bdkClient: .live ) - .tabItem { - Image(systemName: "bitcoinsign") - } - - } + ) .tint(.primary) .onAppear { viewModel.loadWallet() } } - .alert(isPresented: $viewModel.showingTabViewErrorAlert) { + .alert(isPresented: $viewModel.showingHomeViewErrorAlert) { Alert( - title: Text("TabView Error"), - message: Text(viewModel.tabViewError?.description ?? "Unknown"), + title: Text("HomeView Error"), + message: Text(viewModel.homeViewError?.description ?? "Unknown"), dismissButton: .default(Text("OK")) { - viewModel.tabViewError = nil + viewModel.homeViewError = nil } ) } @@ -56,10 +50,10 @@ enum NavigationDestination: Hashable { #if DEBUG #Preview { - TabHomeView(viewModel: .init(bdkClient: .mock)) + HomeView(viewModel: .init(bdkClient: .mock)) } #Preview { - TabHomeView(viewModel: .init()) + HomeView(viewModel: .init()) .environment(\.dynamicTypeSize, .accessibility5) } #endif