Visual_Novel_iOS/crush/Crush/Src/Modules/Friend/ViewMode/FriendsSearchViewModel.swift

154 lines
5.9 KiB
Swift
Raw Normal View History

2025-10-09 10:29:35 +00:00
//
// FriendsSearchViewModel.swift
// Crush
//
// Created by Leon on 2025/8/28.
//
import Foundation
import NIMSDK
class FriendsSearchViewModel {
var searchingStr : String = ""
var searchFrineds: [RelationFriend] = [RelationFriend]()
var searchConversations: [V2NIMConversation] = [V2NIMConversation]()
//
private var allFriends: [RelationFriend] = []
//
private var allConversations: [V2NIMConversation] = []
/// nickname
func searchFriends(page: Int = 1, text: String?, completion: ((_ result: Bool, _ friends: [RelationFriend]) -> Void)?) {
guard let searchText = text, !searchText.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else {
searchFrineds = []
completion?(true, [])
return
}
//
if !allFriends.isEmpty {
let filteredFriends = allFriends.filter { friend in
guard let nickname = friend.nickname else { return false }
return nickname.lowercased().contains(searchText.lowercased())
}
searchFrineds = filteredFriends
completion?(true, filteredFriends)
} else {
//
loadAllFriends(page: page) { [weak self] result, friends in
if result {
let filteredFriends = friends.filter { friend in
guard let nickname = friend.nickname else { return false }
return nickname.lowercased().contains(searchText.lowercased())
}
self?.searchFrineds = filteredFriends
completion?(true, filteredFriends)
} else {
completion?(false, [])
}
}
}
}
///
func searchConversations(text: String?, completion: ((_ result: Bool, _ conversations: [V2NIMConversation]) -> Void)?) {
guard let searchText = text, !searchText.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else {
searchConversations = []
completion?(true, [])
return
}
//
if !allConversations.isEmpty {
let filteredConversations = allConversations.filter { conversation in
guard let name = conversation.name else { return false }
return name.lowercased().contains(searchText.lowercased())
}
searchConversations = filteredConversations
completion?(true, filteredConversations)
} else {
//
loadAllConversations { [weak self] result, conversations in
if result {
let filteredConversations = conversations.filter { conversation in
guard let name = conversation.name else { return false }
return name.lowercased().contains(searchText.lowercased())
}
self?.searchConversations = filteredConversations
completion?(true, filteredConversations)
} else {
completion?(false, [])
}
}
}
}
///
private func loadAllFriends(page: Int = 1, completion: ((_ result: Bool, _ friends: [RelationFriend]) -> Void)?) {
let pageData = RequestPageData()
pageData.pn = page
var request = FriendsListRequest()
request.page = pageData
let params = request.toNonNilDictionary()
FriendsProvider.request(.heartbeatRelationList(params: params), modelType: ResponseContentPageData<RelationFriend>.self) { [weak self] result in
switch result {
case let .success(model):
if let validDatas = model?.datas {
if pageData.pn == 1 {
self?.allFriends = validDatas
completion?(true, validDatas)
} else {
self?.allFriends.append(contentsOf: validDatas)
completion?(true, validDatas)
}
} else {
completion?(false, [])
}
case .failure:
completion?(false, [])
}
}
}
///
private func loadAllConversations(completion: ((_ result: Bool, _ conversations: [V2NIMConversation]) -> Void)?) {
guard NIMSDK.shared().v2LoginService.getLoginStatus() == .LOGIN_STATUS_LOGINED else {
completion?(false, [])
return
}
NIMSDK.shared().v2ConversationService.getConversationList(0, limit: 1000) { [weak self] result in
if let conversations = result.conversationList, conversations.count > 0 {
self?.allConversations = conversations
completion?(true, conversations)
} else {
completion?(false, [])
}
} failure: { error in
dlog("load conversations error: \(error.description)")
completion?(false, [])
}
}
///
func clearSearch() {
searchFrineds.removeAll()
searchConversations.removeAll()
searchingStr = ""
}
///
var searchResultCount: Int {
return searchFrineds.count
}
///
var searchConversationResultCount: Int {
return searchConversations.count
}
}