Files
featherVoice/TUIKit/TUIEmojiPlugin/UI/DataProvider/TUIMessageCellData+Reaction.m
2025-08-08 10:49:36 +08:00

96 lines
3.0 KiB
Objective-C

//
// TUIMessageCellData+Reaction.m
// TUIEmojiPlugin
//
// Created by cologne on 2023/11/27.
// Copyright © 2023 Tencent. All rights reserved.
#import "TUIMessageCellData+Reaction.h"
#import <objc/runtime.h>
#import "TUIReactModel.h"
#import "TUIReactUtil.h"
@implementation TUIMessageCellData (Reaction)
- (TUIEmojiReactDataProvider *)reactdataProvider {
return objc_getAssociatedObject(self, @"reactdataProvider");
}
- (void)setReactdataProvider:(TUIEmojiReactDataProvider *)reactdataProvider {
objc_setAssociatedObject(self, @"reactdataProvider", reactdataProvider, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (void)setReactValueChangedCallback:(TUIReactValueChangedCallback)reactValueChangedCallback {
objc_setAssociatedObject(self, @"reactValueChangedCallback", reactValueChangedCallback, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (TUIReactValueChangedCallback)reactValueChangedCallback {
return objc_getAssociatedObject(self, @"reactValueChangedCallback");
}
- (void)setupReactDataProvider {
if (self.status == Msg_Status_Fail) {
return;
}
self.reactdataProvider = [[TUIEmojiReactDataProvider alloc] init];
self.reactdataProvider.msgId = self.innerMessage.msgID;
__weak typeof(self) weakSelf = self;
self.reactdataProvider.changed = ^(NSArray<TUIReactModel *> * _Nonnull tagsArray, NSMutableDictionary * _Nonnull tagsMap) {
if (weakSelf.reactValueChangedCallback) {
weakSelf.reactValueChangedCallback(tagsArray);
}
};
}
- (void)addReactModel:(TUIReactModel *)model {
[self addReactByEmojiKey:model.emojiKey];
}
- (void)delReactModel:(TUIReactModel *)model {
[self delReactByEmojiKey:model.emojiKey];
}
- (void)addReactByEmojiKey:(NSString *)emojiKey {
[self.reactdataProvider addMessageReaction:self.innerMessage
reactionID:emojiKey
succ:^{
}
fail:^(int code, NSString *desc){
NSString* errMsg = [TUITool convertIMError:code msg:desc];
[TUITool makeToast:errMsg];
}];
}
- (void)delReactByEmojiKey:(NSString *)emojiKey {
[self.reactdataProvider removeMessageReaction:self.innerMessage
reactionID:emojiKey
succ:^{
}
fail:^(int code, NSString *desc) {
NSString *errMsg = [TUITool convertIMError:code msg:desc];
[TUITool makeToast:errMsg];
}];
}
- (void)updateReactClick:(NSString *)faceName {
TUIEmojiReactDataProvider *reactdataProvider = self.reactdataProvider;
TUIReactModel * targetModel = [reactdataProvider getCurrentReactionIDInMap:faceName];
if (targetModel) {
if (targetModel.reactedByMyself) {
//del
[self delReactByEmojiKey:targetModel.emojiKey];
}
else {
//add
[self addReactByEmojiKey:targetModel.emojiKey];
}
}
else {
// new model
[self addReactByEmojiKey:faceName];
}
}
@end