LNOrderQRCodeShowView.swift 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. //
  2. // LNOrderQRCodeShowView.swift
  3. // Lanu
  4. //
  5. // Created by OneeChan on 2025/11/27.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. class LNOrderQRCodeShowView: UIView {
  11. private let qrCodeSize: CGFloat = 145
  12. private let qrCodeIc = UIImageView()
  13. private let priceLabel = UILabel()
  14. private let unitLabel = UILabel()
  15. private let saveButton = UIButton()
  16. private let copyButton = UIButton()
  17. private var qrCodeUrl: String?
  18. private var curSkill: LNGameMateSkillVO?
  19. private var count: Int = 0
  20. override init(frame: CGRect) {
  21. super.init(frame: frame)
  22. setupViews()
  23. }
  24. func update(_ skill: LNGameMateSkillVO, customCount: Int? = nil) {
  25. let count = customCount ?? 1
  26. if skill.id == curSkill?.id, count == self.count { return }
  27. priceLabel.text = (skill.price * Double(count)).toDisplay
  28. unitLabel.text = if count <= 1 {
  29. "/\(skill.unit)"
  30. } else {
  31. "/\(skill.unit) x \(count)"
  32. }
  33. qrCodeIc.image = nil
  34. curSkill = skill
  35. self.count = count
  36. saveButton.isEnabled = false
  37. copyButton.isEnabled = false
  38. let type: LNOrderSource = customCount != nil ? .custom : .normal
  39. LNOrderManager.shared.createOrderQR(
  40. skillId: skill.id,
  41. count: count,
  42. type: type) { [weak self] qrCode in
  43. guard let self else { return }
  44. guard let qrCode else { return }
  45. guard skill.id == self.curSkill?.id,
  46. self.count == count else { return }
  47. let url: String = .orderQRShareUrl + "?id=\(skill.id)&code=\(qrCode)"
  48. self.qrCodeIc.image = url.toQRCode(size: qrCodeSize)
  49. self.qrCodeUrl = url
  50. self.saveButton.isEnabled = true
  51. self.copyButton.isEnabled = true
  52. }
  53. }
  54. required init?(coder: NSCoder) {
  55. super.init(coder: coder)
  56. }
  57. }
  58. extension LNOrderQRCodeShowView {
  59. private func setupViews() {
  60. let container = UIView()
  61. container.backgroundColor = .fill
  62. container.layer.cornerRadius = 6
  63. addSubview(container)
  64. container.snp.makeConstraints { make in
  65. make.centerX.equalToSuperview()
  66. make.top.equalToSuperview().offset(20)
  67. }
  68. container.addSubview(qrCodeIc)
  69. qrCodeIc.snp.makeConstraints { make in
  70. make.edges.equalToSuperview().inset(12)
  71. make.width.height.equalTo(qrCodeSize)
  72. }
  73. let priceView = UIView()
  74. addSubview(priceView)
  75. priceView.snp.makeConstraints { make in
  76. make.centerX.equalToSuperview()
  77. make.top.equalTo(container.snp.bottom).offset(12)
  78. }
  79. let coin = UIImageView.coinImageView()
  80. priceView.addSubview(coin)
  81. coin.snp.makeConstraints { make in
  82. make.leading.equalToSuperview()
  83. make.centerY.equalToSuperview()
  84. make.width.height.equalTo(22)
  85. }
  86. priceLabel.font = .heading_h1
  87. priceLabel.textColor = .text_5
  88. priceView.addSubview(priceLabel)
  89. priceLabel.snp.makeConstraints { make in
  90. make.verticalEdges.equalToSuperview()
  91. make.leading.equalTo(coin.snp.trailing)
  92. }
  93. unitLabel.font = .body_m
  94. unitLabel.textColor = .text_5
  95. priceView.addSubview(unitLabel)
  96. unitLabel.snp.makeConstraints { make in
  97. make.leading.equalTo(priceLabel.snp.trailing)
  98. make.centerY.equalToSuperview()
  99. make.trailing.equalToSuperview()
  100. }
  101. saveButton.layer.cornerRadius = 23.5
  102. saveButton.setTitleColor(.text_6, for: .normal)
  103. saveButton.setTitle(.init(key: "A00156"), for: .normal)
  104. saveButton.titleLabel?.font = .heading_h3
  105. saveButton.setBackgroundImage(.primary_7, for: .normal)
  106. saveButton.clipsToBounds = true
  107. saveButton.addAction(UIAction(handler: { [weak self] _ in
  108. guard let self else { return }
  109. guard let skill = self.curSkill else { return }
  110. guard let image = qrCodeIc.image else { return }
  111. let generator = LNOrderShareImageGenerator()
  112. generator.update(skill: skill, count: self.count, image: image)
  113. let share = generator.generate()
  114. share.saveToLibrary { success, err in
  115. if success {
  116. showToast(.init(key: "A00157"))
  117. } else if let err {
  118. showToast(err.localizedDescription)
  119. }
  120. }
  121. }), for: .touchUpInside)
  122. addSubview(saveButton)
  123. saveButton.snp.makeConstraints { make in
  124. make.leading.equalToSuperview().offset(16)
  125. make.top.equalTo(priceView.snp.bottom).offset(22)
  126. make.height.equalTo(47)
  127. make.bottom.equalToSuperview().offset(-10)
  128. }
  129. let cover = UIView()
  130. cover.backgroundColor = .fill
  131. cover.layer.cornerRadius = 22
  132. cover.isUserInteractionEnabled = false
  133. saveButton.insertSubview(cover, at: 0)
  134. cover.snp.makeConstraints { make in
  135. make.edges.equalToSuperview().inset(1.5)
  136. }
  137. copyButton.layer.cornerRadius = 23.5
  138. copyButton.clipsToBounds = true
  139. copyButton.setBackgroundImage(.primary_8, for: .normal)
  140. copyButton.setTitle(.init(key: "A00158"), for: .normal)
  141. copyButton.setTitleColor(.text_1, for: .normal)
  142. copyButton.titleLabel?.font = .heading_h3
  143. copyButton.addAction(UIAction(handler: { [weak self] _ in
  144. guard let self else { return }
  145. UIPasteboard.general.string = self.qrCodeUrl
  146. showToast(.init(key: "A00159"))
  147. }), for: .touchUpInside)
  148. addSubview(copyButton)
  149. copyButton.snp.makeConstraints { make in
  150. make.leading.equalTo(saveButton.snp.trailing).offset(10)
  151. make.trailing.equalToSuperview().offset(-16)
  152. make.centerY.equalTo(saveButton)
  153. make.width.height.equalTo(saveButton)
  154. }
  155. }
  156. }