LNFeedCommentInputPanel.swift 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. //
  2. // LNFeedCommentInputPanel.swift
  3. // Gami
  4. //
  5. // Created by OneeChan on 2026/3/3.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. class LNFeedCommentInputPanel: LNPopupView {
  11. private let textView = LNAutoSizeTextView()
  12. private var hideSend: Constraint?
  13. private let sendView = UIView()
  14. var handler: ((String) -> Void)?
  15. override init(frame: CGRect) {
  16. super.init(frame: frame)
  17. setupViews()
  18. }
  19. override func popup(_ targetView: UIView? = nil) {
  20. super.popup(targetView)
  21. textView.becomeFirstResponder()
  22. }
  23. required init?(coder: NSCoder) {
  24. fatalError("init(coder:) has not been implemented")
  25. }
  26. }
  27. extension LNFeedCommentInputPanel {
  28. private func toSendComment() {
  29. dismiss()
  30. let cleanedText = (textView.text ?? "").replacingOccurrences(of: "\n", with: "").trimmingCharacters(in: .whitespacesAndNewlines)
  31. guard !cleanedText.isEmpty else { return }
  32. handler?(cleanedText)
  33. }
  34. }
  35. extension LNFeedCommentInputPanel: UITextViewDelegate {
  36. func textViewDidChange(_ textView: UITextView) {
  37. if textView.text.count > LNFeedManager.feedCommentMaxInput {
  38. textView.text = String(textView.text.prefix(LNFeedManager.feedCommentMaxInput))
  39. }
  40. let showSend = !textView.text.isEmpty
  41. hideSend?.update(priority: showSend ? .low : .high)
  42. UIView.animate(withDuration: 0.2) { [weak self] in
  43. guard let self else { return }
  44. layoutIfNeeded()
  45. }
  46. }
  47. func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
  48. if text == "\n" {
  49. toSendComment()
  50. return false
  51. }
  52. let currentText = textView.text ?? ""
  53. guard let swiftRange = Range(range, in: currentText) else {
  54. return true
  55. }
  56. let newText = currentText.replacingCharacters(in: swiftRange, with: text)
  57. if newText.count > LNFeedManager.feedCommentMaxInput {
  58. return false
  59. }
  60. return true
  61. }
  62. }
  63. extension LNFeedCommentInputPanel {
  64. private func setupViews() {
  65. container.layer.cornerRadius = 0
  66. ignoreKeyboardToDismiss = true
  67. let inputContainer = UIView()
  68. container.addSubview(inputContainer)
  69. inputContainer.snp.makeConstraints { make in
  70. make.horizontalEdges.equalToSuperview()
  71. make.top.equalToSuperview().offset(10)
  72. make.bottom.equalToSuperview().offset(-5 + commonBottomInset)
  73. }
  74. let holder = UIView()
  75. holder.backgroundColor = .fill_2
  76. holder.layer.cornerRadius = 19
  77. holder.snp.makeConstraints { make in
  78. make.height.greaterThanOrEqualTo(38)
  79. }
  80. inputContainer.addSubview(holder)
  81. holder.snp.makeConstraints { make in
  82. make.verticalEdges.equalToSuperview()
  83. make.leading.equalToSuperview().offset(12)
  84. hideSend = make.trailing.equalToSuperview().offset(-12).priority(.high).constraint
  85. }
  86. textView.backgroundColor = .clear
  87. textView.delegate = self
  88. textView.font = .body_m
  89. textView.textColor = .text_5
  90. textView.returnKeyType = .send
  91. holder.addSubview(textView)
  92. textView.snp.makeConstraints { make in
  93. make.horizontalEdges.equalToSuperview().inset(10)
  94. make.centerY.equalToSuperview()
  95. make.top.greaterThanOrEqualToSuperview()
  96. }
  97. inputContainer.addSubview(sendView)
  98. sendView.snp.makeConstraints { make in
  99. make.leading.equalTo(holder.snp.trailing).offset(12)
  100. make.trailing.equalToSuperview().offset(-12).priority(.medium)
  101. make.bottom.equalToSuperview()
  102. }
  103. let sendButton = UIButton()
  104. sendButton.layer.cornerRadius = 16
  105. sendButton.clipsToBounds = true
  106. sendButton.setTitle(.init(key: "A00305"), for: .normal)
  107. sendButton.setTitleColor(.text_1, for: .normal)
  108. sendButton.titleLabel?.font = .heading_h4
  109. sendButton.setBackgroundImage(.primary_8, for: .normal)
  110. sendButton.contentEdgeInsets = .init(top: 0, left: 16, bottom: 0, right: 16)
  111. sendButton.addAction(UIAction(handler: { [weak self] _ in
  112. guard let self else { return }
  113. toSendComment()
  114. }), for: .touchUpInside)
  115. sendView.addSubview(sendButton)
  116. sendButton.snp.makeConstraints { make in
  117. make.height.equalTo(32)
  118. make.horizontalEdges.equalToSuperview()
  119. make.bottom.equalToSuperview().offset(-2)
  120. make.top.equalToSuperview()
  121. }
  122. }
  123. }