diff --git a/Linphone/UI/Main/Fragments/ToastView.swift b/Linphone/UI/Main/Fragments/ToastView.swift index 89f27f445..b696d2228 100644 --- a/Linphone/UI/Main/Fragments/ToastView.swift +++ b/Linphone/UI/Main/Fragments/ToastView.swift @@ -231,6 +231,11 @@ struct ToastView: View { Text("conversation_invalid_participant_due_to_security_mode_toast") .multilineTextAlignment(.center) .foregroundStyle(Color.redDanger500) + + case "Meeting_added_to_calendar": + Text("Meeting added to iPhone calendar") + .multilineTextAlignment(.center) + .foregroundStyle(Color.greenSuccess500) .default_text_style(styleSize: 15) .padding(8) diff --git a/Linphone/UI/Main/Meetings/ViewModel/MeetingViewModel.swift b/Linphone/UI/Main/Meetings/ViewModel/MeetingViewModel.swift index 3ca21adf5..b14a3ce62 100644 --- a/Linphone/UI/Main/Meetings/ViewModel/MeetingViewModel.swift +++ b/Linphone/UI/Main/Meetings/ViewModel/MeetingViewModel.swift @@ -326,31 +326,40 @@ class MeetingViewModel: ObservableObject { } func addMeetingToCalendar() { - if #available(iOS 17.0, *) { - eventStore.requestAccess(to: .event) { granted, error in - guard let meeting = self.displayedMeeting else { - Log.error("\(MeetingViewModel.TAG) Failed to add meeting to calendar: no meeting selected") - } - if !granted { - Log.error("\(MeetingViewModel.TAG) Failed to add meeting to calendar: access not granted") - } else if error == nil { - - let event:EKEvent = EKEvent(eventStore: self.eventStore) - event.title = self.subject - event.startDate = self.fromDate - event.endDate = self.toDate - event.notes = self.description - event.calendar = self.eventStore.defaultCalendarForNewEvents - do { - try self.eventStore.save(event, span: .thisEvent) - } catch let error as NSError { - Log.error("\(MeetingViewModel.TAG) Failed to add meeting to calendar: \(error)") - } - Log.info("\(MeetingViewModel.TAG) Meeting '\(meeting.subject)': \(error ?? "")") - } else { - Log.error("\(MeetingViewModel.TAG) Failed to add meeting to calendar: \(error ?? "")") - } + + let addToCalendar = { (granted: Bool, error: (any Error)?) in + guard let meeting = self.displayedMeeting else { + Log.error("\(MeetingViewModel.TAG) Failed to add meeting to calendar: no meeting selected") + return } + if !granted { + Log.error("\(MeetingViewModel.TAG) Failed to add meeting to calendar: access not granted") + } else if error == nil { + let event: EKEvent = EKEvent(eventStore: self.eventStore) + event.title = self.subject + event.startDate = self.fromDate + event.endDate = self.toDate + event.notes = self.description + event.calendar = self.eventStore.defaultCalendarForNewEvents + do { + try self.eventStore.save(event, span: .thisEvent) + Log.info("\(MeetingViewModel.TAG) Meeting '\(meeting.subject)' added to calendar") + ToastViewModel.shared.toastMessage = "Meeting_added_to_calendar" + ToastViewModel.shared.displayToast = true + } catch let error as NSError { + Log.error("\(MeetingViewModel.TAG) Failed to add meeting to calendar: \(error)") + ToastViewModel.shared.toastMessage = "Error: \(error)" + ToastViewModel.shared.displayToast = true + } + } else { + Log.error("\(MeetingViewModel.TAG) Failed to add meeting to calendar: \(error?.localizedDescription ?? "")") + } + } + + if #available(iOS 17.0, *) { + eventStore.requestWriteOnlyAccessToEvents(completion: addToCalendar) + } else { + eventStore.requestAccess(to: .event, completion: addToCalendar) } } // eventStore.requestAccess(to: EKEntityType.event) { granted, error in