// // AccountVC.swift // QuickLocation // // Created by 八条 on 2026/6/10. // import UIKit import RxSwift import RxCocoa import RxDataSources import Kingfisher import SwiftyUserDefaults #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(error) }).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(error) }).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(error) }).disposed(by: disposeBag) } // MARK: - API private func requestLogout() { UserService.logout().subscribe(onNext: { response in NotificationCenter.default.post(name: .invalidatePopupQueue, object: nil) GeYanSdk.deletePreResultCache() AppContextManager.shared.deleteAccount() GroupIMService.shared.logout() self.requestUserConfig() }, onError: { _ in }).disposed(by: disposeBag) } private func requestUserConfig() { DLToast.showLoading() SystemService.userConfig().subscribe(onNext: { response in guard let model = response.model else { return } Defaults[\.loginToken] = model.token AppContextManager.shared.systemConfig = model.config DLToast.dismiss { 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 } showVersionUpgradePop(upgrade: upgrade) } 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" } } } } }