jsdw_ios/QuickLocation/Section/Home/Bubble/CreateBubbleVC.swift

168 lines
5.9 KiB
Swift

//
// CreateBubbleVC.swift
// QuickLocation
//
import UIKit
import RxSwift
import RxCocoa
import SwiftyUserDefaults
class CreateBubbleVC: BaseViewController {
fileprivate var rootView: CreateBubbleView!
private var statusRequestVersion = 0
override func loadView() {
rootView = CreateBubbleView(frame: UIScreen.main.bounds)
view = rootView
}
override func viewDidLoad() {
super.viewDidLoad()
bind()
restoreCachedBubbleIfNeeded()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
requestUserStatus()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
statusRequestVersion += 1
}
private func bind() {
rootView.navView.onBackTapped = { [weak self] in
self?.navigationController?.popViewController(animated: true)
}
rootView.moreBtn.rx.tap
.subscribe(onNext: { [weak self] in
self?.navigationController?.pushViewController(BubbleKnowledgeVC(), animated: true)
})
.disposed(by: disposeBag)
rootView.setupView.confirmBtn.rx.tap
.subscribe(onNext: { [weak self] in
guard let self else { return }
let hours = self.rootView.setupView.selectedHour.value
let message = self.rootView.setupView.buildMessage(for: hours)
self.rootView.setupView.showNotifySheet(message: message)
})
.disposed(by: disposeBag)
rootView.setupView.onSheetVisibilityChanged = { [weak self] visible in
self?.rootView.updateNavTitleForSheet(visible)
}
rootView.setupView.sheetConfirmBtn.rx.tap
.subscribe(onNext: { [weak self] in
self?.submitCreate()
})
.disposed(by: disposeBag)
rootView.doneView.popupBtn.rx.tap
.subscribe(onNext: { [weak self] in
self?.showConfirmPop(
title: "温馨提醒",
message: "您确定要弹出这个气泡吗?",
confirmText: "爆裂",
confirmBlock: { [weak self] in
self?.requestSetBubble(enable: false, keep_time: -1)
},
cancelText: "取消"
)
})
.disposed(by: disposeBag)
}
private func submitCreate() {
guard let systemConfig = AppContextManager.shared.systemConfig, systemConfig.isIntercept == false else {
let hours = rootView.setupView.selectedHour.value
requestSetBubble(enable: true, keep_time: hours)
return
}
if AppContextManager.shared.vip > 1 {
let hours = rootView.setupView.selectedHour.value
requestSetBubble(enable: true, keep_time: hours)
} else {
CreateBubblePopView.show()
}
}
private func restoreCachedBubbleIfNeeded() {
guard AppContextManager.shared.status == 2,
let endDate = Defaults[\.bubbleKeepTimes],
endDate > Date() else {
Defaults[\.bubbleKeepTimes] = nil
return
}
rootView.showDone(animated: false)
rootView.doneView.startCountdown(endDate: endDate)
}
private func requestUserStatus() {
statusRequestVersion += 1
let requestVersion = statusRequestVersion
UserService.userStatus()
.subscribe(onNext: { [weak self] response in
guard let self, requestVersion == self.statusRequestVersion else { return }
guard response.code == "0", let model = response.model else {
DLToast.showError(text: response.message ?? "获取用户状态失败")
return
}
self.applyUserStatus(model)
}, onError: { [weak self] error in
guard let self, requestVersion == self.statusRequestVersion else { return }
DLToast.showError(text: error.localizedDescription)
})
.disposed(by: disposeBag)
}
private func applyUserStatus(_ model: UserStatusModel) {
AppContextManager.shared.updateAccountState(status: model.status, mood: model.mood)
guard model.status == 2,
let endDate = model.bubbleEndDate,
endDate > Date() else {
Defaults[\.bubbleKeepTimes] = nil
rootView.doneView.stopCountdown()
rootView.showSetup(animated: false)
return
}
rootView.setupView.dismissNotifySheet()
Defaults[\.bubbleKeepTimes] = endDate
rootView.doneView.startCountdown(endDate: endDate)
rootView.showDone(animated: false)
}
private func requestSetBubble(enable: Bool, keep_time: Int) {
statusRequestVersion += 1
DLToast.showLoading()
UserService.setBubble(enable: enable, keep_time: keep_time).subscribe(onNext: { [weak self] _ in
DLToast.dismiss()
guard let self else { return }
guard enable else {
DLToast.show(text: "气泡已弹出") {
Defaults[\.bubbleKeepTimes] = nil
AppContextManager.shared.updateAccountStatus(0)
AppRouter.shared.popOrDismiss()
}
return
}
AppContextManager.shared.updateAccountStatus(2)
self.rootView.setupView.dismissNotifySheet()
let endDate = Calendar.current.date(byAdding: .hour, value: keep_time, to: Date()) ?? Date()
Defaults[\.bubbleKeepTimes] = endDate
self.rootView.doneView.startCountdown(endDate: endDate)
self.rootView.showDone(animated: true)
self.requestUserStatus()
}, onError: { _ in }).disposed(by: disposeBag)
}
}