TUIFoldConversationListBaseDataProvider.m 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. //
  2. // TUIFoldConversationListBaseDataProvider.m
  3. // TUIConversation
  4. //
  5. // Created by wyl on 2022/7/21.
  6. // Copyright © 2023 Tencent. All rights reserved.
  7. //
  8. #import "TUIFoldConversationListBaseDataProvider.h"
  9. #import <ImSDK_Plus/ImSDK_Plus.h>
  10. #import <TIMCommon/TIMDefine.h>
  11. #import <TUICore/TUICore.h>
  12. #import <TUICore/TUILogin.h>
  13. #import "TUIConversationCellData.h"
  14. @interface TUIFoldConversationListBaseDataProvider (private)
  15. @property(nonatomic, assign, getter=isLastPage) BOOL lastPage;
  16. - (BOOL)filteConversation:(V2TIMConversation *)conv;
  17. - (TUIConversationCellData *)cellDataForConversation:(V2TIMConversation *)conversation;
  18. - (void)sortDataList:(NSMutableArray<TUIConversationCellData *> *)dataList;
  19. - (void)handleHideConversation:(TUIConversationCellData *)conversation;
  20. - (void)handleInsertConversationList:(NSArray<TUIConversationCellData *> *)conversationList;
  21. - (void)handleUpdateConversationList:(NSArray<TUIConversationCellData *> *)conversationList
  22. positions:(NSMutableDictionary<NSString *, NSNumber *> *)positionMaps;
  23. - (TUIConversationCellData *)cellDataOfGroupID:(NSString *)groupID;
  24. - (void)handleRemoveConversation:(TUIConversationCellData *)conversation;
  25. - (void)updateMarkUnreadCount;
  26. @end
  27. @implementation TUIFoldConversationListBaseDataProvider
  28. - (void)loadNexPageConversations {
  29. if (self.isLastPage) {
  30. return;
  31. }
  32. @weakify(self);
  33. V2TIMConversationListFilter *filter = [[V2TIMConversationListFilter alloc] init];
  34. filter.type = V2TIM_GROUP;
  35. filter.markType = V2TIM_CONVERSATION_MARK_TYPE_FOLD;
  36. [V2TIMManager.sharedInstance getConversationListByFilter:filter
  37. nextSeq:self.pageIndex
  38. count:(int)self.pageSize
  39. succ:^(NSArray<V2TIMConversation *> *list, uint64_t nextSeq, BOOL isFinished) {
  40. @strongify(self);
  41. self.pageIndex = nextSeq;
  42. self.lastPage = isFinished;
  43. [self preprocess:list];
  44. }
  45. fail:^(int code, NSString *desc) {
  46. @strongify(self);
  47. self.lastPage = YES;
  48. }];
  49. }
  50. - (void)preprocess:(NSArray<V2TIMConversation *> *)v2Convs {
  51. if (!NSThread.isMainThread) {
  52. __weak typeof(self) weakSelf = self;
  53. dispatch_async(dispatch_get_main_queue(), ^{
  54. [weakSelf preprocess:v2Convs];
  55. });
  56. return;
  57. }
  58. NSMutableDictionary<NSString *, NSNumber *> *conversationMap = [NSMutableDictionary dictionary];
  59. for (TUIConversationCellData *item in self.conversationList) {
  60. if (item.conversationID) {
  61. [conversationMap setObject:@([self.conversationList indexOfObject:item]) forKey:item.conversationID];
  62. }
  63. }
  64. NSMutableArray *duplicateDataList = [NSMutableArray array];
  65. NSMutableArray *addedDataList = [NSMutableArray array];
  66. NSMutableArray *markHideDataList = [NSMutableArray array];
  67. NSMutableArray *needHideByCancelMarkFoldDataList = [NSMutableArray array];
  68. for (V2TIMConversation *conv in v2Convs) {
  69. if ([self filteConversation:conv]) {
  70. continue;
  71. }
  72. if ([TUIConversationCellData isMarkedByHideType:conv.markList]) {
  73. if ([TUIConversationCellData isMarkedByHideType:conv.markList]) {
  74. [markHideDataList addObject:[self cellDataForConversation:conv]];
  75. }
  76. continue;
  77. }
  78. TUIConversationCellData *cellData = [self cellDataForConversation:conv];
  79. if ([TUIConversationCellData isMarkedByFoldType:conv.markList]) {
  80. if ([conversationMap objectForKey:cellData.conversationID]) {
  81. [duplicateDataList addObject:cellData];
  82. } else {
  83. [addedDataList addObject:cellData];
  84. }
  85. } else {
  86. // If not marked as folded, this conversation is the data that needs to be removed from the folded list
  87. if ([conversationMap objectForKey:cellData.conversationID]) {
  88. [needHideByCancelMarkFoldDataList addObject:cellData];
  89. }
  90. }
  91. }
  92. if (duplicateDataList.count) {
  93. [self sortDataList:duplicateDataList];
  94. [self handleUpdateConversationList:duplicateDataList positions:conversationMap];
  95. }
  96. if (addedDataList.count) {
  97. [self sortDataList:addedDataList];
  98. [self handleInsertConversationList:addedDataList];
  99. }
  100. if (markHideDataList.count) {
  101. [self sortDataList:markHideDataList];
  102. NSMutableArray *pRemoveCellUIList = [NSMutableArray array];
  103. NSMutableDictionary<NSString *, TUIConversationCellData *> *pMarkHideDataMap = [NSMutableDictionary dictionary];
  104. for (TUIConversationCellData *item in markHideDataList) {
  105. if (item.conversationID) {
  106. [pRemoveCellUIList addObject:item];
  107. [pMarkHideDataMap setObject:item forKey:item.conversationID];
  108. }
  109. }
  110. for (TUIConversationCellData *item in self.conversationList) {
  111. if ([pMarkHideDataMap objectForKey:item.conversationID]) {
  112. [pRemoveCellUIList addObject:item];
  113. }
  114. }
  115. for (TUIConversationCellData *item in pRemoveCellUIList) {
  116. [self handleHideConversation:item];
  117. }
  118. }
  119. if (needHideByCancelMarkFoldDataList.count) {
  120. [self sortDataList:needHideByCancelMarkFoldDataList];
  121. NSMutableArray *pRemoveCellUIList = [NSMutableArray array];
  122. NSMutableDictionary<NSString *, TUIConversationCellData *> *pMarkCancelFoldDataMap = [NSMutableDictionary dictionary];
  123. for (TUIConversationCellData *item in needHideByCancelMarkFoldDataList) {
  124. if (item.conversationID) {
  125. [pRemoveCellUIList addObject:item];
  126. [pMarkCancelFoldDataMap setObject:item forKey:item.conversationID];
  127. }
  128. }
  129. for (TUIConversationCellData *item in self.conversationList) {
  130. if ([pMarkCancelFoldDataMap objectForKey:item.conversationID]) {
  131. [pRemoveCellUIList addObject:item];
  132. }
  133. }
  134. for (TUIConversationCellData *item in pRemoveCellUIList) {
  135. [self handleHideConversation:item];
  136. }
  137. }
  138. }
  139. - (void)handleRemoveConversation:(TUIConversationCellData *)conversation {
  140. NSInteger index = [self.conversationList indexOfObject:conversation];
  141. [self.conversationList removeObject:conversation];
  142. if (self.delegate && [self.delegate respondsToSelector:@selector(deleteConversationAtIndexPaths:)]) {
  143. [self.delegate deleteConversationAtIndexPaths:@[ [NSIndexPath indexPathForRow:index inSection:0] ]];
  144. }
  145. @weakify(self);
  146. void (^deleteAction)(void) = ^{
  147. [[V2TIMManager sharedInstance] deleteConversation:conversation.conversationID
  148. succ:^{
  149. @strongify(self);
  150. [self updateMarkUnreadCount];
  151. }
  152. fail:nil];
  153. };
  154. [V2TIMManager.sharedInstance markConversation:@[ conversation.conversationID ]
  155. markType:@(V2TIM_CONVERSATION_MARK_TYPE_FOLD)
  156. enableMark:NO
  157. succ:^(NSArray<V2TIMConversationOperationResult *> *result) {
  158. if (deleteAction) {
  159. deleteAction();
  160. }
  161. }
  162. fail:^(int code, NSString *desc) {
  163. if (deleteAction) {
  164. deleteAction();
  165. }
  166. }];
  167. [self.needRemoveConversationList addObject:conversation.conversationID];
  168. }
  169. - (NSMutableArray *)needRemoveConversationList {
  170. if (!_needRemoveConversationList) {
  171. _needRemoveConversationList = [NSMutableArray array];
  172. }
  173. return _needRemoveConversationList;
  174. }
  175. @end