Improve Persistence Handling
This commit is contained in:
parent
d218e9b600
commit
8f4ecf0cb2
@ -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
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -17,6 +17,7 @@ struct SettingsEditView: View {
|
||||
//Label(dataStore.personalID, systemImage: "person.crop.circle")
|
||||
HStack {
|
||||
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")
|
||||
}
|
||||
|
||||
@ -51,6 +51,7 @@ struct SettingsView: View {
|
||||
ToolbarItem(placement: .confirmationAction) {
|
||||
Button("Done") {
|
||||
isPresentingEditView = false
|
||||
dataStore.personalFeed = Feed(feedID: dataStore.personalID)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user