115 lines
3.9 KiB
Swift
115 lines
3.9 KiB
Swift
//
|
||
// 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)
|
||
}
|
||
}
|