From 6507b50666f2ec978ab5d22cbad295afc9b3d323 Mon Sep 17 00:00:00 2001 From: "severin.memmishofer" Date: Wed, 12 Jul 2023 17:58:21 +0200 Subject: [PATCH] Added FeedCardView --- RippleChat.xcodeproj/project.pbxproj | 8 ++++++ RippleChat/ContentView.swift | 4 +-- RippleChat/FeedStore.swift | 3 ++- RippleChat/LogEntry.swift | 2 +- RippleChat/Views/FeedCardView.swift | 40 ++++++++++++++++++++++++++++ RippleChat/Views/FeedListView.swift | 19 +++++-------- RippleChat/Views/FeedView.swift | 20 ++++++++++++++ RippleChat/Views/LogEntryView.swift | 20 ++++++++++++++ 8 files changed, 100 insertions(+), 16 deletions(-) create mode 100644 RippleChat/Views/FeedCardView.swift create mode 100644 RippleChat/Views/FeedView.swift create mode 100644 RippleChat/Views/LogEntryView.swift diff --git a/RippleChat.xcodeproj/project.pbxproj b/RippleChat.xcodeproj/project.pbxproj index d175a68..4d7273a 100644 --- a/RippleChat.xcodeproj/project.pbxproj +++ b/RippleChat.xcodeproj/project.pbxproj @@ -29,6 +29,8 @@ F5A4B1232A5D5F8B00F5AE01 /* BTPeripheral.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5A4B1222A5D5F8B00F5AE01 /* BTPeripheral.swift */; }; F5A4B1252A5D7A8D00F5AE01 /* DataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5A4B1242A5D7A8D00F5AE01 /* DataStore.swift */; }; F5A4B1272A5D861E00F5AE01 /* SettingsEditView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5A4B1262A5D861E00F5AE01 /* SettingsEditView.swift */; }; + F5F1419C2A5EFA3600C81B1A /* LogEntryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5F1419B2A5EFA3600C81B1A /* LogEntryView.swift */; }; + F5F1419E2A5EFA4700C81B1A /* FeedCardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5F1419D2A5EFA4700C81B1A /* FeedCardView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -74,6 +76,8 @@ F5A4B1222A5D5F8B00F5AE01 /* BTPeripheral.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BTPeripheral.swift; sourceTree = ""; }; F5A4B1242A5D7A8D00F5AE01 /* DataStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataStore.swift; sourceTree = ""; }; F5A4B1262A5D861E00F5AE01 /* SettingsEditView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsEditView.swift; sourceTree = ""; }; + F5F1419B2A5EFA3600C81B1A /* LogEntryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogEntryView.swift; sourceTree = ""; }; + F5F1419D2A5EFA4700C81B1A /* FeedCardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedCardView.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -176,6 +180,8 @@ 96BD33152A5C403C007A6E53 /* PeeringView.swift */, F5A4B1202A5D4D1F00F5AE01 /* SettingsView.swift */, F5A4B1262A5D861E00F5AE01 /* SettingsEditView.swift */, + F5F1419B2A5EFA3600C81B1A /* LogEntryView.swift */, + F5F1419D2A5EFA4700C81B1A /* FeedCardView.swift */, ); path = Views; sourceTree = ""; @@ -320,8 +326,10 @@ 96BD33102A5C27B0007A6E53 /* NewFeedEntryView.swift in Sources */, F5A4B1232A5D5F8B00F5AE01 /* BTPeripheral.swift in Sources */, F5A4B1252A5D7A8D00F5AE01 /* DataStore.swift in Sources */, + F5F1419C2A5EFA3600C81B1A /* LogEntryView.swift in Sources */, F5847B6A2A59AB24009E28D4 /* FeedStore.swift in Sources */, F5A4B1272A5D861E00F5AE01 /* SettingsEditView.swift in Sources */, + F5F1419E2A5EFA4700C81B1A /* FeedCardView.swift in Sources */, F581F59B2A5AE72F0081C383 /* BluetoothController.swift in Sources */, 96454F1D2A558EBC0040BEBD /* ContentView.swift in Sources */, F5A4B1212A5D4D1F00F5AE01 /* SettingsView.swift in Sources */, diff --git a/RippleChat/ContentView.swift b/RippleChat/ContentView.swift index 0eed3ba..dcbc02c 100644 --- a/RippleChat/ContentView.swift +++ b/RippleChat/ContentView.swift @@ -21,14 +21,14 @@ struct ContentView: View { PeeringView() .environmentObject(dataStore) case 1: - FeedListView(feeds: []) + FeedListView() .environmentObject(dataStore) case 2: SettingsView() .environmentObject(dataStore) .navigationTitle("Settings") default: - FeedListView(feeds: []) + FeedListView() .environmentObject(dataStore) } HStack { diff --git a/RippleChat/FeedStore.swift b/RippleChat/FeedStore.swift index a78060c..127e01f 100644 --- a/RippleChat/FeedStore.swift +++ b/RippleChat/FeedStore.swift @@ -8,8 +8,9 @@ import SwiftUI @MainActor -class FeedStore: ObservableObject { +class FeedStore: ObservableObject, Identifiable { + let id: UUID = UUID() @Published var feed: Feed init(feed: Feed) { diff --git a/RippleChat/LogEntry.swift b/RippleChat/LogEntry.swift index 09dae68..3ce0187 100644 --- a/RippleChat/LogEntry.swift +++ b/RippleChat/LogEntry.swift @@ -13,7 +13,7 @@ struct LogEntry: Codable { let sequenceNumber: Int let body: Body - init(feedid: String, sequenceNumber: Int, body: Body) { + init(feedid: String = "", sequenceNumber: Int = 0, body: Body = Body()) { self.feedid = feedid self.sequenceNumber = sequenceNumber self.body = body diff --git a/RippleChat/Views/FeedCardView.swift b/RippleChat/Views/FeedCardView.swift new file mode 100644 index 0000000..3d3173f --- /dev/null +++ b/RippleChat/Views/FeedCardView.swift @@ -0,0 +1,40 @@ +// +// FeedDetailView.swift +// RippleChat +// +// Created by Severin Memmishofer on 12.07.23. +// + +import SwiftUI + +struct FeedCardView: View { + @EnvironmentObject var dataStore: DataStore + var feed: Feed + + private var lastLogEntry: LogEntry { + if feed.feed.isEmpty { + return LogEntry() + } else { + return feed.feed.last! + } + } + + var body: some View { + VStack (alignment: .leading) { + HStack { + Text("feedID: \(feed.feedID)") + Spacer() + Text("Sequence Number: \(lastLogEntry.sequenceNumber)") + } + Text("Log Entry: \(lastLogEntry.body.value)") + } + .padding() + } +} + +struct FeedDetailView_Previews: PreviewProvider { + static var previews: some View { + FeedCardView(feed: Feed.sampleFeed) + .environmentObject(DataStore.sampleDataStore) + } +} diff --git a/RippleChat/Views/FeedListView.swift b/RippleChat/Views/FeedListView.swift index 174919a..3eb8de1 100644 --- a/RippleChat/Views/FeedListView.swift +++ b/RippleChat/Views/FeedListView.swift @@ -8,9 +8,6 @@ import SwiftUI struct FeedListView: View { - @State var feeds: [Feed] - @StateObject var store = FeedStore(feed: Feed.sampleFeed) - var feedStores = [FeedStore(feed: Feed.sampleFeed), FeedStore(feed: Feed.sampleFeed2)] @EnvironmentObject var dataStore: DataStore var body: some View { @@ -20,23 +17,21 @@ struct FeedListView: View { .foregroundColor(.accentColor) Text("Hello, world!") Button("Save Feed") { - Task { - do { - try await DataStore.sampleDataStore.saveFriends() - try await DataStore.sampleDataStore.savePersonalID() - try await DataStore.sampleDataStore.saveFeedStores() - } catch { - fatalError(error.localizedDescription) + } + NavigationStack { + List(dataStore.feedStores) { feedStore in + NavigationLink(destination: Text(feedStore.feed.feedID)) { + FeedCardView(feed: feedStore.feed) } } } - Spacer() NewFeedEntryView() } } struct FeedListView_Previews: PreviewProvider { static var previews: some View { - FeedListView(feeds: []) + FeedListView() + .environmentObject(DataStore.sampleDataStore) } } diff --git a/RippleChat/Views/FeedView.swift b/RippleChat/Views/FeedView.swift new file mode 100644 index 0000000..5bd2167 --- /dev/null +++ b/RippleChat/Views/FeedView.swift @@ -0,0 +1,20 @@ +// +// FeedView.swift +// RippleChat +// +// Created by Severin Memmishofer on 12.07.23. +// + +import SwiftUI + +struct FeedView: View { + var body: some View { + Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) + } +} + +struct FeedView_Previews: PreviewProvider { + static var previews: some View { + FeedView() + } +} diff --git a/RippleChat/Views/LogEntryView.swift b/RippleChat/Views/LogEntryView.swift new file mode 100644 index 0000000..dc3c80e --- /dev/null +++ b/RippleChat/Views/LogEntryView.swift @@ -0,0 +1,20 @@ +// +// LogEntryView.swift +// RippleChat +// +// Created by Severin Memmishofer on 12.07.23. +// + +import SwiftUI + +struct LogEntryView: View { + var body: some View { + Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) + } +} + +struct LogEntryView_Previews: PreviewProvider { + static var previews: some View { + LogEntryView() + } +}