fix: saving logic
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -121,6 +121,9 @@ struct MeetingDetailView: View {
|
|||||||
} message: {
|
} message: {
|
||||||
Text(viewModel.errorMessage ?? "")
|
Text(viewModel.errorMessage ?? "")
|
||||||
}
|
}
|
||||||
|
.onDisappear {
|
||||||
|
viewModel.saveMeeting()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Content Views
|
// MARK: - Content Views
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user