70 lines
1.8 KiB
Swift
70 lines
1.8 KiB
Swift
//
|
|
// ChatsViewModel.swift
|
|
// Training
|
|
//
|
|
// Created by mrtuxa on 27.08.22.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
|
|
class ChatsViewModel: ObservableObject {
|
|
|
|
@Published var chats = Chat.sampleChat
|
|
|
|
func getSortedFilteredChats(query: String) -> [Chat] {
|
|
let sortedChats = chats.sorted {
|
|
guard let date1 = $0.messages.last?.date else {
|
|
return false
|
|
}
|
|
guard let date2 = $1.messages.last?.date else {
|
|
return false
|
|
}
|
|
return date1 > date2
|
|
}
|
|
|
|
if query == "" {
|
|
return sortedChats
|
|
}
|
|
return sortedChats.filter {
|
|
$0.person.name.lowercased().contains(query.lowercased())
|
|
}
|
|
}
|
|
|
|
func getSectionMessages(for chat: Chat) -> [[Message]] {
|
|
var res = [[Message]]()
|
|
var tmp = [Message]()
|
|
for message in chat.messages {
|
|
if let firstMessage = tmp.first {
|
|
let daysBetween = firstMessage.date.daysBetween(date: message.date)
|
|
if daysBetween >= 1 {
|
|
res.append(tmp)
|
|
tmp.removeAll()
|
|
tmp.append(message)
|
|
} else {
|
|
tmp.append(message)
|
|
}
|
|
} else {
|
|
tmp.append(message)
|
|
}
|
|
}
|
|
res.append(tmp)
|
|
return res
|
|
}
|
|
|
|
func markAsUnread(_ newValue: Bool, chat: Chat) {
|
|
if let index = chat.messages.firstIndex(where: { $0.id == chat.id }) {
|
|
chats[index].hasUnreadMessage = newValue
|
|
}
|
|
}
|
|
|
|
func sendMessage(_ text: String, in chat: Chat) -> Message? {
|
|
if let index = chats.firstIndex { $0.id == chat.id } {
|
|
let message = Message(text, type: .Sent)
|
|
chats[index].messages.append(message)
|
|
return message
|
|
}
|
|
return nil
|
|
}
|
|
}
|