101 lines
4.0 KiB
Swift
101 lines
4.0 KiB
Swift
import SwiftUI
|
|
|
|
struct SettingsView: View {
|
|
@ObservedObject var viewModel: SettingsViewModel
|
|
@Environment(\.dismiss) private var dismiss
|
|
|
|
var body: some View {
|
|
NavigationStack {
|
|
ScrollView {
|
|
VStack(alignment: .leading, spacing: 24) {
|
|
// API Configuration Section
|
|
VStack(alignment: .leading, spacing: 8) {
|
|
Text("OpenAI API Key")
|
|
.font(.headline)
|
|
.foregroundColor(.primary)
|
|
|
|
Text("Stored locally and encrypted.")
|
|
.font(.caption)
|
|
.foregroundColor(.secondary)
|
|
|
|
SecureField("OpenAI API Key", text: $viewModel.settings.openAIKey)
|
|
.textFieldStyle(.roundedBorder)
|
|
.frame(maxWidth: .infinity)
|
|
}
|
|
|
|
// User Information Section
|
|
VStack(alignment: .leading, spacing: 8) {
|
|
Text("User Information")
|
|
.font(.headline)
|
|
.foregroundColor(.primary)
|
|
|
|
Text("Meetingsnotes works best when it knows a bit about you. You should give your name, role, company, and any other relevant information.")
|
|
.font(.caption)
|
|
.foregroundColor(.secondary)
|
|
|
|
TextEditor(text: $viewModel.settings.userBlurb)
|
|
.frame(minHeight: 100)
|
|
.overlay(
|
|
RoundedRectangle(cornerRadius: 8)
|
|
.stroke(Color.gray.opacity(0.3), lineWidth: 1)
|
|
)
|
|
|
|
}
|
|
|
|
// System Prompt Section
|
|
VStack(alignment: .leading, spacing: 8) {
|
|
Text("System Prompt")
|
|
.font(.headline)
|
|
.foregroundColor(.primary)
|
|
|
|
TextEditor(text: $viewModel.settings.systemPrompt)
|
|
.frame(minHeight: 200)
|
|
.overlay(
|
|
RoundedRectangle(cornerRadius: 8)
|
|
.stroke(Color.gray.opacity(0.3), lineWidth: 1)
|
|
)
|
|
}
|
|
|
|
// GitHub Link Section
|
|
VStack(alignment: .leading, spacing: 8) {
|
|
Text("About")
|
|
.font(.headline)
|
|
.foregroundColor(.primary)
|
|
|
|
Link(destination: URL(string: "https://github.com/owengretzinger/meetingnotes")!) {
|
|
HStack {
|
|
Image(systemName: "chevron.left.forwardslash.chevron.right")
|
|
.foregroundColor(.blue)
|
|
Text("View on GitHub")
|
|
.foregroundColor(.blue)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
.padding(24)
|
|
}
|
|
.navigationTitle("Settings")
|
|
.toolbar {
|
|
ToolbarItem(placement: .cancellationAction) {
|
|
Button("Cancel") {
|
|
dismiss()
|
|
}
|
|
}
|
|
ToolbarItem(placement: .confirmationAction) {
|
|
Button("Save") {
|
|
viewModel.saveSettings()
|
|
dismiss()
|
|
}
|
|
}
|
|
}
|
|
.frame(minWidth: 600, minHeight: 600)
|
|
}
|
|
.onAppear {
|
|
viewModel.loadSettings()
|
|
}
|
|
}
|
|
}
|
|
|
|
#Preview {
|
|
SettingsView(viewModel: SettingsViewModel())
|
|
} |