LNHelpCenterViewController.swift 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. //
  2. // LNHelpCenterViewController.swift
  3. // Lanu
  4. //
  5. // Created by OneeChan on 2025/12/22.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. extension UIView {
  11. func pushToHelpCenter() {
  12. let vc = LNHelpCenterViewController()
  13. navigationController?.pushViewController(vc, animated: true)
  14. }
  15. }
  16. class LNHelpCenterViewController: LNViewController {
  17. private let maxUpload = 6
  18. private let messageInputView = LNCommonTextView()
  19. private let imageUploadView = LNMultiImagesUploadView()
  20. private let submitButton = UIButton()
  21. override func viewDidLoad() {
  22. super.viewDidLoad()
  23. setupViews()
  24. }
  25. }
  26. extension LNHelpCenterViewController: UITextViewDelegate {
  27. func textViewDidChange(_ textView: UITextView) {
  28. updateSubmitButton()
  29. }
  30. }
  31. extension LNHelpCenterViewController {
  32. private func updateSubmitButton() {
  33. if !messageInputView.text.isEmpty {
  34. submitButton.setBackgroundImage(.primary_8, for: .normal)
  35. submitButton.isEnabled = true
  36. } else {
  37. submitButton.setBackgroundImage(nil, for: .normal)
  38. submitButton.isEnabled = false
  39. }
  40. }
  41. private func setupViews() {
  42. title = .init(key: "A00210")
  43. view.backgroundColor = .primary_1
  44. let scrollView = UIScrollView()
  45. view.addSubview(scrollView)
  46. scrollView.snp.makeConstraints { make in
  47. make.edges.equalToSuperview()
  48. }
  49. let fakeView = UIView()
  50. scrollView.addSubview(fakeView)
  51. fakeView.snp.makeConstraints { make in
  52. make.horizontalEdges.equalToSuperview()
  53. make.top.equalToSuperview()
  54. make.width.equalToSuperview()
  55. make.height.equalTo(0)
  56. }
  57. let container = UIView()
  58. container.backgroundColor = .fill
  59. container.layer.cornerRadius = 12
  60. scrollView.addSubview(container)
  61. container.snp.makeConstraints { make in
  62. make.horizontalEdges.equalToSuperview().inset(16)
  63. make.top.equalToSuperview().offset(16)
  64. make.bottom.equalToSuperview().offset(-16)
  65. }
  66. let textView = buildTextView()
  67. container.addSubview(textView)
  68. textView.snp.makeConstraints { make in
  69. make.horizontalEdges.equalToSuperview()
  70. make.top.equalToSuperview().offset(16)
  71. }
  72. let photoView = buildPhotoView()
  73. container.addSubview(photoView)
  74. photoView.snp.makeConstraints { make in
  75. make.horizontalEdges.equalToSuperview()
  76. make.top.equalTo(textView.snp.bottom).offset(16)
  77. make.bottom.equalToSuperview().offset(-16)
  78. }
  79. let submit = buildSubmit()
  80. view.addSubview(submit)
  81. submit.snp.makeConstraints { make in
  82. make.horizontalEdges.equalToSuperview().inset(16)
  83. make.bottom.equalToSuperview().offset(-view.safeBottomInset - 10)
  84. }
  85. view.onTap { [weak self] in
  86. guard let self else { return }
  87. view.endEditing(true)
  88. }
  89. }
  90. private func buildTextView() -> UIView {
  91. let container = UIView()
  92. let titleLabel = UILabel()
  93. titleLabel.text = .init(key: "A00254")
  94. titleLabel.font = .heading_h4
  95. titleLabel.textColor = .text_5
  96. titleLabel.numberOfLines = 0
  97. container.addSubview(titleLabel)
  98. titleLabel.snp.makeConstraints { make in
  99. make.top.equalToSuperview()
  100. make.horizontalEdges.equalToSuperview().inset(16)
  101. }
  102. messageInputView.delegate = self
  103. messageInputView.maxInput = LNReportManager.helpCenterMaxInput
  104. container.addSubview(messageInputView)
  105. messageInputView.snp.makeConstraints { make in
  106. make.horizontalEdges.equalToSuperview().inset(16)
  107. make.top.equalTo(titleLabel.snp.bottom).offset(8)
  108. make.bottom.equalToSuperview()
  109. make.height.equalTo(150)
  110. }
  111. return container
  112. }
  113. private func buildPhotoView() -> UIView {
  114. let container = UIView()
  115. let titleLabel = UILabel()
  116. titleLabel.text = .init(key: "A00177", maxUpload)
  117. titleLabel.font = .heading_h4
  118. titleLabel.textColor = .text_5
  119. container.addSubview(titleLabel)
  120. titleLabel.snp.makeConstraints { make in
  121. make.top.equalToSuperview().offset(16)
  122. make.horizontalEdges.equalToSuperview().inset(16)
  123. }
  124. let descLabel = UILabel()
  125. descLabel.text = .init(key: "A00178")
  126. descLabel.font = .body_s
  127. descLabel.textColor = .text_4
  128. container.addSubview(descLabel)
  129. descLabel.snp.makeConstraints { make in
  130. make.horizontalEdges.equalToSuperview().inset(16)
  131. make.top.equalTo(titleLabel.snp.bottom).offset(2)
  132. }
  133. imageUploadView.maxPhoto = maxUpload
  134. container.addSubview(imageUploadView)
  135. imageUploadView.snp.makeConstraints { make in
  136. make.horizontalEdges.equalToSuperview().inset(16)
  137. make.top.equalTo(descLabel.snp.bottom).offset(16)
  138. make.bottom.equalToSuperview()
  139. make.height.equalTo(0).priority(.low)
  140. }
  141. return container
  142. }
  143. private func buildSubmit() -> UIView {
  144. submitButton.clipsToBounds = true
  145. submitButton.backgroundColor = .fill_4
  146. submitButton.layer.cornerRadius = 23.5
  147. submitButton.setTitle(.init(key: "A00240"), for: .normal)
  148. submitButton.titleLabel?.font = .heading_h3
  149. submitButton.addAction(UIAction(handler: { [weak self] _ in
  150. guard let self else { return }
  151. LNReportManager.shared.feedback(
  152. content: messageInputView.text,
  153. photos: imageUploadView.curFileUrls)
  154. { [weak self] success in
  155. guard let self else { return }
  156. guard success else { return }
  157. showToast(.init(key: "A00255"))
  158. navigationController?.popViewController(animated: true)
  159. }
  160. }), for: .touchUpInside)
  161. submitButton.snp.makeConstraints { make in
  162. make.height.equalTo(47)
  163. }
  164. return submitButton
  165. }
  166. }
  167. #if DEBUG
  168. import SwiftUI
  169. struct LNHelpCenterViewControllerPreview: UIViewControllerRepresentable {
  170. func makeUIViewController(context: Context) -> some UIViewController {
  171. LNHelpCenterViewController()
  172. }
  173. func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {
  174. }
  175. }
  176. #Preview(body: {
  177. LNHelpCenterViewControllerPreview()
  178. })
  179. #endif