78 lines
2.4 KiB
Swift
78 lines
2.4 KiB
Swift
import SwiftUI
|
|
|
|
struct MeetingListView: View {
|
|
@StateObject private var viewModel = MeetingListViewModel()
|
|
@State private var navigationPath = NavigationPath()
|
|
|
|
var body: some View {
|
|
NavigationStack(path: $navigationPath) {
|
|
List {
|
|
if viewModel.meetings.isEmpty && !viewModel.isLoading {
|
|
ContentUnavailableView(
|
|
"No Meetings Yet",
|
|
systemImage: "mic.slash",
|
|
description: Text("Start a new meeting to begin transcribing")
|
|
)
|
|
} else {
|
|
ForEach(viewModel.meetings) { meeting in
|
|
NavigationLink(value: meeting) {
|
|
MeetingRowView(meeting: meeting)
|
|
}
|
|
}
|
|
.onDelete { indexSet in
|
|
for index in indexSet {
|
|
viewModel.deleteMeeting(viewModel.meetings[index])
|
|
}
|
|
}
|
|
}
|
|
}
|
|
.navigationTitle("Meetings")
|
|
.toolbar {
|
|
ToolbarItem(placement: .primaryAction) {
|
|
Button {
|
|
let newMeeting = viewModel.createNewMeeting()
|
|
navigationPath.append(newMeeting)
|
|
} label: {
|
|
Label("New Meeting", systemImage: "plus")
|
|
}
|
|
}
|
|
}
|
|
.navigationDestination(for: Meeting.self) { meeting in
|
|
MeetingDetailView(meeting: meeting)
|
|
}
|
|
}
|
|
.overlay {
|
|
if viewModel.isLoading {
|
|
ProgressView("Loading meetings...")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
struct MeetingRowView: View {
|
|
let meeting: Meeting
|
|
|
|
var body: some View {
|
|
VStack(alignment: .leading, spacing: 4) {
|
|
Text(meeting.date, style: .date)
|
|
.font(.headline)
|
|
|
|
if !meeting.transcript.isEmpty {
|
|
Text(meeting.transcript)
|
|
.font(.caption)
|
|
.foregroundColor(.secondary)
|
|
.lineLimit(2)
|
|
} else {
|
|
Text("No transcript")
|
|
.font(.caption)
|
|
.foregroundColor(.secondary)
|
|
.italic()
|
|
}
|
|
}
|
|
.padding(.vertical, 4)
|
|
}
|
|
}
|
|
|
|
#Preview {
|
|
MeetingListView()
|
|
} |