From edcb7c4e29e12105bd1f1b0cc2b00f8c01391410 Mon Sep 17 00:00:00 2001 From: BilalKhanWDI Date: Mon, 29 Jul 2024 20:04:40 +0530 Subject: [PATCH] - Handled cc avenue payment web view - Added analytics and crashlytics. - Completed add address - Completed payment , added callback handler --- WOKA.xcodeproj/project.pbxproj | 109 ++- .../xcshareddata/xcschemes/WOKA.xcscheme | 6 + WOKA/Address/Address.storyboard | 648 ++++++++++++++++++ WOKA/Address/Controller/AddNewAddressVC.swift | 133 ++++ .../Controller/AddressListVC.swift | 28 +- .../Address/Controller/PaymentWebViewVC.swift | 71 ++ .../Controller/VerifyAddressPincodeVC.swift | 150 ++++ .../Model/AddressListDM.swift | 1 + WOKA/{Cart => Address}/Model/CheckEddDM.swift | 0 WOKA/{Cart => Address}/View/AddressCell.swift | 0 WOKA/{Cart => Address}/View/AddressCell.xib | 0 WOKA/Address/ViewModel/AddNewAddressVM.swift | 101 +++ .../ViewModel/AddressListVM.swift | 73 +- WOKA/Cart/Cart.storyboard | 112 +-- WOKA/Cart/CartDataCache.swift | 15 + WOKA/Cart/Controller/CartListVC.swift | 9 +- .../Controller/CartPaymentOptionsVC.swift | 9 +- WOKA/Cart/ViewModel/CartListVM.swift | 10 +- .../Cart/ViewModel/CartPaymentOptionsVM.swift | 53 +- WOKA/Constants K/AnalyticsEventKeys.swift | 16 + WOKA/Constants K/StoryBoard.swift | 1 + WOKA/Constants K/StoryBoardID.swift | 8 + WOKA/GoogleService-Info.plist | 32 + WOKA/Main/Delegate/AppDelegate.swift | 5 + WOKA/Network Adapter/APIEndPoints.swift | 8 +- .../ViewModel/SplashVM.swift | 4 + 26 files changed, 1402 insertions(+), 200 deletions(-) create mode 100644 WOKA/Address/Address.storyboard create mode 100644 WOKA/Address/Controller/AddNewAddressVC.swift rename WOKA/{Cart => Address}/Controller/AddressListVC.swift (67%) create mode 100644 WOKA/Address/Controller/PaymentWebViewVC.swift create mode 100644 WOKA/Address/Controller/VerifyAddressPincodeVC.swift rename WOKA/{Cart => Address}/Model/AddressListDM.swift (99%) rename WOKA/{Cart => Address}/Model/CheckEddDM.swift (100%) rename WOKA/{Cart => Address}/View/AddressCell.swift (100%) rename WOKA/{Cart => Address}/View/AddressCell.xib (100%) create mode 100644 WOKA/Address/ViewModel/AddNewAddressVM.swift rename WOKA/{Cart => Address}/ViewModel/AddressListVM.swift (60%) create mode 100644 WOKA/Cart/CartDataCache.swift create mode 100644 WOKA/Constants K/AnalyticsEventKeys.swift create mode 100644 WOKA/GoogleService-Info.plist diff --git a/WOKA.xcodeproj/project.pbxproj b/WOKA.xcodeproj/project.pbxproj index b44972b..92cec0d 100644 --- a/WOKA.xcodeproj/project.pbxproj +++ b/WOKA.xcodeproj/project.pbxproj @@ -83,6 +83,16 @@ 526A43752C36AA4A00AE148F /* GamesListVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526A43742C36AA4A00AE148F /* GamesListVC.swift */; }; 5272FCE32BDFDB05000ECB1D /* UserDetailsRegisterVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5272FCE22BDFDB05000ECB1D /* UserDetailsRegisterVC.swift */; }; 5272FCE52BDFDC8C000ECB1D /* UserDetailsRegisterVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5272FCE42BDFDC8C000ECB1D /* UserDetailsRegisterVM.swift */; }; + 527A2BC22C576E980080DF9B /* FirebaseAnalytics in Frameworks */ = {isa = PBXBuildFile; productRef = 527A2BC12C576E980080DF9B /* FirebaseAnalytics */; }; + 527A2BC42C576E980080DF9B /* FirebaseCrashlytics in Frameworks */ = {isa = PBXBuildFile; productRef = 527A2BC32C576E980080DF9B /* FirebaseCrashlytics */; }; + 527A2BC62C576EAF0080DF9B /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 527A2BC52C576EAF0080DF9B /* GoogleService-Info.plist */; }; + 527A2BC82C5777360080DF9B /* VerifyAddressPincodeVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 527A2BC72C5777360080DF9B /* VerifyAddressPincodeVC.swift */; }; + 527A2BCA2C57776A0080DF9B /* AddNewAddressVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 527A2BC92C57776A0080DF9B /* AddNewAddressVC.swift */; }; + 527A2BCC2C577F8A0080DF9B /* AnalyticsEventKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 527A2BCB2C577F8A0080DF9B /* AnalyticsEventKeys.swift */; }; + 527A2BCE2C579D490080DF9B /* AddNewAddressVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 527A2BCD2C579D490080DF9B /* AddNewAddressVM.swift */; }; + 527A2BD02C57A2AE0080DF9B /* PaymentWebViewVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 527A2BCF2C57A2AE0080DF9B /* PaymentWebViewVC.swift */; }; + 527A2BD22C57B40A0080DF9B /* CartDataCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 527A2BD12C57B40A0080DF9B /* CartDataCache.swift */; }; + 527A2BD52C57D0C20080DF9B /* Address.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 527A2BD42C57D0C20080DF9B /* Address.storyboard */; }; 527AC6F72C171C8F00434FB7 /* BlogsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 527AC6F52C171C8F00434FB7 /* BlogsCell.swift */; }; 527AC6F82C171C8F00434FB7 /* BlogsCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 527AC6F62C171C8F00434FB7 /* BlogsCell.xib */; }; 527AC6FA2C17387300434FB7 /* SongBlogDM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 527AC6F92C17387300434FB7 /* SongBlogDM.swift */; }; @@ -414,6 +424,14 @@ 526A43742C36AA4A00AE148F /* GamesListVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GamesListVC.swift; sourceTree = ""; }; 5272FCE22BDFDB05000ECB1D /* UserDetailsRegisterVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDetailsRegisterVC.swift; sourceTree = ""; }; 5272FCE42BDFDC8C000ECB1D /* UserDetailsRegisterVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDetailsRegisterVM.swift; sourceTree = ""; }; + 527A2BC52C576EAF0080DF9B /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + 527A2BC72C5777360080DF9B /* VerifyAddressPincodeVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VerifyAddressPincodeVC.swift; sourceTree = ""; }; + 527A2BC92C57776A0080DF9B /* AddNewAddressVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddNewAddressVC.swift; sourceTree = ""; }; + 527A2BCB2C577F8A0080DF9B /* AnalyticsEventKeys.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnalyticsEventKeys.swift; sourceTree = ""; }; + 527A2BCD2C579D490080DF9B /* AddNewAddressVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddNewAddressVM.swift; sourceTree = ""; }; + 527A2BCF2C57A2AE0080DF9B /* PaymentWebViewVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaymentWebViewVC.swift; sourceTree = ""; }; + 527A2BD12C57B40A0080DF9B /* CartDataCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartDataCache.swift; sourceTree = ""; }; + 527A2BD42C57D0C20080DF9B /* Address.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Address.storyboard; sourceTree = ""; }; 527AC6F52C171C8F00434FB7 /* BlogsCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlogsCell.swift; sourceTree = ""; }; 527AC6F62C171C8F00434FB7 /* BlogsCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BlogsCell.xib; sourceTree = ""; }; 527AC6F92C17387300434FB7 /* SongBlogDM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongBlogDM.swift; sourceTree = ""; }; @@ -647,6 +665,8 @@ files = ( 4469E533EC95AC428FE50FB2 /* Pods_WOKA.framework in Frameworks */, 52C83E3F2C493FD700F27563 /* RSKPlaceholderTextView in Frameworks */, + 527A2BC42C576E980080DF9B /* FirebaseCrashlytics in Frameworks */, + 527A2BC22C576E980080DF9B /* FirebaseAnalytics in Frameworks */, 521CB1002C493DB80085BDF8 /* JWPlayerKit in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -782,6 +802,7 @@ 523ED25C2BDA2BC700CFED02 /* WOKA */ = { isa = PBXGroup; children = ( + 527A2BD32C57D0B20080DF9B /* Address */, 5259542C2BEA392A00191286 /* Alerts */, 523ED2932BDA3D0100CFED02 /* Assets */, 52BFB52B2C33DA9700BAAE15 /* Audio Books */, @@ -796,6 +817,7 @@ 52C8B0512BDA4B51003B51D0 /* Helpers */, 9CBCB2A62BE5104F007D7934 /* Home */, 523ED26B2BDA2BC900CFED02 /* Info.plist */, + 527A2BC52C576EAF0080DF9B /* GoogleService-Info.plist */, 9CB3D0832C37BA470062869D /* Karaoke */, 523ED2682BDA2BC900CFED02 /* LaunchScreen.storyboard */, 9C27E15E2BDB6E4F00EC1DA9 /* Localized Module */, @@ -1064,6 +1086,56 @@ path = Model; sourceTree = ""; }; + 527A2BD32C57D0B20080DF9B /* Address */ = { + isa = PBXGroup; + children = ( + 527A2BD92C57D0CD0080DF9B /* Model */, + 527A2BD82C57D0CA0080DF9B /* View */, + 527A2BD72C57D0C70080DF9B /* ViewModel */, + 527A2BD62C57D0C50080DF9B /* Controller */, + 527A2BD42C57D0C20080DF9B /* Address.storyboard */, + ); + path = Address; + sourceTree = ""; + }; + 527A2BD62C57D0C50080DF9B /* Controller */ = { + isa = PBXGroup; + children = ( + 52BBFCB12C52730C00F7D0D1 /* AddressListVC.swift */, + 527A2BC92C57776A0080DF9B /* AddNewAddressVC.swift */, + 527A2BC72C5777360080DF9B /* VerifyAddressPincodeVC.swift */, + 527A2BCF2C57A2AE0080DF9B /* PaymentWebViewVC.swift */, + ); + path = Controller; + sourceTree = ""; + }; + 527A2BD72C57D0C70080DF9B /* ViewModel */ = { + isa = PBXGroup; + children = ( + 52BBFCB32C5275E100F7D0D1 /* AddressListVM.swift */, + 527A2BCD2C579D490080DF9B /* AddNewAddressVM.swift */, + ); + path = ViewModel; + sourceTree = ""; + }; + 527A2BD82C57D0CA0080DF9B /* View */ = { + isa = PBXGroup; + children = ( + 52BBFCB72C52782600F7D0D1 /* AddressCell.swift */, + 52BBFCB82C52782600F7D0D1 /* AddressCell.xib */, + ); + path = View; + sourceTree = ""; + }; + 527A2BD92C57D0CD0080DF9B /* Model */ = { + isa = PBXGroup; + children = ( + 52BBFCB52C52764B00F7D0D1 /* AddressListDM.swift */, + 9CDAEB132C54132E00890C47 /* CheckEddDM.swift */, + ); + path = Model; + sourceTree = ""; + }; 527AC6FF2C182D1700434FB7 /* Timer */ = { isa = PBXGroup; children = ( @@ -1138,6 +1210,7 @@ 52A6DCC12C4F8E8500F63C51 /* ViewModel */, 52A6DCC02C4F8E8300F63C51 /* Controller */, 52A6DCBE2C4F8E7C00F63C51 /* Cart.storyboard */, + 527A2BD12C57B40A0080DF9B /* CartDataCache.swift */, ); path = Cart; sourceTree = ""; @@ -1147,7 +1220,6 @@ children = ( 52A6DCC42C4F8EA800F63C51 /* CartListVC.swift */, 525861D12C4FC6C000C33C79 /* CartPaymentOptionsVC.swift */, - 52BBFCB12C52730C00F7D0D1 /* AddressListVC.swift */, ); path = Controller; sourceTree = ""; @@ -1157,7 +1229,6 @@ children = ( 52A6DCC62C4F8FD000F63C51 /* CartListVM.swift */, 525861D32C4FCCB500C33C79 /* CartPaymentOptionsVM.swift */, - 52BBFCB32C5275E100F7D0D1 /* AddressListVM.swift */, ); path = ViewModel; sourceTree = ""; @@ -1171,8 +1242,6 @@ 525861D62C4FD38D00C33C79 /* CartPaymentOptionsCell.xib */, 525861DB2C4FE7A100C33C79 /* CouponCell.swift */, 525861DC2C4FE7A100C33C79 /* CouponCell.xib */, - 52BBFCB72C52782600F7D0D1 /* AddressCell.swift */, - 52BBFCB82C52782600F7D0D1 /* AddressCell.xib */, ); path = View; sourceTree = ""; @@ -1183,8 +1252,6 @@ 52A6DCC82C4F906900F63C51 /* CartListingDM.swift */, 525861D92C4FE71100C33C79 /* CouponListDM.swift */, 525861DF2C4FF16700C33C79 /* CouponApplyDM.swift */, - 52BBFCB52C52764B00F7D0D1 /* AddressListDM.swift */, - 9CDAEB132C54132E00890C47 /* CheckEddDM.swift */, ); path = Model; sourceTree = ""; @@ -1317,6 +1384,7 @@ 524C42302C0499560016A11C /* NotificationCenterReloads.swift */, 9C8C4FAF2C1328060017DD3B /* Disclaimer.rtf */, 9C3E14462C517E8F00D06C10 /* TopViewEnum.swift */, + 527A2BCB2C577F8A0080DF9B /* AnalyticsEventKeys.swift */, ); path = "Constants K"; sourceTree = ""; @@ -1740,6 +1808,8 @@ packageProductDependencies = ( 521CB0FF2C493DB80085BDF8 /* JWPlayerKit */, 52C83E3E2C493FD700F27563 /* RSKPlaceholderTextView */, + 527A2BC12C576E980080DF9B /* FirebaseAnalytics */, + 527A2BC32C576E980080DF9B /* FirebaseCrashlytics */, ); productName = WOKA; productReference = 523ED25A2BDA2BC700CFED02 /* WOKA.app */; @@ -1817,6 +1887,7 @@ packageReferences = ( 521CB0FE2C493DB80085BDF8 /* XCRemoteSwiftPackageReference "JWPlayerKit-package" */, 52C83E3D2C493FD700F27563 /* XCRemoteSwiftPackageReference "RSKPlaceholderTextView" */, + 527A2BC02C576E980080DF9B /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */, ); productRefGroup = 523ED25B2BDA2BC700CFED02 /* Products */; projectDirPath = ""; @@ -1859,6 +1930,7 @@ 526A436F2C36A97400AE148F /* Games.storyboard in Resources */, 9CDAEB0B2C53E9FF00890C47 /* ShopProductImageCell.xib in Resources */, 522D65652C1ACE9C0021E505 /* UserNotificationCell.xib in Resources */, + 527A2BD52C57D0C20080DF9B /* Address.storyboard in Resources */, 9C535DC52C00BF2400DA6DCD /* HomeExploreCell.xib in Resources */, 9CBE1B422C0F37B300CA6E61 /* DropDownCell.xib in Resources */, 52A3F6A92BECBF2A0000BB0B /* LinkedChildCell.xib in Resources */, @@ -1882,6 +1954,7 @@ 52C6E0262BE3B46A00E22D59 /* SelectAvatarCell.xib in Resources */, 52C8B0712BDA7512003B51D0 /* PassingCloud.json in Resources */, 9C8C4FB02C1328060017DD3B /* Disclaimer.rtf in Resources */, + 527A2BC62C576EAF0080DF9B /* GoogleService-Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1983,6 +2056,7 @@ 525953D42BE8B2DF00191286 /* UIApplication.swift in Sources */, 52C8EC802C358E75002DC35C /* AudioBookDetailsVC.swift in Sources */, 52CC38C32BDF812F00B74C3E /* LocalisedElements.swift in Sources */, + 527A2BD02C57A2AE0080DF9B /* PaymentWebViewVC.swift in Sources */, 52A6DCCC2C4F929B00F63C51 /* CartListCell.swift in Sources */, 5259545E2BEBBA1A00191286 /* LoadingIndicatorImageView.swift in Sources */, 52B8D4DC2C04A25E00ED65F3 /* Delegate.swift in Sources */, @@ -2052,6 +2126,7 @@ 9C7939132C0EFCAE00F5D6E6 /* FaqVM.swift in Sources */, 52D774ED2BDFC13F001D87DE /* OTPVM.swift in Sources */, 52D23F112C465E6F003E743A /* LogoutPopupVC.swift in Sources */, + 527A2BD22C57B40A0080DF9B /* CartDataCache.swift in Sources */, 525327D62BFCC23600F64283 /* SideMenuVM.swift in Sources */, 525861D22C4FC6C000C33C79 /* CartPaymentOptionsVC.swift in Sources */, 525861DA2C4FE71100C33C79 /* CouponListDM.swift in Sources */, @@ -2061,6 +2136,7 @@ 9CBE1B402C0F37B300CA6E61 /* DPDKeyboardListener.swift in Sources */, 52A3F6AB2BECBF550000BB0B /* LinkedChildVC.swift in Sources */, 52FDBA7B2BFF2712009D7AC7 /* AuthFuncTimeHandling.swift in Sources */, + 527A2BC82C5777360080DF9B /* VerifyAddressPincodeVC.swift in Sources */, 9C834EC62C1C1D9500B29A9C /* BlogDetailsVC.swift in Sources */, 9CBCB2A52BE50D49007D7934 /* NewPasswordVC.swift in Sources */, 52C8D8D42C2D9F3400CA72A6 /* LikeFavCommonFunc.swift in Sources */, @@ -2084,6 +2160,7 @@ 9C0A853F2BEE35340093783D /* ForgotPassDM.swift in Sources */, 9CBCB2AA2BE51A52007D7934 /* ThemeOneVC.swift in Sources */, 52D774E92BDFBDA4001D87DE /* AuthenticationStringConstant.swift in Sources */, + 527A2BCE2C579D490080DF9B /* AddNewAddressVM.swift in Sources */, 5259541B2BE8D6F900191286 /* NetworkReachibility.swift in Sources */, 52AF71EE2C36AD3100BC5972 /* GamesListVM.swift in Sources */, 52A981CE2C1AFE66000E0BEC /* FavouriteListingDM.swift in Sources */, @@ -2160,6 +2237,7 @@ 52A981D72C1B0E27000E0BEC /* FavouriteCell.swift in Sources */, 52C8B05F2BDA5AFA003B51D0 /* SplashVM.swift in Sources */, 52C1A4E12C05B69F007BAA50 /* UIApplicationSwitchRoot.swift in Sources */, + 527A2BCC2C577F8A0080DF9B /* AnalyticsEventKeys.swift in Sources */, 52663FF72BDFACF60001D8CE /* ShadowView.swift in Sources */, 522D65602C1ACD8D0021E505 /* UserNotificationVC.swift in Sources */, 52AC2D252C295A7900337473 /* TeaserDM.swift in Sources */, @@ -2185,6 +2263,7 @@ 9CBE1B452C0F37B300CA6E61 /* DropDownCell.swift in Sources */, 9C27E16D2BDB852F00EC1DA9 /* GVar.swift in Sources */, 52B8D4E02C04A25E00ED65F3 /* UIView+Container.swift in Sources */, + 527A2BCA2C57776A0080DF9B /* AddNewAddressVC.swift in Sources */, 9C56E8462BDBEE6400E4CA14 /* EmailVC.swift in Sources */, 52A6DCC92C4F906900F63C51 /* CartListingDM.swift in Sources */, 522D65622C1ACDA40021E505 /* CommonNwCall.swift in Sources */, @@ -2610,6 +2689,14 @@ version = 4.19.1; }; }; + 527A2BC02C576E980080DF9B /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/firebase/firebase-ios-sdk.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 10.29.0; + }; + }; 52C83E3D2C493FD700F27563 /* XCRemoteSwiftPackageReference "RSKPlaceholderTextView" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/ruslanskorb/RSKPlaceholderTextView.git"; @@ -2626,6 +2713,16 @@ package = 521CB0FE2C493DB80085BDF8 /* XCRemoteSwiftPackageReference "JWPlayerKit-package" */; productName = JWPlayerKit; }; + 527A2BC12C576E980080DF9B /* FirebaseAnalytics */ = { + isa = XCSwiftPackageProductDependency; + package = 527A2BC02C576E980080DF9B /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseAnalytics; + }; + 527A2BC32C576E980080DF9B /* FirebaseCrashlytics */ = { + isa = XCSwiftPackageProductDependency; + package = 527A2BC02C576E980080DF9B /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseCrashlytics; + }; 52C83E3E2C493FD700F27563 /* RSKPlaceholderTextView */ = { isa = XCSwiftPackageProductDependency; package = 52C83E3D2C493FD700F27563 /* XCRemoteSwiftPackageReference "RSKPlaceholderTextView" */; diff --git a/WOKA.xcodeproj/xcshareddata/xcschemes/WOKA.xcscheme b/WOKA.xcodeproj/xcshareddata/xcschemes/WOKA.xcscheme index 8512c74..1406248 100644 --- a/WOKA.xcodeproj/xcshareddata/xcschemes/WOKA.xcscheme +++ b/WOKA.xcodeproj/xcshareddata/xcschemes/WOKA.xcscheme @@ -74,6 +74,12 @@ ReferencedContainer = "container:WOKA.xcodeproj"> + + + + + + + + + + + + + + + + + Exo2-Bold + + + Exo2-Regular + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WOKA/Address/Controller/AddNewAddressVC.swift b/WOKA/Address/Controller/AddNewAddressVC.swift new file mode 100644 index 0000000..fa8aa48 --- /dev/null +++ b/WOKA/Address/Controller/AddNewAddressVC.swift @@ -0,0 +1,133 @@ +// +// AddNewAddressVC.swift +// WOKA +// +// Created by MacBook Pro on 29/07/24. +// + +import UIKit + +class AddNewAddressVC: UIViewController { + + @IBOutlet weak var enterAddressNAmeTF: TextFieldShadow! // min - 2 , max - 50 + @IBOutlet weak var addressLine1TF: TextFieldShadow! + @IBOutlet weak var addressLine2TF: TextFieldShadow! + @IBOutlet weak var cityTF: TextFieldShadow! + @IBOutlet weak var stateTF: TextFieldShadow! + @IBOutlet weak var pinCodeTF: TextFieldShadow! + @IBOutlet weak var countryTF: TextFieldShadow! + @IBOutlet weak var phoneNumberTF: TextFieldShadow! + + var vm = AddNewAddressVM() + + override func viewDidLoad() { + super.viewDidLoad() + vm.vc = self + vm.initView() + } + + 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) + } + + override func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + + // Customize the navigation bar's appearance + self.navigationController?.setColor(color: .black) + } + @IBAction func submitBtnTapped(_ sender: LocalisedElementsButton) { + + if enterAddressNAmeTF.text!.count < 2 { + Utilities.alertWithBtn(title: "", msgBody: "Name should be minimum 2 Characters.", okBtnStr: "OK", vc: self) + return + } + + if addressLine1TF.text!.count < 15 { + Utilities.alertWithBtn(title: "", msgBody: "Address Line 1 should be minimum 15 Characters.", okBtnStr: "OK", vc: self) + return + } + if addressLine2TF.text!.count < 15 { + Utilities.alertWithBtn(title: "", msgBody: "Address Line 2 should be minimum 15 Characters.", okBtnStr: "OK", vc: self) + return + } + + if cityTF.text!.count < 2 { + Utilities.alertWithBtn(title: "", msgBody: "City should be minimum 2 Characters.", okBtnStr: "OK", vc: self) + return + } + + if stateTF.text!.count < 2 { + Utilities.alertWithBtn(title: "", msgBody: "State should be minimum 2 Characters.", okBtnStr: "OK", vc: self) + return + } + + if countryTF.text!.count < 2 { + Utilities.alertWithBtn(title: "", msgBody: "Country should be minimum 2 Characters.", okBtnStr: "OK", vc: self) + return + } + + if phoneNumberTF.text!.count < 10 { + Utilities.alertWithBtn(title: "", msgBody: "Enter 10 digit mobile number", okBtnStr: "OK", vc: self) + return + } + + self.vm.addAddress() + } +} + +extension AddNewAddressVC : UITextFieldDelegate{ + func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { + switch textField{ + case enterAddressNAmeTF: + if !string.nameCharacterOnly(){return false} + // min - 2 , max - 50 + return ValidatorClass.sharedInstanec.limitCharacter(length: 50,textField, shouldChangeCharactersIn: range, replacementString: string) + case addressLine1TF, addressLine2TF: + if !string.numberAndCharacter(){return false} + // min - 2 , max - 200 + return ValidatorClass.sharedInstanec.limitCharacter(length: 200,textField, shouldChangeCharactersIn: range, replacementString: string) + case cityTF, stateTF, countryTF: + if !string.nameCharacterOnly(){return false} + // min - 2 , max - 200 + return ValidatorClass.sharedInstanec.limitCharacter(length: 50,textField, shouldChangeCharactersIn: range, replacementString: string) + case phoneNumberTF: + if !string.onlyNumber(){return false} + // max - 10 + return ValidatorClass.sharedInstanec.limitCharacter(length: 10,textField, shouldChangeCharactersIn: range, replacementString: string) + default: + break + } + return true + } + + func textFieldShouldReturn(_ textField: UITextField) -> Bool { + switch textField{ + case enterAddressNAmeTF: + addressLine1TF.becomeFirstResponder() + case addressLine1TF: + addressLine2TF.becomeFirstResponder() + case addressLine2TF: + cityTF.becomeFirstResponder() + case cityTF: + stateTF.becomeFirstResponder() + case stateTF: + countryTF.becomeFirstResponder() + case countryTF: + phoneNumberTF.becomeFirstResponder() + default: + break + } + return true + } +} diff --git a/WOKA/Cart/Controller/AddressListVC.swift b/WOKA/Address/Controller/AddressListVC.swift similarity index 67% rename from WOKA/Cart/Controller/AddressListVC.swift rename to WOKA/Address/Controller/AddressListVC.swift index 46574b3..c281f51 100644 --- a/WOKA/Cart/Controller/AddressListVC.swift +++ b/WOKA/Address/Controller/AddressListVC.swift @@ -36,7 +36,9 @@ class AddressListVC: UIViewController { override func viewDidAppear(_ animated: Bool) { self.navigationController?.setColor(color: .white) - + + // handle data change + self.tableView.reloadData() } override func viewWillDisappear(_ animated: Bool) { @@ -52,6 +54,16 @@ class AddressListVC: UIViewController { } @IBAction func btnTapped(_ sender: LocalisedElementsButton) { + switch sender{ + case useSelectedAddBtn: + vm.createOrder() + case addNewAddressBtn: + let sb = UIStoryboard(name: K.StoryBoard.address, bundle: nil) + let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Address.verifyAddressPincodeVC) as! VerifyAddressPincodeVC + self.navigationController?.pushViewController(vcPush, animated: true) + default: + break + } } } @@ -59,27 +71,27 @@ class AddressListVC: UIViewController { extension AddressListVC : TableViewSRC{ func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return vm.addressData.count + return CartDataCache.addressData.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: K.CellIdentifier.Cart.addressCell) as! AddressCell - let data = vm.addressData[indexPath.row] + let data = CartDataCache.addressData[indexPath.row] cell.setData(data: data) return cell } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - for index in vm.addressData.indices { - vm.addressData[index].isDefault = false + for index in CartDataCache.addressData.indices { + CartDataCache.addressData[index].isDefault = false } - if vm.addressData[indexPath.row].eddDate == nil || vm.addressData[indexPath.row].eddDate == ""{ - if let pincode = vm.addressData[indexPath.row].pincode, let id = vm.addressData[indexPath.row].id{ + if CartDataCache.addressData[indexPath.row].eddDate == nil || CartDataCache.addressData[indexPath.row].eddDate == ""{ + if let pincode = CartDataCache.addressData[indexPath.row].pincode, let id = CartDataCache.addressData[indexPath.row].id{ vm.checkEstimatedDeliveryData(pinCode: pincode, id: id) } } - vm.addressData[indexPath.row].isDefault = true + CartDataCache.addressData[indexPath.row].isDefault = true tableView.reloadData() } } diff --git a/WOKA/Address/Controller/PaymentWebViewVC.swift b/WOKA/Address/Controller/PaymentWebViewVC.swift new file mode 100644 index 0000000..bd19990 --- /dev/null +++ b/WOKA/Address/Controller/PaymentWebViewVC.swift @@ -0,0 +1,71 @@ +// +// PaymentWebViewVC.swift +// WOKA +// +// Created by MacBook Pro on 29/07/24. +// + +import UIKit +import WebKit + +class PaymentWebViewVC: UIViewController { + + @IBOutlet weak var webView: WKWebView! + var url : String? + + override func viewDidLoad() { + super.viewDidLoad() + if let url { + let link = URL(string:url)! + let request = URLRequest(url: link) + webView.load(request) + } + webView.addObserver(self, forKeyPath: "URL", options: .new, context: nil) + + } + + override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { + if let key = change?[NSKeyValueChangeKey.newKey] { + print("observeValue \(key)") // url value + if let finalURL = key as? URL { + let endpoint = finalURL.lastPathComponent + var domain = String() + if #available(iOS 16.0, *) { + domain = finalURL.host() ?? "" + } else { + domain = finalURL.host ?? "" + } + + if domain == "secure.ccavenue.com" && endpoint.lowercased() == "canceltransaction"{ + Timer.scheduledTimer(withTimeInterval: 2.5, repeats: false) { _ in + self.dismiss(animated: true) + } + } + } else { + print("urlAny is not a String") + } + } + } + + 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) + } + + override func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + + // Customize the navigation bar's appearance + self.navigationController?.setColor(color: .black) + } +} diff --git a/WOKA/Address/Controller/VerifyAddressPincodeVC.swift b/WOKA/Address/Controller/VerifyAddressPincodeVC.swift new file mode 100644 index 0000000..8d0c0be --- /dev/null +++ b/WOKA/Address/Controller/VerifyAddressPincodeVC.swift @@ -0,0 +1,150 @@ +// +// VerifyAddressPincodeVC.swift +// WOKA +// +// Created by MacBook Pro on 29/07/24. +// + +import UIKit +import Alamofire + +class VerifyAddressPincodeVC: UIViewController { + + @IBOutlet weak var pinCodeTF: TextFieldShadow! + @IBOutlet weak var proceedBtn: LocalisedElementsButton! + @IBOutlet weak var pincodeServieable: LocalisedElementsLabel! + + var verifyPincodeData : CheckEddDM.ResultData? + + override func viewDidLoad() { + super.viewDidLoad() + addGradient() + self.pinCodeTF.roundCorner() + self.title = "ADDRESS DETAILS".localized(loc: AuthFunc.shareInstance.languageSelected.rawValue) + pinCodeTF.delegate = self + } + + 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) + } + + override func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + + // Customize the navigation bar's appearance + self.navigationController?.setColor(color: .black) + } + + @IBAction func proceedBtnTapped(_ sender: LocalisedElementsButton) { + guard let tf = pinCodeTF.text else{return} + if sender.titleLabel?.text == "CHECK NOW"{ + if tf.count < 6{ + Utilities.alertWithBtn(title: "", msgBody: "Please enter 6 digit pincode.", okBtnStr: "OK", vc: self) + return + } + + //check if user is checking for same pincode + if let verifyPincodeData{ + if tf == verifyPincodeData.lmPincode{ + checkServiceAble() + return + } + } + checkEstimatedDeliveryData(pinCode: tf) + } else{ + let sb = UIStoryboard(name: K.StoryBoard.address, bundle: nil) + let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Address.addNewAddressVC) as! AddNewAddressVC + vcPush.vm.pincode = tf + self.navigationController?.pushViewController(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) + + self.view.applyGradient(colors: [color2, color1], startPoint: CGPoint(x: 0, y: 0), endPoint: CGPoint(x: 0.8, y: 0)) + } + + func checkEstimatedDeliveryData(pinCode : String){ + Utilities.startProgressHUD() + let headers : HTTPHeaders = ["access-token" : AuthFunc.shareInstance.getAccessToken()] + let params : Parameters = ["pincode" : pinCode] + NetworkManager.shareInstance.apiRequest(url: APIEndPoints.Address.pincode_serviceability_check_edd, method: .post, parameters: params,headers: headers) { [weak self](result : Result, NetworkManager.APIError>) in + switch result{ + case .success(let data): + guard let self else{ + Utilities.dismissProgressHUD() + return + } + switch data.success{ + case 0: + /* + Error + */ + Utilities.dismissProgressHUD() + case 1: + Utilities.dismissProgressHUD() + guard let data = data.data?.result else{return} + self.verifyPincodeData = data + checkServiceAble() + default: + Utilities.dismissProgressHUD() + break + } + case .failure(let error): + guard let self else{ + Utilities.dismissProgressHUD() + return + } + Utilities.dismissProgressHUD() + self.toast(msg: error.localizedDescription, time: 1.5) + } + } + } + + func checkServiceAble(){ + guard let data = self.verifyPincodeData else{ + self.pincodeServieable.text = "Pincode Unserviceable." + proceedBtn.setTitle("CHECK NOW", for: .normal) + return + } + proceedBtn.setTitle("PROCEED", for: .normal) + self.pincodeServieable.text = "Pincode Servicable." + "\n" + "Expected delivery by " + (data.edd ?? "123456") + } +} + +extension VerifyAddressPincodeVC : UITextFieldDelegate{ + + func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { + + // Check if user is deleting text so hide pincode servicable text + if string.count == 0 && range.length > 0 { + self.pincodeServieable.text = "" + self.proceedBtn.setTitle("CHECK NOW", for: .normal) + // Back pressed + return true + } + + //Pincode should be only number + if !string.onlyNumber(){return false} + + // pincode should be max 6 characters in length + return ValidatorClass.sharedInstanec.limitCharacter(length: 6,textField, shouldChangeCharactersIn: range, replacementString: string) + } + + func textFieldShouldReturn(_ textField: UITextField) -> Bool { + print("Return") + return true + } +} diff --git a/WOKA/Cart/Model/AddressListDM.swift b/WOKA/Address/Model/AddressListDM.swift similarity index 99% rename from WOKA/Cart/Model/AddressListDM.swift rename to WOKA/Address/Model/AddressListDM.swift index e61d376..14870e2 100644 --- a/WOKA/Cart/Model/AddressListDM.swift +++ b/WOKA/Address/Model/AddressListDM.swift @@ -25,3 +25,4 @@ struct AddressListDM: Codable { case email } } + diff --git a/WOKA/Cart/Model/CheckEddDM.swift b/WOKA/Address/Model/CheckEddDM.swift similarity index 100% rename from WOKA/Cart/Model/CheckEddDM.swift rename to WOKA/Address/Model/CheckEddDM.swift diff --git a/WOKA/Cart/View/AddressCell.swift b/WOKA/Address/View/AddressCell.swift similarity index 100% rename from WOKA/Cart/View/AddressCell.swift rename to WOKA/Address/View/AddressCell.swift diff --git a/WOKA/Cart/View/AddressCell.xib b/WOKA/Address/View/AddressCell.xib similarity index 100% rename from WOKA/Cart/View/AddressCell.xib rename to WOKA/Address/View/AddressCell.xib diff --git a/WOKA/Address/ViewModel/AddNewAddressVM.swift b/WOKA/Address/ViewModel/AddNewAddressVM.swift new file mode 100644 index 0000000..4c452d2 --- /dev/null +++ b/WOKA/Address/ViewModel/AddNewAddressVM.swift @@ -0,0 +1,101 @@ +// +// AddNewAddressVM.swift +// WOKA +// +// Created by MacBook Pro on 29/07/24. +// + +import UIKit +import Alamofire + +class AddNewAddressVM{ + + weak var vc : AddNewAddressVC! + var pincode = String() + + func initView(){ + vc.title = "ADDRESS DETAILS".localized(loc: AuthFunc.shareInstance.languageSelected.rawValue) + addGradient() + + vc.enterAddressNAmeTF.delegate = self.vc + vc.addressLine1TF.delegate = self.vc + vc.addressLine2TF.delegate = self.vc + vc.cityTF.delegate = self.vc + vc.stateTF.delegate = self.vc + vc.countryTF.delegate = self.vc + vc.phoneNumberTF.delegate = self.vc + + vc.enterAddressNAmeTF.roundCorner() + vc.addressLine1TF.roundCorner() + vc.addressLine2TF.roundCorner() + vc.cityTF.roundCorner() + vc.stateTF.roundCorner() + vc.countryTF.roundCorner() + vc.phoneNumberTF.roundCorner() + vc.pinCodeTF.roundCorner() + vc.pinCodeTF.text = pincode + } + + 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.view.applyGradient(colors: [color2, color1], startPoint: CGPoint(x: 0, y: 0), endPoint: CGPoint(x: 0.8, y: 0)) + } + + func addAddress(){ + Utilities.startProgressHUD() + let address = (vc.addressLine1TF.text ?? "") + ", " + (vc.addressLine2TF.text ?? "") + let headers : HTTPHeaders = ["access-token" : AuthFunc.shareInstance.getAccessToken()] + let params : Parameters = ["address_name" : vc.enterAddressNAmeTF.text!, + "address" : address, + "city" : vc.cityTF.text!, + "state" : vc.stateTF.text!, + "pincode" : vc.pinCodeTF.text!, + "mobile_number" : vc.phoneNumberTF.text!] + + NetworkManager.shareInstance.apiRequest(url: APIEndPoints.Address.add_parent_address, method: .post, parameters: params,headers: headers) { [weak self](result : Result, NetworkManager.APIError>) in + switch result{ + case .success(let data): + guard let self else{ + Utilities.dismissProgressHUD() + return + } + switch data.success{ + case 0: + /* + Error + */ + Utilities.dismissProgressHUD() + case 1: + Utilities.dismissProgressHUD() + self.vc.toast(msg: data.message ?? "Address Added", time: 2) { + guard let data = data.data else{return} + + CartDataCache.addressData.append(data) + //set the newly added address as default + guard let navigationController = self.vc.navigationController else { + print("Not in a navigation controller") + return + } + + if let targetController = navigationController.viewControllers.first(where: { $0 is AddressListVC }) { + navigationController.popToViewController(targetController, animated: true) + } else { + print("Target view controller not found in the navigation stack") + } + } + default: + Utilities.dismissProgressHUD() + break + } + case .failure(let error): + guard let self else{ + Utilities.dismissProgressHUD() + return + } + Utilities.dismissProgressHUD() + Utilities.alert(title: "Error", message: error.localizedDescription, viewController: self.vc) + } + } + } +} diff --git a/WOKA/Cart/ViewModel/AddressListVM.swift b/WOKA/Address/ViewModel/AddressListVM.swift similarity index 60% rename from WOKA/Cart/ViewModel/AddressListVM.swift rename to WOKA/Address/ViewModel/AddressListVM.swift index cf9c5dd..d9fce04 100644 --- a/WOKA/Cart/ViewModel/AddressListVM.swift +++ b/WOKA/Address/ViewModel/AddressListVM.swift @@ -11,7 +11,6 @@ import Alamofire class AddressListVM{ weak var vc : AddressListVC! - var addressData = [AddressListDM]() func initView(){ vc.innerView.addBorderView(width: 1, color: .darkGray) @@ -51,7 +50,7 @@ class AddressListVM{ Utilities.startProgressHUD() let headers : HTTPHeaders = ["access-token" : AuthFunc.shareInstance.getAccessToken()] - NetworkManager.shareInstance.apiRequest(url: APIEndPoints.Cart.parent_address_listing, method: .get,headers: headers) { [weak self](result : Result, NetworkManager.APIError>) in + NetworkManager.shareInstance.apiRequest(url: APIEndPoints.Address.parent_address_listing, method: .get,headers: headers) { [weak self](result : Result, NetworkManager.APIError>) in switch result{ case .success(let data): guard let self else{ @@ -67,12 +66,12 @@ class AddressListVM{ case 1: Utilities.dismissProgressHUD() guard let data = data.data else{return} - self.addressData = data - if self.addressData.count != 0{ - self.addressData[0].isDefault = true + CartDataCache.addressData = data + if CartDataCache.addressData.count != 0{ + CartDataCache.addressData[0].isDefault = true } self.vc.tableView.reloadData() - if let pincode = self.addressData.first?.pincode , let id = self.addressData.first?.id{ + if let pincode = CartDataCache.addressData.first?.pincode , let id = CartDataCache.addressData.first?.id{ checkEstimatedDeliveryData(pinCode: pincode, id: id) } default: @@ -97,7 +96,7 @@ class AddressListVM{ func checkEstimatedDeliveryData(pinCode : String, id : Int){ let headers : HTTPHeaders = ["access-token" : AuthFunc.shareInstance.getAccessToken()] let params : Parameters = ["pincode" : pinCode] - NetworkManager.shareInstance.apiRequest(url: APIEndPoints.Cart.pincode_serviceability_check_edd, method: .post, parameters: params,headers: headers) { [weak self](result : Result, NetworkManager.APIError>) in + NetworkManager.shareInstance.apiRequest(url: APIEndPoints.Address.pincode_serviceability_check_edd, method: .post, parameters: params,headers: headers) { [weak self](result : Result, NetworkManager.APIError>) in switch result{ case .success(let data): guard let self else{ @@ -113,8 +112,8 @@ class AddressListVM{ case 1: Utilities.dismissProgressHUD() guard let data = data.data?.result else{return} - if let index = self.addressData.firstIndex(where: {$0.id == id}){ - self.addressData[index].eddDate = data.edd + if let index = CartDataCache.addressData.firstIndex(where: {$0.id == id}){ + CartDataCache.addressData[index].eddDate = data.edd self.vc.tableView.reloadData() } default: @@ -131,4 +130,60 @@ class AddressListVM{ } } } + + func createOrder(){ + var productIDs = [Int]() + + for i in CartDataCache.cartListData{ + if let id = i.id{ + productIDs.append(id) + } + } + Utilities.startProgressHUD() + let headers : HTTPHeaders = ["access-token" : AuthFunc.shareInstance.getAccessToken()] + let params : Parameters = ["product_ids" : productIDs, + "address_id" : "56"] + struct URLResp : Codable { + var url : String? + } + NetworkManager.shareInstance.apiRequest(url: APIEndPoints.Cart.create_new_order, method: .post, parameters: params,headers: headers) { [weak self](result : Result, NetworkManager.APIError>) in + switch result{ + case .success(let data): + guard let self else{ + Utilities.dismissProgressHUD() + return + } + switch data.success{ + case 0: + /* + Error + */ + Utilities.dismissProgressHUD() + case 1: + Utilities.dismissProgressHUD() + guard let data = data.data else{return} + let sb = UIStoryboard(name: K.StoryBoard.address, bundle: nil) + let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Address.paymentWebViewVC) as! PaymentWebViewVC + vcPush.url = data.url + vcPush.modalTransitionStyle = .crossDissolve + vcPush.modalPresentationStyle = .fullScreen + self.vc.present(vcPush, animated: true) + default: + Utilities.dismissProgressHUD() + break + } + case .failure(let error): + guard let self else{ + Utilities.dismissProgressHUD() + return + } + Utilities.dismissProgressHUD() + Utilities.alertWithBtnCancelCompletion(title: "Error", msgBody: error.localizedDescription, okBtnStr: "Retry?", vc: self.vc) { isDone in + if isDone{ + self.createOrder() + } + } + } + } + } } diff --git a/WOKA/Cart/Cart.storyboard b/WOKA/Cart/Cart.storyboard index 668c359..4ae59b4 100644 --- a/WOKA/Cart/Cart.storyboard +++ b/WOKA/Cart/Cart.storyboard @@ -385,117 +385,10 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -504,9 +397,6 @@ - - - diff --git a/WOKA/Cart/CartDataCache.swift b/WOKA/Cart/CartDataCache.swift new file mode 100644 index 0000000..220fc62 --- /dev/null +++ b/WOKA/Cart/CartDataCache.swift @@ -0,0 +1,15 @@ +// +// CartDataCache.swift +// WOKA +// +// Created by MacBook Pro on 29/07/24. +// + +import Foundation + +class CartDataCache{ + + static var cartListData = [CartListingDM.ResultData]() + static var addressData = [AddressListDM]() + +} diff --git a/WOKA/Cart/Controller/CartListVC.swift b/WOKA/Cart/Controller/CartListVC.swift index 6b91b21..527c39d 100644 --- a/WOKA/Cart/Controller/CartListVC.swift +++ b/WOKA/Cart/Controller/CartListVC.swift @@ -14,6 +14,7 @@ class CartListVC: UIViewController { @IBOutlet weak var noDataStack: UIStackView! @IBOutlet weak var checkoutBtn: LocalisedElementsButton! var vm = CartListVM() + static let shareInstance = CartListVC() // MARK: - Life Cycle @@ -64,7 +65,7 @@ class CartListVC: UIViewController { } let sb = UIStoryboard(name: K.StoryBoard.cart, bundle: nil) let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Cart.cartPaymentOptionsVC) as! CartPaymentOptionsVC - vcPush.vm.cartListData = vm.cartListData +// vcPush.vm.cartListData = vm.cartListData vcPush.vm.cartTotalPrice = vm.totalAmount self.navigationController?.pushViewController(vcPush, animated: true) } @@ -74,12 +75,12 @@ class CartListVC: UIViewController { extension CartListVC : TableViewSRC{ func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return vm.cartListData.count + return CartDataCache.cartListData.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: K.CellIdentifier.Cart.cartListCell) as! CartListCell - let data = vm.cartListData[indexPath.row] + let data = CartDataCache.cartListData[indexPath.row] cell.setData(data: data) cell.btnTapped = { [weak self] () -> Void in guard let self else{return} @@ -117,7 +118,7 @@ extension CartListVC : TableViewSRC{ switch mode{ case .yes: guard let self else{return} - if let shopMasterID = vm.cartListData[indexPath].id{ + if let shopMasterID = CartDataCache.cartListData[indexPath].id{ vm.removeItemFromCart(shopMasterID: shopMasterID, index: indexPath) } case .no: diff --git a/WOKA/Cart/Controller/CartPaymentOptionsVC.swift b/WOKA/Cart/Controller/CartPaymentOptionsVC.swift index d1c1e96..0712c98 100644 --- a/WOKA/Cart/Controller/CartPaymentOptionsVC.swift +++ b/WOKA/Cart/Controller/CartPaymentOptionsVC.swift @@ -40,6 +40,7 @@ class CartPaymentOptionsVC: UIViewController { } override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) self.navigationController?.setColor(color: .white) } @@ -69,8 +70,8 @@ class CartPaymentOptionsVC: UIViewController { } @IBAction func confirmBtnTapped(_ sender: LocalisedElementsButton) { - let sb = UIStoryboard(name: K.StoryBoard.cart, bundle: nil) - let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Cart.addressListVC) as! AddressListVC + let sb = UIStoryboard(name: K.StoryBoard.address, bundle: nil) + let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.Address.addressListVC) as! AddressListVC self.navigationController?.pushViewController(vcPush, animated: true) // vm.createOrder() } @@ -88,7 +89,7 @@ class CartPaymentOptionsVC: UIViewController { extension CartPaymentOptionsVC : TableViewSRC{ func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if tableView == cartTableView{ - return vm.cartListData.count + return CartDataCache.cartListData.count }else{ return vm.couponData.count } @@ -97,7 +98,7 @@ extension CartPaymentOptionsVC : TableViewSRC{ func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { if tableView == cartTableView{ let cell = tableView.dequeueReusableCell(withIdentifier: K.CellIdentifier.Cart.cartPaymentOptionsCell) as! CartPaymentOptionsCell - let data = vm.cartListData[indexPath.row] + let data = CartDataCache.cartListData[indexPath.row] cell.setData(data: data) return cell }else{ diff --git a/WOKA/Cart/ViewModel/CartListVM.swift b/WOKA/Cart/ViewModel/CartListVM.swift index 2b03cd4..c1aabbc 100644 --- a/WOKA/Cart/ViewModel/CartListVM.swift +++ b/WOKA/Cart/ViewModel/CartListVM.swift @@ -11,7 +11,7 @@ import Alamofire class CartListVM{ weak var vc : CartListVC! - var cartListData = [CartListingDM.ResultData]() +// var cartListData = [CartListingDM.ResultData]() var totalAmount = 0.0 { didSet{ @@ -78,7 +78,7 @@ class CartListVM{ totalAmount = data.data?.totalAmount ?? 0.0 guard let data = data.data?.result else{return} - self.cartListData = data + CartDataCache.cartListData = data self.vc.tableView.reloadData() feedbackGenerator.impactOccurred() self.checkCount() @@ -105,7 +105,7 @@ class CartListVM{ } func checkCount(){ - if self.cartListData.count == 0 { + if CartDataCache.cartListData.count == 0 { self.vc.noDataStack.isHidden = false self.vc.checkoutBtn.isEnabled = false self.vc.checkoutBtn.backgroundColor = #colorLiteral(red: 0.03529411765, green: 0, blue: 0.3647058824, alpha: 1).withAlphaComponent(0.7) @@ -140,8 +140,8 @@ class CartListVM{ } case 1: Utilities.dismissProgressHUD() - self.totalAmount = self.totalAmount - (self.cartListData[index].productFinalPrice ?? 0.0) - self.cartListData.remove(at: index) + self.totalAmount = self.totalAmount - (CartDataCache.cartListData[index].productFinalPrice ?? 0.0) + CartDataCache.cartListData.remove(at: index) self.vc.tableView.reloadData() self.checkCount() default: diff --git a/WOKA/Cart/ViewModel/CartPaymentOptionsVM.swift b/WOKA/Cart/ViewModel/CartPaymentOptionsVM.swift index ef88b45..2ee661a 100644 --- a/WOKA/Cart/ViewModel/CartPaymentOptionsVM.swift +++ b/WOKA/Cart/ViewModel/CartPaymentOptionsVM.swift @@ -11,7 +11,7 @@ import Alamofire class CartPaymentOptionsVM{ weak var vc : CartPaymentOptionsVC! - var cartListData = [CartListingDM.ResultData]() +// var cartListData = [CartListingDM.ResultData]() var couponData = [CouponListDM.ResultData]() var isExpanded = false var cartTotalPrice = 0.0 @@ -147,55 +147,6 @@ class CartPaymentOptionsVM{ } } - func createOrder(){ - var productIDs = [Int]() - - for i in cartListData{ - if let id = i.id{ - productIDs.append(id) - } - } - Utilities.startProgressHUD() - let headers : HTTPHeaders = ["access-token" : AuthFunc.shareInstance.getAccessToken()] - let params : Parameters = ["product_ids" : productIDs, - "address_id" : "56"] - struct URLResp : Codable { - var url : String? - } - NetworkManager.shareInstance.apiRequest(url: APIEndPoints.Cart.create_new_order, method: .post, parameters: params,headers: headers) { [weak self](result : Result, NetworkManager.APIError>) in - switch result{ - case .success(let data): - guard let self else{ - Utilities.dismissProgressHUD() - return - } - switch data.success{ - case 0: - /* - Error - */ - Utilities.dismissProgressHUD() - case 1: - Utilities.dismissProgressHUD() - guard let data = data.data else{return} - print(data.url) - default: - Utilities.dismissProgressHUD() - break - } - case .failure(let error): - guard let self else{ - Utilities.dismissProgressHUD() - return - } - Utilities.dismissProgressHUD() - Utilities.alertWithBtnCancelCompletion(title: "Error", msgBody: error.localizedDescription, okBtnStr: "Retry?", vc: self.vc) { isDone in - if isDone{ - self.createOrder() - } - } - } - } - } + } diff --git a/WOKA/Constants K/AnalyticsEventKeys.swift b/WOKA/Constants K/AnalyticsEventKeys.swift new file mode 100644 index 0000000..2657742 --- /dev/null +++ b/WOKA/Constants K/AnalyticsEventKeys.swift @@ -0,0 +1,16 @@ +// +// AnalyticsEventKeys.swift +// WOKA +// +// Created by MacBook Pro on 29/07/24. +// + +import Foundation + +extension K{ + struct AnalyticsEventKeys{ + static var new_guest_login = "new_guest_login" + static var user_signup = "user_signup" + } +} + diff --git a/WOKA/Constants K/StoryBoard.swift b/WOKA/Constants K/StoryBoard.swift index 4d8a9c2..085c58c 100644 --- a/WOKA/Constants K/StoryBoard.swift +++ b/WOKA/Constants K/StoryBoard.swift @@ -22,5 +22,6 @@ extension K{ static let Karaoke = "Karaoke" static let shop = "Shop" static let cart = "Cart" + static let address = "Address" } } diff --git a/WOKA/Constants K/StoryBoardID.swift b/WOKA/Constants K/StoryBoardID.swift index eeae402..7a2c0df 100644 --- a/WOKA/Constants K/StoryBoardID.swift +++ b/WOKA/Constants K/StoryBoardID.swift @@ -105,7 +105,15 @@ extension K{ struct Cart{ static let cartListVC = "CartListVC" static let cartPaymentOptionsVC = "CartPaymentOptionsVC" + } + + // MARK: - Address + + struct Address{ static let addressListVC = "AddressListVC" + static let verifyAddressPincodeVC = "VerifyAddressPincodeVC" + static let addNewAddressVC = "AddNewAddressVC" + static let paymentWebViewVC = "PaymentWebViewVC" } } diff --git a/WOKA/GoogleService-Info.plist b/WOKA/GoogleService-Info.plist new file mode 100644 index 0000000..61d1510 --- /dev/null +++ b/WOKA/GoogleService-Info.plist @@ -0,0 +1,32 @@ + + + + + API_KEY + AIzaSyDA_akTO852Olbp9YUbtBlmTQVk0-z9NPA + GCM_SENDER_ID + 15836861503 + PLIST_VERSION + 1 + BUNDLE_ID + com.app.woka + PROJECT_ID + wokaga-19312 + STORAGE_BUCKET + wokaga-19312.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:15836861503:ios:4bd34209992a812c66548a + ADMOB_APP_ID + ca-app-pub-5699008063638916~6654980943 + + \ No newline at end of file diff --git a/WOKA/Main/Delegate/AppDelegate.swift b/WOKA/Main/Delegate/AppDelegate.swift index de39c44..449c8a6 100644 --- a/WOKA/Main/Delegate/AppDelegate.swift +++ b/WOKA/Main/Delegate/AppDelegate.swift @@ -9,6 +9,7 @@ import UIKit import Lottie import IQKeyboardManagerSwift import JWPlayerKit +import Firebase @main class AppDelegate: UIResponder, UIApplicationDelegate { @@ -29,6 +30,10 @@ class AppDelegate: UIResponder, UIApplicationDelegate { } func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + + //Initialize Firebase +// FirebaseApp.configure() + // enabling the IQKeyboard manager instance IQKeyboardManager.shared.enable = true IQKeyboardManager.shared.resignOnTouchOutside = true diff --git a/WOKA/Network Adapter/APIEndPoints.swift b/WOKA/Network Adapter/APIEndPoints.swift index 2f8635d..899a6a0 100644 --- a/WOKA/Network Adapter/APIEndPoints.swift +++ b/WOKA/Network Adapter/APIEndPoints.swift @@ -19,8 +19,8 @@ struct APIEndPoints { private init() {} struct BaseURL { - static let staging = "https://wokaland.com/admin/api/" - static let production = "https://simplitend.com" + static let staging = "https://wokaland.com/secret-panel-10102023/hidden-admin-portal-20092023/api/" + static let production = "" static let appUrl = "https://apps.apple.com/in/app/woka/id6465305185" } @@ -122,7 +122,11 @@ struct APIEndPoints { static let coupon_listing = makeURL(path: "coupon_listing") static let applied_coupon_discount = makeURL(path: "applied_coupon_discount") static let create_new_order = makeURL(path: "create_new_order") + } + + struct Address{ static let parent_address_listing = makeURL(path: "parent_address_listing") + static let add_parent_address = makeURL(path: "add_parent_address") static let pincode_serviceability_check_edd = makeURL(path: "pincode_serviceability_check_edd") } diff --git a/WOKA/OnBoarding Module/ViewModel/SplashVM.swift b/WOKA/OnBoarding Module/ViewModel/SplashVM.swift index 08cdec6..a2840e0 100644 --- a/WOKA/OnBoarding Module/ViewModel/SplashVM.swift +++ b/WOKA/OnBoarding Module/ViewModel/SplashVM.swift @@ -8,6 +8,7 @@ import UIKit import AVFoundation import Alamofire +import FirebaseAnalytics class SplashVM{ @@ -15,6 +16,9 @@ class SplashVM{ var player: AVAudioPlayer? func initView(){ + +// Analytics.logEvent(K.AnalyticsEventKeys.new_guest_login, parameters: ["os_type" : "iOS"]) + 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)