Files
meetingnotes/notetaker/Views/MeetingListView.swift
T
2025-07-10 18:13:11 -04:00

92 lines
2.9 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)
}
.onAppear {
viewModel.loadMeetings()
}
}
.overlay {
if viewModel.isLoading {
ProgressView("Loading meetings...")
}
}
}
}
struct MeetingRowView: View {
let meeting: Meeting
var body: some View {
VStack(alignment: .leading, spacing: 4) {
// Show title if exists, otherwise show date
if !meeting.title.isEmpty {
Text(meeting.title)
.font(.headline)
.lineLimit(1)
Text(meeting.date, style: .date)
.font(.caption)
.foregroundColor(.secondary)
} else {
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()
}