diff --git a/Authorization/Authorization.xcodeproj/project.pbxproj b/Authorization/Authorization.xcodeproj/project.pbxproj index 2a9a60060..013667223 100644 --- a/Authorization/Authorization.xcodeproj/project.pbxproj +++ b/Authorization/Authorization.xcodeproj/project.pbxproj @@ -32,6 +32,16 @@ 99C165512C0C4F7B00DC384D /* SSOWebViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99C165502C0C4F7B00DC384D /* SSOWebViewModel.swift */; }; BA8B3A322AD5487300D25EF5 /* SocialAuthView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA8B3A312AD5487300D25EF5 /* SocialAuthView.swift */; }; BADB3F552AD6DFC3004D5CFA /* SocialAuthViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BADB3F542AD6DFC3004D5CFA /* SocialAuthViewModel.swift */; }; + CE7CAF2D2CC155BE00E0AC9D /* OEXFoundation in Frameworks */ = {isa = PBXBuildFile; productRef = CE7CAF2C2CC155BE00E0AC9D /* OEXFoundation */; }; + CE7FB8772CC13C0B0088001A /* FacebookLogin in Frameworks */ = {isa = PBXBuildFile; productRef = CE7FB8762CC13C0B0088001A /* FacebookLogin */; }; + CE7FB87A2CC13C3C0088001A /* GoogleSignInSwift in Frameworks */ = {isa = PBXBuildFile; productRef = CE7FB8792CC13C3C0088001A /* GoogleSignInSwift */; }; + CEB1E2642CC14E3100921517 /* OEXFoundation in Frameworks */ = {isa = PBXBuildFile; productRef = CEB1E2632CC14E3100921517 /* OEXFoundation */; }; + CEB25A022CC13A36007FC792 /* AppleAuthProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEB259FC2CC13A36007FC792 /* AppleAuthProvider.swift */; }; + CEB25A032CC13A36007FC792 /* FacebookAuthProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEB259FE2CC13A36007FC792 /* FacebookAuthProvider.swift */; }; + CEB25A042CC13A36007FC792 /* GoogleAuthProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEB259FD2CC13A36007FC792 /* GoogleAuthProvider.swift */; }; + CEB25A052CC13A36007FC792 /* SocialAuthResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEB25A002CC13A36007FC792 /* SocialAuthResponse.swift */; }; + CEB25A062CC13A36007FC792 /* MicrosoftAuthProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEB259FF2CC13A36007FC792 /* MicrosoftAuthProvider.swift */; }; + CEB25A072CC13A36007FC792 /* SocialAuthError.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEB259FA2CC13A36007FC792 /* SocialAuthError.swift */; }; DE843D6BB1B9DDA398494890 /* Pods_App_Authorization.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 47BCFB7C19382EECF15131B6 /* Pods_App_Authorization.framework */; }; E03261642AE64676002CA7EB /* StartupViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = E03261632AE64676002CA7EB /* StartupViewModel.swift */; }; E03261662AE64AF4002CA7EB /* StartupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E03261652AE64AF4002CA7EB /* StartupView.swift */; }; @@ -47,6 +57,19 @@ }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + CE7CAF2F2CC155BE00E0AC9D /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 02066B432906D72400F4307E /* SignUpView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignUpView.swift; sourceTree = ""; }; 02066B452906D72F00F4307E /* SignUpViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignUpViewModel.swift; sourceTree = ""; }; @@ -88,6 +111,12 @@ A99D45203C981893C104053A /* Pods-App-Authorization-AuthorizationTests.releasestage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-Authorization-AuthorizationTests.releasestage.xcconfig"; path = "Target Support Files/Pods-App-Authorization-AuthorizationTests/Pods-App-Authorization-AuthorizationTests.releasestage.xcconfig"; sourceTree = ""; }; BA8B3A312AD5487300D25EF5 /* SocialAuthView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocialAuthView.swift; sourceTree = ""; }; BADB3F542AD6DFC3004D5CFA /* SocialAuthViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocialAuthViewModel.swift; sourceTree = ""; }; + CEB259FA2CC13A36007FC792 /* SocialAuthError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocialAuthError.swift; sourceTree = ""; }; + CEB259FC2CC13A36007FC792 /* AppleAuthProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleAuthProvider.swift; sourceTree = ""; }; + CEB259FD2CC13A36007FC792 /* GoogleAuthProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GoogleAuthProvider.swift; sourceTree = ""; }; + CEB259FE2CC13A36007FC792 /* FacebookAuthProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FacebookAuthProvider.swift; sourceTree = ""; }; + CEB259FF2CC13A36007FC792 /* MicrosoftAuthProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MicrosoftAuthProvider.swift; sourceTree = ""; }; + CEB25A002CC13A36007FC792 /* SocialAuthResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocialAuthResponse.swift; sourceTree = ""; }; E03261632AE64676002CA7EB /* StartupViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StartupViewModel.swift; sourceTree = ""; }; E03261652AE64AF4002CA7EB /* StartupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StartupView.swift; sourceTree = ""; }; E78971D8E6ED2116BBF9FD66 /* Pods-App-Authorization.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-Authorization.release.xcconfig"; path = "Target Support Files/Pods-App-Authorization/Pods-App-Authorization.release.xcconfig"; sourceTree = ""; }; @@ -101,6 +130,7 @@ buildActionMask = 2147483647; files = ( 07169458296D913400E3DED6 /* Authorization.framework in Frameworks */, + CE7CAF2D2CC155BE00E0AC9D /* OEXFoundation in Frameworks */, 5FB79D2802949372CDAF08D6 /* Pods_App_Authorization_AuthorizationTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -111,6 +141,9 @@ files = ( 0770DE4728D0A3DA006D8A5D /* Core.framework in Frameworks */, DE843D6BB1B9DDA398494890 /* Pods_App_Authorization.framework in Frameworks */, + CE7FB8772CC13C0B0088001A /* FacebookLogin in Frameworks */, + CEB1E2642CC14E3100921517 /* OEXFoundation in Frameworks */, + CE7FB87A2CC13C3C0088001A /* GoogleSignInSwift in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -227,6 +260,7 @@ 0770DE3D28D0A319006D8A5D /* Authorization */ = { isa = PBXGroup; children = ( + CEB25A012CC13A36007FC792 /* SocialAuth */, 0770DE6F28D0C08E006D8A5D /* SwiftGen */, 071009CC28D1E24000344290 /* Presentation */, 0770DE6D28D0C035006D8A5D /* Localizable.strings */, @@ -296,6 +330,27 @@ path = SocialAuth; sourceTree = ""; }; + CEB259FB2CC13A36007FC792 /* Error */ = { + isa = PBXGroup; + children = ( + CEB259FA2CC13A36007FC792 /* SocialAuthError.swift */, + ); + path = Error; + sourceTree = ""; + }; + CEB25A012CC13A36007FC792 /* SocialAuth */ = { + isa = PBXGroup; + children = ( + CEB259FB2CC13A36007FC792 /* Error */, + CEB259FC2CC13A36007FC792 /* AppleAuthProvider.swift */, + CEB259FD2CC13A36007FC792 /* GoogleAuthProvider.swift */, + CEB259FE2CC13A36007FC792 /* FacebookAuthProvider.swift */, + CEB259FF2CC13A36007FC792 /* MicrosoftAuthProvider.swift */, + CEB25A002CC13A36007FC792 /* SocialAuthResponse.swift */, + ); + path = SocialAuth; + sourceTree = ""; + }; E03261622AE6464A002CA7EB /* Startup */ = { isa = PBXGroup; children = ( @@ -327,6 +382,7 @@ 07169451296D913300E3DED6 /* Frameworks */, 07169452296D913300E3DED6 /* Resources */, 95C8CAF0620ABBBAD7ED66D6 /* [CP] Copy Pods Resources */, + CE7CAF2F2CC155BE00E0AC9D /* Embed Frameworks */, ); buildRules = ( ); @@ -387,6 +443,11 @@ uk, ); mainGroup = 0770DE3128D0A318006D8A5D; + packageReferences = ( + CE7FB8752CC13C0B0088001A /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */, + CE7FB8782CC13C3C0088001A /* XCRemoteSwiftPackageReference "GoogleSignIn-iOS" */, + CEB1E2622CC14E3100921517 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */, + ); productRefGroup = 0770DE3C28D0A319006D8A5D /* Products */; projectDirPath = ""; projectRoot = ""; @@ -532,6 +593,12 @@ 071009C728D1DA4F00344290 /* SignInViewModel.swift in Sources */, BA8B3A322AD5487300D25EF5 /* SocialAuthView.swift in Sources */, 99C1654D2C0C4F2F00DC384D /* SSOHelper.swift in Sources */, + CEB25A022CC13A36007FC792 /* AppleAuthProvider.swift in Sources */, + CEB25A032CC13A36007FC792 /* FacebookAuthProvider.swift in Sources */, + CEB25A042CC13A36007FC792 /* GoogleAuthProvider.swift in Sources */, + CEB25A052CC13A36007FC792 /* SocialAuthResponse.swift in Sources */, + CEB25A062CC13A36007FC792 /* MicrosoftAuthProvider.swift in Sources */, + CEB25A072CC13A36007FC792 /* SocialAuthError.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1515,6 +1582,56 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + CE7FB8752CC13C0B0088001A /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/facebook/facebook-ios-sdk"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 16.3.1; + }; + }; + CE7FB8782CC13C3C0088001A /* XCRemoteSwiftPackageReference "GoogleSignIn-iOS" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/google/GoogleSignIn-iOS"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 8.0.0; + }; + }; + CEB1E2622CC14E3100921517 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/openedx/openedx-app-foundation-ios/"; + requirement = { + kind = exactVersion; + version = 1.0.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + CE7CAF2C2CC155BE00E0AC9D /* OEXFoundation */ = { + isa = XCSwiftPackageProductDependency; + package = CEB1E2622CC14E3100921517 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */; + productName = OEXFoundation; + }; + CE7FB8762CC13C0B0088001A /* FacebookLogin */ = { + isa = XCSwiftPackageProductDependency; + package = CE7FB8752CC13C0B0088001A /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */; + productName = FacebookLogin; + }; + CE7FB8792CC13C3C0088001A /* GoogleSignInSwift */ = { + isa = XCSwiftPackageProductDependency; + package = CE7FB8782CC13C3C0088001A /* XCRemoteSwiftPackageReference "GoogleSignIn-iOS" */; + productName = GoogleSignInSwift; + }; + CEB1E2632CC14E3100921517 /* OEXFoundation */ = { + isa = XCSwiftPackageProductDependency; + package = CEB1E2622CC14E3100921517 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */; + productName = OEXFoundation; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = 0770DE3228D0A318006D8A5D /* Project object */; } diff --git a/Authorization/Authorization/Presentation/AuthorizationAnalytics.swift b/Authorization/Authorization/Presentation/AuthorizationAnalytics.swift index 9371a1b40..240f60fa0 100644 --- a/Authorization/Authorization/Presentation/AuthorizationAnalytics.swift +++ b/Authorization/Authorization/Presentation/AuthorizationAnalytics.swift @@ -7,6 +7,7 @@ import Foundation import Core +import OEXFoundation public enum AuthMethod: Equatable { case password diff --git a/Authorization/Authorization/Presentation/Login/SignInView.swift b/Authorization/Authorization/Presentation/Login/SignInView.swift index 104b506cd..84d14adb0 100644 --- a/Authorization/Authorization/Presentation/Login/SignInView.swift +++ b/Authorization/Authorization/Presentation/Login/SignInView.swift @@ -7,6 +7,7 @@ import SwiftUI import Core +import OEXFoundation import Theme import Swinject diff --git a/Authorization/Authorization/Presentation/Login/SignInViewModel.swift b/Authorization/Authorization/Presentation/Login/SignInViewModel.swift index 22040cd4e..b719a9ede 100644 --- a/Authorization/Authorization/Presentation/Login/SignInViewModel.swift +++ b/Authorization/Authorization/Presentation/Login/SignInViewModel.swift @@ -7,6 +7,7 @@ import Foundation import Core +import OEXFoundation import SwiftUI import Alamofire import AuthenticationServices diff --git a/Authorization/Authorization/Presentation/Registration/SignUpView.swift b/Authorization/Authorization/Presentation/Registration/SignUpView.swift index a4a869383..c4d46caf2 100644 --- a/Authorization/Authorization/Presentation/Registration/SignUpView.swift +++ b/Authorization/Authorization/Presentation/Registration/SignUpView.swift @@ -7,6 +7,7 @@ import SwiftUI import Core +import OEXFoundation import Theme public struct SignUpView: View { diff --git a/Authorization/Authorization/Presentation/Registration/SignUpViewModel.swift b/Authorization/Authorization/Presentation/Registration/SignUpViewModel.swift index 8b2fe1b22..a53403f9d 100644 --- a/Authorization/Authorization/Presentation/Registration/SignUpViewModel.swift +++ b/Authorization/Authorization/Presentation/Registration/SignUpViewModel.swift @@ -7,6 +7,7 @@ import Foundation import Core +import OEXFoundation import SwiftUI import AuthenticationServices import FacebookLogin diff --git a/Authorization/Authorization/Presentation/Reset Password/ResetPasswordView.swift b/Authorization/Authorization/Presentation/Reset Password/ResetPasswordView.swift index 2a993a7eb..e069b75e1 100644 --- a/Authorization/Authorization/Presentation/Reset Password/ResetPasswordView.swift +++ b/Authorization/Authorization/Presentation/Reset Password/ResetPasswordView.swift @@ -7,6 +7,7 @@ import SwiftUI import Core +import OEXFoundation import Theme public struct ResetPasswordView: View { diff --git a/Authorization/Authorization/Presentation/Reset Password/ResetPasswordViewModel.swift b/Authorization/Authorization/Presentation/Reset Password/ResetPasswordViewModel.swift index 10b2edc00..8310e2e64 100644 --- a/Authorization/Authorization/Presentation/Reset Password/ResetPasswordViewModel.swift +++ b/Authorization/Authorization/Presentation/Reset Password/ResetPasswordViewModel.swift @@ -7,6 +7,7 @@ import SwiftUI import Core +import OEXFoundation public class ResetPasswordViewModel: ObservableObject { diff --git a/Authorization/Authorization/Presentation/SSO/SSOWebViewModel.swift b/Authorization/Authorization/Presentation/SSO/SSOWebViewModel.swift index 043a34060..07e0faa55 100644 --- a/Authorization/Authorization/Presentation/SSO/SSOWebViewModel.swift +++ b/Authorization/Authorization/Presentation/SSO/SSOWebViewModel.swift @@ -7,6 +7,7 @@ import Foundation import SwiftUI +import OEXFoundation import Core import Alamofire import AuthenticationServices diff --git a/Core/Core/Providers/SocialAuth/AppleAuthProvider.swift b/Authorization/Authorization/SocialAuth/AppleAuthProvider.swift similarity index 98% rename from Core/Core/Providers/SocialAuth/AppleAuthProvider.swift rename to Authorization/Authorization/SocialAuth/AppleAuthProvider.swift index 1ed3d4c06..27afa234a 100644 --- a/Core/Core/Providers/SocialAuth/AppleAuthProvider.swift +++ b/Authorization/Authorization/SocialAuth/AppleAuthProvider.swift @@ -8,6 +8,8 @@ import Foundation import AuthenticationServices import Swinject +import OEXFoundation +import Core public final class AppleAuthProvider: NSObject, ASAuthorizationControllerDelegate { diff --git a/Core/Core/Providers/SocialAuth/Error/SocialAuthError.swift b/Authorization/Authorization/SocialAuth/Error/SocialAuthError.swift similarity index 97% rename from Core/Core/Providers/SocialAuth/Error/SocialAuthError.swift rename to Authorization/Authorization/SocialAuth/Error/SocialAuthError.swift index a9167451e..27071bab7 100644 --- a/Core/Core/Providers/SocialAuth/Error/SocialAuthError.swift +++ b/Authorization/Authorization/SocialAuth/Error/SocialAuthError.swift @@ -6,6 +6,7 @@ // import Foundation +import Core public enum SocialAuthError: Error { case error(text: String) diff --git a/Core/Core/Providers/SocialAuth/FacebookAuthProvider.swift b/Authorization/Authorization/SocialAuth/FacebookAuthProvider.swift similarity index 99% rename from Core/Core/Providers/SocialAuth/FacebookAuthProvider.swift rename to Authorization/Authorization/SocialAuth/FacebookAuthProvider.swift index 66ae46b6d..b5913bb25 100644 --- a/Core/Core/Providers/SocialAuth/FacebookAuthProvider.swift +++ b/Authorization/Authorization/SocialAuth/FacebookAuthProvider.swift @@ -7,6 +7,7 @@ import Foundation import FacebookLogin +import Core public final class FacebookAuthProvider { diff --git a/Core/Core/Providers/SocialAuth/GoogleAuthProvider.swift b/Authorization/Authorization/SocialAuth/GoogleAuthProvider.swift similarity index 99% rename from Core/Core/Providers/SocialAuth/GoogleAuthProvider.swift rename to Authorization/Authorization/SocialAuth/GoogleAuthProvider.swift index c600c1735..fb4336af2 100644 --- a/Core/Core/Providers/SocialAuth/GoogleAuthProvider.swift +++ b/Authorization/Authorization/SocialAuth/GoogleAuthProvider.swift @@ -7,6 +7,7 @@ import GoogleSignIn import Foundation +import Core public final class GoogleAuthProvider { diff --git a/Core/Core/Providers/SocialAuth/MicrosoftAuthProvider.swift b/Authorization/Authorization/SocialAuth/MicrosoftAuthProvider.swift similarity index 99% rename from Core/Core/Providers/SocialAuth/MicrosoftAuthProvider.swift rename to Authorization/Authorization/SocialAuth/MicrosoftAuthProvider.swift index 2fd998579..813c755f1 100644 --- a/Core/Core/Providers/SocialAuth/MicrosoftAuthProvider.swift +++ b/Authorization/Authorization/SocialAuth/MicrosoftAuthProvider.swift @@ -8,6 +8,8 @@ import Foundation import MSAL import Swinject +import OEXFoundation +import Core public typealias MSLoginCompletionHandler = (account: MSALAccount, token: String) diff --git a/Core/Core/Providers/SocialAuth/SocialAuthResponse.swift b/Authorization/Authorization/SocialAuth/SocialAuthResponse.swift similarity index 100% rename from Core/Core/Providers/SocialAuth/SocialAuthResponse.swift rename to Authorization/Authorization/SocialAuth/SocialAuthResponse.swift diff --git a/Authorization/AuthorizationTests/AuthorizationMock.generated.swift b/Authorization/AuthorizationTests/AuthorizationMock.generated.swift index 59adf71ce..31285ffcb 100644 --- a/Authorization/AuthorizationTests/AuthorizationMock.generated.swift +++ b/Authorization/AuthorizationTests/AuthorizationMock.generated.swift @@ -13,6 +13,7 @@ import Authorization import Foundation import SwiftUI import Combine +import OEXFoundation // MARK: - AuthInteractorProtocol diff --git a/Authorization/AuthorizationTests/Presentation/Login/ResetPasswordViewModelTests.swift b/Authorization/AuthorizationTests/Presentation/Login/ResetPasswordViewModelTests.swift index 6b09633f2..e5ffa55e7 100644 --- a/Authorization/AuthorizationTests/Presentation/Login/ResetPasswordViewModelTests.swift +++ b/Authorization/AuthorizationTests/Presentation/Login/ResetPasswordViewModelTests.swift @@ -9,6 +9,7 @@ import SwiftyMocky import XCTest @testable import Core @testable import Authorization +import OEXFoundation import Alamofire import SwiftUI diff --git a/Authorization/AuthorizationTests/Presentation/Login/SignInViewModelTests.swift b/Authorization/AuthorizationTests/Presentation/Login/SignInViewModelTests.swift index 1435a61b9..c91d48adc 100644 --- a/Authorization/AuthorizationTests/Presentation/Login/SignInViewModelTests.swift +++ b/Authorization/AuthorizationTests/Presentation/Login/SignInViewModelTests.swift @@ -9,6 +9,7 @@ import SwiftyMocky import XCTest @testable import Core @testable import Authorization +import OEXFoundation import Alamofire import SwiftUI diff --git a/Authorization/AuthorizationTests/Presentation/Register/SignUpViewModelTests.swift b/Authorization/AuthorizationTests/Presentation/Register/SignUpViewModelTests.swift index ad180a925..7e8236d27 100644 --- a/Authorization/AuthorizationTests/Presentation/Register/SignUpViewModelTests.swift +++ b/Authorization/AuthorizationTests/Presentation/Register/SignUpViewModelTests.swift @@ -9,6 +9,7 @@ import SwiftyMocky import XCTest @testable import Core @testable import Authorization +import OEXFoundation import Alamofire import SwiftUI diff --git a/Authorization/Mockfile b/Authorization/Mockfile index 5e0805e28..a3ae4b4f7 100644 --- a/Authorization/Mockfile +++ b/Authorization/Mockfile @@ -14,4 +14,5 @@ unit.tests.mock: - Authorization - Foundation - SwiftUI - - Combine \ No newline at end of file + - Combine + - OEXFoundation \ No newline at end of file diff --git a/Core/Core.xcodeproj/project.pbxproj b/Core/Core.xcodeproj/project.pbxproj index 3ba4ab39b..d1a063a0e 100644 --- a/Core/Core.xcodeproj/project.pbxproj +++ b/Core/Core.xcodeproj/project.pbxproj @@ -15,9 +15,7 @@ 021D925028DC89D100ACC565 /* UserProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 021D924F28DC89D100ACC565 /* UserProfile.swift */; }; 021D925728DCF12900ACC565 /* AlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 021D925628DCF12900ACC565 /* AlertView.swift */; }; 022020462C11BB2200D15795 /* Data_CourseDates.swift in Sources */ = {isa = PBXBuildFile; fileRef = 022020452C11BB2200D15795 /* Data_CourseDates.swift */; }; - 02228B312C2232D2009A5F28 /* IntExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02228B302C2232D2009A5F28 /* IntExtension.swift */; }; 02280F5B294B4E6F0032823A /* Connectivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02280F5A294B4E6F0032823A /* Connectivity.swift */; }; - 02284C182A3B1AE00007117F /* UIApplicationExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02284C172A3B1AE00007117F /* UIApplicationExtension.swift */; }; 02286D162C106393005EEC8D /* CourseDates.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02286D152C106393005EEC8D /* CourseDates.swift */; }; 022C64E429AE0191000F532B /* TextWithUrls.swift in Sources */ = {isa = PBXBuildFile; fileRef = 022C64E329AE0191000F532B /* TextWithUrls.swift */; }; 0231CDBE2922422D00032416 /* CSSInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0231CDBD2922422D00032416 /* CSSInjector.swift */; }; @@ -34,16 +32,13 @@ 023A4DD4299E66BD006C0E48 /* OfflineSnackBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 023A4DD3299E66BD006C0E48 /* OfflineSnackBarView.swift */; }; 0241666B28F5A78B00082765 /* HTMLFormattedText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0241666A28F5A78B00082765 /* HTMLFormattedText.swift */; }; 0248C92329C075EF00DC8402 /* CourseBlockModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0248C92229C075EF00DC8402 /* CourseBlockModel.swift */; }; - 024BE3DF29B2615500BCDEE2 /* CGColorExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 024BE3DE29B2615500BCDEE2 /* CGColorExtension.swift */; }; 024D723529C8BB1A006D36ED /* NavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 024D723429C8BB1A006D36ED /* NavigationBar.swift */; }; 024FCD0028EF1CD300232339 /* WebBrowser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 024FCCFF28EF1CD300232339 /* WebBrowser.swift */; }; 02512FF0299533DF0024D438 /* CoreDataHandlerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02512FEF299533DE0024D438 /* CoreDataHandlerProtocol.swift */; }; 0254D1912BCD699F000CDE89 /* RefreshProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0254D1902BCD699F000CDE89 /* RefreshProgressView.swift */; }; - 0255D5582936283A004DBC1A /* UploadBodyEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0255D55729362839004DBC1A /* UploadBodyEncoding.swift */; }; 0259104A29C4A5B6004B5A55 /* UserSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0259104929C4A5B6004B5A55 /* UserSettings.swift */; }; 025A20502C071EB0003EA08D /* ErrorAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 025A204F2C071EB0003EA08D /* ErrorAlertView.swift */; }; 025B36752A13B7D5001A640E /* UnitButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 025B36742A13B7D5001A640E /* UnitButtonView.swift */; }; - 025EF2F62971740000B838AB /* YouTubePlayerKit in Frameworks */ = {isa = PBXBuildFile; productRef = 025EF2F52971740000B838AB /* YouTubePlayerKit */; }; 0260E58028FD792800BBBE18 /* WebUnitViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0260E57F28FD792800BBBE18 /* WebUnitViewModel.swift */; }; 0267F8512C3C256F0089D810 /* FileWebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0267F8502C3C256F0089D810 /* FileWebView.swift */; }; 027BD3922907D88F00392132 /* Data_RegistrationFields.swift in Sources */ = {isa = PBXBuildFile; fileRef = 027BD3912907D88F00392132 /* Data_RegistrationFields.swift */; }; @@ -58,8 +53,6 @@ 027BD3B52909475900392132 /* KeyboardStateObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 027BD3B22909475900392132 /* KeyboardStateObserver.swift */; }; 027BD3B82909476200392132 /* DismissKeyboardTapViewModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 027BD3B62909476200392132 /* DismissKeyboardTapViewModifier.swift */; }; 027BD3B92909476200392132 /* KeyboardAvoidingModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 027BD3B72909476200392132 /* KeyboardAvoidingModifier.swift */; }; - 027BD3BD2909478B00392132 /* UIView+EnclosingScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 027BD3BA2909478B00392132 /* UIView+EnclosingScrollView.swift */; }; - 027BD3BE2909478B00392132 /* UIResponder+CurrentResponder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 027BD3BB2909478B00392132 /* UIResponder+CurrentResponder.swift */; }; 027BD3C52909707700392132 /* Shake.swift in Sources */ = {isa = PBXBuildFile; fileRef = 027BD3C42909707700392132 /* Shake.swift */; }; 027F1BF72C071C820001A24C /* NavigationTitle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 027F1BF62C071C820001A24C /* NavigationTitle.swift */; }; 0282DA7328F98CC9003C3F07 /* WebUnitView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0282DA7228F98CC9003C3F07 /* WebUnitView.swift */; }; @@ -76,7 +69,6 @@ 029A132A2C2471DF005FB830 /* OfflineSyncRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 029A13292C2471DF005FB830 /* OfflineSyncRepository.swift */; }; 029A132C2C2471F8005FB830 /* OfflineSyncEndpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 029A132B2C2471F8005FB830 /* OfflineSyncEndpoint.swift */; }; 029A13302C2479E7005FB830 /* OfflineSyncInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 029A132F2C2479E7005FB830 /* OfflineSyncInteractor.swift */; }; - 029EE3ED2BF6650500F64F33 /* Bundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 029EE3EC2BF6650500F64F33 /* Bundle.swift */; }; 02A463112AEA966C00331037 /* AppReviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02A463102AEA966C00331037 /* AppReviewView.swift */; }; 02A4833529B8A73400D33F33 /* CorePersistenceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02A4833429B8A73400D33F33 /* CorePersistenceProtocol.swift */; }; 02A4833829B8A8F900D33F33 /* CoreDataModel.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 02A4833629B8A8F800D33F33 /* CoreDataModel.xcdatamodeld */; }; @@ -86,26 +78,18 @@ 02AA27942C2C1B88006F5B6A /* ZipArchive in Frameworks */ = {isa = PBXBuildFile; productRef = 02AA27932C2C1B88006F5B6A /* ZipArchive */; }; 02AFCC182AEFDB24000360F0 /* ThirdPartyMailClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02AFCC172AEFDB24000360F0 /* ThirdPartyMailClient.swift */; }; 02AFCC1A2AEFDC18000360F0 /* ThirdPartyMailer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02AFCC192AEFDC18000360F0 /* ThirdPartyMailer.swift */; }; - 02B2B594295C5C7A00914876 /* Thread.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02B2B593295C5C7A00914876 /* Thread.swift */; }; - 02B3E3B32930198600A50475 /* AVPlayerViewControllerExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02B3E3B22930198600A50475 /* AVPlayerViewControllerExtension.swift */; }; 02C917F029CDA99E00DBB8BD /* Data_Enrollments.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02C917EF29CDA99E00DBB8BD /* Data_Enrollments.swift */; }; 02CA59842BD7DDBE00D517AA /* DashboardConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02CA59832BD7DDBE00D517AA /* DashboardConfig.swift */; }; 02CF46C829546AA200A698EE /* NoCachedDataError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02CF46C729546AA200A698EE /* NoCachedDataError.swift */; }; - 02D400612B0678190029D168 /* SKStoreReviewControllerExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02D400602B0678190029D168 /* SKStoreReviewControllerExtension.swift */; }; 02D800CC29348F460099CF16 /* ImagePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02D800CB29348F460099CF16 /* ImagePicker.swift */; }; 02E224DB2BB76B3E00EF1ADB /* DynamicOffsetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02E224DA2BB76B3E00EF1ADB /* DynamicOffsetView.swift */; }; - 02E225B0291D29EB0067769A /* UrlExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02E225AF291D29EB0067769A /* UrlExtension.swift */; }; 02E93F852AEBAEBC006C4750 /* AppReviewViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02E93F842AEBAEBC006C4750 /* AppReviewViewModel.swift */; }; 02EBC7572C19DCDB00BE182C /* SyncStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02EBC7562C19DCDB00BE182C /* SyncStatus.swift */; }; 02EBC7592C19DE1100BE182C /* CalendarManagerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02EBC7582C19DE1100BE182C /* CalendarManagerProtocol.swift */; }; 02EBC75B2C19DE3D00BE182C /* CourseForSync.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02EBC75A2C19DE3D00BE182C /* CourseForSync.swift */; }; - 02F164372902A9EB0090DDEF /* StringExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02F164362902A9EB0090DDEF /* StringExtension.swift */; }; 02F6EF3B28D9B8EC00835477 /* CourseCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02F6EF3A28D9B8EC00835477 /* CourseCellView.swift */; }; 02F6EF4A28D9F0A700835477 /* DateExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02F6EF4928D9F0A700835477 /* DateExtension.swift */; }; - 02F98A7F28F81EE900DE94C0 /* Container+App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02F98A7E28F81EE900DE94C0 /* Container+App.swift */; }; 0604C9AA2B22FACF00AD5DBF /* UIComponentsConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0604C9A92B22FACF00AD5DBF /* UIComponentsConfig.swift */; }; - 06078B702BA49C3100576798 /* Dictionary+JSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06078B6E2BA49C3100576798 /* Dictionary+JSON.swift */; }; - 06078B712BA49C3100576798 /* String+JSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06078B6F2BA49C3100576798 /* String+JSON.swift */; }; 064987932B4D69FF0071642A /* DragAndDropCssInjection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0649878A2B4D69FE0071642A /* DragAndDropCssInjection.swift */; }; 064987942B4D69FF0071642A /* WebviewInjection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0649878B2B4D69FE0071642A /* WebviewInjection.swift */; }; 064987952B4D69FF0071642A /* SurveyCssInjection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0649878C2B4D69FE0071642A /* SurveyCssInjection.swift */; }; @@ -129,67 +113,45 @@ 0727877028D23411002E9142 /* Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0727876F28D23411002E9142 /* Config.swift */; }; 0727877728D23847002E9142 /* DataLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0727877628D23847002E9142 /* DataLayer.swift */; }; 0727877928D23BE0002E9142 /* RequestInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0727877828D23BE0002E9142 /* RequestInterceptor.swift */; }; - 0727877B28D24A1D002E9142 /* HeadersRedirectHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0727877A28D24A1D002E9142 /* HeadersRedirectHandler.swift */; }; 0727877D28D25212002E9142 /* ProgressBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0727877C28D25212002E9142 /* ProgressBar.swift */; }; - 0727877F28D25B24002E9142 /* Alamofire+Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0727877E28D25B24002E9142 /* Alamofire+Error.swift */; }; 0727878128D25EFD002E9142 /* SnackBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0727878028D25EFD002E9142 /* SnackBarView.swift */; }; - 0727878328D31287002E9142 /* DispatchQueue+App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0727878228D31287002E9142 /* DispatchQueue+App.swift */; }; 0727878528D31657002E9142 /* Data_User.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0727878428D31657002E9142 /* Data_User.swift */; }; 0727878928D31734002E9142 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0727878828D31734002E9142 /* User.swift */; }; 072787B628D37A0E002E9142 /* Validator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 072787B528D37A0E002E9142 /* Validator.swift */; }; - 07460FE1294B706200F70538 /* CollectionExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07460FE0294B706200F70538 /* CollectionExtension.swift */; }; 07460FE3294B72D700F70538 /* Notification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07460FE2294B72D700F70538 /* Notification.swift */; }; 076F297F2A1F80C800967E7D /* Pagination.swift in Sources */ = {isa = PBXBuildFile; fileRef = 076F297E2A1F80C800967E7D /* Pagination.swift */; }; 0770DE1928D0847D006D8A5D /* BaseRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0770DE1828D0847D006D8A5D /* BaseRouter.swift */; }; 0770DE2528D08FBA006D8A5D /* CoreStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0770DE2428D08FBA006D8A5D /* CoreStorage.swift */; }; - 0770DE2A28D0929E006D8A5D /* HTTPTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0770DE2928D0929E006D8A5D /* HTTPTask.swift */; }; - 0770DE2C28D092B3006D8A5D /* NetworkLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0770DE2B28D092B3006D8A5D /* NetworkLogger.swift */; }; - 0770DE2E28D09743006D8A5D /* API.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0770DE2D28D09743006D8A5D /* API.swift */; }; - 0770DE3028D09793006D8A5D /* EndPointType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0770DE2F28D09793006D8A5D /* EndPointType.swift */; }; 0770DE5228D0ADFF006D8A5D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0770DE5128D0ADFF006D8A5D /* Assets.xcassets */; }; 0770DE5428D0B00C006D8A5D /* swiftgen.yml in Resources */ = {isa = PBXBuildFile; fileRef = 0770DE5328D0B00C006D8A5D /* swiftgen.yml */; }; 0770DE5B28D0B209006D8A5D /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0770DE5D28D0B209006D8A5D /* Localizable.strings */; }; 0770DE5F28D0B22C006D8A5D /* Strings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0770DE5E28D0B22C006D8A5D /* Strings.swift */; }; 0770DE6128D0B2CB006D8A5D /* Assets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0770DE6028D0B2CB006D8A5D /* Assets.swift */; }; - 07DDFCBD29A780BB00572595 /* UINavigationController+Animation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07DDFCBC29A780BB00572595 /* UINavigationController+Animation.swift */; }; 07E0939F2B308D2800F1E4B2 /* Data_Certificate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07E0939E2B308D2800F1E4B2 /* Data_Certificate.swift */; }; 141F1D302B7328D4009E81EB /* WebviewCookiesUpdateProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 141F1D2F2B7328D4009E81EB /* WebviewCookiesUpdateProtocol.swift */; }; - 142EDD6C2B831D1400F9F320 /* BranchSDK in Frameworks */ = {isa = PBXBuildFile; productRef = 142EDD6B2B831D1400F9F320 /* BranchSDK */; }; 14769D3C2B9822EE00AB36D4 /* CoreAnalytics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14769D3B2B9822EE00AB36D4 /* CoreAnalytics.swift */; }; - 14D912D92C2553C70077CCCE /* FullStoryConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14D912D82C2553C70077CCCE /* FullStoryConfig.swift */; }; - 14D912DB2C257E9E0077CCCE /* FullStoryConfigTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14D912DA2C257E9E0077CCCE /* FullStoryConfigTests.swift */; }; 5E58740A2AA9DF20F4644191 /* Pods_App_Core_CoreTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 33FA09A20AAE2B2A0BA89190 /* Pods_App_Core_CoreTests.framework */; }; 9784D47E2BF7762800AFEFFF /* FullScreenErrorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9784D47D2BF7762800AFEFFF /* FullScreenErrorView.swift */; }; - A51CDBE72B6D21F2009B6D4E /* SegmentConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51CDBE62B6D21F2009B6D4E /* SegmentConfig.swift */; }; A53A32352B233DEC005FE38A /* ThemeConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = A53A32342B233DEC005FE38A /* ThemeConfig.swift */; }; A595689B2B6173DF00ED4F90 /* BranchConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = A595689A2B6173DF00ED4F90 /* BranchConfig.swift */; }; A5F4E7B52B61544A00ACD166 /* BrazeConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5F4E7B42B61544A00ACD166 /* BrazeConfig.swift */; }; - BA30427F2B20B320009B64B7 /* SocialAuthError.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA30427D2B20B299009B64B7 /* SocialAuthError.swift */; }; BA4AFB422B5A7A0900A21367 /* VideoDownloadQualityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA4AFB412B5A7A0900A21367 /* VideoDownloadQualityView.swift */; }; BA4AFB442B6A5AF100A21367 /* CheckBoxView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA4AFB432B6A5AF100A21367 /* CheckBoxView.swift */; }; BA593F1C2AF8E498009ADB51 /* ScrollSlidingTabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA593F1B2AF8E498009ADB51 /* ScrollSlidingTabBar.swift */; }; BA593F1E2AF8E4A0009ADB51 /* FrameReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA593F1D2AF8E4A0009ADB51 /* FrameReader.swift */; }; - BA76135C2B21BC7300B599B7 /* SocialAuthResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA76135B2B21BC7300B599B7 /* SocialAuthResponse.swift */; }; - BA8B3A2F2AD546A700D25EF5 /* DebugLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA8B3A2E2AD546A700D25EF5 /* DebugLog.swift */; }; - BA8FA6612AD5974300EA029A /* AppleAuthProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA8FA6602AD5974300EA029A /* AppleAuthProvider.swift */; }; BA8FA6682AD59A5700EA029A /* SocialAuthButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA8FA6672AD59A5700EA029A /* SocialAuthButton.swift */; }; - BA8FA66A2AD59B5500EA029A /* GoogleAuthProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA8FA6692AD59B5500EA029A /* GoogleAuthProvider.swift */; }; - BA8FA66C2AD59BBC00EA029A /* GoogleSignIn in Frameworks */ = {isa = PBXBuildFile; productRef = BA8FA66B2AD59BBC00EA029A /* GoogleSignIn */; }; - BA8FA66E2AD59E7D00EA029A /* FacebookAuthProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA8FA66D2AD59E7D00EA029A /* FacebookAuthProvider.swift */; }; - BA8FA6702AD59EA300EA029A /* MicrosoftAuthProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA8FA66F2AD59EA300EA029A /* MicrosoftAuthProvider.swift */; }; - BA981BCE2B8F5C49005707C2 /* Sequence+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA981BCD2B8F5C49005707C2 /* Sequence+Extensions.swift */; }; BA981BD02B91ED50005707C2 /* FullScreenProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA981BCF2B91ED50005707C2 /* FullScreenProgressView.swift */; }; BAD9CA2F2B289B3500DE790A /* ajaxHandler.js in Resources */ = {isa = PBXBuildFile; fileRef = BAD9CA2E2B289B3500DE790A /* ajaxHandler.js */; }; BAD9CA332B28A8F300DE790A /* AjaxProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAD9CA322B28A8F300DE790A /* AjaxProvider.swift */; }; BAD9CA422B2B140100DE790A /* AgreementConfigTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAD9CA412B2B140100DE790A /* AgreementConfigTests.swift */; }; - BADB3F5B2AD6EC56004D5CFA /* ResultExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = BADB3F5A2AD6EC56004D5CFA /* ResultExtension.swift */; }; - BAF0D4CB2AD6AE14007AC334 /* FacebookLogin in Frameworks */ = {isa = PBXBuildFile; productRef = BAF0D4CA2AD6AE14007AC334 /* FacebookLogin */; }; BAFB99822B0E2354007D09F9 /* FacebookConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAFB99812B0E2354007D09F9 /* FacebookConfig.swift */; }; BAFB99842B0E282E007D09F9 /* MicrosoftConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAFB99832B0E282E007D09F9 /* MicrosoftConfig.swift */; }; BAFB99902B14B377007D09F9 /* GoogleConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAFB998F2B14B377007D09F9 /* GoogleConfig.swift */; }; BAFB99922B14E23D007D09F9 /* AppleSignInConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAFB99912B14E23D007D09F9 /* AppleSignInConfig.swift */; }; C8C446EF233F81B9FABB77D2 /* Pods_App_Core.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 349B90CD6579F7B8D257E515 /* Pods_App_Core.framework */; }; CE54C2D22CC80D8500E529F9 /* DownloadManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE54C2D12CC80D8500E529F9 /* DownloadManagerTests.swift */; }; + CE57127C2CD109DB00D4AB17 /* OEXFoundation in Frameworks */ = {isa = PBXBuildFile; productRef = CE57127B2CD109DB00D4AB17 /* OEXFoundation */; }; + CE7CAF392CC1561E00E0AC9D /* OEXFoundation in Frameworks */ = {isa = PBXBuildFile; productRef = CE7CAF382CC1561E00E0AC9D /* OEXFoundation */; }; CE953A3B2CD0DA940023D667 /* CoreMock.generated.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE953A3A2CD0DA940023D667 /* CoreMock.generated.swift */; }; CFC84952299F8B890055E497 /* Debounce.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFC84951299F8B890055E497 /* Debounce.swift */; }; DBF6F2412B014ADA0098414B /* FirebaseConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBF6F2402B014ADA0098414B /* FirebaseConfig.swift */; }; @@ -198,7 +160,6 @@ E055A5392B18DC95008D9E5E /* Theme.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E055A5382B18DC95008D9E5E /* Theme.framework */; }; E09179FD2B0F204E002AB695 /* ConfigTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E09179FC2B0F204D002AB695 /* ConfigTests.swift */; }; E0D5861A2B2FF74C009B4BA7 /* DiscoveryConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0D586192B2FF74C009B4BA7 /* DiscoveryConfig.swift */; }; - E0D5861C2B2FF85B009B4BA7 /* RawStringExtactable.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0D5861B2B2FF85B009B4BA7 /* RawStringExtactable.swift */; }; E0D586362B314CD3009B4BA7 /* LogistrationBottomView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0D586352B314CD3009B4BA7 /* LogistrationBottomView.swift */; }; /* End PBXBuildFile section */ @@ -212,6 +173,29 @@ }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + CE57127E2CD109DB00D4AB17 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + CE7CAF3B2CC1561E00E0AC9D /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 020306CB2932C0C4000949EA /* PickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PickerView.swift; sourceTree = ""; }; 02066B472906F73400F4307E /* PickerMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PickerMenu.swift; sourceTree = ""; }; @@ -221,9 +205,7 @@ 021D924F28DC89D100ACC565 /* UserProfile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserProfile.swift; sourceTree = ""; }; 021D925628DCF12900ACC565 /* AlertView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertView.swift; sourceTree = ""; }; 022020452C11BB2200D15795 /* Data_CourseDates.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Data_CourseDates.swift; sourceTree = ""; }; - 02228B302C2232D2009A5F28 /* IntExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntExtension.swift; sourceTree = ""; }; 02280F5A294B4E6F0032823A /* Connectivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Connectivity.swift; sourceTree = ""; }; - 02284C172A3B1AE00007117F /* UIApplicationExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIApplicationExtension.swift; sourceTree = ""; }; 02286D152C106393005EEC8D /* CourseDates.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CourseDates.swift; sourceTree = ""; }; 022C64E329AE0191000F532B /* TextWithUrls.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextWithUrls.swift; sourceTree = ""; }; 0231CDBD2922422D00032416 /* CSSInjector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CSSInjector.swift; sourceTree = ""; }; @@ -240,12 +222,10 @@ 023A4DD3299E66BD006C0E48 /* OfflineSnackBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OfflineSnackBarView.swift; sourceTree = ""; }; 0241666A28F5A78B00082765 /* HTMLFormattedText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTMLFormattedText.swift; sourceTree = ""; }; 0248C92229C075EF00DC8402 /* CourseBlockModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CourseBlockModel.swift; sourceTree = ""; }; - 024BE3DE29B2615500BCDEE2 /* CGColorExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CGColorExtension.swift; sourceTree = ""; }; 024D723429C8BB1A006D36ED /* NavigationBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBar.swift; sourceTree = ""; }; 024FCCFF28EF1CD300232339 /* WebBrowser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebBrowser.swift; sourceTree = ""; }; 02512FEF299533DE0024D438 /* CoreDataHandlerProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreDataHandlerProtocol.swift; sourceTree = ""; }; 0254D1902BCD699F000CDE89 /* RefreshProgressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshProgressView.swift; sourceTree = ""; }; - 0255D55729362839004DBC1A /* UploadBodyEncoding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UploadBodyEncoding.swift; sourceTree = ""; }; 0259104929C4A5B6004B5A55 /* UserSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserSettings.swift; sourceTree = ""; }; 025A204F2C071EB0003EA08D /* ErrorAlertView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorAlertView.swift; sourceTree = ""; }; 025B36742A13B7D5001A640E /* UnitButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnitButtonView.swift; sourceTree = ""; }; @@ -263,8 +243,6 @@ 027BD3B22909475900392132 /* KeyboardStateObserver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyboardStateObserver.swift; sourceTree = ""; }; 027BD3B62909476200392132 /* DismissKeyboardTapViewModifier.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DismissKeyboardTapViewModifier.swift; sourceTree = ""; }; 027BD3B72909476200392132 /* KeyboardAvoidingModifier.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyboardAvoidingModifier.swift; sourceTree = ""; }; - 027BD3BA2909478B00392132 /* UIView+EnclosingScrollView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIView+EnclosingScrollView.swift"; sourceTree = ""; }; - 027BD3BB2909478B00392132 /* UIResponder+CurrentResponder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIResponder+CurrentResponder.swift"; sourceTree = ""; }; 027BD3C42909707700392132 /* Shake.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Shake.swift; sourceTree = ""; }; 027F1BF62C071C820001A24C /* NavigationTitle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationTitle.swift; sourceTree = ""; }; 0282DA7228F98CC9003C3F07 /* WebUnitView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebUnitView.swift; sourceTree = ""; }; @@ -281,7 +259,6 @@ 029A13292C2471DF005FB830 /* OfflineSyncRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OfflineSyncRepository.swift; sourceTree = ""; }; 029A132B2C2471F8005FB830 /* OfflineSyncEndpoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OfflineSyncEndpoint.swift; sourceTree = ""; }; 029A132F2C2479E7005FB830 /* OfflineSyncInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OfflineSyncInteractor.swift; sourceTree = ""; }; - 029EE3EC2BF6650500F64F33 /* Bundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Bundle.swift; sourceTree = ""; }; 02A463102AEA966C00331037 /* AppReviewView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppReviewView.swift; sourceTree = ""; }; 02A4833429B8A73400D33F33 /* CorePersistenceProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CorePersistenceProtocol.swift; sourceTree = ""; }; 02A4833729B8A8F800D33F33 /* CoreDataModel.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = CoreDataModel.xcdatamodel; sourceTree = ""; }; @@ -290,27 +267,19 @@ 02A8C5802C05DBB4004B91FF /* Data_EnrollmentsStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Data_EnrollmentsStatus.swift; sourceTree = ""; }; 02AFCC172AEFDB24000360F0 /* ThirdPartyMailClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThirdPartyMailClient.swift; sourceTree = ""; }; 02AFCC192AEFDC18000360F0 /* ThirdPartyMailer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThirdPartyMailer.swift; sourceTree = ""; }; - 02B2B593295C5C7A00914876 /* Thread.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Thread.swift; sourceTree = ""; }; - 02B3E3B22930198600A50475 /* AVPlayerViewControllerExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AVPlayerViewControllerExtension.swift; sourceTree = ""; }; 02C917EF29CDA99E00DBB8BD /* Data_Enrollments.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Data_Enrollments.swift; sourceTree = ""; }; 02CA59832BD7DDBE00D517AA /* DashboardConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DashboardConfig.swift; sourceTree = ""; }; 02CF46C729546AA200A698EE /* NoCachedDataError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NoCachedDataError.swift; sourceTree = ""; }; - 02D400602B0678190029D168 /* SKStoreReviewControllerExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SKStoreReviewControllerExtension.swift; sourceTree = ""; }; 02D800CB29348F460099CF16 /* ImagePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImagePicker.swift; sourceTree = ""; }; 02E224DA2BB76B3E00EF1ADB /* DynamicOffsetView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DynamicOffsetView.swift; sourceTree = ""; }; - 02E225AF291D29EB0067769A /* UrlExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UrlExtension.swift; sourceTree = ""; }; 02E93F842AEBAEBC006C4750 /* AppReviewViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppReviewViewModel.swift; sourceTree = ""; }; 02EBC7562C19DCDB00BE182C /* SyncStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncStatus.swift; sourceTree = ""; }; 02EBC7582C19DE1100BE182C /* CalendarManagerProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarManagerProtocol.swift; sourceTree = ""; }; 02EBC75A2C19DE3D00BE182C /* CourseForSync.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CourseForSync.swift; sourceTree = ""; }; - 02F164362902A9EB0090DDEF /* StringExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringExtension.swift; sourceTree = ""; }; 02F6EF3A28D9B8EC00835477 /* CourseCellView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CourseCellView.swift; sourceTree = ""; }; 02F6EF4928D9F0A700835477 /* DateExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateExtension.swift; sourceTree = ""; }; - 02F98A7E28F81EE900DE94C0 /* Container+App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Container+App.swift"; sourceTree = ""; }; 043DD0B526F919DFA1C5E600 /* Pods-App-Core-CoreTests.releaseprod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-Core-CoreTests.releaseprod.xcconfig"; path = "Target Support Files/Pods-App-Core-CoreTests/Pods-App-Core-CoreTests.releaseprod.xcconfig"; sourceTree = ""; }; 0604C9A92B22FACF00AD5DBF /* UIComponentsConfig.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIComponentsConfig.swift; sourceTree = ""; }; - 06078B6E2BA49C3100576798 /* Dictionary+JSON.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Dictionary+JSON.swift"; sourceTree = ""; }; - 06078B6F2BA49C3100576798 /* String+JSON.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+JSON.swift"; sourceTree = ""; }; 0649878A2B4D69FE0071642A /* DragAndDropCssInjection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DragAndDropCssInjection.swift; sourceTree = ""; }; 0649878B2B4D69FE0071642A /* WebviewInjection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebviewInjection.swift; sourceTree = ""; }; 0649878C2B4D69FE0071642A /* SurveyCssInjection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SurveyCssInjection.swift; sourceTree = ""; }; @@ -334,38 +303,27 @@ 0727876F28D23411002E9142 /* Config.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Config.swift; sourceTree = ""; }; 0727877628D23847002E9142 /* DataLayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataLayer.swift; sourceTree = ""; }; 0727877828D23BE0002E9142 /* RequestInterceptor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestInterceptor.swift; sourceTree = ""; }; - 0727877A28D24A1D002E9142 /* HeadersRedirectHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadersRedirectHandler.swift; sourceTree = ""; }; 0727877C28D25212002E9142 /* ProgressBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgressBar.swift; sourceTree = ""; }; - 0727877E28D25B24002E9142 /* Alamofire+Error.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Alamofire+Error.swift"; sourceTree = ""; }; 0727878028D25EFD002E9142 /* SnackBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SnackBarView.swift; sourceTree = ""; }; - 0727878228D31287002E9142 /* DispatchQueue+App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DispatchQueue+App.swift"; sourceTree = ""; }; 0727878428D31657002E9142 /* Data_User.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Data_User.swift; sourceTree = ""; }; 0727878828D31734002E9142 /* User.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = User.swift; sourceTree = ""; }; 072787B528D37A0E002E9142 /* Validator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Validator.swift; sourceTree = ""; }; - 07460FE0294B706200F70538 /* CollectionExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CollectionExtension.swift; sourceTree = ""; }; 07460FE2294B72D700F70538 /* Notification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Notification.swift; sourceTree = ""; }; 0754BB7841E3C0F8D6464951 /* Pods-App-Core.releasestage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-Core.releasestage.xcconfig"; path = "Target Support Files/Pods-App-Core/Pods-App-Core.releasestage.xcconfig"; sourceTree = ""; }; 076F297E2A1F80C800967E7D /* Pagination.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Pagination.swift; sourceTree = ""; }; 0770DE0828D07831006D8A5D /* Core.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Core.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 0770DE1828D0847D006D8A5D /* BaseRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseRouter.swift; sourceTree = ""; }; 0770DE2428D08FBA006D8A5D /* CoreStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreStorage.swift; sourceTree = ""; }; - 0770DE2928D0929E006D8A5D /* HTTPTask.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTTPTask.swift; sourceTree = ""; }; - 0770DE2B28D092B3006D8A5D /* NetworkLogger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkLogger.swift; sourceTree = ""; }; - 0770DE2D28D09743006D8A5D /* API.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = API.swift; sourceTree = ""; }; - 0770DE2F28D09793006D8A5D /* EndPointType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EndPointType.swift; sourceTree = ""; }; 0770DE5128D0ADFF006D8A5D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 0770DE5328D0B00C006D8A5D /* swiftgen.yml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.yaml; path = swiftgen.yml; sourceTree = ""; }; 0770DE5C28D0B209006D8A5D /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; 0770DE5E28D0B22C006D8A5D /* Strings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Strings.swift; sourceTree = ""; }; 0770DE6028D0B2CB006D8A5D /* Assets.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Assets.swift; sourceTree = ""; }; - 07DDFCBC29A780BB00572595 /* UINavigationController+Animation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UINavigationController+Animation.swift"; sourceTree = ""; }; 07E0939E2B308D2800F1E4B2 /* Data_Certificate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Data_Certificate.swift; sourceTree = ""; }; 0CA4A65A3AECED83CC425A00 /* Pods-CoreTests.debugstage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CoreTests.debugstage.xcconfig"; path = "Target Support Files/Pods-CoreTests/Pods-CoreTests.debugstage.xcconfig"; sourceTree = ""; }; 0E13E9173C9C4CFC19F8B6F2 /* Pods-App-Core.debugstage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-Core.debugstage.xcconfig"; path = "Target Support Files/Pods-App-Core/Pods-App-Core.debugstage.xcconfig"; sourceTree = ""; }; 141F1D2F2B7328D4009E81EB /* WebviewCookiesUpdateProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebviewCookiesUpdateProtocol.swift; sourceTree = ""; }; 14769D3B2B9822EE00AB36D4 /* CoreAnalytics.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreAnalytics.swift; sourceTree = ""; }; - 14D912D82C2553C70077CCCE /* FullStoryConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullStoryConfig.swift; sourceTree = ""; }; - 14D912DA2C257E9E0077CCCE /* FullStoryConfigTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullStoryConfigTests.swift; sourceTree = ""; }; 1A154A95AF4EE85A4A1C083B /* Pods-App-Core.releasedev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-Core.releasedev.xcconfig"; path = "Target Support Files/Pods-App-Core/Pods-App-Core.releasedev.xcconfig"; sourceTree = ""; }; 2B7E6FE7843FC4CF2BFA712D /* Pods-App-Core.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-Core.debug.xcconfig"; path = "Target Support Files/Pods-App-Core/Pods-App-Core.debug.xcconfig"; sourceTree = ""; }; 33FA09A20AAE2B2A0BA89190 /* Pods_App_Core_CoreTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_App_Core_CoreTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -380,29 +338,19 @@ 9784D47D2BF7762800AFEFFF /* FullScreenErrorView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FullScreenErrorView.swift; sourceTree = ""; }; 9D5B06CAA99EA5CD49CBE2BB /* Pods-App-Core.debugdev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-Core.debugdev.xcconfig"; path = "Target Support Files/Pods-App-Core/Pods-App-Core.debugdev.xcconfig"; sourceTree = ""; }; 9E0B33614CBD791307FFDEAE /* Pods-App-Core-CoreTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-Core-CoreTests.release.xcconfig"; path = "Target Support Files/Pods-App-Core-CoreTests/Pods-App-Core-CoreTests.release.xcconfig"; sourceTree = ""; }; - A51CDBE62B6D21F2009B6D4E /* SegmentConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SegmentConfig.swift; sourceTree = ""; }; A53A32342B233DEC005FE38A /* ThemeConfig.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeConfig.swift; sourceTree = ""; }; A595689A2B6173DF00ED4F90 /* BranchConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BranchConfig.swift; sourceTree = ""; }; A5F4E7B42B61544A00ACD166 /* BrazeConfig.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BrazeConfig.swift; sourceTree = ""; }; B2556B4A2D4F84F402A7A7D9 /* Pods-CoreTests.releaseprod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CoreTests.releaseprod.xcconfig"; path = "Target Support Files/Pods-CoreTests/Pods-CoreTests.releaseprod.xcconfig"; sourceTree = ""; }; - BA30427D2B20B299009B64B7 /* SocialAuthError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocialAuthError.swift; sourceTree = ""; }; BA4AFB412B5A7A0900A21367 /* VideoDownloadQualityView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoDownloadQualityView.swift; sourceTree = ""; }; BA4AFB432B6A5AF100A21367 /* CheckBoxView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckBoxView.swift; sourceTree = ""; }; BA593F1B2AF8E498009ADB51 /* ScrollSlidingTabBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScrollSlidingTabBar.swift; sourceTree = ""; }; BA593F1D2AF8E4A0009ADB51 /* FrameReader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FrameReader.swift; sourceTree = ""; }; - BA76135B2B21BC7300B599B7 /* SocialAuthResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocialAuthResponse.swift; sourceTree = ""; }; - BA8B3A2E2AD546A700D25EF5 /* DebugLog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DebugLog.swift; sourceTree = ""; }; - BA8FA6602AD5974300EA029A /* AppleAuthProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleAuthProvider.swift; sourceTree = ""; }; BA8FA6672AD59A5700EA029A /* SocialAuthButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocialAuthButton.swift; sourceTree = ""; }; - BA8FA6692AD59B5500EA029A /* GoogleAuthProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GoogleAuthProvider.swift; sourceTree = ""; }; - BA8FA66D2AD59E7D00EA029A /* FacebookAuthProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FacebookAuthProvider.swift; sourceTree = ""; }; - BA8FA66F2AD59EA300EA029A /* MicrosoftAuthProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MicrosoftAuthProvider.swift; sourceTree = ""; }; - BA981BCD2B8F5C49005707C2 /* Sequence+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Sequence+Extensions.swift"; sourceTree = ""; }; BA981BCF2B91ED50005707C2 /* FullScreenProgressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullScreenProgressView.swift; sourceTree = ""; }; BAD9CA2E2B289B3500DE790A /* ajaxHandler.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = ajaxHandler.js; sourceTree = ""; }; BAD9CA322B28A8F300DE790A /* AjaxProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AjaxProvider.swift; sourceTree = ""; }; BAD9CA412B2B140100DE790A /* AgreementConfigTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AgreementConfigTests.swift; sourceTree = ""; }; - BADB3F5A2AD6EC56004D5CFA /* ResultExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResultExtension.swift; sourceTree = ""; }; BAFB99812B0E2354007D09F9 /* FacebookConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FacebookConfig.swift; sourceTree = ""; }; BAFB99832B0E282E007D09F9 /* MicrosoftConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MicrosoftConfig.swift; sourceTree = ""; }; BAFB998F2B14B377007D09F9 /* GoogleConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GoogleConfig.swift; sourceTree = ""; }; @@ -419,7 +367,6 @@ E055A5382B18DC95008D9E5E /* Theme.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Theme.framework; sourceTree = BUILT_PRODUCTS_DIR; }; E09179FC2B0F204D002AB695 /* ConfigTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConfigTests.swift; sourceTree = ""; }; E0D586192B2FF74C009B4BA7 /* DiscoveryConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscoveryConfig.swift; sourceTree = ""; }; - E0D5861B2B2FF85B009B4BA7 /* RawStringExtactable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RawStringExtactable.swift; sourceTree = ""; }; E0D586352B314CD3009B4BA7 /* LogistrationBottomView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LogistrationBottomView.swift; sourceTree = ""; }; E8D9725130C85DA55AD474A4 /* Pods-CoreTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CoreTests.debug.xcconfig"; path = "Target Support Files/Pods-CoreTests/Pods-CoreTests.debug.xcconfig"; sourceTree = ""; }; F4E50CE1DB6AA77E9B5D09EF /* Pods-App-Core-CoreTests.debugprod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-Core-CoreTests.debugprod.xcconfig"; path = "Target Support Files/Pods-App-Core-CoreTests/Pods-App-Core-CoreTests.debugprod.xcconfig"; sourceTree = ""; }; @@ -433,6 +380,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + CE7CAF392CC1561E00E0AC9D /* OEXFoundation in Frameworks */, 0716946D296D996900E3DED6 /* Core.framework in Frameworks */, 5E58740A2AA9DF20F4644191 /* Pods_App_Core_CoreTests.framework in Frameworks */, ); @@ -442,11 +390,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - BAF0D4CB2AD6AE14007AC334 /* FacebookLogin in Frameworks */, - 025EF2F62971740000B838AB /* YouTubePlayerKit in Frameworks */, + CE57127C2CD109DB00D4AB17 /* OEXFoundation in Frameworks */, C8C446EF233F81B9FABB77D2 /* Pods_App_Core.framework in Frameworks */, - 142EDD6C2B831D1400F9F320 /* BranchSDK in Frameworks */, - BA8FA66C2AD59BBC00EA029A /* GoogleSignIn in Frameworks */, 02AA27942C2C1B88006F5B6A /* ZipArchive in Frameworks */, E055A5392B18DC95008D9E5E /* Theme.framework in Frameworks */, ); @@ -527,30 +472,9 @@ 0283347E28D4DCC100C828FC /* Extensions */ = { isa = PBXGroup; children = ( - 06078B6E2BA49C3100576798 /* Dictionary+JSON.swift */, - 06078B6F2BA49C3100576798 /* String+JSON.swift */, - 02F164362902A9EB0090DDEF /* StringExtension.swift */, - 024BE3DE29B2615500BCDEE2 /* CGColorExtension.swift */, 0283347F28D4DCD200C828FC /* ViewExtension.swift */, 02F6EF4928D9F0A700835477 /* DateExtension.swift */, - 02F98A7E28F81EE900DE94C0 /* Container+App.swift */, - 02228B302C2232D2009A5F28 /* IntExtension.swift */, - 027BD3BB2909478B00392132 /* UIResponder+CurrentResponder.swift */, - 027BD3BA2909478B00392132 /* UIView+EnclosingScrollView.swift */, - 02E225AF291D29EB0067769A /* UrlExtension.swift */, - 02B3E3B22930198600A50475 /* AVPlayerViewControllerExtension.swift */, - 07460FE0294B706200F70538 /* CollectionExtension.swift */, 07460FE2294B72D700F70538 /* Notification.swift */, - 02B2B593295C5C7A00914876 /* Thread.swift */, - 0727878228D31287002E9142 /* DispatchQueue+App.swift */, - 07DDFCBC29A780BB00572595 /* UINavigationController+Animation.swift */, - 02284C172A3B1AE00007117F /* UIApplicationExtension.swift */, - BA8B3A2E2AD546A700D25EF5 /* DebugLog.swift */, - BADB3F5A2AD6EC56004D5CFA /* ResultExtension.swift */, - 02D400602B0678190029D168 /* SKStoreReviewControllerExtension.swift */, - E0D5861B2B2FF85B009B4BA7 /* RawStringExtactable.swift */, - BA981BCD2B8F5C49005707C2 /* Sequence+Extensions.swift */, - 029EE3EC2BF6650500F64F33 /* Bundle.swift */, ); path = Extensions; sourceTree = ""; @@ -741,16 +665,9 @@ 0770DE2828D0928B006D8A5D /* Network */ = { isa = PBXGroup; children = ( - 0770DE2928D0929E006D8A5D /* HTTPTask.swift */, - 0770DE2B28D092B3006D8A5D /* NetworkLogger.swift */, - 0770DE2D28D09743006D8A5D /* API.swift */, - 0770DE2F28D09793006D8A5D /* EndPointType.swift */, 0727877828D23BE0002E9142 /* RequestInterceptor.swift */, - 0727877A28D24A1D002E9142 /* HeadersRedirectHandler.swift */, - 0727877E28D25B24002E9142 /* Alamofire+Error.swift */, 0236961E28F9A2F600EEF206 /* AuthEndpoint.swift */, 029A132B2C2471F8005FB830 /* OfflineSyncEndpoint.swift */, - 0255D55729362839004DBC1A /* UploadBodyEncoding.swift */, 02A4833929B8A9AB00D33F33 /* DownloadManager.swift */, 029A13272C246AE6005FB830 /* OfflineSyncManager.swift */, ); @@ -838,27 +755,6 @@ path = FullScreenErrorView; sourceTree = ""; }; - BA30427C2B20B235009B64B7 /* SocialAuth */ = { - isa = PBXGroup; - children = ( - BA30427E2B20B299009B64B7 /* Error */, - BA8FA6602AD5974300EA029A /* AppleAuthProvider.swift */, - BA8FA6692AD59B5500EA029A /* GoogleAuthProvider.swift */, - BA8FA66D2AD59E7D00EA029A /* FacebookAuthProvider.swift */, - BA8FA66F2AD59EA300EA029A /* MicrosoftAuthProvider.swift */, - BA76135B2B21BC7300B599B7 /* SocialAuthResponse.swift */, - ); - path = SocialAuth; - sourceTree = ""; - }; - BA30427E2B20B299009B64B7 /* Error */ = { - isa = PBXGroup; - children = ( - BA30427D2B20B299009B64B7 /* SocialAuthError.swift */, - ); - path = Error; - sourceTree = ""; - }; BA593F1A2AF8E487009ADB51 /* ScrollSlidingTabBar */ = { isa = PBXGroup; children = ( @@ -871,7 +767,6 @@ BA8FA65F2AD5973500EA029A /* Providers */ = { isa = PBXGroup; children = ( - BA30427C2B20B235009B64B7 /* SocialAuth */, BAD9CA3D2B29BB1A00DE790A /* Ajax */, ); path = Providers; @@ -942,7 +837,6 @@ DBF6F2402B014ADA0098414B /* FirebaseConfig.swift */, A5F4E7B42B61544A00ACD166 /* BrazeConfig.swift */, A595689A2B6173DF00ED4F90 /* BranchConfig.swift */, - A51CDBE62B6D21F2009B6D4E /* SegmentConfig.swift */, DBF6F2492B0380E00098414B /* FeaturesConfig.swift */, DBF6F2452B01DAFE0098414B /* AgreementConfig.swift */, BAFB99812B0E2354007D09F9 /* FacebookConfig.swift */, @@ -952,7 +846,6 @@ 02CA59832BD7DDBE00D517AA /* DashboardConfig.swift */, A53A32342B233DEC005FE38A /* ThemeConfig.swift */, E0D586192B2FF74C009B4BA7 /* DiscoveryConfig.swift */, - 14D912D82C2553C70077CCCE /* FullStoryConfig.swift */, ); path = Config; sourceTree = ""; @@ -972,7 +865,6 @@ children = ( E09179FC2B0F204D002AB695 /* ConfigTests.swift */, BAD9CA412B2B140100DE790A /* AgreementConfigTests.swift */, - 14D912DA2C257E9E0077CCCE /* FullStoryConfigTests.swift */, ); path = Configuration; sourceTree = ""; @@ -1009,6 +901,7 @@ 07169466296D996800E3DED6 /* Frameworks */, 07169467296D996800E3DED6 /* Resources */, C9AA9371F83D4B112F310DB8 /* [CP] Copy Pods Resources */, + CE7CAF3B2CC1561E00E0AC9D /* Embed Frameworks */, ); buildRules = ( ); @@ -1031,6 +924,7 @@ 0770DE0528D07831006D8A5D /* Frameworks */, 0770DE0628D07831006D8A5D /* Resources */, 49BAD0663C27D73B9115401F /* [CP] Copy Pods Resources */, + CE57127E2CD109DB00D4AB17 /* Embed Frameworks */, ); buildRules = ( ); @@ -1038,11 +932,8 @@ ); name = Core; packageProductDependencies = ( - 025EF2F52971740000B838AB /* YouTubePlayerKit */, - BA8FA66B2AD59BBC00EA029A /* GoogleSignIn */, - BAF0D4CA2AD6AE14007AC334 /* FacebookLogin */, - 142EDD6B2B831D1400F9F320 /* BranchSDK */, 02AA27932C2C1B88006F5B6A /* ZipArchive */, + CE57127B2CD109DB00D4AB17 /* OEXFoundation */, ); productName = Core; productReference = 0770DE0828D07831006D8A5D /* Core.framework */; @@ -1079,11 +970,8 @@ ); mainGroup = 0770DDFE28D07831006D8A5D; packageReferences = ( - 025EF2F42971740000B838AB /* XCRemoteSwiftPackageReference "YouTubePlayerKit" */, - BA8FA65E2AD574D700EA029A /* XCRemoteSwiftPackageReference "GoogleSignIn-iOS" */, - BA8FA6712AD6ABA300EA029A /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */, - 142EDD6A2B831D1400F9F320 /* XCRemoteSwiftPackageReference "ios-branch-sdk-spm" */, 02AA27922C2C1B61006F5B6A /* XCRemoteSwiftPackageReference "ZipArchive" */, + CE924BE42CD8F8E4000137CA /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */, ); productRefGroup = 0770DE0928D07831006D8A5D /* Products */; projectDirPath = ""; @@ -1223,7 +1111,6 @@ files = ( BAD9CA422B2B140100DE790A /* AgreementConfigTests.swift in Sources */, CE953A3B2CD0DA940023D667 /* CoreMock.generated.swift in Sources */, - 14D912DB2C257E9E0077CCCE /* FullStoryConfigTests.swift in Sources */, E09179FD2B0F204E002AB695 /* ConfigTests.swift in Sources */, CE54C2D22CC80D8500E529F9 /* DownloadManagerTests.swift in Sources */, ); @@ -1243,22 +1130,17 @@ 06619EAA2B8F2936001FAADE /* ReadabilityModifier.swift in Sources */, BAFB99902B14B377007D09F9 /* GoogleConfig.swift in Sources */, 029A132C2C2471F8005FB830 /* OfflineSyncEndpoint.swift in Sources */, - 02E225B0291D29EB0067769A /* UrlExtension.swift in Sources */, 02CF46C829546AA200A698EE /* NoCachedDataError.swift in Sources */, 0727877728D23847002E9142 /* DataLayer.swift in Sources */, 0241666B28F5A78B00082765 /* HTMLFormattedText.swift in Sources */, 02D800CC29348F460099CF16 /* ImagePicker.swift in Sources */, 027BD3B92909476200392132 /* KeyboardAvoidingModifier.swift in Sources */, BA4AFB422B5A7A0900A21367 /* VideoDownloadQualityView.swift in Sources */, - 0770DE2C28D092B3006D8A5D /* NetworkLogger.swift in Sources */, 02A8C5812C05DBB4004B91FF /* Data_EnrollmentsStatus.swift in Sources */, 06BEEA0E2B6A55C500D25A97 /* ColorInversionInjection.swift in Sources */, 064987972B4D69FF0071642A /* WebView.swift in Sources */, - 0770DE2A28D0929E006D8A5D /* HTTPTask.swift in Sources */, 06619EAD2B90918B001FAADE /* ReadabilityInjection.swift in Sources */, 029A13262C2457D9005FB830 /* OfflineProgress.swift in Sources */, - 02284C182A3B1AE00007117F /* UIApplicationExtension.swift in Sources */, - 0255D5582936283A004DBC1A /* UploadBodyEncoding.swift in Sources */, 06619EAF2B973B25001FAADE /* AccessibilityInjection.swift in Sources */, BAFB99822B0E2354007D09F9 /* FacebookConfig.swift in Sources */, 02935B732BCECAD000B22F66 /* Data_PrimaryEnrollment.swift in Sources */, @@ -1267,9 +1149,7 @@ 0727877D28D25212002E9142 /* ProgressBar.swift in Sources */, BA981BD02B91ED50005707C2 /* FullScreenProgressView.swift in Sources */, 0236961F28F9A2F600EEF206 /* AuthEndpoint.swift in Sources */, - 02B3E3B32930198600A50475 /* AVPlayerViewControllerExtension.swift in Sources */, BAD9CA332B28A8F300DE790A /* AjaxProvider.swift in Sources */, - A51CDBE72B6D21F2009B6D4E /* SegmentConfig.swift in Sources */, 0282DA7328F98CC9003C3F07 /* WebUnitView.swift in Sources */, E0D586362B314CD3009B4BA7 /* LogistrationBottomView.swift in Sources */, 0727878128D25EFD002E9142 /* SnackBarView.swift in Sources */, @@ -1280,32 +1160,25 @@ 0727877028D23411002E9142 /* Config.swift in Sources */, CFC84952299F8B890055E497 /* Debounce.swift in Sources */, 0236F3B728F4351E0050F09B /* CourseButton.swift in Sources */, - 0727878328D31287002E9142 /* DispatchQueue+App.swift in Sources */, 028F9F37293A44C700DE65D0 /* Data_ResetPassword.swift in Sources */, 022C64E429AE0191000F532B /* TextWithUrls.swift in Sources */, 0283348028D4DCD200C828FC /* ViewExtension.swift in Sources */, - BA8FA66A2AD59B5500EA029A /* GoogleAuthProvider.swift in Sources */, 02A4833529B8A73400D33F33 /* CorePersistenceProtocol.swift in Sources */, - 06078B712BA49C3100576798 /* String+JSON.swift in Sources */, 0233D5732AF13EEE00BAC8BD /* AppReviewButton.swift in Sources */, 02512FF0299533DF0024D438 /* CoreDataHandlerProtocol.swift in Sources */, 0260E58028FD792800BBBE18 /* WebUnitViewModel.swift in Sources */, 02A4833A29B8A9AB00D33F33 /* DownloadManager.swift in Sources */, - 06078B702BA49C3100576798 /* Dictionary+JSON.swift in Sources */, 9784D47E2BF7762800AFEFFF /* FullScreenErrorView.swift in Sources */, 027BD3AE2909475000392132 /* KeyboardScrollerOptions.swift in Sources */, - 14D912D92C2553C70077CCCE /* FullStoryConfig.swift in Sources */, BAFB99922B14E23D007D09F9 /* AppleSignInConfig.swift in Sources */, 141F1D302B7328D4009E81EB /* WebviewCookiesUpdateProtocol.swift in Sources */, 064987992B4D69FF0071642A /* WebViewScriptInjectionProtocol.swift in Sources */, - 027BD3BE2909478B00392132 /* UIResponder+CurrentResponder.swift in Sources */, 070019AE28F701B200D5FC78 /* Certificate.swift in Sources */, BA4AFB442B6A5AF100A21367 /* CheckBoxView.swift in Sources */, 076F297F2A1F80C800967E7D /* Pagination.swift in Sources */, 14769D3C2B9822EE00AB36D4 /* CoreAnalytics.swift in Sources */, 02AFCC1A2AEFDC18000360F0 /* ThirdPartyMailer.swift in Sources */, 0770DE5F28D0B22C006D8A5D /* Strings.swift in Sources */, - BA981BCE2B8F5C49005707C2 /* Sequence+Extensions.swift in Sources */, 02C917F029CDA99E00DBB8BD /* Data_Enrollments.swift in Sources */, 024FCD0028EF1CD300232339 /* WebBrowser.swift in Sources */, 027BD3B52909475900392132 /* KeyboardStateObserver.swift in Sources */, @@ -1313,7 +1186,6 @@ 0283347D28D4D3DE00C828FC /* Data_Discovery.swift in Sources */, 064987962B4D69FF0071642A /* WebviewMessage.swift in Sources */, 02EBC75B2C19DE3D00BE182C /* CourseForSync.swift in Sources */, - 07DDFCBD29A780BB00572595 /* UINavigationController+Animation.swift in Sources */, 023A4DD4299E66BD006C0E48 /* OfflineSnackBarView.swift in Sources */, 021D925728DCF12900ACC565 /* AlertView.swift in Sources */, 027BD3A82909474200392132 /* KeyboardAvoidingViewController.swift in Sources */, @@ -1322,28 +1194,21 @@ 02E93F852AEBAEBC006C4750 /* AppReviewViewModel.swift in Sources */, A595689B2B6173DF00ED4F90 /* BranchConfig.swift in Sources */, 0770DE2528D08FBA006D8A5D /* CoreStorage.swift in Sources */, - BA8FA6612AD5974300EA029A /* AppleAuthProvider.swift in Sources */, - BA8FA6702AD59EA300EA029A /* MicrosoftAuthProvider.swift in Sources */, - BA76135C2B21BC7300B599B7 /* SocialAuthResponse.swift in Sources */, 020306CC2932C0C4000949EA /* PickerView.swift in Sources */, 027BD3C52909707700392132 /* Shake.swift in Sources */, 027BD39C2908810C00392132 /* RegisterUser.swift in Sources */, 071009C428D1C9D000344290 /* StyledButton.swift in Sources */, - 07460FE1294B706200F70538 /* CollectionExtension.swift in Sources */, 064987932B4D69FF0071642A /* DragAndDropCssInjection.swift in Sources */, 027BD3B42909475900392132 /* KeyboardState.swift in Sources */, 027BD3922907D88F00392132 /* Data_RegistrationFields.swift in Sources */, 07460FE3294B72D700F70538 /* Notification.swift in Sources */, - 0727877F28D25B24002E9142 /* Alamofire+Error.swift in Sources */, 02A4833829B8A8F900D33F33 /* CoreDataModel.xcdatamodeld in Sources */, 064987952B4D69FF0071642A /* SurveyCssInjection.swift in Sources */, 02E224DB2BB76B3E00EF1ADB /* DynamicOffsetView.swift in Sources */, 0259104A29C4A5B6004B5A55 /* UserSettings.swift in Sources */, 021D925028DC89D100ACC565 /* UserProfile.swift in Sources */, 071009D028D1E3A600344290 /* Constants.swift in Sources */, - 02228B312C2232D2009A5F28 /* IntExtension.swift in Sources */, 0770DE1928D0847D006D8A5D /* BaseRouter.swift in Sources */, - BA30427F2B20B320009B64B7 /* SocialAuthError.swift in Sources */, 02286D162C106393005EEC8D /* CourseDates.swift in Sources */, 0284DBFE28D48C5300830893 /* CourseItem.swift in Sources */, 0248C92329C075EF00DC8402 /* CourseBlockModel.swift in Sources */, @@ -1357,38 +1222,25 @@ 02AFCC182AEFDB24000360F0 /* ThirdPartyMailClient.swift in Sources */, 0233D5712AF13EC800BAC8BD /* SelectMailClientView.swift in Sources */, BAFB99842B0E282E007D09F9 /* MicrosoftConfig.swift in Sources */, - 02B2B594295C5C7A00914876 /* Thread.swift in Sources */, - E0D5861C2B2FF85B009B4BA7 /* RawStringExtactable.swift in Sources */, 02EBC7592C19DE1100BE182C /* CalendarManagerProtocol.swift in Sources */, - 027BD3BD2909478B00392132 /* UIView+EnclosingScrollView.swift in Sources */, BA8FA6682AD59A5700EA029A /* SocialAuthButton.swift in Sources */, - 02D400612B0678190029D168 /* SKStoreReviewControllerExtension.swift in Sources */, 02A4833C29B8C57800D33F33 /* DownloadView.swift in Sources */, 027BD3AD2909475000392132 /* KeyboardScroller.swift in Sources */, 070019A528F6F17900D5FC78 /* Data_Media.swift in Sources */, 024D723529C8BB1A006D36ED /* NavigationBar.swift in Sources */, - BA8B3A2F2AD546A700D25EF5 /* DebugLog.swift in Sources */, 0727877928D23BE0002E9142 /* RequestInterceptor.swift in Sources */, - BA8FA66E2AD59E7D00EA029A /* FacebookAuthProvider.swift in Sources */, - 0770DE2E28D09743006D8A5D /* API.swift in Sources */, 028CE96929858ECC00B6B1C3 /* FlexibleKeyboardInputView.swift in Sources */, 027BD3A92909474200392132 /* KeyboardAvoidingViewControllerRepr.swift in Sources */, - 02F98A7F28F81EE900DE94C0 /* Container+App.swift in Sources */, 0649879A2B4D69FF0071642A /* WebViewHTML.swift in Sources */, 02CA59842BD7DDBE00D517AA /* DashboardConfig.swift in Sources */, - 0727877B28D24A1D002E9142 /* HeadersRedirectHandler.swift in Sources */, 0236961B28F9A28B00EEF206 /* AuthInteractor.swift in Sources */, - 0770DE3028D09793006D8A5D /* EndPointType.swift in Sources */, 02935B752BCEE6D600B22F66 /* PrimaryEnrollment.swift in Sources */, 020C31C9290AC3F700D6DEA2 /* PickerFields.swift in Sources */, 02F6EF3B28D9B8EC00835477 /* CourseCellView.swift in Sources */, 023A1138291432FD00D0D354 /* FieldConfiguration.swift in Sources */, DBF6F24A2B0380E00098414B /* FeaturesConfig.swift in Sources */, - 02F164372902A9EB0090DDEF /* StringExtension.swift in Sources */, 0231CDBE2922422D00032416 /* CSSInjector.swift in Sources */, 064987982B4D69FF0071642A /* CSSInjectionProtocol.swift in Sources */, - 029EE3ED2BF6650500F64F33 /* Bundle.swift in Sources */, - BADB3F5B2AD6EC56004D5CFA /* ResultExtension.swift in Sources */, 029A132A2C2471DF005FB830 /* OfflineSyncRepository.swift in Sources */, 0236961928F9A26900EEF206 /* AuthRepository.swift in Sources */, 023A1136291432B200D0D354 /* RegistrationTextField.swift in Sources */, @@ -1399,7 +1251,6 @@ 029A13302C2479E7005FB830 /* OfflineSyncInteractor.swift in Sources */, 0604C9AA2B22FACF00AD5DBF /* UIComponentsConfig.swift in Sources */, 027BD3B82909476200392132 /* DismissKeyboardTapViewModifier.swift in Sources */, - 024BE3DF29B2615500BCDEE2 /* CGColorExtension.swift in Sources */, 0770DE6128D0B2CB006D8A5D /* Assets.swift in Sources */, 07E0939F2B308D2800F1E4B2 /* Data_Certificate.swift in Sources */, 020D72F42BB76DFE00773319 /* VisualEffectView.swift in Sources */, @@ -2429,14 +2280,6 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ - 025EF2F42971740000B838AB /* XCRemoteSwiftPackageReference "YouTubePlayerKit" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/SvenTiigi/YouTubePlayerKit"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 1.9.0; - }; - }; 02AA27922C2C1B61006F5B6A /* XCRemoteSwiftPackageReference "ZipArchive" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/ZipArchive/ZipArchive.git"; @@ -2445,20 +2288,12 @@ minimumVersion = 2.5.5; }; }; - 142EDD6A2B831D1400F9F320 /* XCRemoteSwiftPackageReference "ios-branch-sdk-spm" */ = { + CE924BE42CD8F8E4000137CA /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */ = { isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/BranchMetrics/ios-branch-sdk-spm"; + repositoryURL = "https://github.com/openedx/openedx-app-foundation-ios/"; requirement = { - kind = upToNextMajorVersion; - minimumVersion = 3.6.3; - }; - }; - BA8FA65E2AD574D700EA029A /* XCRemoteSwiftPackageReference "GoogleSignIn-iOS" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/google/GoogleSignIn-iOS"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 8.0.0; + kind = exactVersion; + version = 1.0.0; }; }; BA8FA6712AD6ABA300EA029A /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */ = { @@ -2472,30 +2307,18 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 025EF2F52971740000B838AB /* YouTubePlayerKit */ = { - isa = XCSwiftPackageProductDependency; - package = 025EF2F42971740000B838AB /* XCRemoteSwiftPackageReference "YouTubePlayerKit" */; - productName = YouTubePlayerKit; - }; 02AA27932C2C1B88006F5B6A /* ZipArchive */ = { isa = XCSwiftPackageProductDependency; package = 02AA27922C2C1B61006F5B6A /* XCRemoteSwiftPackageReference "ZipArchive" */; productName = ZipArchive; }; - 142EDD6B2B831D1400F9F320 /* BranchSDK */ = { - isa = XCSwiftPackageProductDependency; - package = 142EDD6A2B831D1400F9F320 /* XCRemoteSwiftPackageReference "ios-branch-sdk-spm" */; - productName = BranchSDK; - }; - BA8FA66B2AD59BBC00EA029A /* GoogleSignIn */ = { + CE57127B2CD109DB00D4AB17 /* OEXFoundation */ = { isa = XCSwiftPackageProductDependency; - package = BA8FA65E2AD574D700EA029A /* XCRemoteSwiftPackageReference "GoogleSignIn-iOS" */; - productName = GoogleSignIn; + productName = OEXFoundation; }; - BAF0D4CA2AD6AE14007AC334 /* FacebookLogin */ = { + CE7CAF382CC1561E00E0AC9D /* OEXFoundation */ = { isa = XCSwiftPackageProductDependency; - package = BA8FA6712AD6ABA300EA029A /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */; - productName = FacebookLogin; + productName = OEXFoundation; }; /* End XCSwiftPackageProductDependency section */ diff --git a/Core/Core/AvoidingHelpers/Scroller/KeyboardScroller.swift b/Core/Core/AvoidingHelpers/Scroller/KeyboardScroller.swift index ff5c17c11..2d5fe602e 100644 --- a/Core/Core/AvoidingHelpers/Scroller/KeyboardScroller.swift +++ b/Core/Core/AvoidingHelpers/Scroller/KeyboardScroller.swift @@ -1,6 +1,7 @@ // import UIKit +import OEXFoundation final class KeyboardScroller { static func scroll( @@ -57,7 +58,7 @@ final class KeyboardScroller { self.options = options self.partialAvoidingPadding = partialAvoidingPadding - globalWindow = UIApplication.shared.keyWindow ?? UIWindow() + globalWindow = UIApplication.shared.oexKeyWindow ?? UIWindow() calculateGlobalFrames() } diff --git a/Core/Core/Configuration/Config/AgreementConfig.swift b/Core/Core/Configuration/Config/AgreementConfig.swift index d6cfae197..df29f8d3f 100644 --- a/Core/Core/Configuration/Config/AgreementConfig.swift +++ b/Core/Core/Configuration/Config/AgreementConfig.swift @@ -6,6 +6,7 @@ // import Foundation +import OEXFoundation private enum AgreementKeys: String, RawStringExtractable { case privacyPolicyURL = "PRIVACY_POLICY_URL" diff --git a/Core/Core/Configuration/Config/BranchConfig.swift b/Core/Core/Configuration/Config/BranchConfig.swift index 6f2a785b6..ffc44793a 100644 --- a/Core/Core/Configuration/Config/BranchConfig.swift +++ b/Core/Core/Configuration/Config/BranchConfig.swift @@ -6,6 +6,7 @@ // import Foundation +import OEXFoundation private enum BranchKeys: String, RawStringExtractable { case enabled = "ENABLED" diff --git a/Core/Core/Configuration/Config/BrazeConfig.swift b/Core/Core/Configuration/Config/BrazeConfig.swift index 0cbc10db8..9a882a1c5 100644 --- a/Core/Core/Configuration/Config/BrazeConfig.swift +++ b/Core/Core/Configuration/Config/BrazeConfig.swift @@ -6,6 +6,7 @@ // import Foundation +import OEXFoundation private enum BrazeKeys: String, RawStringExtractable { case enabled = "ENABLED" diff --git a/Core/Core/Configuration/Config/Config.swift b/Core/Core/Configuration/Config/Config.swift index adad33a0d..dbd29f0de 100644 --- a/Core/Core/Configuration/Config/Config.swift +++ b/Core/Core/Configuration/Config/Config.swift @@ -32,10 +32,8 @@ public protocol ConfigProtocol { var dashboard: DashboardConfig { get } var braze: BrazeConfig { get } var branch: BranchConfig { get } - var segment: SegmentConfig { get } var program: DiscoveryConfig { get } var URIScheme: String { get } - var fullStory: FullStoryConfig { get } } public enum TokenType: String { diff --git a/Core/Core/Configuration/Config/DashboardConfig.swift b/Core/Core/Configuration/Config/DashboardConfig.swift index cd2b335b1..c87045ced 100644 --- a/Core/Core/Configuration/Config/DashboardConfig.swift +++ b/Core/Core/Configuration/Config/DashboardConfig.swift @@ -6,6 +6,7 @@ // import Foundation +import OEXFoundation public enum DashboardConfigType: String { case gallery diff --git a/Core/Core/Configuration/Config/DiscoveryConfig.swift b/Core/Core/Configuration/Config/DiscoveryConfig.swift index d6d29de2b..a646658bb 100644 --- a/Core/Core/Configuration/Config/DiscoveryConfig.swift +++ b/Core/Core/Configuration/Config/DiscoveryConfig.swift @@ -6,6 +6,7 @@ // import Foundation +import OEXFoundation public enum DiscoveryConfigType: String { case native diff --git a/Core/Core/Configuration/Config/FullStoryConfig.swift b/Core/Core/Configuration/Config/FullStoryConfig.swift deleted file mode 100644 index 4e1181dc3..000000000 --- a/Core/Core/Configuration/Config/FullStoryConfig.swift +++ /dev/null @@ -1,30 +0,0 @@ -// -// FullStoryConfig.swift -// Core -// -// Created by Saeed Bashir on 6/21/24. -// - -import Foundation - -private enum Keys: String, RawStringExtractable { - case enabled = "ENABLED" - case orgID = "ORG_ID" -} - -public final class FullStoryConfig { - public var enabled: Bool = false - public var orgID: String = "" - - init(dictionary: [String: AnyObject]) { - orgID = dictionary[Keys.orgID] as? String ?? "" - enabled = !orgID.isEmpty && dictionary[Keys.enabled] as? Bool ?? false - } -} - -private let configKey = "FULLSTORY" -extension Config { - public var fullStory: FullStoryConfig { - FullStoryConfig(dictionary: self[configKey] as? [String: AnyObject] ?? [:]) - } -} diff --git a/Core/Core/Configuration/Config/MicrosoftConfig.swift b/Core/Core/Configuration/Config/MicrosoftConfig.swift index 4175a53e2..eb3d4d825 100644 --- a/Core/Core/Configuration/Config/MicrosoftConfig.swift +++ b/Core/Core/Configuration/Config/MicrosoftConfig.swift @@ -14,7 +14,7 @@ private enum MicrosoftKeys: String { public final class MicrosoftConfig: NSObject { public var enabled: Bool = false - private(set) var appID: String? + public private(set) var appID: String? private var requiredKeysAvailable: Bool { return appID != nil diff --git a/Core/Core/Configuration/Config/SegmentConfig.swift b/Core/Core/Configuration/Config/SegmentConfig.swift deleted file mode 100644 index 937a78015..000000000 --- a/Core/Core/Configuration/Config/SegmentConfig.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// SegmentConfig.swift -// Core -// -// Created by Anton Yarmolenka on 02/02/2024. -// - -import Foundation - -private enum SegmentKeys: String, RawStringExtractable { - case enabled = "ENABLED" - case writeKey = "SEGMENT_IO_WRITE_KEY" -} - -public final class SegmentConfig: NSObject { - public var enabled: Bool = false - public var writeKey: String = "" - - init(dictionary: [String: AnyObject]) { - super.init() - writeKey = dictionary[SegmentKeys.writeKey] as? String ?? "" - enabled = dictionary[SegmentKeys.enabled] as? Bool == true && !writeKey.isEmpty - } -} - -private let segmentKey = "SEGMENT_IO" -extension Config { - public var segment: SegmentConfig { - SegmentConfig(dictionary: self[segmentKey] as? [String: AnyObject] ?? [:]) - } -} diff --git a/Core/Core/Configuration/Config/UIComponentsConfig.swift b/Core/Core/Configuration/Config/UIComponentsConfig.swift index 16c42ad4c..c62b20774 100644 --- a/Core/Core/Configuration/Config/UIComponentsConfig.swift +++ b/Core/Core/Configuration/Config/UIComponentsConfig.swift @@ -6,6 +6,7 @@ // import Foundation +import OEXFoundation private enum Keys: String, RawStringExtractable { case courseDropDownNavigationEnabled = "COURSE_DROPDOWN_NAVIGATION_ENABLED" diff --git a/Core/Core/Data/Repository/AuthRepository.swift b/Core/Core/Data/Repository/AuthRepository.swift index 2c838e679..20e89e603 100644 --- a/Core/Core/Data/Repository/AuthRepository.swift +++ b/Core/Core/Data/Repository/AuthRepository.swift @@ -6,6 +6,7 @@ // import Foundation +import OEXFoundation public protocol AuthRepositoryProtocol { func login(username: String, password: String) async throws -> User diff --git a/Core/Core/Data/Repository/OfflineSyncRepository.swift b/Core/Core/Data/Repository/OfflineSyncRepository.swift index 386daf7ab..67a535719 100644 --- a/Core/Core/Data/Repository/OfflineSyncRepository.swift +++ b/Core/Core/Data/Repository/OfflineSyncRepository.swift @@ -6,6 +6,7 @@ // import Foundation +import OEXFoundation public protocol OfflineSyncRepositoryProtocol { func submitOfflineProgress(courseID: String, blockID: String, data: String) async throws -> Bool diff --git a/Core/Core/Extensions/AVPlayerViewControllerExtension.swift b/Core/Core/Extensions/AVPlayerViewControllerExtension.swift deleted file mode 100644 index 1f9b3e27e..000000000 --- a/Core/Core/Extensions/AVPlayerViewControllerExtension.swift +++ /dev/null @@ -1,17 +0,0 @@ -// -// AVPlayerViewControllerExtension.swift -// Core -// -// Created by  Stepanok Ivan on 24.11.2022. -// - -import AVKit - -public extension AVPlayerViewController { - func enterFullScreen(animated: Bool) { - perform(NSSelectorFromString("enterFullScreenAnimated:completionHandler:"), with: animated, with: nil) - } - func exitFullScreen(animated: Bool) { - perform(NSSelectorFromString("exitFullScreenAnimated:completionHandler:"), with: animated, with: nil) - } -} diff --git a/Core/Core/Extensions/Bundle.swift b/Core/Core/Extensions/Bundle.swift deleted file mode 100644 index b46037f19..000000000 --- a/Core/Core/Extensions/Bundle.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// Bundle.swift -// Core -// -// Created by  Stepanok Ivan on 16.05.2024. -// - -import Foundation - -public extension Bundle { - var applicationName: String? { - object(forInfoDictionaryKey: "CFBundleDisplayName") as? String ?? - object(forInfoDictionaryKey: "CFBundleName") as? String - } -} diff --git a/Core/Core/Extensions/CGColorExtension.swift b/Core/Core/Extensions/CGColorExtension.swift deleted file mode 100644 index f1e871974..000000000 --- a/Core/Core/Extensions/CGColorExtension.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// CGColorExtension.swift -// Core -// -// Created by  Stepanok Ivan on 03.03.2023. -// - -import Foundation -import SwiftUI - -public extension CGColor { - var hexString: String? { - guard let components = self.components, components.count >= 3 else { - return nil - } - let red = components[0] - let green = components[1] - let blue = components[2] - let hexString = String( - format: "#%02lX%02lX%02lX", - lroundf(Float(red * 255)), - lroundf(Float(green * 255)), - lroundf(Float(blue * 255)) - ) - return hexString - } -} - -public extension Color { - func uiColor() -> UIColor { - return UIColor(self) - } -} diff --git a/Core/Core/Extensions/CollectionExtension.swift b/Core/Core/Extensions/CollectionExtension.swift deleted file mode 100644 index ba2ff088a..000000000 --- a/Core/Core/Extensions/CollectionExtension.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// CollectionExtension.swift -// Core -// -// Created by Vladimir Chekyrta on 15.12.2022. -// - -import Foundation - -public extension Collection { - /// Returns the element at the specified index if it is within bounds, otherwise nil. - subscript (safe index: Index) -> Element? { - return indices.contains(index) ? self[index] : nil - } -} diff --git a/Core/Core/Extensions/Container+App.swift b/Core/Core/Extensions/Container+App.swift deleted file mode 100644 index 0362d708c..000000000 --- a/Core/Core/Extensions/Container+App.swift +++ /dev/null @@ -1,23 +0,0 @@ -// -// Container+App.swift -// Core -// -// Created by  Stepanok Ivan on 13.10.2022. -// - -import Foundation -import Swinject -import UIKit - -public extension Container { - static var shared: Container = { - let container = Container() - return container - }() -} - -public extension UIViewController { - var diContainer: Container { - return Container.shared - } -} diff --git a/Core/Core/Extensions/DebugLog.swift b/Core/Core/Extensions/DebugLog.swift deleted file mode 100644 index 1ceb35482..000000000 --- a/Core/Core/Extensions/DebugLog.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// DebugLog.swift -// Core -// -// Created by Eugene Yatsenko on 10.10.2023. -// - -import Foundation - -public func debugLog( - _ item: Any..., - filename: String = #file, - line: Int = #line, - funcname: String = #function -) { -#if DEBUG - print( - """ - 🕗 \(Date()) - 📄 \(filename.components(separatedBy: "/").last ?? "") \(line) \(funcname) - ℹ️ \(item) - """ - ) -#endif -} diff --git a/Core/Core/Extensions/Dictionary+JSON.swift b/Core/Core/Extensions/Dictionary+JSON.swift deleted file mode 100644 index 938cef881..000000000 --- a/Core/Core/Extensions/Dictionary+JSON.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// Dictionary+JSON.swift -// Core -// -// Created by Vadim Kuznetsov on 13.03.24. -// - -import Foundation - -public extension Dictionary where Key == String, Value == String { - func toJson() -> String? { - guard let jsonData = try? JSONSerialization.data(withJSONObject: self, options: []) else { - return nil - } - - return String(data: jsonData, encoding: .utf8) - } -} diff --git a/Core/Core/Extensions/DispatchQueue+App.swift b/Core/Core/Extensions/DispatchQueue+App.swift deleted file mode 100644 index cd9423cfc..000000000 --- a/Core/Core/Extensions/DispatchQueue+App.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// DispatchQueue+App.swift -// Core -// -// Created by Vladimir Chekyrta on 15.09.2022. -// - -import Foundation - -public func doAfter(_ delay: TimeInterval? = nil, _ closure: @escaping () -> Void) { - DispatchQueue.main.asyncAfter(deadline: .now() + (delay ?? 0), execute: closure) -} - -public func dispatchQueueMain(_ closure: @escaping () -> Void) { - DispatchQueue.main.async(execute: closure) -} diff --git a/Core/Core/Extensions/IntExtension.swift b/Core/Core/Extensions/IntExtension.swift deleted file mode 100644 index 46fe6ea0e..000000000 --- a/Core/Core/Extensions/IntExtension.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// IntExtension.swift -// Core -// -// Created by  Stepanok Ivan on 19.06.2024. -// - -import Foundation - -public extension Int { - func formattedFileSize() -> String { - if self == 0 { - return "0MB" - } - let sizeInMB = Double(self) / 1_048_576 - let sizeInGB = Double(self) / 1_073_741_824 - let formattedString: String - if sizeInGB >= 1 { - formattedString = String(format: "%.1fGB", sizeInGB).replacingOccurrences(of: ".0", with: "") - } else { - formattedString = String(format: "%.1fMB", sizeInMB).replacingOccurrences(of: ".0", with: "") - } - return formattedString - } -} diff --git a/Core/Core/Extensions/Notification.swift b/Core/Core/Extensions/Notification.swift index f70c71e3d..55ce77cc4 100644 --- a/Core/Core/Extensions/Notification.swift +++ b/Core/Core/Extensions/Notification.swift @@ -13,7 +13,6 @@ public extension Notification.Name { static let onCourseEnrolled = Notification.Name("onCourseEnrolled") static let onblockCompletionRequested = Notification.Name("onblockCompletionRequested") static let onTokenRefreshFailed = Notification.Name("onTokenRefreshFailed") - static let onActualVersionReceived = Notification.Name("onActualVersionReceived") static let onAppUpgradeAccountSettingsTapped = Notification.Name("onAppUpgradeAccountSettingsTapped") static let onNewVersionAvaliable = Notification.Name("onNewVersionAvaliable") static let webviewReloadNotification = Notification.Name("webviewReloadNotification") @@ -25,10 +24,3 @@ public extension Notification.Name { static let tryDownloadAgain = Notification.Name("tryDownloadAgain") static let refreshEnrollments = Notification.Name("refreshEnrollments") } - -public extension Notification { - enum UserInfoKey: String { - case isForced - } -} - diff --git a/Core/Core/Extensions/RawStringExtactable.swift b/Core/Core/Extensions/RawStringExtactable.swift deleted file mode 100644 index 1dcedb86c..000000000 --- a/Core/Core/Extensions/RawStringExtactable.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// RawStringExtactable.swift -// Core -// -// Created by SaeedBashir on 12/18/23. -// - -import Foundation - -public protocol RawStringExtractable { - var rawValue: String { get } -} - -public protocol DictionaryExtractionExtension { - associatedtype Key - associatedtype Value - subscript(key: Key) -> Value? { get } -} - -extension Dictionary: DictionaryExtractionExtension {} - -public extension DictionaryExtractionExtension where Self.Key == String { - - subscript(key: RawStringExtractable) -> Value? { - return self[key.rawValue] - } -} diff --git a/Core/Core/Extensions/ResultExtension.swift b/Core/Core/Extensions/ResultExtension.swift deleted file mode 100644 index d9a327768..000000000 --- a/Core/Core/Extensions/ResultExtension.swift +++ /dev/null @@ -1,23 +0,0 @@ -// -// ResultExtension.swift -// Core -// -// Created by Eugene Yatsenko on 11.10.2023. -// - -import Foundation - -extension Result { - @discardableResult - public func success(_ handler: (Success) -> Void) -> Self { - guard case let .success(value) = self else { return self } - handler(value) - return self - } - @discardableResult - public func failure(_ handler: (Failure) -> Void) -> Self { - guard case let .failure(error) = self else { return self } - handler(error) - return self - } -} diff --git a/Core/Core/Extensions/SKStoreReviewControllerExtension.swift b/Core/Core/Extensions/SKStoreReviewControllerExtension.swift deleted file mode 100644 index be214f661..000000000 --- a/Core/Core/Extensions/SKStoreReviewControllerExtension.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// SKStoreReviewControllerExtension.swift -// Core -// -// Created by  Stepanok Ivan on 16.11.2023. -// - -import Foundation -import StoreKit - -extension SKStoreReviewController { - public static func requestReviewInCurrentScene() { - if let scene = UIApplication.shared.connectedScenes - .first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene { - DispatchQueue.main.async { - requestReview(in: scene) - } - } - } -} diff --git a/Core/Core/Extensions/Sequence+Extensions.swift b/Core/Core/Extensions/Sequence+Extensions.swift deleted file mode 100644 index 6feea9dd7..000000000 --- a/Core/Core/Extensions/Sequence+Extensions.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// Sequence+Extensions.swift -// Core -// -// Created by Eugene Yatsenko on 28.02.2024. -// - -import Foundation - -public extension Sequence { - func firstAs(_ type: T.Type = T.self) -> T? { - first { $0 is T } as? T - } -} diff --git a/Core/Core/Extensions/String+JSON.swift b/Core/Core/Extensions/String+JSON.swift deleted file mode 100644 index 6d801a886..000000000 --- a/Core/Core/Extensions/String+JSON.swift +++ /dev/null @@ -1,23 +0,0 @@ -// -// String+JSON.swift -// Core -// -// Created by Vadim Kuznetsov on 13.03.24. -// - -import Foundation - -public extension String { - func jsonStringToDictionary() -> [String: Any]? { - guard let jsonData = self.data(using: .utf8) else { - return nil - } - - guard let jsonObject = try? JSONSerialization.jsonObject(with: jsonData, options: []), - let dictionary = jsonObject as? [String: Any] else { - return nil - } - - return dictionary - } -} diff --git a/Core/Core/Extensions/StringExtension.swift b/Core/Core/Extensions/StringExtension.swift deleted file mode 100644 index e7e6805fb..000000000 --- a/Core/Core/Extensions/StringExtension.swift +++ /dev/null @@ -1,85 +0,0 @@ -// -// StringExtension.swift -// Core -// -// Created by  Stepanok Ivan on 29.09.2022. -// - -import Foundation - -public extension String { - - func find(from: String, to: String) -> [String] { - components(separatedBy: from).dropFirst().compactMap { sub in - (sub.range(of: to)?.lowerBound).flatMap { endRange in - String(sub[sub.startIndex ..< endRange]) - } - } - } - - func hideHtmlTagsAndUrls() -> String { - guard let detector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) else { - return self - } - return detector.stringByReplacingMatches( - in: self, - options: [], - range: NSRange(location: 0, length: self.utf16.count), - withTemplate: "" - ) - .replacingOccurrences(of: "<[^>]+>", with: "", options: String.CompareOptions.regularExpression, range: nil) - .replacingOccurrences(of: "

", with: "") - .replacingOccurrences(of: "

", with: "") - } - - func hideHtmlTags() -> String { - return self - .replacingOccurrences(of: "<[^>]+>", with: "", options: String.CompareOptions.regularExpression, range: nil) - } - - func extractURLs() -> [URL] { - var urls: [URL] = [] - do { - let detector = try NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) - detector.enumerateMatches( - in: self, options: [], - range: NSRange(location: 0, length: self.count), - using: { (result, _, _) in - if let match = result, let url = match.url { - urls.append(url) - } - } - ) - } catch let error as NSError { - print(error.localizedDescription) - } - return urls - } - - func decodedHTMLEntities() -> String { - guard let regex = try? NSRegularExpression(pattern: "&#([0-9]+);", options: []) else { - return self - } - - let range = NSRange(location: 0, length: count) - let matches = regex.matches(in: self, options: [], range: range) - - var decodedString = self - for match in matches { - guard match.numberOfRanges > 1, - let range = Range(match.range(at: 1), in: self), - let codePoint = Int(self[range]), - let unicodeScalar = UnicodeScalar(codePoint) else { - continue - } - - let replacement = String(unicodeScalar) - guard let totalRange = Range(match.range, in: self) else { - continue - } - decodedString = decodedString.replacingOccurrences(of: self[totalRange], with: replacement) - } - - return decodedString - } -} diff --git a/Core/Core/Extensions/Thread.swift b/Core/Core/Extensions/Thread.swift deleted file mode 100644 index a78be4eac..000000000 --- a/Core/Core/Extensions/Thread.swift +++ /dev/null @@ -1,22 +0,0 @@ -// -// Thread.swift -// Core -// -// Created by  Stepanok Ivan on 28.12.2022. -// - -import Foundation - -extension Thread { - - var threadName: String { - if let currentOperationQueue = OperationQueue.current?.name { - return "OperationQueue: \(currentOperationQueue)" - } else if let underlyingDispatchQueue = OperationQueue.current?.underlyingQueue?.label { - return "DispatchQueue: \(underlyingDispatchQueue)" - } else { - let name = __dispatch_queue_get_label(nil) - return String(cString: name, encoding: .utf8) ?? Thread.current.description - } - } -} diff --git a/Core/Core/Extensions/UIApplicationExtension.swift b/Core/Core/Extensions/UIApplicationExtension.swift deleted file mode 100644 index 090eae3e3..000000000 --- a/Core/Core/Extensions/UIApplicationExtension.swift +++ /dev/null @@ -1,106 +0,0 @@ -// -// UIApplicationExtension.swift -// Core -// -// Created by  Stepanok Ivan on 15.06.2023. -// - -import UIKit -import Theme - -public extension UIApplication { - - var windows: [UIWindow]? { - let scene = UIApplication.shared.connectedScenes.first as? UIWindowScene - return scene?.windows - } - - var window: UIWindow? { - windows?.first - } - - var keyWindow: UIWindow? { - windows?.first { $0.isKeyWindow } - } - - func endEditing(force: Bool = true) { - windows?.forEach { $0.endEditing(force) } - } - - class func topViewController( - controller: UIViewController? = UIApplication.shared.keyWindow?.rootViewController - ) -> UIViewController? { - if let navigationController = controller as? UINavigationController { - return topViewController(controller: navigationController.visibleViewController) - } - if let tabController = controller as? UITabBarController { - if let selected = tabController.selectedViewController { - return topViewController(controller: selected) - } - } - if let presented = controller?.presentedViewController { - return topViewController(controller: presented) - } - return controller - } - - var windowInsets: UIEdgeInsets { - guard let window = window else { - return .zero - } - - return window.safeAreaInsets - } -} - -extension UINavigationController { - open override func viewWillLayoutSubviews() { - super.viewWillLayoutSubviews() - navigationBar.topItem?.backButtonDisplayMode = .minimal - navigationBar.barTintColor = .clear - navigationBar.setBackgroundImage(UIImage(), for: .default) - navigationBar.shadowImage = UIImage() - - let image = CoreAssets.arrowLeft.image - navigationBar.backIndicatorImage = image.withTintColor(Theme.UIColors.accentXColor) - navigationBar.backIndicatorTransitionMaskImage = image.withTintColor(Theme.UIColors.accentXColor) - navigationBar.titleTextAttributes = [ - .foregroundColor: Theme.UIColors.navigationBarTintColor, - .font: Theme.UIFonts.titleMedium() - ] - - UISegmentedControl.appearance().setTitleTextAttributes( - [ - .foregroundColor: Theme.Colors.textPrimary.uiColor(), - .font: Theme.UIFonts.labelLarge() - ], - for: .normal - ) - UISegmentedControl.appearance().setTitleTextAttributes( - [ - .foregroundColor: Theme.Colors.primaryButtonTextColor.uiColor(), - .font: Theme.UIFonts.labelLarge() - ], - for: .selected - ) - UISegmentedControl.appearance().selectedSegmentTintColor = UIColor(Theme.Colors.accentXColor) - - UIView.appearance(whenContainedInInstancesOf: [UIAlertController.self]).tintColor = Theme.UIColors.accentXColor - } -} - -extension UINavigationController: UIGestureRecognizerDelegate { - override open func viewDidLoad() { - super.viewDidLoad() - interactivePopGestureRecognizer?.delegate = self - navigationItem.backButtonDisplayMode = .minimal - } - - public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { - if #available(iOS 17, *) { - return false - } else { - return viewControllers.count > 1 - } - } -} diff --git a/Core/Core/Extensions/UINavigationController+Animation.swift b/Core/Core/Extensions/UINavigationController+Animation.swift deleted file mode 100644 index 4f720f78c..000000000 --- a/Core/Core/Extensions/UINavigationController+Animation.swift +++ /dev/null @@ -1,41 +0,0 @@ -// -// UINavigationController+Animation.swift -// Core -// -// Created by Vladimir Chekyrta on 23.02.2023. -// - -import Foundation -import UIKit - -public extension UINavigationController { - - func popFade( - transitionType type: CATransitionType = .fade, - duration: CFTimeInterval = 0.3 - ) { - addTransition(transitionType: type, duration: duration) - popViewController(animated: false) - } - - func pushFade( - viewController vc: UIViewController, - transitionType type: CATransitionType = .fade, - duration: CFTimeInterval = 0.3 - ) { - addTransition(transitionType: type, duration: duration) - pushViewController(vc, animated: UIAccessibility.isVoiceOverRunning) - } - - private func addTransition( - transitionType type: CATransitionType = .fade, - duration: CFTimeInterval = 0.3 - ) { - let transition = CATransition() - transition.duration = duration - transition.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut) - transition.type = type - view.layer.add(transition, forKey: nil) - } - -} diff --git a/Core/Core/Extensions/UIResponder+CurrentResponder.swift b/Core/Core/Extensions/UIResponder+CurrentResponder.swift deleted file mode 100644 index f324d0596..000000000 --- a/Core/Core/Extensions/UIResponder+CurrentResponder.swift +++ /dev/null @@ -1,26 +0,0 @@ -// - -import Foundation -import UIKit - -extension UIResponder { - static var currentFirstResponder: UIResponder? { - _currentFirstResponder = nil - UIApplication.shared.sendAction(#selector(UIResponder.findFirstResponder(_:)), to: nil, from: nil, for: nil) - return _currentFirstResponder - } - - private weak static var _currentFirstResponder: UIResponder? - - @objc private func findFirstResponder(_: Any) { - UIResponder._currentFirstResponder = self - } - - var globalFrame: CGRect? { - guard let view = self as? UIView else { - return nil - } - - return view.superview?.convert(view.frame, to: nil) - } -} diff --git a/Core/Core/Extensions/UIView+EnclosingScrollView.swift b/Core/Core/Extensions/UIView+EnclosingScrollView.swift deleted file mode 100644 index 05314e334..000000000 --- a/Core/Core/Extensions/UIView+EnclosingScrollView.swift +++ /dev/null @@ -1,18 +0,0 @@ -// - -import UIKit - -extension UIView { - func enclosingScrollView() -> UIScrollView? { - var next: UIView? = self - - repeat { - next = next?.superview - if let scrollview = next as? UIScrollView { - return scrollview - } - } while next != nil - - return nil - } -} diff --git a/Core/Core/Extensions/UrlExtension.swift b/Core/Core/Extensions/UrlExtension.swift deleted file mode 100644 index cb09fdfc2..000000000 --- a/Core/Core/Extensions/UrlExtension.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// UrlExtension.swift -// Core -// -// Created by  Stepanok Ivan on 10.11.2022. -// - -import Foundation -import SwiftUI - -public extension URL { - func isImage() -> Bool { - if self.pathExtension == "jpg" - || self.pathExtension == "png" - || self.pathExtension == "PNG" - || self.pathExtension == "gif" - || self.pathExtension == "jpeg" - || self.pathExtension == "JPEG" - || self.pathExtension == "JPG" - || self.pathExtension == "bmp" { - return true - } else { - return false - } - } -} diff --git a/Core/Core/Extensions/ViewExtension.swift b/Core/Core/Extensions/ViewExtension.swift index 8f6320658..cec65c994 100644 --- a/Core/Core/Extensions/ViewExtension.swift +++ b/Core/Core/Extensions/ViewExtension.swift @@ -90,55 +90,6 @@ public extension View { .padding(.horizontal, 48) } - func frameLimit(width: CGFloat? = nil) -> some View { - modifier(ReadabilityModifier(width: width)) - } - - @ViewBuilder - func adaptiveHStack( - spacing: CGFloat = 0, - currentOrientation: UIInterfaceOrientation, - @ViewBuilder content: () -> Content - ) -> some View { - if currentOrientation.isLandscape && UIDevice.current.userInterfaceIdiom != .pad { - VStack(alignment: .center, spacing: spacing, content: content) - } else if currentOrientation.isPortrait && UIDevice.current.userInterfaceIdiom != .pad { - HStack(spacing: spacing, content: content) - } else if UIDevice.current.userInterfaceIdiom != .phone { - HStack(spacing: spacing, content: content) - } - } - - @ViewBuilder - func adaptiveStack( - spacing: CGFloat = 0, - isHorizontal: Bool, - @ViewBuilder content: () -> Content - ) -> some View { - if isHorizontal, UIDevice.current.userInterfaceIdiom != .pad { - HStack(spacing: spacing, content: content) - } else { - VStack(alignment: .center, spacing: spacing, content: content) - } - } - - @ViewBuilder - func adaptiveNavigationStack( - spacing: CGFloat = 0, - isHorizontal: Bool, - @ViewBuilder content: () -> Content - ) -> some View { - if UIDevice.current.userInterfaceIdiom == .pad { - HStack(spacing: spacing, content: content) - } else { - if isHorizontal { - HStack(alignment: .top, spacing: spacing, content: content) - } else { - VStack(alignment: .center, spacing: spacing, content: content) - } - } - } - func roundedBackground( _ color: Color = Theme.Colors.background, strokeColor: Color = Theme.Colors.backgroundStroke, @@ -178,73 +129,6 @@ public extension View { } } } - - func onRightSwipeGesture(perform action: @escaping () -> Void) -> some View { - self.gesture( - DragGesture(minimumDistance: 20, coordinateSpace: .local) - .onEnded { value in - if value.translation.width > 0 && abs(value.translation.height) < 50 { - action() - } - } - ) - } - - func onBackground(_ f: @escaping () -> Void) -> some View { - self.onReceive( - NotificationCenter.default.publisher(for: UIApplication.willResignActiveNotification), - perform: { _ in f() } - ) - } - - func onForeground(_ f: @escaping () -> Void) -> some View { - self.onReceive( - NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification), - perform: { _ in f() } - ) - } - - func onFirstAppear(_ action: @escaping () -> Void) -> some View { - modifier(FirstAppear(action: action)) - } - - func backViewStyle(topPadding: CGFloat = -10) -> some View { - return self - .frame(height: 24) - .padding(.horizontal, 8) - .offset(y: topPadding) - } - - @ViewBuilder - private func onTapBackgroundContent(enabled: Bool, _ action: @escaping () -> Void) -> some View { - if enabled { - Color.clear - .frame(width: UIScreen.main.bounds.width * 2, height: UIScreen.main.bounds.height * 2) - .contentShape(Rectangle()) - .onTapGesture(perform: action) - } - } - - func onTapBackground(enabled: Bool, _ action: @escaping () -> Void) -> some View { - background( - onTapBackgroundContent(enabled: enabled, action) - ) - } -} - -public extension View { - /// Applies the given transform if the given condition evaluates to `true`. - /// - Parameters: - /// - condition: The condition to evaluate. - /// - transform: The transform to apply to the source `View`. - /// - Returns: Either the original `View` or the modified `View` if the condition is `true`. - @ViewBuilder func `if`(_ condition: Bool, transform: (Self) -> Content) -> some View { - if condition { - transform(self) - } else { - self - } - } } public extension View { @@ -278,22 +162,6 @@ public extension View { } } -private struct FirstAppear: ViewModifier { - let action: () -> Void - - // Use this to only fire your block one time - @State private var hasAppeared = false - - func body(content: Content) -> some View { - // And then, track it here - content.onAppear { - guard !hasAppeared else { return } - hasAppeared = true - action() - } - } -} - public extension Image { func backButtonStyle(topPadding: CGFloat = -10, color: Color = Theme.Colors.accentColor) -> some View { return self @@ -304,14 +172,3 @@ public extension Image { .backViewStyle(topPadding: topPadding) } } - -public extension EnvironmentValues { - var isHorizontal: Bool { - if UIDevice.current.userInterfaceIdiom != .pad { - if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene { - return windowScene.windows.first?.windowScene?.interfaceOrientation.isLandscape ?? true - } - } - return false - } -} diff --git a/Core/Core/Network/API.swift b/Core/Core/Network/API.swift deleted file mode 100644 index 7e3964b62..000000000 --- a/Core/Core/Network/API.swift +++ /dev/null @@ -1,304 +0,0 @@ -// -// API.swift -// Core -// -// Created by Vladimir Chekyrta on 13.09.2022. -// - -import Foundation -import Alamofire -import WebKit - -public final class API { - - private let session: Alamofire.Session - private let config: ConfigProtocol - - public init(session: Session, config: ConfigProtocol) { - self.session = session - self.config = config - } - - @discardableResult - public func requestData( - _ route: EndPointType - ) async throws -> Data { - switch route.task { - case .request: - return try await callData(route) - case let .requestParameters(parameters, encoding): - return try await callData(route, parameters: parameters, encoding: encoding) - case let .requestCodable(parameters, encoding): - let params = try? parameters?.asDictionary() - return try await callData(route, parameters: params, encoding: encoding) - case .requestCookies: - return try await callCookies(route) - case .upload: - throw APIError.invalidRequest - } - } - - public func request( - _ route: EndPointType - ) async throws -> HTTPURLResponse { - switch route.task { - case .request: - return try await callResponse(route) - case let .requestParameters(parameters, encoding): - return try await callResponse(route, parameters: parameters, encoding: encoding) - case let .requestCodable(parameters, encoding): - let params = try? parameters?.asDictionary() - return try await callResponse(route, parameters: params, encoding: encoding) - case .requestCookies: - return try await callResponse(route) - case let .upload(data): - return try await uploadData(route, data: data) - } - } - - private func callData( - _ route: EndPointType, - parameters: Parameters? = nil, - encoding: ParameterEncoding = URLEncoding.default - ) async throws -> Data { - var url = config.baseURL - if !route.path.isEmpty { - url = url.appendingPathComponent(route.path) - } - - let result = session.request( - url, - method: route.httpMethod, - parameters: parameters, - encoding: encoding, - headers: route.headers - ).validateResponse().serializingData() - - let latestVersion = await result.response.response?.headers["EDX-APP-LATEST-VERSION"] - - if await result.response.response?.statusCode != 426 { - if let latestVersion = latestVersion { - NotificationCenter.default.post(name: .onActualVersionReceived, object: latestVersion) - } - } - - return try await result.value - - } - - private func callCookies( - _ route: EndPointType, - parameters: Parameters? = nil, - encoding: ParameterEncoding = URLEncoding.default - ) async throws -> Data { - var url = config.baseURL - if !route.path.isEmpty { - url = url.appendingPathComponent(route.path) - } - let response = session.request( - url, - method: route.httpMethod, - parameters: parameters, - encoding: encoding, - headers: route.headers - ) - - let value = try await response.validateResponse().serializingData().value - - parseAndSetCookies(response: response.response) - return value - } - - private func uploadData( - _ route: EndPointType, - data: Data - ) async throws -> HTTPURLResponse { - var url = config.baseURL - if !route.path.isEmpty { - url = url.appendingPathComponent(route.path) - } - - let response = await session.request( - url, - method: route.httpMethod, - encoding: UploadBodyEncoding(body: data), - headers: route.headers - ).validateResponse().serializingResponse(using: .string).response - - if let response = response.response { - return response - } else if let error = response.error { - throw error - } else { - throw APIError.unknown - } - } - - private func parseAndSetCookies(response: HTTPURLResponse?) { - guard let fields = response?.allHeaderFields as? [String: String] else { return } - let url = config.baseURL - let cookies = HTTPCookie.cookies(withResponseHeaderFields: fields, for: url) - HTTPCookieStorage.shared.cookies?.forEach { HTTPCookieStorage.shared.deleteCookie($0) } - HTTPCookieStorage.shared.setCookies(cookies, for: url, mainDocumentURL: nil) - DispatchQueue.main.async { - let cookies = HTTPCookieStorage.shared.cookies ?? [] - for c in cookies { - WKWebsiteDataStore.default().httpCookieStore.setCookie(c) - } - } - } - - private func callResponse( - _ route: EndPointType, - parameters: Parameters? = nil, - encoding: ParameterEncoding = URLEncoding.default - ) async throws -> HTTPURLResponse { - var url = config.baseURL - if !route.path.isEmpty { - url = url.appendingPathComponent(route.path) - } - let serializer = DataResponseSerializer(emptyResponseCodes: [200, 204, 205]) - - let response = await session.request( - url, - method: route.httpMethod, - parameters: parameters, - encoding: encoding, - headers: route.headers - ).validateResponse().serializingResponse(using: serializer).response - - if let error = response.error { - throw error - } else if let response = response.response { - return response - } else { - throw APIError.unknown - } - } -} - -public enum APIError: Int, LocalizedError { - case unknown = -100 - case emptyData = -200 - case invalidGrant = -300 - case parsingError = -400 - case invalidRequest = -500 - case uploadError = -600 - - public var errorDescription: String? { - switch self { - default: - return nil - } - } - - public var localizedDescription: String { - return errorDescription ?? "" - } -} - -public struct CustomValidationError: LocalizedError { - public let statusCode: Int - public let data: [String: Any]? - - public init(statusCode: Int, data: [String: Any]?) { - self.statusCode = statusCode - self.data = data - } -} - -extension DataRequest { - func validateResponse() -> Self { - return validateStatusCode().validateContentType() - } - - func validateStatusCode() -> Self { - return validate { _, response, data in - switch response.statusCode { - case 200...299: - return .success(()) - case 400...403: - if let data { - if let dataString = String(data: data, encoding: .utf8) { - if dataString.first == "{" && dataString.last == "}" { - let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] - return .failure(CustomValidationError(statusCode: response.statusCode, data: json)) - } else { - let reason: AFError.ResponseValidationFailureReason - = .unacceptableStatusCode(code: response.statusCode) - return .failure(AFError.responseValidationFailed(reason: reason)) - } - } - } - let reason: AFError.ResponseValidationFailureReason = .unacceptableStatusCode(code: response.statusCode) - return .failure(AFError.responseValidationFailed(reason: reason)) - default: - let reason: AFError.ResponseValidationFailureReason = .unacceptableStatusCode(code: response.statusCode) - return .failure(AFError.responseValidationFailed(reason: reason)) - } - } - } - - func validateContentType() -> Self { - let contentTypes: () -> [String] = { [unowned self] in - if let accept = request?.value(forHTTPHeaderField: "Accept") { - return accept.components(separatedBy: ",") - } - return ["*/*"] - } - return validate(contentType: contentTypes()) - } -} - -public struct CustomGetEncoding: ParameterEncoding { - public init() {} - public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest { - var request = try URLEncoding().encode(urlRequest, with: parameters) - request.url = URL(string: request.url!.absoluteString.replacingOccurrences(of: "%5B%5D=", with: "=")) - return request - } -} - -extension Encodable { - func asDictionary() throws -> [String: Any] { - let data = try JSONEncoder().encode(self) - guard let dictionary = try JSONSerialization.jsonObject( - with: data, - options: .fragmentsAllowed - ) as? [String: Any] else { - throw NSError() - } - return dictionary - } -} - -public extension Data { - func mapResponse(_ decodableType: NewSuccess.Type) throws -> NewSuccess where NewSuccess: Decodable { - do { - let baseResponse = try JSONDecoder().decode(NewSuccess.self, from: self) - - return baseResponse - } catch { - print(error) - throw APIError.parsingError - } - } -} - -public extension Error { - var validationError: CustomValidationError? { - if let afError = self.asAFError, case AFError.responseValidationFailed(let reason) = afError { - if case AFError.ResponseValidationFailureReason.customValidationFailed(let error) = reason { - return error as? CustomValidationError - } - } - return nil - } -} - -// Mark - For testing and SwiftUI preview -#if DEBUG -public extension API { - static let mock: API = .init(session: Alamofire.Session.default, config: ConfigMock()) -} -#endif diff --git a/Core/Core/Network/Alamofire+Error.swift b/Core/Core/Network/Alamofire+Error.swift deleted file mode 100644 index 90068b90a..000000000 --- a/Core/Core/Network/Alamofire+Error.swift +++ /dev/null @@ -1,30 +0,0 @@ -// -// Alamofire+Error.swift -// Core -// -// Created by Vladimir Chekyrta on 14.09.2022. -// - -import Alamofire -import Foundation - -public extension Error { - var isUpdateRequeiredError: Bool { - self.asAFError?.responseCode == 426 - } - - var isInternetError: Bool { - guard let afError = self.asAFError, - let urlError = afError.underlyingError as? URLError else { - return false - } - switch urlError.code { - case .timedOut, .cannotConnectToHost, .networkConnectionLost, - .notConnectedToInternet, .resourceUnavailable, .internationalRoamingOff, - .dataNotAllowed: - return true - default: - return false - } - } -} diff --git a/Core/Core/Network/AuthEndpoint.swift b/Core/Core/Network/AuthEndpoint.swift index 609e4890b..c4f70adc3 100644 --- a/Core/Core/Network/AuthEndpoint.swift +++ b/Core/Core/Network/AuthEndpoint.swift @@ -7,6 +7,7 @@ import Foundation import Alamofire +import OEXFoundation enum AuthEndpoint: EndPointType { case getAccessToken(username: String, password: String, clientId: String, tokenType: String) diff --git a/Core/Core/Network/DownloadManager.swift b/Core/Core/Network/DownloadManager.swift index d21a95d69..d7e277066 100644 --- a/Core/Core/Network/DownloadManager.swift +++ b/Core/Core/Network/DownloadManager.swift @@ -5,10 +5,11 @@ // Created by  Stepanok Ivan on 08.03.2023. // -import Alamofire import SwiftUI import Combine import ZipArchive +import OEXFoundation +import Alamofire public enum DownloadState: String { case waiting diff --git a/Core/Core/Network/EndPointType.swift b/Core/Core/Network/EndPointType.swift deleted file mode 100644 index f27534429..000000000 --- a/Core/Core/Network/EndPointType.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// EndPointType.swift -// Core -// -// Created by Vladimir Chekyrta on 13.09.2022. -// - -import Foundation -import Alamofire - -public protocol EndPointType { - var path: String { get } - var httpMethod: HTTPMethod { get } - var headers: HTTPHeaders? { get } - var task: HTTPTask { get } -} diff --git a/Core/Core/Network/HTTPTask.swift b/Core/Core/Network/HTTPTask.swift deleted file mode 100644 index 5e07200f7..000000000 --- a/Core/Core/Network/HTTPTask.swift +++ /dev/null @@ -1,17 +0,0 @@ -// -// HTTPTask.swift -// Core -// -// Created by Vladimir Chekyrta on 13.09.2022. -// - -import Foundation -import Alamofire - -public enum HTTPTask { - case request - case requestCookies - case requestParameters(parameters: Parameters? = nil, encoding: ParameterEncoding) - case requestCodable(parameters: Encodable? = nil, encoding: ParameterEncoding) - case upload(Data) -} diff --git a/Core/Core/Network/HeadersRedirectHandler.swift b/Core/Core/Network/HeadersRedirectHandler.swift deleted file mode 100644 index 3653392bd..000000000 --- a/Core/Core/Network/HeadersRedirectHandler.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// HeadersRedirectHandler.swift -// Core -// -// Created by Vladimir Chekyrta on 14.09.2022. -// - -import Foundation -import Alamofire - -public class HeadersRedirectHandler: RedirectHandler { - - public init() { - } - - public func task( - _ task: URLSessionTask, - willBeRedirectedTo request: URLRequest, - for response: HTTPURLResponse, - completion: @escaping (URLRequest?) -> Void - ) { - var redirectedRequest = request - - if let originalRequest = task.originalRequest, - let headers = originalRequest.allHTTPHeaderFields { - for (key, value) in headers { - redirectedRequest.setValue(value, forHTTPHeaderField: key) - } - } - - completion(redirectedRequest) - } -} diff --git a/Core/Core/Network/NetworkLogger.swift b/Core/Core/Network/NetworkLogger.swift deleted file mode 100644 index 7335be2b2..000000000 --- a/Core/Core/Network/NetworkLogger.swift +++ /dev/null @@ -1,48 +0,0 @@ -// -// NetworkLogger.swift -// Core -// -// Created by Vladimir Chekyrta on 13.09.2022. -// - -import Alamofire -import Foundation - -public class NetworkLogger: EventMonitor { - - public let queue = DispatchQueue(label: "com.raccoongang.networklogger") - - public init() { - } - - public func requestDidResume(_ request: Request) { - print("Request:", request.description) - if let headers = request.request?.headers { - print("Headers:") - print(headers) - print("------") - } - if let body = request.request?.httpBody, let value = String(data: body, encoding: .utf8) { - print("Body:") - print(value) - print("------") - } - } - - public func request(_ request: DataRequest, didParseResponse response: DataResponse) { - guard let data = response.data else { - return - } - guard let responseValue = String(data: data, encoding: .utf8) else { - return - } - print("Response:", request.description) - print(responseValue) - -// if let json = try? JSONSerialization -// .jsonObject(with: data, options: .mutableContainers) { -// print(json) -// } - } - -} diff --git a/Core/Core/Network/OfflineSyncEndpoint.swift b/Core/Core/Network/OfflineSyncEndpoint.swift index ce3f680ac..0db8fdbc6 100644 --- a/Core/Core/Network/OfflineSyncEndpoint.swift +++ b/Core/Core/Network/OfflineSyncEndpoint.swift @@ -7,6 +7,7 @@ import Foundation import Alamofire +import OEXFoundation enum OfflineSyncEndpoint: EndPointType { case submitOfflineProgress(courseID: String, blockID: String, data: String) diff --git a/Core/Core/Network/OfflineSyncManager.swift b/Core/Core/Network/OfflineSyncManager.swift index 6e9cdd30f..295d79bec 100644 --- a/Core/Core/Network/OfflineSyncManager.swift +++ b/Core/Core/Network/OfflineSyncManager.swift @@ -9,6 +9,7 @@ import Foundation import WebKit import Combine import Swinject +import OEXFoundation public protocol OfflineSyncManagerProtocol { func handleMessage(message: WKScriptMessage, blockID: String) diff --git a/Core/Core/Network/UploadBodyEncoding.swift b/Core/Core/Network/UploadBodyEncoding.swift deleted file mode 100644 index bfbc808cd..000000000 --- a/Core/Core/Network/UploadBodyEncoding.swift +++ /dev/null @@ -1,44 +0,0 @@ -// -// UploadBodyEncoding.swift -// Core -// -// Created by  Stepanok Ivan on 29.11.2022. -// - -import Foundation -import Alamofire - -public struct UploadBodyEncoding: ParameterEncoding { - - private var body: Data - - public init(body: Data) { - self.body = body - } - - public func encode( - _ urlRequest: Alamofire.URLRequestConvertible, - with parameters: Alamofire.Parameters? - ) throws -> URLRequest { - var urlRequest = try urlRequest.asURLRequest() - - guard let url = urlRequest.url else { - throw AFError.parameterEncodingFailed(reason: .missingURL) - } - - if var urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false) { - let percentEncodedQuery = (urlComponents.percentEncodedQuery.map { $0 + "&" } ?? "") - urlComponents.percentEncodedQuery = percentEncodedQuery - urlRequest.url = urlComponents.url - } - - if urlRequest.headers["Content-Type"] == nil { - urlRequest.headers.update(.contentType("image/jpeg")) - } - - urlRequest.httpBody = body - - return urlRequest - } - -} diff --git a/Core/Core/View/Base/BackNavigationButtonViewModel.swift b/Core/Core/View/Base/BackNavigationButtonViewModel.swift index 00c4b5d76..59dfe97a5 100644 --- a/Core/Core/View/Base/BackNavigationButtonViewModel.swift +++ b/Core/Core/View/Base/BackNavigationButtonViewModel.swift @@ -7,6 +7,7 @@ import Swinject import UIKit +import OEXFoundation public protocol BackNavigationProtocol { func getBackMenuItems() -> [BackNavigationMenuItem] diff --git a/Core/CoreTests/Configuration/ConfigTests.swift b/Core/CoreTests/Configuration/ConfigTests.swift index 35a90c2b7..c408e02a5 100644 --- a/Core/CoreTests/Configuration/ConfigTests.swift +++ b/Core/CoreTests/Configuration/ConfigTests.swift @@ -140,11 +140,4 @@ class ConfigTests: XCTestCase { XCTAssertTrue(config.branch.enabled) XCTAssertEqual(config.branch.key, "testBranchKey") } - - func testSegmentConfigInitialization() { - let config = Config(properties: properties) - - XCTAssertTrue(config.segment.enabled) - XCTAssertEqual(config.segment.writeKey, "testSegmentKey") - } } diff --git a/Core/CoreTests/Configuration/FullStoryConfigTests.swift b/Core/CoreTests/Configuration/FullStoryConfigTests.swift deleted file mode 100644 index 092d9a5ee..000000000 --- a/Core/CoreTests/Configuration/FullStoryConfigTests.swift +++ /dev/null @@ -1,57 +0,0 @@ -// -// FullStoryConfigTests.swift -// CoreTests -// -// Created by Saeed Bashir on 6/21/24. -// - -import XCTest -@testable import Core - -class FullStoryConfigTests: XCTestCase { - - func testNoFullStoryConfig() { - let config = Config(properties: [:]) - XCTAssertFalse(config.fullStory.enabled) - } - - func testFullStoryEnabled() { - let configDictionary = [ - "FULLSTORY": [ - "ENABLED": true, - "ORG_ID": "org_id" - ] - ] - - let config = Config(properties: configDictionary) - - XCTAssertTrue(config.fullStory.enabled) - XCTAssertNotNil(config.fullStory.orgID) - } - - func testFullStoryDisabled() { - let configDictionary = [ - "FULLSTORY": [ - "ENABLED": false, - "ORG_ID": "org_id" - ] - ] - - let config = Config(properties: configDictionary) - - XCTAssertFalse(config.fullStory.enabled) - XCTAssertNotNil(config.fullStory.orgID) - } - - func testFullStoryMissingORGID() { - let configDictionary = [ - "FULLSTORY": [ - "ENABLED": true - ] - ] - - let config = Config(properties: configDictionary) - XCTAssertFalse(config.fullStory.enabled) - XCTAssertEqual(config.fullStory.orgID, "") - } -} diff --git a/Core/CoreTests/CoreMock.generated.swift b/Core/CoreTests/CoreMock.generated.swift index 3fbb5c626..261c6be74 100644 --- a/Core/CoreTests/CoreMock.generated.swift +++ b/Core/CoreTests/CoreMock.generated.swift @@ -1517,11 +1517,6 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { } private var __p_branch: (BranchConfig)? - public var segment: SegmentConfig { - get { invocations.append(.p_segment_get); return __p_segment ?? givenGetterValue(.p_segment_get, "ConfigProtocolMock - stub value for segment was not defined") } - } - private var __p_segment: (SegmentConfig)? - public var program: DiscoveryConfig { get { invocations.append(.p_program_get); return __p_program ?? givenGetterValue(.p_program_get, "ConfigProtocolMock - stub value for program was not defined") } } @@ -1532,11 +1527,6 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { } private var __p_URIScheme: (String)? - public var fullStory: FullStoryConfig { - get { invocations.append(.p_fullStory_get); return __p_fullStory ?? givenGetterValue(.p_fullStory_get, "ConfigProtocolMock - stub value for fullStory was not defined") } - } - private var __p_fullStory: (FullStoryConfig)? - @@ -1566,10 +1556,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { case p_dashboard_get case p_braze_get case p_branch_get - case p_segment_get case p_program_get case p_URIScheme_get - case p_fullStory_get static func compareParameters(lhs: MethodType, rhs: MethodType, matcher: Matcher) -> Matcher.ComparisonResult { switch (lhs, rhs) { case (.p_baseURL_get,.p_baseURL_get): return Matcher.ComparisonResult.match @@ -1595,10 +1583,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { case (.p_dashboard_get,.p_dashboard_get): return Matcher.ComparisonResult.match case (.p_braze_get,.p_braze_get): return Matcher.ComparisonResult.match case (.p_branch_get,.p_branch_get): return Matcher.ComparisonResult.match - case (.p_segment_get,.p_segment_get): return Matcher.ComparisonResult.match case (.p_program_get,.p_program_get): return Matcher.ComparisonResult.match case (.p_URIScheme_get,.p_URIScheme_get): return Matcher.ComparisonResult.match - case (.p_fullStory_get,.p_fullStory_get): return Matcher.ComparisonResult.match default: return .none } } @@ -1628,10 +1614,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { case .p_dashboard_get: return 0 case .p_braze_get: return 0 case .p_branch_get: return 0 - case .p_segment_get: return 0 case .p_program_get: return 0 case .p_URIScheme_get: return 0 - case .p_fullStory_get: return 0 } } func assertionName() -> String { @@ -1659,10 +1643,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { case .p_dashboard_get: return "[get] .dashboard" case .p_braze_get: return "[get] .braze" case .p_branch_get: return "[get] .branch" - case .p_segment_get: return "[get] .segment" case .p_program_get: return "[get] .program" case .p_URIScheme_get: return "[get] .URIScheme" - case .p_fullStory_get: return "[get] .fullStory" } } } @@ -1744,18 +1726,12 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { public static func branch(getter defaultValue: BranchConfig...) -> PropertyStub { return Given(method: .p_branch_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) } - public static func segment(getter defaultValue: SegmentConfig...) -> PropertyStub { - return Given(method: .p_segment_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) - } public static func program(getter defaultValue: DiscoveryConfig...) -> PropertyStub { return Given(method: .p_program_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) } public static func URIScheme(getter defaultValue: String...) -> PropertyStub { return Given(method: .p_URIScheme_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) } - public static func fullStory(getter defaultValue: FullStoryConfig...) -> PropertyStub { - return Given(method: .p_fullStory_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) - } } @@ -1785,10 +1761,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { public static var dashboard: Verify { return Verify(method: .p_dashboard_get) } public static var braze: Verify { return Verify(method: .p_braze_get) } public static var branch: Verify { return Verify(method: .p_branch_get) } - public static var segment: Verify { return Verify(method: .p_segment_get) } public static var program: Verify { return Verify(method: .p_program_get) } public static var URIScheme: Verify { return Verify(method: .p_URIScheme_get) } - public static var fullStory: Verify { return Verify(method: .p_fullStory_get) } } public struct Perform { diff --git a/Course/Course.xcodeproj/project.pbxproj b/Course/Course.xcodeproj/project.pbxproj index 81830204f..930494938 100644 --- a/Course/Course.xcodeproj/project.pbxproj +++ b/Course/Course.xcodeproj/project.pbxproj @@ -99,6 +99,9 @@ BAC0E0DE2B32F0F3006B68A9 /* DownloadsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAC0E0DD2B32F0F3006B68A9 /* DownloadsViewModel.swift */; }; BAD9CA2D2B2736BB00DE790A /* LessonLineProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAD9CA2C2B2736BB00DE790A /* LessonLineProgressView.swift */; }; BAD9CA4A2B2C88E000DE790A /* CourseVideoDownloadBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAD9CA492B2C88E000DE790A /* CourseVideoDownloadBarView.swift */; }; + CE7CAF412CC1563500E0AC9D /* OEXFoundation in Frameworks */ = {isa = PBXBuildFile; productRef = CE7CAF402CC1563500E0AC9D /* OEXFoundation */; }; + CEB1E2732CC14EC400921517 /* OEXFoundation in Frameworks */ = {isa = PBXBuildFile; productRef = CEB1E2722CC14EC400921517 /* OEXFoundation */; }; + CEBCA4342CC13CDE00076589 /* YouTubePlayerKit in Frameworks */ = {isa = PBXBuildFile; productRef = CEBCA4332CC13CDE00076589 /* YouTubePlayerKit */; }; DB205BFB2AE81B1200136EC2 /* CourseDateViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB205BFA2AE81B1200136EC2 /* CourseDateViewModelTests.swift */; }; DB7D6EAC2ADFCAC50036BB13 /* CourseDatesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB7D6EAB2ADFCAC40036BB13 /* CourseDatesView.swift */; }; DB7D6EAE2ADFCB4A0036BB13 /* CourseDatesViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB7D6EAD2ADFCB4A0036BB13 /* CourseDatesViewModel.swift */; }; @@ -114,6 +117,19 @@ }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + CE7CAF432CC1563500E0AC9D /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 02228B2E2C221412009A5F28 /* LargestDownloadsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LargestDownloadsView.swift; sourceTree = ""; }; 02280F5D294B4FDA0032823A /* CourseCoreModel.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = CourseCoreModel.xcdatamodel; sourceTree = ""; }; @@ -243,6 +259,7 @@ buildActionMask = 2147483647; files = ( 023812E8297AC8EB0087098F /* Course.framework in Frameworks */, + CE7CAF412CC1563500E0AC9D /* OEXFoundation in Frameworks */, B8F50317B6B830A0E520C954 /* Pods_App_Course_CourseTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -253,7 +270,9 @@ files = ( 02B6B3C928E1E68100232911 /* Core.framework in Frameworks */, 197FB8EA8F92F00A8F383D82 /* Pods_App_Course.framework in Frameworks */, + CEBCA4342CC13CDE00076589 /* YouTubePlayerKit in Frameworks */, 02F98A8128F8224200DE94C0 /* Discussion.framework in Frameworks */, + CEB1E2732CC14EC400921517 /* OEXFoundation in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -696,6 +715,7 @@ 023812E1297AC8EA0087098F /* Frameworks */, 023812E2297AC8EA0087098F /* Resources */, 92C3B3183886DDECE1CBAC22 /* [CP] Copy Pods Resources */, + CE7CAF432CC1563500E0AC9D /* Embed Frameworks */, ); buildRules = ( ); @@ -756,6 +776,10 @@ uk, ); mainGroup = 0289F8E428E1C3510064F8F3; + packageReferences = ( + CEBCA4322CC13CDE00076589 /* XCRemoteSwiftPackageReference "YouTubePlayerKit" */, + CEB1E2712CC14EC400921517 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */, + ); productRefGroup = 0289F8EF28E1C3510064F8F3 /* Products */; projectDirPath = ""; projectRoot = ""; @@ -1984,6 +2008,43 @@ }; /* End XCConfigurationList section */ +/* Begin XCRemoteSwiftPackageReference section */ + CEB1E2712CC14EC400921517 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/openedx/openedx-app-foundation-ios/"; + requirement = { + kind = exactVersion; + version = 1.0.0; + }; + }; + CEBCA4322CC13CDE00076589 /* XCRemoteSwiftPackageReference "YouTubePlayerKit" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/SvenTiigi/YouTubePlayerKit"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.9.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + CE7CAF402CC1563500E0AC9D /* OEXFoundation */ = { + isa = XCSwiftPackageProductDependency; + package = CEB1E2712CC14EC400921517 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */; + productName = OEXFoundation; + }; + CEB1E2722CC14EC400921517 /* OEXFoundation */ = { + isa = XCSwiftPackageProductDependency; + package = CEB1E2712CC14EC400921517 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */; + productName = OEXFoundation; + }; + CEBCA4332CC13CDE00076589 /* YouTubePlayerKit */ = { + isa = XCSwiftPackageProductDependency; + package = CEBCA4322CC13CDE00076589 /* XCRemoteSwiftPackageReference "YouTubePlayerKit" */; + productName = YouTubePlayerKit; + }; +/* End XCSwiftPackageProductDependency section */ + /* Begin XCVersionGroup section */ 02280F5C294B4FDA0032823A /* CourseCoreModel.xcdatamodeld */ = { isa = XCVersionGroup; diff --git a/Course/Course/Data/CourseRepository.swift b/Course/Course/Data/CourseRepository.swift index 09e86c588..7210a9f76 100644 --- a/Course/Course/Data/CourseRepository.swift +++ b/Course/Course/Data/CourseRepository.swift @@ -7,6 +7,7 @@ import Foundation import Core +import OEXFoundation public protocol CourseRepositoryProtocol { func getCourseBlocks(courseID: String) async throws -> CourseStructure diff --git a/Course/Course/Data/Network/CourseEndpoint.swift b/Course/Course/Data/Network/CourseEndpoint.swift index 323ae5e8d..62531a042 100644 --- a/Course/Course/Data/Network/CourseEndpoint.swift +++ b/Course/Course/Data/Network/CourseEndpoint.swift @@ -7,6 +7,7 @@ import Foundation import Core +import OEXFoundation import Alamofire enum CourseEndpoint: EndPointType { diff --git a/Course/Course/Presentation/Container/CourseContainerViewModel.swift b/Course/Course/Presentation/Container/CourseContainerViewModel.swift index b8ddea494..e156dcb1a 100644 --- a/Course/Course/Presentation/Container/CourseContainerViewModel.swift +++ b/Course/Course/Presentation/Container/CourseContainerViewModel.swift @@ -8,6 +8,7 @@ import Foundation import SwiftUI import Core +import OEXFoundation import Combine public enum CourseTab: Int, CaseIterable, Identifiable { diff --git a/Course/Course/Presentation/CourseAnalytics.swift b/Course/Course/Presentation/CourseAnalytics.swift index ea794754d..28eb5918a 100644 --- a/Course/Course/Presentation/CourseAnalytics.swift +++ b/Course/Course/Presentation/CourseAnalytics.swift @@ -7,6 +7,7 @@ import Foundation import Core +import OEXFoundation public enum EnrollmentMode: String { case audit diff --git a/Course/Course/Presentation/Dates/CourseDatesView.swift b/Course/Course/Presentation/Dates/CourseDatesView.swift index 7283f516d..0bccd3853 100644 --- a/Course/Course/Presentation/Dates/CourseDatesView.swift +++ b/Course/Course/Presentation/Dates/CourseDatesView.swift @@ -8,6 +8,7 @@ import Foundation import SwiftUI import Core +import OEXFoundation import Theme import SwiftUIIntrospect @@ -500,7 +501,7 @@ struct CourseDatesView_Previews: PreviewProvider { config: ConfigMock(), courseID: "", courseName: "", - analytics: CourseAnalyticsMock(), + analytics: CourseAnalyticsMock(), calendarManager: CalendarManagerMock() ) diff --git a/Course/Course/Presentation/Dates/CourseDatesViewModel.swift b/Course/Course/Presentation/Dates/CourseDatesViewModel.swift index be2f67b26..5ec8101c6 100644 --- a/Course/Course/Presentation/Dates/CourseDatesViewModel.swift +++ b/Course/Course/Presentation/Dates/CourseDatesViewModel.swift @@ -8,6 +8,7 @@ import Foundation import Core import SwiftUI +import OEXFoundation public class CourseDatesViewModel: ObservableObject { diff --git a/Course/Course/Presentation/Downloads/DownloadsViewModel.swift b/Course/Course/Presentation/Downloads/DownloadsViewModel.swift index 709ecc402..cf74c6c65 100644 --- a/Course/Course/Presentation/Downloads/DownloadsViewModel.swift +++ b/Course/Course/Presentation/Downloads/DownloadsViewModel.swift @@ -7,6 +7,7 @@ import Foundation import Core +import OEXFoundation import Combine final class DownloadsViewModel: ObservableObject { diff --git a/Course/Course/Presentation/Offline/OfflineView.swift b/Course/Course/Presentation/Offline/OfflineView.swift index 6129b251b..eab6e8331 100644 --- a/Course/Course/Presentation/Offline/OfflineView.swift +++ b/Course/Course/Presentation/Offline/OfflineView.swift @@ -7,6 +7,7 @@ import SwiftUI import Core +import OEXFoundation import Theme struct OfflineView: View { diff --git a/Course/Course/Presentation/Outline/CourseOutlineView.swift b/Course/Course/Presentation/Outline/CourseOutlineView.swift index a5dc918ae..d20c4de00 100644 --- a/Course/Course/Presentation/Outline/CourseOutlineView.swift +++ b/Course/Course/Presentation/Outline/CourseOutlineView.swift @@ -7,6 +7,7 @@ import SwiftUI import Core +import OEXFoundation import Kingfisher import Theme import SwiftUIIntrospect @@ -135,11 +136,9 @@ public struct CourseOutlineView: View { .frameLimit(width: proxy.size.width) } .refreshable { - await withTaskGroup(of: Void.self) { group in - group.addTask { + Task { await viewModel.getCourseBlocks(courseID: courseID, withProgress: false) } - } } .onRightSwipeGesture { viewModel.router.back() diff --git a/Course/Course/Presentation/Outline/CourseVertical/CourseVerticalView.swift b/Course/Course/Presentation/Outline/CourseVertical/CourseVerticalView.swift index ff3306072..cdbf81318 100644 --- a/Course/Course/Presentation/Outline/CourseVertical/CourseVerticalView.swift +++ b/Course/Course/Presentation/Outline/CourseVertical/CourseVerticalView.swift @@ -6,8 +6,8 @@ // import SwiftUI - import Core +import OEXFoundation import Kingfisher import Theme diff --git a/Course/Course/Presentation/Subviews/CourseVideoDownloadBarView/CourseVideoDownloadBarViewModel.swift b/Course/Course/Presentation/Subviews/CourseVideoDownloadBarView/CourseVideoDownloadBarViewModel.swift index b4812db24..704a7ad64 100644 --- a/Course/Course/Presentation/Subviews/CourseVideoDownloadBarView/CourseVideoDownloadBarViewModel.swift +++ b/Course/Course/Presentation/Subviews/CourseVideoDownloadBarView/CourseVideoDownloadBarViewModel.swift @@ -7,6 +7,7 @@ import Foundation import Core +import OEXFoundation import Combine final class CourseVideoDownloadBarViewModel: ObservableObject { diff --git a/Course/Course/Presentation/Unit/CourseUnitView.swift b/Course/Course/Presentation/Unit/CourseUnitView.swift index 81736c6fe..2bbdc58cc 100644 --- a/Course/Course/Presentation/Unit/CourseUnitView.swift +++ b/Course/Course/Presentation/Unit/CourseUnitView.swift @@ -8,6 +8,7 @@ import Foundation import SwiftUI import Core +import OEXFoundation import Discussion import Combine import Theme diff --git a/Course/Course/Presentation/Video/VideoPlayerViewModel.swift b/Course/Course/Presentation/Video/VideoPlayerViewModel.swift index 5014596da..c35f9df83 100644 --- a/Course/Course/Presentation/Video/VideoPlayerViewModel.swift +++ b/Course/Course/Presentation/Video/VideoPlayerViewModel.swift @@ -7,6 +7,7 @@ import Foundation import Core +import OEXFoundation import _AVKit_SwiftUI import Combine diff --git a/Course/CourseTests/CourseMock.generated.swift b/Course/CourseTests/CourseMock.generated.swift index 9033a7383..b30530b11 100644 --- a/Course/CourseTests/CourseMock.generated.swift +++ b/Course/CourseTests/CourseMock.generated.swift @@ -13,6 +13,7 @@ import Course import Foundation import SwiftUI import Combine +import OEXFoundation // MARK: - AuthInteractorProtocol @@ -1518,11 +1519,6 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { } private var __p_branch: (BranchConfig)? - public var segment: SegmentConfig { - get { invocations.append(.p_segment_get); return __p_segment ?? givenGetterValue(.p_segment_get, "ConfigProtocolMock - stub value for segment was not defined") } - } - private var __p_segment: (SegmentConfig)? - public var program: DiscoveryConfig { get { invocations.append(.p_program_get); return __p_program ?? givenGetterValue(.p_program_get, "ConfigProtocolMock - stub value for program was not defined") } } @@ -1533,11 +1529,6 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { } private var __p_URIScheme: (String)? - public var fullStory: FullStoryConfig { - get { invocations.append(.p_fullStory_get); return __p_fullStory ?? givenGetterValue(.p_fullStory_get, "ConfigProtocolMock - stub value for fullStory was not defined") } - } - private var __p_fullStory: (FullStoryConfig)? - @@ -1567,10 +1558,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { case p_dashboard_get case p_braze_get case p_branch_get - case p_segment_get case p_program_get case p_URIScheme_get - case p_fullStory_get static func compareParameters(lhs: MethodType, rhs: MethodType, matcher: Matcher) -> Matcher.ComparisonResult { switch (lhs, rhs) { case (.p_baseURL_get,.p_baseURL_get): return Matcher.ComparisonResult.match @@ -1596,10 +1585,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { case (.p_dashboard_get,.p_dashboard_get): return Matcher.ComparisonResult.match case (.p_braze_get,.p_braze_get): return Matcher.ComparisonResult.match case (.p_branch_get,.p_branch_get): return Matcher.ComparisonResult.match - case (.p_segment_get,.p_segment_get): return Matcher.ComparisonResult.match case (.p_program_get,.p_program_get): return Matcher.ComparisonResult.match case (.p_URIScheme_get,.p_URIScheme_get): return Matcher.ComparisonResult.match - case (.p_fullStory_get,.p_fullStory_get): return Matcher.ComparisonResult.match default: return .none } } @@ -1629,10 +1616,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { case .p_dashboard_get: return 0 case .p_braze_get: return 0 case .p_branch_get: return 0 - case .p_segment_get: return 0 case .p_program_get: return 0 case .p_URIScheme_get: return 0 - case .p_fullStory_get: return 0 } } func assertionName() -> String { @@ -1660,10 +1645,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { case .p_dashboard_get: return "[get] .dashboard" case .p_braze_get: return "[get] .braze" case .p_branch_get: return "[get] .branch" - case .p_segment_get: return "[get] .segment" case .p_program_get: return "[get] .program" case .p_URIScheme_get: return "[get] .URIScheme" - case .p_fullStory_get: return "[get] .fullStory" } } } @@ -1745,18 +1728,12 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { public static func branch(getter defaultValue: BranchConfig...) -> PropertyStub { return Given(method: .p_branch_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) } - public static func segment(getter defaultValue: SegmentConfig...) -> PropertyStub { - return Given(method: .p_segment_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) - } public static func program(getter defaultValue: DiscoveryConfig...) -> PropertyStub { return Given(method: .p_program_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) } public static func URIScheme(getter defaultValue: String...) -> PropertyStub { return Given(method: .p_URIScheme_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) } - public static func fullStory(getter defaultValue: FullStoryConfig...) -> PropertyStub { - return Given(method: .p_fullStory_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) - } } @@ -1786,10 +1763,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { public static var dashboard: Verify { return Verify(method: .p_dashboard_get) } public static var braze: Verify { return Verify(method: .p_braze_get) } public static var branch: Verify { return Verify(method: .p_branch_get) } - public static var segment: Verify { return Verify(method: .p_segment_get) } public static var program: Verify { return Verify(method: .p_program_get) } public static var URIScheme: Verify { return Verify(method: .p_URIScheme_get) } - public static var fullStory: Verify { return Verify(method: .p_fullStory_get) } } public struct Perform { diff --git a/Course/Mockfile b/Course/Mockfile index 58cd4b263..42d9b4b0e 100644 --- a/Course/Mockfile +++ b/Course/Mockfile @@ -14,4 +14,5 @@ unit.tests.mock: - Course - Foundation - SwiftUI - - Combine \ No newline at end of file + - Combine + - OEXFoundation \ No newline at end of file diff --git a/Dashboard/Dashboard.xcodeproj/project.pbxproj b/Dashboard/Dashboard.xcodeproj/project.pbxproj index d6aa32efb..5688cafb4 100644 --- a/Dashboard/Dashboard.xcodeproj/project.pbxproj +++ b/Dashboard/Dashboard.xcodeproj/project.pbxproj @@ -38,6 +38,7 @@ 9AD4A6A1AAF97092CF457FE2 /* Pods_App_Dashboard_DashboardTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22905947A936093AD23D4CF8 /* Pods_App_Dashboard_DashboardTests.framework */; }; CE1735062CD2552A00F9606A /* PrimaryCourseDashboardViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE1735052CD2552A00F9606A /* PrimaryCourseDashboardViewModelTests.swift */; }; CE17350A2CD26CB500F9606A /* AllCoursesViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE1735092CD26CB500F9606A /* AllCoursesViewModelTests.swift */; }; + CEB1E26D2CC14E9B00921517 /* OEXFoundation in Frameworks */ = {isa = PBXBuildFile; productRef = CEB1E26C2CC14E9B00921517 /* OEXFoundation */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -116,6 +117,7 @@ buildActionMask = 2147483647; files = ( 027DB33F28D8E605002B6862 /* Core.framework in Frameworks */, + CEB1E26D2CC14E9B00921517 /* OEXFoundation in Frameworks */, 214DA1AADABC7BF4FB8EA1D7 /* Pods_App_Dashboard.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -372,6 +374,9 @@ uk, ); mainGroup = 02EF39DD28D89F560058F6BD; + packageReferences = ( + CEB1E26B2CC14E9B00921517 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */, + ); productRefGroup = 02EF39E828D89F560058F6BD /* Products */; projectDirPath = ""; projectRoot = ""; @@ -1528,6 +1533,25 @@ }; /* End XCConfigurationList section */ +/* Begin XCRemoteSwiftPackageReference section */ + CEB1E26B2CC14E9B00921517 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/openedx/openedx-app-foundation-ios/"; + requirement = { + kind = exactVersion; + version = 1.0.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + CEB1E26C2CC14E9B00921517 /* OEXFoundation */ = { + isa = XCSwiftPackageProductDependency; + package = CEB1E26B2CC14E9B00921517 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */; + productName = OEXFoundation; + }; +/* End XCSwiftPackageProductDependency section */ + /* Begin XCVersionGroup section */ 02A48B16295ACE200033D5E0 /* DashboardCoreModel.xcdatamodeld */ = { isa = XCVersionGroup; diff --git a/Dashboard/Dashboard/Data/DashboardRepository.swift b/Dashboard/Dashboard/Data/DashboardRepository.swift index 00fe98df7..61f9e3f41 100644 --- a/Dashboard/Dashboard/Data/DashboardRepository.swift +++ b/Dashboard/Dashboard/Data/DashboardRepository.swift @@ -7,6 +7,7 @@ import Foundation import Core +import OEXFoundation public protocol DashboardRepositoryProtocol { func getEnrollments(page: Int) async throws -> [CourseItem] diff --git a/Dashboard/Dashboard/Data/Network/DashboardEndpoint.swift b/Dashboard/Dashboard/Data/Network/DashboardEndpoint.swift index 59f379215..cfc946d95 100644 --- a/Dashboard/Dashboard/Data/Network/DashboardEndpoint.swift +++ b/Dashboard/Dashboard/Data/Network/DashboardEndpoint.swift @@ -8,6 +8,8 @@ import Foundation import Core import Alamofire +import OEXFoundation +import UIKit enum DashboardEndpoint: EndPointType { case getEnrollments(username: String, page: Int) diff --git a/Dashboard/Dashboard/Presentation/AllCoursesView.swift b/Dashboard/Dashboard/Presentation/AllCoursesView.swift index 95671a487..bdd6a6b77 100644 --- a/Dashboard/Dashboard/Presentation/AllCoursesView.swift +++ b/Dashboard/Dashboard/Presentation/AllCoursesView.swift @@ -7,6 +7,7 @@ import SwiftUI import Core +import OEXFoundation import Theme public struct AllCoursesView: View { diff --git a/Dashboard/Dashboard/Presentation/ListDashboardView.swift b/Dashboard/Dashboard/Presentation/ListDashboardView.swift index d8f356e82..d402ce41c 100644 --- a/Dashboard/Dashboard/Presentation/ListDashboardView.swift +++ b/Dashboard/Dashboard/Presentation/ListDashboardView.swift @@ -7,6 +7,7 @@ import SwiftUI import Core +import OEXFoundation import Theme public struct ListDashboardView: View { diff --git a/Dashboard/Dashboard/Presentation/PrimaryCourseDashboardView.swift b/Dashboard/Dashboard/Presentation/PrimaryCourseDashboardView.swift index 8b1a97e30..718b0ceb5 100644 --- a/Dashboard/Dashboard/Presentation/PrimaryCourseDashboardView.swift +++ b/Dashboard/Dashboard/Presentation/PrimaryCourseDashboardView.swift @@ -7,6 +7,7 @@ import SwiftUI import Core +import OEXFoundation import Theme import Swinject diff --git a/Dashboard/DashboardTests/DashboardMock.generated.swift b/Dashboard/DashboardTests/DashboardMock.generated.swift index f0dcb32d9..975fac8b3 100644 --- a/Dashboard/DashboardTests/DashboardMock.generated.swift +++ b/Dashboard/DashboardTests/DashboardMock.generated.swift @@ -13,6 +13,7 @@ import Dashboard import Foundation import SwiftUI import Combine +import OEXFoundation // MARK: - AuthInteractorProtocol @@ -1518,11 +1519,6 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { } private var __p_branch: (BranchConfig)? - public var segment: SegmentConfig { - get { invocations.append(.p_segment_get); return __p_segment ?? givenGetterValue(.p_segment_get, "ConfigProtocolMock - stub value for segment was not defined") } - } - private var __p_segment: (SegmentConfig)? - public var program: DiscoveryConfig { get { invocations.append(.p_program_get); return __p_program ?? givenGetterValue(.p_program_get, "ConfigProtocolMock - stub value for program was not defined") } } @@ -1533,11 +1529,6 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { } private var __p_URIScheme: (String)? - public var fullStory: FullStoryConfig { - get { invocations.append(.p_fullStory_get); return __p_fullStory ?? givenGetterValue(.p_fullStory_get, "ConfigProtocolMock - stub value for fullStory was not defined") } - } - private var __p_fullStory: (FullStoryConfig)? - @@ -1567,10 +1558,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { case p_dashboard_get case p_braze_get case p_branch_get - case p_segment_get case p_program_get case p_URIScheme_get - case p_fullStory_get static func compareParameters(lhs: MethodType, rhs: MethodType, matcher: Matcher) -> Matcher.ComparisonResult { switch (lhs, rhs) { case (.p_baseURL_get,.p_baseURL_get): return Matcher.ComparisonResult.match @@ -1596,10 +1585,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { case (.p_dashboard_get,.p_dashboard_get): return Matcher.ComparisonResult.match case (.p_braze_get,.p_braze_get): return Matcher.ComparisonResult.match case (.p_branch_get,.p_branch_get): return Matcher.ComparisonResult.match - case (.p_segment_get,.p_segment_get): return Matcher.ComparisonResult.match case (.p_program_get,.p_program_get): return Matcher.ComparisonResult.match case (.p_URIScheme_get,.p_URIScheme_get): return Matcher.ComparisonResult.match - case (.p_fullStory_get,.p_fullStory_get): return Matcher.ComparisonResult.match default: return .none } } @@ -1629,10 +1616,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { case .p_dashboard_get: return 0 case .p_braze_get: return 0 case .p_branch_get: return 0 - case .p_segment_get: return 0 case .p_program_get: return 0 case .p_URIScheme_get: return 0 - case .p_fullStory_get: return 0 } } func assertionName() -> String { @@ -1660,10 +1645,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { case .p_dashboard_get: return "[get] .dashboard" case .p_braze_get: return "[get] .braze" case .p_branch_get: return "[get] .branch" - case .p_segment_get: return "[get] .segment" case .p_program_get: return "[get] .program" case .p_URIScheme_get: return "[get] .URIScheme" - case .p_fullStory_get: return "[get] .fullStory" } } } @@ -1745,18 +1728,12 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { public static func branch(getter defaultValue: BranchConfig...) -> PropertyStub { return Given(method: .p_branch_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) } - public static func segment(getter defaultValue: SegmentConfig...) -> PropertyStub { - return Given(method: .p_segment_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) - } public static func program(getter defaultValue: DiscoveryConfig...) -> PropertyStub { return Given(method: .p_program_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) } public static func URIScheme(getter defaultValue: String...) -> PropertyStub { return Given(method: .p_URIScheme_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) } - public static func fullStory(getter defaultValue: FullStoryConfig...) -> PropertyStub { - return Given(method: .p_fullStory_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) - } } @@ -1786,10 +1763,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { public static var dashboard: Verify { return Verify(method: .p_dashboard_get) } public static var braze: Verify { return Verify(method: .p_braze_get) } public static var branch: Verify { return Verify(method: .p_branch_get) } - public static var segment: Verify { return Verify(method: .p_segment_get) } public static var program: Verify { return Verify(method: .p_program_get) } public static var URIScheme: Verify { return Verify(method: .p_URIScheme_get) } - public static var fullStory: Verify { return Verify(method: .p_fullStory_get) } } public struct Perform { diff --git a/Dashboard/Mockfile b/Dashboard/Mockfile index f747b41e0..276791466 100644 --- a/Dashboard/Mockfile +++ b/Dashboard/Mockfile @@ -14,4 +14,5 @@ unit.tests.mock: - Dashboard - Foundation - SwiftUI - - Combine \ No newline at end of file + - Combine + - OEXFoundation \ No newline at end of file diff --git a/Discovery/Discovery.xcodeproj/project.pbxproj b/Discovery/Discovery.xcodeproj/project.pbxproj index 9ed79ac53..8c3d40080 100644 --- a/Discovery/Discovery.xcodeproj/project.pbxproj +++ b/Discovery/Discovery.xcodeproj/project.pbxproj @@ -28,6 +28,8 @@ 1402A0CA2B61012F00A0A00B /* ProgramWebviewViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1402A0C82B61012F00A0A00B /* ProgramWebviewViewModel.swift */; }; 63C6E9CBBF5E33B8B9B4DFEC /* Pods_App_Discovery_DiscoveryUnitTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 780FC373E1D479E58870BD85 /* Pods_App_Discovery_DiscoveryUnitTests.framework */; }; 9F47BCC672941A9854404EC7 /* Pods_App_Discovery.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 919E55130969D91EF03C4C0B /* Pods_App_Discovery.framework */; }; + CE7CAF312CC155FD00E0AC9D /* OEXFoundation in Frameworks */ = {isa = PBXBuildFile; productRef = CE7CAF302CC155FD00E0AC9D /* OEXFoundation */; }; + CEB1E26A2CC14E7900921517 /* OEXFoundation in Frameworks */ = {isa = PBXBuildFile; productRef = CEB1E2692CC14E7900921517 /* OEXFoundation */; }; CFC8494C299A66080055E497 /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = CFC8494E299A66080055E497 /* Localizable.stringsdict */; }; CFC84950299BE52C0055E497 /* SearchViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFC8494F299BE52C0055E497 /* SearchViewModelTests.swift */; }; E0B9F69C2B4D57F800168366 /* SearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0B9F6962B4D57F800168366 /* SearchView.swift */; }; @@ -55,6 +57,19 @@ }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + CE7CAF332CC155FE00E0AC9D /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 022D04872976D7E100E0059B /* DiscoveryUnitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DiscoveryUnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 022D04892976D7E100E0059B /* DiscoveryViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscoveryViewModelTests.swift; sourceTree = ""; }; @@ -121,6 +136,7 @@ buildActionMask = 2147483647; files = ( 022D048B2976D7E100E0059B /* Discovery.framework in Frameworks */, + CE7CAF312CC155FD00E0AC9D /* OEXFoundation in Frameworks */, 63C6E9CBBF5E33B8B9B4DFEC /* Pods_App_Discovery_DiscoveryUnitTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -130,6 +146,7 @@ buildActionMask = 2147483647; files = ( 072787AD28D34D15002E9142 /* Core.framework in Frameworks */, + CEB1E26A2CC14E7900921517 /* OEXFoundation in Frameworks */, 9F47BCC672941A9854404EC7 /* Pods_App_Discovery.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -358,6 +375,7 @@ 022D04842976D7E100E0059B /* Frameworks */, 022D04852976D7E100E0059B /* Resources */, 7A53F60C849FA0F910D22A82 /* [CP] Copy Pods Resources */, + CE7CAF332CC155FE00E0AC9D /* Embed Frameworks */, ); buildRules = ( ); @@ -418,6 +436,9 @@ uk, ); mainGroup = 0727878F28D34C03002E9142; + packageReferences = ( + CEB1E2682CC14E7900921517 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */, + ); productRefGroup = 0727879A28D34C03002E9142 /* Products */; projectDirPath = ""; projectRoot = ""; @@ -1596,6 +1617,30 @@ }; /* End XCConfigurationList section */ +/* Begin XCRemoteSwiftPackageReference section */ + CEB1E2682CC14E7900921517 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/openedx/openedx-app-foundation-ios/"; + requirement = { + kind = exactVersion; + version = 1.0.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + CE7CAF302CC155FD00E0AC9D /* OEXFoundation */ = { + isa = XCSwiftPackageProductDependency; + package = CEB1E2682CC14E7900921517 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */; + productName = OEXFoundation; + }; + CEB1E2692CC14E7900921517 /* OEXFoundation */ = { + isa = XCSwiftPackageProductDependency; + package = CEB1E2682CC14E7900921517 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */; + productName = OEXFoundation; + }; +/* End XCSwiftPackageProductDependency section */ + /* Begin XCVersionGroup section */ 0297373E2949FB070051696B /* DiscoveryCoreModel.xcdatamodeld */ = { isa = XCVersionGroup; diff --git a/Discovery/Discovery/Data/DiscoveryRepository.swift b/Discovery/Discovery/Data/DiscoveryRepository.swift index fd2121693..aa0b71978 100644 --- a/Discovery/Discovery/Data/DiscoveryRepository.swift +++ b/Discovery/Discovery/Data/DiscoveryRepository.swift @@ -7,6 +7,7 @@ import Foundation import Core +import OEXFoundation import CoreData import Alamofire diff --git a/Discovery/Discovery/Data/Network/DiscoveryEndpoint.swift b/Discovery/Discovery/Data/Network/DiscoveryEndpoint.swift index 957f03112..2d111b847 100644 --- a/Discovery/Discovery/Data/Network/DiscoveryEndpoint.swift +++ b/Discovery/Discovery/Data/Network/DiscoveryEndpoint.swift @@ -7,6 +7,7 @@ import Foundation import Core +import OEXFoundation import Alamofire enum DiscoveryEndpoint: EndPointType { diff --git a/Discovery/Discovery/Presentation/DiscoveryAnalytics.swift b/Discovery/Discovery/Presentation/DiscoveryAnalytics.swift index db2119038..d5c722bd3 100644 --- a/Discovery/Discovery/Presentation/DiscoveryAnalytics.swift +++ b/Discovery/Discovery/Presentation/DiscoveryAnalytics.swift @@ -7,6 +7,7 @@ import Foundation import Core +import OEXFoundation //sourcery: AutoMockable public protocol DiscoveryAnalytics { diff --git a/Discovery/Discovery/Presentation/NativeDiscovery/CourseDetailsView.swift b/Discovery/Discovery/Presentation/NativeDiscovery/CourseDetailsView.swift index d5bc80704..10c03ab40 100644 --- a/Discovery/Discovery/Presentation/NativeDiscovery/CourseDetailsView.swift +++ b/Discovery/Discovery/Presentation/NativeDiscovery/CourseDetailsView.swift @@ -7,6 +7,7 @@ import SwiftUI import Core +import OEXFoundation import Kingfisher import WebKit import Theme diff --git a/Discovery/Discovery/Presentation/NativeDiscovery/DiscoveryView.swift b/Discovery/Discovery/Presentation/NativeDiscovery/DiscoveryView.swift index 735abc4fb..b92770c28 100644 --- a/Discovery/Discovery/Presentation/NativeDiscovery/DiscoveryView.swift +++ b/Discovery/Discovery/Presentation/NativeDiscovery/DiscoveryView.swift @@ -7,6 +7,7 @@ import SwiftUI import Core +import OEXFoundation import Theme public struct DiscoveryView: View { diff --git a/Discovery/Discovery/Presentation/NativeDiscovery/SearchView.swift b/Discovery/Discovery/Presentation/NativeDiscovery/SearchView.swift index 531a7db3e..b2f8ef371 100644 --- a/Discovery/Discovery/Presentation/NativeDiscovery/SearchView.swift +++ b/Discovery/Discovery/Presentation/NativeDiscovery/SearchView.swift @@ -7,6 +7,7 @@ import SwiftUI import Core +import OEXFoundation import Theme public struct SearchView: View { diff --git a/Discovery/Discovery/Presentation/WebDiscovery/DiscoveryURIDetails.swift b/Discovery/Discovery/Presentation/WebDiscovery/DiscoveryURIDetails.swift index 2fa9071bd..08310d9b8 100644 --- a/Discovery/Discovery/Presentation/WebDiscovery/DiscoveryURIDetails.swift +++ b/Discovery/Discovery/Presentation/WebDiscovery/DiscoveryURIDetails.swift @@ -7,6 +7,7 @@ import Foundation import Core +import OEXFoundation // Define your uri scheme public enum URIString: String { diff --git a/Discovery/Discovery/Presentation/WebDiscovery/DiscoveryWebview.swift b/Discovery/Discovery/Presentation/WebDiscovery/DiscoveryWebview.swift index d67351713..14f5395e9 100644 --- a/Discovery/Discovery/Presentation/WebDiscovery/DiscoveryWebview.swift +++ b/Discovery/Discovery/Presentation/WebDiscovery/DiscoveryWebview.swift @@ -9,6 +9,7 @@ import Foundation import SwiftUI import Theme import Core +import OEXFoundation public enum DiscoveryWebviewType: Equatable { case discovery diff --git a/Discovery/Discovery/Presentation/WebPrograms/ProgramWebviewView.swift b/Discovery/Discovery/Presentation/WebPrograms/ProgramWebviewView.swift index 52a9ee7de..5f5078238 100644 --- a/Discovery/Discovery/Presentation/WebPrograms/ProgramWebviewView.swift +++ b/Discovery/Discovery/Presentation/WebPrograms/ProgramWebviewView.swift @@ -9,6 +9,7 @@ import Foundation import SwiftUI import Theme import Core +import OEXFoundation public enum ProgramViewType: String, Equatable { case program diff --git a/Discovery/DiscoveryTests/DiscoveryMock.generated.swift b/Discovery/DiscoveryTests/DiscoveryMock.generated.swift index 21cd06ec0..285c4e619 100644 --- a/Discovery/DiscoveryTests/DiscoveryMock.generated.swift +++ b/Discovery/DiscoveryTests/DiscoveryMock.generated.swift @@ -13,6 +13,7 @@ import Discovery import Foundation import SwiftUI import Combine +import OEXFoundation // MARK: - AuthInteractorProtocol @@ -1518,11 +1519,6 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { } private var __p_branch: (BranchConfig)? - public var segment: SegmentConfig { - get { invocations.append(.p_segment_get); return __p_segment ?? givenGetterValue(.p_segment_get, "ConfigProtocolMock - stub value for segment was not defined") } - } - private var __p_segment: (SegmentConfig)? - public var program: DiscoveryConfig { get { invocations.append(.p_program_get); return __p_program ?? givenGetterValue(.p_program_get, "ConfigProtocolMock - stub value for program was not defined") } } @@ -1533,11 +1529,6 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { } private var __p_URIScheme: (String)? - public var fullStory: FullStoryConfig { - get { invocations.append(.p_fullStory_get); return __p_fullStory ?? givenGetterValue(.p_fullStory_get, "ConfigProtocolMock - stub value for fullStory was not defined") } - } - private var __p_fullStory: (FullStoryConfig)? - @@ -1567,10 +1558,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { case p_dashboard_get case p_braze_get case p_branch_get - case p_segment_get case p_program_get case p_URIScheme_get - case p_fullStory_get static func compareParameters(lhs: MethodType, rhs: MethodType, matcher: Matcher) -> Matcher.ComparisonResult { switch (lhs, rhs) { case (.p_baseURL_get,.p_baseURL_get): return Matcher.ComparisonResult.match @@ -1596,10 +1585,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { case (.p_dashboard_get,.p_dashboard_get): return Matcher.ComparisonResult.match case (.p_braze_get,.p_braze_get): return Matcher.ComparisonResult.match case (.p_branch_get,.p_branch_get): return Matcher.ComparisonResult.match - case (.p_segment_get,.p_segment_get): return Matcher.ComparisonResult.match case (.p_program_get,.p_program_get): return Matcher.ComparisonResult.match case (.p_URIScheme_get,.p_URIScheme_get): return Matcher.ComparisonResult.match - case (.p_fullStory_get,.p_fullStory_get): return Matcher.ComparisonResult.match default: return .none } } @@ -1629,10 +1616,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { case .p_dashboard_get: return 0 case .p_braze_get: return 0 case .p_branch_get: return 0 - case .p_segment_get: return 0 case .p_program_get: return 0 case .p_URIScheme_get: return 0 - case .p_fullStory_get: return 0 } } func assertionName() -> String { @@ -1660,10 +1645,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { case .p_dashboard_get: return "[get] .dashboard" case .p_braze_get: return "[get] .braze" case .p_branch_get: return "[get] .branch" - case .p_segment_get: return "[get] .segment" case .p_program_get: return "[get] .program" case .p_URIScheme_get: return "[get] .URIScheme" - case .p_fullStory_get: return "[get] .fullStory" } } } @@ -1745,18 +1728,12 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { public static func branch(getter defaultValue: BranchConfig...) -> PropertyStub { return Given(method: .p_branch_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) } - public static func segment(getter defaultValue: SegmentConfig...) -> PropertyStub { - return Given(method: .p_segment_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) - } public static func program(getter defaultValue: DiscoveryConfig...) -> PropertyStub { return Given(method: .p_program_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) } public static func URIScheme(getter defaultValue: String...) -> PropertyStub { return Given(method: .p_URIScheme_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) } - public static func fullStory(getter defaultValue: FullStoryConfig...) -> PropertyStub { - return Given(method: .p_fullStory_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) - } } @@ -1786,10 +1763,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { public static var dashboard: Verify { return Verify(method: .p_dashboard_get) } public static var braze: Verify { return Verify(method: .p_braze_get) } public static var branch: Verify { return Verify(method: .p_branch_get) } - public static var segment: Verify { return Verify(method: .p_segment_get) } public static var program: Verify { return Verify(method: .p_program_get) } public static var URIScheme: Verify { return Verify(method: .p_URIScheme_get) } - public static var fullStory: Verify { return Verify(method: .p_fullStory_get) } } public struct Perform { diff --git a/Discovery/Mockfile b/Discovery/Mockfile index 638dccd32..dcd8b112b 100644 --- a/Discovery/Mockfile +++ b/Discovery/Mockfile @@ -14,4 +14,5 @@ unit.tests.mock: - Discovery - Foundation - SwiftUI - - Combine \ No newline at end of file + - Combine + - OEXFoundation \ No newline at end of file diff --git a/Discussion/Discussion.xcodeproj/project.pbxproj b/Discussion/Discussion.xcodeproj/project.pbxproj index a1b57703d..c0ee0a64c 100644 --- a/Discussion/Discussion.xcodeproj/project.pbxproj +++ b/Discussion/Discussion.xcodeproj/project.pbxproj @@ -60,6 +60,8 @@ 9FC0EF907C0334E383C300C4 /* Pods_App_Discussion_DiscussionTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C40A586C6164140DC2079231 /* Pods_App_Discussion_DiscussionTests.framework */; }; BA3C45672BA9E13000672C96 /* Data_DiscussionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA3C45662BA9E13000672C96 /* Data_DiscussionInfo.swift */; }; BA3C45692BA9E18D00672C96 /* DiscussionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA3C45682BA9E18D00672C96 /* DiscussionInfo.swift */; }; + CE7CAF472CC1566D00E0AC9D /* OEXFoundation in Frameworks */ = {isa = PBXBuildFile; productRef = CE7CAF462CC1566D00E0AC9D /* OEXFoundation */; }; + CEB1E2762CC14ED700921517 /* OEXFoundation in Frameworks */ = {isa = PBXBuildFile; productRef = CEB1E2752CC14ED700921517 /* OEXFoundation */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -72,6 +74,29 @@ }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + CE7CAF452CC1564E00E0AC9D /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + CE7CAF492CC1566D00E0AC9D /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 0201771B29883E96003AC5EF /* ThreadViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreadViewModelTests.swift; sourceTree = ""; }; 020767652989393200B976DE /* ResponsesViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResponsesViewModelTests.swift; sourceTree = ""; }; @@ -152,6 +177,7 @@ buildActionMask = 2147483647; files = ( 0218195928F7347200202564 /* Core.framework in Frameworks */, + CEB1E2762CC14ED700921517 /* OEXFoundation in Frameworks */, 7527943BE0D66C33B167A41A /* Pods_App_Discussion.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -161,6 +187,7 @@ buildActionMask = 2147483647; files = ( 0240D8D32987FE1F003CFE50 /* Discussion.framework in Frameworks */, + CE7CAF472CC1566D00E0AC9D /* OEXFoundation in Frameworks */, 9FC0EF907C0334E383C300C4 /* Pods_App_Discussion_DiscussionTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -485,6 +512,7 @@ 0218194928F7344A00202564 /* Sources */, 0218194A28F7344A00202564 /* Frameworks */, 0218194B28F7344A00202564 /* Resources */, + CE7CAF452CC1564E00E0AC9D /* Embed Frameworks */, ); buildRules = ( ); @@ -504,6 +532,7 @@ 0240D8CC2987FE1F003CFE50 /* Frameworks */, 0240D8CD2987FE1F003CFE50 /* Resources */, 3607DC97DFD36C230ED0AB74 /* [CP] Copy Pods Resources */, + CE7CAF492CC1566D00E0AC9D /* Embed Frameworks */, ); buildRules = ( ); @@ -544,6 +573,9 @@ uk, ); mainGroup = 0218194328F7344A00202564; + packageReferences = ( + CEB1E2742CC14ED700921517 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */, + ); productRefGroup = 0218194E28F7344A00202564 /* Products */; projectDirPath = ""; projectRoot = ""; @@ -1721,6 +1753,30 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + CEB1E2742CC14ED700921517 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/openedx/openedx-app-foundation-ios/"; + requirement = { + kind = exactVersion; + version = 1.0.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + CE7CAF462CC1566D00E0AC9D /* OEXFoundation */ = { + isa = XCSwiftPackageProductDependency; + package = CEB1E2742CC14ED700921517 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */; + productName = OEXFoundation; + }; + CEB1E2752CC14ED700921517 /* OEXFoundation */ = { + isa = XCSwiftPackageProductDependency; + package = CEB1E2742CC14ED700921517 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */; + productName = OEXFoundation; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = 0218194428F7344A00202564 /* Project object */; } diff --git a/Discussion/Discussion/Data/Network/DiscussionEndpoint.swift b/Discussion/Discussion/Data/Network/DiscussionEndpoint.swift index 1d433aa9b..efa48f022 100644 --- a/Discussion/Discussion/Data/Network/DiscussionEndpoint.swift +++ b/Discussion/Discussion/Data/Network/DiscussionEndpoint.swift @@ -7,6 +7,7 @@ import Foundation import Core +import OEXFoundation import Alamofire enum DiscussionEndpoint: EndPointType { diff --git a/Discussion/Discussion/Data/Network/DiscussionRepository.swift b/Discussion/Discussion/Data/Network/DiscussionRepository.swift index 661ae603f..ce8b8170a 100644 --- a/Discussion/Discussion/Data/Network/DiscussionRepository.swift +++ b/Discussion/Discussion/Data/Network/DiscussionRepository.swift @@ -7,6 +7,7 @@ import Foundation import Core +import OEXFoundation import Combine public protocol DiscussionRepositoryProtocol { diff --git a/Discussion/Discussion/Presentation/Comments/Responses/ResponsesView.swift b/Discussion/Discussion/Presentation/Comments/Responses/ResponsesView.swift index 6118d2172..99c677cd2 100644 --- a/Discussion/Discussion/Presentation/Comments/Responses/ResponsesView.swift +++ b/Discussion/Discussion/Presentation/Comments/Responses/ResponsesView.swift @@ -9,6 +9,7 @@ import SwiftUI import Core import Combine import Theme +import OEXFoundation public struct ResponsesView: View { diff --git a/Discussion/Discussion/Presentation/Comments/Thread/ThreadView.swift b/Discussion/Discussion/Presentation/Comments/Thread/ThreadView.swift index 0dbc40a3b..6b6d7a689 100644 --- a/Discussion/Discussion/Presentation/Comments/Thread/ThreadView.swift +++ b/Discussion/Discussion/Presentation/Comments/Thread/ThreadView.swift @@ -7,6 +7,7 @@ import SwiftUI import Core +import OEXFoundation import Theme public struct ThreadView: View { diff --git a/Discussion/Discussion/Presentation/DiscussionTopics/DiscussionSearchTopicsView.swift b/Discussion/Discussion/Presentation/DiscussionTopics/DiscussionSearchTopicsView.swift index 440666e85..e92727f89 100644 --- a/Discussion/Discussion/Presentation/DiscussionTopics/DiscussionSearchTopicsView.swift +++ b/Discussion/Discussion/Presentation/DiscussionTopics/DiscussionSearchTopicsView.swift @@ -7,6 +7,7 @@ import SwiftUI import Core +import OEXFoundation import Theme public struct DiscussionSearchTopicsView: View { diff --git a/Discussion/DiscussionTests/DiscussionMock.generated.swift b/Discussion/DiscussionTests/DiscussionMock.generated.swift index e3a6b6361..dbe21843f 100644 --- a/Discussion/DiscussionTests/DiscussionMock.generated.swift +++ b/Discussion/DiscussionTests/DiscussionMock.generated.swift @@ -13,6 +13,7 @@ import Discussion import Foundation import SwiftUI import Combine +import OEXFoundation // MARK: - AuthInteractorProtocol @@ -1518,11 +1519,6 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { } private var __p_branch: (BranchConfig)? - public var segment: SegmentConfig { - get { invocations.append(.p_segment_get); return __p_segment ?? givenGetterValue(.p_segment_get, "ConfigProtocolMock - stub value for segment was not defined") } - } - private var __p_segment: (SegmentConfig)? - public var program: DiscoveryConfig { get { invocations.append(.p_program_get); return __p_program ?? givenGetterValue(.p_program_get, "ConfigProtocolMock - stub value for program was not defined") } } @@ -1533,11 +1529,6 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { } private var __p_URIScheme: (String)? - public var fullStory: FullStoryConfig { - get { invocations.append(.p_fullStory_get); return __p_fullStory ?? givenGetterValue(.p_fullStory_get, "ConfigProtocolMock - stub value for fullStory was not defined") } - } - private var __p_fullStory: (FullStoryConfig)? - @@ -1567,10 +1558,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { case p_dashboard_get case p_braze_get case p_branch_get - case p_segment_get case p_program_get case p_URIScheme_get - case p_fullStory_get static func compareParameters(lhs: MethodType, rhs: MethodType, matcher: Matcher) -> Matcher.ComparisonResult { switch (lhs, rhs) { case (.p_baseURL_get,.p_baseURL_get): return Matcher.ComparisonResult.match @@ -1596,10 +1585,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { case (.p_dashboard_get,.p_dashboard_get): return Matcher.ComparisonResult.match case (.p_braze_get,.p_braze_get): return Matcher.ComparisonResult.match case (.p_branch_get,.p_branch_get): return Matcher.ComparisonResult.match - case (.p_segment_get,.p_segment_get): return Matcher.ComparisonResult.match case (.p_program_get,.p_program_get): return Matcher.ComparisonResult.match case (.p_URIScheme_get,.p_URIScheme_get): return Matcher.ComparisonResult.match - case (.p_fullStory_get,.p_fullStory_get): return Matcher.ComparisonResult.match default: return .none } } @@ -1629,10 +1616,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { case .p_dashboard_get: return 0 case .p_braze_get: return 0 case .p_branch_get: return 0 - case .p_segment_get: return 0 case .p_program_get: return 0 case .p_URIScheme_get: return 0 - case .p_fullStory_get: return 0 } } func assertionName() -> String { @@ -1660,10 +1645,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { case .p_dashboard_get: return "[get] .dashboard" case .p_braze_get: return "[get] .braze" case .p_branch_get: return "[get] .branch" - case .p_segment_get: return "[get] .segment" case .p_program_get: return "[get] .program" case .p_URIScheme_get: return "[get] .URIScheme" - case .p_fullStory_get: return "[get] .fullStory" } } } @@ -1745,18 +1728,12 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { public static func branch(getter defaultValue: BranchConfig...) -> PropertyStub { return Given(method: .p_branch_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) } - public static func segment(getter defaultValue: SegmentConfig...) -> PropertyStub { - return Given(method: .p_segment_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) - } public static func program(getter defaultValue: DiscoveryConfig...) -> PropertyStub { return Given(method: .p_program_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) } public static func URIScheme(getter defaultValue: String...) -> PropertyStub { return Given(method: .p_URIScheme_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) } - public static func fullStory(getter defaultValue: FullStoryConfig...) -> PropertyStub { - return Given(method: .p_fullStory_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) - } } @@ -1786,10 +1763,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { public static var dashboard: Verify { return Verify(method: .p_dashboard_get) } public static var braze: Verify { return Verify(method: .p_braze_get) } public static var branch: Verify { return Verify(method: .p_branch_get) } - public static var segment: Verify { return Verify(method: .p_segment_get) } public static var program: Verify { return Verify(method: .p_program_get) } public static var URIScheme: Verify { return Verify(method: .p_URIScheme_get) } - public static var fullStory: Verify { return Verify(method: .p_fullStory_get) } } public struct Perform { diff --git a/Discussion/Mockfile b/Discussion/Mockfile index dc4c39594..b7eb63e2f 100644 --- a/Discussion/Mockfile +++ b/Discussion/Mockfile @@ -14,4 +14,5 @@ unit.tests.mock: - Discussion - Foundation - SwiftUI - - Combine \ No newline at end of file + - Combine + - OEXFoundation \ No newline at end of file diff --git a/OpenEdX.xcodeproj/project.pbxproj b/OpenEdX.xcodeproj/project.pbxproj index 0d103570a..464e642a1 100644 --- a/OpenEdX.xcodeproj/project.pbxproj +++ b/OpenEdX.xcodeproj/project.pbxproj @@ -41,34 +41,29 @@ 0770DE4C28D0A462006D8A5D /* Authorization.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 0770DE4A28D0A462006D8A5D /* Authorization.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 0770DE5028D0A707006D8A5D /* NetworkAssembly.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0770DE4F28D0A707006D8A5D /* NetworkAssembly.swift */; }; 0770DE6428D0BCC7006D8A5D /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0770DE6628D0BCC7006D8A5D /* Localizable.strings */; }; - 0780ABE32BFBA2E40093A4A6 /* FirebaseAnalytics in Frameworks */ = {isa = PBXBuildFile; productRef = 0780ABE22BFBA2E40093A4A6 /* FirebaseAnalytics */; }; - 0780ABE52BFBA2E40093A4A6 /* FirebaseMessaging in Frameworks */ = {isa = PBXBuildFile; productRef = 0780ABE42BFBA2E40093A4A6 /* FirebaseMessaging */; }; 0780ABE82BFCA1530093A4A6 /* NotificationsEndpoints.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0780ABE72BFCA1530093A4A6 /* NotificationsEndpoints.swift */; }; 07A7D78F28F5C9060000BE81 /* Core.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 07A7D78E28F5C9060000BE81 /* Core.framework */; }; 07A7D79028F5C9060000BE81 /* Core.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 07A7D78E28F5C9060000BE81 /* Core.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 07D5DA3528D075AA00752FD9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07D5DA3428D075AA00752FD9 /* AppDelegate.swift */; }; 07D5DA3E28D075AB00752FD9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 07D5DA3D28D075AB00752FD9 /* Assets.xcassets */; }; 149FF39E2B9F1AB50034B33F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 149FF39C2B9F1AB50034B33F /* LaunchScreen.storyboard */; }; - 14D912D32C25483F0077CCCE /* FullStory in Frameworks */ = {isa = PBXBuildFile; productRef = 14D912D22C25483F0077CCCE /* FullStory */; }; - 14D912D72C2551F60077CCCE /* FullStoryAnalyticsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14D912D62C2551F60077CCCE /* FullStoryAnalyticsService.swift */; }; 1924EDE8164C7AB17AD4946B /* Pods_App_OpenEdX.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FC49621A0942E5EE74BDC895 /* Pods_App_OpenEdX.framework */; }; A500668B2B613ED10024680B /* PushNotificationsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A500668A2B613ED10024680B /* PushNotificationsManager.swift */; }; A500668D2B6143000024680B /* FCMProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = A500668C2B6143000024680B /* FCMProvider.swift */; }; A50066912B61467B0024680B /* BrazeProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50066902B61467B0024680B /* BrazeProvider.swift */; }; A50066932B614DCD0024680B /* FCMListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50066922B614DCD0024680B /* FCMListener.swift */; }; A50066952B614DEF0024680B /* BrazeListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50066942B614DEF0024680B /* BrazeListener.swift */; }; - A51CDBED2B6D2BEE009B6D4E /* SegmentBraze in Frameworks */ = {isa = PBXBuildFile; productRef = A51CDBEC2B6D2BEE009B6D4E /* SegmentBraze */; }; - A51CDBEF2B6D2BEE009B6D4E /* SegmentBrazeUI in Frameworks */ = {isa = PBXBuildFile; productRef = A51CDBEE2B6D2BEE009B6D4E /* SegmentBrazeUI */; }; A5462D9C2B864AE0003B96A5 /* BranchService.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5462D9B2B864AE0003B96A5 /* BranchService.swift */; }; - A5462D9F2B865713003B96A5 /* Segment in Frameworks */ = {isa = PBXBuildFile; productRef = A5462D9E2B865713003B96A5 /* Segment */; }; A59568952B61630500ED4F90 /* DeepLinkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A59568942B61630500ED4F90 /* DeepLinkManager.swift */; }; A59568972B61653700ED4F90 /* DeepLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = A59568962B61653700ED4F90 /* DeepLink.swift */; }; A59568992B616D9400ED4F90 /* PushLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = A59568982B616D9400ED4F90 /* PushLink.swift */; }; - A59702292B83C87900CA064C /* FirebaseAnalyticsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = A59702282B83C87900CA064C /* FirebaseAnalyticsService.swift */; }; - A5BD3E302B83B0F7006A8983 /* SegmentFirebase in Frameworks */ = {isa = PBXBuildFile; productRef = A5BD3E2F2B83B0F7006A8983 /* SegmentFirebase */; }; - A5C10D8F2B861A70008E864D /* SegmentAnalyticsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5C10D8E2B861A70008E864D /* SegmentAnalyticsService.swift */; }; - BA3042792B1F7147009B64B7 /* MSAL in Frameworks */ = {isa = PBXBuildFile; productRef = BA3042782B1F7147009B64B7 /* MSAL */; }; BA7468762B96201D00793145 /* DeepLinkRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA7468752B96201D00793145 /* DeepLinkRouter.swift */; }; + CE0BF0BA2CD9203A00D10289 /* MSAL in Frameworks */ = {isa = PBXBuildFile; productRef = CE0BF0B92CD9203A00D10289 /* MSAL */; }; + CE3BD14E2CBEB0DA0026F4E3 /* PluginManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE3BD14D2CBEB0DA0026F4E3 /* PluginManager.swift */; }; + CE5712792CD1099B00D4AB17 /* OEXFirebaseAnalytics in Frameworks */ = {isa = PBXBuildFile; productRef = CE5712782CD1099B00D4AB17 /* OEXFirebaseAnalytics */; }; + CE57127A2CD109A800D4AB17 /* OEXFoundation in Embed Frameworks */ = {isa = PBXBuildFile; productRef = CE9C07D72CD104E5009C44D1 /* OEXFoundation */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + CE924BE72CD8FAB3000137CA /* FirebaseMessaging in Frameworks */ = {isa = PBXBuildFile; productRef = CE924BE62CD8FAB3000137CA /* FirebaseMessaging */; }; + CE9C07D82CD104E5009C44D1 /* OEXFoundation in Frameworks */ = {isa = PBXBuildFile; productRef = CE9C07D72CD104E5009C44D1 /* OEXFoundation */; }; E0D6E6A32B1626B10089F9C9 /* Theme.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E0D6E6A22B1626B10089F9C9 /* Theme.framework */; }; E0D6E6A42B1626D60089F9C9 /* Theme.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = E0D6E6A22B1626B10089F9C9 /* Theme.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; /* End PBXBuildFile section */ @@ -84,6 +79,7 @@ 072787B228D34D83002E9142 /* Discovery.framework in Embed Frameworks */, 0218196528F734FA00202564 /* Discussion.framework in Embed Frameworks */, 07A7D79028F5C9060000BE81 /* Core.framework in Embed Frameworks */, + CE57127A2CD109A800D4AB17 /* OEXFoundation in Embed Frameworks */, 0770DE4C28D0A462006D8A5D /* Authorization.framework in Embed Frameworks */, 0219C67828F4347600D64452 /* Course.framework in Embed Frameworks */, 025DE1A528DB4DAE0053E0F4 /* Profile.framework in Embed Frameworks */, @@ -136,7 +132,6 @@ 07D5DA3428D075AA00752FD9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 07D5DA3D28D075AB00752FD9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 149FF39D2B9F1AB50034B33F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 14D912D62C2551F60077CCCE /* FullStoryAnalyticsService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FullStoryAnalyticsService.swift; sourceTree = ""; }; 1BB1F1D0FABF8788646FBAF2 /* Pods-App-OpenEdX.debugstage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-OpenEdX.debugstage.xcconfig"; path = "Target Support Files/Pods-App-OpenEdX/Pods-App-OpenEdX.debugstage.xcconfig"; sourceTree = ""; }; 37C50995093E34142FDE0ED9 /* Pods-App-OpenEdX.releasedev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-OpenEdX.releasedev.xcconfig"; path = "Target Support Files/Pods-App-OpenEdX/Pods-App-OpenEdX.releasedev.xcconfig"; sourceTree = ""; }; A500668A2B613ED10024680B /* PushNotificationsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PushNotificationsManager.swift; sourceTree = ""; }; @@ -148,11 +143,10 @@ A59568942B61630500ED4F90 /* DeepLinkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeepLinkManager.swift; sourceTree = ""; }; A59568962B61653700ED4F90 /* DeepLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeepLink.swift; sourceTree = ""; }; A59568982B616D9400ED4F90 /* PushLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PushLink.swift; sourceTree = ""; }; - A59702282B83C87900CA064C /* FirebaseAnalyticsService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseAnalyticsService.swift; sourceTree = ""; }; - A5C10D8E2B861A70008E864D /* SegmentAnalyticsService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SegmentAnalyticsService.swift; sourceTree = ""; }; A681C3929FC384F83BCB6648 /* Pods-App-OpenEdX.debugprod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-OpenEdX.debugprod.xcconfig"; path = "Target Support Files/Pods-App-OpenEdX/Pods-App-OpenEdX.debugprod.xcconfig"; sourceTree = ""; }; AA8BE99557031F3F33F8037C /* Pods-App-OpenEdX.releasestage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-OpenEdX.releasestage.xcconfig"; path = "Target Support Files/Pods-App-OpenEdX/Pods-App-OpenEdX.releasestage.xcconfig"; sourceTree = ""; }; BA7468752B96201D00793145 /* DeepLinkRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeepLinkRouter.swift; sourceTree = ""; }; + CE3BD14D2CBEB0DA0026F4E3 /* PluginManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PluginManager.swift; sourceTree = ""; }; DAD1882A21DDAF1F67E4C546 /* Pods-App-OpenEdX.debugdev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-OpenEdX.debugdev.xcconfig"; path = "Target Support Files/Pods-App-OpenEdX/Pods-App-OpenEdX.debugdev.xcconfig"; sourceTree = ""; }; E0D6E6A22B1626B10089F9C9 /* Theme.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Theme.framework; sourceTree = BUILT_PRODUCTS_DIR; }; FC49621A0942E5EE74BDC895 /* Pods_App_OpenEdX.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_App_OpenEdX.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -165,22 +159,18 @@ buildActionMask = 2147483647; files = ( E0D6E6A32B1626B10089F9C9 /* Theme.framework in Frameworks */, + CE5712792CD1099B00D4AB17 /* OEXFirebaseAnalytics in Frameworks */, 07A7D78F28F5C9060000BE81 /* Core.framework in Frameworks */, 028A37362ADFF404008CA604 /* WhatsNew.framework in Frameworks */, + CE9C07D82CD104E5009C44D1 /* OEXFoundation in Frameworks */, + CE0BF0BA2CD9203A00D10289 /* MSAL in Frameworks */, 025DE1A428DB4DAE0053E0F4 /* Profile.framework in Frameworks */, 0770DE4B28D0A462006D8A5D /* Authorization.framework in Frameworks */, - BA3042792B1F7147009B64B7 /* MSAL in Frameworks */, - A5462D9F2B865713003B96A5 /* Segment in Frameworks */, 072787B128D34D83002E9142 /* Discovery.framework in Frameworks */, + CE924BE72CD8FAB3000137CA /* FirebaseMessaging in Frameworks */, 0218196428F734FA00202564 /* Discussion.framework in Frameworks */, - 0780ABE52BFBA2E40093A4A6 /* FirebaseMessaging in Frameworks */, 0219C67728F4347600D64452 /* Course.framework in Frameworks */, - 0780ABE32BFBA2E40093A4A6 /* FirebaseAnalytics in Frameworks */, 027DB33028D8A063002B6862 /* Dashboard.framework in Frameworks */, - A5BD3E302B83B0F7006A8983 /* SegmentFirebase in Frameworks */, - A51CDBED2B6D2BEE009B6D4E /* SegmentBraze in Frameworks */, - 14D912D32C25483F0077CCCE /* FullStory in Frameworks */, - A51CDBEF2B6D2BEE009B6D4E /* SegmentBrazeUI in Frameworks */, 1924EDE8164C7AB17AD4946B /* Pods_App_OpenEdX.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -269,14 +259,6 @@ path = OpenEdX; sourceTree = ""; }; - 14D912D52C2551CE0077CCCE /* FullStoryAnalyticsService */ = { - isa = PBXGroup; - children = ( - 14D912D62C2551F60077CCCE /* FullStoryAnalyticsService.swift */, - ); - path = FullStoryAnalyticsService; - sourceTree = ""; - }; 4E6FB43543890E90BB88D64D /* Frameworks */ = { isa = PBXGroup; children = ( @@ -327,9 +309,7 @@ A59568932B6162E400ED4F90 /* DeepLinkManager */, A50066872B613E4B0024680B /* PushNotificationsManager */, A50066892B613E990024680B /* AnalyticsManager */, - A59702272B83C84800CA064C /* FirebaseAnalyticsService */, - A5C10D8D2B861A56008E864D /* SegmentAnalyticsService */, - 14D912D52C2551CE0077CCCE /* FullStoryAnalyticsService */, + CE3BD14D2CBEB0DA0026F4E3 /* PluginManager.swift */, ); path = Managers; sourceTree = ""; @@ -381,22 +361,6 @@ path = Link; sourceTree = ""; }; - A59702272B83C84800CA064C /* FirebaseAnalyticsService */ = { - isa = PBXGroup; - children = ( - A59702282B83C87900CA064C /* FirebaseAnalyticsService.swift */, - ); - path = FirebaseAnalyticsService; - sourceTree = ""; - }; - A5C10D8D2B861A56008E864D /* SegmentAnalyticsService */ = { - isa = PBXGroup; - children = ( - A5C10D8E2B861A70008E864D /* SegmentAnalyticsService.swift */, - ); - path = SegmentAnalyticsService; - sourceTree = ""; - }; A5F46FD02B692B140003EEEF /* Services */ = { isa = PBXGroup; children = ( @@ -428,7 +392,6 @@ 0770DE1528D07845006D8A5D /* Embed Frameworks */, DB97C0542B002EF00035C36F /* Process Config */, 02F175442A4E3B320019CD70 /* FirebaseCrashlytics */, - 14D912D42C25493C0077CCCE /* Run FullStory Asset Uploader */, ); buildRules = ( ); @@ -436,14 +399,10 @@ ); name = OpenEdX; packageProductDependencies = ( - BA3042782B1F7147009B64B7 /* MSAL */, - A51CDBEC2B6D2BEE009B6D4E /* SegmentBraze */, - A51CDBEE2B6D2BEE009B6D4E /* SegmentBrazeUI */, - A5BD3E2F2B83B0F7006A8983 /* SegmentFirebase */, - A5462D9E2B865713003B96A5 /* Segment */, - 0780ABE22BFBA2E40093A4A6 /* FirebaseAnalytics */, - 0780ABE42BFBA2E40093A4A6 /* FirebaseMessaging */, - 14D912D22C25483F0077CCCE /* FullStory */, + CE9C07D72CD104E5009C44D1 /* OEXFoundation */, + CE5712782CD1099B00D4AB17 /* OEXFirebaseAnalytics */, + CE924BE62CD8FAB3000137CA /* FirebaseMessaging */, + CE0BF0B92CD9203A00D10289 /* MSAL */, ); productName = OpenEdX; productReference = 07D5DA3128D075AA00752FD9 /* OpenEdX.app */; @@ -475,12 +434,10 @@ ); mainGroup = 07D5DA2828D075AA00752FD9; packageReferences = ( - BA3042772B1F7147009B64B7 /* XCRemoteSwiftPackageReference "microsoft-authentication-library-for-objc" */, - A51CDBEB2B6D2BEE009B6D4E /* XCRemoteSwiftPackageReference "braze-segment-swift" */, - A5BD3E2E2B83B0F7006A8983 /* XCRemoteSwiftPackageReference "analytics-swift-firebase" */, - A5462D9D2B865713003B96A5 /* XCRemoteSwiftPackageReference "analytics-swift" */, - 0780ABE12BFBA2E40093A4A6 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */, - 14D912D12C25483F0077CCCE /* XCRemoteSwiftPackageReference "fullstory-swift-package-ios" */, + CE9C07D62CD104E5009C44D1 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */, + CE9C07D92CD10581009C44D1 /* XCRemoteSwiftPackageReference "openedx-app-firebase-analytics-ios" */, + CE924BE52CD8FAB3000137CA /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */, + CE0BF0B82CD9203A00D10289 /* XCRemoteSwiftPackageReference "microsoft-authentication-library-for-objc" */, ); productRefGroup = 07D5DA3228D075AA00752FD9 /* Products */; projectDirPath = ""; @@ -548,24 +505,6 @@ shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/SwiftLint/swiftlint\"\n"; }; - 14D912D42C25493C0077CCCE /* Run FullStory Asset Uploader */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - name = "Run FullStory Asset Uploader"; - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if [\"$ FULLSTORY_ENABLED\" = \"YES\"]; then\n \"${PODS_ROOT}/FullStory/tools/FullStoryCommandLine\" \"${CONFIGURATION_BUILD_DIR}/${WRAPPER_NAME}\"\nfi\n"; - }; B9442FD26CE9A85A43FC2CFA /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -630,21 +569,19 @@ 0770DE1E28D084E8006D8A5D /* AppAssembly.swift in Sources */, A5462D9C2B864AE0003B96A5 /* BranchService.swift in Sources */, A50066932B614DCD0024680B /* FCMListener.swift in Sources */, - A59702292B83C87900CA064C /* FirebaseAnalyticsService.swift in Sources */, A500668D2B6143000024680B /* FCMProvider.swift in Sources */, 025AD4AC2A6FB95C00AB8FA7 /* DatabaseManager.swift in Sources */, 024E69202AEFC3FB00FA0B59 /* MainScreenViewModel.swift in Sources */, 065275372BB1B4070093BCCA /* PipManager.swift in Sources */, 0770DE2028D0858A006D8A5D /* Router.swift in Sources */, - 14D912D72C2551F60077CCCE /* FullStoryAnalyticsService.swift in Sources */, 0293A2092A6FCDE50090A336 /* DashboardPersistence.swift in Sources */, 0770DE1728D080A1006D8A5D /* RouteController.swift in Sources */, + CE3BD14E2CBEB0DA0026F4E3 /* PluginManager.swift in Sources */, A59568952B61630500ED4F90 /* DeepLinkManager.swift in Sources */, A50066952B614DEF0024680B /* BrazeListener.swift in Sources */, 071009C928D1DB3F00344290 /* ScreenAssembly.swift in Sources */, A59568972B61653700ED4F90 /* DeepLink.swift in Sources */, 022213D22C0E08E500B917E6 /* ProfilePersistence.swift in Sources */, - A5C10D8F2B861A70008E864D /* SegmentAnalyticsService.swift in Sources */, A59568992B616D9400ED4F90 /* PushLink.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1291,96 +1228,60 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ - 0780ABE12BFBA2E40093A4A6 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */ = { + CE0BF0B82CD9203A00D10289 /* XCRemoteSwiftPackageReference "microsoft-authentication-library-for-objc" */ = { isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/firebase/firebase-ios-sdk"; + repositoryURL = "https://github.com/AzureAD/microsoft-authentication-library-for-objc"; requirement = { kind = upToNextMajorVersion; - minimumVersion = 11.3.0; + minimumVersion = 1.6.1; }; }; - 14D912D12C25483F0077CCCE /* XCRemoteSwiftPackageReference "fullstory-swift-package-ios" */ = { + CE924BE52CD8FAB3000137CA /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */ = { isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/fullstorydev/fullstory-swift-package-ios"; + repositoryURL = "https://github.com/firebase/firebase-ios-sdk.git"; requirement = { - kind = upToNextMajorVersion; - minimumVersion = 1.53.0; + kind = exactVersion; + version = 11.3.0; }; }; - A51CDBEB2B6D2BEE009B6D4E /* XCRemoteSwiftPackageReference "braze-segment-swift" */ = { + CE9C07D62CD104E5009C44D1 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */ = { isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/braze-inc/braze-segment-swift"; + repositoryURL = "https://github.com/openedx/openedx-app-foundation-ios/"; requirement = { - kind = upToNextMajorVersion; - minimumVersion = 4.0.0; + kind = exactVersion; + version = 1.0.0; }; }; - A5462D9D2B865713003B96A5 /* XCRemoteSwiftPackageReference "analytics-swift" */ = { + CE9C07D92CD10581009C44D1 /* XCRemoteSwiftPackageReference "openedx-app-firebase-analytics-ios" */ = { isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/segmentio/analytics-swift.git"; + repositoryURL = "https://github.com/openedx/openedx-app-firebase-analytics-ios"; requirement = { - kind = upToNextMajorVersion; - minimumVersion = 1.6.1; - }; - }; - A5BD3E2E2B83B0F7006A8983 /* XCRemoteSwiftPackageReference "analytics-swift-firebase" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/segment-integrations/analytics-swift-firebase"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 1.4.0; - }; - }; - BA3042772B1F7147009B64B7 /* XCRemoteSwiftPackageReference "microsoft-authentication-library-for-objc" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/AzureAD/microsoft-authentication-library-for-objc"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 1.5.1; + kind = exactVersion; + version = 1.0.0; }; }; /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 0780ABE22BFBA2E40093A4A6 /* FirebaseAnalytics */ = { - isa = XCSwiftPackageProductDependency; - package = 0780ABE12BFBA2E40093A4A6 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; - productName = FirebaseAnalytics; - }; - 0780ABE42BFBA2E40093A4A6 /* FirebaseMessaging */ = { - isa = XCSwiftPackageProductDependency; - package = 0780ABE12BFBA2E40093A4A6 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; - productName = FirebaseMessaging; - }; - 14D912D22C25483F0077CCCE /* FullStory */ = { + CE0BF0B92CD9203A00D10289 /* MSAL */ = { isa = XCSwiftPackageProductDependency; - package = 14D912D12C25483F0077CCCE /* XCRemoteSwiftPackageReference "fullstory-swift-package-ios" */; - productName = FullStory; - }; - A51CDBEC2B6D2BEE009B6D4E /* SegmentBraze */ = { - isa = XCSwiftPackageProductDependency; - package = A51CDBEB2B6D2BEE009B6D4E /* XCRemoteSwiftPackageReference "braze-segment-swift" */; - productName = SegmentBraze; - }; - A51CDBEE2B6D2BEE009B6D4E /* SegmentBrazeUI */ = { - isa = XCSwiftPackageProductDependency; - package = A51CDBEB2B6D2BEE009B6D4E /* XCRemoteSwiftPackageReference "braze-segment-swift" */; - productName = SegmentBrazeUI; + package = CE0BF0B82CD9203A00D10289 /* XCRemoteSwiftPackageReference "microsoft-authentication-library-for-objc" */; + productName = MSAL; }; - A5462D9E2B865713003B96A5 /* Segment */ = { + CE5712782CD1099B00D4AB17 /* OEXFirebaseAnalytics */ = { isa = XCSwiftPackageProductDependency; - package = A5462D9D2B865713003B96A5 /* XCRemoteSwiftPackageReference "analytics-swift" */; - productName = Segment; + package = CE9C07D92CD10581009C44D1 /* XCRemoteSwiftPackageReference "openedx-app-firebase-analytics-ios" */; + productName = OEXFirebaseAnalytics; }; - A5BD3E2F2B83B0F7006A8983 /* SegmentFirebase */ = { + CE924BE62CD8FAB3000137CA /* FirebaseMessaging */ = { isa = XCSwiftPackageProductDependency; - package = A5BD3E2E2B83B0F7006A8983 /* XCRemoteSwiftPackageReference "analytics-swift-firebase" */; - productName = SegmentFirebase; + package = CE924BE52CD8FAB3000137CA /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseMessaging; }; - BA3042782B1F7147009B64B7 /* MSAL */ = { + CE9C07D72CD104E5009C44D1 /* OEXFoundation */ = { isa = XCSwiftPackageProductDependency; - package = BA3042772B1F7147009B64B7 /* XCRemoteSwiftPackageReference "microsoft-authentication-library-for-objc" */; - productName = MSAL; + package = CE9C07D62CD104E5009C44D1 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */; + productName = OEXFoundation; }; /* End XCSwiftPackageProductDependency section */ }; diff --git a/OpenEdX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/OpenEdX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 000000000..62b5e29a9 --- /dev/null +++ b/OpenEdX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,204 @@ +{ + "originHash" : "7091edbbbbea71591e476364909f2e5f04e1211b9c58ac97e2712e9546afdd90", + "pins" : [ + { + "identity" : "abseil-cpp-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/abseil-cpp-binary.git", + "state" : { + "revision" : "194a6706acbd25e4ef639bcaddea16e8758a3e27", + "version" : "1.2024011602.0" + } + }, + { + "identity" : "analytics-swift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/segmentio/analytics-swift.git", + "state" : { + "revision" : "825bac9da99ca02bacf85bdf95f707d8e9f786d1", + "version" : "1.6.2" + } + }, + { + "identity" : "analytics-swift-firebase", + "kind" : "remoteSourceControl", + "location" : "https://github.com/segment-integrations/analytics-swift-firebase", + "state" : { + "revision" : "8d955ec9554869e9f1eaf2c265d439d12947f8b3", + "version" : "1.4.0" + } + }, + { + "identity" : "app-check", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/app-check.git", + "state" : { + "revision" : "87dd288fc792bf9751e522e171a47df5b783b0b8", + "version" : "11.1.0" + } + }, + { + "identity" : "braze-segment-swift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/braze-inc/braze-segment-swift", + "state" : { + "revision" : "0f1fb36c89bf4f057e89c93ec0f1a159f33d8fd5", + "version" : "4.0.0" + } + }, + { + "identity" : "braze-swift-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/braze-inc/braze-swift-sdk", + "state" : { + "revision" : "f6b0226e04d19bb79f7fa57cf9f1aa56abe465ff", + "version" : "10.3.1" + } + }, + { + "identity" : "firebase-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/firebase-ios-sdk", + "state" : { + "revision" : "f909f901bfba9e27e4e9da83242a4915d6dd64bb", + "version" : "11.3.0" + } + }, + { + "identity" : "fullstory-swift-package-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/fullstorydev/fullstory-swift-package-ios", + "state" : { + "revision" : "5ba8ef3c359f676f4a5e56c7bf8d68fa998a6362", + "version" : "1.53.0" + } + }, + { + "identity" : "googleappmeasurement", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleAppMeasurement.git", + "state" : { + "revision" : "93406fd21b85e66e2d6dbf50b472161fd75c3f1f", + "version" : "11.3.0" + } + }, + { + "identity" : "googledatatransport", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleDataTransport.git", + "state" : { + "revision" : "617af071af9aa1d6a091d59a202910ac482128f9", + "version" : "10.1.0" + } + }, + { + "identity" : "googleutilities", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleUtilities.git", + "state" : { + "revision" : "53156c7ec267db846e6b64c9f4c4e31ba4cf75eb", + "version" : "8.0.2" + } + }, + { + "identity" : "grpc-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/grpc-binary.git", + "state" : { + "revision" : "f56d8fc3162de9a498377c7b6cea43431f4f5083", + "version" : "1.65.1" + } + }, + { + "identity" : "gtm-session-fetcher", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/gtm-session-fetcher.git", + "state" : { + "revision" : "a2ab612cb980066ee56d90d60d8462992c07f24b", + "version" : "3.5.0" + } + }, + { + "identity" : "interop-ios-for-google-sdks", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/interop-ios-for-google-sdks.git", + "state" : { + "revision" : "2d12673670417654f08f5f90fdd62926dc3a2648", + "version" : "100.0.0" + } + }, + { + "identity" : "jsonsafeencoding-swift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/segmentio/jsonsafeencoding-swift.git", + "state" : { + "revision" : "af6a8b360984085e36c6341b21ecb35c12f47ebd", + "version" : "2.0.0" + } + }, + { + "identity" : "leveldb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/leveldb.git", + "state" : { + "revision" : "a0bc79961d7be727d258d33d5a6b2f1023270ba1", + "version" : "1.22.5" + } + }, + { + "identity" : "microsoft-authentication-library-for-objc", + "kind" : "remoteSourceControl", + "location" : "https://github.com/AzureAD/microsoft-authentication-library-for-objc", + "state" : { + "revision" : "a20fd4c4587405da35723940d6ac0ee06a7b2b17", + "version" : "1.6.0" + } + }, + { + "identity" : "nanopb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/nanopb.git", + "state" : { + "revision" : "b7e1104502eca3a213b46303391ca4d3bc8ddec1", + "version" : "2.30910.0" + } + }, + { + "identity" : "promises", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/promises.git", + "state" : { + "revision" : "540318ecedd63d883069ae7f1ed811a2df00b6ac", + "version" : "2.4.0" + } + }, + { + "identity" : "sdwebimage", + "kind" : "remoteSourceControl", + "location" : "https://github.com/SDWebImage/SDWebImage.git", + "state" : { + "revision" : "8a1be70a625683bc04d6903e2935bf23f3c6d609", + "version" : "5.19.7" + } + }, + { + "identity" : "sovran-swift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/segmentio/sovran-swift.git", + "state" : { + "revision" : "24867f3e4ac62027db9827112135e6531b6f4051", + "version" : "1.1.2" + } + }, + { + "identity" : "swift-protobuf", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-protobuf.git", + "state" : { + "revision" : "ebc7251dd5b37f627c93698e4374084d98409633", + "version" : "1.28.2" + } + } + ], + "version" : 3 +} diff --git a/OpenEdX/AppDelegate.swift b/OpenEdX/AppDelegate.swift index f21e60633..d828970d6 100644 --- a/OpenEdX/AppDelegate.swift +++ b/OpenEdX/AppDelegate.swift @@ -7,12 +7,14 @@ import UIKit import Core +import OEXFoundation import Swinject import Profile import GoogleSignIn import FacebookCore import MSAL import UserNotifications +import OEXFirebaseAnalytics import FirebaseCore import FirebaseMessaging import Theme @@ -29,6 +31,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? + private let pluginManager = PluginManager() private var assembler: Assembler? private var lastForceLogoutTime: TimeInterval = 0 @@ -38,6 +41,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { initDI() + initPlugins() if let config = Container.shared.resolve(ConfigProtocol.self) { Theme.Shapes.isRoundedCorners = config.theme.isRoundedCorners @@ -129,6 +133,15 @@ class AppDelegate: UIResponder, UIApplicationDelegate { return false } + + private func initPlugins() { + guard let config = Container.shared.resolve(ConfigProtocol.self) else { return } + if config.firebase.enabled && config.firebase.isAnalyticsSourceFirebase { + pluginManager.addPlugin(analyticsService: FirebaseAnalyticsService()) + } + + // Initialize your plugins here + } private func initDI() { let navigation = UINavigationController() @@ -136,7 +149,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { assembler = Assembler( [ - AppAssembly(navigation: navigation), + AppAssembly(navigation: navigation, pluginManager: pluginManager), NetworkAssembly(), ScreenAssembly() ], diff --git a/OpenEdX/DI/AppAssembly.swift b/OpenEdX/DI/AppAssembly.swift index 0ab06b29a..ffa6fb450 100644 --- a/OpenEdX/DI/AppAssembly.swift +++ b/OpenEdX/DI/AppAssembly.swift @@ -7,6 +7,8 @@ import UIKit import Core +import OEXFoundation +import OEXFirebaseAnalytics import Swinject import KeychainSwift import Discovery @@ -21,9 +23,11 @@ import WhatsNew class AppAssembly: Assembly { private let navigation: UINavigationController + private let pluginManager: PluginManager - init(navigation: UINavigationController) { + init(navigation: UINavigationController, pluginManager: PluginManager) { self.navigation = navigation + self.pluginManager = pluginManager } func assemble(container: Container) { @@ -31,14 +35,16 @@ class AppAssembly: Assembly { self.navigation }.inObjectScope(.container) + container.register(PluginManager.self) { _ in + self.pluginManager + }.inObjectScope(.container) + container.register(Router.self) { r in Router(navigationController: r.resolve(UINavigationController.self)!, container: container) } container.register(AnalyticsManager.self) { r in - AnalyticsManager( - config: r.resolve(ConfigProtocol.self)! - ) + AnalyticsManager(services: r.resolve(PluginManager.self)!.analyticsServices) } container.register(AuthorizationAnalytics.self) { r in @@ -208,20 +214,10 @@ class AppAssembly: Assembly { ) }.inObjectScope(.container) - container.register(SegmentAnalyticsService.self) { r in - SegmentAnalyticsService( - config: r.resolve(ConfigProtocol.self)! - ) - }.inObjectScope(.container) - container.register(FirebaseAnalyticsService.self) { _ in FirebaseAnalyticsService() }.inObjectScope(.container) - container.register(FullStoryAnalyticsService.self) { r in - FullStoryAnalyticsService() - }.inObjectScope(.container) - container.register(PipManagerProtocol.self) { r in let config = r.resolve(ConfigProtocol.self)! return PipManager( diff --git a/OpenEdX/DI/NetworkAssembly.swift b/OpenEdX/DI/NetworkAssembly.swift index 83537fb29..904c1ea44 100644 --- a/OpenEdX/DI/NetworkAssembly.swift +++ b/OpenEdX/DI/NetworkAssembly.swift @@ -7,6 +7,7 @@ import Foundation import Core +import OEXFoundation import Alamofire import Swinject @@ -38,7 +39,7 @@ class NetworkAssembly: Assembly { }.inObjectScope(.container) container.register(API.self) {r in - API(session: r.resolve(Alamofire.Session.self)!, config: r.resolve(ConfigProtocol.self)!) + API(session: r.resolve(Alamofire.Session.self)!, baseURL: r.resolve(ConfigProtocol.self)!.baseURL) }.inObjectScope(.container) } } diff --git a/OpenEdX/DI/ScreenAssembly.swift b/OpenEdX/DI/ScreenAssembly.swift index 4ef5e7321..551483b91 100644 --- a/OpenEdX/DI/ScreenAssembly.swift +++ b/OpenEdX/DI/ScreenAssembly.swift @@ -8,6 +8,7 @@ import Foundation import Swinject import Core +import OEXFoundation import Authorization import Discovery import Dashboard diff --git a/OpenEdX/Data/CorePersistence.swift b/OpenEdX/Data/CorePersistence.swift index 4844aafdc..80ffcf83c 100644 --- a/OpenEdX/Data/CorePersistence.swift +++ b/OpenEdX/Data/CorePersistence.swift @@ -6,6 +6,7 @@ // import Core +import OEXFoundation import Foundation import CoreData import Combine diff --git a/OpenEdX/Data/Network/NotificationsEndpoints.swift b/OpenEdX/Data/Network/NotificationsEndpoints.swift index 8b5639f6c..4af73fb69 100644 --- a/OpenEdX/Data/Network/NotificationsEndpoints.swift +++ b/OpenEdX/Data/Network/NotificationsEndpoints.swift @@ -7,6 +7,7 @@ import Foundation import Core +import OEXFoundation import Alamofire enum NotificationsEndpoints: EndPointType { diff --git a/OpenEdX/Data/ProfilePersistence.swift b/OpenEdX/Data/ProfilePersistence.swift index 9b37befc9..afc4f28ec 100644 --- a/OpenEdX/Data/ProfilePersistence.swift +++ b/OpenEdX/Data/ProfilePersistence.swift @@ -7,6 +7,7 @@ import Profile import Core +import OEXFoundation import Foundation import CoreData diff --git a/OpenEdX/Managers/AnalyticsManager/AnalyticsManager.swift b/OpenEdX/Managers/AnalyticsManager/AnalyticsManager.swift index 6949a193a..f7bfa05b8 100644 --- a/OpenEdX/Managers/AnalyticsManager/AnalyticsManager.swift +++ b/OpenEdX/Managers/AnalyticsManager/AnalyticsManager.swift @@ -15,12 +15,8 @@ import Course import Discussion import WhatsNew import Swinject - -protocol AnalyticsService { - func identify(id: String, username: String?, email: String?) - func logEvent(_ event: AnalyticsEvent, parameters: [String: Any]?) - func logScreenEvent(_ event: AnalyticsEvent, parameters: [String: Any]?) -} +import OEXFoundation +import OEXFirebaseAnalytics // swiftlint:disable type_body_length file_length class AnalyticsManager: AuthorizationAnalytics, @@ -33,33 +29,11 @@ class AnalyticsManager: AuthorizationAnalytics, CoreAnalytics, WhatsNewAnalytics { - private var services: [AnalyticsService] = [] + private var services: [AnalyticsService] // Init Analytics Manager - public init(config: ConfigProtocol) { - services = servicesFor(config: config) - } - - private func servicesFor(config: ConfigProtocol) -> [AnalyticsService] { - var analyticsServices: [AnalyticsService] = [] - // add Firebase Analytics Service - if config.firebase.enabled && config.firebase.isAnalyticsSourceFirebase, - let firebaseService = Container.shared.resolve(FirebaseAnalyticsService.self) { - analyticsServices.append(firebaseService) - } - - // add Segment Analytics Service - if config.segment.enabled, - let segmentService = Container.shared.resolve(SegmentAnalyticsService.self) { - analyticsServices.append(segmentService) - } - - if config.fullStory.enabled, - let fullStoryService = Container.shared.resolve(FullStoryAnalyticsService.self) { - analyticsServices.append(fullStoryService) - } - - return analyticsServices + public init(services: [AnalyticsService]) { + self.services = services } public func identify(id: String, username: String, email: String) { @@ -70,13 +44,13 @@ class AnalyticsManager: AuthorizationAnalytics, private func logEvent(_ event: AnalyticsEvent, parameters: [String: Any]? = nil) { for service in services { - service.logEvent(event, parameters: parameters) + service.logEvent(event.rawValue, parameters: parameters) } } private func logScreenEvent(_ event: AnalyticsEvent, parameters: [String: Any]? = nil) { for service in services { - service.logScreenEvent(event, parameters: parameters) + service.logScreenEvent(event.rawValue, parameters: parameters) } } diff --git a/OpenEdX/Managers/DeepLinkManager/Link/DeepLink.swift b/OpenEdX/Managers/DeepLinkManager/Link/DeepLink.swift index 90ca14792..a1c1a7ae7 100644 --- a/OpenEdX/Managers/DeepLinkManager/Link/DeepLink.swift +++ b/OpenEdX/Managers/DeepLinkManager/Link/DeepLink.swift @@ -7,6 +7,7 @@ import Foundation import Core +import OEXFoundation enum DeepLinkType: String { case courseDashboard = "course_dashboard" diff --git a/OpenEdX/Managers/FirebaseAnalyticsService/FirebaseAnalyticsService.swift b/OpenEdX/Managers/FirebaseAnalyticsService/FirebaseAnalyticsService.swift deleted file mode 100644 index 396af313f..000000000 --- a/OpenEdX/Managers/FirebaseAnalyticsService/FirebaseAnalyticsService.swift +++ /dev/null @@ -1,94 +0,0 @@ -// -// FirebaseAnalyticsService.swift -// OpenEdX -// -// Created by Anton Yarmolenka on 19/02/2024. -// - -import Foundation -import Core -import FirebaseAnalytics - -private let MaxParameterValueCharacters = 100 -private let MaxNameValueCharacters = 40 - -class FirebaseAnalyticsService: AnalyticsService { - - func identify(id: String, username: String?, email: String?) { - Analytics.setUserID(id) - } - - func logEvent(_ event: AnalyticsEvent, parameters: [String: Any]?) { - guard let name = try? formatFirebaseName(event.rawValue) else { - debugLog("Firebase: event name is not supported: \(event.rawValue)") - return - } - - Analytics.logEvent(name, parameters: formatParamaters(params: parameters)) - } - - func logScreenEvent(_ event: Core.AnalyticsEvent, parameters: [String: Any]?) { - logEvent(event, parameters: parameters) - } -} - -extension FirebaseAnalyticsService { - private func formatParamaters(params: [String: Any]?) -> [String: Any] { - // Firebase only supports String or Number as value for event parameters - var formattedParams: [String: Any] = [:] - - for (key, value) in params ?? [:] { - if let key = try? formatFirebaseName(key) { - formattedParams[key] = formatParamValue(value: value) - } - } - - return formattedParams - } - - private func formatFirebaseName(_ eventName: String) throws -> String { - let trimmed = eventName.trimmingCharacters(in: .whitespaces) - do { - let regex = try NSRegularExpression(pattern: "([^a-zA-Z0-9_])", options: .caseInsensitive) - let formattedString = regex.stringByReplacingMatches( - in: trimmed, - options: .reportProgress, - range: NSRange(location: 0, length: trimmed.count), - withTemplate: "_" - ) - - // Resize the string to maximum 40 characters if needed - let range = NSRange(location: 0, length: min(formattedString.count, MaxNameValueCharacters)) - var formattedName = NSString(string: formattedString).substring(with: range) - - while formattedName.contains("__") { - formattedName = formattedName.replace(string: "__", replacement: "_") - } - - return formattedName - - } catch { - debugLog("Could not parse event name for Firebase.") - throw(error) - } - } - - private func formatParamValue(value: Any?) -> Any? { - - guard var formattedValue = value as? String else { return value} - - // Firebase only supports 100 characters for parameter value - if formattedValue.count > MaxParameterValueCharacters { - let index = formattedValue.index(formattedValue.startIndex, offsetBy: MaxParameterValueCharacters) - formattedValue = String(formattedValue[.. String { - return replacingOccurrences(of: string, with: replacement, options: NSString.CompareOptions.literal, range: nil) - } -} diff --git a/OpenEdX/Managers/FullStoryAnalyticsService/FullStoryAnalyticsService.swift b/OpenEdX/Managers/FullStoryAnalyticsService/FullStoryAnalyticsService.swift deleted file mode 100644 index 69b594cd7..000000000 --- a/OpenEdX/Managers/FullStoryAnalyticsService/FullStoryAnalyticsService.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// FullStoryAnalyticsService.swift -// OpenEdX -// -// Created by Saeed Bashir on 4/17/24. -// - -import Foundation -import Core -import FullStory - -class FullStoryAnalyticsService: AnalyticsService { - - func identify(id: String, username: String?, email: String?) { - FS.identify(id, userVars: ["displayName": id]) - } - - func logEvent(_ event: AnalyticsEvent, parameters: [String: Any]?) { - FS.event(event.rawValue, properties: parameters ?? [:]) - } - - func logScreenEvent(_ event: Core.AnalyticsEvent, parameters: [String: Any]?) { - FS.page(withName: event.rawValue, properties: parameters).start() - } -} diff --git a/OpenEdX/Managers/PluginManager.swift b/OpenEdX/Managers/PluginManager.swift new file mode 100644 index 000000000..f0661aa6d --- /dev/null +++ b/OpenEdX/Managers/PluginManager.swift @@ -0,0 +1,20 @@ +// +// PluginManager.swift +// OpenEdX +// +// Created by Ivan Stepanok on 15.10.2024. +// + +import Foundation +import OEXFoundation + +public class PluginManager { + + private(set) var analyticsServices: [AnalyticsService] = [] + + public init() {} + + func addPlugin(analyticsService: AnalyticsService) { + analyticsServices.append(analyticsService) + } +} diff --git a/OpenEdX/Managers/PushNotificationsManager/Listeners/BrazeListener.swift b/OpenEdX/Managers/PushNotificationsManager/Listeners/BrazeListener.swift index 0a78688e4..1e4d37220 100644 --- a/OpenEdX/Managers/PushNotificationsManager/Listeners/BrazeListener.swift +++ b/OpenEdX/Managers/PushNotificationsManager/Listeners/BrazeListener.swift @@ -26,9 +26,13 @@ class BrazeListener: PushNotificationsListener { guard let dictionary = userInfo as? [String: AnyHashable], shouldListenNotification(userinfo: userInfo) else { return } - if let segmentService = Container.shared.resolve(SegmentAnalyticsService.self) { - segmentService.analytics?.receivedRemoteNotification(userInfo: userInfo) - } + // Removed as part of the move to a plugin architecture, this code should be called from the plugin. + +// if let segmentService = Container.shared.resolve(SegmentAnalyticsService.self) { +// segmentService.analytics?.receivedRemoteNotification(userInfo: userInfo) +// } + + let link = PushLink(dictionary: dictionary) deepLinkManager.processLinkFromNotification(link) diff --git a/OpenEdX/Managers/PushNotificationsManager/Providers/BrazeProvider.swift b/OpenEdX/Managers/PushNotificationsManager/Providers/BrazeProvider.swift index 3b93fec87..3ef708cb1 100644 --- a/OpenEdX/Managers/PushNotificationsManager/Providers/BrazeProvider.swift +++ b/OpenEdX/Managers/PushNotificationsManager/Providers/BrazeProvider.swift @@ -6,24 +6,26 @@ // import Foundation -import SegmentBrazeUI import Swinject +import OEXFoundation class BrazeProvider: PushNotificationsProvider { func didRegisterWithDeviceToken(deviceToken: Data) { - guard let segmentService = Container.shared.resolve(SegmentAnalyticsService.self) else { return } - segmentService.analytics?.add( - plugin: BrazeDestination( - additionalConfiguration: { configuration in - configuration.logger.level = .info - }, additionalSetup: { braze in - braze.notifications.register(deviceToken: deviceToken) - } - ) - ) + // Removed as part of the move to a plugin architecture, this code should be called from the plugin. - segmentService.analytics?.registeredForRemoteNotifications(deviceToken: deviceToken) +// guard let segmentService = Container.shared.resolve(SegmentAnalyticsService.self) else { return } +// segmentService.analytics?.add( +// plugin: BrazeDestination( +// additionalConfiguration: { configuration in +// configuration.logger.level = .info +// }, additionalSetup: { braze in +// braze.notifications.register(deviceToken: deviceToken) +// } +// ) +// ) +// +// segmentService.analytics?.registeredForRemoteNotifications(deviceToken: deviceToken) } func didFailToRegisterForRemoteNotificationsWithError(error: Error) { diff --git a/OpenEdX/Managers/PushNotificationsManager/Providers/FCMProvider.swift b/OpenEdX/Managers/PushNotificationsManager/Providers/FCMProvider.swift index 6a418ce5f..71b0c82c3 100644 --- a/OpenEdX/Managers/PushNotificationsManager/Providers/FCMProvider.swift +++ b/OpenEdX/Managers/PushNotificationsManager/Providers/FCMProvider.swift @@ -7,6 +7,7 @@ import Foundation import Core +import OEXFoundation import FirebaseCore import FirebaseMessaging diff --git a/OpenEdX/Managers/PushNotificationsManager/PushNotificationsManager.swift b/OpenEdX/Managers/PushNotificationsManager/PushNotificationsManager.swift index bd218ed02..2f9c3c1b4 100644 --- a/OpenEdX/Managers/PushNotificationsManager/PushNotificationsManager.swift +++ b/OpenEdX/Managers/PushNotificationsManager/PushNotificationsManager.swift @@ -7,6 +7,7 @@ import Foundation import Core +import OEXFoundation import UIKit import UserNotifications import FirebaseCore diff --git a/OpenEdX/Managers/SegmentAnalyticsService/SegmentAnalyticsService.swift b/OpenEdX/Managers/SegmentAnalyticsService/SegmentAnalyticsService.swift deleted file mode 100644 index fad86a131..000000000 --- a/OpenEdX/Managers/SegmentAnalyticsService/SegmentAnalyticsService.swift +++ /dev/null @@ -1,48 +0,0 @@ -// -// SegmentAnalyticsService.swift -// OpenEdX -// -// Created by Anton Yarmolenka on 21/02/2024. -// - -import Foundation -import Core -import Segment -import SegmentFirebase - -class SegmentAnalyticsService: AnalyticsService { - var analytics: Analytics? - - // Init manager - public init(config: ConfigProtocol) { - guard config.segment.enabled else { return } - - let configuration = Configuration(writeKey: config.segment.writeKey) - .trackApplicationLifecycleEvents(true) - .flushInterval(10) - analytics = Analytics(configuration: configuration) - if config.firebase.enabled && config.firebase.isAnalyticsSourceSegment { - analytics?.add(plugin: FirebaseDestination()) - } - } - - func identify(id: String, username: String?, email: String?) { - guard let email = email, let username = username else { return } - let traits: [String: String] = [ - "email": email, - "username": username - ] - analytics?.identify(userId: id, traits: traits) - } - - func logEvent(_ event: AnalyticsEvent, parameters: [String: Any]?) { - analytics?.track( - name: event.rawValue, - properties: parameters - ) - } - - func logScreenEvent(_ event: Core.AnalyticsEvent, parameters: [String: Any]?) { - analytics?.screen(title: event.rawValue, properties: parameters) - } -} diff --git a/OpenEdX/View/MainScreenViewModel.swift b/OpenEdX/View/MainScreenViewModel.swift index da496110c..7c2d17f17 100644 --- a/OpenEdX/View/MainScreenViewModel.swift +++ b/OpenEdX/View/MainScreenViewModel.swift @@ -7,6 +7,7 @@ import Foundation import Core +import OEXFoundation import Profile import Course import Swinject diff --git a/Podfile b/Podfile index 929bdb7b9..a207a2f84 100644 --- a/Podfile +++ b/Podfile @@ -16,15 +16,8 @@ abstract_target "App" do target "Core" do project './Core/Core.xcodeproj' workspace './Core/Core.xcodeproj' - #Networking - pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :tag => '5.10.0' -#Keychain + #Keychain pod 'KeychainSwift', '~> 24.0' - #SwiftUI backward UIKit access - #pod 'Introspect', '~> 0.6' - pod 'SwiftUIIntrospect', '~> 1.3' - pod 'Kingfisher', '~> 8.0' - pod 'Swinject', '2.9.1' target 'CoreTests' do pod 'SwiftyMocky', :git => 'https://github.com/MakeAWishFoundation/SwiftyMocky.git', :tag => '4.2.0' diff --git a/Podfile.lock b/Podfile.lock index edbba665e..32a960dfc 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,64 +1,43 @@ PODS: - - Alamofire (5.10.0) - KeychainSwift (24.0.0) - - Kingfisher (8.0.3) - Sourcery (1.8.0): - Sourcery/CLI-Only (= 1.8.0) - Sourcery/CLI-Only (1.8.0) - SwiftGen (6.6.3) - SwiftLint (0.57.0) - - SwiftUIIntrospect (1.3.0) - SwiftyMocky (4.2.0): - Sourcery (= 1.8.0) - - Swinject (2.9.1) DEPENDENCIES: - - Alamofire (from `https://github.com/Alamofire/Alamofire.git`, tag `5.10.0`) - KeychainSwift (~> 24.0) - - Kingfisher (~> 8.0) - SwiftGen (~> 6.6) - SwiftLint (~> 0.57.0) - - SwiftUIIntrospect (~> 1.3) - SwiftyMocky (from `https://github.com/MakeAWishFoundation/SwiftyMocky.git`, tag `4.2.0`) - - Swinject (= 2.9.1) SPEC REPOS: trunk: - KeychainSwift - - Kingfisher - Sourcery - SwiftGen - SwiftLint - - SwiftUIIntrospect - - Swinject EXTERNAL SOURCES: - Alamofire: - :git: https://github.com/Alamofire/Alamofire.git - :tag: 5.10.0 SwiftyMocky: :git: https://github.com/MakeAWishFoundation/SwiftyMocky.git :tag: 4.2.0 CHECKOUT OPTIONS: - Alamofire: - :git: https://github.com/Alamofire/Alamofire.git - :tag: 5.10.0 SwiftyMocky: :git: https://github.com/MakeAWishFoundation/SwiftyMocky.git :tag: 4.2.0 SPEC CHECKSUMS: - Alamofire: cd0b98508df05796dd2ff278f3bb055a631b5390 KeychainSwift: 007c4647486e4563adca839cf02cef00deb3b670 - Kingfisher: bbf78af014cc845cf9a799363f627b5212784165 Sourcery: 6f5fe49b82b7e02e8c65560cbd52e1be67a1af2e SwiftGen: 4993cbf71cbc4886f775e26f8d5c3a1188ec9f99 SwiftLint: eb47480d47c982481592c195c221d11013a679cc - SwiftUIIntrospect: fee9aa07293ee280373a591e1824e8ddc869ba5d SwiftyMocky: c5e96e4ff76ec6dbf5a5941aeb039b5a546954a0 - Swinject: a827d508c6270da03ec74e558e728917a888fa9b -PODFILE CHECKSUM: a4fdd0279f24855bc71cef3096c188e41977d96c +PODFILE CHECKSUM: fe79196bcbd67eb66f3dd20e3a90c1210980722d COCOAPODS: 1.15.2 diff --git a/Profile/Mockfile b/Profile/Mockfile index 408c90399..9d3f7e354 100644 --- a/Profile/Mockfile +++ b/Profile/Mockfile @@ -14,4 +14,5 @@ unit.tests.mock: - Profile - Foundation - SwiftUI - - Combine \ No newline at end of file + - Combine + - OEXFoundation \ No newline at end of file diff --git a/Profile/Profile.xcodeproj/project.pbxproj b/Profile/Profile.xcodeproj/project.pbxproj index cdced1def..2fc6aba89 100644 --- a/Profile/Profile.xcodeproj/project.pbxproj +++ b/Profile/Profile.xcodeproj/project.pbxproj @@ -60,6 +60,9 @@ BAD9CA3F2B29BF5C00DE790A /* ProfileSupportInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAD9CA3E2B29BF5C00DE790A /* ProfileSupportInfoView.swift */; }; CE1735042CD23D7A00F9606A /* DatesAndCalendarViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE1735032CD23D7A00F9606A /* DatesAndCalendarViewModelTests.swift */; }; CE961F032CD163FD00799B9F /* CalendarManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE961F022CD163FD00799B9F /* CalendarManagerTests.swift */; }; + CE7CAF3D2CC1562C00E0AC9D /* OEXFoundation in Frameworks */ = {isa = PBXBuildFile; productRef = CE7CAF3C2CC1562C00E0AC9D /* OEXFoundation */; }; + CEB1E2702CC14EB000921517 /* OEXFoundation in Frameworks */ = {isa = PBXBuildFile; productRef = CEB1E26F2CC14EB000921517 /* OEXFoundation */; }; + CEBCA4312CC13CB900076589 /* BranchSDK in Frameworks */ = {isa = PBXBuildFile; productRef = CEBCA4302CC13CB900076589 /* BranchSDK */; }; E8264C634DD8AD314ECE8905 /* Pods_App_Profile_ProfileTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C85ADF87135E03275A980E07 /* Pods_App_Profile_ProfileTests.framework */; }; /* End PBXBuildFile section */ @@ -73,6 +76,19 @@ }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + CE7CAF3F2CC1562C00E0AC9D /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 020102D029784B3100BBF80C /* EditProfileViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditProfileViewModelTests.swift; sourceTree = ""; }; 020306C72932B13F000949EA /* EditProfileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditProfileView.swift; sourceTree = ""; }; @@ -152,6 +168,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + CEB1E2702CC14EB000921517 /* OEXFoundation in Frameworks */, + CEBCA4312CC13CB900076589 /* BranchSDK in Frameworks */, 025DE1A028DB4D9D0053E0F4 /* Core.framework in Frameworks */, 25B36FF48C1307888A3890DA /* Pods_App_Profile.framework in Frameworks */, ); @@ -162,6 +180,7 @@ buildActionMask = 2147483647; files = ( 02A9A91E2978194A00B55797 /* Profile.framework in Frameworks */, + CE7CAF3D2CC1562C00E0AC9D /* OEXFoundation in Frameworks */, E8264C634DD8AD314ECE8905 /* Pods_App_Profile_ProfileTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -497,6 +516,7 @@ 02A9A9172978194A00B55797 /* Frameworks */, 02A9A9182978194A00B55797 /* Resources */, E4D48C711DA7F62E34A40309 /* [CP] Copy Pods Resources */, + CE7CAF3F2CC1562C00E0AC9D /* Embed Frameworks */, ); buildRules = ( ); @@ -547,6 +567,10 @@ uk, ); mainGroup = 020F834028DB4CCD0062FA70; + packageReferences = ( + CEBCA42F2CC13CB900076589 /* XCRemoteSwiftPackageReference "ios-branch-sdk-spm" */, + CEB1E26E2CC14EB000921517 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */, + ); productRefGroup = 020F834B28DB4CCD0062FA70 /* Products */; projectDirPath = ""; projectRoot = ""; @@ -1718,6 +1742,43 @@ }; /* End XCConfigurationList section */ +/* Begin XCRemoteSwiftPackageReference section */ + CEB1E26E2CC14EB000921517 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/openedx/openedx-app-foundation-ios/"; + requirement = { + kind = exactVersion; + version = 1.0.0; + }; + }; + CEBCA42F2CC13CB900076589 /* XCRemoteSwiftPackageReference "ios-branch-sdk-spm" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/BranchMetrics/ios-branch-sdk-spm"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 3.6.4; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + CE7CAF3C2CC1562C00E0AC9D /* OEXFoundation */ = { + isa = XCSwiftPackageProductDependency; + package = CEB1E26E2CC14EB000921517 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */; + productName = OEXFoundation; + }; + CEB1E26F2CC14EB000921517 /* OEXFoundation */ = { + isa = XCSwiftPackageProductDependency; + package = CEB1E26E2CC14EB000921517 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */; + productName = OEXFoundation; + }; + CEBCA4302CC13CB900076589 /* BranchSDK */ = { + isa = XCSwiftPackageProductDependency; + package = CEBCA42F2CC13CB900076589 /* XCRemoteSwiftPackageReference "ios-branch-sdk-spm" */; + productName = BranchSDK; + }; +/* End XCSwiftPackageProductDependency section */ + /* Begin XCVersionGroup section */ 022213D32C0E092300B917E6 /* ProfileCoreModel.xcdatamodeld */ = { isa = XCVersionGroup; diff --git a/Profile/Profile/Data/Network/ProfileEndpoint.swift b/Profile/Profile/Data/Network/ProfileEndpoint.swift index a72264ebd..c169ec575 100644 --- a/Profile/Profile/Data/Network/ProfileEndpoint.swift +++ b/Profile/Profile/Data/Network/ProfileEndpoint.swift @@ -7,6 +7,7 @@ import Foundation import Core +import OEXFoundation import Alamofire enum ProfileEndpoint: EndPointType { diff --git a/Profile/Profile/Data/ProfileRepository.swift b/Profile/Profile/Data/ProfileRepository.swift index e8a20b9c2..8bad93b00 100644 --- a/Profile/Profile/Data/ProfileRepository.swift +++ b/Profile/Profile/Data/ProfileRepository.swift @@ -7,6 +7,7 @@ import Foundation import Core +import OEXFoundation import Alamofire public protocol ProfileRepositoryProtocol { diff --git a/Profile/Profile/Presentation/DatesAndCalendar/CalendarManager.swift b/Profile/Profile/Presentation/DatesAndCalendar/CalendarManager.swift index a66ef85fc..da8920ed1 100644 --- a/Profile/Profile/Presentation/DatesAndCalendar/CalendarManager.swift +++ b/Profile/Profile/Presentation/DatesAndCalendar/CalendarManager.swift @@ -12,6 +12,7 @@ import Theme import BranchSDK import CryptoKit import Core +import OEXFoundation // MARK: - CalendarManager public class CalendarManager: CalendarManagerProtocol { diff --git a/Profile/Profile/Presentation/DatesAndCalendar/DatesAndCalendarViewModel.swift b/Profile/Profile/Presentation/DatesAndCalendar/DatesAndCalendarViewModel.swift index 3201e2a1f..ff6ad8c60 100644 --- a/Profile/Profile/Presentation/DatesAndCalendar/DatesAndCalendarViewModel.swift +++ b/Profile/Profile/Presentation/DatesAndCalendar/DatesAndCalendarViewModel.swift @@ -12,6 +12,7 @@ import Theme import BranchSDK import CryptoKit import Core +import OEXFoundation // MARK: - DatesAndCalendarViewModel diff --git a/Profile/Profile/Presentation/DeleteAccount/DeleteAccountView.swift b/Profile/Profile/Presentation/DeleteAccount/DeleteAccountView.swift index 4e7b1e272..2a970f2b6 100644 --- a/Profile/Profile/Presentation/DeleteAccount/DeleteAccountView.swift +++ b/Profile/Profile/Presentation/DeleteAccount/DeleteAccountView.swift @@ -7,6 +7,7 @@ import SwiftUI import Core +import OEXFoundation import Theme public struct DeleteAccountView: View { diff --git a/Profile/Profile/Presentation/EditProfile/EditProfileView.swift b/Profile/Profile/Presentation/EditProfile/EditProfileView.swift index 7f6c415de..f92e991c3 100644 --- a/Profile/Profile/Presentation/EditProfile/EditProfileView.swift +++ b/Profile/Profile/Presentation/EditProfile/EditProfileView.swift @@ -7,6 +7,7 @@ import SwiftUI import Core +import OEXFoundation import Theme public struct EditProfileView: View { diff --git a/Profile/Profile/Presentation/Profile/ProfileView.swift b/Profile/Profile/Presentation/Profile/ProfileView.swift index 390a4eec9..54f0026c7 100644 --- a/Profile/Profile/Presentation/Profile/ProfileView.swift +++ b/Profile/Profile/Presentation/Profile/ProfileView.swift @@ -9,6 +9,7 @@ import SwiftUI import Core import Kingfisher import Theme +import OEXFoundation public struct ProfileView: View { diff --git a/Profile/Profile/Presentation/Profile/UserProfile/UserProfileView.swift b/Profile/Profile/Presentation/Profile/UserProfile/UserProfileView.swift index cc5d2fc0f..da7e80fd6 100644 --- a/Profile/Profile/Presentation/Profile/UserProfile/UserProfileView.swift +++ b/Profile/Profile/Presentation/Profile/UserProfile/UserProfileView.swift @@ -7,6 +7,7 @@ import SwiftUI import Core +import OEXFoundation import Kingfisher import Theme diff --git a/Profile/Profile/Presentation/ProfileAnalytics.swift b/Profile/Profile/Presentation/ProfileAnalytics.swift index 6af217a04..2f59ddf3a 100644 --- a/Profile/Profile/Presentation/ProfileAnalytics.swift +++ b/Profile/Profile/Presentation/ProfileAnalytics.swift @@ -7,6 +7,7 @@ import Foundation import Core +import OEXFoundation //sourcery: AutoMockable public protocol ProfileAnalytics { diff --git a/Profile/Profile/Presentation/Settings/ManageAccountView.swift b/Profile/Profile/Presentation/Settings/ManageAccountView.swift index f6c169da2..8b791d42b 100644 --- a/Profile/Profile/Presentation/Settings/ManageAccountView.swift +++ b/Profile/Profile/Presentation/Settings/ManageAccountView.swift @@ -7,6 +7,7 @@ import SwiftUI import Core +import OEXFoundation import Theme public struct ManageAccountView: View { diff --git a/Profile/Profile/Presentation/Settings/SettingsView.swift b/Profile/Profile/Presentation/Settings/SettingsView.swift index 2d1ee52d9..e257cb967 100644 --- a/Profile/Profile/Presentation/Settings/SettingsView.swift +++ b/Profile/Profile/Presentation/Settings/SettingsView.swift @@ -7,6 +7,7 @@ import SwiftUI import Core +import OEXFoundation import Kingfisher import Theme diff --git a/Profile/Profile/Presentation/Settings/VideoQualityView.swift b/Profile/Profile/Presentation/Settings/VideoQualityView.swift index 829029111..4f95e139c 100644 --- a/Profile/Profile/Presentation/Settings/VideoQualityView.swift +++ b/Profile/Profile/Presentation/Settings/VideoQualityView.swift @@ -7,6 +7,7 @@ import SwiftUI import Core +import OEXFoundation import Kingfisher import Theme @@ -132,8 +133,8 @@ struct VideoQualityView_Previews: PreviewProvider { router: router, analytics: ProfileAnalyticsMock(), coreAnalytics: CoreAnalyticsMock(), - config: ConfigMock(), - corePersistence: CorePersistenceMock(), + config: ConfigMock(), + corePersistence: CorePersistenceMock(), connectivity: Connectivity() ) diff --git a/Profile/ProfileTests/Presentation/DeleteAccount/DeleteAccountViewModelTests.swift b/Profile/ProfileTests/Presentation/DeleteAccount/DeleteAccountViewModelTests.swift index c6ba81755..2d5b2ed61 100644 --- a/Profile/ProfileTests/Presentation/DeleteAccount/DeleteAccountViewModelTests.swift +++ b/Profile/ProfileTests/Presentation/DeleteAccount/DeleteAccountViewModelTests.swift @@ -9,6 +9,7 @@ import SwiftyMocky import XCTest @testable import Core @testable import Profile +import OEXFoundation import Alamofire import SwiftUI diff --git a/Profile/ProfileTests/ProfileMock.generated.swift b/Profile/ProfileTests/ProfileMock.generated.swift index 6a2424da6..38e43e5da 100644 --- a/Profile/ProfileTests/ProfileMock.generated.swift +++ b/Profile/ProfileTests/ProfileMock.generated.swift @@ -13,6 +13,7 @@ import Profile import Foundation import SwiftUI import Combine +import OEXFoundation // MARK: - AuthInteractorProtocol @@ -1518,11 +1519,6 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { } private var __p_branch: (BranchConfig)? - public var segment: SegmentConfig { - get { invocations.append(.p_segment_get); return __p_segment ?? givenGetterValue(.p_segment_get, "ConfigProtocolMock - stub value for segment was not defined") } - } - private var __p_segment: (SegmentConfig)? - public var program: DiscoveryConfig { get { invocations.append(.p_program_get); return __p_program ?? givenGetterValue(.p_program_get, "ConfigProtocolMock - stub value for program was not defined") } } @@ -1533,11 +1529,6 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { } private var __p_URIScheme: (String)? - public var fullStory: FullStoryConfig { - get { invocations.append(.p_fullStory_get); return __p_fullStory ?? givenGetterValue(.p_fullStory_get, "ConfigProtocolMock - stub value for fullStory was not defined") } - } - private var __p_fullStory: (FullStoryConfig)? - @@ -1567,10 +1558,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { case p_dashboard_get case p_braze_get case p_branch_get - case p_segment_get case p_program_get case p_URIScheme_get - case p_fullStory_get static func compareParameters(lhs: MethodType, rhs: MethodType, matcher: Matcher) -> Matcher.ComparisonResult { switch (lhs, rhs) { case (.p_baseURL_get,.p_baseURL_get): return Matcher.ComparisonResult.match @@ -1596,10 +1585,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { case (.p_dashboard_get,.p_dashboard_get): return Matcher.ComparisonResult.match case (.p_braze_get,.p_braze_get): return Matcher.ComparisonResult.match case (.p_branch_get,.p_branch_get): return Matcher.ComparisonResult.match - case (.p_segment_get,.p_segment_get): return Matcher.ComparisonResult.match case (.p_program_get,.p_program_get): return Matcher.ComparisonResult.match case (.p_URIScheme_get,.p_URIScheme_get): return Matcher.ComparisonResult.match - case (.p_fullStory_get,.p_fullStory_get): return Matcher.ComparisonResult.match default: return .none } } @@ -1629,10 +1616,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { case .p_dashboard_get: return 0 case .p_braze_get: return 0 case .p_branch_get: return 0 - case .p_segment_get: return 0 case .p_program_get: return 0 case .p_URIScheme_get: return 0 - case .p_fullStory_get: return 0 } } func assertionName() -> String { @@ -1660,10 +1645,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { case .p_dashboard_get: return "[get] .dashboard" case .p_braze_get: return "[get] .braze" case .p_branch_get: return "[get] .branch" - case .p_segment_get: return "[get] .segment" case .p_program_get: return "[get] .program" case .p_URIScheme_get: return "[get] .URIScheme" - case .p_fullStory_get: return "[get] .fullStory" } } } @@ -1745,18 +1728,12 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { public static func branch(getter defaultValue: BranchConfig...) -> PropertyStub { return Given(method: .p_branch_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) } - public static func segment(getter defaultValue: SegmentConfig...) -> PropertyStub { - return Given(method: .p_segment_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) - } public static func program(getter defaultValue: DiscoveryConfig...) -> PropertyStub { return Given(method: .p_program_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) } public static func URIScheme(getter defaultValue: String...) -> PropertyStub { return Given(method: .p_URIScheme_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) } - public static func fullStory(getter defaultValue: FullStoryConfig...) -> PropertyStub { - return Given(method: .p_fullStory_get, products: defaultValue.map({ StubProduct.return($0 as Any) })) - } } @@ -1786,10 +1763,8 @@ open class ConfigProtocolMock: ConfigProtocol, Mock { public static var dashboard: Verify { return Verify(method: .p_dashboard_get) } public static var braze: Verify { return Verify(method: .p_braze_get) } public static var branch: Verify { return Verify(method: .p_branch_get) } - public static var segment: Verify { return Verify(method: .p_segment_get) } public static var program: Verify { return Verify(method: .p_program_get) } public static var URIScheme: Verify { return Verify(method: .p_URIScheme_get) } - public static var fullStory: Verify { return Verify(method: .p_fullStory_get) } } public struct Perform { diff --git a/WhatsNew/Mockfile b/WhatsNew/Mockfile index 3fee3de2b..6107db3ed 100644 --- a/WhatsNew/Mockfile +++ b/WhatsNew/Mockfile @@ -14,4 +14,5 @@ unit.tests.mock: - WhatsNew - Foundation - SwiftUI - - Combine \ No newline at end of file + - Combine + - OEXFoundation \ No newline at end of file diff --git a/WhatsNew/WhatsNew.xcodeproj/project.pbxproj b/WhatsNew/WhatsNew.xcodeproj/project.pbxproj index 49ad542c3..86fca97de 100644 --- a/WhatsNew/WhatsNew.xcodeproj/project.pbxproj +++ b/WhatsNew/WhatsNew.xcodeproj/project.pbxproj @@ -26,6 +26,8 @@ 02EC90AC2AE90C64007DE1E0 /* WhatsNewPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02EC90AB2AE90C64007DE1E0 /* WhatsNewPage.swift */; }; 14769D3E2B99713800AB36D4 /* WhatsNewAnalytics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14769D3D2B99713800AB36D4 /* WhatsNewAnalytics.swift */; }; B3BB9B06B226989A619C6440 /* Pods_App_WhatsNew.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05AC45C7050E30F8394E0C76 /* Pods_App_WhatsNew.framework */; }; + CE7CAF352CC1560900E0AC9D /* OEXFoundation in Frameworks */ = {isa = PBXBuildFile; productRef = CE7CAF342CC1560900E0AC9D /* OEXFoundation */; }; + CEB1E2672CC14E6400921517 /* OEXFoundation in Frameworks */ = {isa = PBXBuildFile; productRef = CEB1E2662CC14E6400921517 /* OEXFoundation */; }; EF5CA11A55CB49F2DA030D25 /* Pods_App_WhatsNew_WhatsNewTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8D1A5DF016EC4630637336C /* Pods_App_WhatsNew_WhatsNewTests.framework */; }; /* End PBXBuildFile section */ @@ -39,6 +41,19 @@ }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + CE7CAF372CC1560900E0AC9D /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 020A7B5E2AE131A9000BAF70 /* WhatsNewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WhatsNewModel.swift; sourceTree = ""; }; 020A7B602AE136D2000BAF70 /* WhatsNew.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = WhatsNew.json; path = WhatsNew/Data/WhatsNew.json; sourceTree = SOURCE_ROOT; }; @@ -86,6 +101,7 @@ buildActionMask = 2147483647; files = ( 028A373A2ADFF425008CA604 /* Core.framework in Frameworks */, + CEB1E2672CC14E6400921517 /* OEXFoundation in Frameworks */, B3BB9B06B226989A619C6440 /* Pods_App_WhatsNew.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -95,6 +111,7 @@ buildActionMask = 2147483647; files = ( 028A37262ADFF3F8008CA604 /* WhatsNew.framework in Frameworks */, + CE7CAF352CC1560900E0AC9D /* OEXFoundation in Frameworks */, EF5CA11A55CB49F2DA030D25 /* Pods_App_WhatsNew_WhatsNewTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -277,6 +294,7 @@ 028A37222ADFF3F7008CA604 /* Frameworks */, 028A37232ADFF3F7008CA604 /* Resources */, 8A74692D666D8FF13F7BA64F /* [CP] Copy Pods Resources */, + CE7CAF372CC1560900E0AC9D /* Embed Frameworks */, ); buildRules = ( ); @@ -317,6 +335,9 @@ uk, ); mainGroup = 028A37132ADFF3F7008CA604; + packageReferences = ( + CEB1E2652CC14E6400921517 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */, + ); productRefGroup = 028A371E2ADFF3F7008CA604 /* Products */; projectDirPath = ""; projectRoot = ""; @@ -1504,6 +1525,30 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + CEB1E2652CC14E6400921517 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/openedx/openedx-app-foundation-ios/"; + requirement = { + kind = exactVersion; + version = 1.0.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + CE7CAF342CC1560900E0AC9D /* OEXFoundation */ = { + isa = XCSwiftPackageProductDependency; + package = CEB1E2652CC14E6400921517 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */; + productName = OEXFoundation; + }; + CEB1E2662CC14E6400921517 /* OEXFoundation */ = { + isa = XCSwiftPackageProductDependency; + package = CEB1E2652CC14E6400921517 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */; + productName = OEXFoundation; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = 028A37142ADFF3F7008CA604 /* Project object */; } diff --git a/WhatsNew/WhatsNewTests/WhatsNewMock.generated.swift b/WhatsNew/WhatsNewTests/WhatsNewMock.generated.swift index dca08a91e..24726cef8 100644 --- a/WhatsNew/WhatsNewTests/WhatsNewMock.generated.swift +++ b/WhatsNew/WhatsNewTests/WhatsNewMock.generated.swift @@ -13,6 +13,7 @@ import WhatsNew import Foundation import SwiftUI import Combine +import OEXFoundation // MARK: - WhatsNewAnalytics diff --git a/config_script/process_config.py b/config_script/process_config.py index c03e3d8f4..1fdea0270 100644 --- a/config_script/process_config.py +++ b/config_script/process_config.py @@ -247,14 +247,6 @@ def add_microsoft_config(self, config, plist): scheme = ["msauth." + bundle_identifier] self.add_url_scheme(scheme, plist, False) self.add_application_query_schemes(["msauthv2", "msauthv3"], plist) - - def add_fullstory_config(self, config, plist): - fullstory = config.get('FULLSTORY', {}) - enabled = fullstory.get('ENABLED') - orgID = fullstory.get('ORG_ID') - - if enabled and orgID: - plist["FullStory"] = {"orgID": orgID} def update_info_plist(self, plist_data, plist_path): if not plist_path: @@ -311,7 +303,6 @@ def process_plist_files(configuration_manager, plist_manager, config): configuration_manager.add_google_config(config, info_plist_content) configuration_manager.add_microsoft_config(config, info_plist_content) configuration_manager.add_branch_config(config, info_plist_content) - configuration_manager.add_fullstory_config(config, info_plist_content) configuration_manager.update_info_plist(info_plist_content, info_plist_path) diff --git a/config_script/whitelabel.py b/config_script/whitelabel.py index 24d1b01a9..13bdc1c1c 100644 --- a/config_script/whitelabel.py +++ b/config_script/whitelabel.py @@ -564,11 +564,11 @@ def set_flags_from_mobile_config(self): # iterate for all configurations for name, config in configurations.items(): if 'env_config' in config: - # get folder name for mobile config for current configuration by env_config + # get folder name for mobile config for current configuration by env_config config_folder = config_settings.get(self.CONFIG_MAPPINGS, {}).get(config['env_config']) if config_folder: - # replace fullstory flag - project_file_string = self.replace_fullstory_flag(project_file_string, config_directory, name, config_folder, errors_texts) + # example of usage + # project_file_string = self.replace_fullstory_flag(project_file_string, config_directory, name, config_folder, errors_texts) else: logging.error("Config folder for '"+config['env_config']+"' is not defined in config_settings.yaml->config_mapping") else: @@ -587,20 +587,20 @@ def set_flags_from_mobile_config(self): else: logging.error("Mobile config directory not found") - def replace_fullstory_flag(self, project_file_string, config_directory, config_name, config_folder, errors_texts): - # get mobile config - mobile_config = self.get_mobile_config(config_directory, config_folder, errors_texts) - if mobile_config: - # get FULLSTORY settings from mobile config - fullstory_config = mobile_config.get('FULLSTORY', {}) - if fullstory_config: - fullstory_config_enabled = fullstory_config.get('ENABLED') - fullstory_string = "FULLSTORY_ENABLED = YES;" if fullstory_config_enabled else "FULLSTORY_ENABLED = NO;" - fullstory_regex = "FULLSTORY_ENABLED = .*;" - # serach by regex and replace - project_file_string = self.replace_parameter_for_build_config(project_file_string, config_name, fullstory_string, fullstory_regex, errors_texts) - return project_file_string - +# def replace_fullstory_flag(self, project_file_string, config_directory, config_name, config_folder, errors_texts): +# # get mobile config +# mobile_config = self.get_mobile_config(config_directory, config_folder, errors_texts) +# if mobile_config: +# # get FULLSTORY settings from mobile config +# fullstory_config = mobile_config.get('FULLSTORY', {}) +# if fullstory_config: +# fullstory_config_enabled = fullstory_config.get('ENABLED') +# fullstory_string = "FULLSTORY_ENABLED = YES;" if fullstory_config_enabled else "FULLSTORY_ENABLED = NO;" +# fullstory_regex = "FULLSTORY_ENABLED = .*;" +# # serach by regex and replace +# project_file_string = self.replace_parameter_for_build_config(project_file_string, config_name, fullstory_string, fullstory_regex, errors_texts) +# return project_file_string +# def main(): """ Parse the command line arguments, and pass them to WhitelabelApp. diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 5393609bf..aa3a39f5b 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -38,6 +38,7 @@ lane :unit_tests do run_tests( workspace: "OpenEdX.xcworkspace", device: "iPhone 16", - scheme: "OpenEdXDev" + scheme: "OpenEdXDev", + xcargs: "-skipPackagePluginValidation -skipMacroValidation" # Ignore swiftLint plugin validation ) end