// // 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) } }