LNOrderCommentPanel.swift 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. //
  2. // LNOrderCommentPanel.swift
  3. // Lanu
  4. //
  5. // Created by OneeChan on 2025/11/19.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. class LNOrderCommentPanel: LNPopupView {
  11. var handler: ((Double, String) -> Void)? = nil
  12. private let avatar = UIImageView()
  13. private let titleLabel = UILabel()
  14. private let descLabel = UILabel()
  15. private let starLabel = UILabel()
  16. private let scoreView = LNFiveStarScoreView()
  17. private let commentView = LNCommonTextView()
  18. private let confirmButton = UIButton()
  19. private var curOrderId: String?
  20. override init(frame: CGRect) {
  21. super.init(frame: frame)
  22. setupViews()
  23. }
  24. func update(_ url: String, orderId: String) {
  25. avatar.sd_setImage(with: URL(string: url))
  26. curOrderId = orderId
  27. }
  28. required init?(coder: NSCoder) {
  29. fatalError("init(coder:) has not been implemented")
  30. }
  31. }
  32. extension LNOrderCommentPanel: LNFiveStarScoreViewDelegate {
  33. func onFiveStarScoreView(view: LNFiveStarScoreView, scoreChanged newScore: Double) {
  34. let bg = newScore == 0 ? nil : UIImage.primary_8
  35. starLabel.text = "\(newScore)"
  36. confirmButton.setBackgroundImage(bg, for: .normal)
  37. starLabel.textColor = .text_5
  38. descLabel.textColor = .text_5
  39. starLabel.font = .heading_h3
  40. }
  41. }
  42. extension LNOrderCommentPanel {
  43. private func setupViews() {
  44. avatar.layer.cornerRadius = 30
  45. avatar.layer.borderColor = UIColor.fill.cgColor
  46. avatar.layer.borderWidth = 2
  47. avatar.backgroundColor = .fill
  48. avatar.clipsToBounds = true
  49. container.addSubview(avatar)
  50. avatar.snp.makeConstraints { make in
  51. make.centerX.equalToSuperview()
  52. make.top.equalToSuperview().offset(-16)
  53. make.width.height.equalTo(60)
  54. }
  55. titleLabel.font = .heading_h3
  56. titleLabel.textColor = .text_5
  57. titleLabel.text = .init(key: "A00166")
  58. titleLabel.textAlignment = .center
  59. container.addSubview(titleLabel)
  60. titleLabel.snp.makeConstraints { make in
  61. make.horizontalEdges.equalToSuperview().inset(16)
  62. make.top.equalTo(avatar.snp.bottom).offset(11)
  63. }
  64. scoreView.startType = .whiteBorder
  65. scoreView.icSize = 30
  66. scoreView.editable = true
  67. scoreView.unit = 0.5
  68. scoreView.spacing = 12
  69. scoreView.delegate = self
  70. container.addSubview(scoreView)
  71. scoreView.snp.makeConstraints { make in
  72. make.centerX.equalToSuperview()
  73. make.top.equalTo(titleLabel.snp.bottom).offset(17)
  74. }
  75. descLabel.font = .heading_h5
  76. descLabel.textColor = .text_2
  77. descLabel.text = .init(key: "A00192")
  78. container.addSubview(descLabel)
  79. descLabel.snp.makeConstraints { make in
  80. make.centerY.equalTo(scoreView)
  81. make.leading.equalToSuperview().offset(20)
  82. make.trailing.lessThanOrEqualTo(scoreView.snp.leading).offset(-12)
  83. }
  84. starLabel.font = .heading_h5
  85. starLabel.textColor = .text_2
  86. starLabel.text = .init(key: "A00193")
  87. container.addSubview(starLabel)
  88. starLabel.snp.makeConstraints { make in
  89. make.centerY.equalTo(scoreView)
  90. make.trailing.equalToSuperview().offset(-20)
  91. make.leading.greaterThanOrEqualTo(scoreView.snp.leading).offset(12)
  92. }
  93. commentView.maxInput = LNOrderManager.orderCommentMaxLength
  94. commentView.placeholderLabel.text = .init(key: "A00182")
  95. container.addSubview(commentView)
  96. commentView.snp.makeConstraints { make in
  97. make.horizontalEdges.equalToSuperview().inset(16)
  98. make.top.equalTo(scoreView.snp.bottom).offset(12)
  99. make.height.equalTo(90)
  100. }
  101. confirmButton.setTitle(.init(key: "A00183"), for: .normal)
  102. confirmButton.titleLabel?.font = .heading_h3
  103. confirmButton.backgroundColor = .text_2
  104. confirmButton.setTitleColor(.text_1, for: .normal)
  105. confirmButton.layer.cornerRadius = 23.5
  106. confirmButton.clipsToBounds = true
  107. confirmButton.addAction(UIAction(handler: { [weak self] _ in
  108. guard let self else { return }
  109. guard let curOrderId else { return }
  110. LNOrderManager.shared.commentOrder(
  111. orderId: curOrderId,
  112. star: scoreView.score,
  113. comment: commentView.text)
  114. { [weak self] success in
  115. guard let self else { return }
  116. guard success else { return }
  117. self.dismiss()
  118. handler?(scoreView.score, commentView.text)
  119. }
  120. }), for: .touchUpInside)
  121. container.addSubview(confirmButton)
  122. confirmButton.snp.makeConstraints { make in
  123. make.horizontalEdges.equalToSuperview().inset(12)
  124. make.top.equalTo(commentView.snp.bottom).offset(25)
  125. make.bottom.equalToSuperview().offset(commonBottomInset)
  126. make.height.equalTo(47)
  127. }
  128. }
  129. }
  130. #if DEBUG
  131. import SwiftUI
  132. struct LNOrderCommentPanelPreview: UIViewRepresentable {
  133. func makeUIView(context: Context) -> some UIView {
  134. let container = UIView()
  135. container.backgroundColor = .lightGray
  136. let view = LNOrderCommentPanel()
  137. view.popup(container)
  138. return container
  139. }
  140. func updateUIView(_ uiView: UIViewType, context: Context) { }
  141. }
  142. #Preview(body: {
  143. LNOrderCommentPanelPreview()
  144. })
  145. #endif