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 | |||
|  |     } | |||
|  | } | |||
|  | 
 |