2025-12-03 18:19:51 +08:00
|
|
|
|
//
|
|
|
|
|
|
// KBHomeVM.m
|
|
|
|
|
|
// keyBoard
|
|
|
|
|
|
//
|
|
|
|
|
|
// Created by Mac on 2025/12/3.
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
#import "KBHomeVM.h"
|
|
|
|
|
|
#import "KBCharacter.h"
|
2025-12-03 19:00:55 +08:00
|
|
|
|
#import "KBTag.h"
|
2025-12-03 18:19:51 +08:00
|
|
|
|
#import "KBNetworkManager.h"
|
|
|
|
|
|
#import "KBHUD.h"
|
|
|
|
|
|
#import "KBBizCode.h"
|
2025-12-04 19:12:34 +08:00
|
|
|
|
#import "KBAPI.h"
|
2025-12-11 17:36:16 +08:00
|
|
|
|
#import "KBMyVM.h"
|
2025-12-03 18:19:51 +08:00
|
|
|
|
|
|
|
|
|
|
@interface KBHomeVM ()
|
|
|
|
|
|
@property (nonatomic, copy, readwrite, nullable) NSArray<KBCharacter *> *rankList;
|
2025-12-03 19:00:55 +08:00
|
|
|
|
@property (nonatomic, copy, readwrite, nullable) NSArray<KBTag *> *tagList;
|
2025-12-11 17:36:16 +08:00
|
|
|
|
@property (nonatomic, strong) KBMyVM *myVM;
|
2025-12-03 18:19:51 +08:00
|
|
|
|
@end
|
|
|
|
|
|
|
|
|
|
|
|
@implementation KBHomeVM
|
|
|
|
|
|
|
|
|
|
|
|
- (void)fetchRankListWithParams:(nullable NSDictionary *)params
|
|
|
|
|
|
needShow:(BOOL)needShow
|
|
|
|
|
|
completion:(KBHomeRankCompletion)completion {
|
|
|
|
|
|
if (needShow) {
|
|
|
|
|
|
[KBHUD show];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-04 20:04:02 +08:00
|
|
|
|
NSString *loginUrl = @"";
|
|
|
|
|
|
if ([KBUserSessionManager shared].isLoggedIn) {
|
|
|
|
|
|
loginUrl = API_CHARACTER_LIST;
|
|
|
|
|
|
}else{
|
|
|
|
|
|
loginUrl = API_NOT_LOGIN_CHARACTER_LIST;
|
|
|
|
|
|
}
|
|
|
|
|
|
[[KBNetworkManager shared] GET:loginUrl
|
2025-12-03 18:19:51 +08:00
|
|
|
|
parameters:params
|
|
|
|
|
|
headers:nil
|
2025-12-04 19:44:54 +08:00
|
|
|
|
autoShowBusinessError:true
|
2025-12-03 18:19:51 +08:00
|
|
|
|
completion:^(NSDictionary * _Nullable json, NSURLResponse * _Nullable response, NSError * _Nullable error) {
|
|
|
|
|
|
if (needShow) {
|
2025-12-04 19:44:54 +08:00
|
|
|
|
// [KBHUD dismiss];
|
2025-12-03 18:19:51 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (error) {
|
|
|
|
|
|
// 若是业务错误,优先展示服务端 message
|
2025-12-04 19:44:54 +08:00
|
|
|
|
// NSString *msg = KBBizMessageFromJSONObject(json) ?: error.localizedDescription ?: KBLocalized(@"Network error");
|
|
|
|
|
|
// [KBHUD showInfo:msg];
|
|
|
|
|
|
// if (completion) {
|
|
|
|
|
|
// completion(nil, error);
|
|
|
|
|
|
// }
|
2025-12-03 18:19:51 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
2025-12-15 15:47:16 +08:00
|
|
|
|
[KBHUD dismiss];
|
2025-12-03 18:19:51 +08:00
|
|
|
|
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<KBCharacter *> *list = [KBCharacter mj_objectArrayWithKeyValuesArray:(NSArray *)dataObj];
|
|
|
|
|
|
self.rankList = list;
|
|
|
|
|
|
|
|
|
|
|
|
if (completion) {
|
|
|
|
|
|
completion(list, nil);
|
|
|
|
|
|
}
|
|
|
|
|
|
}];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-03 19:19:20 +08:00
|
|
|
|
- (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 {
|
2025-12-15 15:47:16 +08:00
|
|
|
|
// if (needShow) {
|
|
|
|
|
|
// [KBHUD show];
|
|
|
|
|
|
// }
|
2025-12-04 20:04:02 +08:00
|
|
|
|
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
|
2025-12-03 19:19:20 +08:00
|
|
|
|
parameters:params
|
|
|
|
|
|
headers:nil
|
|
|
|
|
|
autoShowBusinessError:NO
|
|
|
|
|
|
completion:^(NSDictionary * _Nullable json, NSURLResponse * _Nullable response, NSError * _Nullable error) {
|
2025-12-15 15:47:16 +08:00
|
|
|
|
// if (needShow) {
|
|
|
|
|
|
// [KBHUD dismiss];
|
|
|
|
|
|
// }
|
|
|
|
|
|
[KBHUD dismiss];
|
2025-12-03 19:19:20 +08:00
|
|
|
|
|
|
|
|
|
|
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<KBCharacter *> *list = [KBCharacter mj_objectArrayWithKeyValuesArray:(NSArray *)dataObj];
|
|
|
|
|
|
if (completion) {
|
|
|
|
|
|
completion(list, nil);
|
|
|
|
|
|
}
|
|
|
|
|
|
}];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-03 19:00:55 +08:00
|
|
|
|
- (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<KBTag *> *list = [KBTag mj_objectArrayWithKeyValuesArray:(NSArray *)dataObj];
|
|
|
|
|
|
self.tagList = list;
|
|
|
|
|
|
|
|
|
|
|
|
if (completion) {
|
|
|
|
|
|
completion(list, nil);
|
|
|
|
|
|
}
|
|
|
|
|
|
}];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-04 19:12:34 +08:00
|
|
|
|
/// 添加用户人设
|
2025-12-08 16:39:47 +08:00
|
|
|
|
- (void)addUserCharacterWithId:(NSNumber *)characterId emoji:(NSString *)emoji
|
2025-12-04 19:12:34 +08:00
|
|
|
|
completion:(KBHomeAddUserCharacterCompletion)completion {
|
2025-12-12 14:16:48 +08:00
|
|
|
|
[KBHUD show];
|
2025-12-04 19:12:34 +08:00
|
|
|
|
if (!characterId) {
|
|
|
|
|
|
if (completion) {
|
|
|
|
|
|
NSError *e = [NSError errorWithDomain:KBNetworkErrorDomain
|
|
|
|
|
|
code:KBNetworkErrorInvalidResponse
|
|
|
|
|
|
userInfo:@{NSLocalizedDescriptionKey: KBLocalized(@"Invalid parameter")}];
|
|
|
|
|
|
completion(NO, e);
|
|
|
|
|
|
}
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-08 16:39:47 +08:00
|
|
|
|
NSDictionary *params = @{@"characterId": characterId,@"emoji": emoji};
|
2025-12-04 19:12:34 +08:00
|
|
|
|
// [[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);
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }];
|
2025-12-12 14:16:48 +08:00
|
|
|
|
[[KBNetworkManager shared] POST:API_CHARACTER_ADD_USER_CHARACTER jsonBody:params headers:nil autoShowBusinessError:true completion:^(NSDictionary * _Nullable json, NSURLResponse * _Nullable response, NSError * _Nullable error) {
|
2025-12-11 17:36:16 +08:00
|
|
|
|
if (!error) {
|
|
|
|
|
|
[self refreshUserCharacterCacheForKeyboard];
|
|
|
|
|
|
}
|
2025-12-04 19:12:34 +08:00
|
|
|
|
if (completion) {
|
|
|
|
|
|
completion(error == nil, error);
|
|
|
|
|
|
}
|
|
|
|
|
|
}];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-11 17:36:16 +08:00
|
|
|
|
- (void)refreshUserCharacterCacheForKeyboard {
|
|
|
|
|
|
[self.myVM fetchCharacterListByUserWithCompletion:^(NSArray<KBCharacter *> * _Nonnull characterArray, NSError * _Nullable error) {
|
|
|
|
|
|
if (error) {
|
|
|
|
|
|
NSLog(@"[KBHomeVM] refresh user characters failed: %@", error);
|
|
|
|
|
|
}
|
|
|
|
|
|
}];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
- (KBMyVM *)myVM {
|
|
|
|
|
|
if (!_myVM) {
|
|
|
|
|
|
_myVM = [[KBMyVM alloc] init];
|
|
|
|
|
|
}
|
|
|
|
|
|
return _myVM;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-03 18:19:51 +08:00
|
|
|
|
@end
|