89 lines
2.2 KiB
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)
|
|
}
|
|
}
|