TSPromptTextView.swift 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. //
  2. // TSPromptTextView.swift
  3. // AIEmoji
  4. //
  5. // Created by 100Years on 2025/3/11.
  6. //
  7. class TSPromptTextView: TSBaseView {
  8. var randomTextArray: [String]
  9. var textChangedBlock: (String) -> Void
  10. var sendBolck: ((String) -> Void)?
  11. var AIBolck: (() -> Void)?
  12. init(randomTextArray: [String], textChangedBlock: @escaping (String) -> Void) {
  13. self.randomTextArray = randomTextArray
  14. self.textChangedBlock = textChangedBlock
  15. super.init(frame: .zero)
  16. }
  17. @MainActor required init?(coder: NSCoder) {
  18. fatalError("init(coder:) has not been implemented")
  19. }
  20. lazy var robotImageView: UIImageView = {
  21. let robotImageView = UIImageView.createImageView(imageName: "aichat_avatar")
  22. return robotImageView
  23. }()
  24. lazy var randomTextPicker: TSRandomTextPicker = {
  25. let textPicker = TSRandomTextPicker(texts: randomTextArray)
  26. return textPicker
  27. }()
  28. lazy var textBgView: UIView = {
  29. let textBgView = UIView()
  30. textBgView.backgroundColor = "#292929".uiColor
  31. textBgView.cornerRadius = 12
  32. return textBgView
  33. }()
  34. lazy var customTextView: TSPlaceholderTextView = {
  35. let customTextView = TSPlaceholderTextView(
  36. placeholder: "Type your idea here.".localized,
  37. text: "",
  38. font: .font(size: 14),
  39. textColor: .white,
  40. backgroundColor: .clear
  41. )
  42. customTextView.delegate = self
  43. customTextView.returnKeyType = .done
  44. return customTextView
  45. }()
  46. lazy var inspirationBtn: UIButton = {
  47. let inspirationBtn = UIButton.createButton(
  48. // title: "Hint Inspiration".localized,
  49. image: UIImage(named: "inspiration_yellow"),
  50. backgroundColor: "#FECB34".uiColor.withAlphaComponent(0.1),
  51. font: .font(size: 12),
  52. titleColor: .themeColor,
  53. corner: 8.0) { [weak self] in
  54. guard let self = self else { return }
  55. customTextView.text = randomTextPicker.getRandomText()
  56. textViewDidChange(customTextView)
  57. }
  58. inspirationBtn.contentEdgeInsets = UIEdgeInsets(top: 4, left: 7, bottom: 4, right: 7)
  59. // inspirationBtn.imageEdgeInsets = UIEdgeInsets(top: 0, left: -4, bottom: 0, right: 0)
  60. inspirationBtn.isHidden = false
  61. return inspirationBtn
  62. }()
  63. lazy var AIView: UIView = {
  64. let AIView = UIView()
  65. AIView.backgroundColor = "#4D6BFE".uiColor.withAlphaComponent(0.1)
  66. AIView.cornerRadius = 8
  67. AIView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(clickAIView)))
  68. let iconImageView = UIImageView.createImageView(imageName: "deepseek_icon")
  69. let aiInfoLabel = UILabel.createLabel(text: "Prompt Optimization".localized, font: .font(size: 14), textColor: "#4D6BFE".uiColor, textAlignment: .left, numberOfLines: 1)
  70. let arrowImageView = UIImageView.createImageView(imageName: "blue_down_arrow")
  71. AIView.addSubview(iconImageView)
  72. iconImageView.snp.makeConstraints { make in
  73. make.leading.equalTo(8)
  74. make.centerY.equalToSuperview()
  75. make.width.height.equalTo(20)
  76. }
  77. AIView.addSubview(aiInfoLabel)
  78. aiInfoLabel.snp.makeConstraints { make in
  79. make.leading.equalTo(iconImageView.snp.trailing).offset(4)
  80. make.centerY.equalToSuperview()
  81. }
  82. AIView.addSubview(arrowImageView)
  83. arrowImageView.snp.makeConstraints { make in
  84. make.leading.equalTo(aiInfoLabel.snp.trailing).offset(4)
  85. make.trailing.equalTo(-8)
  86. make.centerY.equalToSuperview()
  87. make.width.height.equalTo(16)
  88. }
  89. return AIView
  90. }()
  91. lazy var clearBtn: UIButton = {
  92. let clearBtn = UIButton.createButton(
  93. image: UIImage(named: "clear_text")
  94. ) { [weak self] in
  95. guard let self = self else { return }
  96. customTextView.text = ""
  97. textViewDidChange(customTextView)
  98. }
  99. clearBtn.isHidden = true
  100. return clearBtn
  101. }()
  102. override func creatUI() {
  103. contentView.addSubview(textBgView)
  104. textBgView.addSubview(customTextView)
  105. textBgView.addSubview(inspirationBtn)
  106. textBgView.addSubview(AIView)
  107. textBgView.addSubview(clearBtn)
  108. makeConstraints()
  109. }
  110. func makeConstraints() {
  111. textBgView.snp.makeConstraints { make in
  112. make.top.equalTo(16)
  113. make.leading.equalTo(16)
  114. make.trailing.equalTo(-16)
  115. make.height.equalTo(182.0)
  116. make.bottom.equalTo(0)
  117. }
  118. customTextView.snp.makeConstraints { make in
  119. make.top.equalTo(21)
  120. make.leading.equalTo(16)
  121. make.trailing.equalTo(-16)
  122. make.bottom.equalTo(-52)
  123. }
  124. inspirationBtn.snp.makeConstraints { make in
  125. make.height.equalTo(28)
  126. make.bottom.equalTo(-16)
  127. make.leading.equalTo(16)
  128. }
  129. AIView.snp.makeConstraints { make in
  130. make.height.equalTo(28)
  131. make.bottom.equalTo(-16)
  132. make.leading.equalTo(inspirationBtn.snp.trailing).offset(8)
  133. }
  134. clearBtn.snp.makeConstraints { make in
  135. make.width.height.equalTo(16)
  136. make.bottom.equalTo(-16)
  137. make.trailing.equalTo(-16)
  138. }
  139. }
  140. func getVipText() -> String {
  141. return "Generate".localized
  142. }
  143. }
  144. extension TSPromptTextView: UITextViewDelegate {
  145. func textViewDidChange(_ textView: UITextView) {
  146. let text = textView.text.replacingOccurrences(of: " ", with: "")
  147. clearBtn.isHidden = text.count > 0 ? false : true
  148. textChangedBlock(textView.text)
  149. }
  150. func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
  151. if text == "\n" {
  152. sendBolck?(textView.text)
  153. return false
  154. }
  155. return true
  156. }
  157. }
  158. extension TSPromptTextView {
  159. func setText(text: String) {
  160. customTextView.text = text
  161. textViewDidChange(customTextView)
  162. }
  163. var text: String {
  164. return customTextView.text
  165. }
  166. @objc func clickAIView() {
  167. AIBolck?()
  168. }
  169. }