Browse Source

1.增加聊天停止按钮
2.修复聊天重新会发,导致回到底部按钮,显示不正常问题

100Years 1 month ago
parent
commit
6a137e339d

+ 22 - 0
AIEmoji/Assets.xcassets/AIChat/chat_stop.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "chat_stop@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "chat_stop@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIEmoji/Assets.xcassets/AIChat/chat_stop.imageset/chat_stop@2x.png


BIN
AIEmoji/Assets.xcassets/AIChat/chat_stop.imageset/chat_stop@3x.png


+ 29 - 8
AIEmoji/Business/AIChat/TSChatViewController/TSChatInputBarVC/TSChatInputBarVC.swift

@@ -14,7 +14,7 @@ class TSChatInputBarVC: TSBaseVC, UITextViewDelegate {
     var isAIAnswering:Bool = false{
         didSet{
             sendEnabled(enabled: !isAIAnswering)
-//            chatInputFullScreenVC?.isAIAnswering = isAIAnswering
+            setBtnHidden()
         }
     }
     
@@ -34,17 +34,22 @@ class TSChatInputBarVC: TSBaseVC, UITextViewDelegate {
         return sendBtn
     }()
     
+    lazy var stopBtn: UIButton = {
+        let stopBtn = UIButton.createButton(image: UIImage(named: "chat_stop")) { [weak self]  in
+            guard let self = self else { return }
+            NotificationCenter.default.post(name: .kAIStopRespondNotification, object: nil, userInfo: nil)
+        }
+        return stopBtn
+    }()
+    
     lazy var magnifyBtn: UIButton = {
         let magnifyBtn = UIButton.createButton(image: UIImage(named: "chat_send_magnify")) { [weak self]  in
             guard let self = self else { return }
             let vc = TSChatInputFullScreenVC()
             
-//            chatInputFullScreenVC = vc
-            
             vc.text = textView.text
             vc.sendComplete = { [weak self] date in
                 guard let self = self else { return }
-//                chatInputFullScreenVC = nil
                 if let text = date.first as? String {
                     textView.text = text
                     textView.resignFirstResponder()
@@ -56,7 +61,6 @@ class TSChatInputBarVC: TSBaseVC, UITextViewDelegate {
             
             vc.closeComplete = { [weak self] text in
                 guard let self = self else { return }
-//                chatInputFullScreenVC = nil
                 textView.text = text
                 textView.resignFirstResponder()
                 textDidChange()
@@ -70,9 +74,6 @@ class TSChatInputBarVC: TSBaseVC, UITextViewDelegate {
         return magnifyBtn
     }()
     
-    
-//    var chatInputFullScreenVC: TSChatInputFullScreenVC?
-    
     private let minHeight: CGFloat = 56//24
     private let maxHeight: CGFloat = 154
     lazy var textView: TSCustomTextView = {
@@ -101,6 +102,7 @@ class TSChatInputBarVC: TSBaseVC, UITextViewDelegate {
         contentView.addSubview(InputBarView)
         InputBarView.addSubview(textView)
         InputBarView.addSubview(magnifyBtn)
+        InputBarView.addSubview(stopBtn)
         InputBarView.addSubview(sendBtn)
         
         InputBarView.snp.makeConstraints { make in
@@ -118,6 +120,13 @@ class TSChatInputBarVC: TSBaseVC, UITextViewDelegate {
             make.height.equalTo(minHeight)
         }
         
+        stopBtn.snp.makeConstraints { make in
+            make.trailing.equalTo(-16)
+            make.bottom.equalTo(-16)
+            make.width.equalTo(24)
+            make.height.equalTo(24)
+        }
+        
         sendBtn.snp.makeConstraints { make in
             make.trailing.equalTo(-16)
             make.bottom.equalTo(-16)
@@ -181,6 +190,18 @@ class TSChatInputBarVC: TSBaseVC, UITextViewDelegate {
         }
     }
     
+    func setBtnHidden() {
+        if isAIAnswering {
+            sendBtn.isHidden = true
+            stopBtn.isHidden = false
+        }else{
+            sendBtn.isHidden = false
+            stopBtn.isHidden = true
+        }
+    }
+    
+    
+    
     
     deinit {
         // 移除通知监听

+ 1 - 1
AIEmoji/Business/AIChat/TSChatViewController/TSChatViewController/TSChatViewController+Keyboard.swift

@@ -44,7 +44,7 @@ extension TSChatViewController{
         let contentHeight = scrollView.contentSize.height
         let frameHeight = scrollView.frame.size.height
         // 判断是否需要显示滚动到底部的按钮
-        let h = contentHeight - frameHeight + inputContainerView.frame.size.height - 80//60
+        let h = contentHeight - frameHeight + inputContainerView.frame.size.height - 60
         debugPrint("scrollViewDidScroll offsetY=\(offsetY),contentHeight=\(contentHeight),frameHeight=\(frameHeight),h=\(h)")
         
         if offsetY > h {

+ 4 - 1
AIEmoji/Business/AIChat/TSChatViewController/TSChatViewController/TSChatViewController+SendMsg.swift

@@ -65,7 +65,8 @@ extension TSChatViewController {
         insertMessage(message,indexPath: indexPath)
         
         kDelayMainShort {
-            self.scrollToBottom()
+//            self.scrollToBottom()
+            self.scrollViewDidScroll(self.messagesCollectionView)
         }
         
         
@@ -203,9 +204,11 @@ extension  TSChatViewController{
 }
 
 let kIsAIAnswering = "isAIAnswering"
+let kIsStopAIRespond = "isStopAIRespond"
 public extension Notification.Name {
     //AI 回答中通知
     static let kAIAnsweringNotification = Self.init("kAIAnsweringNotification")
+    static let kAIStopRespondNotification = Self.init("kAIStopRespondNotification")
 }
 
 

+ 25 - 6
AIEmoji/Business/AIChat/TSChatViewController/ViewModel/TSAIChatVM.swift

@@ -6,7 +6,7 @@
 //
 
 
-
+import Alamofire
 let kAIErrorString = "Server is busy, please try again later".localized
 class TSAIChatVM {
 
@@ -21,7 +21,7 @@ class TSAIChatVM {
     }()
 
     var uiStyle:UIStype = UIStype.chat
-    var streamRequest:StreamPostRequest?
+    var streamRequest:DataStreamRequest?
     
     let kAIUser = TSChatUser(senderId: "000", displayName: "AI",idType: .aiRobot)
     let kUserSender = TSChatUser(senderId: "001", displayName: "001",idType: .user)
@@ -29,7 +29,22 @@ class TSAIChatVM {
     
     //ai markDown 回答的string
     var AiMDString:String = ""
-
+    
+    
+    
+    init() {
+        NotificationCenter.default.addObserver(self, selector: #selector(handleAIStopRespondNotification(_:)), name: .kAIStopRespondNotification, object: nil)
+    }
+    
+    @objc func handleAIStopRespondNotification(_ notification: Notification) {
+//        if let userInfo = notification.userInfo, let boolValue = userInfo[kIsAIAnswering] as? Bool {
+//        }
+        stopAiGenerate()
+    }
+    
+    deinit {
+        NotificationCenter.default.removeObserver(self)
+    }
 }
 
 
@@ -47,7 +62,7 @@ extension TSAIChatVM {
         ]
 
         AiMDString = ""
-        _ = TSNetworkShared.postStream(urlType: .chat,parameters: parameters) {[weak self] string in
+        streamRequest = TSNetworkShared.postStream(urlType: .chat,parameters: parameters) {[weak self] string in
             guard let self = self else { return }
             
             if AiMDString.count == 0 {
@@ -66,13 +81,17 @@ extension TSAIChatVM {
             case .success(let data):
                 completion(data,nil)
             case .failure(let error):
-                completion(nil,error)
+                if case Alamofire.AFError.explicitlyCancelled = error {//主动取消的
+                    completion("",nil)
+                } else {
+                    completion(nil,error)
+                }
             }
         }
     }
     
     func stopAiGenerate () {
-        streamRequest?.stopRequest()
+        streamRequest?.cancel()
     }
 }
 

+ 9 - 128
AIEmoji/Business/AIChat/TSChatViewController/Views/TSCellView/TSChatMsgToolView.swift

@@ -21,7 +21,7 @@ class TSChatMsgToolView: TSChatMsgBaseView {
             updateNotRefreshBtn()
         }
     }
-
+    
     lazy var copyBtn: UIButton = {
         let copyBtn = UIButton.createButton(image: UIImage(named: "aichat_copy")) { [weak self]  in
             guard let self = self else { return }
@@ -40,14 +40,14 @@ class TSChatMsgToolView: TSChatMsgBaseView {
         return refreshBtn
     }()
     
-
+    
     lazy var stackView: TSCustomStackView = {
         let stackView = TSCustomStackView(axis: .horizontal,spacing: 16)
         return stackView
     }()
-
+    
     override func creatUI() {
-
+        
         self.clipsToBounds = true
         
         contentView.addSubview(stackView)
@@ -57,13 +57,13 @@ class TSChatMsgToolView: TSChatMsgBaseView {
             make.height.equalTo(20)
         }
         
-//        stackView.addSubviewToStack(copyBtn)
-//        copyBtn.snp.makeConstraints { make in
-//            make.width.equalTo(20)
-//        }
+        //        stackView.addSubviewToStack(copyBtn)
+        //        copyBtn.snp.makeConstraints { make in
+        //            make.width.equalTo(20)
+        //        }
         
     }
-
+    
     func updateRefreshBtn() {
         if isShowRefresh {
             stackView.insertViewToStack(refreshBtn, at: 0)
@@ -88,123 +88,4 @@ class TSChatMsgToolView: TSChatMsgBaseView {
             }
         }
     }
-
-//    func setHidden(isHidden:Bool) {
-//        self.isHidden = isHidden
-//        let h = isHidden ? 0 : viewHeight
-//
-//        successView.snp.updateConstraints { make in
-//            make.height.equalTo(h)
-//        }
-//
-//        failView.snp.updateConstraints { make in
-//            make.height.equalTo(h)
-//        }
-//    }
 }
-
-
-//class TSChatMsgToolView: TSChatMsgBaseView {
-//    var viewHeight = TSLayoutSizeCalculator.cellMessageToolViewH
-//
-//    var isSuccess:Bool = true {
-//        didSet{
-//            if isSuccess {
-//                successView.isHidden = false
-//                failView.isHidden = true
-//            }else {
-//                successView.isHidden = true
-//                failView.isHidden = false
-//            }
-//        }
-//    }
-//    
-//    lazy var copyBtn: UIButton = {
-//        let copyBtn = UIButton.createButton(image: UIImage(named: "aichat_copy")) { [weak self]  in
-//            guard let self = self else { return }
-//            didTapCustomViewBlock?(.copyMsg)
-//        }
-//        return copyBtn
-//    }()
-//    lazy var successView: UIView = {
-//        let successView = UIView()
-//        
-//        let copyBtn = UIButton.createButton(image: UIImage(named: "aichat_copy")) { [weak self]  in
-//            guard let self = self else { return }
-//            didTapCustomViewBlock?(.copyMsg)
-//        }
-//    
-//        successView.addSubview(copyBtn)
-//        copyBtn.snp.makeConstraints { make in
-//            make.leading.equalTo(12)
-//            make.top.equalToSuperview()
-//            make.width.height.equalTo(20)
-//        }
-//        
-//        return successView
-//    }()
-//    
-//    lazy var failView: UIView = {
-//        let failView = UIView()
-//        
-//        let refreshBtn = UIButton.createButton(image: UIImage(named: "refresh")) { [weak self]  in
-//            guard let self = self else { return }
-//            didTapCustomViewBlock?(.refreshMsg)
-//        }
-//    
-//        failView.addSubview(refreshBtn)
-//        refreshBtn.snp.makeConstraints { make in
-//            make.leading.equalTo(12)
-//            make.top.equalToSuperview()
-//            make.width.height.equalTo(20)
-//        }
-//        
-//        return failView
-//    }()
-//    
-//    
-//    override func creatUI() {
-//        
-//        self.clipsToBounds = true
-////        contentView.backgroundColor = .green
-//        contentView.addSubview(successView)
-//        successView.snp.makeConstraints { make in
-//            make.leading.equalTo(0)
-//            make.trailing.equalTo(0)
-//            make.top.bottom.equalToSuperview()
-//            make.height.equalTo(viewHeight)
-//        }
-//        
-//        contentView.addSubview(failView)
-//        failView.snp.makeConstraints { make in
-//            make.leading.equalTo(0)
-//            make.trailing.equalTo(0)
-//            make.top.bottom.equalToSuperview()
-//            make.height.equalTo(viewHeight)
-//        }
-//        
-////        setUpSuccess()
-//    }
-//
-////    func setUpSuccess(){
-////        successView.addSubview(copyBtn)
-////        copyBtn.snp.makeConstraints { make in
-////            make.leading.equalTo(12)
-////            make.top.equalToSuperview()
-////            make.width.height.equalTo(20)
-////        }
-////    }
-//    
-//    func setHidden(isHidden:Bool) {
-//        self.isHidden = isHidden
-//        let h = isHidden ? 0 : viewHeight
-//    
-//        successView.snp.updateConstraints { make in
-//            make.height.equalTo(h)
-//        }
-//        
-//        failView.snp.updateConstraints { make in
-//            make.height.equalTo(h)
-//        }
-//    }
-//}