//
|
// HomeVC.swift
|
// XQMuse
|
//
|
// Created by 无故事王国 on 2024/8/12.
|
//
|
|
import UIKit
|
import JQTools
|
import RxSwift
|
import MediaPlayer
|
import MJRefresh
|
import SDWebImage
|
|
let SetBGMSuccess_Noti = Notification.Name.init("SetBGMSuccess_Noti")
|
|
struct TitleItem{
|
var id = 0
|
var title = ""
|
var subTitle = ""
|
var hasMore:Bool = false
|
var coverImage:String?
|
}
|
|
class HomeViewModel{
|
var homeTopMenuItems = [HomeTopMenuItem]()
|
var homeBottomMenuItems = [HomeTopMenuItem]()
|
var todyModel:MeditationModel?
|
var privateTodyModels = [MeditationModel]()
|
var meditationList = [MeditationListModel]()
|
}
|
|
class HomeVC: BaseVC {
|
private var tableView:UITableView!
|
private let topMenuView = HomeTopMenuView.jq_loadNibView()
|
private var titleItems = [TitleItem]()
|
private var viewModel = HomeViewModel()
|
|
override func viewDidLoad() {
|
super.viewDidLoad()
|
|
titleItems.removeAll()
|
|
titleItems.append(TitleItem(title: "每日疗愈", subTitle: "Daily Meditation"))
|
titleItems.append(TitleItem(title: "私人订制", subTitle: "Private Customization",hasMore: true))
|
titleItems.append(TitleItem(title: "新手冥想指南", subTitle: "Meditation guide"))
|
|
if let setting = UserDefaultSettingViewModel.getSetting(){
|
if let audioFile = setting.bgm?.audioFile{
|
AudioPlayer.getSharedInstance().playSceneAt(audioFile)
|
}
|
}
|
|
tableView.mj_header = MJRefreshNormalHeader(refreshingBlock: {
|
self.getData()
|
})
|
|
if let m = UserDefaultSettingViewModel.getSetting()?.bgm {
|
topMenuView.image_top.sd_setImage(with: URL(string: m.imageUrl))
|
}
|
|
getData()
|
}
|
|
override func setUI() {
|
super.setUI()
|
|
let titleView = UIView()
|
titleView.frame = CGRect(x: 0, y: 0, width: 100, height: 40)
|
let titleL = UILabel()
|
titleL.font = Def_SourceHanSansCN_Regular(fontSize: 21)
|
titleL.text = "心 泉 疗 愈"
|
titleL.textAlignment = .center
|
titleL.textColor = UIColor(hexStr: "#252A23")
|
titleL.frame = CGRect(x: 0, y: 0, width: 100, height: 19)
|
|
let subTitleL = UILabel()
|
subTitleL.font = Def_Agenda_Light(fontSize: 8)
|
subTitleL.text = "XIN QUAN"
|
subTitleL.textAlignment = .center
|
subTitleL.textColor = UIColor(hexStr: "#252A23")
|
subTitleL.frame = CGRect(x: 0, y: 20, width: 100, height: 19)
|
|
|
titleView.addSubview(titleL)
|
titleView.addSubview(subTitleL)
|
|
|
navigationItem.titleView = titleView
|
|
let search = UIButton(type: .custom)
|
search.setImage(UIImage(named: "btn_search"), for: .normal)
|
search.addTarget(self, action: #selector(searchAction), for: .touchUpInside)
|
search.bounds = CGRect(origin: .zero, size:CGSize(width: 50, height: 30))
|
navigationItem.leftBarButtonItem = UIBarButtonItem(customView: search)
|
|
|
let voices = UIButton(type: .custom)
|
voices.setImage(UIImage(named: "btn_voices"), for: .normal)
|
voices.addTarget(self, action: #selector(settingvoiceAction), for: .touchUpInside)
|
voices.bounds = CGRect(origin: .zero, size:CGSize(width: 50, height: 30))
|
navigationItem.rightBarButtonItem = UIBarButtonItem(customView: voices)
|
|
tableView = UITableView(frame: .zero, style: .plain)
|
tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 40, right: 0)
|
tableView.showsVerticalScrollIndicator = false
|
DispatchQueue.main.async {
|
let h = 119 + 20.5 + JQ_ScreenW * 0.913
|
self.topMenuView.frame = CGRect(x: 0, y: 0, width: JQ_ScreenW, height: h)
|
self.tableView.tableHeaderView = self.topMenuView
|
}
|
|
tableView.tableHeaderView = topMenuView
|
|
tableView.register(UINib(nibName: "Home_Style_1_TCell", bundle: nil), forCellReuseIdentifier: "_Home_Style_1_TCell")
|
tableView.register(UINib(nibName: "Home_Style_2_TCell", bundle: nil), forCellReuseIdentifier: "_Home_Style_2_TCell")
|
tableView.register(UINib(nibName: "Home_Style_3_TCell", bundle: nil), forCellReuseIdentifier: "_Home_Style_3_TCell")
|
tableView.register(UINib(nibName: "Home_Style_4_TCell", bundle: nil), forCellReuseIdentifier: "_Home_Style_4_TCell")
|
|
tableView.register(UINib(nibName: "Home_Style_5_TCell", bundle: nil), forCellReuseIdentifier: "_Home_Style_5_TCell")
|
|
tableView.separatorStyle = .none
|
tableView.delegate = self
|
tableView.dataSource = self
|
if #available(iOS 15.0, *) {
|
tableView.sectionHeaderTopPadding = 0
|
} else {
|
|
}
|
tableView.register(HomeHeaderView.self, forHeaderFooterViewReuseIdentifier: "_HomeHeaderView")
|
view.addSubview(tableView)
|
tableView.snp.makeConstraints { make in
|
make.edges.equalToSuperview()
|
}
|
}
|
|
override func setRx() {
|
topMenuView.clickItemAt {[unowned self] item in
|
let vc = HomeItemListVC(topTitle: item.title, id: item.id)
|
self.push(vc: vc)
|
}
|
|
NotificationCenter.default.rx.notification(SetBGMSuccess_Noti).take(until: self.rx.deallocated).subscribe(onNext: {data in
|
self.topMenuView.resetTopImage()
|
}).disposed(by: disposeBag)
|
|
NotificationCenter.default.rx.notification(PlantGuideQuit_Noti).take(until: self.rx.deallocated).subscribe(onNext: {data in
|
self.getData()
|
if UserDefaultSettingViewModel.getSetting()?.userFirstOpenTreeTask ?? true{
|
self.navigationController?.tabBarController?.selectedIndex = 2
|
}
|
}).disposed(by: disposeBag)
|
|
NotificationCenter.default.rx.notification(LoginSuccess_Noti).take(until: self.rx.deallocated).subscribe(onNext: {data in
|
self.getData()
|
}).disposed(by: disposeBag)
|
}
|
|
private func getData(){
|
tableView.mj_header?.endRefreshing()
|
|
Services.getCategoryListByType(type: 1).subscribe(onNext: { data in
|
var items = [HomeTopMenuItem]()
|
for v in data.data ?? []{
|
let model = HomeTopMenuItem(id: v.id, title: v.categoryName, image: v.firstIconUrl.jq_urlEncoded(), imageFrom: .url)
|
items.append(model)
|
}
|
|
self.viewModel.homeTopMenuItems = items
|
let h = ceil(Double(items.count) / 4.0) * 119 + 20.5 + JQ_ScreenW * 0.913
|
self.topMenuView.menu_height.constant = ceil(Double(items.count) / 4.0) * 119
|
self.tableView.tableHeaderView?.frame = CGRect(origin: .zero, size: CGSizeMake(JQ_ScreenW, h))
|
self.topMenuView.resetItems(items)
|
self.topMenuView.menu_collectionView.reloadData()
|
}).disposed(by: disposeBag)
|
|
Services.getCategoryListByType(type: 2).subscribe(onNext: { data in
|
var items = [HomeTopMenuItem]()
|
for v in data.data ?? []{
|
let model = HomeTopMenuItem(id: v.id, title: v.categoryName, image: v.secondIconUrl.jq_urlEncoded(), imageFrom: .url)
|
items.append(model)
|
}
|
self.viewModel.homeBottomMenuItems = items
|
self.tableView.reloadRows(at: [IndexPath(row: 4, section: 0)], with: .none)
|
}).disposed(by: disposeBag)
|
|
Services.getTopdayMedita().subscribe(onNext: { data in
|
self.viewModel.todyModel = data.data?.clientMeditationVO
|
self.tableView.reloadRows(at: [IndexPath(row: 0, section: 0)], with: .none)
|
}).disposed(by: disposeBag)
|
|
Services.getPersonalityPlan().subscribe(onNext: { data in
|
if let m = data.data{
|
if m.count > 0{
|
self.viewModel.privateTodyModels = m
|
}else{
|
let m = MeditationModel()
|
m.id = 0
|
self.viewModel.privateTodyModels = [m]
|
}
|
self.tableView.reloadRows(at: [IndexPath(row: 1, section: 0)], with: .none)
|
}
|
}).disposed(by: disposeBag)
|
|
Services.getMeditationAndCateList().subscribe(onNext: { data in
|
if let m = data.data{
|
self.viewModel.meditationList.removeAll()
|
self.titleItems.removeAll()
|
self.titleItems.append(TitleItem(title: "每日疗愈", subTitle: "Daily Meditation"))
|
self.titleItems.append(TitleItem(title: "私人订制", subTitle: "Private Customization",hasMore: true))
|
self.titleItems.append(TitleItem(title: "新手冥想指南", subTitle: "Meditation guide"))
|
|
|
self.viewModel.meditationList = m
|
for v in self.viewModel.meditationList{
|
if v.clientMeditationCategoryVO?.categoryName.isEmpty ?? true{continue}
|
self.titleItems.append(TitleItem(title: v.clientMeditationCategoryVO?.categoryName ?? "", subTitle: v.clientMeditationCategoryVO?.description ?? "",hasMore:true))
|
}
|
self.tableView.reloadData()
|
}
|
}).disposed(by: disposeBag)
|
|
Services.getLunchPage().subscribe(onNext: {data in
|
|
if let url = data.data{
|
let path = DocumentPath! + "/launchScreen/"
|
let image = SDImageCache(namespace: url.jq_md5String(), diskCacheDirectory: path)
|
let loader = SDImageLoadersManager.shared
|
let manager = SDWebImageManager(cache: image, loader: loader)
|
|
//不存在缓存
|
if image.imageFromDiskCache(forKey: url) == nil{
|
manager.loadImage(with: URL(string: url), progress: nil) { image, _, _, _, complete, _ in
|
LaunchImageHelper.changeAllLaunchImageToPortrait(image)
|
}
|
}
|
else{
|
//取缓存
|
if let data = image.diskImageData(forKey: url){
|
let image = UIImage(data: data)
|
LaunchImageHelper.changeAllLaunchImageToPortrait(image)
|
}
|
}
|
}
|
|
}).disposed(by: disposeBag)
|
}
|
|
@objc func searchAction(){
|
let vc = SearchVC(serchType: .muse)
|
push(vc: vc)
|
}
|
|
@objc func settingvoiceAction(){
|
let vc = BackgroundVoiceVC()
|
push(vc: vc)
|
}
|
|
@objc func jumpMoreAction(_ sender:UIButton){
|
switch sender.tag {
|
case 201:
|
guard sceneDelegate!.checkisLoginState() else {return}
|
//跳转计划引导
|
let nav = BaseNav(rootViewController: PlanGuideVC())
|
nav.modalPresentationStyle = .fullScreen
|
present(nav, animated: true)
|
break
|
default:
|
let topTitle = titleItems[sender.tag - 200].title
|
let m = viewModel.meditationList[sender.tag - 200 - 3]
|
if let id = m.clientMeditationCategoryVO?.id{
|
let vc = HomeItemListVC(topTitle: topTitle, id: id)
|
push(vc: vc)
|
}
|
}
|
}
|
}
|
|
extension HomeVC:UITableViewDelegate & UITableViewDataSource{
|
|
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
|
if indexPath.section == 0{
|
if let m = viewModel.todyModel{
|
let vc = HomeItemDetailVC(id: m.id)
|
push(vc: vc)
|
}else{
|
alert(msg: "平台暂未设置今日疗愈")
|
}
|
}
|
|
if indexPath.section == 2{
|
let vc = WebVC(type: .guide)
|
vc.title = "心泉·疗愈"
|
push(vc: vc)
|
}
|
}
|
|
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
if indexPath.section == 0{
|
//每日疗愈
|
let cell = tableView.dequeueReusableCell(withIdentifier: "_Home_Style_1_TCell") as! Home_Style_1_TCell
|
if viewModel.todyModel?.id != 0{
|
cell.model = viewModel.todyModel
|
cell.view_data.isHidden = false
|
}else{
|
cell.img_cover.image = UIImage(named: "bg_today")
|
cell.view_data.isHidden = true
|
}
|
return cell
|
}else if indexPath.section == 1{
|
//私人定制
|
let cell = tableView.dequeueReusableCell(withIdentifier: "_Home_Style_4_TCell") as! Home_Style_4_TCell
|
cell.style = .style1
|
cell.setModels(viewModel.privateTodyModels,showType: .horizontal)
|
return cell
|
}else if indexPath.section == 2{
|
// 新手冥想指南
|
let cell = tableView.dequeueReusableCell(withIdentifier: "_Home_Style_2_TCell") as! Home_Style_2_TCell
|
cell.imgView.image = UIImage(named: "bg_guide_home")
|
cell.view_shadow.isHidden = true
|
return cell
|
}else {
|
|
let index = indexPath.section - 3
|
if index == 0 && indexPath.row != 0{
|
let cell = tableView.dequeueReusableCell(withIdentifier: "_Home_Style_5_TCell") as! Home_Style_5_TCell
|
cell.setHomeTopMenuItem(viewModel.homeBottomMenuItems)
|
return cell
|
}else{
|
let m = viewModel.meditationList[index]
|
if m.clientMeditationCategoryVO!.showType == .horizontal{
|
let cell = tableView.dequeueReusableCell(withIdentifier: "_Home_Style_4_TCell") as! Home_Style_4_TCell
|
cell.style = .style2
|
cell.setModels(m.clientMeditationVOList,showType: .horizontal)
|
return cell
|
}else if m.clientMeditationCategoryVO!.showType == .vertical{
|
let cell = tableView.dequeueReusableCell(withIdentifier: "_Home_Style_3_TCell") as! Home_Style_3_TCell
|
cell.setModels(m.clientMeditationVOList,showType: .vertical)
|
return cell
|
}
|
}
|
return UITableViewCell()
|
}
|
}
|
|
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
|
if section - 3 == 0{
|
return 2
|
}
|
return 1
|
}
|
|
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
|
if indexPath.section == 0 || indexPath.section == 1 || indexPath.section == 2{
|
return JQ_ScreenW * 0.551
|
}else{
|
let index = indexPath.section - 3
|
let m = viewModel.meditationList[index]
|
|
if index == 0 && indexPath.row != 0 {
|
return 236
|
}
|
|
if m.clientMeditationCategoryVO?.showType == .horizontal{
|
return 328
|
}else{
|
return 213
|
}
|
}
|
}
|
|
func numberOfSections(in tableView: UITableView) -> Int {
|
return titleItems.count
|
}
|
|
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
|
return 80.5
|
}
|
|
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
|
let headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: "_HomeHeaderView") as! HomeHeaderView
|
headerView.setTitle(titleItems[section].title, subTitle: titleItems[section].subTitle)
|
headerView.btn_more.isHidden = !titleItems[section].hasMore
|
headerView.btn_more.tag = section + 200
|
headerView.btn_more.addTarget(self, action: #selector(jumpMoreAction(_:)), for: .touchUpInside)
|
|
if section == 1{
|
headerView.btn_more.setImage(UIImage(named: "btn_more"), for: .normal)
|
}else{
|
headerView.btn_more.setImage(UIImage(named: "icon_exchange"), for: .normal)
|
}
|
return headerView
|
}
|
|
|
}
|
|
extension HomeVC:UIScrollViewDelegate{
|
func scrollViewDidScroll(_ scrollView: UIScrollView) {
|
// let v = min(scrollView.contentOffset.y / JQ_NavBarHeight, 1)
|
// navigationController?.navigationBar.standardAppearance.backgroundColor = .white.withAlphaComponent(v)
|
navigationController?.navigationBar.standardAppearance.backgroundColor = .white
|
navigationController?.navigationBar.scrollEdgeAppearance?.backgroundColor = .white
|
}
|
}
|