Conference message bubble

This commit is contained in:
Benoit Martins 2024-10-10 16:16:19 +02:00
parent a8f7756241
commit 764b8f860c
4 changed files with 89 additions and 60 deletions

View file

@ -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 {}

View file

@ -86,6 +86,7 @@ public struct Message: Identifiable, Hashable {
public var ephemeralLifetime: Int
public var isIcalendar: Bool
public var messageConferenceInfo: MessageConferenceInfo?
public init(
id: 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(

View file

@ -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
}
}

View file

@ -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)")
meetingParticipantsTmp = String(conferenceInfo.participantInfos.count)
meetingFound = true
*/
if meetingConferenceUri != nil {
return MessageConferenceInfo(id: UUID().uuidString, uri: meetingConferenceUri!, subject: meetingSubject, description: meetingDescription, state: .updated, dateTime: timeTmp)
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
)
}
}
}