From 8f4ecf0cb2041f4a4789b10c7ba7abee3fd73e9d Mon Sep 17 00:00:00 2001 From: Sebastian Lenzlinger <74497638+sebaschi@users.noreply.github.com> Date: Wed, 12 Jul 2023 17:01:45 +0200 Subject: [PATCH] Improve Persistence Handling --- RippleChat/DataStore.swift | 29 ++++++++++++++++++++++++- RippleChat/RippleChatApp.swift | 2 ++ RippleChat/Views/NewFeedEntryView.swift | 2 +- RippleChat/Views/SettingsEditView.swift | 8 ++++++- RippleChat/Views/SettingsView.swift | 1 + 5 files changed, 39 insertions(+), 3 deletions(-) diff --git a/RippleChat/DataStore.swift b/RippleChat/DataStore.swift index f1b6b3c..2a50416 100644 --- a/RippleChat/DataStore.swift +++ b/RippleChat/DataStore.swift @@ -11,15 +11,20 @@ import Foundation @MainActor class DataStore: ObservableObject { @Published var personalID: String + @Published var personalFeed: Feed @Published var friends: [String:Int] @Published var feedStores: [FeedStore] - init(personalID: String = "", friends: [String:Int] = [:], feedStores: [FeedStore] = []) { + + init(personalID: String = "", personalFeed: Feed = Feed(), friends: [String:Int] = [:], feedStores: [FeedStore] = []) { self.personalID = personalID self.friends = friends self.feedStores = feedStores + self.personalFeed = personalFeed } + + private func fileURL(for filename: String) throws -> URL { try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, @@ -90,6 +95,28 @@ class DataStore: ObservableObject { _ = try await task.value } + func savePersonalFeed() async throws { + let task = Task { + let data = try JSONEncoder().encode(personalFeed) + let outfile = try fileURL(for: "personalFeed") + try data.write(to: outfile) + } + _ = try await task.value + } + + func loadPersonalFeed() async throws { + let task = Task { + let fileURL = try self.fileURL(for: "personalFeed") + guard let data = try? Data(contentsOf: fileURL) else { + return Feed(feedID: self.personalID) + } + let personalFeed = try JSONDecoder().decode(Feed.self, from: data) + return personalFeed + } + let personalFeed = try await task.value + self.personalFeed = personalFeed + } + } diff --git a/RippleChat/RippleChatApp.swift b/RippleChat/RippleChatApp.swift index df4264f..08ee40a 100644 --- a/RippleChat/RippleChatApp.swift +++ b/RippleChat/RippleChatApp.swift @@ -16,6 +16,7 @@ struct RippleChatApp: App { Task { do { try await dataStore.savePersonalID() + try await dataStore.savePersonalFeed() try await dataStore.saveFriends() try await dataStore.saveFeedStores() } catch { @@ -27,6 +28,7 @@ struct RippleChatApp: App { .task { do { try await dataStore.loadPersonalID() + try await dataStore.loadPersonalFeed() try await dataStore.loadFriends() try await dataStore.loadFeedStores() } catch { diff --git a/RippleChat/Views/NewFeedEntryView.swift b/RippleChat/Views/NewFeedEntryView.swift index 64c4b08..f0b2a5d 100644 --- a/RippleChat/Views/NewFeedEntryView.swift +++ b/RippleChat/Views/NewFeedEntryView.swift @@ -9,7 +9,7 @@ import SwiftUI struct NewFeedEntryView: View { @State private var newEntry: String = "" - + @EnvironmentObject var dataStore: DataStore var body: some View { VStack(alignment: .leading) { HStack { diff --git a/RippleChat/Views/SettingsEditView.swift b/RippleChat/Views/SettingsEditView.swift index 314f9e4..327c631 100644 --- a/RippleChat/Views/SettingsEditView.swift +++ b/RippleChat/Views/SettingsEditView.swift @@ -16,7 +16,8 @@ struct SettingsEditView: View { Section(header: Text("Personal Feed ID")) { //Label(dataStore.personalID, systemImage: "person.crop.circle") HStack { - TextField(dataStore.personalID, text: $dataStore.personalID) + TextField(dataStore.personalID, text: $dataStore.personalID) + } } Section(header: Text("Friends")) { @@ -30,16 +31,21 @@ struct SettingsEditView: View { let key = dataStore.friends.keys.sorted()[index] dataStore.friends.removeValue(forKey: key) } + dataStore.feedStores.remove(atOffsets: indexSet) } } HStack { TextField("New Feed", text: $newFeedID) Button(action: { + let newFeed = Feed(feedID: newFeedID) + let newFeedStore = FeedStore(feed: newFeed) + dataStore.feedStores.append(newFeedStore) withAnimation { dataStore.friends[newFeedID] = 0 newFeedID = "" } + }) { Image(systemName: "plus.circle.fill") } diff --git a/RippleChat/Views/SettingsView.swift b/RippleChat/Views/SettingsView.swift index 88f4ee4..9c25c18 100644 --- a/RippleChat/Views/SettingsView.swift +++ b/RippleChat/Views/SettingsView.swift @@ -51,6 +51,7 @@ struct SettingsView: View { ToolbarItem(placement: .confirmationAction) { Button("Done") { isPresentingEditView = false + dataStore.personalFeed = Feed(feedID: dataStore.personalID) } } }