Rocket.Chat.ReactNative/ios/RocketChat Watch App/ViewModels/RoomViewModel.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
}
}