forked from mirrors/linphone-iphone
Conference message bubble
This commit is contained in:
parent
a8f7756241
commit
764b8f860c
4 changed files with 89 additions and 60 deletions
|
|
@ -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 {}
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue