AddPlayListViewController.swift 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. //
  2. // AddPlayListViewController.swift
  3. // ColorfulWallpaper
  4. //
  5. // Created by ni on 2024/9/19.
  6. //
  7. import Combine
  8. import Foundation
  9. import KLTips
  10. import TSVideoKit
  11. class AddPlayListViewController: LWBaseViewController, UITableViewDelegate {
  12. var viewModel: AddPlayListViewModel = .init()
  13. lazy var backView: UIView = .simpleView(color: .hexColor("#222222"))
  14. lazy var listView: UITableView = {
  15. let tabView = UITableView()
  16. tabView.dataSource = viewModel
  17. tabView.delegate = self
  18. tabView.separatorStyle = .none
  19. tabView.register(PlayListCell
  20. .self, forCellReuseIdentifier: "PlayListCell")
  21. tabView.register(PlayListAddCell.self, forCellReuseIdentifier: "PlayListAddCell")
  22. tabView.backgroundColor = .clear
  23. tabView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 80, right: 0)
  24. return tabView
  25. }()
  26. lazy var titleLabel: UILabel = .simpleLabel(text: "Add to Playlist".localized(), font: .boldSystemFont18, color: .white)
  27. lazy var closeButton: UIButton = {
  28. let btn = UIButton()
  29. btn.setImage(UIImage(named: "ic-close"), for: .normal)
  30. btn.addTarget(self, action: #selector(dismissCurrent), for: .touchUpInside)
  31. return btn
  32. }()
  33. lazy var disappearArea: UIControl = .init()
  34. private var canncellable: [AnyCancellable] = []
  35. var addSuccessBlock: () -> Void = {}
  36. var video: TSVideo?
  37. var videos: [TSVideo] = []
  38. convenience init(video: TSVideo) {
  39. self.init()
  40. self.video = video
  41. viewModel.needMore = false
  42. }
  43. convenience init(videos: [TSVideo]) {
  44. self.init()
  45. self.videos = videos
  46. viewModel.needMore = false
  47. }
  48. override func viewDidLoad() {
  49. super.viewDidLoad()
  50. navigationController?.navigationBar.isHidden = true
  51. addNotifaction()
  52. }
  53. override func viewWillAppear(_ animated: Bool) {
  54. super.viewWillAppear(animated)
  55. viewModel.requestData()
  56. }
  57. override func viewWillDisappear(_ animated: Bool) {
  58. super.viewWillDisappear(animated)
  59. }
  60. override func addNotifaction() {
  61. super.addNotifaction()
  62. viewModel.$playLists.receive(on: DispatchQueue.main).sink { _ in
  63. self.listView.reloadData()
  64. }.store(in: &canncellable)
  65. NotificationCenter.default.addObserver(self, selector: #selector(reloadData), name: .K_RefreshNotifaction, object: nil)
  66. }
  67. @objc func reloadData() {
  68. viewModel.requestData()
  69. }
  70. func newPlaylist() {
  71. let alertVC = UIAlertController(title: nil, message: "Playlist Name".localized(), preferredStyle: .alert)
  72. alertVC.addTextField { textField in
  73. textField.placeholder = "input name".localized()
  74. textField.font = UIFont.systemFont(ofSize: 16)
  75. }
  76. let ok = UIAlertAction(title: "OK".localized(), style: .default) { [weak self] _ in
  77. if let name = alertVC.textFields?.first?.text, !name.isEmpty {
  78. self?.viewModel.creatPlayList(name: name) { listid in
  79. if let id = listid {
  80. self?.didFinishedCreatedPlaylist(id: id)
  81. }
  82. }
  83. }
  84. }
  85. let cancel = UIAlertAction(title: "Cancel".localized(), style: .cancel)
  86. alertVC.addAction(cancel)
  87. alertVC.addAction(ok)
  88. present(alertVC, animated: true)
  89. }
  90. override func addChildren() {
  91. super.addChildren()
  92. disappearArea.backgroundColor = .black.withAlphaComponent(0.4)
  93. disappearArea.addTarget(self, action: #selector(dismissCurrent), for: .touchUpInside)
  94. backView.layer.cornerRadius = 16
  95. backView.layer.masksToBounds = true
  96. view.addSubview(disappearArea)
  97. view.addSubview(backView)
  98. backView.addSubview(titleLabel)
  99. backView.addSubview(closeButton)
  100. backView.addSubview(listView)
  101. }
  102. @objc func dismissCurrent() {
  103. dismiss(animated: true)
  104. }
  105. override func makeConstarints() {
  106. super.makeConstarints()
  107. disappearArea.snp.makeConstraints { make in
  108. make.leading.trailing.top.equalToSuperview()
  109. make.bottom.equalTo(backView.snp.top)
  110. }
  111. backView.snp.makeConstraints { make in
  112. make.bottom.leading.trailing.equalToSuperview()
  113. make.height.equalToSuperview().multipliedBy(0.6)
  114. }
  115. titleLabel.snp.makeConstraints { make in
  116. make.top.equalToSuperview()
  117. make.leading.equalToSuperview().offset(16)
  118. make.height.equalTo(54)
  119. }
  120. closeButton.snp.makeConstraints { make in
  121. make.width.height.equalTo(54)
  122. make.trailing.equalToSuperview()
  123. make.centerY.equalTo(titleLabel)
  124. }
  125. listView.snp.makeConstraints { make in
  126. make.top.equalTo(titleLabel.snp.bottom)
  127. make.bottom.leading.trailing.equalToSuperview()
  128. }
  129. }
  130. func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  131. if indexPath.section == 0 {
  132. newPlaylist()
  133. } else {
  134. if indexPath.row >= viewModel.playLists.count {
  135. return
  136. }
  137. let playList = viewModel.playLists[indexPath.row]
  138. if videos.isEmpty {
  139. addToPlayList(playlist: playList)
  140. } else {
  141. addVideosToPlaylist(playlist: playList)
  142. }
  143. reloadData()
  144. }
  145. }
  146. func didFinishedCreatedPlaylist(id: UUID) {
  147. if let playlist = TSVideoOperator.shared.dataManager.fetchPlaylist(id: id) {
  148. if videos.isEmpty {
  149. addToPlayList(playlist: playlist)
  150. } else {
  151. addVideosToPlaylist(playlist: playlist)
  152. }
  153. }
  154. }
  155. func addVideosToPlaylist(playlist: TSPlayList) {
  156. TSVideoOperator.shared.dataManager.addVideosToPlaylist(videos: videos, to: playlist) { _ in
  157. dismiss(animated: true) {
  158. self.addSuccessBlock()
  159. }
  160. }
  161. }
  162. func addToPlayList(playlist: TSPlayList) {
  163. if let mVideo = video {
  164. TSVideoOperator.shared.dataManager.addVideoToPlaylist(video: mVideo, to: playlist) { success in
  165. if !success {
  166. THUD.toast("Already Exists".localized())
  167. } else {
  168. dismiss(animated: true) {
  169. self.addSuccessBlock()
  170. }
  171. }
  172. }
  173. }
  174. }
  175. deinit {
  176. NotificationCenter.default.removeObserver(self)
  177. canncellable.removeAll()
  178. }
  179. }