From fe2e22e79536e28460a20e8b31603babffa9aba2 Mon Sep 17 00:00:00 2001 From: Owen Gretzinger Date: Thu, 10 Jul 2025 18:13:11 -0400 Subject: [PATCH] fix: saving logic --- .../ViewModels/MeetingListViewModel.swift | 18 +++++++++++++- notetaker/ViewModels/MeetingViewModel.swift | 24 ++++++++++++++++--- notetaker/Views/MeetingDetailView.swift | 3 +++ notetaker/Views/MeetingListView.swift | 18 ++++++++++++-- 4 files changed, 57 insertions(+), 6 deletions(-) diff --git a/notetaker/ViewModels/MeetingListViewModel.swift b/notetaker/ViewModels/MeetingListViewModel.swift index b1a42cf..bee0796 100644 --- a/notetaker/ViewModels/MeetingListViewModel.swift +++ b/notetaker/ViewModels/MeetingListViewModel.swift @@ -1,5 +1,6 @@ import Foundation import SwiftUI +import Combine @MainActor class MeetingListViewModel: ObservableObject { @@ -7,8 +8,18 @@ class MeetingListViewModel: ObservableObject { @Published var isLoading = false @Published var errorMessage: String? + private var cancellables = Set() + init() { loadMeetings() + + // Listen for saved meeting notifications to refresh the list + NotificationCenter.default.publisher(for: .meetingSaved) + .sink { [weak self] _ in + print("🔔 Meeting saved notification received. Reloading meetings list...") + self?.loadMeetings() + } + .store(in: &cancellables) } func loadMeetings() { @@ -16,7 +27,12 @@ class MeetingListViewModel: ObservableObject { errorMessage = nil DispatchQueue.main.async { [weak self] in - self?.meetings = LocalStorageManager.shared.loadMeetings() + let loadedMeetings = LocalStorageManager.shared.loadMeetings() + print("📋 Loaded \(loadedMeetings.count) meetings") + for meeting in loadedMeetings.prefix(3) { + print("📋 Meeting: \(meeting.id) - title: '\(meeting.title)', notes: '\(meeting.userNotes.prefix(50))...'") + } + self?.meetings = loadedMeetings self?.isLoading = false } } diff --git a/notetaker/ViewModels/MeetingViewModel.swift b/notetaker/ViewModels/MeetingViewModel.swift index 2d4ad89..617056e 100644 --- a/notetaker/ViewModels/MeetingViewModel.swift +++ b/notetaker/ViewModels/MeetingViewModel.swift @@ -2,6 +2,11 @@ import Foundation import SwiftUI import Combine +// Add notification name for meeting saved events +extension Notification.Name { + static let meetingSaved = Notification.Name("MeetingSaved") +} + enum MeetingViewTab: String, CaseIterable { case myNotes = "My Notes" case transcript = "Transcript" @@ -27,7 +32,14 @@ class MeetingViewModel: ObservableObject { private var cancellables = Set() init(meeting: Meeting = Meeting()) { - self.meeting = meeting + // Load the latest version of the meeting from storage if it exists + if let savedMeeting = LocalStorageManager.shared.loadMeetings().first(where: { $0.id == meeting.id }) { + print("🔄 Loading latest version of meeting: \(meeting.id)") + self.meeting = savedMeeting + } else { + print("🆕 Using provided meeting: \(meeting.id)") + self.meeting = meeting + } // Update meeting transcript chunks when audio manager transcript chunks change audioManager.$transcriptChunks @@ -47,7 +59,8 @@ class MeetingViewModel: ObservableObject { // Auto-save when meeting properties change $meeting .debounce(for: .milliseconds(500), scheduler: RunLoop.main) - .sink { [weak self] _ in + .sink { [weak self] meeting in + print("🔄 Auto-saving meeting: \(meeting.id) - title: '\(meeting.title)', notes: '\(meeting.userNotes.prefix(50))...'") self?.saveMeeting() } .store(in: &cancellables) @@ -116,7 +129,12 @@ class MeetingViewModel: ObservableObject { } func saveMeeting() { - _ = LocalStorageManager.shared.saveMeeting(meeting) + print("💾 Saving meeting: \(meeting.id)") + let success = LocalStorageManager.shared.saveMeeting(meeting) + print("💾 Save result: \(success ? "SUCCESS" : "FAILED")") + if success { + NotificationCenter.default.post(name: .meetingSaved, object: meeting) + } } func copyTranscript() { diff --git a/notetaker/Views/MeetingDetailView.swift b/notetaker/Views/MeetingDetailView.swift index f83169f..e145930 100644 --- a/notetaker/Views/MeetingDetailView.swift +++ b/notetaker/Views/MeetingDetailView.swift @@ -121,6 +121,9 @@ struct MeetingDetailView: View { } message: { Text(viewModel.errorMessage ?? "") } + .onDisappear { + viewModel.saveMeeting() + } } // MARK: - Content Views diff --git a/notetaker/Views/MeetingListView.swift b/notetaker/Views/MeetingListView.swift index ae699cc..f078bd2 100644 --- a/notetaker/Views/MeetingListView.swift +++ b/notetaker/Views/MeetingListView.swift @@ -40,6 +40,9 @@ struct MeetingListView: View { .navigationDestination(for: Meeting.self) { meeting in MeetingDetailView(meeting: meeting) } + .onAppear { + viewModel.loadMeetings() + } } .overlay { if viewModel.isLoading { @@ -54,8 +57,19 @@ struct MeetingRowView: View { var body: some View { VStack(alignment: .leading, spacing: 4) { - Text(meeting.date, style: .date) - .font(.headline) + // 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)