115 lines
2.8 KiB
Swift
115 lines
2.8 KiB
Swift
|
import SwiftUI
|
||
|
|
||
|
final class RoomViewModel: ObservableObject {
|
||
|
@Published var room: Room
|
||
|
@Published var server: Server
|
||
|
|
||
|
private let formatter: RoomFormatter
|
||
|
|
||
|
init(room: Room, server: Server) {
|
||
|
self.room = room
|
||
|
self.server = server
|
||
|
self.formatter = RoomFormatter(room: room, server: server)
|
||
|
}
|
||
|
|
||
|
var title: String? {
|
||
|
formatter.title
|
||
|
}
|
||
|
|
||
|
var iconName: String? {
|
||
|
if room.prid != nil {
|
||
|
return "discussions"
|
||
|
} else if room.teamMain == true, room.t == "p" {
|
||
|
return "teams-private"
|
||
|
} else if room.teamMain == true {
|
||
|
return "teams"
|
||
|
} else if room.t == "p" {
|
||
|
return "channel-private"
|
||
|
} else if room.t == "c" {
|
||
|
return "channel-public"
|
||
|
} else if room.t == "d", formatter.isGroupChat {
|
||
|
return "message"
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
var lastMessage: String {
|
||
|
guard let user = room.lastMessage?.user else {
|
||
|
return String(localized: "No message")
|
||
|
}
|
||
|
|
||
|
let isLastMessageSentByMe = user.username == server.loggedUser.username
|
||
|
let username = isLastMessageSentByMe ? String(localized: "You") : ((server.useRealName ? user.name : user.username) ?? "")
|
||
|
let message = room.lastMessage?.msg ?? String(localized: "No message")
|
||
|
|
||
|
if room.lastMessage?.t == "jitsi_call_started" {
|
||
|
return String(localized: "Call started by: \(username)")
|
||
|
}
|
||
|
|
||
|
if room.lastMessage?.attachments?.allObjects.isEmpty == false {
|
||
|
return String(localized: "\(username) sent an attachment")
|
||
|
}
|
||
|
|
||
|
if room.lastMessage?.t == "e2e" {
|
||
|
return String(localized: "Encrypted message")
|
||
|
}
|
||
|
|
||
|
if room.lastMessage?.t == "videoconf" {
|
||
|
return String(localized: "Call started")
|
||
|
}
|
||
|
|
||
|
if room.t == "d", !isLastMessageSentByMe {
|
||
|
return message
|
||
|
}
|
||
|
|
||
|
return "\(username): \(message)"
|
||
|
}
|
||
|
|
||
|
var updatedAt: String? {
|
||
|
guard let ts = room.ts else {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
let calendar = Calendar.current
|
||
|
let dateFormatter = DateFormatter()
|
||
|
dateFormatter.locale = Locale.current
|
||
|
dateFormatter.timeZone = TimeZone.current
|
||
|
|
||
|
if calendar.isDateInYesterday(ts) {
|
||
|
return "Yesterday"
|
||
|
}
|
||
|
|
||
|
if calendar.isDateInToday(ts) {
|
||
|
dateFormatter.timeStyle = .short
|
||
|
dateFormatter.dateStyle = .none
|
||
|
|
||
|
return dateFormatter.string(from: ts)
|
||
|
}
|
||
|
|
||
|
if isDateFromLastWeek(ts) {
|
||
|
dateFormatter.dateFormat = "EEEE"
|
||
|
|
||
|
return dateFormatter.string(from: ts)
|
||
|
}
|
||
|
|
||
|
dateFormatter.timeStyle = .none
|
||
|
dateFormatter.dateStyle = .short
|
||
|
|
||
|
return dateFormatter.string(from: ts)
|
||
|
}
|
||
|
|
||
|
private func isDateFromLastWeek(_ date: Date) -> Bool {
|
||
|
let calendar = Calendar.current
|
||
|
let now = Date()
|
||
|
|
||
|
let startOfCurrentWeek = calendar.date(from: calendar.dateComponents([.yearForWeekOfYear, .weekOfYear], from: now))!
|
||
|
|
||
|
guard let startOfLastWeek = calendar.date(byAdding: .day, value: -7, to: startOfCurrentWeek) else {
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
return calendar.isDate(date, inSameDayAs: startOfLastWeek) || date > startOfLastWeek
|
||
|
}
|
||
|
}
|