154 lines
5.9 KiB
Swift
154 lines
5.9 KiB
Swift
//
|
||
// 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
|
||
}
|
||
}
|
||
|