Skip to content

Commit 175eb2e

Browse files
Merge branch 'main' into shendy/feedback-list-view
2 parents 0d00f63 + 816cada commit 175eb2e

File tree

5 files changed

+69
-8
lines changed

5 files changed

+69
-8
lines changed

Sources/FeedbackKit/Feedback.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
struct Feedback: Identifiable, Hashable {
22
var id: String { title }
3-
43
let type: FeedbackType
54
let title: String
65
let description: String
Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,41 @@
1-
class FeedbackStore {
2-
1+
import AppState
2+
import Cache
3+
import Foundation
4+
5+
extension Application {
6+
fileprivate var storedFeedback: FileState<[UUID: Feedback]> {
7+
fileState(initial: [:], filename: "storedFeedback")
8+
}
9+
}
10+
11+
class FeedbackStore: ObservableObject {
12+
enum StoreError: Error {
13+
case missingValue
14+
}
15+
16+
@FileState(\.storedFeedback) private var storedFeedback: [UUID: Feedback]
17+
18+
func `set`(feedback: Feedback) {
19+
storedFeedback[feedback.id] = feedback
20+
}
21+
22+
func `get`(id: UUID) -> Feedback? {
23+
storedFeedback[id]
24+
}
25+
26+
func remove(id: UUID) {
27+
storedFeedback[id] = nil
28+
}
29+
30+
func update(id: UUID, _ block: (Feedback) -> Feedback) throws {
31+
guard let storedValue = get(id: id) else {
32+
throw StoreError.missingValue
33+
}
34+
35+
set(feedback: block(storedValue))
36+
}
37+
38+
func all() -> [Feedback] {
39+
Array(storedFeedback.values)
40+
}
341
}

Sources/FeedbackKit/FeedbackType.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
enum FeedbackType: String {
1+
enum FeedbackType: String, Codable {
22
case comment
33
case bug
44
case feature
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,31 @@
1+
import Combine
12
import SwiftUI
23

34
class FeedbackViewModel: ObservableObject {
5+
private var bag: Set<AnyCancellable>
46

7+
private let store: FeedbackStore
8+
9+
var feedback: [Feedback]
10+
11+
init() {
12+
bag = Set()
13+
store = FeedbackStore()
14+
feedback = store.all()
15+
16+
consume(object: store)
17+
}
18+
19+
private func consume<Object: ObservableObject>(
20+
object: Object
21+
) where ObjectWillChangePublisher == ObservableObjectPublisher {
22+
bag.insert(
23+
object.objectWillChange.sink(
24+
receiveCompletion: { _ in },
25+
receiveValue: { [weak self] _ in
26+
self?.objectWillChange.send()
27+
}
28+
)
29+
)
30+
}
531
}

Tests/FeedbackKitTests/FeedbackKitTests.swift

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,8 @@ import XCTest
33

44
final class FeedbackKitTests: XCTestCase {
55
func testExample() throws {
6-
// XCTest Documentation
7-
// https://developer.apple.com/documentation/xctest
6+
let store = FeedbackStore()
87

9-
// Defining Test Cases and Test Methods
10-
// https://developer.apple.com/documentation/xctest/defining_test_cases_and_test_methods
8+
119
}
1210
}

0 commit comments

Comments
 (0)