This commit is contained in:
2025-12-04 19:12:34 +08:00
parent 8f63741d8c
commit 64887054e0
18 changed files with 331 additions and 50 deletions

View File

@@ -34,6 +34,7 @@
#define KB_API_CHARACTER_LISTBYUSER @"/character/listByUser" // 用户人设列表 #define KB_API_CHARACTER_LISTBYUSER @"/character/listByUser" // 用户人设列表
#define API_CHARACTER_UPDATE_USER_CHARTSORT @"/character/updateUserCharacterSort" // 更新用户人设排序 #define API_CHARACTER_UPDATE_USER_CHARTSORT @"/character/updateUserCharacterSort" // 更新用户人设排序
#define API_CHARACTER_DEL_USER_CHARACTER @"/character/delUserCharacter" // 删除用户人设 #define API_CHARACTER_DEL_USER_CHARACTER @"/character/delUserCharacter" // 删除用户人设
#define API_CHARACTER_ADD_USER_CHARACTER @"/character/addUserCharacter" // 添加用户人设(假定路径,如有不同请按后端实际修改)

View File

@@ -19,6 +19,8 @@ NS_ASSUME_NONNULL_BEGIN
/// "rank" : 899 /// "rank" : 899
/// } /// }
@interface KBCharacter : NSObject @interface KBCharacter : NSObject
/// 首页用的ID也是人设ID
@property (nonatomic, copy, nullable) NSString *ID;
/// 唯一标识,对应后端的 id /// 唯一标识,对应后端的 id
@property (nonatomic, copy, nullable) NSString *characterId; @property (nonatomic, copy, nullable) NSString *characterId;

View File

@@ -11,7 +11,7 @@
// //
return @{ return @{
// id -> characterId // id -> characterId
@"characterId": @"id", @"ID": @"id",
// characterName title // characterName title
@"characterName": @[@"characterName", @"title"], @"characterName": @[@"characterName", @"title"],
}; };

View File

@@ -15,6 +15,9 @@ NS_ASSUME_NONNULL_BEGIN
/// 当前展示的排行榜角色模型 /// 当前展示的排行榜角色模型
@property (nonatomic, strong, nullable) KBCharacter *character; @property (nonatomic, strong, nullable) KBCharacter *character;
/// 点击右侧加号/勾选按钮的回调,由外部 VC 处理网络逻辑
@property (nonatomic, copy, nullable) void (^onTapAction)(void);
/// 旧的配置方法(不再推荐使用),内部会转成 character 赋值 /// 旧的配置方法(不再推荐使用),内部会转成 character 赋值
- (void)configWithRank:(NSInteger)rank - (void)configWithRank:(NSInteger)rank
title:(NSString *)title title:(NSString *)title

View File

@@ -70,6 +70,12 @@
}]; }];
} }
- (void)actionButtonTapped {
if (self.onTapAction) {
self.onTapAction();
}
}
- (void)setCharacter:(KBCharacter *)character { - (void)setCharacter:(KBCharacter *)character {
_character = character; _character = character;
@@ -94,6 +100,8 @@
[self.actionButton setTitleColor:[UIColor colorWithRed:0.20 green:0.65 blue:0.50 alpha:1.0] forState:UIControlStateNormal]; [self.actionButton setTitleColor:[UIColor colorWithRed:0.20 green:0.65 blue:0.50 alpha:1.0] forState:UIControlStateNormal];
self.actionButton.backgroundColor = [UIColor colorWithRed:0.88 green:0.97 blue:0.93 alpha:1.0]; self.actionButton.backgroundColor = [UIColor colorWithRed:0.88 green:0.97 blue:0.93 alpha:1.0];
} }
//
self.actionButton.enabled = !joined;
} }
// //
@@ -111,6 +119,7 @@
[self.avatarView kb_cancelImageLoad]; [self.avatarView kb_cancelImageLoad];
self.avatarView.image = nil; self.avatarView.image = nil;
self.character = nil; self.character = nil;
self.onTapAction = nil;
} }
#pragma mark - Lazy #pragma mark - Lazy
@@ -170,6 +179,7 @@
_actionButton.layer.cornerRadius = 12; _actionButton.layer.cornerRadius = 12;
_actionButton.layer.masksToBounds = YES; _actionButton.layer.masksToBounds = YES;
_actionButton.titleLabel.font = [UIFont systemFontOfSize:20 weight:UIFontWeightBold]; _actionButton.titleLabel.font = [UIFont systemFontOfSize:20 weight:UIFontWeightBold];
[_actionButton addTarget:self action:@selector(actionButtonTapped) forControlEvents:UIControlEventTouchUpInside];
} }
return _actionButton; return _actionButton;
} }

View File

@@ -127,6 +127,8 @@
[self.actionBtn setTitle:@"+" forState:UIControlStateNormal]; [self.actionBtn setTitle:@"+" forState:UIControlStateNormal];
[self.actionBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; [self.actionBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
} }
//
self.actionBtn.enabled = !added;
} }
#pragma mark - Lazy UI #pragma mark - Lazy UI

View File

@@ -16,6 +16,13 @@ NS_ASSUME_NONNULL_BEGIN
/// 使用前三名角色模型进行配置(数组元素为 KBCharacter*,最多取前三个) /// 使用前三名角色模型进行配置(数组元素为 KBCharacter*,最多取前三个)
- (void)configWithCharacters:(NSArray<KBCharacter *> *)characters; - (void)configWithCharacters:(NSArray<KBCharacter *> *)characters;
/// 中间卡片底部加号按钮点击回调(传入对应角色模型,可能为 nil
@property (nonatomic, copy, nullable) void (^onCenterPlusTapped)(KBCharacter * _Nullable character);
/// 左侧卡片底部加号按钮点击回调
@property (nonatomic, copy, nullable) void (^onLeftPlusTapped)(KBCharacter * _Nullable character);
/// 右侧卡片底部加号按钮点击回调
@property (nonatomic, copy, nullable) void (^onRightPlusTapped)(KBCharacter * _Nullable character);
@end @end
NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END

View File

@@ -135,6 +135,10 @@
/// plus /// plus
@property (nonatomic, strong) UIButton *leftPlusButton; @property (nonatomic, strong) UIButton *leftPlusButton;
@property (nonatomic, strong) UIButton *rightPlusButton; @property (nonatomic, strong) UIButton *rightPlusButton;
///
@property (nonatomic, strong, nullable) KBCharacter *firstCharacter;
@property (nonatomic, strong, nullable) KBCharacter *secondCharacter;
@property (nonatomic, strong, nullable) KBCharacter *thirdCharacter;
@end @end
@implementation KBTopThreeView @implementation KBTopThreeView
@@ -203,21 +207,78 @@
} }
- (void)configWithCharacters:(NSArray<KBCharacter *> *)characters { - (void)configWithCharacters:(NSArray<KBCharacter *> *)characters {
if (characters.count == 0) { self.firstCharacter = characters.count > 0 ? characters[0] : nil;
// self.secondCharacter = characters.count > 1 ? characters[1] : nil;
self.thirdCharacter = characters.count > 2 ? characters[2] : nil;
if (self.firstCharacter) {
[self.centerCard renderWithCharacter:self.firstCharacter rank:1];
} else {
[self.centerCard renderWithCharacter:[KBCharacter new] rank:1]; [self.centerCard renderWithCharacter:[KBCharacter new] rank:1];
[self.leftCard renderWithCharacter:[KBCharacter new] rank:2];
[self.rightCard renderWithCharacter:[KBCharacter new] rank:3];
return;
} }
KBCharacter *first = characters.count > 0 ? characters[0] : nil; if (self.secondCharacter) {
KBCharacter *second = characters.count > 1 ? characters[1] : nil; [self.leftCard renderWithCharacter:self.secondCharacter rank:2];
KBCharacter *third = characters.count > 2 ? characters[2] : nil; } else {
[self.leftCard renderWithCharacter:[KBCharacter new] rank:2];
}
if (first) [self.centerCard renderWithCharacter:first rank:1]; if (self.thirdCharacter) {
if (second) [self.leftCard renderWithCharacter:second rank:2]; [self.rightCard renderWithCharacter:self.thirdCharacter rank:3];
if (third) [self.rightCard renderWithCharacter:third rank:3]; } else {
[self.rightCard renderWithCharacter:[KBCharacter new] rank:3];
}
// added UI
[self updatePlusButtonsState];
}
- (void)onCenterPlusTappedInternal {
if (self.onCenterPlusTapped) {
self.onCenterPlusTapped(self.firstCharacter);
}
}
- (void)onLeftPlusTappedInternal {
if (self.onLeftPlusTapped) {
self.onLeftPlusTapped(self.secondCharacter);
}
}
- (void)onRightPlusTappedInternal {
if (self.onRightPlusTapped) {
self.onRightPlusTapped(self.thirdCharacter);
}
}
///
- (void)updatePlusButtonsState {
[self updatePlusButton:self.plusButton withCharacter:self.firstCharacter];
[self updatePlusButton:self.leftPlusButton withCharacter:self.secondCharacter];
[self updatePlusButton:self.rightPlusButton withCharacter:self.thirdCharacter];
}
- (void)updatePlusButton:(UIButton *)button withCharacter:(KBCharacter * _Nullable)character {
if (!character) {
button.hidden = YES;
return;
}
button.hidden = NO;
BOOL added = character.added;
if (added) {
// +
[button setTitle:@"✓" forState:UIControlStateNormal];
[button setTitleColor:[UIColor colorWithWhite:0.45 alpha:1.0] forState:UIControlStateNormal];
button.backgroundColor = [UIColor colorWithWhite:0.92 alpha:1.0];
button.enabled = NO;
} else {
// 绿
[button setTitle:@"+" forState:UIControlStateNormal];
[button setTitleColor:[UIColor colorWithRed:0.20 green:0.65 blue:0.50 alpha:1.0] forState:UIControlStateNormal];
button.backgroundColor = [[UIColor colorWithRed:0.20 green:0.65 blue:0.50 alpha:1.0] colorWithAlphaComponent:0.15];
button.enabled = YES;
}
} }
#pragma mark - Lazy #pragma mark - Lazy
@@ -235,6 +296,7 @@
_plusButton.layer.masksToBounds = YES; _plusButton.layer.masksToBounds = YES;
// //
_plusButton.backgroundColor = [[UIColor colorWithRed:0.20 green:0.65 blue:0.50 alpha:1.0] colorWithAlphaComponent:0.15]; _plusButton.backgroundColor = [[UIColor colorWithRed:0.20 green:0.65 blue:0.50 alpha:1.0] colorWithAlphaComponent:0.15];
[_plusButton addTarget:self action:@selector(onCenterPlusTappedInternal) forControlEvents:UIControlEventTouchUpInside];
} }
return _plusButton; return _plusButton;
} }
@@ -248,6 +310,7 @@
_leftPlusButton.layer.cornerRadius = 14.0; _leftPlusButton.layer.cornerRadius = 14.0;
_leftPlusButton.layer.masksToBounds = YES; _leftPlusButton.layer.masksToBounds = YES;
_leftPlusButton.backgroundColor = [[UIColor colorWithRed:0.20 green:0.65 blue:0.50 alpha:1.0] colorWithAlphaComponent:0.15]; _leftPlusButton.backgroundColor = [[UIColor colorWithRed:0.20 green:0.65 blue:0.50 alpha:1.0] colorWithAlphaComponent:0.15];
[_leftPlusButton addTarget:self action:@selector(onLeftPlusTappedInternal) forControlEvents:UIControlEventTouchUpInside];
} }
return _leftPlusButton; return _leftPlusButton;
} }
@@ -261,6 +324,7 @@
_rightPlusButton.layer.cornerRadius = 14.0; _rightPlusButton.layer.cornerRadius = 14.0;
_rightPlusButton.layer.masksToBounds = YES; _rightPlusButton.layer.masksToBounds = YES;
_rightPlusButton.backgroundColor = [[UIColor colorWithRed:0.20 green:0.65 blue:0.50 alpha:1.0] colorWithAlphaComponent:0.15]; _rightPlusButton.backgroundColor = [[UIColor colorWithRed:0.20 green:0.65 blue:0.50 alpha:1.0] colorWithAlphaComponent:0.15];
[_rightPlusButton addTarget:self action:@selector(onRightPlusTappedInternal) forControlEvents:UIControlEventTouchUpInside];
} }
return _rightPlusButton; return _rightPlusButton;
} }

View File

@@ -17,6 +17,7 @@
#import "LSTPopView.h" #import "LSTPopView.h"
#import <HWPanModal/HWPanModal.h> #import <HWPanModal/HWPanModal.h>
#import "KBMyVM.h" // #import "KBMyVM.h" //
#import "KBHUD.h"
@interface HomeHotVC () <UITableViewDataSource, UITableViewDelegate> @interface HomeHotVC () <UITableViewDataSource, UITableViewDelegate>
@@ -52,6 +53,18 @@
self.topThreeView = [[KBTopThreeView alloc] initWithFrame:CGRectMake(0, 0, KB_SCREEN_WIDTH, headerH)]; self.topThreeView = [[KBTopThreeView alloc] initWithFrame:CGRectMake(0, 0, KB_SCREEN_WIDTH, headerH)];
self.tableView.tableHeaderView = self.topThreeView; self.tableView.tableHeaderView = self.topThreeView;
KBWeakSelf
//
self.topThreeView.onCenterPlusTapped = ^(KBCharacter * _Nullable character) {
[weakSelf kb_addUserCharacterFromTopViewWithCharacter:character];
};
self.topThreeView.onLeftPlusTapped = ^(KBCharacter * _Nullable character) {
[weakSelf kb_addUserCharacterFromTopViewWithCharacter:character];
};
self.topThreeView.onRightPlusTapped = ^(KBCharacter * _Nullable character) {
[weakSelf kb_addUserCharacterFromTopViewWithCharacter:character];
};
// //
self.homeVM = [KBHomeVM new]; self.homeVM = [KBHomeVM new];
[self kb_reloadRankListWithShowHUD:YES]; [self kb_reloadRankListWithShowHUD:YES];
@@ -79,21 +92,9 @@
} }
weakSelf.allCharacters = list ?: @[]; weakSelf.allCharacters = list ?: @[];
// KBTopThreeView //
NSInteger topCount = MIN(3, weakSelf.allCharacters.count); [weakSelf kb_refreshTopThreeView];
if (topCount > 0) { [weakSelf kb_refreshListCharacters];
NSRange range = NSMakeRange(0, topCount);
NSArray<KBCharacter *> *topThree = [weakSelf.allCharacters subarrayWithRange:range];
[weakSelf.topThreeView configWithCharacters:topThree];
}
// 4
if (weakSelf.allCharacters.count > 3) {
NSRange range = NSMakeRange(3, weakSelf.allCharacters.count - 3);
weakSelf.listCharacters = [weakSelf.allCharacters subarrayWithRange:range];
} else {
weakSelf.listCharacters = @[];
}
[weakSelf.tableView reloadData]; [weakSelf.tableView reloadData];
// HomeHotVC PanModal // HomeHotVC PanModal
@@ -129,7 +130,7 @@
BOOL contains = NO; BOOL contains = NO;
for (KBCharacter *c in self.allCharacters) { for (KBCharacter *c in self.allCharacters) {
if (c.characterId.integerValue == targetId) { if (c.ID.integerValue == targetId) {
contains = YES; contains = YES;
break; break;
} }
@@ -140,6 +141,52 @@
[self kb_reloadRankListWithShowHUD:NO]; [self kb_reloadRankListWithShowHUD:NO];
} }
/// allCharacters
- (void)kb_refreshTopThreeView {
NSInteger topCount = MIN(3, self.allCharacters.count);
if (topCount > 0) {
NSRange range = NSMakeRange(0, topCount);
NSArray<KBCharacter *> *topThree = [self.allCharacters subarrayWithRange:range];
[self.topThreeView configWithCharacters:topThree];
} else {
[self.topThreeView configWithCharacters:@[]];
}
}
/// allCharacters 4
- (void)kb_refreshListCharacters {
if (self.allCharacters.count > 3) {
NSRange range = NSMakeRange(3, self.allCharacters.count - 3);
self.listCharacters = [self.allCharacters subarrayWithRange:range];
} else {
self.listCharacters = @[];
}
}
/// +
- (void)kb_addUserCharacterFromTopViewWithCharacter:(KBCharacter * _Nullable)character {
if (!character || character.added) { return; }
NSString *cidStr = character.ID ?: @"";
if (cidStr.length == 0) { return; }
NSNumber *cid = @([cidStr integerValue]);
[self.homeVM addUserCharacterWithId:cid
completion:^(BOOL success, NSError * _Nullable error) {
if (!success) {
NSString *msg = error.localizedDescription ?: KBLocalized(@"Network error");
[KBHUD showInfo:msg];
return;
}
//
character.added = YES;
// UI
[self kb_refreshTopThreeView];
[self.tableView reloadData];
}];
}
#pragma mark - UITableViewDataSource #pragma mark - UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
@@ -151,6 +198,44 @@
KBCharacter *item = self.listCharacters[indexPath.row]; KBCharacter *item = self.listCharacters[indexPath.row];
// cell cell // cell cell
cell.character = item; cell.character = item;
KBWeakSelf
__weak typeof(cell) weakCell = cell;
cell.onTapAction = ^{
__strong typeof(weakSelf) self = weakSelf;
HomeHotCell *strongCell = weakCell;
if (!self || !strongCell) { return; }
NSIndexPath *current = [self.tableView indexPathForCell:strongCell];
if (!current) { return; }
if (current.row >= self.listCharacters.count) { return; }
KBCharacter *mc = self.listCharacters[current.row];
//
if (mc.added) { return; }
NSString *cidStr = mc.ID ?: @"";
if (cidStr.length == 0) { return; }
NSNumber *cid = @([cidStr integerValue]);
[self.homeVM addUserCharacterWithId:cid
completion:^(BOOL success, NSError * _Nullable error) {
if (!success) {
NSString *msg = error.localizedDescription ?: KBLocalized(@"Network error");
[KBHUD showInfo:msg];
return;
}
//
mc.added = YES;
NSMutableArray *m = [self.listCharacters mutableCopy];
[m replaceObjectAtIndex:current.row withObject:mc];
self.listCharacters = [m copy];
[self.tableView reloadRowsAtIndexPaths:@[current] withRowAnimation:UITableViewRowAnimationNone];
//
[self kb_refreshTopThreeView];
}];
};
return cell; return cell;
} }

View File

@@ -14,6 +14,7 @@
#import "HomeRankCardCell.h" #import "HomeRankCardCell.h"
#import "KBHomeVM.h" #import "KBHomeVM.h"
#import "KBCharacter.h" #import "KBCharacter.h"
#import "KBHUD.h"
#import "KBMyVM.h" // #import "KBMyVM.h" //
@interface HomeRankContentVC () @interface HomeRankContentVC ()
@@ -88,7 +89,7 @@
BOOL contains = NO; BOOL contains = NO;
for (KBCharacter *c in self.characters) { for (KBCharacter *c in self.characters) {
if (c.characterId.integerValue == targetId) { if (c.ID.integerValue == targetId) {
contains = YES; contains = YES;
break; break;
} }

View File

@@ -20,6 +20,10 @@ typedef void(^KBHomeRankCompletion)(NSArray<KBCharacter *> * _Nullable list,
typedef void(^KBHomeTagCompletion)(NSArray<KBTag *> * _Nullable list, typedef void(^KBHomeTagCompletion)(NSArray<KBTag *> * _Nullable list,
NSError * _Nullable error); NSError * _Nullable error);
/// 添加用户人设回调
typedef void(^KBHomeAddUserCharacterCompletion)(BOOL success,
NSError * _Nullable error);
@interface KBHomeVM : NSObject @interface KBHomeVM : NSObject
/// 最近一次成功请求到的排行榜数据 /// 最近一次成功请求到的排行榜数据
@@ -51,6 +55,11 @@ typedef void(^KBHomeTagCompletion)(NSArray<KBTag *> * _Nullable list,
needShow:(BOOL)needShow needShow:(BOOL)needShow
completion:(KBHomeTagCompletion)completion; completion:(KBHomeTagCompletion)completion;
/// 添加用户人设(例如在首页排行榜中点 “+”)
/// GET /character/addUserCharacter?id={characterId}
- (void)addUserCharacterWithId:(NSNumber *)characterId
completion:(KBHomeAddUserCharacterCompletion)completion;
@end @end
NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END

View File

@@ -11,6 +11,7 @@
#import "KBNetworkManager.h" #import "KBNetworkManager.h"
#import "KBHUD.h" #import "KBHUD.h"
#import "KBBizCode.h" #import "KBBizCode.h"
#import "KBAPI.h"
@interface KBHomeVM () @interface KBHomeVM ()
@property (nonatomic, copy, readwrite, nullable) NSArray<KBCharacter *> *rankList; @property (nonatomic, copy, readwrite, nullable) NSArray<KBCharacter *> *rankList;
@@ -170,4 +171,36 @@
}]; }];
} }
///
- (void)addUserCharacterWithId:(NSNumber *)characterId
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};
// [[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 (completion) {
completion(error == nil, error);
}
}];
}
@end @end

View File

@@ -8,6 +8,9 @@
#import "KBEmailLoginVC.h" #import "KBEmailLoginVC.h"
#import "KBEmailRegistVC.h" #import "KBEmailRegistVC.h"
#import "KBForgetPwdVC.h" #import "KBForgetPwdVC.h"
#import "KBLoginVM.h"
#import "AppDelegate.h"
#import "BaseTabBarController.h"
@interface KBEmailLoginVC () <UITextViewDelegate, UITextFieldDelegate> @interface KBEmailLoginVC () <UITextViewDelegate, UITextFieldDelegate>
// //
@@ -41,6 +44,7 @@
@property (nonatomic, strong) UITextView *agreementTextView; @property (nonatomic, strong) UITextView *agreementTextView;
@property (nonatomic, strong) UILabel *accountTipLabel; // Don't Have An Account? @property (nonatomic, strong) UILabel *accountTipLabel; // Don't Have An Account?
@property (nonatomic, strong) UIButton *signUpButton; // Sign Up @property (nonatomic, strong) UIButton *signUpButton; // Sign Up
@property (nonatomic, strong) KBLoginVM *loginVM; // Confirm
@end @end
@@ -49,6 +53,7 @@
- (void)viewDidLoad { - (void)viewDidLoad {
[super viewDidLoad]; [super viewDidLoad];
// /使 + // /使 +
self.loginVM = [[KBLoginVM alloc] init];
self.kb_enableCustomNavBar = NO; self.kb_enableCustomNavBar = NO;
self.view.backgroundColor = [UIColor whiteColor]; self.view.backgroundColor = [UIColor whiteColor];
[self kb_addTapToDismissKeyboard]; [self kb_addTapToDismissKeyboard];
@@ -217,8 +222,27 @@
- (void)onTapSubmit { - (void)onTapSubmit {
KBLOG(@"KBEmailLoginVC onTapSubmit, email=%@, pwdLen=%zd", KBLOG(@"KBEmailLoginVC onTapSubmit, email=%@, pwdLen=%zd",
self.emailTextField.text, self.emailTextField.text,
self.passwordTextField.text.length); self.passwordTextField.text.length);
NSString *email = self.emailTextField.text ? self.emailTextField.text : @"";
NSString *password = self.passwordTextField.text ? self.passwordTextField.text : @"";
[self.loginVM emailLoginEmail:email password:password WithCompletion:^(BOOL success, NSError * _Nullable error) {
if (success) {
id<UIApplicationDelegate> appDelegate = UIApplication.sharedApplication.delegate;
if ([appDelegate respondsToSelector:@selector(setupRootVC)]) {
AppDelegate *delegate = (AppDelegate *)appDelegate;
// [delegate toMainTabbarVC];
delegate.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
delegate.window.backgroundColor = [UIColor whiteColor];
[delegate.window makeKeyAndVisible];
UIViewController *rootVC = nil;
rootVC = [[BaseTabBarController alloc] init];
delegate.window.rootViewController = rootVC;
}
}
}];
} }
- (void)onTapForgotPassword { - (void)onTapForgotPassword {

View File

@@ -10,6 +10,7 @@
#import "KBLoginVM.h" #import "KBLoginVM.h"
#import "KBUser.h" #import "KBUser.h"
#import "AppDelegate.h" #import "AppDelegate.h"
#import "KBEmailLoginVC.h"
@interface KBRegistVerEmailVC () @interface KBRegistVerEmailVC ()
@@ -32,6 +33,11 @@
[self kb_addTapToDismissKeyboard]; [self kb_addTapToDismissKeyboard];
[self setupUI]; [self setupUI];
//
NSString *email = self.params[@"mailAddress"];
[self.loginVM sendVerifyMailWithEmail:email withCompletion:^(BOOL success, NSError * _Nullable error) {
}];
} }
#pragma mark - UI #pragma mark - UI
@@ -88,7 +94,7 @@
return; return;
} }
KBLOG(@"KBRegistVerEmailVC confirm with code=%@", code); KBLOG(@"KBRegistVerEmailVC confirm with code=%@", code);
self.params[@"code"] = code; self.params[@"verifyCode"] = code;
NSNumber *genderNumber = [self kb_localGenderParamIfAvailable]; NSNumber *genderNumber = [self kb_localGenderParamIfAvailable];
if (genderNumber != nil) { if (genderNumber != nil) {
self.params[@"gender"] = genderNumber; self.params[@"gender"] = genderNumber;
@@ -98,11 +104,20 @@
[KBHUD showInfo:KBLocalized(@"Signed in successfully")]; [KBHUD showInfo:KBLocalized(@"Signed in successfully")];
// TabBar // TabBar
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
id<UIApplicationDelegate> appDelegate = UIApplication.sharedApplication.delegate; KBEmailLoginVC *vc = [[KBEmailLoginVC alloc] init];
if ([appDelegate respondsToSelector:@selector(setupRootVC)]) { [KB_CURRENT_NAV pushViewController:vc animated:true];
AppDelegate *delegate = (AppDelegate *)appDelegate; // id<UIApplicationDelegate> appDelegate = UIApplication.sharedApplication.delegate;
[delegate toMainTabbarVC]; // if ([appDelegate respondsToSelector:@selector(setupRootVC)]) {
} // AppDelegate *delegate = (AppDelegate *)appDelegate;
//// [delegate toMainTabbarVC];
// delegate.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// delegate.window.backgroundColor = [UIColor whiteColor];
// [delegate.window makeKeyAndVisible];
// UIViewController *rootVC = nil;
// rootVC = [[BaseTabBarController alloc] init];
// self.window.rootViewController = rootVC;
// }
}); });
} else { } else {
NSString *msg = error.localizedDescription ?: KBLocalized(@"Sign-in failed"); NSString *msg = error.localizedDescription ?: KBLocalized(@"Sign-in failed");

View File

@@ -13,6 +13,7 @@ NS_ASSUME_NONNULL_BEGIN
/// 登录完成回调 /// 登录完成回调
typedef void(^KBLoginCompletion)(BOOL success, NSError * _Nullable error); typedef void(^KBLoginCompletion)(BOOL success, NSError * _Nullable error);
typedef void(^KBRegisterCompletion)(BOOL success, NSError * _Nullable error); typedef void(^KBRegisterCompletion)(BOOL success, NSError * _Nullable error);
typedef void(^KBVerifyMailCompletion)(BOOL success, NSError * _Nullable error);
@interface KBLoginVM : NSObject @interface KBLoginVM : NSObject
@@ -30,6 +31,9 @@ typedef void(^KBRegisterCompletion)(BOOL success, NSError * _Nullable error);
- (void)emailLoginEmail:(NSString *)email password:(NSString *)password WithCompletion:(KBLoginCompletion)completion; - (void)emailLoginEmail:(NSString *)email password:(NSString *)password WithCompletion:(KBLoginCompletion)completion;
/// 邮箱注册 /// 邮箱注册
- (void)emailRegisterParams:(NSDictionary *)params withCompletion:(KBRegisterCompletion)completion; - (void)emailRegisterParams:(NSDictionary *)params withCompletion:(KBRegisterCompletion)completion;
/// 发送验证码
- (void)sendVerifyMailWithEmail:(NSString *)email withCompletion:(KBVerifyMailCompletion)completion;
/// 是否已登录:由 KBAuthManager 判断(是否存在有效 token /// 是否已登录:由 KBAuthManager 判断(是否存在有效 token
- (BOOL)isLoggedIn; - (BOOL)isLoggedIn;

View File

@@ -132,6 +132,20 @@
}]; }];
} }
///
- (void)sendVerifyMailWithEmail:(NSString *)email withCompletion:(KBVerifyMailCompletion)completion{
NSMutableDictionary *params = [NSMutableDictionary dictionary];
if (email.length) params[@"mailAddress"] = email;
// [[KBNetworkManager shared] POST:API_EMAIL_REGISTER jsonBody:params headers:nil completion:^(NSDictionary * _Nullable jsonOrData, NSURLResponse * _Nullable response, NSError * _Nullable error) {
// if (error) { if (completion) completion(NO, error); return; }
// [];
// completion(true,nil);
// }];
[[KBNetworkManager shared] POST:API_EMAIL_REGISTER jsonBody:params headers:nil autoShowBusinessError:true completion:^(NSDictionary * _Nullable json, NSURLResponse * _Nullable response, NSError * _Nullable error) {
}];
}
#pragma mark - Helpers #pragma mark - Helpers
// token / access_token / accessToken data/user // token / access_token / accessToken data/user

View File

@@ -109,7 +109,9 @@ static NSString * const kKBMyKeyboardCellId = @"kKBMyKeyboardCellId";
for (KBCharacter *c in characterArray) { for (KBCharacter *c in characterArray) {
NSString *emoji = c.emoji ?: @""; NSString *emoji = c.emoji ?: @"";
NSString *title = c.characterName ?: @""; NSString *title = c.characterName ?: @"";
NSString *identifier = c.characterId ?: @""; NSString *identifier = c.ID ?: @"";
NSString *characterId = c.characterId ?: @"";
// emoji // emoji
if (emoji.length == 0 && title.length == 0) { if (emoji.length == 0 && title.length == 0) {
continue; continue;
@@ -117,6 +119,8 @@ static NSString * const kKBMyKeyboardCellId = @"kKBMyKeyboardCellId";
NSMutableDictionary *item = [NSMutableDictionary dictionary]; NSMutableDictionary *item = [NSMutableDictionary dictionary];
item[@"emoji"] = emoji; item[@"emoji"] = emoji;
item[@"title"] = title; item[@"title"] = title;
item[@"characterId"] = characterId;
if (identifier.length > 0) { if (identifier.length > 0) {
// 便 sort // 便 sort
NSInteger cid = identifier.integerValue; NSInteger cid = identifier.integerValue;
@@ -154,18 +158,21 @@ static NSString * const kKBMyKeyboardCellId = @"kKBMyKeyboardCellId";
if (!tapIndexPath) { return; } if (!tapIndexPath) { return; }
// id // id
NSNumber *characterId = nil; NSNumber *delId = nil; // ID
NSString *characterId = @""; // ID
if (tapIndexPath.section < self.dataSourceArray.count) { if (tapIndexPath.section < self.dataSourceArray.count) {
NSArray *section = self.dataSourceArray[tapIndexPath.section]; NSArray *section = self.dataSourceArray[tapIndexPath.section];
if (tapIndexPath.item < section.count) { if (tapIndexPath.item < section.count) {
NSDictionary *item = section[tapIndexPath.item]; NSDictionary *item = section[tapIndexPath.item];
id cid = item[@"id"]; id cid = item[@"id"];
characterId = item[@"characterId"];
if ([cid isKindOfClass:[NSNumber class]]) { if ([cid isKindOfClass:[NSNumber class]]) {
characterId = (NSNumber *)cid; delId = (NSNumber *)cid;
} else if ([cid isKindOfClass:[NSString class]]) { } else if ([cid isKindOfClass:[NSString class]]) {
NSString *cidStr = (NSString *)cid; NSString *cidStr = (NSString *)cid;
if (cidStr.length > 0) { if (cidStr.length > 0) {
characterId = @([cidStr integerValue]); delId = @([cidStr integerValue]);
} }
} }
} }
@@ -181,7 +188,7 @@ static NSString * const kKBMyKeyboardCellId = @"kKBMyKeyboardCellId";
if (!ok) { return; } if (!ok) { return; }
// id UI // id UI
if (!characterId) { if (!delId) {
if (tapIndexPath.section < self.dataSourceArray.count) { if (tapIndexPath.section < self.dataSourceArray.count) {
NSMutableArray *section = self.dataSourceArray[tapIndexPath.section]; NSMutableArray *section = self.dataSourceArray[tapIndexPath.section];
if (tapIndexPath.item < section.count) { if (tapIndexPath.item < section.count) {
@@ -196,7 +203,7 @@ static NSString * const kKBMyKeyboardCellId = @"kKBMyKeyboardCellId";
// //
__weak typeof(self) weakSelf2 = self; __weak typeof(self) weakSelf2 = self;
[self.viewModel deleteUserCharacterWithId:characterId [self.viewModel deleteUserCharacterWithId:delId
completion:^(BOOL success, NSError * _Nullable error) { completion:^(BOOL success, NSError * _Nullable error) {
__strong typeof(weakSelf2) strongSelf = weakSelf2; __strong typeof(weakSelf2) strongSelf = weakSelf2;
if (!strongSelf) { return; } if (!strongSelf) { return; }
@@ -206,7 +213,13 @@ static NSString * const kKBMyKeyboardCellId = @"kKBMyKeyboardCellId";
[KBHUD showInfo:msg]; [KBHUD showInfo:msg];
return; return;
} }
// App HomeRankContentVC / HomeHotVC
NSDictionary *info = @{@"characterId": characterId ?: @0};
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:KBUserCharacterDeletedNotification
object:nil
userInfo:info];
});
// UI // UI
[strongSelf kb_reloadUserCharacters]; [strongSelf kb_reloadUserCharacters];
}]; }];

View File

@@ -123,13 +123,7 @@ NSString * const KBUserCharacterDeletedNotification = @"KBUserCharacterDeletedNo
BOOL success = (error == nil); BOOL success = (error == nil);
if (success) { if (success) {
// App HomeRankContentVC / HomeHotVC
NSDictionary *info = @{@"characterId": characterId ?: @0};
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:KBUserCharacterDeletedNotification
object:nil
userInfo:info];
});
} }
if (completion) { if (completion) {