// // KBHomeVM.m // keyBoard // // Created by Mac on 2025/12/3. // #import "KBHomeVM.h" #import "KBCharacter.h" #import "KBTag.h" #import "KBNetworkManager.h" #import "KBHUD.h" #import "KBBizCode.h" #import "KBAPI.h" #import "KBMyVM.h" @interface KBHomeVM () @property (nonatomic, copy, readwrite, nullable) NSArray *rankList; @property (nonatomic, copy, readwrite, nullable) NSArray *tagList; @property (nonatomic, strong) KBMyVM *myVM; @end @implementation KBHomeVM - (void)fetchRankListWithParams:(nullable NSDictionary *)params needShow:(BOOL)needShow completion:(KBHomeRankCompletion)completion { if (needShow) { [KBHUD show]; } NSString *loginUrl = @""; if ([KBUserSessionManager shared].isLoggedIn) { loginUrl = API_CHARACTER_LIST; }else{ loginUrl = API_NOT_LOGIN_CHARACTER_LIST; } [[KBNetworkManager shared] GET:loginUrl parameters:params headers:nil autoShowBusinessError:true completion:^(NSDictionary * _Nullable json, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (needShow) { // [KBHUD dismiss]; } if (error) { // 若是业务错误,优先展示服务端 message // NSString *msg = KBBizMessageFromJSONObject(json) ?: error.localizedDescription ?: KBLocalized(@"Network error"); // [KBHUD showInfo:msg]; // if (completion) { // completion(nil, error); // } return; } id dataObj = json[KBData] ?: json[@"data"]; if (![dataObj isKindOfClass:[NSArray class]]) { NSError *e = [NSError errorWithDomain:KBNetworkErrorDomain code:KBNetworkErrorInvalidResponse userInfo:@{NSLocalizedDescriptionKey: KBLocalized(@"Invalid response")}]; [KBHUD showInfo:e.localizedDescription]; if (completion) { completion(nil, e); } return; } // 使用 MJExtension 将数组字典解析为模型数组 NSArray *list = [KBCharacter mj_objectArrayWithKeyValuesArray:(NSArray *)dataObj]; self.rankList = list; if (completion) { completion(list, nil); } }]; } - (void)fetchRankListByTagId:(nullable NSString *)tagId needShow:(BOOL)needShow completion:(KBHomeRankCompletion)completion { NSMutableDictionary *params = [NSMutableDictionary dictionary]; if (tagId.length) { params[@"tagId"] = tagId; } [self fetchRankListByTagParams:params needShow:needShow completion:completion]; } // 内部辅助方法:调用 /character/listByTag - (void)fetchRankListByTagParams:(NSDictionary *)params needShow:(BOOL)needShow completion:(KBHomeRankCompletion)completion { if (needShow) { [KBHUD show]; } NSString *loginUrl = @""; if ([KBUserSessionManager shared].isLoggedIn) { loginUrl = API_CHARACTER_LIST_BY_TAG; }else{ loginUrl = API_NOT_LOGIN_CHARACTER_LIST_BY_TAG; } [[KBNetworkManager shared] GET:loginUrl parameters:params headers:nil autoShowBusinessError:NO completion:^(NSDictionary * _Nullable json, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (needShow) { [KBHUD dismiss]; } if (error) { NSString *msg = KBBizMessageFromJSONObject(json) ?: error.localizedDescription ?: KBLocalized(@"Network error"); [KBHUD showInfo:msg]; if (completion) { completion(nil, error); } return; } id dataObj = json[KBData] ?: json[@"data"]; if (![dataObj isKindOfClass:[NSArray class]]) { NSError *e = [NSError errorWithDomain:KBNetworkErrorDomain code:KBNetworkErrorInvalidResponse userInfo:@{NSLocalizedDescriptionKey: KBLocalized(@"Invalid response")}]; [KBHUD showInfo:e.localizedDescription]; if (completion) { completion(nil, e); } return; } NSArray *list = [KBCharacter mj_objectArrayWithKeyValuesArray:(NSArray *)dataObj]; if (completion) { completion(list, nil); } }]; } - (void)fetchTagListWithParams:(nullable NSDictionary *)params needShow:(BOOL)needShow completion:(KBHomeTagCompletion)completion { if (needShow) { [KBHUD show]; } [[KBNetworkManager shared] GET:KB_API_TAG_LIST parameters:params headers:nil autoShowBusinessError:NO completion:^(NSDictionary * _Nullable json, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (needShow) { [KBHUD dismiss]; } if (error) { NSString *msg = KBBizMessageFromJSONObject(json) ?: error.localizedDescription ?: KBLocalized(@"Network error"); [KBHUD showInfo:msg]; if (completion) { completion(nil, error); } return; } id dataObj = json[KBData] ?: json[@"data"]; if (![dataObj isKindOfClass:[NSArray class]]) { NSError *e = [NSError errorWithDomain:KBNetworkErrorDomain code:KBNetworkErrorInvalidResponse userInfo:@{NSLocalizedDescriptionKey: KBLocalized(@"Invalid response")}]; [KBHUD showInfo:e.localizedDescription]; if (completion) { completion(nil, e); } return; } NSArray *list = [KBTag mj_objectArrayWithKeyValuesArray:(NSArray *)dataObj]; self.tagList = list; if (completion) { completion(list, nil); } }]; } /// 添加用户人设 - (void)addUserCharacterWithId:(NSNumber *)characterId emoji:(NSString *)emoji completion:(KBHomeAddUserCharacterCompletion)completion { if (!characterId) { if (completion) { NSError *e = [NSError errorWithDomain:KBNetworkErrorDomain code:KBNetworkErrorInvalidResponse userInfo:@{NSLocalizedDescriptionKey: KBLocalized(@"Invalid parameter")}]; completion(NO, e); } return; } NSDictionary *params = @{@"characterId": characterId,@"emoji": emoji}; // [[KBNetworkManager shared] GET:API_CHARACTER_ADD_USER_CHARACTER // parameters:params // headers:nil // autoShowBusinessError:YES // completion:^(NSDictionary *jsonOrData, // NSURLResponse * _Nullable response, // NSError * _Nullable error) { // if (completion) { // completion(error == nil, error); // } // }]; [[KBNetworkManager shared] POST:API_CHARACTER_ADD_USER_CHARACTER jsonBody:params headers:nil autoShowBusinessError:false completion:^(NSDictionary * _Nullable json, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (!error) { [self refreshUserCharacterCacheForKeyboard]; } if (completion) { completion(error == nil, error); } }]; } - (void)refreshUserCharacterCacheForKeyboard { [self.myVM fetchCharacterListByUserWithCompletion:^(NSArray * _Nonnull characterArray, NSError * _Nullable error) { if (error) { NSLog(@"[KBHomeVM] refresh user characters failed: %@", error); } }]; } - (KBMyVM *)myVM { if (!_myVM) { _myVM = [[KBMyVM alloc] init]; } return _myVM; } @end