//
|
// HomeListenFightVC.swift
|
// DolphinEnglishLearnStudent
|
//
|
// Created by 无故事王国 on 2024/5/23.
|
//
|
|
import UIKit
|
import FFPage
|
import RxRelay
|
|
let NextLession_Noti = Notification.Name.init("NextLession_Noti")
|
|
enum ListenType:Int{
|
case lesson1 = 1 //自主学习-听音选图
|
case lesson2 = 2 //自主学习-看图选音
|
case lesson3 = 3 //自主学习-归纳排除
|
case lesson4 = 4 //自主学习-有问有答
|
case lesson5 = 5 //自主学习-音图相配
|
case game1 = 6 //游戏类型-超级听力
|
case game2 = 7 //游戏类型-超级记忆
|
case story1 = 8 //故事类型-自主故事1-看图配音
|
case story2 = 9 //故事类型-自主故事2-框架记忆
|
|
var rawTitle:String{
|
switch self {
|
case .lesson1:return "自主学习1-听音选图"
|
case .lesson2:return "自主学习2-看图选音"
|
case .lesson3:return "自主学习3-归纳排除"
|
case .lesson4:return "自主学习4-有问有答"
|
case .lesson5:return "自主学习5-音图相配"
|
case .game1:return "游戏类型1-超级听力"
|
case .game2:return "游戏类型2-超级记忆"
|
case .story1:return "自主故事1-看图配音"
|
case .story2:return "自主故事2-框架记忆"
|
}
|
}
|
}
|
|
class HomeListenFightViewModel{
|
|
/// 当前页数
|
var currentPage = BehaviorRelay<Int>(value: 0)
|
var maxPage = BehaviorRelay<Int>(value: 5)
|
var listenType = BehaviorRelay<ListenType>(value:.lesson1)
|
var times:Int = 0
|
var quarter = BehaviorRelay<Int?>(value: 0)
|
var week = BehaviorRelay<Int?>(value: 0)
|
|
//游戏专属,游戏等级
|
var gameLevel = BehaviorRelay<Int>(value:0)
|
|
//回答错误数量
|
var correctNum:Int = 0{
|
didSet{
|
print("回答正确:\(correctNum)")
|
}
|
}
|
|
var errorNum:Int = 0{
|
didSet{
|
print("回答错误:\(correctNum)")
|
}
|
}
|
|
//所有回答的
|
var answerItems = Dictionary<Int,Any>() //{page:0,data:String,currectAt:0}
|
}
|
|
class HomeListenFightVC: BaseVC {
|
private var viewModel = HomeListenFightViewModel()
|
var data:Any?
|
|
private lazy var label_pageNum:UILabel = {
|
let label = UILabel()
|
label.font = .systemFont(ofSize: 14, weight: .medium)
|
label.textColor = .black.withAlphaComponent(0.81)
|
label.textAlignment = .center
|
label.text = "已完成:0/0"
|
return label
|
}()
|
|
private lazy var btn_forward:UIButton = {
|
let btn = UIButton(type: .custom)
|
btn.setTitle("上一题", for: .normal)
|
btn.titleLabel?.font = .systemFont(ofSize: 14, weight: .medium)
|
btn.setTitleColor(Config.ThemeColor, for: .normal)
|
btn.jq_borderColor = Config.ThemeColor
|
btn.backgroundColor = .white
|
btn.jq_borderWidth = 1
|
btn.jq_cornerRadius = 4
|
return btn
|
}()
|
|
private lazy var btn_next:UIButton = {
|
let btn = UIButton(type: .custom)
|
btn.setTitle("下一题", for: .normal)
|
btn.titleLabel?.font = .systemFont(ofSize: 14, weight: .medium)
|
btn.setTitleColor(Config.ThemeColor, for: .normal)
|
btn.jq_borderColor = Config.ThemeColor
|
btn.backgroundColor = .white
|
btn.jq_borderWidth = 1
|
btn.jq_cornerRadius = 4
|
return btn
|
}()
|
|
private lazy var btn_exit:UIButton = {
|
let btn = UIButton(type: .custom)
|
btn.setTitle("退出", for: .normal)
|
btn.titleLabel?.font = .systemFont(ofSize: 14, weight: .medium)
|
btn.setTitleColor(.white, for: .normal)
|
btn.backgroundColor = Config.ThemeColor
|
btn.jq_cornerRadius = 4
|
return btn
|
}()
|
|
private lazy var pageVC:FFPageViewController = {
|
let vc = FFPageViewController()
|
vc.scrollview.isScrollEnabled = false
|
vc.prePages = UInt(viewModel.maxPage.value) / 2
|
vc.maxPages = UInt(viewModel.maxPage.value) + 1
|
return vc
|
}()
|
|
private var timer:Timer!
|
|
|
init(listenType:ListenType,quarter:Int? = nil,week:Int? = nil) {
|
super.init(nibName: nil, bundle: nil)
|
self.viewModel.listenType.accept(listenType)
|
self.viewModel.week.accept(week)
|
self.viewModel.quarter.accept(quarter)
|
|
if listenType == .game1 || listenType == .game2{
|
self.viewModel.maxPage.accept(1)
|
}
|
}
|
|
required init?(coder: NSCoder) {
|
fatalError("init(coder:) has not been implemented")
|
}
|
|
override func viewDidLoad() {
|
super.viewDidLoad()
|
|
yy_popBlock = {[weak self] in
|
self?.quitAction()
|
}
|
|
btn_exit.addTarget(self, action: #selector(quitAction), for: .touchUpInside)
|
btn_forward.addTarget(self, action: #selector(beforeAction), for: .touchUpInside)
|
|
|
if viewModel.listenType.value == .game1 || viewModel.listenType.value == .game2{
|
btn_forward.isHidden = true
|
label_pageNum.isHidden = true
|
|
if viewModel.listenType.value == .game1{
|
showGameLevel()
|
}
|
}else{
|
pageVC.reloadData()
|
}
|
|
timer = Timer(fire: .distantPast, interval: 1.0, repeats: true, block: {[weak self] _ in
|
self?.viewModel.times += 1
|
})
|
|
timer.fire()
|
RunLoop.current.add(timer, forMode: .common)
|
}
|
|
override func setUI() {
|
super.setUI()
|
craeteFootFuncView()
|
|
pageVC.delegate = self
|
view.addSubview(pageVC.view)
|
pageVC.view.snp.makeConstraints { make in
|
make.left.right.equalToSuperview()
|
make.top.equalTo(self.view.safeAreaLayoutGuide.snp.top)
|
if self.viewModel.listenType.value == .lesson3 || self.viewModel.listenType.value == .lesson4{
|
make.bottom.equalTo(self.label_pageNum.snp.top).offset(-18)
|
}else{
|
make.bottom.equalTo(self.label_pageNum.snp.top).offset(-32)
|
}
|
}
|
}
|
|
private func showGameLevel(){
|
ChooseLevelView.show {[weak self] level in
|
guard let weakSelf = self else { return }
|
weakSelf.viewModel.gameLevel.accept(level)
|
Services.gameHearing(difficulty: level, quarter: weakSelf.viewModel.quarter.value!, week: weakSelf.viewModel.week.value!).subscribe(onNext: {result in
|
GameBeginTipView.show {
|
if let data = result.data{
|
weakSelf.data = data
|
weakSelf.pageVC.reloadData()
|
}
|
}
|
},onError: { _ in
|
weakSelf.showGameLevel()
|
}).disposed(by: weakSelf.disposeBag)
|
}
|
}
|
|
private func craeteFootFuncView(){
|
|
view.addSubview(label_pageNum)
|
|
view.addSubview(btn_forward)
|
btn_forward.snp.makeConstraints { make in
|
make.height.equalTo(40)
|
make.width.equalTo(124)
|
}
|
|
view.addSubview(btn_exit)
|
btn_exit.snp.makeConstraints { make in
|
make.height.equalTo(40)
|
make.width.equalTo(124)
|
}
|
|
let stackView = UIStackView(arrangedSubviews: [btn_forward,label_pageNum,btn_exit])
|
if viewModel.listenType.value == .story2{
|
btn_next.snp.makeConstraints { make in
|
make.height.equalTo(40)
|
make.width.equalTo(124)
|
}
|
stackView.insertArrangedSubview(btn_next, at: 2)
|
}
|
|
stackView.spacing = 22
|
view.addSubview(stackView)
|
stackView.snp.makeConstraints { make in
|
make.bottom.equalTo(self.view.safeAreaLayoutGuide.snp.bottom).offset(-22)
|
make.centerX.equalToSuperview()
|
make.height.equalTo(40)
|
}
|
}
|
|
override func setRx() {
|
NotificationCenter.default.rx.notification(NextLession_Noti).take(until: self.rx.deallocated).subscribe(onNext: {[weak self] noti in
|
guard let weakSelf = self else { return }
|
let nextPage = weakSelf.viewModel.currentPage.value + 1
|
|
//完成
|
if nextPage >= weakSelf.viewModel.maxPage.value{
|
switch weakSelf.viewModel.listenType.value {
|
case .game1,.game2:
|
if let dict = noti.object as? Dictionary<String,Any>{
|
weakSelf.gamesComplete(gameId: dict["gameId"] as! Int,integral: dict["gameIntegral"] as! Int)
|
}
|
case .lesson1,.lesson2,.lesson3,.lesson4,.lesson5:
|
weakSelf.studyComplete()
|
case .story1,.story2:break
|
}
|
|
return
|
}
|
|
self?.pageVC.scroll(toPage: nextPage, animation: true)
|
self?.viewModel.currentPage.accept(nextPage)
|
}).disposed(by: disposeBag)
|
|
viewModel.currentPage.subscribe(onNext: {[weak self]currentPage in
|
guard let weakSelf = self else { return }
|
self?.btn_forward.isHidden = currentPage <= 0
|
self?.label_pageNum.text = "已完成:\(weakSelf.viewModel.currentPage.value + 1)/\(weakSelf.viewModel.maxPage.value)"
|
}).disposed(by: disposeBag)
|
}
|
|
//学习类完成
|
private func studyComplete(){
|
var toalIntegral:Int = 0
|
var ids = [Int]()
|
for v in viewModel.answerItems.values{
|
if let v = v as? Listen1Model{
|
toalIntegral += v.data?.integral ?? 0
|
ids.append(v.data?.studyId ?? 0)
|
}
|
}
|
|
Services.completeLearing(type: viewModel.listenType.value.rawValue, studyTime: viewModel.times, studyIds: ids, isComplete: false).subscribe(onNext: {data in
|
|
}).disposed(by: disposeBag)
|
|
timer.invalidate()
|
|
let vc = HomeStudyCompleteVC(correctNum: viewModel.correctNum, errorNum: viewModel.errorNum, totalCoin: toalIntegral)
|
vc.title = viewModel.listenType.value.rawTitle
|
push(vc: vc)
|
}
|
|
private func gamesComplete(gameId:Int,integral:Int){
|
|
var name = ""
|
if viewModel.listenType.value == .game1{
|
name = "超级听力"
|
}else{
|
name = "超级记忆"
|
}
|
|
let accuracy = Int(Double(viewModel.correctNum) / Double(viewModel.correctNum + viewModel.errorNum) * 100)
|
|
Services.completeGames(gameId: gameId, gameName: name, difficulty: viewModel.gameLevel.value, accuracy: accuracy, useTime: viewModel.times).subscribe(onNext: {data in
|
|
}).disposed(by: disposeBag)
|
|
timer.invalidate()
|
|
let vc = HomeStudyCompleteVC(correctNum: viewModel.correctNum, errorNum: viewModel.errorNum, totalCoin: integral)
|
vc.title = viewModel.listenType.value.rawTitle
|
push(vc: vc)
|
}
|
|
deinit{
|
timer.invalidate()
|
}
|
|
@objc func quitAction(){
|
CommonAlertView.show(content: "未完成全部答题,确认退出吗?") {
|
self.navigationController?.popViewController(animated: true)
|
}
|
}
|
|
@objc func beforeAction(){
|
let beforePage = max(0, viewModel.currentPage.value - 1)
|
pageVC.scroll(toPage: beforePage, animation: true)
|
viewModel.currentPage.accept(beforePage)
|
}
|
}
|
|
extension HomeListenFightVC:FFPageViewControllerDelegate{
|
func totalPagesOfpageViewController(_ pageViewConteoller: FFPageViewController) -> UInt {
|
|
//超级听力,只有一页
|
if viewModel.listenType.value == .game1 || viewModel.listenType.value == .game2{
|
return 1
|
}
|
return UInt(viewModel.maxPage.value)
|
}
|
|
func pageViewController(_ pageViewController: FFPageViewController, currentPageChanged currentPage: Int) {
|
|
}
|
|
func pageViewController(_ pageViewConteoller: FFPageViewController, controllerForPage page: Int) -> UIViewController {
|
|
if viewModel.listenType.value == .lesson1{
|
let vc = HomeListenFight_lesson_1_VC(page: page,listen1Model:data as! Listen1Model)
|
vc.rootViewModel = viewModel
|
return vc
|
}
|
|
if viewModel.listenType.value == .lesson2{
|
let vc = HomeListenFight_lesson_2_VC(page: page,listen1Model:data as! Listen1Model)
|
vc.rootViewModel = viewModel
|
return vc
|
}
|
|
if viewModel.listenType.value == .lesson3{
|
let vc = HomeListenFight_lesson_3_VC(page: page, listen1Model: data as! Listen1Model)
|
vc.rootViewModel = viewModel
|
return vc
|
}
|
|
if viewModel.listenType.value == .lesson4{
|
let vc = HomeListenFight_lesson_4_VC(page: page, listen4Model: data as! Listen4Model)
|
vc.rootViewModel = viewModel
|
return vc
|
}
|
|
if viewModel.listenType.value == .lesson5{
|
let vc = HomeListenFight_lesson_5_VC(page: page, listen1Model: data as! Listen1Model)
|
vc.rootViewModel = viewModel
|
return vc
|
}
|
|
if viewModel.listenType.value == .game1{
|
if data == nil{return UIViewController()}
|
let vc = HomeListenGame_1_VC(listen1Model: data as! Listen1Model)
|
vc.rootViewModel = viewModel
|
return vc
|
}
|
|
if viewModel.listenType.value == .game2{
|
let vc = HomeListenGame_2_VC(listen1Model: data as! Listen1Model)
|
vc.rootViewModel = viewModel
|
return vc
|
}
|
|
if viewModel.listenType.value == .story1{
|
let vc = HomeListenStory_1_VC()
|
return vc
|
}
|
|
if viewModel.listenType.value == .story2{
|
let vc = HomeListenStory_2_VC()
|
return vc
|
}
|
|
let vc = UIViewController()
|
return vc
|
}
|
}
|