// // AvatarIconListVC.swift // QuickLocation // // Created by 八条 on 2026/6/11. // import UIKit import RxSwift import RxCocoa class AvatarIconListVC: BaseViewController { fileprivate var rootView: AvatarIconListView! override func loadView() { rootView = AvatarIconListView(frame: UIScreen.main.bounds) view = rootView } private var iconIndex: String var onSelectIcon: ((String) -> Void)? override func viewDidLoad() { super.viewDidLoad() rootView.configure(headPic: iconIndex) rootView.saveBtn.isHidden = true rootView.saveBtn.rx.tap.subscribe(onNext: { [weak self] _ in guard let self else { return } let selected = self.rootView.selectedHeadPic guard !selected.isEmpty else { return } self.onSelectIcon?(selected) }).disposed(by: disposeBag) rootView.onBadgeTap = { [weak self] in self?.showUploadPicker() } rootView.onIconSelected = { [weak self] in self?.rootView.saveBtn.isHidden = false } } private func showUploadPicker() { PigeonUploadPopView.show( onAlbum: { [weak self] in self?.openAlbumPicker() }, onCamera: { [weak self] in self?.openCamera() } ) } private func openAlbumPicker() { let picker = PhotoPickerVC(maxCount: 1) picker.onConfirm = { [weak self] images in guard let image = images.first else { return } self?.uploadAndChangeAvatar(image) } present(picker, animated: true) } private func openCamera() { guard UIImagePickerController.isSourceTypeAvailable(.camera) else { DLToast.showError(text: "当前设备不支持拍照") return } let vc = CameraCaptureVC(mode: .photo) vc.onPhoto = { [weak self] image in self?.dismiss(animated: true) { self?.uploadAndChangeAvatar(image) } } vc.modalPresentationStyle = .fullScreen present(vc, animated: true) } private func uploadAndChangeAvatar(_ image: UIImage) { guard let jpeg = image.jpegData(compressionQuality: 0.8) else { DLToast.show(text: "图片处理失败") return } DLToast.showLoading() UploadService.uploadURL(jpeg, kind: .jpeg, scene: "avatar") .subscribe(onNext: { [weak self] url in guard let self else { return } self.rootView.setPreviewImage(image) self.rootView.saveBtn.isHidden = true self.onSelectIcon?(url) }, onError: { error in DLToast.show(error, fallbackText: "更换失败") }) .disposed(by: disposeBag) } // MARK: - Init init(iconIndex: String) { self.iconIndex = iconIndex super.init(nibName: nil, bundle: nil) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } }