diff --git a/Core/Core/Configuration/Connectivity.swift b/Core/Core/Configuration/Connectivity.swift index 864e10e9f..1168c41e1 100644 --- a/Core/Core/Configuration/Connectivity.swift +++ b/Core/Core/Configuration/Connectivity.swift @@ -2,7 +2,7 @@ // Connectivity.swift // OpenEdX // -// Created by  Stepanok Ivan on 15.12.2022. +// Created by Stepanok Ivan on 15.12.2022. // import Alamofire @@ -14,7 +14,7 @@ public enum InternetState: Sendable { case notReachable } -//sourcery: AutoMockable +// sourcery: AutoMockable @MainActor public protocol ConnectivityProtocol: Sendable { var isInternetAvaliable: Bool { get } @@ -22,47 +22,91 @@ public protocol ConnectivityProtocol: Sendable { var internetReachableSubject: CurrentValueSubject { get } } -@MainActor public class Connectivity: ConnectivityProtocol { - let networkManager = NetworkReachabilityManager() - - public var isInternetAvaliable: Bool { - // false - networkManager?.isReachable ?? false + + private let networkManager = NetworkReachabilityManager() + private let verificationURL: URL + private let verificationTimeout: TimeInterval + private let cacheValidity: TimeInterval = 30 + + private var lastVerificationDate: TimeInterval? + private var lastVerificationResult: Bool = true + + public let internetReachableSubject = CurrentValueSubject(nil) + + private(set) var _isInternetAvailable: Bool = true { + didSet { + Task { @MainActor in + internetReachableSubject.send(_isInternetAvailable ? .reachable : .notReachable) + } + } } - - public var isMobileData: Bool { - if let networkManager { - return networkManager.isReachableOnCellular - } else { - return false + + public var isInternetAvaliable: Bool { + if let last = lastVerificationDate, + Date().timeIntervalSince1970 - last < cacheValidity { + return lastVerificationResult + } + + Task { + await performVerification() } + + return lastVerificationResult } - - public let internetReachableSubject = CurrentValueSubject(nil) - - public init() { - checkInternet() + + public var isMobileData: Bool { + networkManager?.isReachableOnCellular == true } - - func checkInternet() { - if let networkManager { - networkManager.startListening { status in - DispatchQueue.main.async { - switch status { - case .unknown: - self.internetReachableSubject.send(InternetState.notReachable) - case .notReachable: - self.internetReachableSubject.send(InternetState.notReachable) - case .reachable: - self.internetReachableSubject.send(InternetState.reachable) - } + + public init( + config: ConfigProtocol, + timeout: TimeInterval = 15 + ) { + self.verificationURL = config.baseURL + self.verificationTimeout = timeout + + networkManager?.startListening(onQueue: .global()) { [weak self] status in + guard let self = self else { return } + Task { @MainActor in + switch status { + case .reachable: + await self.performVerification() + case .notReachable, .unknown: + self.updateAvailability(false, at: 0) } } - } else { - DispatchQueue.main.async { - self.internetReachableSubject.send(InternetState.notReachable) + } + } + + deinit { + networkManager?.stopListening() + } + + private func performVerification() async { + let now = Date().timeIntervalSince1970 + let live = await verifyInternet() + updateAvailability(live, at: now) + } + + private func updateAvailability(_ available: Bool, at timestamp: TimeInterval) { + _isInternetAvailable = available + lastVerificationDate = timestamp + lastVerificationResult = available + } + + private func verifyInternet() async -> Bool { + var request = URLRequest(url: verificationURL) + request.httpMethod = "HEAD" + request.timeoutInterval = verificationTimeout + do { + let (_, response) = try await URLSession.shared.data(for: request) + if let http = response as? HTTPURLResponse, (200..<400).contains(http.statusCode) { + return true } + } catch { + return false } + return false } } diff --git a/Core/Core/View/Base/OfflineSnackBarView.swift b/Core/Core/View/Base/OfflineSnackBarView.swift index c26a577ee..ad6c70130 100644 --- a/Core/Core/View/Base/OfflineSnackBarView.swift +++ b/Core/Core/View/Base/OfflineSnackBarView.swift @@ -79,6 +79,7 @@ public struct OfflineSnackBarView: View { struct OfflineSnackBarView_Previews: PreviewProvider { static var previews: some View { - OfflineSnackBarView(connectivity: Connectivity(), reloadAction: {}) + let configMock = ConfigMock() + OfflineSnackBarView(connectivity: Connectivity(config: configMock), reloadAction: {}) } } diff --git a/Core/Core/View/Base/WebBrowser.swift b/Core/Core/View/Base/WebBrowser.swift index cd61dcdb6..6ae177cb4 100644 --- a/Core/Core/View/Base/WebBrowser.swift +++ b/Core/Core/View/Base/WebBrowser.swift @@ -81,6 +81,7 @@ public struct WebBrowser: View { struct WebBrowser_Previews: PreviewProvider { static var previews: some View { - WebBrowser(url: "", pageTitle: "", connectivity: Connectivity()) + let configMock = ConfigMock() + WebBrowser(url: "", pageTitle: "", connectivity: Connectivity(config: configMock)) } } diff --git a/Course/Course/Presentation/Container/CourseContainerView.swift b/Course/Course/Presentation/Container/CourseContainerView.swift index 28c049792..99d433bed 100644 --- a/Course/Course/Presentation/Container/CourseContainerView.swift +++ b/Course/Course/Presentation/Container/CourseContainerView.swift @@ -387,7 +387,7 @@ public struct CourseContainerView: View { router: CourseRouterMock(), analytics: CourseAnalyticsMock(), config: ConfigMock(), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), manager: DownloadManagerMock(), storage: CourseStorageMock(), isActive: true, @@ -403,7 +403,7 @@ public struct CourseContainerView: View { interactor: CourseInteractor.mock, router: CourseRouterMock(), cssInjector: CSSInjectorMock(), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), config: ConfigMock(), courseID: "1", courseName: "a", @@ -414,7 +414,7 @@ public struct CourseContainerView: View { interactor: CourseInteractor.mock, router: CourseRouterMock(), analytics: CourseAnalyticsMock(), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), ), courseID: "", title: "Title of Course", diff --git a/Course/Course/Presentation/Container/CourseContainerViewModel.swift b/Course/Course/Presentation/Container/CourseContainerViewModel.swift index f2abf08f8..31fdc9292 100644 --- a/Course/Course/Presentation/Container/CourseContainerViewModel.swift +++ b/Course/Course/Presentation/Container/CourseContainerViewModel.swift @@ -122,6 +122,7 @@ public final class CourseContainerViewModel: BaseCourseViewModel { private let interactor: CourseInteractorProtocol private let authInteractor: AuthInteractorProtocol + let analytics: CourseAnalytics let coreAnalytics: CoreAnalytics private(set) var storage: CourseStorage @@ -214,7 +215,7 @@ public final class CourseContainerViewModel: BaseCourseViewModel { courseVideoStructure: nil ) } - + @MainActor func getCourseStructure(courseID: String) async throws -> CourseStructure? { if isInternetAvaliable { @@ -1766,7 +1767,7 @@ extension CourseContainerViewModel { router: CourseRouterMock(), analytics: CourseAnalyticsMock(), config: ConfigMock(), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), manager: DownloadManagerMock(), storage: CourseStorageMock(), isActive: true, diff --git a/Course/Course/Presentation/Content/CourseContentView.swift b/Course/Course/Presentation/Content/CourseContentView.swift index 2422c2718..37f6d81b5 100644 --- a/Course/Course/Presentation/Content/CourseContentView.swift +++ b/Course/Course/Presentation/Content/CourseContentView.swift @@ -266,7 +266,7 @@ public struct CourseContentView: View { router: CourseRouterMock(), analytics: CourseAnalyticsMock(), config: ConfigMock(), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), manager: DownloadManagerMock(), storage: CourseStorageMock(), isActive: true, diff --git a/Course/Course/Presentation/Content/Subviews/AllContentView.swift b/Course/Course/Presentation/Content/Subviews/AllContentView.swift index 696586dd3..dc37c86b9 100644 --- a/Course/Course/Presentation/Content/Subviews/AllContentView.swift +++ b/Course/Course/Presentation/Content/Subviews/AllContentView.swift @@ -142,7 +142,7 @@ struct AllContentView: View { router: CourseRouterMock(), analytics: CourseAnalyticsMock(), config: ConfigMock(), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), manager: DownloadManagerMock(), storage: CourseStorageMock(), isActive: true, diff --git a/Course/Course/Presentation/Dates/CourseDatesView.swift b/Course/Course/Presentation/Dates/CourseDatesView.swift index 192b7c2a9..5de224b44 100644 --- a/Course/Course/Presentation/Dates/CourseDatesView.swift +++ b/Course/Course/Presentation/Dates/CourseDatesView.swift @@ -196,7 +196,7 @@ struct CourseDatesView_Previews: PreviewProvider { interactor: CourseInteractor(repository: CourseRepositoryMock()), router: CourseRouterMock(), cssInjector: CSSInjectorMock(), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), config: ConfigMock(), courseID: "", courseName: "", diff --git a/Course/Course/Presentation/Handouts/HandoutsView.swift b/Course/Course/Presentation/Handouts/HandoutsView.swift index d04be11af..82d74a408 100644 --- a/Course/Course/Presentation/Handouts/HandoutsView.swift +++ b/Course/Course/Presentation/Handouts/HandoutsView.swift @@ -123,7 +123,7 @@ struct HandoutsView_Previews: PreviewProvider { let viewModel = HandoutsViewModel(interactor: CourseInteractor.mock, router: CourseRouterMock(), cssInjector: CSSInjectorMock(), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), courseID: "", analytics: CourseAnalyticsMock()) HandoutsView( diff --git a/Course/Course/Presentation/NewOutlIineAndProgress/CourseOutlineAndProgressView.swift b/Course/Course/Presentation/NewOutlIineAndProgress/CourseOutlineAndProgressView.swift index 9cac447d0..d12aacff4 100644 --- a/Course/Course/Presentation/NewOutlIineAndProgress/CourseOutlineAndProgressView.swift +++ b/Course/Course/Presentation/NewOutlIineAndProgress/CourseOutlineAndProgressView.swift @@ -466,7 +466,7 @@ public struct CourseOutlineAndProgressView: View { interactor: CourseInteractor.mock, router: CourseRouterMock(), analytics: CourseAnalyticsMock(), - connectivity: Connectivity() + connectivity: Connectivity(config: ConfigMock()) ) let vmOutline = CourseContainerViewModel( interactor: CourseInteractor.mock, @@ -474,7 +474,7 @@ public struct CourseOutlineAndProgressView: View { router: CourseRouterMock(), analytics: CourseAnalyticsMock(), config: ConfigMock(), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), manager: DownloadManagerMock(), storage: CourseStorageMock(), isActive: true, @@ -487,7 +487,7 @@ public struct CourseOutlineAndProgressView: View { courseHelper: CourseDownloadHelper(courseStructure: nil, manager: DownloadManagerMock()) ) - return PreviewContainer( + PreviewContainer( viewModelContainer: vmOutline, viewModelProgress: vmProgress ) @@ -514,7 +514,7 @@ private struct PreviewContainer: View { collapsed: $collapsed, viewHeight: $viewHeight, dateTabIndex: 2, - connectivity: Connectivity() + connectivity: Connectivity(config: ConfigMock()) ) .loadFonts() .task { diff --git a/Course/Course/Presentation/Offline/OfflineView.swift b/Course/Course/Presentation/Offline/OfflineView.swift index 9b5cee5ed..168e9e574 100644 --- a/Course/Course/Presentation/Offline/OfflineView.swift +++ b/Course/Course/Presentation/Offline/OfflineView.swift @@ -249,7 +249,7 @@ struct OfflineView: View { router: CourseRouterMock(), analytics: CourseAnalyticsMock(), config: ConfigMock(), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), manager: DownloadManagerMock(), storage: CourseStorageMock(), isActive: true, diff --git a/Course/Course/Presentation/Offline/Subviews/LargestDownloadsView.swift b/Course/Course/Presentation/Offline/Subviews/LargestDownloadsView.swift index 7aa0930d7..3c13cd278 100644 --- a/Course/Course/Presentation/Offline/Subviews/LargestDownloadsView.swift +++ b/Course/Course/Presentation/Offline/Subviews/LargestDownloadsView.swift @@ -93,7 +93,7 @@ struct LargestDownloadsView_Previews: PreviewProvider { router: CourseRouterMock(), analytics: CourseAnalyticsMock(), config: ConfigMock(), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), manager: DownloadManagerMock(), storage: CourseStorageMock(), isActive: true, diff --git a/Course/Course/Presentation/Outline/CourseOutlineView.swift b/Course/Course/Presentation/Outline/CourseOutlineView.swift index 2c2c8565e..4049276ff 100644 --- a/Course/Course/Presentation/Outline/CourseOutlineView.swift +++ b/Course/Course/Presentation/Outline/CourseOutlineView.swift @@ -67,7 +67,9 @@ public struct CourseOutlineView: View { collapsed: $collapsed, viewHeight: $viewHeight ) + RefreshProgressView(isShowRefresh: $viewModel.isShowRefresh) + VStack(alignment: .leading) { if isVideo, @@ -334,7 +336,7 @@ struct CourseOutlineView_Previews: PreviewProvider { router: CourseRouterMock(), analytics: CourseAnalyticsMock(), config: ConfigMock(), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), manager: DownloadManagerMock(), storage: CourseStorageMock(), isActive: true, diff --git a/Course/Course/Presentation/Outline/CourseVertical/CourseVerticalView.swift b/Course/Course/Presentation/Outline/CourseVertical/CourseVerticalView.swift index 01266f36a..88a0efc0b 100644 --- a/Course/Course/Presentation/Outline/CourseVertical/CourseVerticalView.swift +++ b/Course/Course/Presentation/Outline/CourseVertical/CourseVerticalView.swift @@ -184,9 +184,9 @@ struct CourseVerticalView_Previews: PreviewProvider { sequentialIndex: 0, router: CourseRouterMock(), analytics: CourseAnalyticsMock(), - connectivity: Connectivity() + connectivity: Connectivity(config: ConfigMock()) ) - + return Group { CourseVerticalView( title: "Course title", diff --git a/Course/Course/Presentation/Progress/CourseProgressScreenView.swift b/Course/Course/Presentation/Progress/CourseProgressScreenView.swift index a72105241..3ee35119e 100644 --- a/Course/Course/Presentation/Progress/CourseProgressScreenView.swift +++ b/Course/Course/Presentation/Progress/CourseProgressScreenView.swift @@ -19,6 +19,7 @@ struct CourseProgressScreenView: View { @StateObject private var viewModel: CourseProgressViewModel + private let initialCourseStructure: CourseStructure? private let connectivity: ConnectivityProtocol @@ -37,7 +38,7 @@ struct CourseProgressScreenView: View { self._viewHeight = viewHeight self._viewModel = StateObject(wrappedValue: { viewModel }()) self.connectivity = connectivity - self.viewModel.courseStructure = courseStructure + self.initialCourseStructure = courseStructure } public var body: some View { @@ -111,6 +112,9 @@ struct CourseProgressScreenView: View { .ignoresSafeArea() ) .onFirstAppear { + if viewModel.courseStructure == nil { + viewModel.courseStructure = initialCourseStructure + } Task { await viewModel.getCourseProgress(courseID: courseID) } @@ -222,3 +226,25 @@ struct CourseProgressScreenView: View { } } } + +#if DEBUG +#Preview { + let vm = CourseProgressViewModel( + interactor: CourseInteractor.mock, + router: CourseRouterMock(), + analytics: CourseAnalyticsMock(), + connectivity: Connectivity(config: ConfigMock()) + ) + + CourseProgressScreenView( + courseID: "test", + coordinate: .constant(0), + collapsed: .constant(false), + viewHeight: .constant(0), + viewModel: vm, + connectivity: Connectivity(config: ConfigMock()), + courseStructure: nil + ) + .loadFonts() +} +#endif diff --git a/Course/Course/Presentation/Subviews/CourseCarouselView/CourseCompletionCarouselSlideView.swift b/Course/Course/Presentation/Subviews/CourseCarouselView/CourseCompletionCarouselSlideView.swift index 111c99697..3b2c7bf82 100644 --- a/Course/Course/Presentation/Subviews/CourseCarouselView/CourseCompletionCarouselSlideView.swift +++ b/Course/Course/Presentation/Subviews/CourseCarouselView/CourseCompletionCarouselSlideView.swift @@ -302,7 +302,7 @@ struct CourseCompletionCarouselSlideView: View { interactor: CourseInteractor.mock, router: CourseRouterMock(), analytics: CourseAnalyticsMock(), - connectivity: Connectivity() + connectivity: Connectivity(config: ConfigMock()) ), viewModelContainer: CourseContainerViewModel( interactor: CourseInteractor.mock, @@ -310,7 +310,7 @@ struct CourseCompletionCarouselSlideView: View { router: CourseRouterMock(), analytics: CourseAnalyticsMock(), config: ConfigMock(), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), manager: DownloadManagerMock(), storage: CourseStorageMock(), isActive: true, diff --git a/Course/Course/Presentation/Subviews/CourseCarouselView/CourseGradeCarouselSlideView.swift b/Course/Course/Presentation/Subviews/CourseCarouselView/CourseGradeCarouselSlideView.swift index 398c2855d..1c2a2d03b 100644 --- a/Course/Course/Presentation/Subviews/CourseCarouselView/CourseGradeCarouselSlideView.swift +++ b/Course/Course/Presentation/Subviews/CourseCarouselView/CourseGradeCarouselSlideView.swift @@ -131,7 +131,7 @@ struct CourseGradeCarouselSlideView: View { interactor: CourseInteractor.mock, router: CourseRouterMock(), analytics: CourseAnalyticsMock(), - connectivity: Connectivity() + connectivity: Connectivity(config: ConfigMock()) ), viewModelContainer: CourseContainerViewModel( interactor: CourseInteractor.mock, @@ -139,7 +139,7 @@ struct CourseGradeCarouselSlideView: View { router: CourseRouterMock(), analytics: CourseAnalyticsMock(), config: ConfigMock(), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), manager: DownloadManagerMock(), storage: CourseStorageMock(), isActive: true, diff --git a/Course/Course/Presentation/Subviews/CustomDisclosureGroup.swift b/Course/Course/Presentation/Subviews/CustomDisclosureGroup.swift index efde0257a..40c835205 100644 --- a/Course/Course/Presentation/Subviews/CustomDisclosureGroup.swift +++ b/Course/Course/Presentation/Subviews/CustomDisclosureGroup.swift @@ -417,7 +417,7 @@ struct CustomDisclosureGroup_Previews: PreviewProvider { router: CourseRouterMock(), analytics: CourseAnalyticsMock(), config: ConfigMock(), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), manager: DownloadManagerMock(), storage: CourseStorageMock(), isActive: true, diff --git a/Course/Course/Presentation/Unit/CourseNavigationView.swift b/Course/Course/Presentation/Unit/CourseNavigationView.swift index 8d5837fa3..2d25ec414 100644 --- a/Course/Course/Presentation/Unit/CourseNavigationView.swift +++ b/Course/Course/Presentation/Unit/CourseNavigationView.swift @@ -201,7 +201,7 @@ struct CourseNavigationView_Previews: PreviewProvider { config: ConfigMock(), router: CourseRouterMock(), analytics: CourseAnalyticsMock(), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), storage: CourseStorageMock(), manager: DownloadManagerMock() ) diff --git a/Course/Course/Presentation/Unit/CourseUnitView.swift b/Course/Course/Presentation/Unit/CourseUnitView.swift index ee7a9e835..9cc7e7fc9 100644 --- a/Course/Course/Presentation/Unit/CourseUnitView.swift +++ b/Course/Course/Presentation/Unit/CourseUnitView.swift @@ -766,7 +766,7 @@ struct CourseUnitView_Previews: PreviewProvider { config: ConfigMock(), router: CourseRouterMock(), analytics: CourseAnalyticsMock(), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), storage: CourseStorageMock(), manager: DownloadManagerMock() )) diff --git a/Course/Course/Presentation/Unit/Subviews/WebView.swift b/Course/Course/Presentation/Unit/Subviews/WebView.swift index b8823bda6..935884a28 100644 --- a/Course/Course/Presentation/Unit/Subviews/WebView.swift +++ b/Course/Course/Presentation/Unit/Subviews/WebView.swift @@ -23,7 +23,7 @@ struct WebView: View { url: url, dataUrl: localUrl, viewModel: Container.shared.resolve(WebUnitViewModel.self)!, - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), injections: injections, blockID: blockID ) diff --git a/Course/Course/Presentation/Video/EncodedVideoPlayer.swift b/Course/Course/Presentation/Video/EncodedVideoPlayer.swift index a2d69340a..52e2428f1 100644 --- a/Course/Course/Presentation/Video/EncodedVideoPlayer.swift +++ b/Course/Course/Presentation/Video/EncodedVideoPlayer.swift @@ -145,7 +145,7 @@ struct EncodedVideoPlayer_Previews: PreviewProvider { viewModel: EncodedVideoPlayerViewModel( languages: [], playerStateSubject: CurrentValueSubject(nil), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), playerHolder: PlayerViewControllerHolder.mock, appStorage: CoreStorageMock(), analytics: CourseAnalyticsMock() diff --git a/Course/Course/Presentation/Video/SubtitlesView.swift b/Course/Course/Presentation/Video/SubtitlesView.swift index 5f7efc8a6..1680f2191 100644 --- a/Course/Course/Presentation/Video/SubtitlesView.swift +++ b/Course/Course/Presentation/Video/SubtitlesView.swift @@ -124,7 +124,7 @@ struct SubtittlesView_Previews: PreviewProvider { viewModel: VideoPlayerViewModel( languages: [], playerStateSubject: CurrentValueSubject(nil), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), playerHolder: PlayerViewControllerHolder.mock, appStorage: CoreStorageMock(), analytics: CourseAnalyticsMock() diff --git a/Course/Course/Presentation/Video/YouTubeVideoPlayer.swift b/Course/Course/Presentation/Video/YouTubeVideoPlayer.swift index 5fdf549ad..cca23484f 100644 --- a/Course/Course/Presentation/Video/YouTubeVideoPlayer.swift +++ b/Course/Course/Presentation/Video/YouTubeVideoPlayer.swift @@ -91,7 +91,7 @@ struct YouTubeVideoPlayer_Previews: PreviewProvider { viewModel: YouTubeVideoPlayerViewModel( languages: [], playerStateSubject: CurrentValueSubject(nil), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), playerHolder: YoutubePlayerViewControllerHolder.mock, appStorage: CoreStorageMock(), analytics: CourseAnalyticsMock() diff --git a/Dashboard/Dashboard/Presentation/AllCoursesView.swift b/Dashboard/Dashboard/Presentation/AllCoursesView.swift index 4ab5fd905..8b8e77acc 100644 --- a/Dashboard/Dashboard/Presentation/AllCoursesView.swift +++ b/Dashboard/Dashboard/Presentation/AllCoursesView.swift @@ -205,7 +205,7 @@ struct AllCoursesView_Previews: PreviewProvider { static var previews: some View { let vm = AllCoursesViewModel( interactor: DashboardInteractor.mock, - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), analytics: DashboardAnalyticsMock(), storage: CoreStorageMock() ) diff --git a/Dashboard/Dashboard/Presentation/ListDashboardView.swift b/Dashboard/Dashboard/Presentation/ListDashboardView.swift index 8f668dcc5..ac397f6d6 100644 --- a/Dashboard/Dashboard/Presentation/ListDashboardView.swift +++ b/Dashboard/Dashboard/Presentation/ListDashboardView.swift @@ -163,7 +163,7 @@ struct ListDashboardView_Previews: PreviewProvider { static var previews: some View { let vm = ListDashboardViewModel( interactor: DashboardInteractor.mock, - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), analytics: DashboardAnalyticsMock(), storage: CoreStorageMock() ) diff --git a/Dashboard/Dashboard/Presentation/PrimaryCourseDashboardView.swift b/Dashboard/Dashboard/Presentation/PrimaryCourseDashboardView.swift index 905dcaaae..e0f6eff05 100644 --- a/Dashboard/Dashboard/Presentation/PrimaryCourseDashboardView.swift +++ b/Dashboard/Dashboard/Presentation/PrimaryCourseDashboardView.swift @@ -334,7 +334,7 @@ struct PrimaryCourseDashboardView_Previews: PreviewProvider { static var previews: some View { let vm = PrimaryCourseDashboardViewModel( interactor: DashboardInteractor.mock, - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), analytics: DashboardAnalyticsMock(), config: ConfigMock(), storage: CoreStorageMock(), diff --git a/Discovery/Discovery/Presentation/NativeDiscovery/CourseDetailsView.swift b/Discovery/Discovery/Presentation/NativeDiscovery/CourseDetailsView.swift index 2cbe294c1..fe1c32657 100644 --- a/Discovery/Discovery/Presentation/NativeDiscovery/CourseDetailsView.swift +++ b/Discovery/Discovery/Presentation/NativeDiscovery/CourseDetailsView.swift @@ -439,7 +439,7 @@ struct CourseDetailsView_Previews: PreviewProvider { analytics: DiscoveryAnalyticsMock(), config: ConfigMock(), cssInjector: CSSInjectorMock(), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), storage: CoreStorageMock() ) diff --git a/Discovery/Discovery/Presentation/NativeDiscovery/DiscoveryView.swift b/Discovery/Discovery/Presentation/NativeDiscovery/DiscoveryView.swift index ffeb3451b..cafe26adb 100644 --- a/Discovery/Discovery/Presentation/NativeDiscovery/DiscoveryView.swift +++ b/Discovery/Discovery/Presentation/NativeDiscovery/DiscoveryView.swift @@ -211,7 +211,7 @@ struct DiscoveryView_Previews: PreviewProvider { let vm = DiscoveryViewModel(router: DiscoveryRouterMock(), config: ConfigMock(), interactor: DiscoveryInteractor.mock, - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), analytics: DiscoveryAnalyticsMock(), storage: CoreStorageMock()) let router = DiscoveryRouterMock() diff --git a/Discovery/Discovery/Presentation/NativeDiscovery/SearchView.swift b/Discovery/Discovery/Presentation/NativeDiscovery/SearchView.swift index c059dbcba..7c565bfad 100644 --- a/Discovery/Discovery/Presentation/NativeDiscovery/SearchView.swift +++ b/Discovery/Discovery/Presentation/NativeDiscovery/SearchView.swift @@ -222,7 +222,7 @@ struct SearchView_Previews: PreviewProvider { let router = DiscoveryRouterMock() let vm = SearchViewModel( interactor: DiscoveryInteractor.mock, - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), router: router, analytics: DiscoveryAnalyticsMock(), storage: CoreStorageMock(), diff --git a/Discovery/Discovery/Presentation/WebPrograms/ProgramWebviewView.swift b/Discovery/Discovery/Presentation/WebPrograms/ProgramWebviewView.swift index a206303d8..dbfc60403 100644 --- a/Discovery/Discovery/Presentation/WebPrograms/ProgramWebviewView.swift +++ b/Discovery/Discovery/Presentation/WebPrograms/ProgramWebviewView.swift @@ -139,7 +139,7 @@ struct ProgramWebviewView_Previews: PreviewProvider { router: DiscoveryRouterMock(), config: ConfigMock(), interactor: DiscoveryInteractor.mock, - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), analytics: DiscoveryAnalyticsMock(), authInteractor: AuthInteractor.mock ), diff --git a/Discovery/DiscoveryTests/Presentation/DiscoveryViewModelTests.swift b/Discovery/DiscoveryTests/Presentation/DiscoveryViewModelTests.swift index f9918498d..8b9beb780 100644 --- a/Discovery/DiscoveryTests/Presentation/DiscoveryViewModelTests.swift +++ b/Discovery/DiscoveryTests/Presentation/DiscoveryViewModelTests.swift @@ -25,7 +25,7 @@ final class DiscoveryViewModelTests: XCTestCase { func testGetDiscoveryCourses() async throws { let interactor = DiscoveryInteractorProtocolMock() - let connectivity = Connectivity() + let connectivity = Connectivity(config: ConfigMock()) let analytics = DiscoveryAnalyticsMock() let viewModel = DiscoveryViewModel(router: DiscoveryRouterMock(), config: ConfigMock(), @@ -81,7 +81,7 @@ final class DiscoveryViewModelTests: XCTestCase { func testDiscoverySuccess() async throws { let interactor = DiscoveryInteractorProtocolMock() - let connectivity = Connectivity() + let connectivity = Connectivity(config: ConfigMock()) let analytics = DiscoveryAnalyticsMock() let viewModel = DiscoveryViewModel(router: DiscoveryRouterMock(), config: ConfigMock(), @@ -191,7 +191,7 @@ final class DiscoveryViewModelTests: XCTestCase { func testDiscoveryNoInternetError() async throws { let interactor = DiscoveryInteractorProtocolMock() - let connectivity = Connectivity() + let connectivity = Connectivity(config: ConfigMock()) let analytics = DiscoveryAnalyticsMock() let viewModel = DiscoveryViewModel(router: DiscoveryRouterMock(), config: ConfigMock(), @@ -215,7 +215,7 @@ final class DiscoveryViewModelTests: XCTestCase { func testDiscoveryUnknownError() async throws { let interactor = DiscoveryInteractorProtocolMock() - let connectivity = Connectivity() + let connectivity = Connectivity(config: ConfigMock()) let analytics = DiscoveryAnalyticsMock() let viewModel = DiscoveryViewModel(router: DiscoveryRouterMock(), config: ConfigMock(), diff --git a/Discovery/DiscoveryTests/Presentation/SearchViewModelTests.swift b/Discovery/DiscoveryTests/Presentation/SearchViewModelTests.swift index a1851efcc..d837f982c 100644 --- a/Discovery/DiscoveryTests/Presentation/SearchViewModelTests.swift +++ b/Discovery/DiscoveryTests/Presentation/SearchViewModelTests.swift @@ -25,7 +25,7 @@ final class SearchViewModelTests: XCTestCase { func testSearchSuccess() async throws { let interactor = DiscoveryInteractorProtocolMock() - let connectivity = Connectivity() + let connectivity = Connectivity(config: ConfigMock()) let analytics = DiscoveryAnalyticsMock() let router = DiscoveryRouterMock() let viewModel = SearchViewModel( @@ -87,7 +87,7 @@ final class SearchViewModelTests: XCTestCase { func testSearchEmptyQuerySuccess() async throws { let interactor = DiscoveryInteractorProtocolMock() - let connectivity = Connectivity() + let connectivity = Connectivity(config: ConfigMock()) let analytics = DiscoveryAnalyticsMock() let router = DiscoveryRouterMock() let viewModel = SearchViewModel( @@ -111,7 +111,7 @@ final class SearchViewModelTests: XCTestCase { func testSearchNoInternetError() async throws { let interactor = DiscoveryInteractorProtocolMock() - let connectivity = Connectivity() + let connectivity = Connectivity(config: ConfigMock()) let analytics = DiscoveryAnalyticsMock() let router = DiscoveryRouterMock() let viewModel = SearchViewModel( @@ -143,7 +143,7 @@ final class SearchViewModelTests: XCTestCase { func testSearchUnknownError() async throws { let interactor = DiscoveryInteractorProtocolMock() - let connectivity = Connectivity() + let connectivity = Connectivity(config: ConfigMock()) let analytics = DiscoveryAnalyticsMock() let router = DiscoveryRouterMock() let viewModel = SearchViewModel( diff --git a/Downloads/Downloads/Presentation/AppDownloadsViewModel.swift b/Downloads/Downloads/Presentation/AppDownloadsViewModel.swift index 104efc6f7..79696e030 100644 --- a/Downloads/Downloads/Presentation/AppDownloadsViewModel.swift +++ b/Downloads/Downloads/Presentation/AppDownloadsViewModel.swift @@ -779,7 +779,7 @@ public extension AppDownloadsViewModel { interactor: DownloadsInteractor.mock, courseManager: CourseStructureManagerMock(), downloadManager: DownloadManagerMock(), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), downloadsHelper: DownloadsHelperMock(), router: DownloadsRouterMock(), storage: DownloadsStorageMock(), diff --git a/OpenEdX.xcodeproj/project.pbxproj b/OpenEdX.xcodeproj/project.pbxproj index ddfa0c30b..8169808be 100644 --- a/OpenEdX.xcodeproj/project.pbxproj +++ b/OpenEdX.xcodeproj/project.pbxproj @@ -47,7 +47,7 @@ 07D5DA3528D075AA00752FD9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07D5DA3428D075AA00752FD9 /* AppDelegate.swift */; }; 07D5DA3E28D075AB00752FD9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 07D5DA3D28D075AB00752FD9 /* Assets.xcassets */; }; 149FF39E2B9F1AB50034B33F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 149FF39C2B9F1AB50034B33F /* LaunchScreen.storyboard */; }; - 3ACA3A1E886F3F9B2735B9AF /* Pods_App_OpenEdX.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D27E034A83DDEBF18D53B04 /* Pods_App_OpenEdX.framework */; }; + 705A908842AAAFC361CD9D52 /* Pods_App_OpenEdX.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58FAA9E3ECC93D0E638D877D /* Pods_App_OpenEdX.framework */; }; A500668B2B613ED10024680B /* PushNotificationsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A500668A2B613ED10024680B /* PushNotificationsManager.swift */; }; A500668D2B6143000024680B /* FCMProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = A500668C2B6143000024680B /* FCMProvider.swift */; }; A50066932B614DCD0024680B /* FCMListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50066922B614DCD0024680B /* FCMListener.swift */; }; @@ -95,7 +95,6 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 005D1F4D92679D24B3BAA8FE /* Pods-App-OpenEdX.releasedev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-OpenEdX.releasedev.xcconfig"; path = "Target Support Files/Pods-App-OpenEdX/Pods-App-OpenEdX.releasedev.xcconfig"; sourceTree = ""; }; 020CA5D82AA0A25300970AAF /* AppStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppStorage.swift; sourceTree = ""; }; 0218196328F734FA00202564 /* Discussion.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Discussion.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 0219C67628F4347600D64452 /* Course.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Course.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -136,9 +135,12 @@ 07D5DA3428D075AA00752FD9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 07D5DA3D28D075AB00752FD9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 149FF39D2B9F1AB50034B33F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 3D27E034A83DDEBF18D53B04 /* Pods_App_OpenEdX.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_App_OpenEdX.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 4449C4D4F119C87B452DDFCD /* Pods-App-OpenEdX.releaseprod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-OpenEdX.releaseprod.xcconfig"; path = "Target Support Files/Pods-App-OpenEdX/Pods-App-OpenEdX.releaseprod.xcconfig"; sourceTree = ""; }; - 8A45E2C9AF0CBE70A09FB37B /* Pods-App-OpenEdX.debugstage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-OpenEdX.debugstage.xcconfig"; path = "Target Support Files/Pods-App-OpenEdX/Pods-App-OpenEdX.debugstage.xcconfig"; sourceTree = ""; }; + 23F5E05C0D7EC044B0C9E719 /* Pods-App-OpenEdX.debugstage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-OpenEdX.debugstage.xcconfig"; path = "Target Support Files/Pods-App-OpenEdX/Pods-App-OpenEdX.debugstage.xcconfig"; sourceTree = ""; }; + 2C04239322282B0E6963D56B /* Pods-App-OpenEdX.debugdev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-OpenEdX.debugdev.xcconfig"; path = "Target Support Files/Pods-App-OpenEdX/Pods-App-OpenEdX.debugdev.xcconfig"; sourceTree = ""; }; + 58FAA9E3ECC93D0E638D877D /* Pods_App_OpenEdX.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_App_OpenEdX.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 6EAAEFD45AC766684492B1F7 /* Pods-App-OpenEdX.releasestage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-OpenEdX.releasestage.xcconfig"; path = "Target Support Files/Pods-App-OpenEdX/Pods-App-OpenEdX.releasestage.xcconfig"; sourceTree = ""; }; + 84185F0B853BA4F0A8C0217C /* Pods-App-OpenEdX.releaseprod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-OpenEdX.releaseprod.xcconfig"; path = "Target Support Files/Pods-App-OpenEdX/Pods-App-OpenEdX.releaseprod.xcconfig"; sourceTree = ""; }; + 8A39EAD8663E6F16A59AF82E /* Pods-App-OpenEdX.releasedev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-OpenEdX.releasedev.xcconfig"; path = "Target Support Files/Pods-App-OpenEdX/Pods-App-OpenEdX.releasedev.xcconfig"; sourceTree = ""; }; A500668A2B613ED10024680B /* PushNotificationsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PushNotificationsManager.swift; sourceTree = ""; }; A500668C2B6143000024680B /* FCMProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FCMProvider.swift; sourceTree = ""; }; A50066922B614DCD0024680B /* FCMListener.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FCMListener.swift; sourceTree = ""; }; @@ -147,14 +149,12 @@ A59568962B61653700ED4F90 /* DeepLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeepLink.swift; sourceTree = ""; }; A59568982B616D9400ED4F90 /* PushLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PushLink.swift; sourceTree = ""; }; BA7468752B96201D00793145 /* DeepLinkRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeepLinkRouter.swift; sourceTree = ""; }; - CCE1E0F850D3E25C0D6C6702 /* Pods-App-OpenEdX.debugdev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-OpenEdX.debugdev.xcconfig"; path = "Target Support Files/Pods-App-OpenEdX/Pods-App-OpenEdX.debugdev.xcconfig"; sourceTree = ""; }; CE1D5B7A2CE60E000019CA34 /* ContainerMainActor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContainerMainActor.swift; sourceTree = ""; }; CE3BD14D2CBEB0DA0026F4E3 /* PluginManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PluginManager.swift; sourceTree = ""; }; CEB36E512D6A29CE00907A89 /* Downloads.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Downloads.framework; sourceTree = BUILT_PRODUCTS_DIR; }; CEE5EDED2D6E0A290089F67C /* DownloadsPersistence.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadsPersistence.swift; sourceTree = ""; }; - D70D30110012B7D52D05E876 /* Pods-App-OpenEdX.debugprod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-OpenEdX.debugprod.xcconfig"; path = "Target Support Files/Pods-App-OpenEdX/Pods-App-OpenEdX.debugprod.xcconfig"; sourceTree = ""; }; E0D6E6A22B1626B10089F9C9 /* Theme.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Theme.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - FD0CE8D22B755B4003A113BB /* Pods-App-OpenEdX.releasestage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-OpenEdX.releasestage.xcconfig"; path = "Target Support Files/Pods-App-OpenEdX/Pods-App-OpenEdX.releasestage.xcconfig"; sourceTree = ""; }; + F6C9DA21C55F17F9F1F1D9A1 /* Pods-App-OpenEdX.debugprod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App-OpenEdX.debugprod.xcconfig"; path = "Target Support Files/Pods-App-OpenEdX/Pods-App-OpenEdX.debugprod.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -176,7 +176,7 @@ 0219C67728F4347600D64452 /* Course.framework in Frameworks */, CEBA52772CEBB69100619E2B /* OEXFirebaseAnalytics in Frameworks */, 027DB33028D8A063002B6862 /* Dashboard.framework in Frameworks */, - 3ACA3A1E886F3F9B2735B9AF /* Pods_App_OpenEdX.framework in Frameworks */, + 705A908842AAAFC361CD9D52 /* Pods_App_OpenEdX.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -282,7 +282,7 @@ 072787B028D34D83002E9142 /* Discovery.framework */, 0770DE4A28D0A462006D8A5D /* Authorization.framework */, 0770DE1228D07845006D8A5D /* Core.framework */, - 3D27E034A83DDEBF18D53B04 /* Pods_App_OpenEdX.framework */, + 58FAA9E3ECC93D0E638D877D /* Pods_App_OpenEdX.framework */, ); name = Frameworks; sourceTree = ""; @@ -290,12 +290,12 @@ 55A895025FB07897BA68E063 /* Pods */ = { isa = PBXGroup; children = ( - D70D30110012B7D52D05E876 /* Pods-App-OpenEdX.debugprod.xcconfig */, - 8A45E2C9AF0CBE70A09FB37B /* Pods-App-OpenEdX.debugstage.xcconfig */, - CCE1E0F850D3E25C0D6C6702 /* Pods-App-OpenEdX.debugdev.xcconfig */, - 4449C4D4F119C87B452DDFCD /* Pods-App-OpenEdX.releaseprod.xcconfig */, - FD0CE8D22B755B4003A113BB /* Pods-App-OpenEdX.releasestage.xcconfig */, - 005D1F4D92679D24B3BAA8FE /* Pods-App-OpenEdX.releasedev.xcconfig */, + F6C9DA21C55F17F9F1F1D9A1 /* Pods-App-OpenEdX.debugprod.xcconfig */, + 23F5E05C0D7EC044B0C9E719 /* Pods-App-OpenEdX.debugstage.xcconfig */, + 2C04239322282B0E6963D56B /* Pods-App-OpenEdX.debugdev.xcconfig */, + 84185F0B853BA4F0A8C0217C /* Pods-App-OpenEdX.releaseprod.xcconfig */, + 6EAAEFD45AC766684492B1F7 /* Pods-App-OpenEdX.releasestage.xcconfig */, + 8A39EAD8663E6F16A59AF82E /* Pods-App-OpenEdX.releasedev.xcconfig */, ); path = Pods; sourceTree = ""; @@ -390,7 +390,7 @@ isa = PBXNativeTarget; buildConfigurationList = 07D5DA4528D075AB00752FD9 /* Build configuration list for PBXNativeTarget "OpenEdX" */; buildPhases = ( - B2F937DF587D9697AF13B3F9 /* [CP] Check Pods Manifest.lock */, + 8389A0AC71F15AC25A0DF8E0 /* [CP] Check Pods Manifest.lock */, 0770DE2328D08647006D8A5D /* SwiftLint */, 07D5DA2D28D075AA00752FD9 /* Sources */, 07D5DA2E28D075AA00752FD9 /* Frameworks */, @@ -511,7 +511,7 @@ shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/SwiftLint/swiftlint\"\n"; }; - B2F937DF587D9697AF13B3F9 /* [CP] Check Pods Manifest.lock */ = { + 8389A0AC71F15AC25A0DF8E0 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -694,7 +694,7 @@ }; 02DD1C9629E80CC200F35DCE /* DebugStage */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8A45E2C9AF0CBE70A09FB37B /* Pods-App-OpenEdX.debugstage.xcconfig */; + baseConfigurationReference = 23F5E05C0D7EC044B0C9E719 /* Pods-App-OpenEdX.debugstage.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -786,7 +786,7 @@ }; 02DD1C9829E80CCB00F35DCE /* ReleaseStage */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FD0CE8D22B755B4003A113BB /* Pods-App-OpenEdX.releasestage.xcconfig */; + baseConfigurationReference = 6EAAEFD45AC766684492B1F7 /* Pods-App-OpenEdX.releasestage.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -884,7 +884,7 @@ }; 0727875928D231FD002E9142 /* DebugDev */ = { isa = XCBuildConfiguration; - baseConfigurationReference = CCE1E0F850D3E25C0D6C6702 /* Pods-App-OpenEdX.debugdev.xcconfig */; + baseConfigurationReference = 2C04239322282B0E6963D56B /* Pods-App-OpenEdX.debugdev.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -976,7 +976,7 @@ }; 0727875B28D23204002E9142 /* ReleaseDev */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 005D1F4D92679D24B3BAA8FE /* Pods-App-OpenEdX.releasedev.xcconfig */; + baseConfigurationReference = 8A39EAD8663E6F16A59AF82E /* Pods-App-OpenEdX.releasedev.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1128,7 +1128,7 @@ }; 07D5DA4628D075AB00752FD9 /* DebugProd */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D70D30110012B7D52D05E876 /* Pods-App-OpenEdX.debugprod.xcconfig */; + baseConfigurationReference = F6C9DA21C55F17F9F1F1D9A1 /* Pods-App-OpenEdX.debugprod.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1166,7 +1166,7 @@ }; 07D5DA4728D075AB00752FD9 /* ReleaseProd */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 4449C4D4F119C87B452DDFCD /* Pods-App-OpenEdX.releaseprod.xcconfig */; + baseConfigurationReference = 84185F0B853BA4F0A8C0217C /* Pods-App-OpenEdX.releaseprod.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; diff --git a/OpenEdX/DI/AppAssembly.swift b/OpenEdX/DI/AppAssembly.swift index f90b6a500..93bb9cb52 100644 --- a/OpenEdX/DI/AppAssembly.swift +++ b/OpenEdX/DI/AppAssembly.swift @@ -86,11 +86,7 @@ class AppAssembly: Assembly { container.register(DownloadsAnalytics.self) { r in r.resolve(AnalyticsManager.self)! }.inObjectScope(.container) - - container.register(ConnectivityProtocol.self) { @MainActor _ in - Connectivity() - } - + container.register(DatabaseManager.self) { _ in DatabaseManager(databaseName: "Database") }.inObjectScope(.container) @@ -193,7 +189,7 @@ class AppAssembly: Assembly { keychain: r.resolve(KeychainSwift.self)! ) } - + container.register(Validator.self) { _ in Validator() }.inObjectScope(.container) @@ -235,6 +231,13 @@ class AppAssembly: Assembly { courseDropDownNavigationEnabled: config.uiComponents.courseDropDownNavigationEnabled ) }.inObjectScope(.container) + + container.register(ConnectivityProtocol.self) { @MainActor r in + Connectivity( + config: r.resolve(ConfigProtocol.self)!, + timeout: 15 + ) + }.inObjectScope(.container) } } // swiftlint:enable function_body_length diff --git a/Podfile.lock b/Podfile.lock index ab2424669..92ba93fc7 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -36,4 +36,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 2d71ad797d49fa32b47c3315b92159de82824103 -COCOAPODS: 1.16.2 +COCOAPODS: 1.15.2 diff --git a/Profile/Profile/Presentation/DatesAndCalendar/CoursesToSyncView.swift b/Profile/Profile/Presentation/DatesAndCalendar/CoursesToSyncView.swift index ede274a85..f1aae91ef 100644 --- a/Profile/Profile/Presentation/DatesAndCalendar/CoursesToSyncView.swift +++ b/Profile/Profile/Presentation/DatesAndCalendar/CoursesToSyncView.swift @@ -158,7 +158,7 @@ struct CoursesToSyncView_Previews: PreviewProvider { profileStorage: ProfileStorageMock(), persistence: ProfilePersistenceMock(), calendarManager: CalendarManagerMock(), - connectivity: Connectivity() + connectivity: Connectivity(config: ConfigMock()) ) return CoursesToSyncView(viewModel: vm) .previewDisplayName("Courses to Sync") diff --git a/Profile/Profile/Presentation/DatesAndCalendar/DatesAndCalendarView.swift b/Profile/Profile/Presentation/DatesAndCalendar/DatesAndCalendarView.swift index 52ef209f9..6539ea081 100644 --- a/Profile/Profile/Presentation/DatesAndCalendar/DatesAndCalendarView.swift +++ b/Profile/Profile/Presentation/DatesAndCalendar/DatesAndCalendarView.swift @@ -188,7 +188,7 @@ struct DatesAndCalendarView_Previews: PreviewProvider { profileStorage: ProfileStorageMock(), persistence: ProfilePersistenceMock(), calendarManager: CalendarManagerMock(), - connectivity: Connectivity() + connectivity: Connectivity(config: ConfigMock()) ) DatesAndCalendarView(viewModel: vm) .loadFonts() diff --git a/Profile/Profile/Presentation/DatesAndCalendar/Elements/NewCalendarView.swift b/Profile/Profile/Presentation/DatesAndCalendar/Elements/NewCalendarView.swift index 9d8b9dd70..ed4e27b8a 100644 --- a/Profile/Profile/Presentation/DatesAndCalendar/Elements/NewCalendarView.swift +++ b/Profile/Profile/Presentation/DatesAndCalendar/Elements/NewCalendarView.swift @@ -167,7 +167,7 @@ struct NewCalendarView: View { profileStorage: ProfileStorageMock(), persistence: ProfilePersistenceMock(), calendarManager: CalendarManagerMock(), - connectivity: Connectivity() + connectivity: Connectivity(config: ConfigMock()) ), beginSyncingTapped: { }, diff --git a/Profile/Profile/Presentation/DatesAndCalendar/SyncCalendarOptionsView.swift b/Profile/Profile/Presentation/DatesAndCalendar/SyncCalendarOptionsView.swift index b5aa1e691..be28cc458 100644 --- a/Profile/Profile/Presentation/DatesAndCalendar/SyncCalendarOptionsView.swift +++ b/Profile/Profile/Presentation/DatesAndCalendar/SyncCalendarOptionsView.swift @@ -271,7 +271,7 @@ struct SyncCalendarOptionsView_Previews: PreviewProvider { profileStorage: ProfileStorageMock(), persistence: ProfilePersistenceMock(), calendarManager: CalendarManagerMock(), - connectivity: Connectivity() + connectivity: Connectivity(config: ConfigMock()) ) SyncCalendarOptionsView(viewModel: vm) .loadFonts() diff --git a/Profile/Profile/Presentation/DeleteAccount/DeleteAccountView.swift b/Profile/Profile/Presentation/DeleteAccount/DeleteAccountView.swift index 585c06279..9b2ad9525 100644 --- a/Profile/Profile/Presentation/DeleteAccount/DeleteAccountView.swift +++ b/Profile/Profile/Presentation/DeleteAccount/DeleteAccountView.swift @@ -188,7 +188,7 @@ struct DeleteAccountView_Previews: PreviewProvider { let vm = DeleteAccountViewModel( interactor: ProfileInteractor.mock, router: router, - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), analytics: ProfileAnalyticsMock() ) diff --git a/Profile/Profile/Presentation/Profile/ProfileView.swift b/Profile/Profile/Presentation/Profile/ProfileView.swift index 1691afc3d..b1c2e6c6d 100644 --- a/Profile/Profile/Presentation/Profile/ProfileView.swift +++ b/Profile/Profile/Presentation/Profile/ProfileView.swift @@ -189,14 +189,15 @@ public struct ProfileView: View { struct ProfileView_Previews: PreviewProvider { static var previews: some View { let router = ProfileRouterMock() + let config = ConfigMock() let vm = ProfileViewModel( interactor: ProfileInteractor.mock, router: router, analytics: ProfileAnalyticsMock(), - config: ConfigMock(), - connectivity: Connectivity() + config: config, + connectivity: Connectivity(config: config) ) - + ProfileView(viewModel: vm) .preferredColorScheme(.light) .previewDisplayName("DiscoveryView Light") diff --git a/Profile/Profile/Presentation/Settings/ManageAccountView.swift b/Profile/Profile/Presentation/Settings/ManageAccountView.swift index 8b791d42b..154eddbcf 100644 --- a/Profile/Profile/Presentation/Settings/ManageAccountView.swift +++ b/Profile/Profile/Presentation/Settings/ManageAccountView.swift @@ -201,11 +201,13 @@ public struct ManageAccountView: View { struct ManageAccountView_Previews: PreviewProvider { static var previews: some View { let router = ProfileRouterMock() + let configMock = ConfigMock() + let vm = ManageAccountViewModel( router: router, analytics: ProfileAnalyticsMock(), - config: ConfigMock(), - connectivity: Connectivity(), + config: configMock, + connectivity: Connectivity(config: configMock), interactor: ProfileInteractor.mock ) diff --git a/Profile/Profile/Presentation/Settings/SettingsView.swift b/Profile/Profile/Presentation/Settings/SettingsView.swift index e58533f4d..b1410b656 100644 --- a/Profile/Profile/Presentation/Settings/SettingsView.swift +++ b/Profile/Profile/Presentation/Settings/SettingsView.swift @@ -254,7 +254,7 @@ public struct SettingsView: View { coreAnalytics: CoreAnalyticsMock(), config: ConfigMock(), corePersistence: CorePersistenceMock(), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), coreStorage: CoreStorageMock() ) diff --git a/Profile/Profile/Presentation/Settings/VideoQualityView.swift b/Profile/Profile/Presentation/Settings/VideoQualityView.swift index d06c1ea9f..8f662976d 100644 --- a/Profile/Profile/Presentation/Settings/VideoQualityView.swift +++ b/Profile/Profile/Presentation/Settings/VideoQualityView.swift @@ -134,7 +134,7 @@ public struct VideoQualityView: View { coreAnalytics: CoreAnalyticsMock(), config: ConfigMock(), corePersistence: CorePersistenceMock(), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), coreStorage: CoreStorageMock() ) diff --git a/Profile/Profile/Presentation/Settings/VideoSettingsView.swift b/Profile/Profile/Presentation/Settings/VideoSettingsView.swift index 3e4fd4b4c..a8c29bcc0 100644 --- a/Profile/Profile/Presentation/Settings/VideoSettingsView.swift +++ b/Profile/Profile/Presentation/Settings/VideoSettingsView.swift @@ -141,7 +141,7 @@ public struct VideoSettingsView: View { coreAnalytics: CoreAnalyticsMock(), config: ConfigMock(), corePersistence: CorePersistenceMock(), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), coreStorage: CoreStorageMock() ) diff --git a/Profile/ProfileTests/Presentation/Settings/SettingsViewModelTests.swift b/Profile/ProfileTests/Presentation/Settings/SettingsViewModelTests.swift index d9e80e66f..3455d8814 100644 --- a/Profile/ProfileTests/Presentation/Settings/SettingsViewModelTests.swift +++ b/Profile/ProfileTests/Presentation/Settings/SettingsViewModelTests.swift @@ -44,7 +44,7 @@ final class SettingsViewModelTests: XCTestCase { coreAnalytics: coreAnalytics, config: ConfigMock(), corePersistence: CorePersistenceMock(), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), coreStorage: storage ) @@ -82,7 +82,7 @@ final class SettingsViewModelTests: XCTestCase { coreAnalytics: coreAnalytics, config: ConfigMock(), corePersistence: CorePersistenceMock(), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), coreStorage: storage ) @@ -119,7 +119,7 @@ final class SettingsViewModelTests: XCTestCase { coreAnalytics: coreAnalytics, config: ConfigMock(), corePersistence: CorePersistenceMock(), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), coreStorage: storage ) @@ -156,7 +156,7 @@ final class SettingsViewModelTests: XCTestCase { coreAnalytics: coreAnalytics, config: ConfigMock(), corePersistence: CorePersistenceMock(), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), coreStorage: storage ) @@ -193,7 +193,7 @@ final class SettingsViewModelTests: XCTestCase { coreAnalytics: coreAnalytics, config: ConfigMock(), corePersistence: CorePersistenceMock(), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), coreStorage: storage ) @@ -230,7 +230,7 @@ final class SettingsViewModelTests: XCTestCase { coreAnalytics: coreAnalytics, config: ConfigMock(), corePersistence: CorePersistenceMock(), - connectivity: Connectivity(), + connectivity: Connectivity(config: ConfigMock()), coreStorage: storage )