diff --git a/CustomKeyboard/KeyboardAssets.xcassets/ai_limit_close.imageset/Contents.json b/CustomKeyboard/KeyboardAssets.xcassets/ai_limit_close.imageset/Contents.json new file mode 100644 index 0000000..8ea17fb --- /dev/null +++ b/CustomKeyboard/KeyboardAssets.xcassets/ai_limit_close.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ai_limit_close@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ai_limit_close@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CustomKeyboard/KeyboardAssets.xcassets/ai_limit_close.imageset/ai_limit_close@2x.png b/CustomKeyboard/KeyboardAssets.xcassets/ai_limit_close.imageset/ai_limit_close@2x.png new file mode 100644 index 0000000..e505a42 Binary files /dev/null and b/CustomKeyboard/KeyboardAssets.xcassets/ai_limit_close.imageset/ai_limit_close@2x.png differ diff --git a/CustomKeyboard/KeyboardAssets.xcassets/ai_limit_close.imageset/ai_limit_close@3x.png b/CustomKeyboard/KeyboardAssets.xcassets/ai_limit_close.imageset/ai_limit_close@3x.png new file mode 100644 index 0000000..5c13d1c Binary files /dev/null and b/CustomKeyboard/KeyboardAssets.xcassets/ai_limit_close.imageset/ai_limit_close@3x.png differ diff --git a/CustomKeyboard/KeyboardAssets.xcassets/ai_limit_goto.imageset/Contents.json b/CustomKeyboard/KeyboardAssets.xcassets/ai_limit_goto.imageset/Contents.json new file mode 100644 index 0000000..17c0922 --- /dev/null +++ b/CustomKeyboard/KeyboardAssets.xcassets/ai_limit_goto.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ai_limit_goto@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ai_limit_goto@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CustomKeyboard/KeyboardAssets.xcassets/ai_limit_goto.imageset/ai_limit_goto@2x.png b/CustomKeyboard/KeyboardAssets.xcassets/ai_limit_goto.imageset/ai_limit_goto@2x.png new file mode 100644 index 0000000..79ad03d Binary files /dev/null and b/CustomKeyboard/KeyboardAssets.xcassets/ai_limit_goto.imageset/ai_limit_goto@2x.png differ diff --git a/CustomKeyboard/KeyboardAssets.xcassets/ai_limit_goto.imageset/ai_limit_goto@3x.png b/CustomKeyboard/KeyboardAssets.xcassets/ai_limit_goto.imageset/ai_limit_goto@3x.png new file mode 100644 index 0000000..543a0ae Binary files /dev/null and b/CustomKeyboard/KeyboardAssets.xcassets/ai_limit_goto.imageset/ai_limit_goto@3x.png differ diff --git a/CustomKeyboard/KeyboardAssets.xcassets/ai_limit_icon.imageset/Contents.json b/CustomKeyboard/KeyboardAssets.xcassets/ai_limit_icon.imageset/Contents.json new file mode 100644 index 0000000..9808298 --- /dev/null +++ b/CustomKeyboard/KeyboardAssets.xcassets/ai_limit_icon.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ai_limit_icon@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ai_limit_icon@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CustomKeyboard/KeyboardAssets.xcassets/ai_limit_icon.imageset/ai_limit_icon@2x.png b/CustomKeyboard/KeyboardAssets.xcassets/ai_limit_icon.imageset/ai_limit_icon@2x.png new file mode 100644 index 0000000..fd51184 Binary files /dev/null and b/CustomKeyboard/KeyboardAssets.xcassets/ai_limit_icon.imageset/ai_limit_icon@2x.png differ diff --git a/CustomKeyboard/KeyboardAssets.xcassets/ai_limit_icon.imageset/ai_limit_icon@3x.png b/CustomKeyboard/KeyboardAssets.xcassets/ai_limit_icon.imageset/ai_limit_icon@3x.png new file mode 100644 index 0000000..b8fcef6 Binary files /dev/null and b/CustomKeyboard/KeyboardAssets.xcassets/ai_limit_icon.imageset/ai_limit_icon@3x.png differ diff --git a/CustomKeyboard/KeyboardViewController.m b/CustomKeyboard/KeyboardViewController.m index 1c684a2..9326fba 100644 --- a/CustomKeyboard/KeyboardViewController.m +++ b/CustomKeyboard/KeyboardViewController.m @@ -20,6 +20,7 @@ #import "KBSettingView.h" #import "KBChatMessage.h" #import "KBChatPanelView.h" +#import "KBChatLimitPopView.h" #import "KBSkinInstallBridge.h" #import "KBSkinManager.h" #import "KBSuggestionEngine.h" @@ -66,7 +67,8 @@ static void KBSkinInstallNotificationCallback(CFNotificationCenterRef center, @interface KeyboardViewController () + KBChatPanelViewDelegate, + KBChatLimitPopViewDelegate> @property(nonatomic, strong) UIButton *nextKeyboardButton; // 系统“下一个键盘”按钮(可选) @property(nonatomic, strong) UIView *contentView; @@ -85,6 +87,7 @@ static void KBSkinInstallNotificationCallback(CFNotificationCenterRef center, @property(nonatomic, strong) KBSuggestionEngine *suggestionEngine; @property(nonatomic, copy) NSString *currentWord; @property(nonatomic, assign) BOOL suppressSuggestions; +@property(nonatomic, strong) UIControl *chatLimitMaskView; @property(nonatomic, strong) MASConstraint *contentWidthConstraint; @property(nonatomic, strong) MASConstraint *contentHeightConstraint; @property(nonatomic, strong) MASConstraint *keyBoardMainHeightConstraint; @@ -867,14 +870,66 @@ static void KBSkinInstallNotificationCallback(CFNotificationCenterRef center, [KBHUD showInfo:KBLocalized(@"请开启完全访问后使用")]; return; } - + // 添加 loading 消息 [self.chatPanelView kb_addLoadingAssistantMessage]; - + // 调用新的聊天接口 [self kb_requestChatMessageWithContent:text]; } +#pragma mark - Chat Limit Pop + +- (void)kb_showChatLimitPopWithMessage:(NSString *)message { + [self kb_dismissChatLimitPop]; + + UIControl *mask = [[UIControl alloc] init]; + mask.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.4]; + mask.alpha = 0.0; + [mask addTarget:self + action:@selector(kb_dismissChatLimitPop) + forControlEvents:UIControlEventTouchUpInside]; + [self.contentView addSubview:mask]; + [mask mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.equalTo(self.contentView); + }]; + + CGFloat width = 252.0; + CGFloat height = 252.0 + 18.0 + 53.0 + 18.0 + 28.0; + KBChatLimitPopView *content = + [[KBChatLimitPopView alloc] initWithFrame:CGRectMake(0, 0, width, height)]; + content.message = message ?: @""; + content.delegate = self; + [mask addSubview:content]; + [content mas_makeConstraints:^(MASConstraintMaker *make) { + make.center.equalTo(mask); + make.width.mas_equalTo(width); + make.height.mas_equalTo(height); + }]; + + self.chatLimitMaskView = mask; + [self.contentView bringSubviewToFront:mask]; + [UIView animateWithDuration:0.18 + animations:^{ + mask.alpha = 1.0; + }]; +} + +- (void)kb_dismissChatLimitPop { + if (!self.chatLimitMaskView) { + return; + } + UIControl *mask = self.chatLimitMaskView; + self.chatLimitMaskView = nil; + [UIView animateWithDuration:0.15 + animations:^{ + mask.alpha = 0.0; + } + completion:^(__unused BOOL finished) { + [mask removeFromSuperview]; + }]; +} + - (void)kb_clearHostInputForText:(NSString *)text { if (text.length == 0) { return; @@ -1019,10 +1074,12 @@ static void KBSkinInstallNotificationCallback(CFNotificationCenterRef center, if (!self) return; if (!response.success) { - if (response.code == 50030) { - - return; - } + if (response.code == 50030) { + NSLog(@"[KB] ⚠️ 次数用尽: %@", response.message); + [self.chatPanelView kb_removeLoadingAssistantMessage]; + [self kb_showChatLimitPopWithMessage:response.message]; + return; + } NSLog(@"[KB] ❌ 请求失败: %@", response.message); [self.chatPanelView kb_removeLoadingAssistantMessage]; [KBHUD showInfo:response.message ?: KBLocalized(@"请求失败")]; @@ -1356,6 +1413,17 @@ static void KBSkinInstallNotificationCallback(CFNotificationCenterRef center, [self kb_openRechargeForProduct:product]; } +#pragma mark - KBChatLimitPopViewDelegate + +- (void)chatLimitPopViewDidTapCancel:(KBChatLimitPopView *)view { + [self kb_dismissChatLimitPop]; +} + +- (void)chatLimitPopViewDidTapRecharge:(KBChatLimitPopView *)view { + [self kb_dismissChatLimitPop]; + [self showSubscriptionPanel]; +} + #pragma mark - lazy - (KBKeyBoardMainView *)keyBoardMainView { if (!_keyBoardMainView) { diff --git a/keyBoard.xcodeproj/project.pbxproj b/keyBoard.xcodeproj/project.pbxproj index b06cd04..4d4ea44 100644 --- a/keyBoard.xcodeproj/project.pbxproj +++ b/keyBoard.xcodeproj/project.pbxproj @@ -140,13 +140,14 @@ 048FFD112F27432D005D62AE /* KBPersonaPageModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 048FFD0F2F27432D005D62AE /* KBPersonaPageModel.m */; }; 048FFD142F274342005D62AE /* KBPersonaChatCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 048FFD132F274342005D62AE /* KBPersonaChatCell.m */; }; 048FFD182F2763A5005D62AE /* KBVoiceInputBar.m in Sources */ = {isa = PBXBuildFile; fileRef = 048FFD172F2763A5005D62AE /* KBVoiceInputBar.m */; }; - 048FFD1D2F277486005D62AE /* KBChatHistoryPageModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 048FFD1C2F277486005D62AE /* KBChatHistoryPageModel.m */; }; - 048FFD1E2F277486005D62AE /* KBChatHistoryModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 048FFD1A2F277486005D62AE /* KBChatHistoryModel.m */; }; - 048FFD242F28A836005D62AE /* KBChatLimitPopView.m in Sources */ = {isa = PBXBuildFile; fileRef = 048FFD232F28A836005D62AE /* KBChatLimitPopView.m */; }; - 048FFD272F28C6CF005D62AE /* KBImagePositionButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 048FFD262F28C6CF005D62AE /* KBImagePositionButton.m */; }; - 048FFD2A2F28E99A005D62AE /* KBCommentModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 048FFD292F28E99A005D62AE /* KBCommentModel.m */; }; - 048FFD2D2F29F356005D62AE /* KBAIMessageVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 048FFD2C2F29F356005D62AE /* KBAIMessageVC.m */; }; - 048FFD302F29F3C3005D62AE /* KBAIMessageZanVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 048FFD2F2F29F3C3005D62AE /* KBAIMessageZanVC.m */; }; + 048FFD1D2F277486005D62AE /* KBChatHistoryPageModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 048FFD1C2F277486005D62AE /* KBChatHistoryPageModel.m */; }; + 048FFD1E2F277486005D62AE /* KBChatHistoryModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 048FFD1A2F277486005D62AE /* KBChatHistoryModel.m */; }; + 048FFD242F28A836005D62AE /* KBChatLimitPopView.m in Sources */ = {isa = PBXBuildFile; fileRef = 048FFD232F28A836005D62AE /* KBChatLimitPopView.m */; }; + A1B2C9302FCA000100000001 /* KBChatLimitPopView.m in Sources */ = {isa = PBXBuildFile; fileRef = 048FFD232F28A836005D62AE /* KBChatLimitPopView.m */; }; + 048FFD272F28C6CF005D62AE /* KBImagePositionButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 048FFD262F28C6CF005D62AE /* KBImagePositionButton.m */; }; + 048FFD2A2F28E99A005D62AE /* KBCommentModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 048FFD292F28E99A005D62AE /* KBCommentModel.m */; }; + 048FFD2D2F29F356005D62AE /* KBAIMessageVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 048FFD2C2F29F356005D62AE /* KBAIMessageVC.m */; }; + 048FFD302F29F3C3005D62AE /* KBAIMessageZanVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 048FFD2F2F29F3C3005D62AE /* KBAIMessageZanVC.m */; }; 048FFD332F29F3D2005D62AE /* KBAIMessageChatingVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 048FFD322F29F3D2005D62AE /* KBAIMessageChatingVC.m */; }; 048FFD342F29F400005D62AE /* KBAIMessageListVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 048FFD362F29F400005D62AE /* KBAIMessageListVC.m */; }; 048FFD362F29F88E005D62AE /* AIMessageVM.m in Sources */ = {isa = PBXBuildFile; fileRef = 048FFD352F29F88E005D62AE /* AIMessageVM.m */; }; @@ -2385,14 +2386,15 @@ 0498BD862EE1BEC9006CC1D5 /* KBSignUtils.m in Sources */, 04791FFC2ED71D17004E8522 /* UIColor+Extension.m in Sources */, 0450AC4A2EF2C3ED00B6AF06 /* KBKeyboardSubscriptionOptionCell.m in Sources */, - 04A9FE0F2EB481100020DB6D /* KBHUD.m in Sources */, - 048FFD562F2B9C3D005D62AE /* KBChatAssistantCell.m in Sources */, - 048FFD572F2B9C3D005D62AE /* KBChatUserCell.m in Sources */, - 04C6EADD2EAF8CEB0089C901 /* KBToolBar.m in Sources */, - A1B2C9262FC9000100000001 /* KBChatMessage.m in Sources */, - A1B2C9272FC9000100000001 /* KBChatMessageCell.m in Sources */, - A1B2C9282FC9000100000001 /* KBChatPanelView.m in Sources */, - A1B2C3EB2F20000000000001 /* KBSuggestionBarView.m in Sources */, + 04A9FE0F2EB481100020DB6D /* KBHUD.m in Sources */, + 048FFD562F2B9C3D005D62AE /* KBChatAssistantCell.m in Sources */, + 048FFD572F2B9C3D005D62AE /* KBChatUserCell.m in Sources */, + A1B2C9302FCA000100000001 /* KBChatLimitPopView.m in Sources */, + 04C6EADD2EAF8CEB0089C901 /* KBToolBar.m in Sources */, + A1B2C9262FC9000100000001 /* KBChatMessage.m in Sources */, + A1B2C9272FC9000100000001 /* KBChatMessageCell.m in Sources */, + A1B2C9282FC9000100000001 /* KBChatPanelView.m in Sources */, + A1B2C3EB2F20000000000001 /* KBSuggestionBarView.m in Sources */, 0419C9662F2C7693002E86D3 /* KBVM.m in Sources */, 048FFD512F2B68F7005D62AE /* KBPersonaModel.m in Sources */, 04FC95792EB09BC8007BD342 /* KBKeyBoardMainView.m in Sources */,