LNSkillManagerViewController.swift 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. //
  2. // LNSkillManagerViewController.swift
  3. // Gami
  4. //
  5. // Created by OneeChan on 2026/1/23.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. extension UIView {
  11. func pushToSkillManager() {
  12. let vc = LNSkillManagerViewController()
  13. navigationController?.pushViewController(vc, animated: true)
  14. }
  15. }
  16. class LNSkillManagerViewController: LNViewController {
  17. private let stackView = UIStackView()
  18. private let createSkillButton = UIButton()
  19. private var skills: [LNMySkillItemVO] = []
  20. override func viewDidLoad() {
  21. super.viewDidLoad()
  22. setupViews()
  23. }
  24. override func viewDidAppear(_ animated: Bool) {
  25. super.viewDidAppear(animated)
  26. loadApplyInfo()
  27. loadList()
  28. }
  29. }
  30. extension LNSkillManagerViewController {
  31. private func loadList() {
  32. LNGameMateManager.shared.getMySkillList { [weak self] res in
  33. guard let self else { return }
  34. guard let res else {
  35. navigationController?.popViewController(animated: true)
  36. return
  37. }
  38. stackView.arrangedSubviews.forEach {
  39. self.stackView.removeArrangedSubview($0)
  40. $0.removeFromSuperview()
  41. }
  42. for skill in res.list {
  43. let view = buildSkillItem(skill)
  44. stackView.addArrangedSubview(view)
  45. }
  46. skills = res.list
  47. }
  48. }
  49. private func loadApplyInfo() {
  50. LNGameMateManager.shared.getJoinGameMateInfo { [weak self] res in
  51. guard let self else { return }
  52. guard let res else { return }
  53. enableCreate(!res.underReview)
  54. }
  55. }
  56. }
  57. extension LNSkillManagerViewController {
  58. private func enableCreate(_ enable: Bool) {
  59. if enable != createSkillButton.isEnabled {
  60. createSkillButton.isEnabled = enable
  61. createSkillButton.setBackgroundImage(enable ? .primary_8 : nil, for: .normal)
  62. }
  63. }
  64. private func setupViews() {
  65. title = .init(key: "B00076")
  66. view.backgroundColor = .primary_1
  67. let settingButton = UIButton()
  68. settingButton.setImage(.icSettings, for: .normal)
  69. settingButton.addAction(UIAction(handler: { [weak self] _ in
  70. guard let self else { return }
  71. view.pushToOrderAcceptSettings()
  72. }), for: .touchUpInside)
  73. setRightButton(settingButton)
  74. let scrollView = UIScrollView()
  75. scrollView.showsVerticalScrollIndicator = false
  76. scrollView.showsHorizontalScrollIndicator = false
  77. scrollView.contentInset = .init(top: 12, left: 0, bottom: -view.commonBottomInset + 50, right: 0)
  78. view.addSubview(scrollView)
  79. scrollView.snp.makeConstraints { make in
  80. make.verticalEdges.equalToSuperview()
  81. make.horizontalEdges.equalToSuperview().inset(16)
  82. }
  83. stackView.axis = .vertical
  84. stackView.spacing = 10
  85. scrollView.addSubview(stackView)
  86. stackView.snp.makeConstraints { make in
  87. make.edges.equalToSuperview()
  88. make.width.equalToSuperview()
  89. }
  90. createSkillButton.setTitle(.init(key: "B00077"), for: .normal)
  91. createSkillButton.setTitleColor(.text_1, for: .normal)
  92. createSkillButton.titleLabel?.font = .heading_h3
  93. createSkillButton.layer.cornerRadius = 23.5
  94. createSkillButton.backgroundColor = .fill_4
  95. createSkillButton.clipsToBounds = true
  96. createSkillButton.isEnabled = false
  97. createSkillButton.addAction(UIAction(handler: { [weak self] _ in
  98. guard let self else { return }
  99. let curSkills = skills.map { $0.bizCategoryCode }
  100. view.pushToGameCategoryList(exclude: curSkills) { [weak self] category, game in
  101. guard let self else { return }
  102. showLoading()
  103. LNGameMateManager.shared.getCreateSkillFields(id: game.code) { [weak self] res in
  104. dismissLoading()
  105. guard let self else { return }
  106. guard let res else { return }
  107. view.pushToSkillCreate(skill: game, info: res)
  108. }
  109. }
  110. }), for: .touchUpInside)
  111. view.addSubview(createSkillButton)
  112. createSkillButton.snp.makeConstraints { make in
  113. make.horizontalEdges.equalToSuperview().inset(16)
  114. make.bottom.equalToSuperview().offset(view.commonBottomInset)
  115. make.height.equalTo(47)
  116. }
  117. }
  118. private func buildSkillItem(_ skill: LNMySkillItemVO) -> UIView {
  119. let container = UIView()
  120. container.layer.cornerRadius = 12
  121. container.backgroundColor = .fill
  122. container.onTap { [weak self] in
  123. guard let self else { return }
  124. view.pushToSkillDetail(skill.id)
  125. }
  126. let infoView = UIView()
  127. infoView.isUserInteractionEnabled = false
  128. container.addSubview(infoView)
  129. infoView.snp.makeConstraints { make in
  130. make.horizontalEdges.equalToSuperview()
  131. make.top.equalToSuperview()
  132. make.height.equalTo(64)
  133. }
  134. let icon = UIImageView()
  135. icon.sd_setImage(with: URL(string: skill.categoryIcon))
  136. infoView.addSubview(icon)
  137. icon.snp.makeConstraints { make in
  138. make.centerY.equalToSuperview()
  139. make.leading.equalToSuperview().offset(12)
  140. make.width.height.equalTo(50)
  141. }
  142. let arrow = UIImageView.arrowImageView(size: 16)
  143. arrow.tintColor = .text_4
  144. infoView.addSubview(arrow)
  145. arrow.snp.makeConstraints { make in
  146. make.centerY.equalToSuperview()
  147. make.trailing.equalToSuperview().offset(-12)
  148. }
  149. let textView = UIView()
  150. infoView.addSubview(textView)
  151. textView.snp.makeConstraints { make in
  152. make.centerY.equalToSuperview()
  153. make.leading.equalTo(icon.snp.trailing).offset(4)
  154. make.trailing.lessThanOrEqualTo(arrow.snp.leading).offset(-4)
  155. }
  156. let nameLabel = UILabel()
  157. nameLabel.text = skill.bizCategoryName
  158. nameLabel.font = .heading_h4
  159. nameLabel.textColor = .text_5
  160. textView.addSubview(nameLabel)
  161. nameLabel.snp.makeConstraints { make in
  162. make.horizontalEdges.equalToSuperview()
  163. make.top.equalToSuperview()
  164. }
  165. let priceView = UIView()
  166. textView.addSubview(priceView)
  167. priceView.snp.makeConstraints { make in
  168. make.horizontalEdges.equalToSuperview()
  169. make.bottom.equalToSuperview()
  170. make.top.equalTo(nameLabel.snp.bottom).offset(4)
  171. }
  172. let coin = UIImageView.coinImageView()
  173. priceView.addSubview(coin)
  174. coin.snp.makeConstraints { make in
  175. make.leading.equalToSuperview()
  176. make.centerY.equalToSuperview()
  177. make.width.height.equalTo(14)
  178. }
  179. let priceLabel = UILabel()
  180. priceLabel.text = skill.price.toDisplay
  181. priceLabel.font = .heading_h5
  182. priceLabel.textColor = .text_5
  183. priceView.addSubview(priceLabel)
  184. priceLabel.snp.makeConstraints { make in
  185. make.verticalEdges.equalToSuperview()
  186. make.leading.equalTo(coin.snp.trailing).offset(1)
  187. }
  188. let unitLabel = UILabel()
  189. unitLabel.text = "/\(skill.unit)"
  190. unitLabel.font = .body_s
  191. unitLabel.textColor = .text_4
  192. priceView.addSubview(unitLabel)
  193. unitLabel.snp.makeConstraints { make in
  194. make.centerY.equalToSuperview()
  195. make.leading.equalTo(priceLabel.snp.trailing).offset(1)
  196. make.trailing.lessThanOrEqualToSuperview()
  197. }
  198. let statusView = UIView()
  199. container.addSubview(statusView)
  200. statusView.snp.makeConstraints { make in
  201. make.horizontalEdges.equalToSuperview()
  202. make.top.equalTo(infoView.snp.bottom).offset(2)
  203. make.bottom.equalToSuperview().offset(-8)
  204. make.height.equalTo(25)
  205. }
  206. let titleLabel = UILabel()
  207. titleLabel.text = .init(key: "A00169")
  208. titleLabel.font = .heading_h5
  209. titleLabel.textColor = .text_5
  210. statusView.addSubview(titleLabel)
  211. titleLabel.snp.makeConstraints { make in
  212. make.leading.equalToSuperview().offset(18)
  213. make.centerY.equalToSuperview()
  214. }
  215. let scaleX: CGFloat = 40.0 / 51.0
  216. let scaleY: CGFloat = 24.5 / 31.0
  217. let switchView = UISwitch()
  218. switchView.isOn = skill.open
  219. switchView.onTintColor = .primary_5
  220. switchView.transform = CGAffineTransform(scaleX: scaleX, y: scaleY)
  221. switchView.addAction(UIAction(handler: { [weak switchView] _ in
  222. guard let switchView else { return }
  223. showLoading()
  224. LNGameMateManager.shared.enableSkill(skillId: skill.id, open: switchView.isOn)
  225. { [weak switchView] success in
  226. dismissLoading()
  227. guard let switchView else { return }
  228. if !success {
  229. switchView.isOn.toggle()
  230. }
  231. }
  232. }), for: .valueChanged)
  233. statusView.addSubview(switchView)
  234. switchView.snp.makeConstraints { make in
  235. make.centerY.equalToSuperview()
  236. make.trailing.equalToSuperview().offset(-12)
  237. }
  238. return container
  239. }
  240. }