Files
Woka_Native_iOS/WOKA/Home/ViewModel/MyListVM.swift
Bilal b16dbeb6bf - updated mylist
- modified favlisting api and response
- add individual handler for reloads.
2024-08-14 00:31:53 +05:30

393 lines
19 KiB
Swift

//
// 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()
vc.karaokeViewBtn.roundCorner()
vc.audioBooksBtn.roundCorner()
vc.gamesBtn.roundCorner()
vc.webSeriesBtn.roundCorner()
vc.webSeriesHindiBtn.roundCorner()
}
@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()]
let params : Parameters = ["api_version" : "v2"]
NetworkManager.shareInstance.apiRequest(url: APIEndPoints.Home.favourite_listing, method: .post,parameters : params, headers: headers) { [weak self](result : Result<BaseResponseModel<FavouriteListingDM>, 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(totalRecords: nil, showData: FavouriteListingDM.ResultData.ShowData(hindi: [],english: []),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()
checkViewAll()
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(totalRecords: nil, showData: FavouriteListingDM.ResultData.ShowData(hindi: [],english: []),videoData: [],gameData: [],singKaraokeData: [],audioData: [])
}
self.vc.toast(msg: error.localizedDescription , time: 2)
}
}
}
func checkViewAll(){
if let favListing = MyListDataTemp.shareInstance.favListingData{
if let karaokeCount = favListing.singKaraokeData?.count, karaokeCount >= 3 {
vc.karaokeViewBtn.isHidden = false
}else{
vc.karaokeViewBtn.isHidden = true
}
if let audioBooksCount = favListing.audioData?.count , audioBooksCount >= 3{
vc.audioBooksBtn.isHidden = false
}else{
vc.audioBooksBtn.isHidden = true
}
if let gamesCount = favListing.gameData?.count , gamesCount >= 3{
vc.gamesBtn.isHidden = false
}else{
vc.gamesBtn.isHidden = true
}
if let webbSeriesEnglishCount = favListing.showData?.english?.count , webbSeriesEnglishCount >= 3{
vc.webSeriesBtn.isHidden = false
}else{
vc.webSeriesBtn.isHidden = true
}
if let hindiSeriesCount = favListing.showData?.hindi?.count , hindiSeriesCount >= 3{
vc.webSeriesHindiBtn.isHidden = false
}else{
vc.webSeriesHindiBtn.isHidden = true
}
}
// let hindiListing = MyListDataTemp.shareInstance.webSeriesHindi
// if hindiListing.count >= 3{
// vc.webSeriesHindiBtn.isHidden = false
// }else{
// vc.webSeriesHindiBtn.isHidden = true
// }
}
// 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<CommonResponseModel, 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)
}
}
}
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<BaseResponseModel<CommonResponseModel>, 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<CommonResponseModel, 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)
}
}
}
func checkNil(){
guard let data = MyListDataTemp.shareInstance.favListingData else{return}
if data.showData?.english?.count == 0 && data.singKaraokeData?.count == 0 && data.gameData?.count == 0 && data.audioData?.count == 0 && data.showData?.hindi?.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()
}
}