Files
Woka_Native_iOS/WOKA/WebSeries/Controller/WebSeriesSeasonVC.swift
2024-09-25 20:10:31 +05:30

389 lines
16 KiB
Swift

//
// WebSeriesSeasonVC.swift
// WOKA
//
// Created by MacBook Pro on 20/06/24.
//
import UIKit
import JWPlayerKit
class WebSeriesSeasonVC: UIViewController {
var vm = WebSeriesSeasonVM()
@IBOutlet weak var seasonImage: UIImageView!
@IBOutlet weak var seasonTitle: UILabel!
@IBOutlet weak var seasonDate: UILabel!
@IBOutlet weak var seasonEpisodes: UILabel!
@IBOutlet weak var seasonMediaType: UILabel!
@IBOutlet weak var seasonDesc: UILabel!
@IBOutlet weak var categoryCV: UICollectionView!
//Episode Outlet
@IBOutlet weak var episodeTitle: UILabel!
@IBOutlet weak var episodeTableView: UITableView!
@IBOutlet weak var tableHeight: NSLayoutConstraint!
//Teaser Outlet
@IBOutlet weak var teaserTableView: UITableView!
@IBOutlet weak var teaserTableHeight: NSLayoutConstraint!
@IBOutlet weak var teaserTitle: LocalisedElementsLabel!
@IBOutlet weak var addIcon: UIImageView!
@IBOutlet weak var addLabel: UILabel!
@IBOutlet weak var likeIcon: UIImageView!
@IBOutlet weak var likeLabel: UILabel!
@IBOutlet weak var totalLikes: UILabel!
@IBOutlet weak var addView: UIView!
@IBOutlet weak var shareView: UIView!
@IBOutlet weak var likeView: UIView!
@IBOutlet weak var loadMoreBtn: LocalisedElementsButton!
@IBOutlet weak var loadMoreActivityIndicator: UIActivityIndicatorView!
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var noDataStack: UIStackView!
var likeFavDelegate : ReloadSeriesFavLike?
override func viewDidLoad() {
super.viewDidLoad()
vm.vc = self
vm.initView()
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.shadowImage = UIImage()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationController?.setNavigationBarHidden(false, animated: animated)
}
override func viewDidAppear(_ animated: Bool) {
self.navigationController?.setColor(color: .white)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.navigationController?.setNavigationBarHidden(true, animated: animated)
if self.isMovingFromParent {
// Back button was pressed
PersistentStorage.shared.addOthersCount()
}
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
// Customize the navigation bar's appearance
self.navigationController?.setColor(color: .black)
}
@IBAction func playTrailerBtnTapped(_ sender: LocalisedElementsButton) {
// 1-> english , 18- hindi
var playerItems = [JwPlayerItemCreate]()
guard let seasonData = vm.seasonListingData.filter({$0.id == vm.episodeSelectedCateogory}).first else{return}
var url = String()
guard let englishData = seasonData.seasonMoreDetails?.filter({$0.languageMasterID == 1}).first, let hindiData = seasonData.seasonMoreDetails?.filter({$0.languageMasterID == 2}).first else{return}
if let seasonID = seasonData.id , let catID = vm.categoryID{
PersistentStorage.shared.addWebSeries(catID: catID, postID: seasonID, postType: .season)
}
/*
Based on selected Category language update the url
*/
if vm.categoryID == 1{ //1- english , 18 - hindi
url = englishData.trailerHDURL ?? ""
}else{
url = hindiData.trailerHDURL ?? ""
}
/*
Based on language change the title
*/
if AuthFunc.shareInstance.languageSelected == .english{
playerItems.append(JwPlayerItemCreate(url: url, poster: seasonData.thumbnailPath, titles: englishData.title))
}else{
playerItems.append(JwPlayerItemCreate(url: url, poster: seasonData.thumbnailPath, titles: hindiData.title))
}
JWPlayerManager.shared.presentPlayer(from: self, playerItems: playerItems, startIndex: 0, contentType: .trailer, videoIDs: [0])
}
@IBAction func loadMoreBtnTapped(_ sender: LocalisedElementsButton) {
PersistentStorage.shared.addOthersCount()
loadMoreBtn.isHidden = true
vm.pageNo += 1
loadMoreActivityIndicator.startAnimating()
vm.getSeasonEpisode()
}
@IBAction func retryBtnTapped(_ sender: LocalisedElementsButton) {
vm.getSeasonListing()
}
}
// MARK: - TableView DataSource , Delegates
extension WebSeriesSeasonVC : TableViewSRC{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
switch tableView{
case episodeTableView:
return vm.seasonEpisodeData.count
case teaserTableView:
return vm.teaserData.count
default:
return 0
}
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 100
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: K.CellIdentifier.WebSeries.webSeriesEpisodeCell) as! WebSeriesEpisodeCell
switch tableView{
case episodeTableView:
let data = vm.seasonEpisodeData[indexPath.row]
cell.setData(data: data)
case teaserTableView:
let data = vm.teaserData[indexPath.row]
cell.setTeaserData(data: data)
default:
break
}
cell.btnTapped = { [self] () -> Void in
var playerItems = [JwPlayerItemCreate]()
switch tableView{
case self.teaserTableView:
let teaserData = vm.teaserData[indexPath.row]
if let showID = teaserData.id, let catID = self.vm.categoryID{
PersistentStorage.shared.addWebSeries(catID: catID, postID: showID, postType: .teaser)
}
guard let englishData = teaserData.contentMoreDetails?.filter({$0.languageMasterID == 1}).first, let hindiData = teaserData.contentMoreDetails?.filter({$0.languageMasterID == 2}).first else{return}
var url = String()
/*
Based on selected Category language update the url
*/
if vm.categoryID == 1{ //1- english , 18 - hindi
url = englishData.contentHDURL ?? ""
}else{
url = hindiData.contentHDURL ?? ""
}
/*
Based on language change the title
*/
if AuthFunc.shareInstance.languageSelected == .english{
playerItems.append(JwPlayerItemCreate(url: url, poster: teaserData.thumbnailPath, titles: englishData.title))
}else{
playerItems.append(JwPlayerItemCreate(url: url, poster: teaserData.thumbnailPath, titles: hindiData.title))
}
JWPlayerManager.shared.presentPlayer(from: self, playerItems: playerItems, startIndex: indexPath.row, contentType: .trailer, videoIDs: [0])
case self.episodeTableView:
let episodeData = vm.seasonEpisodeData
if let showID = episodeData[indexPath.row].id, let catID = self.vm.categoryID{
PersistentStorage.shared.addWebSeries(catID: catID, postID: showID, postType: .episode)
}
var videoIDs = [Int]()
for i in episodeData{
var url = String()
guard let englishData = i.contentMoreDetails?.filter({$0.languageMasterID == 1}).first, let hindiData = i.contentMoreDetails?.filter({$0.languageMasterID == 2}).first else{return}
if let id = i.id{
videoIDs.append(id)
}
/*
Based on selected Category language update the url
*/
if vm.categoryID == 1{ //1- english , 18 - hindi
url = englishData.contentHDURL ?? ""
}else{
url = hindiData.contentHDURL ?? ""
}
/*
Based on language change the title
*/
if AuthFunc.shareInstance.languageSelected == .english{
playerItems.append(JwPlayerItemCreate(url: url, poster: i.thumbnailPath, titles: englishData.title))
}else{
playerItems.append(JwPlayerItemCreate(url: url, poster: i.thumbnailPath, titles: hindiData.title))
}
}
if let selectedMediaType = self.vm.seasonListingData.filter({$0.id == self.vm.episodeSelectedCateogory!}).first, selectedMediaType.mediaType?.lowercased() == "songs"{
JWPlayerManager.shared.presentPlayer(from: self, playerItems: playerItems, startIndex: indexPath.row, contentType: .masilaSongs, videoIDs: videoIDs,catID: vm.categoryID)
return
}
JWPlayerManager.shared.presentPlayer(from: self, playerItems: playerItems, startIndex: indexPath.row, contentType: .webSeries, videoIDs: videoIDs, catID: vm.categoryID)
default:
break
}
}
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let sb = UIStoryboard(name: K.StoryBoard.webSeries, bundle: nil)
let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.WebSeries.episodeDetailsVC) as! EpisodeDetailsVC
switch tableView{
case teaserTableView:
let data = vm.teaserData[indexPath.row]
if let showID = data.id, let catID = self.vm.categoryID{
PersistentStorage.shared.addWebSeries(catID: catID, postID: showID, postType: .teaser)
}
vcPush.teaserData = data
default:
let selectedMediaType = vm.seasonListingData.filter({$0.id == vm.episodeSelectedCateogory!}).first
print(selectedMediaType?.mediaType)
let data = vm.seasonEpisodeData[indexPath.row]
if let showID = data.id, let catID = self.vm.categoryID{
PersistentStorage.shared.addWebSeries(catID: catID, postID: showID, postType: .episode)
}
vcPush.episodeData = data
}
vcPush.onDoneBlock = { [weak self] in
guard let self else{return}
var playerItems = [JwPlayerItemCreate]()
switch tableView{
case self.teaserTableView:
let teaserData = vm.teaserData[indexPath.row]
guard let englishData = teaserData.contentMoreDetails?.filter({$0.languageMasterID == 1}).first, let hindiData = teaserData.contentMoreDetails?.filter({$0.languageMasterID == 2}).first else{return}
var url = String()
/*
Based on selected Category language update the url
*/
if vm.categoryID == 1{ //1- english , 18 - hindi
url = englishData.contentHDURL ?? ""
}else{
url = hindiData.contentHDURL ?? ""
}
/*
Based on language change the title
*/
if AuthFunc.shareInstance.languageSelected == .english{
playerItems.append(JwPlayerItemCreate(url: url, poster: teaserData.thumbnailPath, titles: englishData.title))
}else{
playerItems.append(JwPlayerItemCreate(url: url, poster: teaserData.thumbnailPath, titles: hindiData.title))
}
JWPlayerManager.shared.presentPlayer(from: self, playerItems: playerItems,startIndex: indexPath.row, contentType: .trailer, videoIDs: [0])
case self.episodeTableView:
let episodeData = vm.seasonEpisodeData
var videoIDs = [Int]()
for i in episodeData{
var url = String()
if let id = i.id{
videoIDs.append(id)
}
guard let englishData = i.contentMoreDetails?.filter({$0.languageMasterID == 1}).first, let hindiData = i.contentMoreDetails?.filter({$0.languageMasterID == 2}).first else{return}
/*
Based on selected Category language update the url
*/
if vm.categoryID == 1{ //1- english , 18 - hindi
url = englishData.contentHDURL ?? ""
}else{
url = hindiData.contentHDURL ?? ""
}
/*
Based on language change the title
*/
if AuthFunc.shareInstance.languageSelected == .english{
playerItems.append(JwPlayerItemCreate(url: url, poster: i.thumbnailPath, titles: englishData.title))
}else{
playerItems.append(JwPlayerItemCreate(url: url, poster: i.thumbnailPath, titles: hindiData.title))
}
}
JWPlayerManager.shared.presentPlayer(from: self, playerItems: playerItems, startIndex: indexPath.row, contentType: .webSeries, videoIDs: videoIDs,catID: vm.categoryID)
default:
break
}
}
vcPush.modalPresentationStyle = .overCurrentContext
vcPush.modalTransitionStyle = .crossDissolve
self.present(vcPush, animated: true)
}
}
// MARK: - CollectionView Delegate
extension WebSeriesSeasonVC : CollectionViewSRC{
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return vm.seasonListingData.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: K.CellIdentifier.WebSeries.seasonCategoryCell, for: indexPath) as! SeasonCategoryCell
let data = vm.seasonListingData[indexPath.row]
cell.setData(title: data.seasonNumber ?? "Season", iselected: data.id == vm.episodeSelectedCateogory)
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
if let seasonID = vm.seasonListingData[indexPath.row].id , let catID = vm.categoryID{
PersistentStorage.shared.addWebSeries(catID: catID, postID: seasonID, postType: .season)
}
if vm.episodeSelectedCateogory == vm.seasonListingData[indexPath.row].id{
return
}
vm.episodeSelectedCateogory = vm.seasonListingData[indexPath.row].id
vm.setSeasonData()
episodeTitle.isHidden = false
episodeTitle.text = ""
vm.pageNo = 0
vm.getSeasonEpisode()
vm.getTeaserListing()
self.categoryCV.reloadData()
}
}
// MARK: - Collection Flow Layout
extension WebSeriesSeasonVC : UICollectionViewDelegateFlowLayout{
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
// Generate a random string for testing purposes
let randomText = vm.seasonListingData[indexPath.row].seasonNumber!
// Define the font for the text
let font = FontCustom.shareInstance.customFont(fontName: .Exo2_Bold, size: 18) // Adjust the font size as needed
// Calculate the width of the text
let attributes = [NSAttributedString.Key.font: font]
let textWidth = (randomText as NSString).size(withAttributes: attributes).width
// Set the cell width based on the text width and any additional padding
// 14 for container view + 10 for inside spacing.
let padding: CGFloat = 24 + 20 // Adjust padding as needed
let cellWidth = textWidth + padding
return CGSize(width: cellWidth , height: 60)
}
}