// // AudioBookHomeVM.swift // WOKA // // Created by MacBook Pro on 02/07/24. // import Foundation import Alamofire import GoogleMobileAds class AudioBookHomeVM{ weak var vc : AudioBookHomeVC! var continueWatchingData = [ListenAudioListingDM.AudioDatum]() var audioListData = [ListenAudioListingDM.AudioDatum]() var headerData : ListenAudioListingDM.AudioDatum? // var indexToLoad = 0 var pageNo = 0 var maxHeaderHeight = 0.0 var headerBannerView = GADBannerView() var headerBannerBottomView = GADBannerView() func initView(){ let color1 = #colorLiteral(red: 0, green: 0.4784313725, blue: 0.7529411765, alpha: 1) let color2 = #colorLiteral(red: 0, green: 0.7529411765, blue: 0.7529411765, alpha: 1) self.vc.view.applyGradient(colors: [color1,color2], startPoint: .Point.left.point , endPoint: .Point.right.point) //Set banner height maxHeaderHeight = UIScreen.main.bounds.width * 0.55 vc.headerHeight.constant = maxHeaderHeight vc.scrollView.indicatorStyle = .white // or .white startShimmer() setupCell() getShowListing() checkAds() } func checkAds(){ /* MAke logic for ads */ if let adsData = AuthFunc.shareInstance.adsData, let audioBooksAd = adsData.result?.filter({$0.slug == AdsEnum.audioBooks.rawValue}).first{ // check if ads data contains ad for webseries if let bannerImage = audioBooksAd.advertisement?.bannerImage, let buttonImage = audioBooksAd.advertisement?.buttonImage{ vc.headerImage.imageURL(bannerImage, color: .white) vc.headerBtn.setTitle("", for: .normal) vc.headerTitleLabel.text = "" vc.headerTitleHeight.constant = 10 vc.headerBtn.backgroundColor = .clear vc.headerBtn.sd_setBackgroundImage(with: URL(string:buttonImage), for: .normal) vc.headerImage.addTapGesture { if let adID = audioBooksAd.id{ PersistentStorage.shared.addAdsCount(adID: adID ,clicks: 1) } if let adLink = audioBooksAd.advertisement?.adLink ,let url = URL(string: adLink), UIApplication.shared.canOpenURL(url) { UIApplication.shared.open(url) } } }else if audioBooksAd.googleAd != nil{ DispatchQueue.main.asyncAfter(deadline: .now() + 0.2, execute: { [weak self] in guard let self else{return} AdReusable.sharedInstance.setupBannerAd(bannerView: headerBannerView, in:vc.headerView, adUnitID: K.GoogleAdIDs.splashBanner1, viewController: self.vc) AdReusable.sharedInstance.setupBannerAd(bannerView: headerBannerBottomView, in: vc.listenView, adUnitID: K.GoogleAdIDs.splashBanner2, viewController: self.vc, height: 8, width: 15) }) } } } func startShimmer(){ vc.headerView.startShimmer() vc.listenView.startShimmer() } func updateTableHeight(){ self.vc.tableHeight.constant = self.vc.audioListingTableView.contentSize.height + 100 self.vc.audioListingTableView.layoutIfNeeded() self.vc.tableHeight.constant = self.vc.audioListingTableView.contentSize.height } func setHeaderData(){ // if indexToLoad > continueWatchingData.count { // return // } guard let headerData else{return} if let url = headerData.thumbnailPath{ self.vc.headerImage.imageURL(url, color: .white) } if AuthFunc.shareInstance.getDefaultLanguage() == .english{ let englishData = headerData.contentMoreDetails?.filter({$0.languageMasterID == 1}).first vc.headerTitleLabel.text = englishData?.title }else{ let hindiData = headerData.contentMoreDetails?.filter({$0.languageMasterID == 2}).first vc.headerTitleLabel.text = hindiData?.title } } func setupCell(){ vc.continueWatchingCV.register(UINib(nibName: K.CellIdentifier.AudioBooks.continueAudioCell, bundle: nil), forCellWithReuseIdentifier: K.CellIdentifier.AudioBooks.continueAudioCell) vc.continueWatchingCV.delegate = vc.self vc.continueWatchingCV.dataSource = vc.self vc.audioListingTableView.register(UINib(nibName: K.CellIdentifier.WebSeries.webSeriesShowListingCell, bundle: nil), forCellReuseIdentifier: K.CellIdentifier.WebSeries.webSeriesShowListingCell) vc.audioListingTableView.delegate = vc.self vc.audioListingTableView.dataSource = vc.self } // MARK: - Api Calls func getContinueWatching(){ // Utilities.startProgressHUD() let headers : HTTPHeaders = ["access-token" : AuthFunc.shareInstance.getAccessToken()] let params : Parameters = ["post_type" : 7] // 7 - audio NetworkManager.shareInstance.apiRequest(url: APIEndPoints.WebSeries.continue_watching, method: .post,parameters: params,headers : headers) { [weak self](result : Result, 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(isBtnClick : Bool = false){ // Utilities.startProgressHUD() let headers : HTTPHeaders = ["access-token" : AuthFunc.shareInstance.getAccessToken()] let params : Parameters = ["api_version" : "v2", "start" : pageNo, "limit": 6] NetworkManager.shareInstance.apiRequest(url: APIEndPoints.AudioBooks.listen_audio_listing, method: .post, parameters: params,headers: headers) { [weak self](result : Result, 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) case 1: Utilities.dismissProgressHUD() getContinueWatching() guard let dataCount = data.data?.totalRecords ,let data = data.data?.audioData else{return} self.audioListData.append(contentsOf: data) self.vc.audioListingTableView.reloadData() self.vc.tableHeight.constant = self.vc.audioListingTableView.contentSize.height + 100 self.vc.audioListingTableView.layoutIfNeeded() self.vc.tableHeight.constant = self.vc.audioListingTableView.contentSize.height /* MAke logic for ads */ if !isBtnClick{ // only load first time. if let adsData = AuthFunc.shareInstance.adsData, let audioBooksAd = adsData.result?.filter({$0.slug == AdsEnum.audioBooks.rawValue}).first, (audioBooksAd.advertisement != nil || audioBooksAd.googleAd != nil){ // this means ads are there }else{ self.headerData = data.first self.setHeaderData() } } // if let adsData = AuthFunc.shareInstance.adsData{ // // check if ads data contains ad for webseries // if let audioBooksAd = adsData.result?.filter({$0.slug == AdsEnum.audioBooks.rawValue}).first, let bannerImage = audioBooksAd.advertisement?.bannerImage, let buttonImage = audioBooksAd.advertisement?.buttonImage{ // vc.headerImage.imageURL(bannerImage, color: .white) // vc.headerBtn.setTitle("", for: .normal) // vc.headerTitleLabel.text = "" // vc.headerTitleHeight.constant = 10 // vc.headerBtn.backgroundColor = .clear // vc.headerBtn.sd_setBackgroundImage(with: URL(string:buttonImage), for: .normal) // }else{ // if !isBtnClick{ // self.headerData = self.audioListData.first // self.setHeaderData() // } // } // }else{ // if !isBtnClick{ // self.headerData = self.audioListData.first // self.setHeaderData() // } // } self.stopShimmer() self.vc.loadMoreActivityIndicator.stopAnimating() self.vc.loadMoreActivityIndicator.hidesWhenStopped = true if self.audioListData.count == dataCount{ self.vc.loadMoreBtn.isHidden = true }else{ self.vc.loadMoreBtn.isHidden = false } default: break } case .failure(let error): guard let self else{ Utilities.dismissProgressHUD() return } Utilities.dismissProgressHUD() vc.toast(msg: error.localizedDescription , time: K.ConstantString.errorTime) self.stopShimmer() self.vc.noDataView.isHidden = false } } } func stopShimmer(){ self.vc.headerView.stopShimmer() vc.listenView.stopShimmer() // self.vc.masilaTrailerView.stopShimmer() // self.vc.videoLanguageView.stopShimmer() } // MARK: - Update Fav Likes func updateFavLikes(type : FavCellCLick, isFav : Bool? ,isLiked : Bool?, postID : Int , postType : Int){ switch type { case .favourite: guard let isFav else{return} if isFav == true { // if is fav then remove it LikeFavCommonFunc.shareInstance.removeFavourite(postID: postID, postType: postType, categoryID: 0, vc: self.vc) { [weak self] isDone in guard let self else{return} if isDone{ if let showListIndex = audioListData.firstIndex(where: { $0.id == postID }){ audioListData[showListIndex].markAsFavourite = false vc.audioListingTableView.reloadRows(at: [IndexPath(row: showListIndex, section: 0)],with: .none) K.GVar.reloadMyListAudioBooks = true // // MyList Update // if MyListDataTemp.shareInstance.isDatafetched{ // if let indexRemove = MyListDataTemp.shareInstance.favListingData?.audioData?.firstIndex(where: {$0.id == postID}){ // MyListDataTemp.shareInstance.favListingData?.audioData?.remove(at: indexRemove) // K.GVar.myListSoftReload = true // } // } } /* Check if the data is in continue watching */ if let continueWatchingIndex = continueWatchingData.firstIndex(where: { $0.id == postID }){ continueWatchingData[continueWatchingIndex].markAsFavourite = false vc.continueWatchingCV.reloadItems(at: [IndexPath(row: continueWatchingIndex, section: 0)]) K.GVar.reloadMyListAudioBooks = true // MyList Update // if MyListDataTemp.shareInstance.isDatafetched{ // if let indexRemove = MyListDataTemp.shareInstance.favListingData?.audioData?.firstIndex(where: {$0.id == postID}){ // MyListDataTemp.shareInstance.favListingData?.audioData?.remove(at: indexRemove) // K.GVar.myListSoftReload = true // } // } } } } }else{ LikeFavCommonFunc.shareInstance.addFavourite(postID: postID, postType: postType, categoryID: 0, vc: self.vc) { [weak self] isDone in if isDone{ guard let self else{return} if let showListIndex = audioListData.firstIndex(where: { $0.id == postID }){ audioListData[showListIndex].markAsFavourite = true vc.audioListingTableView.reloadRows(at: [IndexPath(row: showListIndex, section: 0)],with: .none) K.GVar.reloadMyListAudioBooks = true // MyList Update // if MyListDataTemp.shareInstance.isDatafetched{ // let audioData = audioListData[showListIndex] // MyListDataTemp.shareInstance.favListingData?.audioData?.append(audioData) // K.GVar.myListSoftReload = true // } } /* Check if the data is in continue watching */ if let continueWatchingIndex = continueWatchingData.firstIndex(where: { $0.id == postID }){ continueWatchingData[continueWatchingIndex].markAsFavourite = true vc.continueWatchingCV.reloadItems(at: [IndexPath(row: continueWatchingIndex, section: 0)]) K.GVar.reloadMyListAudioBooks = true // MyList Update // if MyListDataTemp.shareInstance.isDatafetched{ // if MyListDataTemp.shareInstance.favListingData?.audioData?.firstIndex(where: {$0.id == postID}) == nil{ // let audioData = continueWatchingData[continueWatchingIndex] // MyListDataTemp.shareInstance.favListingData?.audioData?.append(audioData) // K.GVar.myListSoftReload = true // } // } } } } } return case .liked: guard let isLiked else{return} if isLiked{ // Unlike LikeFavCommonFunc.shareInstance.unlikePost(postID: postID, postType: postType, vc: self.vc) { [weak self] isDone in guard let self else{return} if isDone{ if let showListIndex = audioListData.firstIndex(where: { $0.id == postID }){ audioListData[showListIndex].isLiked = false audioListData[showListIndex].likesCount! -= 1 vc.audioListingTableView.reloadRows(at: [IndexPath(row: showListIndex, section: 0)],with: .none) } /* Check if the data is in continue watching */ if let continueWatchingIndex = continueWatchingData.firstIndex(where: { $0.id == postID }){ continueWatchingData[continueWatchingIndex].isLiked = false continueWatchingData[continueWatchingIndex].likesCount! -= 1 vc.continueWatchingCV.reloadItems(at: [IndexPath(row: continueWatchingIndex, section: 0)]) } /* Check if the data is in continue watching */ if let index = MyListDataTemp.shareInstance.favListingData?.audioData?.firstIndex(where: {$0.id == postID}){ MyListDataTemp.shareInstance.favListingData?.audioData?[index].isLiked = false MyListDataTemp.shareInstance.favListingData?.audioData?[index].likesCount! -= 1 K.GVar.myListSoftReload = true } } } }else{ //Like LikeFavCommonFunc.shareInstance.likePost(postID: postID, postType: postType, vc: self.vc){ [weak self] isDone in guard let self else{return} if isDone{ if let showListIndex = audioListData.firstIndex(where: { $0.id == postID }){ audioListData[showListIndex].isLiked = true audioListData[showListIndex].likesCount! += 1 vc.audioListingTableView.reloadRows(at: [IndexPath(row: showListIndex, section: 0)],with: .none) } /* Check if the data is in continue watching */ if let continueWatchingIndex = continueWatchingData.firstIndex(where: { $0.id == postID }){ continueWatchingData[continueWatchingIndex].isLiked = true continueWatchingData[continueWatchingIndex].likesCount! += 1 vc.continueWatchingCV.reloadItems(at: [IndexPath(row: continueWatchingIndex, section: 0)]) } /* Check if the data is in continue watching */ if let index = MyListDataTemp.shareInstance.favListingData?.audioData?.firstIndex(where: {$0.id == postID}){ MyListDataTemp.shareInstance.favListingData?.audioData?[index].isLiked = true MyListDataTemp.shareInstance.favListingData?.audioData?[index].likesCount! += 1 K.GVar.myListSoftReload = true } } } } } } }