diff --git a/Authorization/Authorization/Presentation/Login/SignInView.swift b/Authorization/Authorization/Presentation/Login/SignInView.swift index b3f8ef784..7f9ec6936 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 5a87151f5..8f309faec 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 d63a3b9ef..1164ff12e 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/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 e824ad975..4b867a73f 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/Core/Core.xcodeproj/project.pbxproj b/Core/Core.xcodeproj/project.pbxproj index e8b75069a..b3e0224d2 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,12 +32,10 @@ 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 */; }; @@ -58,8 +54,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 +70,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 +79,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,29 +114,20 @@ 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 */; }; @@ -169,25 +145,23 @@ 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 */; }; + CEE886B32CB928010092A175 /* OEXFoundation in Frameworks */ = {isa = PBXBuildFile; productRef = CEE886B22CB928010092A175 /* OEXFoundation */; }; CFC84952299F8B890055E497 /* Debounce.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFC84951299F8B890055E497 /* Debounce.swift */; }; DBF6F2412B014ADA0098414B /* FirebaseConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBF6F2402B014ADA0098414B /* FirebaseConfig.swift */; }; DBF6F2462B01DAFE0098414B /* AgreementConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBF6F2452B01DAFE0098414B /* AgreementConfig.swift */; }; @@ -195,7 +169,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 */ @@ -218,9 +191,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 = ""; }; @@ -237,12 +208,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 = ""; }; @@ -260,8 +229,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 = ""; }; @@ -278,7 +245,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 = ""; }; @@ -287,26 +253,18 @@ 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 = ""; }; 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 = ""; }; @@ -330,31 +288,22 @@ 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 = ""; }; 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 = ""; }; @@ -378,18 +327,15 @@ 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 = ""; }; @@ -402,7 +348,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 = ""; }; /* End PBXFileReference section */ @@ -419,6 +364,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + CEE886B32CB928010092A175 /* OEXFoundation in Frameworks */, BAF0D4CB2AD6AE14007AC334 /* FacebookLogin in Frameworks */, 025EF2F62971740000B838AB /* YouTubePlayerKit in Frameworks */, C8C446EF233F81B9FABB77D2 /* Pods_App_Core.framework in Frameworks */, @@ -504,30 +450,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 = ""; @@ -718,16 +643,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 */, ); @@ -991,6 +909,7 @@ BAF0D4CA2AD6AE14007AC334 /* FacebookLogin */, 142EDD6B2B831D1400F9F320 /* BranchSDK */, 02AA27932C2C1B88006F5B6A /* ZipArchive */, + CEE886B22CB928010092A175 /* OEXFoundation */, ); productName = Core; productReference = 0770DE0828D07831006D8A5D /* Core.framework */; @@ -1032,6 +951,7 @@ BA8FA6712AD6ABA300EA029A /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */, 142EDD6A2B831D1400F9F320 /* XCRemoteSwiftPackageReference "ios-branch-sdk-spm" */, 02AA27922C2C1B61006F5B6A /* XCRemoteSwiftPackageReference "ZipArchive" */, + CEE886B12CB928010092A175 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */, ); productRefGroup = 0770DE0928D07831006D8A5D /* Products */; projectDirPath = ""; @@ -1150,22 +1070,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 */, @@ -1174,7 +1089,6 @@ 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 */, @@ -1187,32 +1101,27 @@ 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 */, @@ -1220,7 +1129,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 */, @@ -1236,19 +1144,16 @@ 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 */, @@ -1264,38 +1169,26 @@ 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 */, @@ -1306,7 +1199,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 */, @@ -2368,6 +2260,14 @@ minimumVersion = 16.3.1; }; }; + CEE886B12CB928010092A175 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/raccoongang/openedx-app-foundation-ios/"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 0.1.0; + }; + }; /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ @@ -2396,6 +2296,11 @@ package = BA8FA6712AD6ABA300EA029A /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */; productName = FacebookLogin; }; + CEE886B22CB928010092A175 /* OEXFoundation */ = { + isa = XCSwiftPackageProductDependency; + package = CEE886B12CB928010092A175 /* XCRemoteSwiftPackageReference "openedx-app-foundation-ios" */; + productName = OEXFoundation; + }; /* End XCSwiftPackageProductDependency section */ /* Begin XCVersionGroup 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/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 index 4e1181dc3..a993c844c 100644 --- a/Core/Core/Configuration/Config/FullStoryConfig.swift +++ b/Core/Core/Configuration/Config/FullStoryConfig.swift @@ -6,6 +6,7 @@ // import Foundation +import OEXFoundation private enum Keys: String, RawStringExtractable { case enabled = "ENABLED" diff --git a/Core/Core/Configuration/Config/SegmentConfig.swift b/Core/Core/Configuration/Config/SegmentConfig.swift index 937a78015..259d4deae 100644 --- a/Core/Core/Configuration/Config/SegmentConfig.swift +++ b/Core/Core/Configuration/Config/SegmentConfig.swift @@ -6,6 +6,7 @@ // import Foundation +import OEXFoundation private enum SegmentKeys: String, RawStringExtractable { case enabled = "ENABLED" diff --git a/Core/Core/Configuration/Config/UIComponentsConfig.swift b/Core/Core/Configuration/Config/UIComponentsConfig.swift index 1b8cf788e..5d04c7e06 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/Configuration/Connectivity.swift b/Core/Core/Configuration/Connectivity.swift index c1ea53d82..c69ee18b9 100644 --- a/Core/Core/Configuration/Connectivity.swift +++ b/Core/Core/Configuration/Connectivity.swift @@ -7,6 +7,7 @@ import Alamofire import Combine +import Foundation public enum InternetState { case reachable diff --git a/Core/Core/Data/Repository/AuthRepository.swift b/Core/Core/Data/Repository/AuthRepository.swift index d00441ee6..1a7a6c138 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 01091f661..000000000 --- a/Core/Core/Extensions/Container+App.swift +++ /dev/null @@ -1,22 +0,0 @@ -// -// Container+App.swift -// Core -// -// Created by  Stepanok Ivan on 13.10.2022. -// - -import Foundation -import Swinject - -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 277a79fed..000000000 --- a/Core/Core/Network/Alamofire+Error.swift +++ /dev/null @@ -1,29 +0,0 @@ -// -// Alamofire+Error.swift -// Core -// -// Created by Vladimir Chekyrta on 14.09.2022. -// - -import Alamofire - -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 6b6b30f19..87f172fc8 100644 --- a/Core/Core/Network/DownloadManager.swift +++ b/Core/Core/Network/DownloadManager.swift @@ -9,6 +9,7 @@ import Alamofire import SwiftUI import Combine import ZipArchive +import OEXFoundation 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 f41f1f103..000000000 --- a/Core/Core/Network/NetworkLogger.swift +++ /dev/null @@ -1,47 +0,0 @@ -// -// NetworkLogger.swift -// Core -// -// Created by Vladimir Chekyrta on 13.09.2022. -// - -import Alamofire - -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/Providers/SocialAuth/AppleAuthProvider.swift b/Core/Core/Providers/SocialAuth/AppleAuthProvider.swift index 1ed3d4c06..154d5fc3c 100644 --- a/Core/Core/Providers/SocialAuth/AppleAuthProvider.swift +++ b/Core/Core/Providers/SocialAuth/AppleAuthProvider.swift @@ -8,6 +8,7 @@ import Foundation import AuthenticationServices import Swinject +import OEXFoundation public final class AppleAuthProvider: NSObject, ASAuthorizationControllerDelegate { diff --git a/Core/Core/Providers/SocialAuth/MicrosoftAuthProvider.swift b/Core/Core/Providers/SocialAuth/MicrosoftAuthProvider.swift index 2fd998579..44ac8d22d 100644 --- a/Core/Core/Providers/SocialAuth/MicrosoftAuthProvider.swift +++ b/Core/Core/Providers/SocialAuth/MicrosoftAuthProvider.swift @@ -8,6 +8,7 @@ import Foundation import MSAL import Swinject +import OEXFoundation public typealias MSLoginCompletionHandler = (account: MSALAccount, token: String) 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/Course/Course/Data/CourseRepository.swift b/Course/Course/Data/CourseRepository.swift index 5da361928..5b5359398 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/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/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..a119d79bf 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 diff --git a/Course/Course/Presentation/Outline/CourseVertical/CourseVerticalView.swift b/Course/Course/Presentation/Outline/CourseVertical/CourseVerticalView.swift index 1614e075d..c55816d0a 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 f2a50efe1..b84016910 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/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 cda65b250..b3bf52adc 100644 --- a/Dashboard/Dashboard/Data/Network/DashboardEndpoint.swift +++ b/Dashboard/Dashboard/Data/Network/DashboardEndpoint.swift @@ -8,6 +8,7 @@ import Foundation import Core import Alamofire +import OEXFoundation 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/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/NativeDiscovery/CourseDetailsView.swift b/Discovery/Discovery/Presentation/NativeDiscovery/CourseDetailsView.swift index 78b37f590..c89d55cf3 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 d434dd05c..bbf01a9c2 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 e4c23ff15..b789306aa 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/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/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..a34450ef4 100644 --- a/OpenEdX/AppDelegate.swift +++ b/OpenEdX/AppDelegate.swift @@ -7,6 +7,7 @@ import UIKit import Core +import OEXFoundation import Swinject import Profile import GoogleSignIn diff --git a/OpenEdX/DI/AppAssembly.swift b/OpenEdX/DI/AppAssembly.swift index 5c4639e15..8f6459a77 100644 --- a/OpenEdX/DI/AppAssembly.swift +++ b/OpenEdX/DI/AppAssembly.swift @@ -7,6 +7,7 @@ import UIKit import Core +import OEXFoundation import Swinject import KeychainSwift import Discovery 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 a65f25833..3cf1cdf0a 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/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 index 396af313f..d2cb2f9c5 100644 --- a/OpenEdX/Managers/FirebaseAnalyticsService/FirebaseAnalyticsService.swift +++ b/OpenEdX/Managers/FirebaseAnalyticsService/FirebaseAnalyticsService.swift @@ -7,6 +7,7 @@ import Foundation import Core +import OEXFoundation import FirebaseAnalytics private let MaxParameterValueCharacters = 100 diff --git a/OpenEdX/Managers/PushNotificationsManager/Providers/BrazeProvider.swift b/OpenEdX/Managers/PushNotificationsManager/Providers/BrazeProvider.swift index 3b93fec87..0ed8cd5e7 100644 --- a/OpenEdX/Managers/PushNotificationsManager/Providers/BrazeProvider.swift +++ b/OpenEdX/Managers/PushNotificationsManager/Providers/BrazeProvider.swift @@ -8,6 +8,7 @@ import Foundation import SegmentBrazeUI import Swinject +import OEXFoundation class BrazeProvider: PushNotificationsProvider { 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/View/MainScreenViewModel.swift b/OpenEdX/View/MainScreenViewModel.swift index 70b74ca6b..242e3f8a8 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 4ce194c65..ac81267e5 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', '~> 5.9' #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' end target "Authorization" do diff --git a/Podfile.lock b/Podfile.lock index a79ae0c35..bb6c66100 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,37 +1,25 @@ PODS: - - Alamofire (5.9.1) - 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 (~> 5.9) - 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: - - Alamofire - KeychainSwift - - Kingfisher - Sourcery - SwiftGen - SwiftLint - - SwiftUIIntrospect - - Swinject EXTERNAL SOURCES: SwiftyMocky: @@ -44,16 +32,12 @@ CHECKOUT OPTIONS: :tag: 4.2.0 SPEC CHECKSUMS: - Alamofire: f36a35757af4587d8e4f4bfa223ad10be2422b8c KeychainSwift: 007c4647486e4563adca839cf02cef00deb3b670 - Kingfisher: bbf78af014cc845cf9a799363f627b5212784165 Sourcery: 6f5fe49b82b7e02e8c65560cbd52e1be67a1af2e SwiftGen: 4993cbf71cbc4886f775e26f8d5c3a1188ec9f99 SwiftLint: eb47480d47c982481592c195c221d11013a679cc - SwiftUIIntrospect: fee9aa07293ee280373a591e1824e8ddc869ba5d SwiftyMocky: c5e96e4ff76ec6dbf5a5941aeb039b5a546954a0 - Swinject: a827d508c6270da03ec74e558e728917a888fa9b -PODFILE CHECKSUM: b3183e95d2b3bf330c512113a847f9a5485c23a5 +PODFILE CHECKSUM: c0f73bba1a9cfbb6252c4879d65e4287772eca25 COCOAPODS: 1.15.2 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 a593f7380..f5697d268 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 8e4a7ad22..01df04901 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 667546c24..2d3755115 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/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 cc1eb0e45..6352cc8c8 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