Browse Source

文生图 AI 提示词开发完毕

100Years 3 weeks ago
parent
commit
da61f07574

+ 1 - 1
AIEmoji/Business/AIChat/TSChatViewController/Models/TSLayoutSizeCalculator.swift

@@ -60,7 +60,7 @@ class TSLayoutSizeCalculator: MessageSizeCalculator {//CellSizeCalculator {
 
     
     //消息下面的工具栏高度 30.0
-    static var cellMessageToolViewH:CGFloat = 30.0
+    static var cellMessageToolViewH:CGFloat = 40.0
     
     
     

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

@@ -184,6 +184,14 @@ class TSChatInputBarVC: TSBaseVC, UITextViewDelegate {
         magnifyBtn.isHidden = true
     }
     
+    func setText(text:String){
+        textView.text = text
+        textDidChange()
+    }
+    
+    var text:String{
+        return textView.text
+    }
     
     @objc func handleAIAnsweringNotification(_ notification: Notification) {
         if let userInfo = notification.userInfo, let boolValue = userInfo[kIsAIAnswering] as? Bool {

+ 7 - 1
AIEmoji/Business/AIChat/TSChatViewController/TSChatViewController/TSChatViewController+ChatDelegate.swift

@@ -224,7 +224,13 @@ extension TSChatViewController: MessageCellDelegate {
                 UIPasteboard.general.string = text.string
                 kSaveSuccesswShared.show(atView: self.view,text: "Copyed Successfully".localized,showViewBtn:false)
             }
-            
+        case .copyHint:
+            if case let .attributedText(text) = model.kind{
+                //拷贝文字到截切板
+                UIPasteboard.general.string = text.string
+                viewModel.copyHint = text.string
+                pop()
+            }
         case .refreshMsg:
             if case let .attributedText(text) = model.kind{
             

+ 8 - 3
AIEmoji/Business/AIChat/TSChatViewController/TSChatViewController/TSChatViewController+Keyboard.swift

@@ -71,16 +71,21 @@ extension TSChatViewController{
             make.top.equalTo(0)
         }
         
-        if viewModel.uiStyle == .chat {
+        if viewModel.uiStyle == .chat || viewModel.uiStyle == .perfectHint {
             inputBarBgView.addSubview(inputBarVC.view)
             inputBarVC.view.snp.makeConstraints { make in
                 make.leading.equalTo(0)
                 make.trailing.equalTo(0)
                 make.top.equalTo(inputBarTopView.snp.bottom)
-                make.bottom.equalTo(0)
+                make.bottom.equalTo(-k_Height_safeAreaInsetsBottom())
             }
         }
         inputBarType = .custom(inputBarBgView)
+        
+        kDelayMainShort {
+            self.inputBarVC.setText(text: self.inputText)
+        }
+        
     }
     
     func configureMessageInputBar() {
@@ -90,7 +95,7 @@ extension TSChatViewController{
     
     
     func handleKeyBoard(){
-        if viewModel.uiStyle == .chat {
+        if viewModel.uiStyle == .chat || viewModel.uiStyle == .perfectHint {
             let tapGesture = UITapGestureRecognizer(target: self, action: #selector(clickView))
             tapGesture.cancelsTouchesInView = false
             messagesCollectionView.addGestureRecognizer(tapGesture)

+ 14 - 6
AIEmoji/Business/AIChat/TSChatViewController/TSChatViewController/TSChatViewController+NaviBar.swift

@@ -96,6 +96,13 @@ extension TSChatViewController {
     }
     
     public func pop() {
+        
+        if viewModel.copyHint.isEmpty {
+            textBlock?(inputBarVC.text)
+        }else{
+            textBlock?(viewModel.copyHint)
+        }
+
         if navigationController == nil {
             dismiss(animated: true, completion: nil)
         } else if navigationController?.presentingViewController != nil, navigationController?.viewControllers.count == 1 {
@@ -132,10 +139,13 @@ extension TSChatViewController {
         
         switch viewModel.uiStyle {
         case .chat:
-            navBarContentView.addSubview(navBarView)
-            navBarView.snp.makeConstraints { make in
-                make.edges.equalToSuperview()
-            }
+//            navBarContentView.addSubview(navBarView)
+//            navBarView.snp.makeConstraints { make in
+//                make.edges.equalToSuperview()
+//            }
+            addNormalNavBarView()
+            setPageTitle("DeepSeek-R1".localized)
+            _ = setNavigationItem("", imageName: "aichat_history", direction: .right, action: #selector(clickHistory))
         case .history:
             addNormalNavBarView()
             setPageTitle("History".localized)
@@ -143,8 +153,6 @@ extension TSChatViewController {
         case .perfectHint:
             addNormalNavBarView()
             setPageTitle("DeepSeek-R1".localized)
-            _ = setNavigationItem("", imageName: "aichat_history", direction: .right, action: #selector(clickHistory))
-            
         }
 
     }

+ 3 - 3
AIEmoji/Business/AIChat/TSChatViewController/TSChatViewController/TSChatViewController+SendMsg.swift

@@ -194,15 +194,13 @@ extension TSChatViewController{
             guard let self = self else { return }
             message.kind = .attributedText(kMDAttributedString(text: viewModel.AiMDString))
             message.markDownText = viewModel.AiMDString
-            
-            
+//            message.sendState = .none //一但又消息,就结束转圈加载
             thinkingModel.thinkingString = viewModel.AiThinkingString
             if viewModel.AiMDString.count > 0{
                 message.sendState = .progress(0.5)
                 if  thinkingModel.endStamp == 0{
                     thinkingModel.endStamp = Int.timestampInt()
                     let time = thinkingModel.endStamp - thinkingModel.startStamp
-//                    thinkingModel.thinkingState = "Thought for \(time)s"
                     thinkingModel.thinkingState = String(format:"Thought for %ds".localized,time)
                 }
             }
@@ -223,6 +221,8 @@ extension TSChatViewController{
                 }
             }
             message.markDownText = viewModel.AiMDString
+            
+            dePrint("markDownText=\(viewModel.AiMDString)")
             updataAIChatCellUI()
             
             kExecuteOnMainThread {

+ 3 - 0
AIEmoji/Business/AIChat/TSChatViewController/TSChatViewController/TSChatViewController.swift

@@ -26,6 +26,9 @@ import UIKit
 
 class TSChatViewController: MessagesViewController, MessagesDataSource {
 
+    //传参数
+    var inputText:String = "" //输入框里面的词
+    var textBlock:((String)->Void)? //回调
     var deleteBlock:(()->Void)?
     //数据
     var viewModel:TSAIChatVM = TSAIChatVM()

+ 21 - 4
AIEmoji/Business/AIChat/TSChatViewController/ViewModel/TSAIChatVM.swift

@@ -32,7 +32,8 @@ class TSAIChatVM {
     var AiMDString:String = ""
     // ai 思考的内容
     var AiThinkingString:String = ""
-    
+    // 复制的提示词
+    var copyHint:String = ""
     
     init() {
         NotificationCenter.default.addObserver(self, selector: #selector(handleAIStopRespondNotification(_:)), name: .kAIStopRespondNotification, object: nil)
@@ -103,9 +104,17 @@ extension TSAIChatVM {
         streamHandler:@escaping (String,String) -> Void,
         completion: @escaping (Any?, Error?) -> Void
     ) {
+        
+        
+        
+        var sendMsg = message
+        
+        if uiStyle == .perfectHint {
+            sendMsg = "帮我丰富这个词让我能生成好看的壁纸,要包含主体、细节、情绪、场景,返回结果跟我输入的词的语言保持一致,如我给的英文结果就要英文,给的中文就要中文,给的其他语言就返回其他语言,给一个字数精简的最佳结果就行,我的词是:" + sendMsg
+        }
         let parameters: [String: String] = [
             "sessionId": dbAIChatList.sessionId,
-            "message": message
+            "message": sendMsg
         ]
 
         AiMDString = ""
@@ -171,13 +180,21 @@ extension TSAIChatVM {
 extension TSAIChatVM {
     
     func getHistoryChatMessage() -> [TSChatMessage] {
-        if uiStyle == .history {
+        
+        switch uiStyle {
+        case .history :
             return self.dbAIChatList.getMessageList()
-        }else {
+        case .chat :
             let aiString = "I can tackle your questions, my skillset includes, but is not limited to:\n`📧 Composing high-quality emails`\n`🇺🇸 Facilitating language learning`\n`📑 Assisting in your studies`\n`💡Brainstorming ideas`\n`and much more!`".localized
             let msg = TSChatMessage(kind: .attributedText(kMDAttributedString(text: aiString)), user: kAIUser, messageId: "", date: Date())
             msg.messageType = .aiRobotWelcome
             msg.appendUIDict = [.topView:TSChatMessageUIBaseModel.creat(viewClass: "TSMSGAIDefaultHeaderView", msgModel: msg)]
+            return [msg]
+        case .perfectHint :
+            let aiString = "Hi! Im DeepSeek一ready to take your image creativity to the next level!".localized
+            let msg = TSChatMessage(kind: .attributedText(kMDAttributedString(text: aiString)), user: kAIUser, messageId: "", date: Date())
+            msg.messageType = .aiRobotWelcome
+     
             return [msg]
         }
     }

+ 1 - 0
AIEmoji/Business/AIChat/TSChatViewController/Views/TSChatMsgBaseView/TSChatMsgBaseView.swift

@@ -47,6 +47,7 @@ public enum TSChatMsgViewTapType {
     case refreshMsg //让ai重新回答
     case refreshCell //刷新 cell
     case refreshColView //刷新 collectview
+    case copyHint    //复制ai Hint,并关闭页面
 }
 public extension MessageCellDelegate {
 

+ 57 - 23
AIEmoji/Business/AIChat/TSChatViewController/Views/TSChatMsgBaseView/TSChatMsgToolView.swift

@@ -22,6 +22,13 @@ class TSChatMsgToolView: TSChatMsgBaseView {
         }
     }
     
+    //是否显示复制用户文生图提示词
+    var isShowUsePrompts:Bool = false {
+        didSet{
+            usePromptsBtn.isHidden = !isShowUsePrompts
+        }
+    }
+    
     lazy var copyBtn: UIButton = {
         let copyBtn = UIButton.createButton(image: UIImage(named: "aichat_copy")) { [weak self]  in
             guard let self = self else { return }
@@ -41,6 +48,17 @@ class TSChatMsgToolView: TSChatMsgBaseView {
     }()
     
     
+    lazy var usePromptsBtn: UIButton = {
+        let usePromptsBtn = UIButton.createButton(title: "Use prompts".localized, backgroundColor: .white.withAlphaComponent(0.05), font: .font(size: 14), titleColor: .white, corner: 8) { [weak self]  in
+            guard let self = self else { return }
+            didTapCustomViewBlock?(.copyHint)
+        }
+        usePromptsBtn.layer.borderWidth = 1
+        usePromptsBtn.layer.borderColor = UIColor.white.withAlphaComponent(0.1).cgColor
+        usePromptsBtn.contentEdgeInsets = UIEdgeInsets(top: 0, left: 8, bottom: 0, right: 8)
+        return usePromptsBtn
+    }()
+    
     lazy var stackView: TSCustomStackView = {
         let stackView = TSCustomStackView(axis: .horizontal,spacing: 16)
         return stackView
@@ -55,38 +73,54 @@ class TSChatMsgToolView: TSChatMsgBaseView {
             make.leading.equalTo(12)
             make.trailing.equalTo(-12)
             make.top.equalTo(0)
-            make.height.equalTo(20)
+//            make.height.equalTo(20)
         }
         
-        //        stackView.addSubviewToStack(copyBtn)
-        //        copyBtn.snp.makeConstraints { make in
-        //            make.width.equalTo(20)
-        //        }
+        stackView.addSubviewToStack(refreshBtn, length: 20)
+        stackView.addSubviewToStack(copyBtn, length: 20)
+        stackView.addSubviewToStack(usePromptsBtn)
         
+        stackView.stackView.addArrangedSubview(usePromptsBtn)
+        usePromptsBtn.snp.makeConstraints { make in
+            make.height.equalTo(28)
+        }
+        refreshBtn.isHidden = true
+        copyBtn.isHidden = true
+        usePromptsBtn.isHidden = true
     }
     
     func updateRefreshBtn() {
-        if isShowRefresh {
-            stackView.insertViewToStack(refreshBtn, at: 0)
-            refreshBtn.snp.makeConstraints { make in
-                make.width.equalTo(20)
-            }
-        }else{
-            stackView.removeViewToStack(refreshBtn)
-        }
+        refreshBtn.isHidden = !isShowRefresh
     }
     
     
     func updateNotRefreshBtn(){
-        if isOnlyShowRefresh {
-            stackView.removeViewToStack(copyBtn)
-        }else{
-            if copyBtn.superview == nil {
-                stackView.addSubviewToStack(copyBtn)
-                copyBtn.snp.makeConstraints { make in
-                    make.width.equalTo(20)
-                }
-            }
-        }
+        copyBtn.isHidden = isOnlyShowRefresh
+        usePromptsBtn.isHidden = isShowUsePrompts ? isOnlyShowRefresh : true
     }
+    
+//    func updateRefreshBtn() {
+//        if isShowRefresh {
+//            stackView.insertViewToStack(refreshBtn, at: 0)
+//            refreshBtn.snp.makeConstraints { make in
+//                make.width.equalTo(20)
+//            }
+//        }else{
+//            stackView.removeViewToStack(refreshBtn)
+//        }
+//    }
+//    
+//    
+//    func updateNotRefreshBtn(){
+//        if isOnlyShowRefresh {
+//            stackView.removeViewToStack(copyBtn)
+//        }else{
+//            if copyBtn.superview == nil {
+//                stackView.addSubviewToStack(copyBtn)
+//                copyBtn.snp.makeConstraints { make in
+//                    make.width.equalTo(20)
+//                }
+//            }
+//        }
+//    }
 }

+ 3 - 0
AIEmoji/Business/AIChat/TSChatViewController/Views/TSMessageContentCell.swift

@@ -295,6 +295,9 @@ class TSMessageContentCell: MessageCollectionViewCell {
         if let msgModel = message as? TSChatMessage,let chatVC = dataSource as? TSChatViewController{
     
             if msgModel.sendState.isResult {
+                //只有文生图,才显示复制提示词按钮
+                msgToolView.isShowUsePrompts = chatVC.viewModel.uiStyle == .perfectHint
+                
                 var isHiddenReload = true
 
                 let isLast = Self.kIsChatLast(message: message, dataSource: dataSource)

+ 13 - 0
AIEmoji/Business/TSTextGeneralPictureVC/TSTTPInputVC/TSTTPInputVC.swift

@@ -74,6 +74,19 @@ class TSTTPInputVC: TSBaseVC {
                 generateImage()
             }
         }
+        promptTextView.AIBolck = { [weak self]  in
+            guard let self = self else { return }
+            let vc = TSChatViewController()
+            vc.viewModel.uiStyle = .perfectHint
+            vc.inputText = promptTextView.text
+            
+            vc.textBlock = { [weak self] text in
+                guard let self = self else { return }
+                promptTextView.setText(text: text)
+                viewModel.promptText = text
+            }
+            kPushVC(target: self, modelVC: vc)
+        }
         return promptTextView
     }()
     

+ 2 - 1
AIEmoji/Business/TSTextGeneralPictureVC/TSTTPInputVC/VM/TSTTPInputVM.swift

@@ -101,7 +101,8 @@ extension TSTTPInputVM {
         var prompt = promptText
 
         if selectPromptModel.prompt.count > 0 {
-            prompt = "\(selectPromptModel.prompt)," + prompt
+//            prompt = "\(selectPromptModel.prompt)," + prompt
+            prompt = selectPromptModel.prompt + prompt
         }
         return prompt
     }

+ 11 - 1
AIEmoji/Business/TSTextGeneralPictureVC/TSTTPInputVC/View/TSPromptTextView.swift

@@ -10,6 +10,7 @@ class TSPromptTextView : TSBaseView{
     var randomTextArray:[String]
     var textChangedBlock:((String)->Void)
     var sendBolck:((String)->Void)?
+    var AIBolck:(()->Void)?
     init(randomTextArray: [String], textChangedBlock: @escaping (String) -> Void) {
         self.randomTextArray = randomTextArray
         self.textChangedBlock = textChangedBlock
@@ -195,7 +196,16 @@ extension TSPromptTextView: UITextViewDelegate{
 
 extension TSPromptTextView {
     
+    func setText(text:String) {
+        customTextView.text = text
+        textViewDidChange(customTextView)
+    }
+    
+    var text:String{
+        return customTextView.text
+    }
+    
     @objc func clickAIView(){
-
+        AIBolck?()
     }
 }