diff --git a/Linphone/UI/Main/Conversations/Fragments/ChatBubbleView.swift b/Linphone/UI/Main/Conversations/Fragments/ChatBubbleView.swift index b69e85d1e..e4a4c0c4d 100644 --- a/Linphone/UI/Main/Conversations/Fragments/ChatBubbleView.swift +++ b/Linphone/UI/Main/Conversations/Fragments/ChatBubbleView.swift @@ -167,6 +167,22 @@ struct ChatBubbleView: View { .default_text_style(styleSize: 14) } + if eventLogMessage.message.isIcalendar { + VStack{ + VStack { + + } + + VStack { + + } + } + + Text("Meeting invite !!") + .foregroundStyle(Color.grayMain2c500) + .default_text_style(styleSize: 12) + } + HStack(alignment: .center) { if eventLogMessage.message.isEphemeral && eventLogMessage.message.isOutgoing { Text(ephemeralLifetime) @@ -302,10 +318,6 @@ struct ChatBubbleView: View { }) .padding(.leading, eventLogMessage.message.isOutgoing ? 40 : 0) .padding(.trailing, !eventLogMessage.message.isOutgoing ? 40 : 0) - } else if eventLogMessage.message.isIcalendar { - Text("Meeting invite !!") - .foregroundStyle(Color.grayMain2c500) - .default_text_style(styleSize: 12) } } .onTapGesture {} diff --git a/Linphone/UI/Main/Conversations/Model/Message.swift b/Linphone/UI/Main/Conversations/Model/Message.swift index 282be1e5a..ec035c713 100644 --- a/Linphone/UI/Main/Conversations/Model/Message.swift +++ b/Linphone/UI/Main/Conversations/Model/Message.swift @@ -86,7 +86,8 @@ public struct Message: Identifiable, Hashable { public var ephemeralLifetime: Int public var isIcalendar: Bool - + public var messageConferenceInfo: MessageConferenceInfo? + public init( id: String, appData: String = "", @@ -107,7 +108,8 @@ public struct Message: Identifiable, Hashable { isEphemeral: Bool = false, ephemeralExpireTime: Int = 0, ephemeralLifetime: Int = 0, - isIcalendar: Bool = false + isIcalendar: Bool = false, + messageConferenceInfo: MessageConferenceInfo? = nil ) { self.id = id self.appData = appData @@ -129,6 +131,7 @@ public struct Message: Identifiable, Hashable { self.ephemeralExpireTime = ephemeralExpireTime self.ephemeralLifetime = ephemeralLifetime self.isIcalendar = isIcalendar + self.messageConferenceInfo = messageConferenceInfo } public static func makeMessage( diff --git a/Linphone/UI/Main/Conversations/Model/MessageConferenceInfo.swift b/Linphone/UI/Main/Conversations/Model/MessageConferenceInfo.swift index 7ec3238e0..6bd5ec3ec 100644 --- a/Linphone/UI/Main/Conversations/Model/MessageConferenceInfo.swift +++ b/Linphone/UI/Main/Conversations/Model/MessageConferenceInfo.swift @@ -19,27 +19,34 @@ import Foundation -public enum MessageConferenceState { +public enum MessageConferenceState: Codable { + case new case updated case cancelled } -public struct MessageConferenceInfo { - public let id: String - var uri: URL - var subject: String - var description: String - var state: MessageConferenceState - var dateTime: String - //var duration: time_t - //var participantInfos: [ParticipantInfo] +public struct MessageConferenceInfo: Codable, Identifiable, Hashable { + public let id: UUID + public let meetingConferenceUri: URL + public let meetingSubject: String + public let meetingDescription: String + public let meetingState: MessageConferenceState + public let meetingDate: String + public let meetingTime: String + public let meetingDay: String + public let meetingDayNumber: String + public let meetingParticipants: String - public init(id: String, uri: URL, subject: String, description: String, state: MessageConferenceState, dateTime: String) { + public init(id: UUID, meetingConferenceUri: URL, meetingSubject: String, meetingDescription: String, meetingState: MessageConferenceState, meetingDate: String, meetingTime: String, meetingDay: String, meetingDayNumber: String, meetingParticipants: String) { self.id = id - self.uri = uri - self.subject = subject - self.description = description - self.state = state - self.dateTime = dateTime + self.meetingConferenceUri = meetingConferenceUri + self.meetingSubject = meetingSubject + self.meetingDescription = meetingDescription + self.meetingState = meetingState + self.meetingDate = meetingDate + self.meetingTime = meetingTime + self.meetingDay = meetingDay + self.meetingDayNumber = meetingDayNumber + self.meetingParticipants = meetingParticipants } } diff --git a/Linphone/UI/Main/Conversations/ViewModel/ConversationViewModel.swift b/Linphone/UI/Main/Conversations/ViewModel/ConversationViewModel.swift index 75c90451b..fa53553a3 100644 --- a/Linphone/UI/Main/Conversations/ViewModel/ConversationViewModel.swift +++ b/Linphone/UI/Main/Conversations/ViewModel/ConversationViewModel.swift @@ -507,7 +507,8 @@ class ConversationViewModel: ObservableObject { isEphemeral: eventLog.chatMessage?.isEphemeral ?? false, ephemeralExpireTime: eventLog.chatMessage?.ephemeralExpireTime ?? 0, ephemeralLifetime: eventLog.chatMessage?.ephemeralLifetime ?? 0, - isIcalendar: eventLog.chatMessage?.contents.first?.isIcalendar ?? false + isIcalendar: eventLog.chatMessage?.contents.first?.isIcalendar ?? false, + messageConferenceInfo: eventLog.chatMessage != nil && eventLog.chatMessage!.contents.first != nil && eventLog.chatMessage!.contents.first!.isIcalendar == true ? self.parseConferenceInvite(content: eventLog.chatMessage!.contents.first!) : nil ) ) ) @@ -731,7 +732,8 @@ class ConversationViewModel: ObservableObject { isEphemeral: eventLog.chatMessage?.isEphemeral ?? false, ephemeralExpireTime: eventLog.chatMessage?.ephemeralExpireTime ?? 0, ephemeralLifetime: eventLog.chatMessage?.ephemeralLifetime ?? 0, - isIcalendar: eventLog.chatMessage?.contents.first?.isIcalendar ?? false + isIcalendar: eventLog.chatMessage?.contents.first?.isIcalendar ?? false, + messageConferenceInfo: eventLog.chatMessage != nil && eventLog.chatMessage!.contents.first != nil && eventLog.chatMessage!.contents.first!.isIcalendar == true ? self.parseConferenceInvite(content: eventLog.chatMessage!.contents.first!) : nil ) ), at: 0 ) @@ -967,7 +969,8 @@ class ConversationViewModel: ObservableObject { isEphemeral: eventLog.chatMessage?.isEphemeral ?? false, ephemeralExpireTime: eventLog.chatMessage?.ephemeralExpireTime ?? 0, ephemeralLifetime: eventLog.chatMessage?.ephemeralLifetime ?? 0, - isIcalendar: eventLog.chatMessage?.contents.first?.isIcalendar ?? false + isIcalendar: eventLog.chatMessage?.contents.first?.isIcalendar ?? false, + messageConferenceInfo: eventLog.chatMessage != nil && eventLog.chatMessage!.contents.first != nil && eventLog.chatMessage!.contents.first!.isIcalendar == true ? self.parseConferenceInvite(content: eventLog.chatMessage!.contents.first!) : nil ) ) @@ -1249,7 +1252,8 @@ class ConversationViewModel: ObservableObject { isEphemeral: eventLog.chatMessage?.isEphemeral ?? false, ephemeralExpireTime: eventLog.chatMessage?.ephemeralExpireTime ?? 0, ephemeralLifetime: eventLog.chatMessage?.ephemeralLifetime ?? 0, - isIcalendar: eventLog.chatMessage?.contents.first?.isIcalendar ?? false + isIcalendar: eventLog.chatMessage?.contents.first?.isIcalendar ?? false, + messageConferenceInfo: eventLog.chatMessage != nil && eventLog.chatMessage!.contents.first != nil && eventLog.chatMessage!.contents.first!.isIcalendar == true ? self.parseConferenceInvite(content: eventLog.chatMessage!.contents.first!) : nil ) ), at: 0 ) @@ -1894,30 +1898,30 @@ class ConversationViewModel: ObservableObject { } func parseConferenceInvite(content: Content) -> MessageConferenceInfo? { - - var meetingConferenceUri: URL? - var meetingSubject: String = "" - var meetingDescription: String = "" - var meetingUpdated: Bool = false - var meetingCancelled: Bool = false - var meetingDate: String = "" - var meetingTime: String = "" - var meetingDay: String = "" - var meetingDayNumber: String = "" - var meetingParticipants: String = "" - var meetingFound: Bool = false + var meetingConferenceUriTmp: URL? + var meetingSubjectTmp: String = "" + var meetingDescriptionTmp: String = "" + var meetingStateTmp: MessageConferenceState = .new + var meetingDateTmp: String = "" + var meetingTimeTmp: String = "" + var meetingDayTmp: String = "" + var meetingDayNumberTmp: String = "" + var meetingParticipantsTmp: String = "" if let conferenceInfo = try? Factory.Instance.createConferenceInfoFromIcalendarContent(content: content) { if let conferenceAddress = conferenceInfo.uri { let conferenceUri = conferenceAddress.asStringUriOnly() - Log.info("Found conference info with URI [\(conferenceUri)] and subject [\(conferenceInfo.subject)]") - meetingConferenceUri = URL(string: conferenceAddress.asStringUriOnly()) - meetingSubject = conferenceInfo.subject ?? "" - meetingDescription = conferenceInfo.description ?? "" + Log.info("Found conference info with URI [\(conferenceUri)] and subject [\(conferenceInfo.subject ?? "")]") + meetingConferenceUriTmp = URL(string: conferenceAddress.asStringUriOnly()) + meetingSubjectTmp = conferenceInfo.subject ?? "" + meetingDescriptionTmp = conferenceInfo.description ?? "" - meetingUpdated = (conferenceInfo.state == .Updated) - meetingCancelled = (conferenceInfo.state == .Cancelled) + if conferenceInfo.state == .Updated { + meetingStateTmp = .updated + } else if conferenceInfo.state == .Cancelled { + meetingStateTmp = .cancelled + } let timestamp = conferenceInfo.dateTime let duration = conferenceInfo.duration @@ -1928,33 +1932,36 @@ class ConversationViewModel: ObservableObject { dateFormatter.dateStyle = .full dateFormatter.timeStyle = .none - let date = dateFormatter.string(from: dateTmp) + meetingDateTmp = dateFormatter.string(from: dateTmp) let timeFormatter = DateFormatter() timeFormatter.dateFormat = Locale.current.identifier == "fr_FR" ? "HH:mm" : "h:mm a" let timeTmp = timeFormatter.string(from: dateTmp) - /* let timeBisInterval = TimeInterval(timestamp + (Int(duration) * 60)) let timeBis = Date(timeIntervalSince1970: timeBisInterval) let endTime = timeFormatter.string(from: timeBis) - let startTime = TimestampUtils.timeToString(timestamp) - let end = timestamp + (duration * 60) - let endTime = TimestampUtils.timeToString(end) + meetingTimeTmp = "\(timeTmp) - \(endTime)" - meetingDate = date - meetingTime = "\(startTime) - \(endTime)" - meetingDay = TimestampUtils.dayOfWeek(timestamp) - meetingDayNumber = TimestampUtils.dayOfMonth(timestamp) + meetingDayTmp = dateTmp.formatted(Date.FormatStyle().weekday(.abbreviated)).capitalized + meetingDayNumberTmp = dateTmp.formatted(Date.FormatStyle().day(.twoDigits)) - let count = conferenceInfo.participantInfos.count - meetingParticipants = AppUtils.getStringWithPlural(R.plurals.conference_participants_list_title, count: count, countString: "\(count)") - - meetingFound = true - */ - if meetingConferenceUri != nil { - return MessageConferenceInfo(id: UUID().uuidString, uri: meetingConferenceUri!, subject: meetingSubject, description: meetingDescription, state: .updated, dateTime: timeTmp) + meetingParticipantsTmp = String(conferenceInfo.participantInfos.count) + + if meetingConferenceUriTmp != nil { + return MessageConferenceInfo( + id: UUID(), + meetingConferenceUri: meetingConferenceUriTmp!, + meetingSubject: meetingSubjectTmp, + meetingDescription: meetingDescriptionTmp, + meetingState: meetingStateTmp, + meetingDate: meetingDateTmp, + meetingTime: meetingTimeTmp, + meetingDay: meetingDayTmp, + meetingDayNumber: meetingDayNumberTmp, + meetingParticipants: meetingParticipantsTmp + ) } } }