Improve Persistence Handling

This commit is contained in:
Sebastian Lenzlinger 2023-07-12 17:01:45 +02:00
parent d218e9b600
commit 8f4ecf0cb2
5 changed files with 39 additions and 3 deletions

View File

@ -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<Feed, Error> {
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
}
}

View File

@ -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 {

View File

@ -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 {

View File

@ -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")
}

View File

@ -51,6 +51,7 @@ struct SettingsView: View {
ToolbarItem(placement: .confirmationAction) {
Button("Done") {
isPresentingEditView = false
dataStore.personalFeed = Feed(feedID: dataStore.personalID)
}
}
}