168 lines
5.9 KiB
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)
|
|
}
|
|
}
|