From d8a7eb84188e7b0a13420fb97e82f45b8da31b51 Mon Sep 17 00:00:00 2001 From: Terry Yiu Date: Tue, 21 Jan 2025 22:45:14 -0500 Subject: [PATCH] Add GeneralSettingsModel and concept of active profile --- Yeti/Models/GeneralSettingsModel.swift | 16 +++++++++++++ Yeti/Models/ProfileSettingsModel.swift | 1 + Yeti/Views/ContentView.swift | 10 ++++++-- .../Views/SigningPolicyConfirmationView.swift | 23 +++++++++++++++++- Yeti/Views/SigningPolicySelectionView.swift | 3 +-- Yeti/YetiApp.swift | 24 +++++++++++++++---- 6 files changed, 68 insertions(+), 9 deletions(-) create mode 100644 Yeti/Models/GeneralSettingsModel.swift diff --git a/Yeti/Models/GeneralSettingsModel.swift b/Yeti/Models/GeneralSettingsModel.swift new file mode 100644 index 0000000..726145c --- /dev/null +++ b/Yeti/Models/GeneralSettingsModel.swift @@ -0,0 +1,16 @@ +// +// GeneralSettingsModel.swift +// Yeti +// +// Created by Terry Yiu on 1/21/25. +// + +import Foundation +import SwiftData + +@Model +final class GeneralSettingsModel { + var activePublicKey: String? + + init() { } +} diff --git a/Yeti/Models/ProfileSettingsModel.swift b/Yeti/Models/ProfileSettingsModel.swift index d04c08a..7e0287a 100644 --- a/Yeti/Models/ProfileSettingsModel.swift +++ b/Yeti/Models/ProfileSettingsModel.swift @@ -13,6 +13,7 @@ final class ProfileSettingsModel { @Attribute(.unique) var publicKey: String var nostrClientModels: [NostrClientModel] = [] + var signingPolicy: SigningPolicy? init(publicKey: String) { self.publicKey = publicKey diff --git a/Yeti/Views/ContentView.swift b/Yeti/Views/ContentView.swift index e46ce76..07b0c42 100644 --- a/Yeti/Views/ContentView.swift +++ b/Yeti/Views/ContentView.swift @@ -10,10 +10,16 @@ import SwiftData struct ContentView: View { @Environment(\.modelContext) private var modelContext + @Query var generalSettingsModels: [GeneralSettingsModel] var body: some View { -// OnboardingView() - LoggedInView() + Group { + if generalSettingsModels.first!.activePublicKey == nil { + OnboardingView() + } else { + LoggedInView() + } + } } } diff --git a/Yeti/Views/SigningPolicyConfirmationView.swift b/Yeti/Views/SigningPolicyConfirmationView.swift index 16d8e3b..676e127 100644 --- a/Yeti/Views/SigningPolicyConfirmationView.swift +++ b/Yeti/Views/SigningPolicyConfirmationView.swift @@ -5,11 +5,18 @@ // Created by Terry Yiu on 1/20/25. // +import NostrSDK +import SwiftData import SwiftUI struct SigningPolicyConfirmationView: View { + let keypair: Keypair let signingPolicy: SigningPolicy + @Environment(\.modelContext) private var modelContext + + @Query private var generalSettingsModels: [GeneralSettingsModel] + var body: some View { VStack { Text("Hooo-raaaayyy!", comment: "Title of view that confirms the user’s selection of the signing policy.") @@ -34,11 +41,25 @@ You’re set for now. You’ll need to come back here with every new app and app ) .font(.caption) } + + Button("Done", action: { + PrivateKeySecureStorage.shared.store(for: keypair) + + let profileSettingsModel = ProfileSettingsModel(publicKey: keypair.publicKey.hex) + profileSettingsModel.signingPolicy = signingPolicy + modelContext.insert(profileSettingsModel) + + generalSettingsModels.first!.activePublicKey = keypair.publicKey.hex + }) + .buttonStyle(.borderedProminent) } .toolbar(.hidden) } } #Preview { - SigningPolicyConfirmationView(signingPolicy: .basic) + SigningPolicyConfirmationView( + keypair: Keypair()!, + signingPolicy: .basic + ) } diff --git a/Yeti/Views/SigningPolicySelectionView.swift b/Yeti/Views/SigningPolicySelectionView.swift index 2cf4c71..25ac27b 100644 --- a/Yeti/Views/SigningPolicySelectionView.swift +++ b/Yeti/Views/SigningPolicySelectionView.swift @@ -55,7 +55,6 @@ struct SigningPolicySelectionView: View { ) Button("Done", action: { - PrivateKeySecureStorage.shared.store(for: keypair) navigationDestinationPresented = true }) .buttonStyle(.borderedProminent) @@ -64,7 +63,7 @@ struct SigningPolicySelectionView: View { .background(Color(UIColor.systemGroupedBackground)) } .navigationDestination(isPresented: $navigationDestinationPresented) { - SigningPolicyConfirmationView(signingPolicy: signingPolicy) + SigningPolicyConfirmationView(keypair: keypair, signingPolicy: signingPolicy) } } } diff --git a/Yeti/YetiApp.swift b/Yeti/YetiApp.swift index 71a1b27..8d9cf75 100644 --- a/Yeti/YetiApp.swift +++ b/Yeti/YetiApp.swift @@ -12,23 +12,39 @@ import SwiftData struct YetiApp: App { @UIApplicationDelegateAdaptor private var appDelegate: AppDelegate - var sharedModelContainer: ModelContainer = { + private let modelContainer: ModelContainer + + init() { let schema = Schema([ + GeneralSettingsModel.self, ProfileSettingsModel.self ]) let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false) do { - return try ModelContainer(for: schema, configurations: [modelConfiguration]) + modelContainer = try ModelContainer(for: schema, configurations: [modelConfiguration]) } catch { fatalError("Could not create ModelContainer: \(error)") } - }() + + var descriptor = FetchDescriptor() + descriptor.fetchLimit = 1 + + if (try? modelContainer.mainContext.fetch(descriptor))?.first == nil { + let newGeneralSettingsModel = GeneralSettingsModel() + modelContainer.mainContext.insert(newGeneralSettingsModel) + do { + try modelContainer.mainContext.save() + } catch { + fatalError("Unable to save initial GeneralSettingsModel.") + } + } + } var body: some Scene { WindowGroup { ContentView() } - .modelContainer(sharedModelContainer) + .modelContainer(modelContainer) } }