LNWalletViewController.swift 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. //
  2. // LNWalletViewController.swift
  3. // Lanu
  4. //
  5. // Created by OneeChan on 2025/12/24.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. extension UIView {
  11. func pushToWallet() {
  12. let vc = LNWalletViewController()
  13. navigationController?.pushViewController(vc, animated: true)
  14. }
  15. }
  16. class LNWalletViewController: LNViewController {
  17. private let coinLabel = UILabel()
  18. private let diamondLabel = UILabel()
  19. private let beanLabel = UILabel()
  20. override func viewDidLoad() {
  21. super.viewDidLoad()
  22. setupViews()
  23. updateWalletInfo()
  24. LNEventDeliver.addObserver(self)
  25. LNPurchaseManager.shared.reloadWalletInfo()
  26. }
  27. }
  28. extension LNWalletViewController: LNPurchaseManagerNotify {
  29. func onUserWalletInfoChanged(info: LNUserWalletInfo) {
  30. updateWalletInfo()
  31. }
  32. }
  33. extension LNWalletViewController {
  34. private func updateWalletInfo() {
  35. diamondLabel.text = myWalletInfo.diamond.toDisplay
  36. coinLabel.text = myWalletInfo.coin.toDisplay
  37. beanLabel.text = myWalletInfo.bean.toDisplay
  38. }
  39. private func setupViews() {
  40. view.backgroundColor = .primary_1
  41. let topCover = UIImageView()
  42. topCover.image = .icHomeTopBg
  43. view.addSubview(topCover)
  44. topCover.snp.makeConstraints { make in
  45. make.leading.trailing.equalToSuperview()
  46. make.top.equalTo(fakeNaviBgView)
  47. }
  48. setupNavBar()
  49. let stackView = UIStackView()
  50. stackView.axis = .vertical
  51. stackView.spacing = 16
  52. view.addSubview(stackView)
  53. stackView.snp.makeConstraints { make in
  54. make.horizontalEdges.equalToSuperview().inset(16)
  55. make.top.equalToSuperview().offset(16)
  56. }
  57. stackView.addArrangedSubview(buildWallet())
  58. stackView.addArrangedSubview(buildIncome())
  59. }
  60. private func setupNavBar() {
  61. navigationBarColor = .clear
  62. title = .init(key: "A00215")
  63. let history = UIButton()
  64. history.setImage(.icWalletHistory, for: .normal)
  65. history.addAction(UIAction(handler: { [weak self] _ in
  66. guard let self else { return }
  67. view.pushToWebView(.init(url: .walletHistoryUrl))
  68. }), for: .touchUpInside)
  69. setRightButton(history)
  70. }
  71. private func buildWallet() -> UIView {
  72. let container = UIView()
  73. container.layer.cornerRadius = 12
  74. container.backgroundColor = .fill
  75. let titleView = UIView()
  76. container.addSubview(titleView)
  77. titleView.snp.makeConstraints { make in
  78. make.horizontalEdges.equalToSuperview()
  79. make.top.equalToSuperview()
  80. make.height.equalTo(40)
  81. }
  82. let titleLabel = UILabel()
  83. titleLabel.text = .init(key: "A00268")
  84. titleLabel.font = .heading_h3
  85. titleLabel.textColor = .text_5
  86. titleView.addSubview(titleLabel)
  87. titleLabel.snp.makeConstraints { make in
  88. make.leading.equalToSuperview().offset(16)
  89. make.centerY.equalToSuperview()
  90. }
  91. let coinView = buildCoinView()
  92. container.addSubview(coinView)
  93. coinView.snp.makeConstraints { make in
  94. make.horizontalEdges.equalToSuperview().inset(16)
  95. make.top.equalTo(titleView.snp.bottom)
  96. make.height.equalTo(64)
  97. }
  98. let diamondView = buildDiamondView()
  99. container.addSubview(diamondView)
  100. diamondView.snp.makeConstraints { make in
  101. make.horizontalEdges.equalToSuperview().inset(16)
  102. make.top.equalTo(coinView.snp.bottom).offset(10)
  103. make.height.equalTo(64)
  104. make.bottom.equalToSuperview().offset(-12)
  105. }
  106. return container
  107. }
  108. private func buildCoinView() -> UIView {
  109. let container = UIView()
  110. container.backgroundColor = .init(hex: "#FFC4000D")
  111. container.layer.cornerRadius = 12
  112. container.onTap { [weak self] in
  113. guard let self else { return }
  114. view.pushToCoinView()
  115. }
  116. let coin = UIImageView.coinImageView(true)
  117. container.addSubview(coin)
  118. coin.snp.makeConstraints { make in
  119. make.leading.equalToSuperview().offset(14)
  120. make.centerY.equalToSuperview()
  121. make.width.height.equalTo(42)
  122. }
  123. let textView = UIView()
  124. container.addSubview(textView)
  125. textView.snp.makeConstraints { make in
  126. make.leading.equalTo(coin.snp.trailing).offset(8)
  127. make.centerY.equalToSuperview()
  128. }
  129. coinLabel.text = "0"
  130. coinLabel.font = .heading_h1_5
  131. coinLabel.textColor = .text_5
  132. textView.addSubview(coinLabel)
  133. coinLabel.snp.makeConstraints { make in
  134. make.leading.top.equalToSuperview()
  135. make.trailing.equalToSuperview()
  136. }
  137. let descLabel = UILabel()
  138. descLabel.text = .init(key: "A00216")
  139. descLabel.font = .heading_h5
  140. descLabel.textColor = .text_5
  141. textView.addSubview(descLabel)
  142. descLabel.snp.makeConstraints { make in
  143. make.leading.trailing.bottom.equalToSuperview()
  144. make.top.equalTo(coinLabel.snp.bottom).offset(-5)
  145. }
  146. let jumpButton = UIButton()
  147. jumpButton.setBackgroundImage(.primary_8, for: .normal)
  148. jumpButton.layer.cornerRadius = 12
  149. jumpButton.clipsToBounds = true
  150. jumpButton.addAction(UIAction(handler: { [weak self] _ in
  151. guard let self else { return }
  152. view.pushToCoinView()
  153. }), for: .touchUpInside)
  154. container.addSubview(jumpButton)
  155. jumpButton.snp.makeConstraints { make in
  156. make.centerY.equalToSuperview()
  157. make.trailing.equalToSuperview().offset(-14)
  158. make.height.equalTo(24)
  159. }
  160. let contentView = UIView()
  161. contentView.isUserInteractionEnabled = false
  162. jumpButton.addSubview(contentView)
  163. contentView.snp.makeConstraints { make in
  164. make.center.equalToSuperview()
  165. make.leading.greaterThanOrEqualToSuperview().offset(8)
  166. }
  167. let jumpTitleLabel = UILabel()
  168. jumpTitleLabel.text = .init(key: "A00279")
  169. jumpTitleLabel.font = .heading_h5
  170. jumpTitleLabel.textColor = .text_1
  171. contentView.addSubview(jumpTitleLabel)
  172. jumpTitleLabel.snp.makeConstraints { make in
  173. make.leading.verticalEdges.equalToSuperview()
  174. }
  175. let arrow = UIImageView.arrowImageView(size: 10)
  176. arrow.tintColor = .white
  177. contentView.addSubview(arrow)
  178. arrow.snp.makeConstraints { make in
  179. make.leading.equalTo(jumpTitleLabel.snp.trailing).offset(2)
  180. make.centerY.equalToSuperview()
  181. make.trailing.equalToSuperview()
  182. }
  183. return container
  184. }
  185. private func buildDiamondView() -> UIView {
  186. let container = UIView()
  187. container.backgroundColor = .init(hex: "#008FFF0D")
  188. container.layer.cornerRadius = 12
  189. container.onTap { [weak self] in
  190. guard let self else { return }
  191. view.pushToDiamondView()
  192. }
  193. let diamond = UIImageView.diamondImageView(true)
  194. container.addSubview(diamond)
  195. diamond.snp.makeConstraints { make in
  196. make.leading.equalToSuperview().offset(14)
  197. make.centerY.equalToSuperview()
  198. make.width.height.equalTo(42)
  199. }
  200. let textView = UIView()
  201. container.addSubview(textView)
  202. textView.snp.makeConstraints { make in
  203. make.leading.equalTo(diamond.snp.trailing).offset(8)
  204. make.centerY.equalToSuperview()
  205. }
  206. diamondLabel.text = "0"
  207. diamondLabel.font = .heading_h1_5
  208. diamondLabel.textColor = .text_5
  209. textView.addSubview(diamondLabel)
  210. diamondLabel.snp.makeConstraints { make in
  211. make.leading.top.equalToSuperview()
  212. make.trailing.equalToSuperview()
  213. }
  214. let descLabel = UILabel()
  215. descLabel.text = .init(key: "A00217")
  216. descLabel.font = .heading_h5
  217. descLabel.textColor = .text_5
  218. textView.addSubview(descLabel)
  219. descLabel.snp.makeConstraints { make in
  220. make.leading.trailing.bottom.equalToSuperview()
  221. make.top.equalTo(diamondLabel.snp.bottom).offset(-5)
  222. }
  223. let jumpButton = UIButton()
  224. jumpButton.setBackgroundImage(.primary_8, for: .normal)
  225. jumpButton.layer.cornerRadius = 12
  226. jumpButton.clipsToBounds = true
  227. jumpButton.addAction(UIAction(handler: { [weak self] _ in
  228. guard let self else { return }
  229. view.pushToDiamondView()
  230. }), for: .touchUpInside)
  231. container.addSubview(jumpButton)
  232. jumpButton.snp.makeConstraints { make in
  233. make.centerY.equalToSuperview()
  234. make.trailing.equalToSuperview().offset(-14)
  235. make.height.equalTo(24)
  236. }
  237. let contentView = UIView()
  238. contentView.isUserInteractionEnabled = false
  239. jumpButton.addSubview(contentView)
  240. contentView.snp.makeConstraints { make in
  241. make.center.equalToSuperview()
  242. make.leading.greaterThanOrEqualToSuperview().offset(8)
  243. }
  244. let jumpTitleLabel = UILabel()
  245. jumpTitleLabel.text = .init(key: "A00279")
  246. jumpTitleLabel.font = .heading_h5
  247. jumpTitleLabel.textColor = .text_1
  248. contentView.addSubview(jumpTitleLabel)
  249. jumpTitleLabel.snp.makeConstraints { make in
  250. make.leading.verticalEdges.equalToSuperview()
  251. }
  252. let arrow = UIImageView.arrowImageView(size: 10)
  253. arrow.tintColor = .white
  254. contentView.addSubview(arrow)
  255. arrow.snp.makeConstraints { make in
  256. make.leading.equalTo(jumpTitleLabel.snp.trailing).offset(2)
  257. make.centerY.equalToSuperview()
  258. make.trailing.equalToSuperview()
  259. }
  260. return container
  261. }
  262. private func buildIncome() -> UIView {
  263. let container = UIView()
  264. container.layer.cornerRadius = 12
  265. container.backgroundColor = .fill
  266. let titleView = UIView()
  267. container.addSubview(titleView)
  268. titleView.snp.makeConstraints { make in
  269. make.horizontalEdges.equalToSuperview()
  270. make.top.equalToSuperview()
  271. make.height.equalTo(40)
  272. }
  273. let titleLabel = UILabel()
  274. titleLabel.text = .init(key: "A00276")
  275. titleLabel.font = .heading_h3
  276. titleLabel.textColor = .text_5
  277. titleView.addSubview(titleLabel)
  278. titleLabel.snp.makeConstraints { make in
  279. make.leading.equalToSuperview().offset(16)
  280. make.centerY.equalToSuperview()
  281. }
  282. let beanView = buildBeanView()
  283. container.addSubview(beanView)
  284. beanView.snp.makeConstraints { make in
  285. make.horizontalEdges.equalToSuperview().inset(16)
  286. make.top.equalTo(titleView.snp.bottom)
  287. make.height.equalTo(64)
  288. make.bottom.equalToSuperview().offset(-10)
  289. }
  290. return container
  291. }
  292. private func buildBeanView() -> UIView {
  293. let container = UIView()
  294. container.backgroundColor = .init(hex: "#FF73000D")
  295. container.layer.cornerRadius = 12
  296. container.onTap { [weak self] in
  297. guard let self else { return }
  298. view.pushToBeanView()
  299. }
  300. let bean = UIImageView.beanImageView()
  301. container.addSubview(bean)
  302. bean.snp.makeConstraints { make in
  303. make.leading.equalToSuperview().offset(14)
  304. make.centerY.equalToSuperview()
  305. make.width.height.equalTo(42)
  306. }
  307. let textView = UIView()
  308. container.addSubview(textView)
  309. textView.snp.makeConstraints { make in
  310. make.leading.equalTo(bean.snp.trailing).offset(8)
  311. make.centerY.equalToSuperview()
  312. }
  313. beanLabel.text = myWalletInfo.bean.toDisplay
  314. beanLabel.font = .heading_h1_5
  315. beanLabel.textColor = .text_5
  316. textView.addSubview(beanLabel)
  317. beanLabel.snp.makeConstraints { make in
  318. make.leading.bottom.equalToSuperview()
  319. make.trailing.equalToSuperview()
  320. }
  321. let descLabel = UILabel()
  322. descLabel.text = .init(key: "A00277")
  323. descLabel.font = .heading_h5
  324. descLabel.textColor = .text_5
  325. textView.addSubview(descLabel)
  326. descLabel.snp.makeConstraints { make in
  327. make.leading.trailing.top.equalToSuperview()
  328. make.bottom.equalTo(beanLabel.snp.top)
  329. }
  330. let jumpButton = UIButton()
  331. jumpButton.setBackgroundImage(.primary_8, for: .normal)
  332. jumpButton.layer.cornerRadius = 12
  333. jumpButton.clipsToBounds = true
  334. jumpButton.addAction(UIAction(handler: { [weak self] _ in
  335. guard let self else { return }
  336. view.pushToBeanView()
  337. }), for: .touchUpInside)
  338. container.addSubview(jumpButton)
  339. jumpButton.snp.makeConstraints { make in
  340. make.centerY.equalToSuperview()
  341. make.trailing.equalToSuperview().offset(-14)
  342. make.height.equalTo(24)
  343. }
  344. let contentView = UIView()
  345. jumpButton.addSubview(contentView)
  346. contentView.snp.makeConstraints { make in
  347. make.center.equalToSuperview()
  348. make.leading.greaterThanOrEqualToSuperview().offset(8)
  349. }
  350. let jumpTitleLabel = UILabel()
  351. jumpTitleLabel.text = .init(key: "A00390")
  352. jumpTitleLabel.font = .heading_h5
  353. jumpTitleLabel.textColor = .text_1
  354. contentView.addSubview(jumpTitleLabel)
  355. jumpTitleLabel.snp.makeConstraints { make in
  356. make.leading.verticalEdges.equalToSuperview()
  357. }
  358. let arrow = UIImageView.arrowImageView(size: 10)
  359. arrow.tintColor = .white
  360. contentView.addSubview(arrow)
  361. arrow.snp.makeConstraints { make in
  362. make.leading.equalTo(jumpTitleLabel.snp.trailing).offset(2)
  363. make.centerY.equalToSuperview()
  364. make.trailing.equalToSuperview()
  365. }
  366. return container
  367. }
  368. }
  369. #if DEBUG
  370. import SwiftUI
  371. struct LNWalletViewControllerPreview: UIViewControllerRepresentable {
  372. func makeUIViewController(context: Context) -> some UIViewController {
  373. LNWalletViewController()
  374. }
  375. func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) { }
  376. }
  377. #Preview(body: {
  378. LNWalletViewControllerPreview()
  379. })
  380. #endif