Files
Woka_Native_iOS/WOKA/WebSeries/ViewModel/WebSeriesVM.swift

343 lines
15 KiB
Swift

//
// WebSeriesVM.swift
// WOKA
//
// Created by MacBook Pro on 18/06/24.
//
import Foundation
import Alamofire
import GoogleMobileAds
class WebSeriesVM{
weak var vc : WebSeriesVC!
var continueWatchingData = [ContinueWatchingDM.ResultData]()
var categoryListingData = [CategoryListingDM.ResultData]()
var showData = [WebSeriesShowListDM.ShowDatum]()
let dropDownModule = DropDown()
var dataSource = [String]()
// PAgination variables
var pageNo = 0
var isShowDataLoading = false
var totalDataCount = 0 // this will hold the total count from api
var maxHeaderHeight = 0.0
var headerBannerView = GADBannerView()
var masilaBannerView = GADBannerView()
let feedbackGenerator = UIImpactFeedbackGenerator(style: .rigid)
func initView(){
// let heightMultiplier: CGFloat = 0.257511
// let heightMultiplier: CGFloat = 0.29
// Get the current screen height
// let currentScreenHeight = UIScreen.main.bounds.height
// Calculate the new view height based on the multiplier
// maxHeaderHeight = currentScreenHeight * heightMultiplier
//Set Header height
maxHeaderHeight = UIScreen.main.bounds.width * 0.55
vc.headerHeight.constant = maxHeaderHeight
setupCell()
startShimmer()
vc.scrollView.indicatorStyle = .white // or .white
let color1 = #colorLiteral(red: 0.5921568627, green: 0.2588235294, blue: 0.8941176471, alpha: 1)
let color2 = #colorLiteral(red: 0.368627451, green: 0.1215686275, blue: 0.768627451, alpha: 1)
vc.title = "WEB SERIES".localized(loc: AuthFunc.shareInstance.languageSelected.rawValue)
vc.view.applyGradient(colors: [color2, color1], startPoint: CGPoint(x: 0, y: 0), endPoint: CGPoint(x: 0.8, y: 0))
getCategoryListing()
// for the first load always send hindi as it is default category
self.getShowListing(categoryID: 18)
vc.languageStack.addTapGesture { [weak self] in
guard let self else {return}
dropDownModule.show()
self.vc.expandBtn.setImage(UIImage(named: "SupportUpArrow"), for: .normal)
}
checkAds()
}
func checkAds(){
/*
First check if webSeries ad is present via slug, then check for Local Ads, if not then check google ads.
*/
if let adsData = AuthFunc.shareInstance.adsData, let webSeriesAd = adsData.result?.filter({$0.slug == AdsEnum.web_series.rawValue}).first{
// check if ads data contains LocalAD for webseries
if let advertisement = webSeriesAd.advertisement,let bannerImage = advertisement.bannerImage, let buttonImage = advertisement.buttonImage{
vc.headerViewImage.imageURL(bannerImage, color: .white)
vc.headerBtn.setTitle("", for: .normal)
vc.headerViewLabel.text = ""
vc.headerViewLabelHeight.constant = 10
vc.headerBtn.backgroundColor = .clear
vc.headerBtn.sd_setBackgroundImage(with: URL(string:buttonImage), for: .normal)
vc.headerViewImage.addTapGesture {
if let adID = webSeriesAd.id{
PersistentStorage.shared.addAdsCount(adID: adID ,clicks: 1)
}
if let adLink = webSeriesAd.advertisement?.adLink ,let url = URL(string: adLink), UIApplication.shared.canOpenURL(url) {
UIApplication.shared.open(url)
}
}
}else{
// check google ads
if webSeriesAd.googleAd != nil{
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2, execute: { [weak self] in
guard let self else{return}
AdReusable.sharedInstance.setupBannerAd(bannerView: self.headerBannerView, in: vc.headerView, adUnitID: K.GoogleAdIDs.webSeries1, viewController: self.vc)
AdReusable.sharedInstance.setupBannerAd(bannerView: self.masilaBannerView, in: vc.masilaTrailerView, adUnitID: K.GoogleAdIDs.webSeries2, viewController: self.vc, height: 8, width: 15)
})
}
}
}
}
func startShimmer(){
vc.headerView.startShimmer()
vc.masilaTrailerView.startShimmer()
vc.videoLanguageView.startShimmer()
}
func stopShimmer(){
self.vc.headerView.stopShimmer()
self.vc.masilaTrailerView.stopShimmer()
self.vc.videoLanguageView.stopShimmer()
}
func setupCell(){
vc.continueWatchingCV.register(UINib(nibName: K.CellIdentifier.WebSeries.webSeriesCell, bundle: nil), forCellWithReuseIdentifier: K.CellIdentifier.WebSeries.webSeriesCell)
vc.continueWatchingCV.delegate = vc.self
vc.continueWatchingCV.dataSource = vc.self
vc.showListingTableView.register(UINib(nibName: K.CellIdentifier.WebSeries.webSeriesShowListingCell, bundle: nil), forCellReuseIdentifier: K.CellIdentifier.WebSeries.webSeriesShowListingCell)
vc.showListingTableView.delegate = vc.self
vc.showListingTableView.dataSource = vc.self
}
func updateTableHeight(){
self.vc.tableHeight.constant = self.vc.showListingTableView.contentSize.height + 100
self.vc.showListingTableView.layoutIfNeeded()
self.vc.tableHeight.constant = self.vc.showListingTableView.contentSize.height
}
// MARK: - DropDown
func initDropDown(){
dropDownModule.anchorView = vc.languageStack
dropDownModule.dataSource = dataSource
dropDownModule.cornerRadius = 10
dropDownModule.bottomOffset = CGPoint(x: 0, y:(dropDownModule.anchorView?.plainView.bounds.height)!)
dropDownModule.topOffset = CGPoint(x: 0, y:-(dropDownModule.anchorView?.plainView.bounds.height)!)
dropDownModule.direction = .bottom
dropDownModule.textFont = FontCustom.shareInstance.customFont(fontName: .Exo2_Bold, size: 14)
dropDownModule.shadowColor = UIColor.appColor(.TextDarkBlue)!
dropDownModule.backgroundColor = .white
dropDownModule.shadowOffset = CGSize(width: 0, height: 1)
dropDownModule.separatorColor = UIColor.lightGray
dropDownModule.width = vc.languageStack.frame.width
dropDownModule.selectionBackgroundColor = UIColor.appColor(.TextDarkBlue)!
dropDownModule.selectedTextColor = .white
dropDownModule.selectRow(at: 0)
// handle if user clicks outside
dropDownModule.cancelAction = { [weak self] in
guard let self else{return}
PersistentStorage.shared.addOthersCount()
vc.expandBtn.setImage(UIImage(named: "SupportBottomArrow"), for: .normal)
}
dropDownModule.selectionAction = { [weak self] (index: Int, item: String) in
PersistentStorage.shared.addOthersCount()
guard let self else{return}
vc.languageLabel.text = item
vc.expandBtn.setImage(UIImage(named: "SupportBottomArrow"), for: .normal)
//if the language is changed call the showlisting api
if let id = categoryListingData[index].id {
pageNo = 0
getShowListing(categoryID: id,languageChange: true)
}
}
}
// MARK: - Api Calls
func getContinueWatching(){
let headers : HTTPHeaders = ["access-token" : AuthFunc.shareInstance.getAccessToken()]
let params : Parameters = ["post_type" : 3] // 3- webseries
NetworkManager.shareInstance.apiRequest(url: APIEndPoints.WebSeries.continue_watching, method: .post,parameters: params,headers : headers) { [weak self](result : Result<BaseResponseModel<ContinueWatchingDM>, NetworkManager.APIError>) in
switch result{
case .success(let data):
guard let self else{
Utilities.dismissProgressHUD()
return
}
switch data.success{
case 0:
/*
Error
*/
Utilities.dismissProgressHUD()
// vc.toast(msg: data.message ?? "Unrecognised error" , time: 2)
self.vc.continueWatchingStack.isHidden = true
case 1:
Utilities.dismissProgressHUD()
guard let data = data.data?.result else{return}
if data.count == 0{
self.vc.continueWatchingStack.isHidden = true
}else{
self.vc.continueWatchingStack.isHidden = false
}
self.continueWatchingData = data
self.vc.continueWatchingCV.reloadData()
default:
break
}
case .failure(let error):
guard let self else{
Utilities.dismissProgressHUD()
return
}
Utilities.dismissProgressHUD()
self.vc.continueWatchingStack.isHidden = true
vc.toast(msg: error.localizedDescription , time: 2)
}
}
}
func getShowListing(categoryID : Int, isBtnClick : Bool = false, languageChange : Bool = false){
let headers : HTTPHeaders = ["access-token" : AuthFunc.shareInstance.getAccessToken()]
let params : Parameters = ["category_id" : categoryID,
"api_version" : "v2",
"start" : pageNo, // if page no is 0 then its the first page, if not the increase it by one
"limit": 6] // from category listing api , default will be 1
NetworkManager.shareInstance.apiRequest(url: APIEndPoints.WebSeries.watch_show_listing, method: .post,parameters: params,headers: headers, queue: QueueHelper.utilityGroup) { [weak self] (result : Result<BaseResponseModel<WebSeriesShowListDM>, NetworkManager.APIError>) in
switch result{
case .success(let data):
guard let self else{
self?.isShowDataLoading = false
Utilities.dismissProgressHUD()
return
}
switch data.success{
case 0:
/*
Error
*/
Utilities.dismissProgressHUD()
self.isShowDataLoading = false
vc.toast(msg: data.message ?? "Unrecognised error" , time: 2)
case 1:
Utilities.dismissProgressHUD()
self.isShowDataLoading = false
guard let dataCount = data.data?.totalRecords , let data = data.data?.showData else{return}
//update the total data count on success.
totalDataCount = dataCount
//update the page no on success
pageNo += 1
//if user changes language from dropdown
if languageChange{
self.showData.removeAll()
self.showData.append(contentsOf: data)
}else{
self.showData.append(contentsOf: data)
}
//stop the shimmer, enable the scrollview scroll, increase the table height inside the scrollview.
self.stopShimmer()
self.vc.scrollView.isScrollEnabled = true
self.vc.showListingTableView.reloadData()
if !isBtnClick{
feedbackGenerator.impactOccurred()
self.vc.tableHeight.constant = self.vc.showListingTableView.contentSize.height + 100
}
self.vc.showListingTableView.layoutIfNeeded()
self.vc.tableHeight.constant = self.vc.showListingTableView.contentSize.height
//stop activity indicator and hide it when stopped
self.vc.loadMoreActivityIndicator.stopAnimating()
self.vc.loadMoreActivityIndicator.hidesWhenStopped = true
default:
break
}
case .failure(let error):
guard let self else{
self?.isShowDataLoading = false
Utilities.dismissProgressHUD()
return
}
Utilities.dismissProgressHUD()
self.isShowDataLoading = false
vc.toast(msg: error.localizedDescription , time: K.ConstantString.errorTime)
}
}
}
func getCategoryListing(){
// Utilities.startProgressHUD()
let headers : HTTPHeaders = ["access-token" : AuthFunc.shareInstance.getAccessToken()]
let params : Parameters = ["module_id" : 7] // 7 - webseries
NetworkManager.shareInstance.apiRequest(url: APIEndPoints.WebSeries.category_listing, method: .post,parameters: params,headers : headers) { [weak self](result : Result<BaseResponseModel<CategoryListingDM>, NetworkManager.APIError>) in
switch result{
case .success(let data):
guard let self else{
Utilities.dismissProgressHUD()
return
}
switch data.success{
case 0:
/*
Error
*/
Utilities.dismissProgressHUD()
self.stopShimmer()
vc.noDataView.isHidden = false
vc.toast(msg: data.message ?? "Unrecognised error" , time: 2)
case 1:
Utilities.dismissProgressHUD()
guard let data = data.data?.result else{return}
self.categoryListingData = data
dataSource = categoryListingData.map({$0.categoryName ?? "Unknown"})
getContinueWatching()
initDropDown()
default:
self.stopShimmer()
vc.noDataView.isHidden = false
}
case .failure(let error):
guard let self else{
Utilities.dismissProgressHUD()
return
}
self.stopShimmer()
Utilities.dismissProgressHUD()
vc.noDataView.isHidden = false
vc.toast(msg: error.localizedDescription, time: 2)
}
}
}
}