1
1
import Foundation
2
+ import SwiftUI
2
3
3
- struct UserTrainingData : Codable {
4
+ struct UserTrainingData : Codable , Identifiable {
5
+ var id = UUID ( )
6
+ let shortName : String
7
+
4
8
var timeSpent : TimeInterval
5
9
var correctAnswers : Int
6
10
var wrongAnswers : Int
7
11
var questionAttempts : [ UUID : Int ] // Mapping question ID to the number of attempts
8
12
var questionStats : [ UUID : QuestionStats ] // Mapping question ID to the stats
9
13
10
- init ( ) {
14
+ init ( shortName: String ) {
15
+ self . shortName = shortName
11
16
self . timeSpent = 0
12
17
self . correctAnswers = 0
13
18
self . wrongAnswers = 0
@@ -16,6 +21,7 @@ struct UserTrainingData: Codable {
16
21
}
17
22
18
23
mutating func updateStats( for questionID: UUID , correctChoices: Set < UUID > , selectedChoices: Set < UUID > ) {
24
+
19
25
// Update question attempts
20
26
if let attempts = questionAttempts [ questionID] {
21
27
questionAttempts [ questionID] = attempts + 1
@@ -38,7 +44,6 @@ struct UserTrainingData: Codable {
38
44
self . questionStats [ questionID] = QuestionStats ( timesViewed: 1 , timesCorrect: timesCorrect, timesIncorrect: timesIncorrect)
39
45
}
40
46
}
41
-
42
47
}
43
48
44
49
struct QuestionStats : Codable {
@@ -47,33 +52,42 @@ struct QuestionStats: Codable {
47
52
var timesIncorrect : Int
48
53
}
49
54
50
- class UserTrainingStore {
55
+ class UserTrainingStore : ObservableObject {
51
56
static let shared = UserTrainingStore ( )
52
- private let userDefaultsKey = " userTrainingData "
57
+ private let userDefaultsKeyPrefix = " userTrainingData_ "
53
58
54
- private init ( ) {
55
- loadTrainingData ( )
56
- }
59
+ private init ( ) { }
57
60
58
- var trainingData : UserTrainingData = UserTrainingData ( )
61
+ @ Published var trainingData : [ String : UserTrainingData ] = [ : ]
59
62
60
- func loadTrainingData( ) {
61
- if let data = UserDefaults . standard. data ( forKey: userDefaultsKey) {
62
- if let decodedData = try ? JSONDecoder ( ) . decode ( UserTrainingData . self, from: data) {
63
- trainingData = decodedData
64
- }
63
+ func loadTrainingData( forCourse shortName: String ) -> UserTrainingData {
64
+ if let data = UserDefaults . standard. data ( forKey: userDefaultsKeyPrefix + shortName) ,
65
+ let decodedData = try ? JSONDecoder ( ) . decode ( UserTrainingData . self, from: data) {
66
+ trainingData [ shortName] = decodedData
67
+ return decodedData
68
+ } else {
69
+ let newTrainingData = UserTrainingData ( shortName: shortName)
70
+ trainingData [ shortName] = newTrainingData
71
+ return newTrainingData
65
72
}
66
73
}
67
74
68
- func saveTrainingData( ) {
69
- if let data = try ? JSONEncoder ( ) . encode ( trainingData) {
70
- UserDefaults . standard. set ( data, forKey: userDefaultsKey)
75
+ func saveTrainingData( _ data: UserTrainingData ) {
76
+ trainingData [ data. shortName] = data
77
+ if let encoded = try ? JSONEncoder ( ) . encode ( data) {
78
+ UserDefaults . standard. set ( encoded, forKey: userDefaultsKeyPrefix + data. shortName)
71
79
}
72
80
}
73
81
74
- func resetTrainingData( ) {
75
- trainingData = UserTrainingData ( )
76
- saveTrainingData ( )
77
- UserDefaults . standard. removeObject ( forKey: userDefaultsKey)
82
+ func deleteTrainingData( forCourse shortName: String ) {
83
+ trainingData. removeValue ( forKey: shortName)
84
+ UserDefaults . standard. removeObject ( forKey: userDefaultsKeyPrefix + shortName)
85
+ }
86
+
87
+ func deleteAllTrainingData( ) {
88
+ trainingData. keys. forEach { shortName in
89
+ UserDefaults . standard. removeObject ( forKey: userDefaultsKeyPrefix + shortName)
90
+ }
91
+ trainingData. removeAll ( )
78
92
}
79
93
}
0 commit comments