diff --git a/Linphone/Localizable.xcstrings b/Linphone/Localizable.xcstrings index 5a5f5e228..876d50d6c 100644 --- a/Linphone/Localizable.xcstrings +++ b/Linphone/Localizable.xcstrings @@ -3846,6 +3846,7 @@ } }, "failed_meeting_ics_invitation_not_sent_toast" : { + "extractionState" : "stale", "localizations" : { "en" : { "stringUnit" : { @@ -4545,6 +4546,70 @@ } } }, + "meeting_failed_to_edit_toast" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Failed to edit meeting" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Échec de la modification de la réunion" + } + } + } + }, + "meeting_failed_to_schedule_toast" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Failed to schedule meeting!" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Échec de création de la réunion !" + } + } + } + }, + "meeting_failed_to_send_invites_toast" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Failed to send all invites to meeting!" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Échec de l'envoi des invitations à la réunion !" + } + } + } + }, + "meeting_failed_to_send_part_of_invites_toast" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Failed to send invites to some participants of the meeting!" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Échec de l'envoi des invitations à certains des participants !" + } + } + } + }, "meeting_info_cancelled_toast" : { "localizations" : { "en" : { @@ -4561,6 +4626,22 @@ } } }, + "meeting_info_created_toast" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Meeting has been created" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Réunion créée" + } + } + } + }, "meeting_info_delete" : { "localizations" : { "en" : { @@ -4641,6 +4722,22 @@ } } }, + "meeting_info_updated_toast" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Meeting has been updated" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Réunion mise à jour" + } + } + } + }, "meeting_schedule_add_participants_title" : { "localizations" : { "en" : { diff --git a/Linphone/UI/Main/Fragments/ToastView.swift b/Linphone/UI/Main/Fragments/ToastView.swift index 83a6c15a5..4d8da1ea7 100644 --- a/Linphone/UI/Main/Fragments/ToastView.swift +++ b/Linphone/UI/Main/Fragments/ToastView.swift @@ -164,6 +164,20 @@ struct ToastView: View { .default_text_style(styleSize: 15) .padding(8) + case "Success_meeting_info_created_toast": + Text("meeting_info_created_toast") + .multilineTextAlignment(.center) + .foregroundStyle(Color.greenSuccess500) + .default_text_style(styleSize: 15) + .padding(8) + + case "Success_meeting_info_updated_toast": + Text("meeting_info_updated_toast") + .multilineTextAlignment(.center) + .foregroundStyle(Color.greenSuccess500) + .default_text_style(styleSize: 15) + .padding(8) + case "Failed_toast_call_transfer_failed": Text("call_transfer_failed_toast") .multilineTextAlignment(.center) @@ -253,8 +267,29 @@ struct ToastView: View { .default_text_style(styleSize: 15) .padding(8) - case "Failed_meeting_invitations_not_sent": - Text("failed_meeting_ics_invitation_not_sent_toast") + case "meeting_failed_to_edit_toast": + Text("meeting_failed_to_edit_toast") + .multilineTextAlignment(.center) + .foregroundStyle(Color.redDanger500) + .default_text_style(styleSize: 15) + .padding(8) + + case "meeting_failed_to_schedule_toast": + Text("meeting_failed_to_schedule_toast") + .multilineTextAlignment(.center) + .foregroundStyle(Color.redDanger500) + .default_text_style(styleSize: 15) + .padding(8) + + case "meeting_failed_to_send_invites_toast": + Text("meeting_failed_to_send_invites_toast") + .multilineTextAlignment(.center) + .foregroundStyle(Color.redDanger500) + .default_text_style(styleSize: 15) + .padding(8) + + case "meeting_failed_to_send_part_of_invites_toast": + Text("meeting_failed_to_send_part_of_invites_toast") .multilineTextAlignment(.center) .foregroundStyle(Color.redDanger500) .default_text_style(styleSize: 15) diff --git a/Linphone/UI/Main/Meetings/ViewModel/MeetingViewModel.swift b/Linphone/UI/Main/Meetings/ViewModel/MeetingViewModel.swift index 2bfbc9007..7e5a0d4a1 100644 --- a/Linphone/UI/Main/Meetings/ViewModel/MeetingViewModel.swift +++ b/Linphone/UI/Main/Meetings/ViewModel/MeetingViewModel.swift @@ -181,14 +181,23 @@ class MeetingViewModel: ObservableObject { DispatchQueue.main.async { self.operationInProgress = false self.errorMsg = (self.displayedMeeting != nil) ? "Could not edit conference" : "Could not create conference" - // TODO: show error toast + ToastViewModel.shared.toastMessage = (self.displayedMeeting != nil) ? "meeting_failed_to_edit_toast" : "meeting_failed_to_schedule_toast" + ToastViewModel.shared.displayToast = true } } else if state == ConferenceScheduler.State.Ready { let conferenceAddress = self.conferenceScheduler?.info?.uri if let confInfoToEdit = self.conferenceInfoToEdit { Log.info("\(MeetingViewModel.TAG) Conference info \(confInfoToEdit.uri?.asStringUriOnly() ?? "'nil'") has been updated") + DispatchQueue.main.async { + ToastViewModel.shared.toastMessage = "Success_meeting_info_updated_toast" + ToastViewModel.shared.displayToast = true + } } else { Log.info("\(MeetingViewModel.TAG) Conference info created, address will be \(conferenceAddress?.asStringUriOnly() ?? "'nil'")") + DispatchQueue.main.async { + ToastViewModel.shared.toastMessage = "Success_meeting_info_created_toast" + ToastViewModel.shared.displayToast = true + } } if self.sendInvitations { @@ -202,6 +211,9 @@ class MeetingViewModel: ObservableObject { } } } else if state == ConferenceScheduler.State.Updating { + DispatchQueue.main.async { + ToastViewModel.shared.displayToast = true + } self.sendIcsInvitation(core: core) } }, onInvitationsSent: { (_: ConferenceScheduler, failedInvitations: [Address]) in @@ -211,7 +223,7 @@ class MeetingViewModel: ObservableObject { } else if failedInvitations.count == self.participants.count { Log.error("\(MeetingViewModel.TAG) No invitation sent!") DispatchQueue.main.async { - ToastViewModel.shared.toastMessage = "Failed_meeting_invitations_not_sent" + ToastViewModel.shared.toastMessage = "meeting_failed_to_send_invites_toast" ToastViewModel.shared.displayToast = true } } else { @@ -224,7 +236,7 @@ class MeetingViewModel: ObservableObject { } Log.warn("\(MeetingViewModel.TAG) \(failedInvitations.count) invitations couldn't have been sent to: \(failInvList)") DispatchQueue.main.async { - ToastViewModel.shared.toastMessage = "Error: \(failedInvitations.count) invitations couldn't be sent to \(failInvList)" + ToastViewModel.shared.toastMessage = "meeting_failed_to_send_part_of_invites_toast" ToastViewModel.shared.displayToast = true } }