| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- //
- // LNMoneyNotEnoughAlertView.swift
- // Gami
- //
- // Created by OneeChan on 2026/3/30.
- //
- import Foundation
- import UIKit
- import SnapKit
- class LNMoneyNotEnoughAlertView: LNCommonAlertView {
- private var exchangeType:LNCurrencyType?
- private let remainButton = UIButton()
- var exchangeHandler: (() -> Void)?
-
- func update(_ currency: LNCurrencyType, exchange: LNCurrencyType? = nil) {
- if let exchange, let exchangeType = LNExchangeType.map(from: exchange, to: currency) {
- titleLabel.text = .init(key: "B00132", currency.name(lowcase: true))
-
- messageLabel.font = .heading_h4
- messageLabel.textColor = .text_4
- messageLabel.attributedText = buildRemainString(exchangeType: exchange)
-
- if let rate = exchangeType.rate {
- subMessageLabel.attributedText = buildExchangeString(from: currency, fromValue: "1", exchange: exchange, exchangeValue: rate.toDisplay)
- }
-
- showConfirm(.init(key: "A00262")) { [weak self] in
- guard let self else { return }
- dismiss()
- if remainButton.isSelected {
- LNUserDefaults[.remainExchange] = curTime
- }
- exchangeHandler?()
- }
- showCancel()
-
- remainButton.setTitle(String(key: "B00134"), for: .normal)
- remainButton.setImage(.icCheck, for: .selected)
- remainButton.setImage(.icUncheck, for: .normal)
- remainButton.setTitleColor(.text_4, for: .normal)
- remainButton.titleLabel?.font = .body_s
- remainButton.imageEdgeInsets = .init(top: 0, left: 0, bottom: 0, right: 8)
- remainButton.addAction(UIAction(handler: { [weak remainButton] _ in
- guard let remainButton else { return }
- remainButton.isSelected.toggle()
- }), for: .touchUpInside)
- buttonViews.addArrangedSubview(remainButton)
- } else {
- titleLabel.text = .init(key: "B00131", currency.name(lowcase: true))
- showConfirm { [weak self] in
- guard let self else { return }
- dismiss()
- let panel = LNPurchasePanel()
- panel.update(currency)
- panel.popup(self)
- }
- showCancel()
- }
- }
-
- func buildRemainString(exchangeType: LNCurrencyType) -> NSMutableAttributedString {
- let icon = NSTextAttachment(image: exchangeType.icon)
- icon.bounds = .init(x: 0, y: -4, width: 19, height: 19)
- let text = String(key: "B00133", exchangeType.name(lowcase: true), exchangeType.currentValue.toDisplay)
- let attrString = NSMutableAttributedString(string: text)
- let iconRange = (text as NSString).range(of: "{icon}")
- attrString.replaceCharacters(in: iconRange, with: .init(attachment: icon))
-
- return attrString
- }
-
- func buildExchangeString(from: LNCurrencyType, fromValue: String,
- exchange: LNCurrencyType, exchangeValue: String) -> NSMutableAttributedString {
- let text = String(key: "B00138", fromValue, exchangeValue)
- let attrString = NSMutableAttributedString(string: text)
-
- let toIcon = NSTextAttachment(image: exchange.icon)
- toIcon.bounds = .init(x: 0, y: -3, width: 14, height: 14)
- let toIconRange = (text as NSString).range(of: "{icon2}")
- attrString.replaceCharacters(in: toIconRange, with: .init(attachment: toIcon))
-
- let fromIcon = NSTextAttachment(image: from.icon)
- fromIcon.bounds = .init(x: 0, y: -3, width: 14, height: 14)
- let fromIconRange = (text as NSString).range(of: "{icon1}")
- attrString.replaceCharacters(in: fromIconRange, with: .init(attachment: fromIcon))
-
- return attrString
- }
- }
- #if DEBUG
- import SwiftUI
- struct LNMoneyNotEnoughAlertViewPreview: UIViewRepresentable {
- func makeUIView(context: Context) -> some UIView {
- let container = UIView()
- container.backgroundColor = .lightGray
-
- let button = UIButton()
- button.backgroundColor = .red
- button.addAction(UIAction(handler: { [weak container] _ in
- guard let container else { return }
-
- let view = LNMoneyNotEnoughAlertView()
- view.update(.diamond, exchange: .coin)
- view.popup(container)
-
- }), for: .touchUpInside)
- container.addSubview(button)
- button.snp.makeConstraints { make in
- make.center.equalToSuperview()
- make.width.height.equalTo(50)
- }
-
- return container
- }
-
- func updateUIView(_ uiView: UIViewType, context: Context) { }
- }
- #Preview(body: {
- LNMoneyNotEnoughAlertViewPreview()
- })
- #endif
|