Rocket.Chat.ReactNative/ios/RocketChat Watch App/Formatters/MessageFormatter.swift

89 lines
2.2 KiB
Swift

import SwiftUI
final class MessageFormatter {
private let message: Message
private let previousMessage: Message?
private let lastOpen: Date?
init(message: Message, previousMessage: Message?, lastOpen: Date?) {
self.message = message
self.previousMessage = previousMessage
self.lastOpen = lastOpen
}
func hasDateSeparator() -> Bool {
if let previousMessage,
let previousMessageTS = previousMessage.ts,
let messageTS = message.ts,
Calendar.current.isDate(previousMessageTS, inSameDayAs: messageTS) {
return false
}
return true
}
func hasUnreadSeparator() -> Bool {
guard let messageTS = message.ts, let lastOpen else {
return false
}
if previousMessage == nil {
return messageTS > lastOpen
} else if let previousMessage, let previousMessageTS = previousMessage.ts {
return messageTS >= lastOpen && previousMessageTS < lastOpen
} else {
return false
}
}
func isHeader() -> Bool {
if let previousMessage,
let previousMessageTS = previousMessage.ts,
let messageTS = message.ts,
Calendar.current.isDate(previousMessageTS, inSameDayAs: messageTS),
previousMessage.user?.username == message.user?.username,
!(previousMessage.groupable == false || message.groupable == false || message.room?.broadcast == true),
messageTS - previousMessageTS < 300,
message.t != "rm",
previousMessage.t != "rm" {
return false
}
return true
}
func info() -> LocalizedStringKey? {
switch message.t {
case .some:
return getInfoMessage(.init(from: message))
case .none:
return nil
}
}
func date() -> String? {
guard let ts = message.ts else { return nil }
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale.current
dateFormatter.timeZone = TimeZone.current
dateFormatter.timeStyle = .none
dateFormatter.dateStyle = .long
return dateFormatter.string(from: ts)
}
func time() -> String? {
guard let ts = message.ts else { return nil }
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale.current
dateFormatter.timeZone = TimeZone.current
dateFormatter.timeStyle = .short
dateFormatter.dateStyle = .none
return dateFormatter.string(from: ts)
}
}