fix: saving logic

This commit is contained in:
Owen Gretzinger
2025-07-10 18:13:11 -04:00
parent 6b717d5bd8
commit fe2e22e795
4 changed files with 57 additions and 6 deletions
@@ -1,5 +1,6 @@
import Foundation import Foundation
import SwiftUI import SwiftUI
import Combine
@MainActor @MainActor
class MeetingListViewModel: ObservableObject { class MeetingListViewModel: ObservableObject {
@@ -7,8 +8,18 @@ class MeetingListViewModel: ObservableObject {
@Published var isLoading = false @Published var isLoading = false
@Published var errorMessage: String? @Published var errorMessage: String?
private var cancellables = Set<AnyCancellable>()
init() { init() {
loadMeetings() 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() { func loadMeetings() {
@@ -16,7 +27,12 @@ class MeetingListViewModel: ObservableObject {
errorMessage = nil errorMessage = nil
DispatchQueue.main.async { [weak self] in 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 self?.isLoading = false
} }
} }
+21 -3
View File
@@ -2,6 +2,11 @@ import Foundation
import SwiftUI import SwiftUI
import Combine import Combine
// Add notification name for meeting saved events
extension Notification.Name {
static let meetingSaved = Notification.Name("MeetingSaved")
}
enum MeetingViewTab: String, CaseIterable { enum MeetingViewTab: String, CaseIterable {
case myNotes = "My Notes" case myNotes = "My Notes"
case transcript = "Transcript" case transcript = "Transcript"
@@ -27,7 +32,14 @@ class MeetingViewModel: ObservableObject {
private var cancellables = Set<AnyCancellable>() private var cancellables = Set<AnyCancellable>()
init(meeting: Meeting = Meeting()) { 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 // Update meeting transcript chunks when audio manager transcript chunks change
audioManager.$transcriptChunks audioManager.$transcriptChunks
@@ -47,7 +59,8 @@ class MeetingViewModel: ObservableObject {
// Auto-save when meeting properties change // Auto-save when meeting properties change
$meeting $meeting
.debounce(for: .milliseconds(500), scheduler: RunLoop.main) .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() self?.saveMeeting()
} }
.store(in: &cancellables) .store(in: &cancellables)
@@ -116,7 +129,12 @@ class MeetingViewModel: ObservableObject {
} }
func saveMeeting() { 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() { func copyTranscript() {
+3
View File
@@ -121,6 +121,9 @@ struct MeetingDetailView: View {
} message: { } message: {
Text(viewModel.errorMessage ?? "") Text(viewModel.errorMessage ?? "")
} }
.onDisappear {
viewModel.saveMeeting()
}
} }
// MARK: - Content Views // MARK: - Content Views
+16 -2
View File
@@ -40,6 +40,9 @@ struct MeetingListView: View {
.navigationDestination(for: Meeting.self) { meeting in .navigationDestination(for: Meeting.self) { meeting in
MeetingDetailView(meeting: meeting) MeetingDetailView(meeting: meeting)
} }
.onAppear {
viewModel.loadMeetings()
}
} }
.overlay { .overlay {
if viewModel.isLoading { if viewModel.isLoading {
@@ -54,8 +57,19 @@ struct MeetingRowView: View {
var body: some View { var body: some View {
VStack(alignment: .leading, spacing: 4) { VStack(alignment: .leading, spacing: 4) {
Text(meeting.date, style: .date) // Show title if exists, otherwise show date
.font(.headline) 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 { if !meeting.transcript.isEmpty {
Text(meeting.transcript) Text(meeting.transcript)