// // MyListVM.swift // WOKA // // Created by MacBook Pro on 13/06/24. // import Foundation import Alamofire enum CollectionSelectionMyList{ case webSeriesCV case webSeriesHindiCV case audioBooksCV case karaokeCV case gamesCV } class MyListVM{ weak var vc : MyListVC! let refreshControl = UIRefreshControl() let feedbackGenerator = UIImpactFeedbackGenerator(style: .light) var selectedCollection : CollectionSelectionMyList? func initView(){ NotificationCenter.default.addObserver(self, selector: #selector(languageChanged), name: .languageDidChange, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(self.viewPush(notification:)), name: NSNotification.Name(rawValue: K.NotificationCenterReloads.myListPush), object: nil) if AuthFunc.shareInstance.getUserType() == 3{ // handle guest vc.guestLoginView.isHidden = false vc.guestLoginStack.isHidden = false vc.scrollView.isHidden = true return } setupCell() Utilities.startProgressHUD() getFavouriteListing() } @objc func viewPush(notification: Notification){ if let userInfo = notification.userInfo, let action = userInfo["action"] as? TopViewPush { switch action { case .webseries: let sb = UIStoryboard(name: K.StoryBoard.webSeries, bundle: nil) let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.WebSeries.webSeriesVC) as! WebSeriesVC vc.navigationController?.pushViewController(vcPush, animated: true) case .audioBooks: let sb = UIStoryboard(name: K.StoryBoard.audioBooks, bundle: nil) let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.AudioBooks.audioBookHomeVC) as! AudioBookHomeVC vc.navigationController?.pushViewController(vcPush, animated: true) case .games: let sb = UIStoryboard(name: K.StoryBoard.Games, bundle: nil) let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Games.gamesListVC) as! GamesListVC vc.navigationController?.pushViewController(vcPush, animated: true) case .karaoke: let sb = UIStoryboard(name: K.StoryBoard.Karaoke, bundle: nil) let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Karaoke.karaokeListingVC) as! KaraokeListingVC vc.navigationController?.pushViewController(vcPush, animated: true) case .shop: let sb = UIStoryboard(name: K.StoryBoard.shop, bundle: nil) let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Shop.shopListingVC) as! ShopListingVC vc.navigationController?.pushViewController(vcPush, animated: true) case .liveTV: break case .blogs: let sb = UIStoryboard(name: K.StoryBoard.theme, bundle: nil) let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Theme.blogsVC) as! BlogsVC vc.navigationController?.pushViewController(vcPush, animated: true) // playLiveTV() case .radio: let sb = UIStoryboard(name: K.StoryBoard.wokaFM, bundle: nil) let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.WokaFM.wokaFMVC) as! WokaFMVC vcPush.modalPresentationStyle = .overCurrentContext vcPush.modalTransitionStyle = .crossDissolve vc.present(vcPush, animated: true) } } } func addGradient(){ let color1 = #colorLiteral(red: 0.6745098039, green: 0.6235294118, blue: 0.1725490196, alpha: 1) let color2 = #colorLiteral(red: 0.5450980392, green: 0.6745098039, blue: 0.1725490196, alpha: 1) vc.gradientView.applyGradient(colors: [color2, color1], startPoint: CGPoint(x: 0, y: 0), endPoint: CGPoint(x: 0.8, y: 0)) } @objc func languageChanged(){ self.reloadCollections() } func setupCell(){ vc.webSeriesCV.register(UINib(nibName: K.CellIdentifier.Home.favouriteCell, bundle: nil), forCellWithReuseIdentifier: K.CellIdentifier.Home.favouriteCell) vc.webSeriesCV.delegate = vc.self vc.webSeriesCV.dataSource = vc.self vc.webSeriesHindiCV.register(UINib(nibName: K.CellIdentifier.Home.favouriteCell, bundle: nil), forCellWithReuseIdentifier: K.CellIdentifier.Home.favouriteCell) vc.webSeriesHindiCV.delegate = vc.self vc.webSeriesHindiCV.dataSource = vc.self vc.audioBooksCV.register(UINib(nibName: K.CellIdentifier.Home.favouriteCell, bundle: nil), forCellWithReuseIdentifier: K.CellIdentifier.Home.favouriteCell) vc.audioBooksCV.delegate = vc.self vc.audioBooksCV.dataSource = vc.self vc.karaokeCV.register(UINib(nibName: K.CellIdentifier.Home.favouriteCell, bundle: nil), forCellWithReuseIdentifier: K.CellIdentifier.Home.favouriteCell) vc.karaokeCV.delegate = vc.self vc.karaokeCV.dataSource = vc.self vc.gamesCV.register(UINib(nibName: K.CellIdentifier.Home.favouriteCell, bundle: nil), forCellWithReuseIdentifier: K.CellIdentifier.Home.favouriteCell) vc.gamesCV.delegate = vc.self vc.gamesCV.dataSource = vc.self } // MARK: - Get Favourite Listing func getFavouriteListing(){ let headers : HTTPHeaders = ["Accept-Language" : AuthFunc.shareInstance.languageSelected == .english ? "English" : "Hindi", "access-token": AuthFunc.shareInstance.getAccessToken()] NetworkManager.shareInstance.apiRequest(url: APIEndPoints.Home.favourite_listing, method: .post, headers: headers) { [weak self](result : Result, NetworkManager.APIError>) in switch result{ case .success(let data): guard let self else{return} switch data.success{ case 0: self.refreshControl.endRefreshing() Utilities.dismissProgressHUD() self.vc.toast(msg: data.message ?? "Unrecognised error" , time: 2) MyListDataTemp.shareInstance.webSeriesHindi.removeAll() MyListDataTemp.shareInstance.favListingData = nil // make this true if mylist is loaded once MyListDataTemp.shareInstance.isDatafetched = true if MyListDataTemp.shareInstance.favListingData?.showData == nil { MyListDataTemp.shareInstance.favListingData = FavouriteListingDM.ResultData(showData: [], videoData: [], gameData: [], singKaraokeData: [], audioData: []) } reloadCollections() checkNil() case 1: self.refreshControl.endRefreshing() Utilities.dismissProgressHUD() guard let data = data.data?.result else{return} MyListDataTemp.shareInstance.favListingData = nil MyListDataTemp.shareInstance.webSeriesHindi.removeAll() MyListDataTemp.shareInstance.favListingData = data if var hindiData = MyListDataTemp.shareInstance.favListingData?.showData{ /* Taking out the hindi series , 1-> English , 18-> Hindi And the saving it to hindi series, also modify the bookmark category ids */ MyListDataTemp.shareInstance.webSeriesHindi = hindiData.compactMap { $0 }.filter { ($0.bookmarkCategoryIDS?.components(separatedBy: ",").first == "18" || $0.bookmarkCategoryIDS?.components(separatedBy: ",").last == "18") }.map { element -> FavouriteListingDM.ResultData.ShowDatum in var modifiedElement = element modifiedElement.bookmarkCategoryIDS = "18" modifiedElement.categoryMasterID = "18" return modifiedElement } if let data = MyListDataTemp.shareInstance.favListingData?.showData{ var indicesToRemove = [Int]() // Deleting the hindi series from main (those with category ID "18") for (index, element) in data.enumerated() { if let bookMarkCatID = element.bookmarkCategoryIDS?.components(separatedBy: ","){ if bookMarkCatID.count > 1{ // means multiple language /* if its greater than one , its for sure we have extracted the hindi episode */ hindiData[index].bookmarkCategoryIDS = "1" }else{ // means single language if bookMarkCatID.first == "18"{ indicesToRemove.append(index) } } } } // Remove items in reverse order to avoid index shifting issues for index in indicesToRemove.reversed() { hindiData.remove(at: index) } } // Updating the showData with the filtered list // MyListDataTemp.shareInstance.favListingData?.showData = hindiData.map({$0.categoryMasterID = 1}) MyListDataTemp.shareInstance.favListingData?.showData = hindiData.map { item in var modifiedItem = item modifiedItem.categoryMasterID = "1" return modifiedItem } // make this true if mylist is loaded once MyListDataTemp.shareInstance.isDatafetched = true } reloadCollections() feedbackGenerator.impactOccurred() checkNil() default: break } case .failure(let error): guard let self else{return} self.refreshControl.endRefreshing() Utilities.dismissProgressHUD() checkNil() if MyListDataTemp.shareInstance.favListingData?.showData == nil { MyListDataTemp.shareInstance.favListingData = FavouriteListingDM.ResultData(showData: [], videoData: [], gameData: [], singKaraokeData: [], audioData: []) } self.vc.toast(msg: error.localizedDescription , time: 2) } } } // MARK: - Like , unlike func likePost(postID : Int, postType : Int, index : Int , onCompletion : @escaping (Bool) -> Void){ Utilities.startProgressHUD() let headers : HTTPHeaders = ["Accept-Language" : AuthFunc.shareInstance.languageSelected == .english ? "English" : "Hindi", "access-token": AuthFunc.shareInstance.getAccessToken()] let params : Parameters = ["post_id" : postID, "post_type" : postType] NetworkManager.shareInstance.apiRequest(url: APIEndPoints.Home.post_like, method: .post, parameters: params, headers: headers) { [weak self](result : Result) in switch result{ case .success(let data): guard let self else{return} switch data.success{ case 0: Utilities.dismissProgressHUD() self.vc.toast(msg: data.message ?? "Unrecognised error" , time: 2) onCompletion(false) case 1: Utilities.dismissProgressHUD() onCompletion(true) default: Utilities.dismissProgressHUD() onCompletion(false) } case .failure(let error): guard let self else{return} Utilities.dismissProgressHUD() self.vc.toast(msg: error.localizedDescription , time: 2) onCompletion(false) } } } func unlikePost(postID : Int, postType : Int , index : Int, onCompletion : @escaping (Bool) -> Void){ Utilities.startProgressHUD() let headers : HTTPHeaders = ["Accept-Language" : AuthFunc.shareInstance.languageSelected == .english ? "English" : "Hindi", "access-token": AuthFunc.shareInstance.getAccessToken()] let params : Parameters = ["post_id" : postID, "post_type" : postType] NetworkManager.shareInstance.apiRequest(url: APIEndPoints.Home.post_unlike, method: .post, parameters: params, headers: headers) { [weak self](result : Result, NetworkManager.APIError>) in switch result{ case .success(let data): guard let self else{return} switch data.success{ case 0: Utilities.dismissProgressHUD() self.vc.toast(msg: data.message ?? "Unrecognised error" , time: 2) onCompletion(false) case 1: Utilities.dismissProgressHUD() onCompletion(true) default: Utilities.dismissProgressHUD() onCompletion(false) } case .failure(let error): guard let self else{return} Utilities.dismissProgressHUD() self.vc.toast(msg: error.localizedDescription , time: 2) onCompletion(false) } } } // MARK: - Remove Favourite func removeFavourite(postID : Int, postType : Int, categoryID : String, index : Int , onCompletion : @escaping (Bool) -> Void){ Utilities.startProgressHUD() let headers : HTTPHeaders = ["Accept-Language" : AuthFunc.shareInstance.languageSelected == .english ? "English" : "Hindi", "access-token": AuthFunc.shareInstance.getAccessToken()] let params : Parameters = ["id" : postID, "post_type" : postType, "category_id" : categoryID] NetworkManager.shareInstance.apiRequest(url: APIEndPoints.Home.favourite_remove, method: .post, parameters: params, headers: headers) { [weak self](result : Result) in switch result{ case .success(let data): guard let self else{return} switch data.success{ case 0: Utilities.dismissProgressHUD() self.vc.toast(msg: data.message ?? "Unrecognised error" , time: 2) onCompletion(false) case 1: Utilities.dismissProgressHUD() onCompletion(true) default: Utilities.dismissProgressHUD() onCompletion(false) } case .failure(let error): guard let self else{return} Utilities.dismissProgressHUD() self.vc.toast(msg: error.localizedDescription , time: 2) onCompletion(false) } } } func checkNil(){ guard let data = MyListDataTemp.shareInstance.favListingData else{ if MyListDataTemp.shareInstance.webSeriesHindi.count != 0 { self.vc.noDataStack.isHidden = true }else{ self.vc.noDataStack.isHidden = false } return } if data.showData?.count == 0 && data.singKaraokeData?.count == 0 && data.gameData?.count == 0 && data.audioData?.count == 0 && MyListDataTemp.shareInstance.webSeriesHindi.count == 0{ self.vc.noDataStack.isHidden = false }else{ self.vc.noDataStack.isHidden = true } } func reloadCollections(){ vc.webSeriesCV.reloadData() vc.webSeriesHindiCV.reloadData() vc.audioBooksCV.reloadData() vc.karaokeCV.reloadData() vc.gamesCV.reloadData() } }