feat: actually implement system audio + refactor

This commit is contained in:
Owen Gretzinger
2025-07-10 16:45:19 -04:00
parent 417d751d7a
commit 297bb40b89
21 changed files with 1307 additions and 615 deletions
+17 -73
View File
@@ -8,80 +8,24 @@
import SwiftUI
struct ContentView: View {
@StateObject private var audioManager = SimpleAudioManager()
@State private var deepgramKey = ""
@State private var openAIKey = ""
@State private var userBlurb = ""
@State private var systemPrompt = "Generate meeting notes from transcript and notes."
var body: some View {
VStack(spacing: 20) {
Text("Notetaker Settings")
.font(.title)
TextField("Deepgram API Key", text: $deepgramKey)
TextField("OpenAI API Key", text: $openAIKey)
TextField("About Yourself (for prompt)", text: $userBlurb)
TextEditor(text: $systemPrompt)
.frame(height: 100)
Button("Save") {
saveSettings()
}
Divider()
Toggle("Capture System Audio", isOn: $audioManager.captureSystemAudio)
.disabled(audioManager.isRecording)
HStack {
Button("Start Recording") {
audioManager.startRecording()
}
.disabled(audioManager.isRecording)
Button("Stop Recording") {
audioManager.stopRecording()
}
.disabled(!audioManager.isRecording)
}
if audioManager.isRecording {
Text(audioManager.captureSystemAudio ? "🔴 Recording microphone + system audio..." : "🔴 Recording microphone...")
.foregroundColor(.red)
}
Text("Live Transcript:")
.font(.headline)
ScrollView {
Text(audioManager.transcript.isEmpty ? "No transcript yet..." : audioManager.transcript)
.frame(maxWidth: .infinity, alignment: .leading)
.padding()
}
.frame(height: 150)
.border(Color.gray)
}
.padding()
.frame(minWidth: 500, minHeight: 600)
.onAppear {
loadSettings()
}
}
@State private var showingSettings = false
func saveSettings() {
_ = KeychainHelper.shared.save(deepgramKey, forKey: "deepgramKey")
_ = KeychainHelper.shared.save(openAIKey, forKey: "openAIKey")
_ = KeychainHelper.shared.save(userBlurb, forKey: "userBlurb")
_ = KeychainHelper.shared.save(systemPrompt, forKey: "systemPrompt")
print("Settings saved!")
}
private func loadSettings() {
deepgramKey = KeychainHelper.shared.get(forKey: "deepgramKey") ?? ""
openAIKey = KeychainHelper.shared.get(forKey: "openAIKey") ?? ""
userBlurb = KeychainHelper.shared.get(forKey: "userBlurb") ?? ""
systemPrompt = KeychainHelper.shared.get(forKey: "systemPrompt") ?? "Generate meeting notes from transcript and notes."
var body: some View {
VStack {
MeetingListView()
.toolbar {
ToolbarItem(placement: .automatic) {
Button {
showingSettings = true
} label: {
Label("Settings", systemImage: "gear")
}
}
}
}
.sheet(isPresented: $showingSettings) {
SettingsView()
}
}
}