// // SOSViewController.swift // QuickLocation // import UIKit import RxSwift final class SOSViewController: BaseViewController { private var rootView: SOSView! private var isRequestingSOS = false private var statusRequestVersion = 0 override func loadView() { rootView = SOSView(frame: UIScreen.main.bounds) view = rootView } override func viewDidLoad() { super.viewDidLoad() fd_interactivePopDisabled = true bindActions() rootView.setState(AppContextManager.shared.status == 1 ? .active : .idle) } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) requestEmergencyContacts() requestUserStatus() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) statusRequestVersion += 1 rootView.stopTransientActivities() } private func bindActions() { rootView.onCountdownCompleted = { [weak self] in self?.requestSOS(enable: true) } rootView.onCancelActive = { [weak self] in self?.requestSOS(enable: false) } rootView.onManageContacts = { AppRouter.push(Route.emergencyContact) } } private func requestEmergencyContacts() { UserService.emergencyContactList() .subscribe(onNext: { [weak self] response in self?.rootView.configureContacts(response.list) }, onError: { _ in }) .disposed(by: disposeBag) } private func requestUserStatus() { statusRequestVersion += 1 let requestVersion = statusRequestVersion UserService.userStatus() .subscribe(onNext: { [weak self] response in guard let self, requestVersion == self.statusRequestVersion, !self.isRequestingSOS else { return } switch self.rootView.state { case .idle, .active: break case .countdown, .sending: return } guard response.code == "0", let model = response.model else { DLToast.showError(text: response.message ?? "获取用户状态失败") return } AppContextManager.shared.updateAccountState(status: model.status, mood: model.mood) self.rootView.setState(model.status == 1 ? .active : .idle) }, onError: { [weak self] error in guard let self, requestVersion == self.statusRequestVersion else { return } DLToast.showError(text: error.localizedDescription) }) .disposed(by: disposeBag) } private func requestSOS(enable: Bool) { guard !isRequestingSOS else { return } statusRequestVersion += 1 isRequestingSOS = true dl.showLoading(text: enable ? "正在发送SOS" : "正在取消SOS") SystemService.sos(enable: enable) .subscribe(onNext: { [weak self] _ in guard let self else { return } self.isRequestingSOS = false AppContextManager.shared.updateAccountStatus(enable ? 1 : 0) self.rootView.setState(enable ? .active : .idle) self.dl.showSuccess(text: enable ? "发送成功" : "取消成功") }, onError: { [weak self] _ in guard let self else { return } self.isRequestingSOS = false if enable { self.rootView.setState(.idle) } else { self.rootView.setState(.active) self.rootView.setActiveCancelEnabled(true) } self.dl.showError(text: enable ? "SOS发送失败,请重试" : "SOS取消失败,请重试") }) .disposed(by: disposeBag) } }