diff --git a/RippleChat/ContentView.swift b/RippleChat/ContentView.swift index adf5927..439bd7c 100644 --- a/RippleChat/ContentView.swift +++ b/RippleChat/ContentView.swift @@ -10,6 +10,7 @@ import CoreBluetooth struct ContentView: View { @ObservedObject private var bluetoothViewModel = BluetoothViewModel() + @StateObject private var store = FeedStore(feed: Feed.sampleFeed) var body: some View { VStack { @@ -17,6 +18,16 @@ struct ContentView: View { .imageScale(.large) .foregroundColor(.accentColor) Text("Hello, world!") + Spacer() + Button("Save Feed") { + Task { + do { + try await store.save(feed: Feed.sampleFeed) + } catch { + fatalError(error.localizedDescription) + } + } + } } .padding() NavigationView { diff --git a/RippleChat/Feed.swift b/RippleChat/Feed.swift index 5813b86..1579375 100644 --- a/RippleChat/Feed.swift +++ b/RippleChat/Feed.swift @@ -9,8 +9,14 @@ import Foundation struct Feed: Codable { + let feedID: String let feed: [LogEntry] + init(feedID: String = "", feed: [LogEntry] = []) { + self.feedID = feedID + self.feed = feed + } + } extension Feed { @@ -22,4 +28,6 @@ extension Feed { LogEntry(feedid: "BOB", sequenceNumber: 3, body: Body(tag: "txt", value: "Welcome Alice")) ] + static let sampleFeed: Feed = Feed(feedID: "BOB", feed: sampleData) + } diff --git a/RippleChat/FeedStore.swift b/RippleChat/FeedStore.swift index 7e86781..a78060c 100644 --- a/RippleChat/FeedStore.swift +++ b/RippleChat/FeedStore.swift @@ -10,33 +10,37 @@ import SwiftUI @MainActor class FeedStore: ObservableObject { - @Published var feed: [LogEntry] = [] + @Published var feed: Feed - private static func fileURL() throws -> URL { + init(feed: Feed) { + self.feed = feed + } + + private func fileURL() throws -> URL { try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false) - .appendingPathComponent("feed.data") + .appendingPathComponent("\(feed.feedID).json") } func load() async throws { - let task = Task<[LogEntry], Error> { - let fileURL = try Self.fileURL() + let task = Task { + let fileURL = try self.fileURL() guard let data = try? Data(contentsOf: fileURL) else { - return [] + return Feed() } - let logEntries = try JSONDecoder().decode([LogEntry].self, from: data) - return logEntries + let feed = try JSONDecoder().decode(Feed.self, from: data) + return feed } let feed = try await task.value self.feed = feed } - func save(feed: [LogEntry]) async throws { + func save(feed: Feed) async throws { let task = Task { let data = try JSONEncoder().encode(feed) - let outfile = try Self.fileURL() + let outfile = try self.fileURL() try data.write(to: outfile) } _ = try await task.value