7
7
8
8
import SwiftUI
9
9
import AppKit
10
+ import UniformTypeIdentifiers
10
11
11
12
struct ContentView : View {
12
13
@State private var word : String = " Loading... "
@@ -158,13 +159,25 @@ struct ContentView: View {
158
159
159
160
func markAsMemorized( ) {
160
161
guard !word. isEmpty, !memorizedWords. contains ( word) else { return }
161
- memorizedWords. append ( word)
162
162
163
-
164
- saveMemorizedWords ( )
165
- loadRandomWord ( )
163
+ if UserDefaults . standard. string ( forKey: " memorizedWordsPath " ) == nil {
164
+ promptUserForSaveLocation { selectedURL in
165
+ if let selectedURL = selectedURL {
166
+ UserDefaults . standard. set ( selectedURL. path, forKey: " memorizedWordsPath " )
167
+ saveMemorizedWords ( )
168
+ loadRandomWord ( )
169
+ } else {
170
+ print ( " User canceled the save location selection. " )
171
+ }
172
+ }
173
+ } else {
174
+ memorizedWords. append ( word)
175
+ saveMemorizedWords ( )
176
+ loadRandomWord ( )
177
+ }
166
178
}
167
179
180
+
168
181
func saveMemorizedWords( ) {
169
182
let fileURL = getFileURL ( )
170
183
do {
@@ -188,8 +201,28 @@ struct ContentView: View {
188
201
}
189
202
190
203
func getFileURL( ) -> URL {
191
- let fileManager = FileManager . default
192
- let documentsURL = fileManager. urls ( for: . documentDirectory, in: . userDomainMask) . first!
193
- return documentsURL. appendingPathComponent ( " memorized_words.json " )
204
+ if let savedPath = UserDefaults . standard. string ( forKey: " memorizedWordsPath " ) ,
205
+ !savedPath. isEmpty {
206
+ return URL ( fileURLWithPath: savedPath)
207
+ } else {
208
+ let fileManager = FileManager . default
209
+ let documentsURL = fileManager. urls ( for: . documentDirectory, in: . userDomainMask) . first!
210
+ return documentsURL. appendingPathComponent ( " memorized_words.json " )
211
+ }
212
+ }
213
+
214
+ func promptUserForSaveLocation( completion: @escaping ( URL ? ) -> Void ) {
215
+ let savePanel = NSSavePanel ( )
216
+ savePanel. title = " Select Location for Memorized Words "
217
+ savePanel. allowedContentTypes = [ . json] // Use UTType.json
218
+ savePanel. nameFieldStringValue = " memorized_words.json "
219
+
220
+ savePanel. begin { response in
221
+ if response == . OK, let selectedURL = savePanel. url {
222
+ completion ( selectedURL)
223
+ } else {
224
+ completion ( nil )
225
+ }
226
+ }
194
227
}
195
228
}
0 commit comments