TUIReplyMessageCellData.m 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. //
  2. // TUIReplyMessageCellData.m
  3. // TUIChat
  4. //
  5. // Created by harvy on 2021/11/11.
  6. // Copyright © 2023 Tencent. All rights reserved.
  7. //
  8. /**
  9. The protocol format of the custom field cloudMessageData of the message
  10. {
  11. "messageReply":{
  12. "messageID": "xxxx0xxx=xx",
  13. "messageAbstract":"origin message abstract..."
  14. "messageSender":"NickName/99618",
  15. "messageType": "1/2/..",
  16. "version":"1",
  17. }
  18. }
  19. */
  20. #import "TUIReplyMessageCellData.h"
  21. #import <TIMCommon/NSString+TUIEmoji.h>
  22. #import "TUIFileMessageCellData.h"
  23. #import "TUIImageMessageCellData.h"
  24. #import "TUIMergeMessageCellData.h"
  25. #import "TUITextMessageCellData.h"
  26. #import "TUIVideoMessageCellData.h"
  27. #import "TUIVoiceMessageCellData.h"
  28. #import "TUICloudCustomDataTypeCenter.h"
  29. #import "TUIFileReplyQuoteViewData.h"
  30. #import "TUIImageReplyQuoteViewData.h"
  31. #import "TUIMergeReplyQuoteViewData.h"
  32. #import "TUIReplyPreviewData.h"
  33. #import "TUITextReplyQuoteViewData.h"
  34. #import "TUIVideoReplyQuoteViewData.h"
  35. #import "TUIVoiceReplyQuoteViewData.h"
  36. @implementation TUIReplyMessageCellData
  37. {
  38. NSString *_sender;
  39. }
  40. - (void)setSender:(NSString *)sender {
  41. _sender = sender;
  42. }
  43. - (NSString *__nullable)sender {
  44. if (self.originMessage) {
  45. return self.originMessage.nameCard ? : (self.originMessage.friendRemark ? : (self.originMessage.nickName ? : self.originMessage.sender));
  46. }
  47. return _sender;
  48. }
  49. + (TUIMessageCellData *)getCellData:(V2TIMMessage *)message {
  50. if (message.cloudCustomData == nil) {
  51. return nil;
  52. }
  53. __block TUIReplyMessageCellData *replyData = nil;
  54. [message doThingsInContainsCloudCustomOfDataType:TUICloudCustomDataType_MessageReply
  55. callback:^(BOOL isContains, id obj) {
  56. if (isContains) {
  57. if (obj && [obj isKindOfClass:NSDictionary.class]) {
  58. NSDictionary *reply = (NSDictionary *)obj;
  59. // This message is a "reply message"
  60. replyData = [[TUIReplyMessageCellData alloc]
  61. initWithDirection:(message.isSelf ? MsgDirectionOutgoing : MsgDirectionIncoming)];
  62. replyData.reuseId = TReplyMessageCell_ReuseId;
  63. replyData.originMsgID = reply[@"messageID"];
  64. replyData.msgAbstract = reply[@"messageAbstract"];
  65. replyData.sender = reply[@"messageSender"];
  66. replyData.originMsgType = (V2TIMElemType)[reply[@"messageType"] integerValue];
  67. replyData.content = message.textElem.text;
  68. replyData.messageRootID = reply[@"messageRootID"];
  69. }
  70. }
  71. }];
  72. return replyData;
  73. }
  74. - (instancetype)initWithDirection:(TMsgDirection)direction {
  75. self = [super initWithDirection:direction];
  76. if (self) {
  77. if (direction == MsgDirectionIncoming) {
  78. self.cellLayout = [TUIMessageCellLayout incommingTextMessageLayout];
  79. } else {
  80. self.cellLayout = [TUIMessageCellLayout outgoingTextMessageLayout];
  81. }
  82. _emojiLocations = [NSMutableArray array];
  83. }
  84. return self;
  85. }
  86. - (CGSize)quotePlaceholderSizeWithType:(V2TIMElemType)type data:(TUIReplyQuoteViewData *)data {
  87. if (data == nil) {
  88. return CGSizeMake(20, 20);
  89. }
  90. return [data contentSize:TReplyQuoteView_Max_Width - 12];
  91. }
  92. - (TUIReplyQuoteViewData *)getQuoteData:(TUIMessageCellData *)originCellData {
  93. TUIReplyQuoteViewData *quoteData = nil;
  94. Class class = [originCellData getReplyQuoteViewDataClass];
  95. BOOL hasRiskContent = originCellData.innerMessage.hasRiskContent;
  96. if (hasRiskContent && [TIMConfig isClassicEntrance]){
  97. // Return text reply data in default
  98. TUITextReplyQuoteViewData *myData = [[TUITextReplyQuoteViewData alloc] init];
  99. myData.text = [TUIReplyPreviewData displayAbstract:self.originMsgType abstract:self.msgAbstract withFileName:NO isRisk:hasRiskContent];
  100. quoteData = myData;
  101. }
  102. else if (class && [class respondsToSelector:@selector(getReplyQuoteViewData:)]) {
  103. quoteData = [class getReplyQuoteViewData:originCellData];
  104. }
  105. else {
  106. }
  107. if (quoteData == nil) {
  108. //
  109. // Return text reply data in default
  110. TUITextReplyQuoteViewData *myData = [[TUITextReplyQuoteViewData alloc] init];
  111. myData.text = [TUIReplyPreviewData displayAbstract:self.originMsgType abstract:self.msgAbstract withFileName:NO isRisk:hasRiskContent];
  112. quoteData = myData;
  113. }
  114. quoteData.originCellData = originCellData;
  115. @weakify(self);
  116. quoteData.onFinish = ^{
  117. @strongify(self);
  118. if (self.onFinish) {
  119. self.onFinish();
  120. }
  121. };
  122. return quoteData;
  123. }
  124. @end
  125. @implementation TUIReferenceMessageCellData
  126. + (TUIMessageCellData *)getCellData:(V2TIMMessage *)message {
  127. if (message.cloudCustomData == nil) {
  128. return nil;
  129. }
  130. __block TUIReplyMessageCellData *replyData = nil;
  131. [message doThingsInContainsCloudCustomOfDataType:TUICloudCustomDataType_MessageReference
  132. callback:^(BOOL isContains, id obj) {
  133. if (isContains) {
  134. if (obj && [obj isKindOfClass:NSDictionary.class]) {
  135. NSDictionary *reply = (NSDictionary *)obj;
  136. if ([reply isKindOfClass:NSDictionary.class]) {
  137. // This message is 「quote message」which indicating the original message
  138. replyData = [[TUIReferenceMessageCellData alloc]
  139. initWithDirection:(message.isSelf ? MsgDirectionOutgoing : MsgDirectionIncoming)];
  140. replyData.reuseId = TUIReferenceMessageCell_ReuseId;
  141. replyData.originMsgID = reply[@"messageID"];
  142. replyData.msgAbstract = reply[@"messageAbstract"];
  143. replyData.sender = reply[@"messageSender"];
  144. replyData.originMsgType = (V2TIMElemType)[reply[@"messageType"] integerValue];
  145. replyData.content = message.textElem.text; // text only
  146. }
  147. }
  148. }
  149. }];
  150. return replyData;
  151. }
  152. @end