259 lines
9.0 KiB
Swift
259 lines
9.0 KiB
Swift
//
|
||
// MeRootPageController.swift
|
||
// Crush
|
||
//
|
||
// Created by Leon on 2025/7/22.
|
||
//
|
||
|
||
import UIKit
|
||
import TZImagePickerController
|
||
class MeRootPageController: CLTabRootController<MeRootPageView> {
|
||
var settingButton: EPIconGhostButton!
|
||
|
||
private var lastRequestDate: Date?
|
||
|
||
var uploadingAvatar : UploadPhotoM?
|
||
|
||
override func viewDidLoad() {
|
||
super.viewDidLoad()
|
||
|
||
setupViews()
|
||
setupDats()
|
||
setupEvents()
|
||
}
|
||
|
||
override func viewDidAppear(_ animated: Bool) {
|
||
super.viewDidAppear(animated)
|
||
controlRequestUserInfo()
|
||
}
|
||
|
||
private func controlRequestUserInfo() {
|
||
let now = Date()
|
||
if let lastDate = lastRequestDate {
|
||
let interval = now.timeIntervalSince(lastDate)
|
||
if interval < 30 {
|
||
//30s
|
||
return
|
||
}
|
||
}
|
||
|
||
// 超过30秒或第一次出现,可以请求
|
||
loadUserInfo()
|
||
loadAIRoleList()
|
||
|
||
lastRequestDate = now
|
||
}
|
||
|
||
private func setupViews() {
|
||
navigationView.bgView.alpha = 0
|
||
|
||
// title = nickname
|
||
settingButton = {
|
||
let v = EPIconGhostButton(radius: .none, iconSize: .medium, iconCode: .iconSetting)
|
||
v.addTarget(self, action: #selector(settingAction), for: .touchUpInside)
|
||
navigationView.rightStackH.addArrangedSubview(v)
|
||
v.snp.makeConstraints { make in
|
||
make.size.equalTo(CGSize(width: 44, height: 44))
|
||
}
|
||
return v
|
||
}()
|
||
|
||
#if DEBUG
|
||
if APIConfig.environment == .test{
|
||
let debugButton = {
|
||
let v = UIButton()
|
||
v.setTitle("Debug Entrances", for: .normal)
|
||
v.titleLabel?.font = .t.tlm
|
||
v.setTitleColor(.yellow, for: .normal)
|
||
v.layer.borderColor = UIColor.yellow.cgColor
|
||
v.layer.borderWidth = 1
|
||
v.addTarget(self, action: #selector(tapDebugButton), for: .touchUpInside)
|
||
navigationView.addSubview(v)
|
||
v.snp.makeConstraints { make in
|
||
make.leading.equalToSuperview().offset(24)
|
||
make.height.equalTo(30)
|
||
make.centerY.equalTo(navigationView.backButton)
|
||
}
|
||
return v
|
||
}()
|
||
debugButton.isHidden = false
|
||
}
|
||
#endif
|
||
}
|
||
|
||
private func setupDats() {
|
||
// See controlRequestUserInfo
|
||
}
|
||
|
||
private func setupEvents() {
|
||
NotificationCenter.default.addObserver(self, selector: #selector(notiAIRoleAddOrDelete), name: AppNotificationName.aiRoleCreatedOrDelete.notificationName, object: nil)
|
||
NotificationCenter.default.addObserver(self, selector: #selector(notificationAIRoleInfoUpdated(noti:)), name: AppNotificationName.aiRoleInfoChanged.notificationName, object: nil)
|
||
NotificationCenter.default.addObserver(self, selector: #selector(logOut), name: AppNotificationName.userLogout.notificationName, object: nil)
|
||
NotificationCenter.default.addObserver(self, selector: #selector(login), name: AppNotificationName.userLoginSuccess.notificationName, object: nil)
|
||
NotificationCenter.default.addObserver(self, selector: #selector(notifyUserInfoChanged), name: AppNotificationName.userInfoUpdated.notificationName, object: nil)
|
||
|
||
//container.headerView.avatarTopButton.addTarget(self, action: #selector(tapAvatarTopButton), for: .touchUpInside)
|
||
container.tapAvatarAction = {[weak self] in
|
||
self?.tapAvatarTopButton()
|
||
}
|
||
}
|
||
|
||
private func loadUserInfo() {
|
||
UserCore.shared.refreshUserInfo { _ in
|
||
}
|
||
}
|
||
|
||
private func loadAIRoleList() {
|
||
AIRoleProvider.request(.aiRoleListOfMine, modelType: [AIRoleInfo].self) { [weak self] result in
|
||
switch result {
|
||
case let .success(success):
|
||
self?.container.config(datas: success)
|
||
// self?.container.headerView.setupRoleCount(valid: success?.count ?? 0, total: 10)
|
||
case let .failure(failure):
|
||
dlog(failure)
|
||
}
|
||
}
|
||
}
|
||
|
||
// MARK: - Events
|
||
|
||
@objc private func settingAction() {
|
||
let vc = SettingListController()
|
||
navigationController?.pushViewController(vc, animated: true)
|
||
}
|
||
|
||
@objc private func tapDebugButton() {
|
||
UIWindow.getTopViewController()?.navigationController?.pushViewController(TestEntrancesController(), animated: true)
|
||
}
|
||
|
||
@objc private func tapAvatarTopButton(){
|
||
guard let picker = ImagePicker(maxImagesCount: 1, delegate: self) else { return }
|
||
picker.allowPickingGif = false
|
||
picker.showSelectBtn = false
|
||
picker.needCircleCrop = true
|
||
|
||
picker.cropRect = CGRect(origin: .init(x: 0, y: 0), size: CGSize(width: UIScreen.width, height: UIScreen.height))
|
||
picker.circleCropRadius = Int((UIScreen.width - 37*2) * 0.5)
|
||
present(picker, animated: true, completion: nil)
|
||
}
|
||
|
||
// MARK: - Functions
|
||
|
||
func updateHeadImage(headUrlString: String?, completion: ((Bool)->Void)? = nil){
|
||
guard let avatar = headUrlString else { return }
|
||
var params = [String:Any]()
|
||
params.updateValue(UserCore.shared.user!.userId, forKey: "userId")
|
||
params.updateValue(avatar, forKey: "headImage")
|
||
Hud.showIndicator()
|
||
UserProvider.request(.userInfoEdit(params: params), modelType: String.self) {[weak self] result in
|
||
Hud.hideIndicator()
|
||
switch result {
|
||
case .success:
|
||
self?.uploadingAvatar = nil
|
||
UserCore.shared.refreshUserInfo(block: nil)
|
||
completion?(true)
|
||
case .failure:
|
||
completion?(false)
|
||
}
|
||
}
|
||
}
|
||
|
||
// MARK: - Notification
|
||
|
||
@objc private func notiAIRoleAddOrDelete(){
|
||
loadAIRoleList()
|
||
}
|
||
|
||
@objc private func notificationAIRoleInfoUpdated(noti: Notification) {
|
||
loadAIRoleList()
|
||
}
|
||
|
||
@objc private func notifyUserInfoChanged(){
|
||
|
||
}
|
||
|
||
@objc private func logOut(){
|
||
container.config(datas: [])
|
||
}
|
||
|
||
@objc private func login(){
|
||
loadAIRoleList()
|
||
}
|
||
}
|
||
|
||
extension MeRootPageController : TZImagePickerControllerDelegate{
|
||
func imagePickerController(_: TZImagePickerController!,
|
||
didFinishPickingPhotos photos: [UIImage]!,
|
||
sourceAssets _: [Any]!,
|
||
isSelectOriginalPhoto _: Bool,
|
||
infos _: [[AnyHashable: Any]]!)
|
||
{
|
||
guard let img = photos.first else {
|
||
return
|
||
}
|
||
|
||
// Crop Avatar
|
||
let cropViewController = CropViewController(image: img) { [unowned self] croppedImage in
|
||
|
||
self.container.headerView.avatarView.bindImage(img: croppedImage, showUploading: true)
|
||
|
||
// 裁剪后的图片
|
||
let photo = UploadPhotoM()
|
||
photo.image = croppedImage
|
||
photo.imageSize = croppedImage?.size ?? CGSizeZero
|
||
photo.addThisItemTimeStamp = Date().timeStamp
|
||
photo.delegate = self
|
||
uploadingAvatar = photo
|
||
|
||
CloudStorage.shared.s3AddPhotos([photo], bucket: .HEAD_IMAGE)
|
||
}
|
||
let navc = CLNavigationController(rootViewController: cropViewController)
|
||
UIWindow.getTopViewController()?.present(navc, animated: true, completion: nil)
|
||
|
||
// let model = UploadPhotoM()
|
||
// model.image = img
|
||
// model.imageSize = img.size
|
||
// model.addThisItemTimeStamp = Date().timeStamp
|
||
// model.delegate = self
|
||
// uploadingAvatar = model
|
||
//
|
||
// self.container.headerView.avatarView.bindImage(img: img, showUploading: true)
|
||
//
|
||
// CloudStorage.shared.s3AddPhotos([model], bucket: .HEAD_IMAGE)
|
||
|
||
|
||
}
|
||
}
|
||
|
||
extension MeRootPageController:UploadPhotoDelegate{
|
||
func uploadFailWith(_ photo: UploadPhotoM) {
|
||
dlog("👮upload failed: \(photo)")
|
||
self.container.headerView.avatarView.bindImage(img: nil)
|
||
}
|
||
|
||
func uploadProgress(_ progress: Float) {
|
||
dlog("👮progress \(progress)")
|
||
}
|
||
|
||
func uploadDoneWith(_ photo: UploadPhotoM){
|
||
dlog("👮上传成功: \(photo.remoteFullPath ?? ""), remoteImageUrlString \(photo.remoteImageUrlString ?? "")")
|
||
}
|
||
|
||
func imageCheck(_ photoM: UploadPhotoM, result: Bool){
|
||
dlog("👮鉴黄结果:\(result)")
|
||
|
||
if(result){
|
||
// self.headView.bindImageUrl(imgUrl: photoM.remoteFullPath)
|
||
// 上传到s3... 并修改个人信息
|
||
self.updateHeadImage(headUrlString: photoM.remoteFullPath) {[weak self] result in
|
||
if result{
|
||
self?.container.headerView.avatarView.bindImageUrl(imgUrl: photoM.remoteFullPath)
|
||
}
|
||
}
|
||
}else{
|
||
self.container.headerView.avatarView.bindImageUrl(imgUrl: UserCore.shared.user?.headImage)
|
||
}
|
||
|
||
}
|
||
}
|