| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- //
- // LNOrderQRCodeShowView.swift
- // Lanu
- //
- // Created by OneeChan on 2025/11/27.
- //
- import Foundation
- import UIKit
- import SnapKit
- class LNOrderQRCodeShowView: UIView {
- private let qrCodeSize: CGFloat = 145
-
- private let qrCodeIc = UIImageView()
- private let priceLabel = UILabel()
- private let unitLabel = UILabel()
-
- private let saveButton = UIButton()
- private let copyButton = UIButton()
-
- private var qrCodeUrl: String?
-
- private var curSkill: LNGameMateSkillVO?
- private var count: Int = 0
-
- override init(frame: CGRect) {
- super.init(frame: frame)
-
- setupViews()
- }
-
- func update(_ skill: LNGameMateSkillVO, customCount: Int? = nil) {
- let count = customCount ?? 1
- if skill.id == curSkill?.id, count == self.count { return }
-
- priceLabel.text = (skill.price * Double(count)).toDisplay
- unitLabel.text = if count <= 1 {
- "/\(skill.unit)"
- } else {
- "/\(skill.unit) x \(count)"
- }
-
- qrCodeIc.image = nil
-
- curSkill = skill
- self.count = count
-
- saveButton.isEnabled = false
- copyButton.isEnabled = false
-
- let type: LNOrderSource = customCount != nil ? .custom : .normal
- LNOrderManager.shared.createOrderQR(
- skillId: skill.id,
- count: count,
- type: type) { [weak self] qrCode in
- guard let self else { return }
- guard let qrCode else { return }
- guard skill.id == self.curSkill?.id,
- self.count == count else { return }
- let url: String = .orderQRShareUrl + "?id=\(skill.id)&code=\(qrCode)"
- self.qrCodeIc.image = url.toQRCode(size: qrCodeSize)
- self.qrCodeUrl = url
- self.saveButton.isEnabled = true
- self.copyButton.isEnabled = true
- }
- }
-
- required init?(coder: NSCoder) {
- super.init(coder: coder)
- }
- }
- extension LNOrderQRCodeShowView {
- private func setupViews() {
- let container = UIView()
- container.backgroundColor = .fill
- container.layer.cornerRadius = 6
- addSubview(container)
- container.snp.makeConstraints { make in
- make.centerX.equalToSuperview()
- make.top.equalToSuperview().offset(20)
- }
-
- container.addSubview(qrCodeIc)
- qrCodeIc.snp.makeConstraints { make in
- make.edges.equalToSuperview().inset(12)
- make.width.height.equalTo(qrCodeSize)
- }
-
- let priceView = UIView()
- addSubview(priceView)
- priceView.snp.makeConstraints { make in
- make.centerX.equalToSuperview()
- make.top.equalTo(container.snp.bottom).offset(12)
- }
-
- let coin = UIImageView.coinImageView()
- priceView.addSubview(coin)
- coin.snp.makeConstraints { make in
- make.leading.equalToSuperview()
- make.centerY.equalToSuperview()
- make.width.height.equalTo(22)
- }
-
- priceLabel.font = .heading_h1
- priceLabel.textColor = .text_5
- priceView.addSubview(priceLabel)
- priceLabel.snp.makeConstraints { make in
- make.verticalEdges.equalToSuperview()
- make.leading.equalTo(coin.snp.trailing)
- }
-
- unitLabel.font = .body_m
- unitLabel.textColor = .text_5
- priceView.addSubview(unitLabel)
- unitLabel.snp.makeConstraints { make in
- make.leading.equalTo(priceLabel.snp.trailing)
- make.centerY.equalToSuperview()
- make.trailing.equalToSuperview()
- }
-
- saveButton.layer.cornerRadius = 23.5
- saveButton.setTitleColor(.text_6, for: .normal)
- saveButton.setTitle(.init(key: "A00156"), for: .normal)
- saveButton.titleLabel?.font = .heading_h3
- saveButton.setBackgroundImage(.primary_7, for: .normal)
- saveButton.clipsToBounds = true
- saveButton.addAction(UIAction(handler: { [weak self] _ in
- guard let self else { return }
- guard let skill = self.curSkill else { return }
- guard let image = qrCodeIc.image else { return }
- let generator = LNOrderShareImageGenerator()
- generator.update(skill: skill, count: self.count, image: image)
- let share = generator.generate()
- share.saveToLibrary { success, err in
- if success {
- showToast(.init(key: "A00157"))
- } else if let err {
- showToast(err.localizedDescription)
- }
- }
- }), for: .touchUpInside)
- addSubview(saveButton)
- saveButton.snp.makeConstraints { make in
- make.leading.equalToSuperview().offset(16)
- make.top.equalTo(priceView.snp.bottom).offset(22)
- make.height.equalTo(47)
- make.bottom.equalToSuperview().offset(-10)
- }
-
- let cover = UIView()
- cover.backgroundColor = .fill
- cover.layer.cornerRadius = 22
- cover.isUserInteractionEnabled = false
- saveButton.insertSubview(cover, at: 0)
- cover.snp.makeConstraints { make in
- make.edges.equalToSuperview().inset(1.5)
- }
-
- copyButton.layer.cornerRadius = 23.5
- copyButton.clipsToBounds = true
- copyButton.setBackgroundImage(.primary_8, for: .normal)
- copyButton.setTitle(.init(key: "A00158"), for: .normal)
- copyButton.setTitleColor(.text_1, for: .normal)
- copyButton.titleLabel?.font = .heading_h3
- copyButton.addAction(UIAction(handler: { [weak self] _ in
- guard let self else { return }
- UIPasteboard.general.string = self.qrCodeUrl
- showToast(.init(key: "A00159"))
- }), for: .touchUpInside)
- addSubview(copyButton)
- copyButton.snp.makeConstraints { make in
- make.leading.equalTo(saveButton.snp.trailing).offset(10)
- make.trailing.equalToSuperview().offset(-16)
- make.centerY.equalTo(saveButton)
- make.width.height.equalTo(saveButton)
- }
- }
- }
|