diff --git a/WOKA.xcodeproj/project.pbxproj b/WOKA.xcodeproj/project.pbxproj index 0493355..6f7967d 100644 --- a/WOKA.xcodeproj/project.pbxproj +++ b/WOKA.xcodeproj/project.pbxproj @@ -141,7 +141,6 @@ 52A981D82C1B0E27000E0BEC /* FavouriteCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 52A981D62C1B0E27000E0BEC /* FavouriteCell.xib */; }; 52AC2D252C295A7900337473 /* TeaserDM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52AC2D242C295A7900337473 /* TeaserDM.swift */; }; 52AC2D272C29791500337473 /* JWPlayerManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52AC2D262C29791500337473 /* JWPlayerManager.swift */; }; - 52ACC1222C610C5900791528 /* WOKA.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 52ACC1202C610C5900791528 /* WOKA.xcdatamodeld */; }; 52ACC1252C610CBC00791528 /* UserClicks+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52ACC1232C610CBC00791528 /* UserClicks+CoreDataClass.swift */; }; 52ACC1262C610CBC00791528 /* UserClicks+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52ACC1242C610CBC00791528 /* UserClicks+CoreDataProperties.swift */; }; 52ACC12A2C610EC900791528 /* PersistentStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52ACC1292C610EC900791528 /* PersistentStorage.swift */; }; @@ -244,6 +243,8 @@ 9C21F81C2C37E1FA0050BFCC /* KaraokeContinueWatchingDM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C21F81B2C37E1FA0050BFCC /* KaraokeContinueWatchingDM.swift */; }; 9C21F81E2C37E3CA0050BFCC /* AVPlayerVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C21F81D2C37E3CA0050BFCC /* AVPlayerVC.swift */; }; 9C21F8222C382A580050BFCC /* AVPlayerVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C21F8212C382A580050BFCC /* AVPlayerVM.swift */; }; + 9C23FB772C62085C00F4DC5C /* WOKA.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 9C23FB752C62085C00F4DC5C /* WOKA.xcdatamodeld */; }; + 9C23FB792C62164600F4DC5C /* URLStaticDM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C23FB782C62164600F4DC5C /* URLStaticDM.swift */; }; 9C27E1602BDB6ECA00EC1DA9 /* UserDefaultsStruct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C27E15F2BDB6ECA00EC1DA9 /* UserDefaultsStruct.swift */; }; 9C27E1632BDB6F1900EC1DA9 /* AuthFunc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C27E1622BDB6F1900EC1DA9 /* AuthFunc.swift */; }; 9C27E1652BDB6FBC00EC1DA9 /* StoryBoardID.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C27E1642BDB6FBC00EC1DA9 /* StoryBoardID.swift */; }; @@ -493,7 +494,6 @@ 52A981D62C1B0E27000E0BEC /* FavouriteCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = FavouriteCell.xib; sourceTree = ""; }; 52AC2D242C295A7900337473 /* TeaserDM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TeaserDM.swift; sourceTree = ""; }; 52AC2D262C29791500337473 /* JWPlayerManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JWPlayerManager.swift; sourceTree = ""; }; - 52ACC1212C610C5900791528 /* WOKA.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = WOKA.xcdatamodel; sourceTree = ""; }; 52ACC1232C610CBC00791528 /* UserClicks+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserClicks+CoreDataClass.swift"; sourceTree = SOURCE_ROOT; }; 52ACC1242C610CBC00791528 /* UserClicks+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserClicks+CoreDataProperties.swift"; sourceTree = SOURCE_ROOT; }; 52ACC1292C610EC900791528 /* PersistentStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersistentStorage.swift; sourceTree = ""; }; @@ -600,6 +600,8 @@ 9C21F81B2C37E1FA0050BFCC /* KaraokeContinueWatchingDM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KaraokeContinueWatchingDM.swift; sourceTree = ""; }; 9C21F81D2C37E3CA0050BFCC /* AVPlayerVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AVPlayerVC.swift; sourceTree = ""; }; 9C21F8212C382A580050BFCC /* AVPlayerVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AVPlayerVM.swift; sourceTree = ""; }; + 9C23FB762C62085C00F4DC5C /* WOKA.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = WOKA.xcdatamodel; sourceTree = ""; }; + 9C23FB782C62164600F4DC5C /* URLStaticDM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLStaticDM.swift; sourceTree = ""; }; 9C27E15F2BDB6ECA00EC1DA9 /* UserDefaultsStruct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaultsStruct.swift; sourceTree = ""; }; 9C27E1622BDB6F1900EC1DA9 /* AuthFunc.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthFunc.swift; sourceTree = ""; }; 9C27E1642BDB6FBC00EC1DA9 /* StoryBoardID.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoryBoardID.swift; sourceTree = ""; }; @@ -855,7 +857,7 @@ 9C535DC82C00C34000DA6DCD /* Theme */, 52DAC6462C21761700E2F85B /* WebSeries */, 9C834ED92C1C20EC00B29A9C /* WOKA.entitlements */, - 52ACC1202C610C5900791528 /* WOKA.xcdatamodeld */, + 9C23FB752C62085C00F4DC5C /* WOKA.xcdatamodeld */, 52ACC1292C610EC900791528 /* PersistentStorage.swift */, ); path = WOKA; @@ -895,6 +897,7 @@ children = ( 9C27E16A2BDB774D00EC1DA9 /* CarouselData.swift */, 529B0DD52C070C0F00CFC54B /* GuestDataDM.swift */, + 9C23FB782C62164600F4DC5C /* URLStaticDM.swift */, ); path = Model; sourceTree = ""; @@ -2189,6 +2192,7 @@ 52D2F3D82C24043D009E52FF /* ShimmerEffectView.swift in Sources */, 9C27E16F2BDB866500EC1DA9 /* CellIdentifier.swift in Sources */, 52BC3BF22C170264002FACA6 /* MoreVM.swift in Sources */, + 9C23FB772C62085C00F4DC5C /* WOKA.xcdatamodeld in Sources */, 9CB3D08F2C37D0D60062869D /* KaraokeListingDM.swift in Sources */, 52ACC12A2C610EC900791528 /* PersistentStorage.swift in Sources */, 9CBE1B412C0F37B300CA6E61 /* DPDUIView+Extension.swift in Sources */, @@ -2323,9 +2327,9 @@ 9C27E1722BDB86B600EC1DA9 /* OnBoardCell.swift in Sources */, 525861D82C4FD38D00C33C79 /* CartPaymentOptionsCell.swift in Sources */, 529B0DD42C06156B00CFC54B /* LoginNavVC.swift in Sources */, + 9C23FB792C62164600F4DC5C /* URLStaticDM.swift in Sources */, 52A981D72C1B0E27000E0BEC /* FavouriteCell.swift in Sources */, 52BFB0652C5B5B4F0038D750 /* BlogsVC.swift in Sources */, - 52ACC1222C610C5900791528 /* WOKA.xcdatamodeld in Sources */, 52C8B05F2BDA5AFA003B51D0 /* SplashVM.swift in Sources */, 52C1A4E12C05B69F007BAA50 /* UIApplicationSwitchRoot.swift in Sources */, 527A2BCC2C577F8A0080DF9B /* AnalyticsEventKeys.swift in Sources */, @@ -2827,14 +2831,14 @@ /* End XCSwiftPackageProductDependency section */ /* Begin XCVersionGroup section */ - 52ACC1202C610C5900791528 /* WOKA.xcdatamodeld */ = { + 9C23FB752C62085C00F4DC5C /* WOKA.xcdatamodeld */ = { isa = XCVersionGroup; children = ( - 52ACC1212C610C5900791528 /* WOKA.xcdatamodel */, + 9C23FB762C62085C00F4DC5C /* WOKA.xcdatamodel */, ); - currentVersion = 52ACC1212C610C5900791528 /* WOKA.xcdatamodel */; + currentVersion = 9C23FB762C62085C00F4DC5C /* WOKA.xcdatamodel */; name = WOKA.xcdatamodeld; - path = /Users/macbookpro/Desktop/WOKA/WOKA/WOKA.xcdatamodeld; + path = /Users/bilal/Desktop/woka_native_ios_swift/WOKA/WOKA.xcdatamodeld; sourceTree = ""; versionGroupType = wrapper.xcdatamodel; }; diff --git a/WOKA/Assets/Assets.xcassets/Home/DefaultAvatar.imageset/Contents.json b/WOKA/Assets/Assets.xcassets/Home/DefaultAvatar.imageset/Contents.json new file mode 100644 index 0000000..0030dc6 --- /dev/null +++ b/WOKA/Assets/Assets.xcassets/Home/DefaultAvatar.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "profile_placeholder.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/WOKA/Assets/Assets.xcassets/Home/DefaultAvatar.imageset/profile_placeholder.png b/WOKA/Assets/Assets.xcassets/Home/DefaultAvatar.imageset/profile_placeholder.png new file mode 100644 index 0000000..4d1ae9d Binary files /dev/null and b/WOKA/Assets/Assets.xcassets/Home/DefaultAvatar.imageset/profile_placeholder.png differ diff --git a/WOKA/Main/AuthFunc/AuthFunc.swift b/WOKA/Main/AuthFunc/AuthFunc.swift index 271d256..e71143c 100644 --- a/WOKA/Main/AuthFunc/AuthFunc.swift +++ b/WOKA/Main/AuthFunc/AuthFunc.swift @@ -24,6 +24,7 @@ class AuthFunc{ var playerLooper: AVPlayerLooper? var userType = UserType.adult var userData : UserDataDM.ResultData? + var staticURLs : URLStaticDM? var languageSelected = LocalizedEnum.english { didSet { @@ -159,6 +160,29 @@ class AuthFunc{ UserDefaults.standard.set(data.userType?.toInt(), forKey: K.UserDefaultsStruct.userType) UIApplication.setRootView(SideMenuController.instantiate(from: .Home)) } + + // MARK: - Get the Static URL's + + func getStaticURLs(){ + NetworkManager.shareInstance.apiRequest(url: APIEndPoints.StaticURLs.live_streaming, method: .get, queue : QueueHelper.background) { [weak self](result : Result, NetworkManager.APIError>) in + switch result{ + case .success(let data): + guard let self else{return} + switch data.success{ + case 0: + break + case 1: + guard let data = data.data else{return} + AuthFunc.shareInstance.staticURLs = data + default: + break + } + case .failure(let error): + break + } + } + } + } // MARK: - Language Enum diff --git a/WOKA/Network Adapter/APIEndPoints.swift b/WOKA/Network Adapter/APIEndPoints.swift index 8ddd7e5..63ca727 100644 --- a/WOKA/Network Adapter/APIEndPoints.swift +++ b/WOKA/Network Adapter/APIEndPoints.swift @@ -28,6 +28,7 @@ struct APIEndPoints { struct StaticURLs{ // var masilaUrl = "https://content.jwplatform.com/videos/Iygt11AD-Ysj2G4DQ.mp4" static let masilaUrl = "https://cdn.jwplayer.com/manifests/Iygt11AD.m3u8" + static let live_streaming = makeURL(path: "live_streaming") } struct Auth { diff --git a/WOKA/OnBoarding Module/Controller/SplashVC.swift b/WOKA/OnBoarding Module/Controller/SplashVC.swift index a3d97cc..b02e96d 100644 --- a/WOKA/OnBoarding Module/Controller/SplashVC.swift +++ b/WOKA/OnBoarding Module/Controller/SplashVC.swift @@ -78,6 +78,11 @@ class SplashVC: UIViewController { if AuthFunc.shareInstance.checkLogin(){ vm.getUserData() return + } else{ + //check if the static url data is fetched + if AuthFunc.shareInstance.staticURLs == nil{ + AuthFunc.shareInstance.getStaticURLs() + } } UIView.animate(withDuration: 0.5, animations: { // Update the constant value of the top constraint diff --git a/WOKA/OnBoarding Module/Model/URLStaticDM.swift b/WOKA/OnBoarding Module/Model/URLStaticDM.swift new file mode 100644 index 0000000..c4935b6 --- /dev/null +++ b/WOKA/OnBoarding Module/Model/URLStaticDM.swift @@ -0,0 +1,66 @@ +// +// URLStaticDM.swift +// WOKA +// +// Created by Bilal on 06/08/2024. +// + +import Foundation + +// MARK: - URLStaticDM +struct URLStaticDM: Codable { + let liveFmData: LiveFmData? + let liveData: [LiveDatum]? + + enum CodingKeys: String, CodingKey { + case liveFmData = "live_fm_data" + case liveData = "live_data" + } + + // MARK: - LiveDatum + struct LiveDatum: Codable { + let id: Int? + let name: Name? + let liveURL: LiveURL? + + enum CodingKeys: String, CodingKey { + case id, name + case liveURL = "live_url" + } + } + + // MARK: - LiveURL + struct LiveURL: Codable { + let hdURLEn, hdURLHin, sdURLEn, sdURLHin: String? + + enum CodingKeys: String, CodingKey { + case hdURLEn = "hd_url_en" + case hdURLHin = "hd_url_hin" + case sdURLEn = "sd_url_en" + case sdURLHin = "sd_url_hin" + } + } + + // MARK: - Name + struct Name: Codable { + let titleEn, titleHin: String? + + enum CodingKeys: String, CodingKey { + case titleEn = "title_en" + case titleHin = "title_hin" + } + } + + // MARK: - LiveFmData + struct LiveFmData: Codable { + let id: Int? + let title: String? + let liveFmURL: String? + + enum CodingKeys: String, CodingKey { + case id, title + case liveFmURL = "live_fm_url" + } + } + +} diff --git a/WOKA/OnBoarding Module/ViewModel/SplashVM.swift b/WOKA/OnBoarding Module/ViewModel/SplashVM.swift index 2d33e47..05bc60a 100644 --- a/WOKA/OnBoarding Module/ViewModel/SplashVM.swift +++ b/WOKA/OnBoarding Module/ViewModel/SplashVM.swift @@ -18,7 +18,7 @@ class SplashVM{ func initView(){ // Analytics.logEvent(K.AnalyticsEventKeys.guest_login_iOS, parameters: nil) - + AuthFunc.shareInstance.getStaticURLs() vc.activityIndicator.hidesWhenStopped = true let color1 = #colorLiteral(red: 0.144693464, green: 0.1426281333, blue: 0.6686832905, alpha: 1) let color2 = #colorLiteral(red: 0.4862745098, green: 0.1960784314, blue: 0.7019607843, alpha: 1) @@ -33,9 +33,7 @@ class SplashVM{ AuthFunc.shareInstance.languageSelected = language }else{ AuthFunc.shareInstance.setDefaultLanguage(language: .english) - } - - + } } @@ -95,6 +93,12 @@ class SplashVM{ startStopIndicator(start: false,hide: true) guard let data = data.data?.result else{return} AuthFunc.shareInstance.userData = data + + //check if the static url data is fetched + if AuthFunc.shareInstance.staticURLs == nil{ + AuthFunc.shareInstance.getStaticURLs() + } + UIApplication.setRootView(SideMenuController.instantiate(from: .Home)) print("User Token --> ", AuthFunc.shareInstance.getAccessToken()) default: @@ -108,6 +112,7 @@ class SplashVM{ } } + // handling activity indicator func startStopIndicator(start : Bool , hide : Bool = false){ if hide{ diff --git a/WOKA/PersistentStorage.swift b/WOKA/PersistentStorage.swift index 597baa5..3b847ce 100644 --- a/WOKA/PersistentStorage.swift +++ b/WOKA/PersistentStorage.swift @@ -13,6 +13,41 @@ import CoreData Do share this with your iOS group on whatsapp or facebook or anyone who wants to learn iOS*/ +enum PersistentStorageEnum : String{ + case UserClicks + + case click_counts + case category_id + case post_id + case post_type +} + +enum PostType: String { + case series = "1" + case season = "2" + case episode = "3" + case video = "4" +// case paint = "5" + case game = "6" + case audio = "7" + case karaokeVideo = "8" + case shopProduct = "9" +// case parentalVideo = "10" +// case article = "11" + case liveTV = "12" + case FM = "13" + case teaser = "14" + case others = "15" + case home = "16" +} + +struct UserClickData { + let clickCounts: Int + let categoryId: Int + let postId: Int + let postType: Int +} + final class PersistentStorage { @@ -47,27 +82,174 @@ final class PersistentStorage } } - func saveClicksCount(){ - let clicks = UserClicks(context: PersistentStorage.shared.context) - clicks.post_type = 1 - clicks.post_id = 22 - clicks.category_id = 33 - clicks.click_counts = 100 - PersistentStorage.shared.saveContext() + func createData(data : UserClickData){ + + //We need to create a context from this container + let managedContext = PersistentStorage.shared.context + + let share = UserClicks(context: managedContext) + share.click_counts = Int64(data.clickCounts) + share.category_id = Int64(data.categoryId) + share.post_id = Int64(data.postId) + share.post_type = Int64(data.postType) + + do { + try managedContext.save() + retrieveData() + } catch let error as NSError { + print("Could not save. \(error), \(error.userInfo)") + } } - func getchClicksCount(){ + func checkIfExist( key : PersistentStorageEnum , clicksData : UserClickData) { + + let managedContext = PersistentStorage.shared.context + let fetchRequest = NSFetchRequest(entityName: PersistentStorageEnum.UserClicks.rawValue) +// fetchRequest.fetchLimit = 1 +// fetchRequest.predicate = NSPredicate(format: "id == %d" ,id) + fetchRequest.predicate = NSPredicate(format: "\(key.rawValue) == %@" ,clicksData.postType.toString()) + + do { + guard let result = try managedContext.fetch(fetchRequest) as? [UserClicks] else {return} + if result.isEmpty{ + //create + PersistentStorage.shared.createData(data: clicksData) + print("create") + }else{ + //update + let objectUpdate = result[0] as NSManagedObject + print("Update") + objectUpdate.setValue(result.first!.click_counts + Int64(clicksData.clickCounts), forKey: "click_counts") + do{ + try managedContext.save() + self.retrieveData() + } + catch + { + print(error) + } + } + result.forEach { clicks in + print("Counts" , clicks.click_counts) + } + }catch let error as NSError { + print("Could not fetch. \(error), \(error.userInfo)") + } + } + + func retrieveData() { + + //We need to create a context from this container + let managedContext = PersistentStorage.shared.context + let path = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) - debugPrint(path[0]) +// debugPrint(path[0]) + + let fetchRequests = NSFetchRequest(entityName: "UserClicks") + +// fetchRequests.fetchLimit = 1 +// fetchRequests.predicate = NSPredicate(format: "uuid = %@", "2") +// fetchRequests.sortDescriptors = [NSSortDescriptor.init(key: "uuid", ascending: false)] do { - guard let result = try PersistentStorage.shared.context.fetch(UserClicks.fetchRequest()) as? [UserClicks] else {return} - result.forEach({debugPrint("sad", $0.click_counts)}) + guard let result = try managedContext.fetch(fetchRequests) as? [UserClicks] else {return} + result.forEach { clicks in + print("ID:-" , clicks.post_type, "Count:-", clicks.click_counts) + } } catch let error { debugPrint(error) } } + + func updateData(){ + //We need to create a context from this container + let managedContext = PersistentStorage.shared.context + + + let fetchRequest:NSFetchRequest = NSFetchRequest.init(entityName: "UserClicks") + fetchRequest.predicate = NSPredicate(format: "uuid = %@", "2") + do + { + let test = try managedContext.fetch(fetchRequest) + + let objectUpdate = test[0] as! NSManagedObject + objectUpdate.setValue("Bilal Ahmed Khan New Name", forKey: "name") + do{ + try managedContext.save() + self.retrieveData() + } + catch + { + print(error) + } + } + catch + { + print(error) + } + + } + + func deleteData(){ + //We need to create a context from this container + let managedContext = PersistentStorage.shared.context + + let fetchRequest = NSFetchRequest(entityName: "UserClicks") +// fetchRequest.fetchLimit = 1 +// fetchRequest.predicate = NSPredicate(format: "uuid = %@ AND uuid = %@", "1", "1") + fetchRequest.predicate = NSPredicate(format: "post_id = %@", "11") + + do + { + let test = try managedContext.fetch(fetchRequest) + + let objectToDelete = test[0] as! NSManagedObject +// test.forEach { obbject in +// managedContext.delete(obbject as! NSManagedObject) +// } + managedContext.delete(test.first as! NSManagedObject) +// managedContext.delete(objectToDelete) + + do{ + try managedContext.save() +// self.createData() + self.retrieveData() + } + catch + { + print(error) + } + + } + catch + { + print(error) + } + } + +// func saveClicksCount(){ +// let clicks = UserClicks(context: PersistentStorage.shared.context) +// clicks.post_type = 1 +// clicks.post_id = 22 +// clicks.category_id = 33 +// clicks.click_counts = 100 +// PersistentStorage.shared.saveContext() +// } +// +// func getchClicksCount(){ +// let path = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) +// debugPrint(path[0]) +// +// do { +// guard let result = try PersistentStorage.shared.context.fetch(UserClicks.fetchRequest()) as? [UserClicks] else {return} +// result.forEach({debugPrint("sad", $0.click_counts)}) +// +// } catch let error +// { +// debugPrint(error) +// } +// } } diff --git a/WOKA/Shop/Controller/ProductDetailsVC.swift b/WOKA/Shop/Controller/ProductDetailsVC.swift index dad2d70..089e292 100644 --- a/WOKA/Shop/Controller/ProductDetailsVC.swift +++ b/WOKA/Shop/Controller/ProductDetailsVC.swift @@ -63,6 +63,8 @@ class ProductDetailsVC: UIViewController { } @IBAction func addToCartBtnTapped(_ sender: LocalisedElementsButton) { + if AuthFunc.shareInstance.guestUserLoginPopUp() { return} + if sender.titleLabel?.text == "Add to Cart"{ if let shopMasterID = vm.productDetails?.id{ vm.addToCart(shopMasterID: shopMasterID) @@ -72,7 +74,6 @@ class ProductDetailsVC: UIViewController { vm.removeItemFromCart(shopMasterID: shopMasterID) } } - } @IBAction func retryBtnTapped(_ sender: UIButton) { diff --git a/WOKA/Shop/ViewModel/ProductDetailsVM.swift b/WOKA/Shop/ViewModel/ProductDetailsVM.swift index e737b39..638edfa 100644 --- a/WOKA/Shop/ViewModel/ProductDetailsVM.swift +++ b/WOKA/Shop/ViewModel/ProductDetailsVM.swift @@ -29,6 +29,8 @@ class ProductDetailsVM{ } @objc func cartButtonTapped(){ + if AuthFunc.shareInstance.guestUserLoginPopUp() { return} + let sb = UIStoryboard(name: K.StoryBoard.cart, bundle: nil) let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Cart.cartListVC) as! CartListVC self.vc.navigationController?.pushViewController(vcPush, animated: true) diff --git a/WOKA/Shop/ViewModel/ShopCategoryVM.swift b/WOKA/Shop/ViewModel/ShopCategoryVM.swift index 39bf67e..4379b7e 100644 --- a/WOKA/Shop/ViewModel/ShopCategoryVM.swift +++ b/WOKA/Shop/ViewModel/ShopCategoryVM.swift @@ -26,6 +26,8 @@ class ShopCategoryVM{ } @objc func cartButtonTapped(){ + if AuthFunc.shareInstance.guestUserLoginPopUp() { return} + let sb = UIStoryboard(name: K.StoryBoard.cart, bundle: nil) let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Cart.cartListVC) as! CartListVC self.vc.navigationController?.pushViewController(vcPush, animated: true) diff --git a/WOKA/Shop/ViewModel/ShopListingVM.swift b/WOKA/Shop/ViewModel/ShopListingVM.swift index e0dec07..ddcc24a 100644 --- a/WOKA/Shop/ViewModel/ShopListingVM.swift +++ b/WOKA/Shop/ViewModel/ShopListingVM.swift @@ -36,6 +36,8 @@ class ShopListingVM{ } @objc func cartButtonTapped(){ + if AuthFunc.shareInstance.guestUserLoginPopUp() { return} + let sb = UIStoryboard(name: K.StoryBoard.cart, bundle: nil) let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Cart.cartListVC) as! CartListVC self.vc.navigationController?.pushViewController(vcPush, animated: true) diff --git a/WOKA/Shop/ViewModel/ShopProductsVM.swift b/WOKA/Shop/ViewModel/ShopProductsVM.swift index 41ae96a..bc051f1 100644 --- a/WOKA/Shop/ViewModel/ShopProductsVM.swift +++ b/WOKA/Shop/ViewModel/ShopProductsVM.swift @@ -31,6 +31,8 @@ class ShopProductsVM{ } @objc func cartButtonTapped(){ + if AuthFunc.shareInstance.guestUserLoginPopUp() { return} + let sb = UIStoryboard(name: K.StoryBoard.cart, bundle: nil) let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Cart.cartListVC) as! CartListVC self.vc.navigationController?.pushViewController(vcPush, animated: true) diff --git a/WOKA/SideBarNav/ViewModel/MyOrdersVM.swift b/WOKA/SideBarNav/ViewModel/MyOrdersVM.swift index 72be388..5b19486 100644 --- a/WOKA/SideBarNav/ViewModel/MyOrdersVM.swift +++ b/WOKA/SideBarNav/ViewModel/MyOrdersVM.swift @@ -33,6 +33,8 @@ class MyOrdersVM{ } @objc func cartButtonTapped(){ + if AuthFunc.shareInstance.guestUserLoginPopUp() { return} + let sb = UIStoryboard(name: K.StoryBoard.cart, bundle: nil) let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Cart.cartListVC) as! CartListVC self.vc.navigationController?.pushViewController(vcPush, animated: true) diff --git a/WOKA/TabBar & SideMenu/ViewModel/SideMenuVM.swift b/WOKA/TabBar & SideMenu/ViewModel/SideMenuVM.swift index 74ce10f..746f80d 100644 --- a/WOKA/TabBar & SideMenu/ViewModel/SideMenuVM.swift +++ b/WOKA/TabBar & SideMenu/ViewModel/SideMenuVM.swift @@ -102,6 +102,8 @@ class SideMenuVM{ if let avatar = data.avtarURL{ // vc.avatarImage.imageURL("https://wokaland.com/secret-panel-10102023/hidden-admin-portal-20092023/storage/app/public/uploads/avtar/avatar2.png?d=1716889852") vc.avatarImage.imageURL(avatar) + }else{ + vc.avatarImage.image = UIImage(named: "DefaultAvatar") } } diff --git a/WOKA/Theme/Controller/ThemeOneVC.swift b/WOKA/Theme/Controller/ThemeOneVC.swift index 54448aa..5744349 100644 --- a/WOKA/Theme/Controller/ThemeOneVC.swift +++ b/WOKA/Theme/Controller/ThemeOneVC.swift @@ -42,7 +42,6 @@ class ThemeOneVC: UIViewController { weak var delegate: ChildViewControllerDelegate? - deinit{ timer?.invalidate() // Removing observers @@ -71,6 +70,13 @@ class ThemeOneVC: UIViewController { MyListDataTemp.shareInstance.favListingData = FavouriteListingDM.ResultData(showData: [], videoData: [], gameData: [], singKaraokeData: [], audioData: []) } // connectedToNetwork() + +// PersistentStorage.shared.deleteData() +// PersistentStorage.shared.retrieveData() + let userClicks = UserClickData(clickCounts: 5, categoryId: 0, postId: 0, postType: 1) + PersistentStorage.shared.checkIfExist( key: .post_type,clicksData: userClicks) + + } override func viewWillAppear(_ animated: Bool) { @@ -135,6 +141,9 @@ class ThemeOneVC: UIViewController { vcPush.modalPresentationStyle = .overCurrentContext vcPush.modalTransitionStyle = .crossDissolve self.present(vcPush, animated: true) + + let userClicks = UserClickData(clickCounts: 5, categoryId: 0, postId: 0, postType: 1) + PersistentStorage.shared.checkIfExist( key: .post_type,clicksData: userClicks) } } diff --git a/WOKA/Theme/ViewModel/ThemeOneVM.swift b/WOKA/Theme/ViewModel/ThemeOneVM.swift index 3d81c03..d2b8b6e 100644 --- a/WOKA/Theme/ViewModel/ThemeOneVM.swift +++ b/WOKA/Theme/ViewModel/ThemeOneVM.swift @@ -15,7 +15,7 @@ class ThemeOneVM{ weak var vc : ThemeOneVC! var cloudMovingRight = false // Flag to track the direction of movement var isMovingRight = false // Flag to track the direction of movement - var liveStreamURL = "https://d3volyx7jx7oal.cloudfront.net/master.m3u8" +// var liveStreamURL = "https://d3volyx7jx7oal.cloudfront.net/master.m3u8" var avPlayer : AVPlayer! var playerItem: AVPlayerItem! @@ -113,7 +113,22 @@ class ThemeOneVM{ /* Av Player Setup */ - guard let streamURL = URL(string: liveStreamURL) else{return} + guard let data = AuthFunc.shareInstance.staticURLs , let liveStreamData = data.liveData?.first else{ + self.vc.toast(msg: "Issue with live streaming", time: 2) + return + } + var url = String() +// var title = String() + + if AuthFunc.shareInstance.languageSelected == .english{ + url = liveStreamData.liveURL?.hdURLEn ?? "" +// title = liveStreamData.name?.titleEn ?? "" + }else{ + url = liveStreamData.liveURL?.hdURLHin ?? "" +// title = liveStreamData.name?.titleHin ?? "" + } + + guard let streamURL = URL(string: url) else{return} playerItem = AVPlayerItem(url: streamURL) @@ -157,6 +172,8 @@ class ThemeOneVM{ if let avatar = data.avtarURL{ vc.avatarImage.imageURL(avatar) // vc.avatarImage.imageURL("https://wokaland.com/secret-panel-10102023/hidden-admin-portal-20092023/storage/app/public/uploads/avtar/avatar2.png?d=1716889852") + }else{ + vc.avatarImage.image = UIImage(named: "DefaultAvatar") } } @@ -346,57 +363,75 @@ class ThemeOneVM{ Utilities.startProgressHUD(msg: "Loading...") } print("tapped") - - let vc = self.vc.storyboard?.instantiateViewController(withIdentifier: "PlayerVC") as! PlayerVC - do { - // Ensure the liveStreamURL is valid - guard let liveStreamURL = URL(string: self.liveStreamURL) else { - print("Invalid live stream URL") - Utilities.dismissProgressHUD() - return - } - - let videoSourceBuilder = try JWVideoSourceBuilder() -// .defaultVideo(true) - .file(liveStreamURL) - .label("Live Stream") - .build() - - // Create a JWPlayerItem - let item = try JWPlayerItemBuilder() -// .file(liveStreamURL) - .videoSources([videoSourceBuilder]) - .build() - - // Create a JWPlayerConfiguration - let config = try JWPlayerConfigurationBuilder() - .playlist(items: [item]) - .preload(JWPreload(rawValue: 20) ?? .none) - .autostart(true) - .build() - - vc.config = config - vc.dismissTapped = self.tapped - vc.contentType = .liveStream - vc.modalPresentationStyle = .fullScreen - vc.modalTransitionStyle = .crossDissolve - - DispatchQueue.main.async { [weak self] in - guard let self else{return} - - // Present the PlayerVC - self.vc.present(vc, animated: false) { [weak self] in - guard let self else{return} - stopLiveStream() - } - } - } catch { - print("Error creating JWPlayer configuration: \(error)") + + let vc = self.vc.storyboard?.instantiateViewController(withIdentifier: K.StoryBoardID.Theme.playerVC) as! PlayerVC + + guard let data = AuthFunc.shareInstance.staticURLs , let liveStreamData = data.liveData?.first else{ + self.vc.toast(msg: "Issue with live streaming", time: 2) + return + } + + var url = String() + var title = String() + + if AuthFunc.shareInstance.languageSelected == .english{ + url = liveStreamData.liveURL?.hdURLEn ?? "" + title = liveStreamData.name?.titleEn ?? "" + }else{ + url = liveStreamData.liveURL?.hdURLHin ?? "" + title = liveStreamData.name?.titleHin ?? "" + } + + do { + // Ensure the liveStreamURL is valid + guard let liveStreamURL = URL(string: url) else { + print("Invalid live stream URL") Utilities.dismissProgressHUD() + return } - // Dismiss the progress HUD after the view controller presentation + let videoSourceBuilder = try JWVideoSourceBuilder() + // .defaultVideo(true) + .file(liveStreamURL) + .label(title) + .build() + + // Create a JWPlayerItem + let item = try JWPlayerItemBuilder() + // .file(liveStreamURL) + .videoSources([videoSourceBuilder]) + .title(title) + .build() + + // Create a JWPlayerConfiguration + let config = try JWPlayerConfigurationBuilder() + .playlist(items: [item]) + .preload(JWPreload(rawValue: 20) ?? .none) + .autostart(true) + .build() + + vc.config = config + vc.dismissTapped = self.tapped + vc.contentType = .liveStream + vc.modalPresentationStyle = .fullScreen + vc.modalTransitionStyle = .crossDissolve + + DispatchQueue.main.async { [weak self] in + guard let self else{return} + + // Present the PlayerVC + self.vc.present(vc, animated: false) { [weak self] in + guard let self else{return} + stopLiveStream() + } + } + } catch { + print("Error creating JWPlayer configuration: \(error)") Utilities.dismissProgressHUD() + } + + // Dismiss the progress HUD after the view controller presentation + Utilities.dismissProgressHUD() } func tapped(){ diff --git a/WOKA/Theme/ViewModel/ThemeTwoVM.swift b/WOKA/Theme/ViewModel/ThemeTwoVM.swift index bf31f03..2aed5f5 100644 --- a/WOKA/Theme/ViewModel/ThemeTwoVM.swift +++ b/WOKA/Theme/ViewModel/ThemeTwoVM.swift @@ -118,48 +118,73 @@ class ThemeTwoVM{ func playLiveTV(){ Utilities.startProgressHUD(msg: "Loading...") print("tapped") - let vc = self.vc.storyboard?.instantiateViewController(identifier: "PlayerVC") as! PlayerVC + let vc = self.vc.storyboard?.instantiateViewController(identifier: K.StoryBoardID.Theme.playerVC) as! PlayerVC - DispatchQueue.main.async { - do { - // Create a JWMediaTrack with the thumbnails .vtt file -// let thumbnailTrack = try JWThumbnailTrackBuilder() -// .file(URL(string:"https://content.jwplatform.com/videos/Agy4RIje-Ysj2G4DQ.mp4")!) -// .build() - - // Create a JWPlayerItem - let item = try JWPlayerItemBuilder() - .file(URL(string: self.liveStreamURL)!) -// .posterImage(URL(string: "https://img.freepik.com/free-photo/painting-mountain-lake-with-mountain-background_188544-9126.jpg")!) - // .mediaTracks([thumbnailTrack]) - .build() - - // Create a config, and give it the item as a playlist. - let config = try JWPlayerConfigurationBuilder() - .playlist(items: [item]) - .autostart(true) -// .preload(.auto) -// .repeatContent(true) - .build() - - vc.config = config - vc.dismissTapped = self.tapped - vc.contentType = .liveStream - vc.modalPresentationStyle = .overFullScreen - vc.modalTransitionStyle = .crossDissolve - Utilities.dismissProgressHUD() - self.vc.present(vc, animated: false) { - self.stopLiveStream() - // vc.setDeviceOrientation(orientation: .landscapeRight) - } -// Utilities.dismissProgressHUD() -// self.vc.navigationController?.pushViewController(vc, animated: true) -// self.stopLiveStream() - } - catch { - // Handle Error - } + guard let data = AuthFunc.shareInstance.staticURLs , let liveStreamData = data.liveData?.first else{ + self.vc.toast(msg: "Issue with live streaming", time: 2) + return } + var url = String() + var title = String() + + if AuthFunc.shareInstance.languageSelected == .english{ + url = liveStreamData.liveURL?.hdURLEn ?? "" + title = liveStreamData.name?.titleEn ?? "" + }else{ + url = liveStreamData.liveURL?.hdURLHin ?? "" + title = liveStreamData.name?.titleHin ?? "" + } + + do { + // Ensure the liveStreamURL is valid + guard let liveStreamURL = URL(string: url) else { + print("Invalid live stream URL") + Utilities.dismissProgressHUD() + return + } + + let videoSourceBuilder = try JWVideoSourceBuilder() + // .defaultVideo(true) + .file(liveStreamURL) + .label(title) + .build() + + // Create a JWPlayerItem + let item = try JWPlayerItemBuilder() + // .file(liveStreamURL) + .videoSources([videoSourceBuilder]) + .title(title) + .build() + + // Create a JWPlayerConfiguration + let config = try JWPlayerConfigurationBuilder() + .playlist(items: [item]) + .preload(JWPreload(rawValue: 20) ?? .none) + .autostart(true) + .build() + + vc.config = config + vc.dismissTapped = self.tapped + vc.contentType = .liveStream + vc.modalPresentationStyle = .fullScreen + vc.modalTransitionStyle = .crossDissolve + + DispatchQueue.main.async { [weak self] in + guard let self else{return} + + // Present the PlayerVC + self.vc.present(vc, animated: false) { [weak self] in + guard let self else{return} + stopLiveStream() + } + } + } catch { + print("Error creating JWPlayer configuration: \(error)") + Utilities.dismissProgressHUD() + } + + // Dismiss the progress HUD after the view controller presentation + Utilities.dismissProgressHUD() } func tapped(){ @@ -204,6 +229,8 @@ class ThemeTwoVM{ if let avatar = data.avtarURL{ // vc.avatarImage.imageURL("https://wokaland.com/secret-panel-10102023/hidden-admin-portal-20092023/storage/app/public/uploads/avtar/avatar2.png?d=1716889852") vc.avatarImage.imageURL(avatar) + }else{ + vc.avatarImage.image = UIImage(named: "DefaultAvatar") } } @@ -211,7 +238,19 @@ class ThemeTwoVM{ /* Av Player Setup */ - guard let streamURL = URL(string: liveStreamURL) else{return} + guard let data = AuthFunc.shareInstance.staticURLs , let liveStreamData = data.liveData?.first else{ + self.vc.toast(msg: "Issue with live streaming", time: 2) + return + } + var url = String() + + if AuthFunc.shareInstance.languageSelected == .english{ + url = liveStreamData.liveURL?.hdURLEn ?? "" + }else{ + url = liveStreamData.liveURL?.hdURLHin ?? "" + } + + guard let streamURL = URL(string: url) else{return} playerItem = AVPlayerItem(url: streamURL) diff --git a/WOKA/WOKAFM/ViewModel/WokaFMVM.swift b/WOKA/WOKAFM/ViewModel/WokaFMVM.swift index b43eb2f..940677a 100644 --- a/WOKA/WOKAFM/ViewModel/WokaFMVM.swift +++ b/WOKA/WOKAFM/ViewModel/WokaFMVM.swift @@ -11,10 +11,7 @@ import AVFoundation class WokaFMVM{ weak var vc : WokaFMVC! - - //Approved url from client - var url = "https://stream.rcast.net/71643" - + var player: AVPlayer! var playerItem: AVPlayerItem! @@ -44,7 +41,12 @@ class WokaFMVM{ } func setupPlayer() { - guard let url = URL(string: url) else{return} + guard let data = AuthFunc.shareInstance.staticURLs , let liveFmURL = data.liveFmData?.liveFmURL else{ + self.vc.toast(msg: "Issue with Radio", time: 2) + return + } + + guard let url = URL(string: liveFmURL) else{return} playerItem = AVPlayerItem(url: url) player = AVPlayer(playerItem: playerItem) }