365 lines
16 KiB
Swift
365 lines
16 KiB
Swift
//
|
|
// GamesDetailVC.swift
|
|
// WOKA
|
|
//
|
|
// Created by MacBook Pro on 04/07/24.
|
|
//
|
|
|
|
import UIKit
|
|
import GoogleMobileAds
|
|
import Alamofire
|
|
|
|
class GamesDetailVC: UIViewController {
|
|
|
|
@IBOutlet weak var watchingImage: UIImageView!
|
|
@IBOutlet weak var watchingTitle: UILabel!
|
|
@IBOutlet weak var watchingDesc: UITextView!
|
|
|
|
@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 outerView: UIView!
|
|
@IBOutlet weak var contentView: UIView!
|
|
|
|
var gameData : GamesListDM.GameDatum?
|
|
var delegate : ReloadSeriesFavLike?
|
|
var gameIndex = 0
|
|
|
|
//for myList
|
|
typealias btnTappedBlock = ( _ from : FavCellCLick) -> Void
|
|
var btnTapped : btnTappedBlock?
|
|
var reloadType : FavCellCLick?
|
|
|
|
// private var interstitial: GADInterstitialAd?
|
|
// private var rewardedAd: GADRewardedAd?
|
|
|
|
|
|
override func viewDidLoad() {
|
|
super.viewDidLoad()
|
|
initView()
|
|
tapHandler()
|
|
GoogleInterstistialADSetup.shareInstance.interstitial?.fullScreenContentDelegate = self
|
|
}
|
|
|
|
@objc func handleTap(_ gesture: UITapGestureRecognizer) {
|
|
let location = gesture.location(in: outerView)
|
|
if !contentView.frame.contains(location) {
|
|
if let postID = gameData?.id{
|
|
PersistentStorage.shared.addGamesCount(postID: postID)
|
|
}
|
|
if let reloadType{
|
|
if btnTapped != nil {
|
|
btnTapped?(reloadType)
|
|
}
|
|
}
|
|
self.dismiss(animated: true)
|
|
}
|
|
}
|
|
|
|
func initView(){
|
|
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
|
|
outerView.addGestureRecognizer(tapGesture)
|
|
|
|
if let gameData{
|
|
if let url = gameData.thumbnailPath{
|
|
watchingImage.imageURL(url, color: .white)
|
|
}
|
|
|
|
totalLikes.text = gameData.likesCount?.toString() ?? "0"
|
|
if let like = gameData.isLiked{
|
|
switch like{
|
|
case true:
|
|
likeIcon.image = UIImage(systemName: "hand.thumbsup.fill")
|
|
likeLabel.text = "LIKED".localized(loc: AuthFunc.shareInstance.languageSelected.rawValue)
|
|
case false:
|
|
likeIcon.image = UIImage(systemName: "hand.thumbsup")
|
|
likeLabel.text = "LIKE".localized(loc: AuthFunc.shareInstance.languageSelected.rawValue)
|
|
}
|
|
}
|
|
|
|
if let favourite = gameData.markAsFavourite{
|
|
if favourite == true{
|
|
addIcon.image = UIImage(systemName: "heart.fill")
|
|
addLabel.text = "ADDED".localized(loc: AuthFunc.shareInstance.languageSelected.rawValue)
|
|
}else{
|
|
addIcon.image = UIImage(systemName: "heart")
|
|
addLabel.text = "ADD".localized(loc: AuthFunc.shareInstance.languageSelected.rawValue)
|
|
}
|
|
}
|
|
|
|
if AuthFunc.shareInstance.getDefaultLanguage() == .english{
|
|
if let englishData = gameData.contentMoreDetails?.filter({$0.languageMasterID == 1}).first{
|
|
watchingTitle.text = englishData.title
|
|
if let desc = englishData.description?.replacingOccurrences(of: "<br>", with: "").htmlToAttributedString{
|
|
let sizeText = NSMutableAttributedString(attributedString: desc)
|
|
sizeText.setFontFace(font: FontCustom.shareInstance.customFont(fontName: .Exo2_Regular, size: 15),color: UIColor.appColor(.TextDarkBlue)!)
|
|
self.watchingDesc.attributedText = sizeText
|
|
}
|
|
}
|
|
}else{
|
|
if let hindiData = gameData.contentMoreDetails?.filter({$0.languageMasterID == 2}).first{
|
|
watchingTitle.text = hindiData.title
|
|
if let desc = hindiData.description?.replacingOccurrences(of: "<br>", with: "").htmlToAttributedString{
|
|
let sizeText = NSMutableAttributedString(attributedString: desc)
|
|
sizeText.setFontFace(font: FontCustom.shareInstance.customFont(fontName: .Exo2_Regular, size: 15),color: UIColor.appColor(.TextDarkBlue)!)
|
|
self.watchingDesc.attributedText = sizeText
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func tapHandler(){
|
|
|
|
self.view.addTapGesture {
|
|
self.dismiss(animated: true)
|
|
}
|
|
|
|
addView.addTapGesture { [weak self] in
|
|
guard let self else{return}
|
|
HapticFeedbackGenerator.shared.simpleSelection()
|
|
if let postID = gameData?.id{
|
|
PersistentStorage.shared.addGamesCount(postID: postID)
|
|
}
|
|
if AuthFunc.shareInstance.guestUserLoginPopUp() { return}
|
|
|
|
if let gameData{
|
|
guard let showID = gameData.id, let isFav = gameData.markAsFavourite, let postType = gameData.contentMoreDetails?.first?.postType else{return}
|
|
|
|
if isFav {
|
|
//remove
|
|
LikeFavCommonFunc.shareInstance.removeFavourite(postID: showID, postType: postType, categoryID: 0, vc: self) { isDone in
|
|
self.gameData?.markAsFavourite = false
|
|
// if let index = MyListDataTemp.shareInstance.favListingData?.gameData?.firstIndex(where: {$0.id == showID}){
|
|
// MyListDataTemp.shareInstance.favListingData?.gameData?.remove(at: index)
|
|
// K.GVar.myListSoftReload = true
|
|
// }
|
|
K.GVar.reloadGames = true
|
|
self.reloadType = .favourite
|
|
// To reload MyListViewAllVC
|
|
K.GVar.reloadMyListAll = 2
|
|
K.GVar.reloadMyListAllID = showID
|
|
|
|
self.delegate?.updateRows(index: self.gameIndex, type: .favourite, isFav: false, isLike: nil, id: showID)
|
|
self.initView()
|
|
}
|
|
}else{
|
|
//add
|
|
LikeFavCommonFunc.shareInstance.addFavourite(postID: showID, postType: postType, categoryID: 0, vc: self) { isDone in
|
|
self.gameData?.markAsFavourite = true
|
|
// if let gameData = self.gameData{
|
|
// MyListDataTemp.shareInstance.favListingData?.gameData?.append(gameData)
|
|
// K.GVar.myListSoftReload = true
|
|
// }
|
|
K.GVar.reloadGames = true
|
|
self.reloadType = .favourite
|
|
// To reload MyListViewAllVC
|
|
K.GVar.reloadMyListAll = 1
|
|
K.GVar.reloadMyListAllID = showID
|
|
|
|
self.delegate?.updateRows(index: self.gameIndex, type: .favourite, isFav: true, isLike: nil, id: showID)
|
|
self.initView()
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
likeView.addTapGesture { [weak self] in
|
|
guard let self else{return}
|
|
HapticFeedbackGenerator.shared.simpleSelection()
|
|
if let postID = gameData?.id{
|
|
PersistentStorage.shared.addGamesCount(postID: postID)
|
|
}
|
|
if AuthFunc.shareInstance.guestUserLoginPopUp() { return}
|
|
|
|
if let gameData{
|
|
guard let showID = gameData.id, let isLiked = gameData.isLiked, let postType = gameData.contentMoreDetails?.first?.postType else{return}
|
|
|
|
if isLiked{
|
|
//unlike
|
|
LikeFavCommonFunc.shareInstance.unlikePost(postID: showID, postType: postType, vc: self) { isDone in
|
|
self.gameData?.isLiked = false
|
|
if let index = MyListDataTemp.shareInstance.favListingData?.gameData?.firstIndex(where: {$0.id == showID}){
|
|
MyListDataTemp.shareInstance.favListingData?.gameData?[index].isLiked = false
|
|
MyListDataTemp.shareInstance.favListingData?.gameData?[index].likesCount! -= 1
|
|
}
|
|
self.delegate?.updateRows(index: self.gameIndex, type: .liked, isFav: nil, isLike: false, id: showID)
|
|
K.GVar.myListSoftReload = true
|
|
self.reloadType = .favourite
|
|
self.initView()
|
|
}
|
|
}else{
|
|
//like
|
|
LikeFavCommonFunc.shareInstance.likePost(postID: showID, postType: postType, vc: self) { isDone in
|
|
self.gameData?.isLiked = true
|
|
if let index = MyListDataTemp.shareInstance.favListingData?.gameData?.firstIndex(where: {$0.id == showID}){
|
|
MyListDataTemp.shareInstance.favListingData?.gameData?[index].isLiked = true
|
|
MyListDataTemp.shareInstance.favListingData?.gameData?[index].likesCount! += 1
|
|
}
|
|
self.delegate?.updateRows(index: self.gameIndex, type: .liked, isFav: nil, isLike: true, id: showID)
|
|
K.GVar.myListSoftReload = true
|
|
self.reloadType = .favourite
|
|
self.initView()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
shareView.addTapGesture { [weak self] in
|
|
guard let self else{return}
|
|
HapticFeedbackGenerator.shared.simpleSelection()
|
|
if let postID = gameData?.id{
|
|
PersistentStorage.shared.addGamesCount(postID: postID)
|
|
}
|
|
|
|
if AuthFunc.shareInstance.getUserType() == 1{
|
|
let sb = UIStoryboard(name: K.StoryBoard.captcha, bundle: nil)
|
|
let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.CaptchaVC.captchaVC) as! CaptchaVC
|
|
vcPush.onDoneBlock = {
|
|
ShareApp.shareInstance.share(vc: self)
|
|
}
|
|
vcPush.modalPresentationStyle = .overCurrentContext
|
|
vcPush.modalTransitionStyle = .crossDissolve
|
|
self.present(vcPush, animated: true)
|
|
}else{
|
|
ShareApp.shareInstance.share(vc: self)
|
|
}
|
|
}
|
|
}
|
|
|
|
@IBAction func playNowBtnTapped(_ sender: LocalisedElementsButton) {
|
|
if let postID = gameData?.id{
|
|
PersistentStorage.shared.addGamesCount(postID: postID)
|
|
}
|
|
|
|
//If Google Interstitial is enable then only check for time and all, otherwise directly load GamesWebView
|
|
if let adsData = AuthFunc.shareInstance.adsData, let gamesInterstitialAd = adsData.result?.filter({$0.slug == AdsEnum.gameInterestial.rawValue}).first, gamesInterstitialAd.googleAd != nil{
|
|
/*
|
|
Show google ads with dispatch queue.
|
|
*/
|
|
checkAds()
|
|
}else{
|
|
K.GVar.adTimeStamp = nil
|
|
navigateToGamesWebView()
|
|
}
|
|
}
|
|
|
|
func checkAds(){
|
|
/*
|
|
check ad timestamp from gvar
|
|
show ads if the saved timestamp time and current time has diffrenece of 30 minutes
|
|
*/
|
|
if let timeStamp = K.GVar.adTimeStamp{
|
|
/*
|
|
check if timestamp difference is equal and greater than 30 minutes i.e 1800 seconds
|
|
*/
|
|
let duration = DateFormatterLib.dateDifferenceINT(date1: timeStamp, date2: Date())
|
|
print(duration)
|
|
|
|
if duration <= 1800{
|
|
// dont show ads navigate to webview
|
|
navigateToGamesWebView()
|
|
}else{
|
|
//show ads & reset timestamp to current time
|
|
K.GVar.adTimeStamp = Date()
|
|
|
|
guard let interstitial = GoogleInterstistialADSetup.shareInstance.interstitial else {
|
|
// if ad doesnt loads make sure to make adtimestamp nil, and let user navigate to games
|
|
K.GVar.adTimeStamp = nil
|
|
navigateToGamesWebView()
|
|
return print("Ad wasn't ready.")
|
|
}
|
|
|
|
// The UIViewController parameter is an optional.
|
|
interstitial.present(fromRootViewController: nil)
|
|
}
|
|
}else{
|
|
/* assing date if it is nil and play the ad.
|
|
also it means its the first time show the interstial ad.
|
|
*/
|
|
K.GVar.adTimeStamp = Date()
|
|
|
|
guard let interstitial = GoogleInterstistialADSetup.shareInstance.interstitial else {
|
|
// if ad doesnt loads make sure to make adtimestamp nil, and let user navigate to games
|
|
K.GVar.adTimeStamp = nil
|
|
navigateToGamesWebView()
|
|
return print("Ad wasn't ready.")
|
|
}
|
|
|
|
// The UIViewController parameter is an optional.
|
|
interstitial.present(fromRootViewController: nil)
|
|
return
|
|
}
|
|
}
|
|
|
|
// private func setupAds(){
|
|
// GADInterstitialAd.load(withAdUnitID: K.GoogleAdIDs.gamesDetailsInterStial, request: GADRequest()) { [weak self] ad, error in
|
|
// if let error = error {
|
|
// print("Failed to load interstitial ad with error: \(error.localizedDescription)")
|
|
//
|
|
// // If internet is reachable, try to load the ad again
|
|
// if self?.reachability?.isReachable == true {
|
|
// self?.setupAds()
|
|
// }
|
|
// return
|
|
// }
|
|
//
|
|
// // Successfully loaded the interstitial ad
|
|
// self?.interstitial = ad
|
|
// self?.interstitial?.fullScreenContentDelegate = self
|
|
// print("Interstitial ad loaded successfully.")
|
|
// }
|
|
// }
|
|
|
|
private func navigateToGamesWebView(){
|
|
let sb = UIStoryboard(name: K.StoryBoard.Games, bundle: nil)
|
|
let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Games.gamesWebViewVC) as! GamesWebViewVC
|
|
vcPush.url = self.gameData?.gameURL
|
|
vcPush.postID = gameData?.id
|
|
vcPush.orientation = self.gameData?.screenOrientation
|
|
vcPush.modalTransitionStyle = .crossDissolve
|
|
vcPush.modalPresentationStyle = .overFullScreen
|
|
self.present(vcPush, animated: true)
|
|
}
|
|
|
|
@IBAction func closeBtnTapped(_ sender: UIButton) {
|
|
if let postID = gameData?.id{
|
|
PersistentStorage.shared.addGamesCount(postID: postID)
|
|
}
|
|
if let reloadType{
|
|
if btnTapped != nil {
|
|
btnTapped?(reloadType)
|
|
}
|
|
}
|
|
self.dismiss(animated: true)
|
|
}
|
|
}
|
|
|
|
extension GamesDetailVC : GADFullScreenContentDelegate{
|
|
/// Tells the delegate that the ad failed to present full screen content.
|
|
func ad(_ ad: GADFullScreenPresentingAd, didFailToPresentFullScreenContentWithError error: Error) {
|
|
print("Ad did fail to present full screen content.")
|
|
}
|
|
|
|
/// Tells the delegate that the ad will present full screen content.
|
|
func adWillPresentFullScreenContent(_ ad: GADFullScreenPresentingAd) {
|
|
print("Ad will present full screen content.")
|
|
}
|
|
|
|
/// Tells the delegate that the ad dismissed full screen content.
|
|
func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) {
|
|
print("Ad did dismiss full screen content.")
|
|
self.navigateToGamesWebView()
|
|
//setup ads again and wait for the timestamp 30 minutes
|
|
GoogleInterstistialADSetup.shareInstance.setupGoogleIntersitialAD()
|
|
}
|
|
}
|