File tree Expand file tree Collapse file tree 5 files changed +69
-8
lines changed Expand file tree Collapse file tree 5 files changed +69
-8
lines changed Original file line number Diff line number Diff line change 1
1
struct Feedback : Identifiable , Hashable {
2
2
var id : String { title }
3
-
4
3
let type : FeedbackType
5
4
let title : String
6
5
let description : String
Original file line number Diff line number Diff line change 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
+ }
3
41
}
Original file line number Diff line number Diff line change 1
- enum FeedbackType : String {
1
+ enum FeedbackType : String , Codable {
2
2
case comment
3
3
case bug
4
4
case feature
Original file line number Diff line number Diff line change
1
+ import Combine
1
2
import SwiftUI
2
3
3
4
class FeedbackViewModel : ObservableObject {
5
+ private var bag : Set < AnyCancellable >
4
6
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
+ }
5
31
}
Original file line number Diff line number Diff line change @@ -3,10 +3,8 @@ import XCTest
3
3
4
4
final class FeedbackKitTests : XCTestCase {
5
5
func testExample( ) throws {
6
- // XCTest Documentation
7
- // https://developer.apple.com/documentation/xctest
6
+ let store = FeedbackStore ( )
8
7
9
- // Defining Test Cases and Test Methods
10
- // https://developer.apple.com/documentation/xctest/defining_test_cases_and_test_methods
8
+
11
9
}
12
10
}
You can’t perform that action at this time.
0 commit comments