jsdw_ios/QuickLocation/Section/Mine/Account/AccountVC.swift

227 lines
8.1 KiB
Swift

//
// AccountVC.swift
// QuickLocation
//
// Created by on 2026/6/10.
//
import UIKit
import RxSwift
import RxCocoa
import RxDataSources
import Kingfisher
#if !targetEnvironment(simulator)
import GeYanSdk
import RxGesture
#endif
class AccountVC: BaseViewController {
fileprivate var rootView: AccountView!
override func loadView() {
rootView = AccountView(frame: UIScreen.main.bounds)
view = rootView
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
reactiveAction()
rootView.refreshProfile()
DispatchQueue.global(qos: .background).async {
let totalByte = AppCacheManager.totalCacheSize()
let cacheText = AppCacheManager.formatByte(totalByte)
DispatchQueue.main.async {
// Label
self.rootView.cacheLab.text = "\(cacheText)"
}
}
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
rootView.refreshProfile()
}
private func reactiveAction() {
rootView.logoutBtn.rx.tap.subscribe(onNext: { _ in
self.showConfirmPop(title: "温馨提醒",
message: "确定要退出账号吗?",
confirmText: "",
confirmBlock: { },
cancelText: "") {
self.requestLogout()
}
}).disposed(by: disposeBag)
rootView.cancelledBtn.rx.tap.subscribe(onNext: { _ in
AppRouter.push(Route.cancelAccount)
}).disposed(by: disposeBag)
let tap = UITapGestureRecognizer(target: self, action: #selector(handleClearCacheTap))
rootView.clearView.addGestureRecognizer(tap)
let versionTap = UITapGestureRecognizer(target: self, action: #selector(handleVersionViewTap))
rootView.versionView.addGestureRecognizer(versionTap)
let avatarTap = UITapGestureRecognizer(target: self, action: #selector(handleAvatarTap))
rootView.avatarView.addGestureRecognizer(avatarTap)
let nickTap = UITapGestureRecognizer(target: self, action: #selector(handleNickNameTap))
rootView.nickNameView.addGestureRecognizer(nickTap)
let genderTap = UITapGestureRecognizer(target: self, action: #selector(handleGenderTap))
rootView.genderView.addGestureRecognizer(genderTap)
NotificationCenter.default.rx.notification(.RefreshUserConfigNotification)
.observe(on: MainScheduler.instance)
.subscribe(onNext: { [weak self] _ in
self?.rootView.refreshProfile()
})
.disposed(by: disposeBag)
}
@objc private func handleAvatarTap() {
let vc = AvatarIconListVC(iconIndex: AppContextManager.shared.head_pic)
vc.onSelectIcon = { [weak self] headPic in
self?.requestSetHeadPic(headPic)
}
navigationController?.pushViewController(vc, animated: true)
}
@objc private func handleNickNameTap() {
let vc = TextInputViewController(
title: "昵称",
maxLength: 10,
initialText: AppContextManager.shared.name
) { [weak self] text in
self?.requestSetNickName(text)
}
present(vc, animated: true)
}
@objc private func handleGenderTap() {
let pop = GenderSelectPopVC(currentSex: AppContextManager.shared.sex) { [weak self] sex in
self?.requestSetGender(sex)
}
present(pop, animated: true)
}
private func requestSetHeadPic(_ headPic: String) {
DLToast.showLoading()
UserService.setHeadPic(headPic: headPic).subscribe(onNext: { [weak self] _ in
DLToast.show(text: "更换成功")
if var account = AppContextManager.shared.account {
account.head_pic = headPic
account.avater = HeadPic.isRemote(headPic) ? headPic : ""
AppContextManager.shared.saveAccount(account)
}
self?.rootView.refreshProfile()
NotificationCenter.default.post(name: .RefreshUserConfigNotification, object: nil)
}, onError: { error in
DLToast.dismiss()
DLToast.show(text: error.localizedDescription)
}).disposed(by: disposeBag)
}
private func requestSetNickName(_ name: String) {
let trimmed = name.trimmingCharacters(in: .whitespacesAndNewlines)
guard !trimmed.isEmpty else { return }
DLToast.showLoading()
UserService.setNickName(nick: trimmed).subscribe(onNext: { [weak self] _ in
DLToast.show(text: "修改成功")
if var account = AppContextManager.shared.account {
account.name = trimmed
AppContextManager.shared.saveAccount(account)
}
self?.rootView.refreshProfile()
NotificationCenter.default.post(name: .RefreshUserConfigNotification, object: nil)
}, onError: { error in
DLToast.dismiss()
DLToast.show(text: error.localizedDescription)
}).disposed(by: disposeBag)
}
private func requestSetGender(_ sex: Int) {
DLToast.showLoading()
UserService.setGender(sex: sex).subscribe(onNext: { [weak self] _ in
DLToast.show(text: "修改成功")
if var account = AppContextManager.shared.account {
account.sex = sex
AppContextManager.shared.saveAccount(account)
}
self?.rootView.refreshProfile()
NotificationCenter.default.post(name: .RefreshUserConfigNotification, object: nil)
}, onError: { error in
DLToast.dismiss()
DLToast.show(text: error.localizedDescription)
}).disposed(by: disposeBag)
}
// MARK: - API
private func requestLogout() {
DLToast.showLoading()
UserService.logout().subscribe(onNext: { response in
DLToast.dismiss()
NotificationCenter.default.post(name: .invalidatePopupQueue, object: nil)
GeYanSdk.deletePreResultCache()
AppContextManager.shared.deleteAccount()
GroupIMService.shared.logout()
AppDelegate.shared.showMainViewController()
}, onError: { _ in }).disposed(by: disposeBag)
}
private func deleteAccount() {
DLToast.showLoading()
UserService.deleteAccount().subscribe(onNext: { response in
DLToast.show(text: "申请成功") {
NotificationCenter.default.post(name: .invalidatePopupQueue, object: nil)
GeYanSdk.deletePreResultCache()
AppContextManager.shared.deleteAccount()
GroupIMService.shared.logout()
AppDelegate.shared.showMainViewController()
}
}, onError: { _ in }).disposed(by: disposeBag)
}
@objc private func handleClearCacheTap() {
clearCache()
}
@objc private func handleVersionViewTap() {
guard let upgrade = AppContextManager.shared.systemConfig?.versionUpgradeModel else {
DLToast.show(text: "已是最新版本")
return
}
self.showConfirmPop(
showCloseBtn: !upgrade.force,
title: upgrade.title,
message: upgrade.description,
confirmText: "立即更新",
confirmBlock: {
if let url = URL(string: upgrade.url) {
UIApplication.shared.open(url)
}
},
cancelText: upgrade.force ? nil : "稍后再说",
cancelBlock: nil
)
}
private func clearCache() {
DLToast.showLoading()
KingfisherManager.shared.cache.clearMemoryCache()
KingfisherManager.shared.cache.clearDiskCache {
AppCacheManager.clearCache {
DispatchQueue.main.async {
DLToast.dismiss()
DLToast.show(text: "缓存已清除")
self.rootView.cacheLab.text = "0 B"
}
}
}
}
}