File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -273,6 +273,40 @@ final class AppSettings: ObservableObject {
273273 }
274274 return " "
275275 }
276+
277+ // MARK: - Debug Reset
278+ /// Remove all persisted preferences, API keys, and modes.
279+ func resetAll( ) {
280+ // Clear modes and selection
281+ modes = [ ]
282+ selectedModeId = nil
283+ UserDefaults . standard. removeObject ( forKey: " modes " )
284+ UserDefaults . standard. removeObject ( forKey: " selectedModeId " )
285+
286+ // Clear verification flags
287+ groqKeyVerified = false
288+ openAIKeyVerified = false
289+ deepgramKeyVerified = false
290+ cerebrasKeyVerified = false
291+ geminiKeyVerified = false
292+ UserDefaults . standard. removeObject ( forKey: " groqKeyVerified " )
293+ UserDefaults . standard. removeObject ( forKey: " openAIKeyVerified " )
294+ UserDefaults . standard. removeObject ( forKey: " deepgramKeyVerified " )
295+ UserDefaults . standard. removeObject ( forKey: " cerebrasKeyVerified " )
296+ UserDefaults . standard. removeObject ( forKey: " geminiKeyVerified " )
297+
298+ // Clear API keys from memory and Keychain
299+ groqAPIKey = " "
300+ openAIAPIKey = " "
301+ deepgramAPIKey = " "
302+ cerebrasAPIKey = " "
303+ geminiAPIKey = " "
304+ _ = KeychainService . delete ( key: " groqAPIKey " )
305+ _ = KeychainService . delete ( key: " openAIAPIKey " )
306+ _ = KeychainService . delete ( key: " deepgramAPIKey " )
307+ _ = KeychainService . delete ( key: " cerebrasAPIKey " )
308+ _ = KeychainService . delete ( key: " geminiAPIKey " )
309+ }
276310}
277311
278312
Original file line number Diff line number Diff line change @@ -47,13 +47,50 @@ struct SettingsView: View {
4747 }
4848
4949
50+ #if DEBUG
51+ Section ( header: Text ( " Debug " ) ) {
52+ Button ( role: . destructive) {
53+ resetAppData ( )
54+ } label: {
55+ Label ( " Reset All App Data " , systemImage: " trash " )
56+ }
57+ }
58+ #endif
5059 }
5160 . navigationTitle ( " Settings " )
5261 }
5362
5463 private func deleteMode( at offsets: IndexSet ) {
5564 settings. modes. remove ( atOffsets: offsets)
5665 }
66+
67+ #if DEBUG
68+ private func resetAppData( ) {
69+ // 1) Delete all SwiftData Transcription records
70+ do {
71+ let descriptor = FetchDescriptor < Transcription > ( )
72+ let modelContainer = try ModelContainer ( for: Transcription . self)
73+ let context = ModelContext ( modelContainer)
74+ let notes = try context. fetch ( descriptor)
75+ for note in notes {
76+ context. delete ( note)
77+ }
78+ try ? context. save ( )
79+ } catch {
80+ print ( " Failed to reset SwiftData: \( error) " )
81+ }
82+
83+ // 2) Delete audio files directory
84+ let documentsURL = FileManager . default. urls ( for: . documentDirectory, in: . userDomainMask) [ 0 ]
85+ let recordingsDir = documentsURL. appendingPathComponent ( " Recordings " )
86+ if FileManager . default. fileExists ( atPath: recordingsDir. path) {
87+ try ? FileManager . default. removeItem ( at: recordingsDir)
88+ }
89+
90+ // 3) Reset settings, modes, and keys
91+ settings. resetAll ( )
92+ }
93+ #endif
5794}
5895
5996
You can’t perform that action at this time.
0 commit comments