ProfileView.swift 8.9 KB
//
//  ProfileView.swift
//  AoleiSports
//
//  Created by ilCode on 2024/6/12.
//

import UIKit

@objc protocol ProfileViewDelegate {
    func tapHeader()
    func didSelectRow(indexPath: IndexPath)
    func tapLogout()
}

class ProfileView: UIView {
    weak var delegate: ProfileViewDelegate?
    
    private let disposeBag = DisposeBag()
    
    private lazy var userIV: UIImageView = {
        let iv = UIImageView(image: R.image.default_user())
        iv.border(borderColor: kWhite, borderWidth: 1)
        iv.corners(radius: 40)
        return iv
    }()
    
    private lazy var nameLab: UILabel = {
        let lab = UILabel()
        lab.font = kFontSize(18)
        lab.textColor = kWhite
        return lab
    }()
    
    private lazy var welLab: UILabel = {
        let lab = UILabel()
        lab.font = kFontSize(14)
        lab.textColor = kWhite
        lab.text = "欢迎来到傲雷体育"
        return lab
    }()
    
    private lazy var gradientLayer: CAGradientLayer = {
        let layer = CAGradientLayer()
        
        let colorTop = UIColor.colorWith(hexString: "4EA6FF").cgColor
        let colorBottom = UIColor.colorWith(hexString: "7CD4FF").cgColor
        layer.colors = [colorTop, colorBottom]
        
        layer.startPoint = CGPoint(x: 0, y: 0)
        layer.endPoint = CGPoint(x: 1, y: 0)
        
        return layer
    }()
    
    private lazy var headView: UIView = {
        let view = UIView()
        view.rx.tapGesture()
            .subscribe(onNext: { [weak self] _ in
                guard let self = self else { return }
                self.delegate?.tapHeader()
            })
            .disposed(by: disposeBag)
        return view
    }()
    
    private lazy var logoutBtn: UIButton = {
        let btn = UIButton(frame: CGRect(x: 15, y: 20, width: kScreenW - 30, height: 40))
        btn.setTitle("退出登录", for: .normal)
        btn.setTitleColor(kMainTitleColor, for: .normal)
        btn.backgroundColor = kWhite
        btn.rx.tap.subscribe(onNext: { [weak self] in
            guard let self = self else { return }
            self.delegate?.tapLogout()
        }).disposed(by: disposeBag)
        btn.corners(radius: 5)
        return btn
    }()
    
    private lazy var footView: UIView = {
        let view = UIView(frame: CGRect(x: 0, y: 0, width: kScreenW, height: 80))
        view.addSubview(logoutBtn)
        return view
    }()
    
    private lazy var profileTV: UITableView = {
        let tv = UITableView.init(frame: CGRectZero, style: .plain)
        tv.backgroundColor = kMainBgColor
        tv.contentInsetAdjustmentBehavior = .never
        tv.rowHeight = 60
        tv.dataSource = self
        tv.delegate = self
        tv.tableFooterView = footView
        tv.register(ProfileItemCell.self, forCellReuseIdentifier: "ProfileItemCell")
        return tv
    }()
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        setupView()
        
        UserManager.shared.userModel
            .observe(on: MainScheduler.instance)
            .subscribe(onNext: { [weak self] userModel in
                guard let self = self else { return }
                self.updateView(userModel: userModel)
            })
            .disposed(by: disposeBag)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        
        gradientLayer.frame = headView.bounds
    }
}

extension ProfileView {
    private func setupView() {
        addSubview(headView)
        addSubview(profileTV)
        
        headView.layer.addSublayer(gradientLayer)
        headView.addSubview(userIV)
        headView.addSubview(nameLab)
        headView.addSubview(welLab)
        
        layoutUI()
    }
    
    private func layoutUI() {
        headView.snp.makeConstraints { make in
            make.top.left.right.equalToSuperview()
            make.height.equalTo(160)
        }
        
        profileTV.snp.makeConstraints { make in
            make.top.equalTo(headView.snp.bottom).offset(10)
            make.left.right.equalToSuperview()
            make.bottom.equalTo(safeAreaLayoutGuide)
        }
        
        userIV.snp.makeConstraints { make in
            make.top.equalToSuperview().offset(kStatusBarH + (160 - kStatusBarH - 80)/2.0)
            make.size.equalTo(CGSize(width: 80, height: 80))
            make.left.equalToSuperview().offset(30)
        }
        
        nameLab.snp.makeConstraints { make in
            make.left.equalTo(userIV.snp.right).offset(20)
            make.top.equalTo(userIV).offset(15)
        }
        
        welLab.snp.makeConstraints { make in
            make.left.equalTo(userIV.snp.right).offset(20)
            make.bottom.equalTo(userIV).offset(-15)
        }
    }
    
    private func updateView(userModel: UserModel?) {
        if let model = userModel {
            if let mobile = model.usrName, mobile.count == 11 {
                let start = mobile.startIndex
                let midStart = mobile.index(start, offsetBy: 3)
                let midEnd = mobile.index(start, offsetBy: 7)
                let maskedMobile = mobile.replacingCharacters(in: midStart..<midEnd, with: "****")
                nameLab.text = maskedMobile
            } else {
                nameLab.text = model.usrName ?? ""
            }
            
            userIV.kf.setImage(with: URL(string: UserModel.portraitUrl(code: model.faceImageCode)), placeholder: R.image.default_user())
            logoutBtn.isHidden = false
            return
        }
        nameLab.text = "登录/注册"
        userIV.image = R.image.default_user()
        logoutBtn.isHidden = true
    }
}

extension ProfileView: UITableViewDataSource, UITableViewDelegate {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return ProfileModel.profileModels.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let model = ProfileModel.profileModels[indexPath.row]
        let cell = tableView.dequeueReusableCell(withIdentifier: "ProfileItemCell", for: indexPath) as! ProfileItemCell
        cell.model = model
        return cell
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
        delegate?.didSelectRow(indexPath: indexPath)
    }
}

//MARK: - ProfileItemCell
class ProfileItemCell: BaseTableViewCell {
    private lazy var typeIcon: UIImageView = {
        let iv = UIImageView()
        return iv
    }()
    
    private lazy var titleLab: UILabel = {
        let lab = UILabel()
        return lab
    }()
    
    private lazy var detailLab: UILabel = {
        let lab = UILabel()
        lab.textAlignment = .right
        return lab
    }()
    
    private lazy var rightIcon: UIImageView = {
        let iv = UIImageView(image: R.image.right_arrow_icon())
        return iv
    }()
    
    private lazy var sepLine: UIView = {
        let line = UIView.divider()
        return line
    }()
    
    var model: ProfileModel? {
        didSet {
            typeIcon.image = model?.icon
            titleLab.text = model?.title
            detailLab.text = model?.detail
            rightIcon.isHidden = model?.itemType != .privacy
            sepLine.isHidden = model?.itemType == .cache
        }
    }
    
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        
        selectionStyle = .default
        
        contentView.addSubview(typeIcon)
        contentView.addSubview(titleLab)
        contentView.addSubview(detailLab)
        contentView.addSubview(rightIcon)
        contentView.addSubview(sepLine)
        
        layoutUI()
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    private func layoutUI() {
        typeIcon.snp.makeConstraints { make in
            make.centerY.equalToSuperview()
            make.left.equalToSuperview().offset(15)
            make.size.equalTo(CGSize(width: 30, height: 30))
        }
        
        titleLab.snp.makeConstraints { make in
            make.centerY.equalToSuperview()
            make.left.equalTo(typeIcon.snp.right).offset(10)
        }
        
        rightIcon.snp.makeConstraints { make in
            make.centerY.equalToSuperview()
            make.right.equalToSuperview().offset(-15)
            make.size.equalTo(CGSize(width: 19, height: 19))
        }
        
        detailLab.snp.makeConstraints { make in
            make.centerY.equalToSuperview()
            make.right.equalToSuperview().offset(-15)
        }
        
        sepLine.snp.makeConstraints { make in
            make.bottom.equalToSuperview()
            make.left.right.equalToSuperview()
            make.height.equalTo(1)
        }
    }
}