Skip to content

Commit bf4d2c0

Browse files
committed
add debug option
1 parent 02511ee commit bf4d2c0

2 files changed

Lines changed: 71 additions & 0 deletions

File tree

VoiceInk-ios/AppSettings.swift

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff 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

VoiceInk-ios/SettingsView.swift

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff 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

0 commit comments

Comments
 (0)