diff --git a/Authorization/Authorization.xcodeproj/project.pbxproj b/Authorization/Authorization.xcodeproj/project.pbxproj index 9e9990972..9377a2963 100644 --- a/Authorization/Authorization.xcodeproj/project.pbxproj +++ b/Authorization/Authorization.xcodeproj/project.pbxproj @@ -613,7 +613,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -724,7 +724,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -948,7 +948,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1041,7 +1041,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1139,7 +1139,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1232,7 +1232,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1388,7 +1388,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1423,7 +1423,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/Authorization/Authorization/Presentation/Login/SignInView.swift b/Authorization/Authorization/Presentation/Login/SignInView.swift index 4369f2fab..b3f8ef784 100644 --- a/Authorization/Authorization/Presentation/Login/SignInView.swift +++ b/Authorization/Authorization/Presentation/Login/SignInView.swift @@ -15,7 +15,7 @@ public struct SignInView: View { @State private var email: String = "" @State private var password: String = "" - @Environment (\.isHorizontal) private var isHorizontal + @Environment(\.isHorizontal) private var isHorizontal @ObservedObject private var viewModel: SignInViewModel @@ -209,7 +209,7 @@ public struct SignInView: View { } } } - .hideNavigationBar() + .navigationBarHidden(true) .ignoresSafeArea(.all, edges: .horizontal) .background(Theme.Colors.background.ignoresSafeArea(.all)) .onFirstAppear{ diff --git a/Authorization/Authorization/Presentation/Registration/SignUpView.swift b/Authorization/Authorization/Presentation/Registration/SignUpView.swift index 7ec2c8ba5..d63a3b9ef 100644 --- a/Authorization/Authorization/Presentation/Registration/SignUpView.swift +++ b/Authorization/Authorization/Presentation/Registration/SignUpView.swift @@ -14,7 +14,7 @@ public struct SignUpView: View { @State private var disclosureGroupOpen: Bool = false - @Environment (\.isHorizontal) private var isHorizontal + @Environment(\.isHorizontal) private var isHorizontal @ObservedObject private var viewModel: SignUpViewModel @@ -195,7 +195,7 @@ public struct SignUpView: View { } .ignoresSafeArea(.all, edges: .horizontal) .background(Theme.Colors.background.ignoresSafeArea(.all)) - .hideNavigationBar() + .navigationBarHidden(true) .onFirstAppear{ viewModel.trackScreenEvent() } diff --git a/Authorization/Authorization/Presentation/Reset Password/ResetPasswordView.swift b/Authorization/Authorization/Presentation/Reset Password/ResetPasswordView.swift index 27dedad2f..2a993a7eb 100644 --- a/Authorization/Authorization/Presentation/Reset Password/ResetPasswordView.swift +++ b/Authorization/Authorization/Presentation/Reset Password/ResetPasswordView.swift @@ -15,7 +15,7 @@ public struct ResetPasswordView: View { @State private var isRecovered: Bool = false - @Environment (\.isHorizontal) private var isHorizontal + @Environment(\.isHorizontal) private var isHorizontal @ObservedObject private var viewModel: ResetPasswordViewModel @@ -173,10 +173,8 @@ public struct ResetPasswordView: View { } } .ignoresSafeArea(.all, edges: .horizontal) - .background(Theme.Colors.background.ignoresSafeArea(.all)) - - .hideNavigationBar() + .navigationBarHidden(true) } } } diff --git a/Authorization/Authorization/Presentation/Startup/StartupView.swift b/Authorization/Authorization/Presentation/Startup/StartupView.swift index 88551d824..59d5772b4 100644 --- a/Authorization/Authorization/Presentation/Startup/StartupView.swift +++ b/Authorization/Authorization/Presentation/Startup/StartupView.swift @@ -119,7 +119,7 @@ public struct StartupView: View { .frameLimit() } .navigationTitle(AuthLocalization.Startup.title) - .hideNavigationBar() + .navigationBarHidden(true) .padding(.all, isHorizontal ? 1 : 0) .background(Theme.Colors.background.ignoresSafeArea(.all)) .ignoresSafeArea(.keyboard, edges: .bottom) diff --git a/Core/Core.xcodeproj/project.pbxproj b/Core/Core.xcodeproj/project.pbxproj index d68bf217b..d67c20bb5 100644 --- a/Core/Core.xcodeproj/project.pbxproj +++ b/Core/Core.xcodeproj/project.pbxproj @@ -14,8 +14,8 @@ 021D924828DC860C00ACC565 /* Data_UserProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 021D924728DC860C00ACC565 /* Data_UserProfile.swift */; }; 021D925028DC89D100ACC565 /* UserProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 021D924F28DC89D100ACC565 /* UserProfile.swift */; }; 021D925728DCF12900ACC565 /* AlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 021D925628DCF12900ACC565 /* AlertView.swift */; }; - 02228B312C2232D2009A5F28 /* IntExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02228B302C2232D2009A5F28 /* IntExtension.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 */; }; @@ -71,7 +71,6 @@ 028F9F39293A452B00DE65D0 /* ResetPassword.swift in Sources */ = {isa = PBXBuildFile; fileRef = 028F9F38293A452B00DE65D0 /* ResetPassword.swift */; }; 02935B732BCECAD000B22F66 /* Data_PrimaryEnrollment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02935B722BCECAD000B22F66 /* Data_PrimaryEnrollment.swift */; }; 02935B752BCEE6D600B22F66 /* PrimaryEnrollment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02935B742BCEE6D600B22F66 /* PrimaryEnrollment.swift */; }; - 0295C885299B99DD00ABE571 /* RefreshableScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0295C884299B99DD00ABE571 /* RefreshableScrollView.swift */; }; 029A13262C2457D9005FB830 /* OfflineProgress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 029A13252C2457D9005FB830 /* OfflineProgress.swift */; }; 029A13282C246AE6005FB830 /* OfflineSyncManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 029A13272C246AE6005FB830 /* OfflineSyncManager.swift */; }; 029A132A2C2471DF005FB830 /* OfflineSyncRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 029A13292C2471DF005FB830 /* OfflineSyncRepository.swift */; }; @@ -83,13 +82,12 @@ 02A4833829B8A8F900D33F33 /* CoreDataModel.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 02A4833629B8A8F800D33F33 /* CoreDataModel.xcdatamodeld */; }; 02A4833A29B8A9AB00D33F33 /* DownloadManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02A4833929B8A9AB00D33F33 /* DownloadManager.swift */; }; 02A4833C29B8C57800D33F33 /* DownloadView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02A4833B29B8C57800D33F33 /* DownloadView.swift */; }; - 02AA27942C2C1B88006F5B6A /* ZipArchive in Frameworks */ = {isa = PBXBuildFile; productRef = 02AA27932C2C1B88006F5B6A /* ZipArchive */; }; 02A8C5812C05DBB4004B91FF /* Data_EnrollmentsStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02A8C5802C05DBB4004B91FF /* Data_EnrollmentsStatus.swift */; }; + 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 */; }; - 02B3F16E2AB489A400DDDD4E /* RefreshableScrollViewCompat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02B3F16D2AB489A400DDDD4E /* RefreshableScrollViewCompat.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 */; }; @@ -219,8 +217,8 @@ 021D924728DC860C00ACC565 /* Data_UserProfile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Data_UserProfile.swift; sourceTree = ""; }; 021D924F28DC89D100ACC565 /* UserProfile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserProfile.swift; sourceTree = ""; }; 021D925628DCF12900ACC565 /* AlertView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertView.swift; sourceTree = ""; }; - 02228B302C2232D2009A5F28 /* IntExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntExtension.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 = ""; }; @@ -275,7 +273,6 @@ 028F9F38293A452B00DE65D0 /* ResetPassword.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResetPassword.swift; sourceTree = ""; }; 02935B722BCECAD000B22F66 /* Data_PrimaryEnrollment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Data_PrimaryEnrollment.swift; sourceTree = ""; }; 02935B742BCEE6D600B22F66 /* PrimaryEnrollment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrimaryEnrollment.swift; sourceTree = ""; }; - 0295C884299B99DD00ABE571 /* RefreshableScrollView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshableScrollView.swift; sourceTree = ""; }; 029A13252C2457D9005FB830 /* OfflineProgress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OfflineProgress.swift; sourceTree = ""; }; 029A13272C246AE6005FB830 /* OfflineSyncManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OfflineSyncManager.swift; sourceTree = ""; }; 029A13292C2471DF005FB830 /* OfflineSyncRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OfflineSyncRepository.swift; sourceTree = ""; }; @@ -292,7 +289,6 @@ 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 = ""; }; - 02B3F16D2AB489A400DDDD4E /* RefreshableScrollViewCompat.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshableScrollViewCompat.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 = ""; }; @@ -778,8 +774,6 @@ 028CE96829858ECC00B6B1C3 /* FlexibleKeyboardInputView.swift */, 023A4DD3299E66BD006C0E48 /* OfflineSnackBarView.swift */, 021D925628DCF12900ACC565 /* AlertView.swift */, - 0295C884299B99DD00ABE571 /* RefreshableScrollView.swift */, - 02B3F16D2AB489A400DDDD4E /* RefreshableScrollViewCompat.swift */, 0236F3B628F4351E0050F09B /* CourseButton.swift */, 0241666A28F5A78B00082765 /* HTMLFormattedText.swift */, 0282DA7228F98CC9003C3F07 /* WebUnitView.swift */, @@ -984,6 +978,7 @@ 0770DE0428D07831006D8A5D /* Sources */, 0770DE0528D07831006D8A5D /* Frameworks */, 0770DE0628D07831006D8A5D /* Resources */, + 49BAD0663C27D73B9115401F /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -1089,6 +1084,23 @@ shellPath = /bin/sh; shellScript = "if [[ -f \"${PODS_ROOT}/SwiftGen/bin/swiftgen\" ]]; then\n \"${PODS_ROOT}/SwiftGen/bin/swiftgen\"\nelse\n echo \"warning: SwiftGen is not installed. Run 'pod install --repo-update' to install it.\"\nfi\n"; }; + 49BAD0663C27D73B9115401F /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-App-Core/Pods-App-Core-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-App-Core/Pods-App-Core-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-App-Core/Pods-App-Core-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; ED83AD5255805030E042D62A /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -1164,7 +1176,6 @@ 0236961F28F9A2F600EEF206 /* AuthEndpoint.swift in Sources */, 02B3E3B32930198600A50475 /* AVPlayerViewControllerExtension.swift in Sources */, BAD9CA332B28A8F300DE790A /* AjaxProvider.swift in Sources */, - 0295C885299B99DD00ABE571 /* RefreshableScrollView.swift in Sources */, A51CDBE72B6D21F2009B6D4E /* SegmentConfig.swift in Sources */, 0282DA7328F98CC9003C3F07 /* WebUnitView.swift in Sources */, E0D586362B314CD3009B4BA7 /* LogistrationBottomView.swift in Sources */, @@ -1270,7 +1281,6 @@ 028CE96929858ECC00B6B1C3 /* FlexibleKeyboardInputView.swift in Sources */, 027BD3A92909474200392132 /* KeyboardAvoidingViewControllerRepr.swift in Sources */, 02F98A7F28F81EE900DE94C0 /* Container+App.swift in Sources */, - 02B3F16E2AB489A400DDDD4E /* RefreshableScrollViewCompat.swift in Sources */, 0649879A2B4D69FF0071642A /* WebViewHTML.swift in Sources */, 02CA59842BD7DDBE00D517AA /* DashboardConfig.swift in Sources */, 0727877B28D24A1D002E9142 /* HeadersRedirectHandler.swift in Sources */, @@ -1410,7 +1420,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1525,7 +1535,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1773,7 +1783,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1866,7 +1876,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1964,7 +1974,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -2057,7 +2067,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -2213,7 +2223,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -2248,7 +2258,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -2323,7 +2333,7 @@ repositoryURL = "https://github.com/SvenTiigi/YouTubePlayerKit"; requirement = { kind = upToNextMajorVersion; - minimumVersion = 1.8.0; + minimumVersion = 1.9.0; }; }; 02AA27922C2C1B61006F5B6A /* XCRemoteSwiftPackageReference "ZipArchive" */ = { @@ -2339,7 +2349,7 @@ repositoryURL = "https://github.com/BranchMetrics/ios-branch-sdk-spm"; requirement = { kind = upToNextMajorVersion; - minimumVersion = 2.2.0; + minimumVersion = 3.6.3; }; }; BA8FA65E2AD574D700EA029A /* XCRemoteSwiftPackageReference "GoogleSignIn-iOS" */ = { @@ -2347,7 +2357,7 @@ repositoryURL = "https://github.com/google/GoogleSignIn-iOS"; requirement = { kind = upToNextMajorVersion; - minimumVersion = 7.0.0; + minimumVersion = 8.0.0; }; }; BA8FA6712AD6ABA300EA029A /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */ = { @@ -2355,7 +2365,7 @@ repositoryURL = "https://github.com/facebook/facebook-ios-sdk"; requirement = { kind = upToNextMajorVersion; - minimumVersion = 14.1.0; + minimumVersion = 16.3.1; }; }; /* End XCRemoteSwiftPackageReference section */ diff --git a/Core/Core/Configuration/Config/AgreementConfig.swift b/Core/Core/Configuration/Config/AgreementConfig.swift index 6dc4d518e..d6cfae197 100644 --- a/Core/Core/Configuration/Config/AgreementConfig.swift +++ b/Core/Core/Configuration/Config/AgreementConfig.swift @@ -42,12 +42,7 @@ public class AgreementConfig: NSObject { } private func completePath(url: String) -> String { - let langCode: String - if #available(iOS 16, *) { - langCode = Locale.current.language.languageCode?.identifier ?? "" - } else { - langCode = Locale.current.languageCode ?? "" - } + let langCode = Locale.current.language.languageCode?.identifier ?? "" if let supportedLanguages = supportedLanguages, !supportedLanguages.contains(langCode) { diff --git a/Core/Core/Extensions/ViewExtension.swift b/Core/Core/Extensions/ViewExtension.swift index 9db5e1087..8f6320658 100644 --- a/Core/Core/Extensions/ViewExtension.swift +++ b/Core/Core/Extensions/ViewExtension.swift @@ -179,29 +179,6 @@ public extension View { } } - func hideNavigationBar() -> some View { - if #available(iOS 16.0, *) { - return self.navigationBarHidden(true) - } else { - return self.introspect( - .navigationView(style: .stack), - on: .iOS(.v15...), - scope: .ancestor) { - $0.isNavigationBarHidden = true - } - } - } - - func hideScrollContentBackground() -> some View { - if #available(iOS 16.0, *) { - return self.scrollContentBackground(.hidden) - } else { - return self.onAppear { - UITextView.appearance().backgroundColor = .clear - } - } - } - func onRightSwipeGesture(perform action: @escaping () -> Void) -> some View { self.gesture( DragGesture(minimumDistance: 20, coordinateSpace: .local) diff --git a/Core/Core/Network/DownloadManager.swift b/Core/Core/Network/DownloadManager.swift index dd58deb4f..ed10c0a50 100644 --- a/Core/Core/Network/DownloadManager.swift +++ b/Core/Core/Network/DownloadManager.swift @@ -215,9 +215,14 @@ public class DownloadManager: DownloadManagerProtocol { // MARK: - Intents public func isLargeVideosSize(blocks: [CourseBlock]) -> Bool { - (blocks.reduce(0) { - $0 + Double($1.encodedVideo?.video(downloadQuality: downloadQuality)?.fileSize ?? 0) - } / 1024 / 1024 / 1024) > 1 + let totalSizeInBytes = blocks.reduce(0) { accumulator, block in + let videoSize = block.encodedVideo?.video(downloadQuality: downloadQuality)?.fileSize ?? 0 + return accumulator + Double(videoSize) + } + + let totalSizeInGB = totalSizeInBytes / (1024 * 1024 * 1024) + + return totalSizeInGB > 1 } public func getDownloadTasks() async -> [DownloadDataTask] { diff --git a/Core/Core/View/Base/AppReview/AppReviewView.swift b/Core/Core/View/Base/AppReview/AppReviewView.swift index 176c9707a..efe5df5bd 100644 --- a/Core/Core/View/Base/AppReview/AppReviewView.swift +++ b/Core/Core/View/Base/AppReview/AppReviewView.swift @@ -13,8 +13,8 @@ public struct AppReviewView: View { @ObservedObject private var viewModel: AppReviewViewModel - @Environment (\.isHorizontal) private var isHorizontal - @Environment (\.presentationMode) private var presentationMode + @Environment(\.isHorizontal) private var isHorizontal + @Environment(\.presentationMode) private var presentationMode public init(viewModel: AppReviewViewModel) { self.viewModel = viewModel @@ -77,7 +77,7 @@ public struct AppReviewView: View { .foregroundColor(Theme.Colors.textPrimary) .padding(.horizontal, 12) .padding(.vertical, 4) - .hideScrollContentBackground() + .scrollContentBackground(.hidden) .background( Theme.Shapes.textInputShape .fill(Theme.Colors.commentCellBackground) diff --git a/Core/Core/View/Base/FlexibleKeyboardInputView.swift b/Core/Core/View/Base/FlexibleKeyboardInputView.swift index 48a1119f5..fdf47efdc 100644 --- a/Core/Core/View/Base/FlexibleKeyboardInputView.swift +++ b/Core/Core/View/Base/FlexibleKeyboardInputView.swift @@ -12,7 +12,7 @@ public struct FlexibleKeyboardInputView: View { @State private var commentText: String = "" @State private var commentSize: CGFloat = .init(64) - @Environment (\.isHorizontal) private var isHorizontal + @Environment(\.isHorizontal) private var isHorizontal public var sendText: ((String) -> Void) private let hint: String @@ -54,7 +54,7 @@ public struct FlexibleKeyboardInputView: View { TextEditor(text: $commentText) .padding(.horizontal, 8) .foregroundColor(Theme.Colors.textInputTextColor) - .hideScrollContentBackground() + .scrollContentBackground(.hidden) .frame(maxHeight: commentSize) .background( Theme.InputFieldBackground( diff --git a/Core/Core/View/Base/NavigationBar.swift b/Core/Core/View/Base/NavigationBar.swift index 489d31236..9377067c7 100644 --- a/Core/Core/View/Base/NavigationBar.swift +++ b/Core/Core/View/Base/NavigationBar.swift @@ -23,7 +23,7 @@ public struct NavigationBar: View { private let rightButtonType: ButtonType? private let rightButtonAction: (() -> Void)? @Binding private var rightButtonIsActive: Bool - @Environment (\.isHorizontal) private var isHorizontal + @Environment(\.isHorizontal) private var isHorizontal public init(title: String, titleColor: Color = Theme.Colors.navigationBarTintColor, diff --git a/Core/Core/View/Base/PickerMenu.swift b/Core/Core/View/Base/PickerMenu.swift index cd3d6c49e..c425191c0 100644 --- a/Core/Core/View/Base/PickerMenu.swift +++ b/Core/Core/View/Base/PickerMenu.swift @@ -26,7 +26,7 @@ public struct PickerMenu: View { @State private var search: String = "" @State public var selectedItem: PickerItem = PickerItem(key: "", value: "") - @Environment (\.isHorizontal) private var isHorizontal + @Environment(\.isHorizontal) private var isHorizontal private let ipadPickerWidth: CGFloat = 300 private var items: [PickerItem] private let titleText: String diff --git a/Core/Core/View/Base/RefreshableScrollView.swift b/Core/Core/View/Base/RefreshableScrollView.swift deleted file mode 100644 index d09148528..000000000 --- a/Core/Core/View/Base/RefreshableScrollView.swift +++ /dev/null @@ -1,342 +0,0 @@ -// -// RefreshableScrollView.swift -// Core -// -// Created by  Stepanok Ivan on 14.02.2023. -// - -import SwiftUI - -// There are two type of positioning views - one that scrolls with the content, -// and one that stays fixed -private enum PositionType { - case fixed, moving -} - -// This struct is the currency of the Preferences, and has a type -// (fixed or moving) and the actual Y-axis value. -// It's Equatable because Swift requires it to be. -private struct Position: Equatable { - let type: PositionType - let y: CGFloat -} - -// This might seem weird, but it's necessary due to the funny nature of -// how Preferences work. We can't just store the last position and merge -// it with the next one - instead we have a queue of all the latest positions. -private struct PositionPreferenceKey: PreferenceKey { - typealias Value = [Position] - - static var defaultValue = [Position]() - - static func reduce(value: inout [Position], nextValue: () -> [Position]) { - value.append(contentsOf: nextValue()) - } -} - -private struct PositionIndicator: View { - let type: PositionType - - var body: some View { - GeometryReader { proxy in - // the View itself is an invisible Shape that fills as much as possible - Color.clear - // Compute the top Y position and emit it to the Preferences queue - .preference(key: PositionPreferenceKey.self, value: [Position(type: type, y: proxy.frame(in: .global).minY)]) - } - } -} - -// Callback that'll trigger once refreshing is done -public typealias RefreshComplete = () -> Void - -// The actual refresh action that's called once refreshing starts. It has the -// RefreshComplete callback to let the refresh action let the View know -// once it's done refreshing. -public typealias OnRefresh = (@escaping RefreshComplete) -> Void - -// The offset threshold. 68 is a good number, but you can play -// with it to your liking. -public let defaultRefreshThreshold: CGFloat = 68 - -// Tracks the state of the RefreshableScrollView - it's either: -// 1. waiting for a scroll to happen -// 2. has been primed by pulling down beyond THRESHOLD -// 3. is doing the refreshing. -public enum RefreshState { - case waiting, primed, loading -} - -// ViewBuilder for the custom progress View, that may render itself -// based on the current RefreshState. -public typealias RefreshProgressBuilder = (RefreshState) -> Progress - -// Default color of the rectangle behind the progress spinner -public let defaultLoadingViewBackgroundColor = Color(UIColor.clear) - -public struct RefreshableScrollView: View where Progress: View, Content: View { - let showsIndicators: Bool // if the ScrollView should show indicators - let shouldTriggerHapticFeedback: Bool // if key actions should trigger haptic feedback - let loadingViewBackgroundColor: Color - let threshold: CGFloat // what height do you have to pull down to trigger the refresh - let onRefresh: OnRefresh // the refreshing action - let progress: RefreshProgressBuilder // custom progress view - let content: () -> Content // the ScrollView content - @State private var offset: CGFloat = 0 - @State private var state = RefreshState.waiting // the current state - // Haptic Feedback - let finishedReloadingFeedbackGenerator = UIImpactFeedbackGenerator(style: .medium) - let primedFeedbackGenerator = UIImpactFeedbackGenerator(style: .heavy) - - // We use a custom constructor to allow for usage of a @ViewBuilder for the content - public init(showsIndicators: Bool = true, - shouldTriggerHapticFeedback: Bool = false, - loadingViewBackgroundColor: Color = defaultLoadingViewBackgroundColor, - threshold: CGFloat = defaultRefreshThreshold, - onRefresh: @escaping OnRefresh, - @ViewBuilder progress: @escaping RefreshProgressBuilder, - @ViewBuilder content: @escaping () -> Content) { - self.showsIndicators = showsIndicators - self.shouldTriggerHapticFeedback = shouldTriggerHapticFeedback - self.loadingViewBackgroundColor = loadingViewBackgroundColor - self.threshold = threshold - self.onRefresh = onRefresh - self.progress = progress - self.content = content - } - - public var body: some View { - // The root view is a regular ScrollView - ScrollView(showsIndicators: showsIndicators) { - // The ZStack allows us to position the PositionIndicator, - // the content and the loading view, all on top of each other. - ZStack(alignment: .top) { - // The moving positioning indicator, that sits at the top - // of the ScrollView and scrolls down with the content - PositionIndicator(type: .moving) - .frame(height: 0) - - // Your ScrollView content. If we're loading, we want - // to keep it below the loading view, hence the alignmentGuide. - content() - .alignmentGuide(.top, computeValue: { _ in - (state == .loading) ? -threshold + max(0, offset) : 0 - }) - - // The loading view. It's offset to the top of the content unless we're loading. - ZStack { - Rectangle() - .foregroundColor(loadingViewBackgroundColor) - .frame(height: threshold) - progress(state) - }.offset(y: (state == .loading) ? -max(0, offset) : -threshold) - } - } - // Put a fixed PositionIndicator in the background so that we have - // a reference point to compute the scroll offset. - .background(PositionIndicator(type: .fixed)) - // Once the scrolling offset changes, we want to see if there should - // be a state change. - .onPreferenceChange(PositionPreferenceKey.self) { values in - DispatchQueue.main.async { - // Compute the offset between the moving and fixed PositionIndicators - let movingY = values.first { $0.type == .moving }?.y ?? 0 - let fixedY = values.first { $0.type == .fixed }?.y ?? 0 - offset = movingY - fixedY - if state != .loading { // If we're already loading, ignore everything - // Map the preference change action to the UI thread - // If the user pulled down below the threshold, prime the view - if offset > threshold && state == .waiting { - state = .primed - if shouldTriggerHapticFeedback { - self.primedFeedbackGenerator.impactOccurred() - } - - // If the view is primed and we've crossed the threshold again on the - // way back, trigger the refresh - } else if offset < threshold && state == .primed { - state = .loading - onRefresh { // trigger the refreshing callback - // once refreshing is done, smoothly move the loading view - // back to the offset position - withAnimation { - self.state = .waiting - } - if shouldTriggerHapticFeedback { - self.finishedReloadingFeedbackGenerator.impactOccurred() - } - } - } - } - } - } - } -} - -// Extension that uses default RefreshActivityIndicator so that you don't have to -// specify it every time. -public extension RefreshableScrollView where Progress == RefreshActivityIndicator { - init(showsIndicators: Bool = true, - loadingViewBackgroundColor: Color = defaultLoadingViewBackgroundColor, - threshold: CGFloat = defaultRefreshThreshold, - onRefresh: @escaping OnRefresh, - @ViewBuilder content: @escaping () -> Content) { - self.init(showsIndicators: showsIndicators, - loadingViewBackgroundColor: loadingViewBackgroundColor, - threshold: threshold, - onRefresh: onRefresh, - progress: { state in - RefreshActivityIndicator(isAnimating: state == .loading) { - $0.hidesWhenStopped = false - } - }, - content: content) - } -} - -// Wraps a UIActivityIndicatorView as a loading spinner that works on all SwiftUI versions. -public struct RefreshActivityIndicator: UIViewRepresentable { - public typealias UIView = UIActivityIndicatorView - public var isAnimating: Bool = true - public var configuration = { (indicator: UIView) in } - - public init(isAnimating: Bool, configuration: ((UIView) -> Void)? = nil) { - self.isAnimating = isAnimating - if let configuration = configuration { - self.configuration = configuration - } - } - - public func makeUIView(context: UIViewRepresentableContext) -> UIView { - UIView() - } - - public func updateUIView(_ uiView: UIView, context: UIViewRepresentableContext) { - isAnimating ? uiView.startAnimating() : uiView.stopAnimating() - configuration(uiView) - } -} - -#if compiler(>=5.5) -// Allows using RefreshableScrollView with an async block. -@available(iOS 15.0, *) -public extension RefreshableScrollView { - init(showsIndicators: Bool = true, - loadingViewBackgroundColor: Color = defaultLoadingViewBackgroundColor, - threshold: CGFloat = defaultRefreshThreshold, - action: @escaping @Sendable () async -> Void, - @ViewBuilder progress: @escaping RefreshProgressBuilder, - @ViewBuilder content: @escaping () -> Content) { - self.init(showsIndicators: showsIndicators, - loadingViewBackgroundColor: loadingViewBackgroundColor, - threshold: threshold, - onRefresh: { refreshComplete in - Task { - await action() - refreshComplete() - } - }, - progress: progress, - content: content) - } -} -#endif - -public struct RefreshableCompat: ViewModifier where Progress: View { - private let showsIndicators: Bool - private let loadingViewBackgroundColor: Color - private let threshold: CGFloat - private let onRefresh: OnRefresh - private let progress: RefreshProgressBuilder - - public init(showsIndicators: Bool = true, - loadingViewBackgroundColor: Color = defaultLoadingViewBackgroundColor, - threshold: CGFloat = defaultRefreshThreshold, - onRefresh: @escaping OnRefresh, - @ViewBuilder progress: @escaping RefreshProgressBuilder) { - self.showsIndicators = showsIndicators - self.loadingViewBackgroundColor = loadingViewBackgroundColor - self.threshold = threshold - self.onRefresh = onRefresh - self.progress = progress - } - - public func body(content: Content) -> some View { - RefreshableScrollView(showsIndicators: showsIndicators, - loadingViewBackgroundColor: loadingViewBackgroundColor, - threshold: threshold, - onRefresh: onRefresh, - progress: progress) { - content - } - } -} - -#if compiler(>=5.5) -@available(iOS 15.0, *) -public extension List { - @ViewBuilder func refreshableCompat(showsIndicators: Bool = true, - loadingViewBackgroundColor: - Color = defaultLoadingViewBackgroundColor, - threshold: CGFloat = defaultRefreshThreshold, - onRefresh: @escaping OnRefresh, - @ViewBuilder progress: - @escaping RefreshProgressBuilder) -> some View { - if #available(macOS 12.0, *) { - self.refreshable { - await withCheckedContinuation { cont in - onRefresh { - cont.resume() - } - } - } - } else { - self.modifier(RefreshableCompat(showsIndicators: showsIndicators, - loadingViewBackgroundColor: loadingViewBackgroundColor, - threshold: threshold, - onRefresh: onRefresh, - progress: progress)) - } - } -} -#endif - -public extension View { - @ViewBuilder func refreshableCompat(showsIndicators: Bool = true, - loadingViewBackgroundColor: - Color = defaultLoadingViewBackgroundColor, - threshold: CGFloat = defaultRefreshThreshold, - onRefresh: @escaping OnRefresh, - @ViewBuilder progress: - @escaping RefreshProgressBuilder) -> some View { - self.modifier(RefreshableCompat(showsIndicators: showsIndicators, - loadingViewBackgroundColor: loadingViewBackgroundColor, - threshold: threshold, - onRefresh: onRefresh, - progress: progress)) - } -} - -struct ActivityIndicator: UIViewRepresentable { - public typealias UIView = UIActivityIndicatorView - public var isAnimating: Bool = true - public var configuration = { (indicator: UIView) in } - - public init(isAnimating: Bool, configuration: ((UIView) -> Void)? = nil) { - self.isAnimating = isAnimating - if let configuration = configuration { - self.configuration = configuration - } - } - - public func makeUIView(context: UIViewRepresentableContext) -> UIView { - let uiView = UIView() - uiView.startAnimating() - return uiView - } - - public func updateUIView(_ uiView: UIView, context: UIViewRepresentableContext) { -// isAnimating ? uiView.startAnimating() : uiView.stopAnimating() - configuration(uiView) - } - } diff --git a/Core/Core/View/Base/RefreshableScrollViewCompat.swift b/Core/Core/View/Base/RefreshableScrollViewCompat.swift deleted file mode 100644 index 768aa08b9..000000000 --- a/Core/Core/View/Base/RefreshableScrollViewCompat.swift +++ /dev/null @@ -1,39 +0,0 @@ -// -// RefreshableScrollViewCompat.swift -// Core -// -// Created by  Stepanok Ivan on 15.09.2023. -// - -import SwiftUI - -public struct RefreshableScrollViewCompat: View where Content: View { - private let content: () -> Content - private let action: () async -> Void - - public init(action: @escaping () async -> Void, @ViewBuilder content: @escaping () -> Content) { - self.action = action - self.content = content - } - - public var body: some View { - if #available(iOS 16.0, *) { - return ScrollView { - content() - }.refreshable { - Task { - await action() - } - } - } else { - return RefreshableScrollView(onRefresh: { done in - Task { - await action() - done() - } - }) { - content() - } - } - } -} diff --git a/Core/Core/View/Base/RegistrationTextField.swift b/Core/Core/View/Base/RegistrationTextField.swift index 45a8345ce..7cf4788d4 100644 --- a/Core/Core/View/Base/RegistrationTextField.swift +++ b/Core/Core/View/Base/RegistrationTextField.swift @@ -48,7 +48,7 @@ public struct RegistrationTextField: View { .padding(.vertical, 4) .foregroundColor(Theme.Colors.textInputTextColor) .frame(height: 100) - .hideScrollContentBackground() + .scrollContentBackground(.hidden) .background( Theme.Shapes.textInputShape .fill(Theme.Colors.textInputBackground) diff --git a/Core/Core/View/Base/VideoDownloadQualityView.swift b/Core/Core/View/Base/VideoDownloadQualityView.swift index 26cce95c4..2fd29240a 100644 --- a/Core/Core/View/Base/VideoDownloadQualityView.swift +++ b/Core/Core/View/Base/VideoDownloadQualityView.swift @@ -35,7 +35,7 @@ public struct VideoDownloadQualityView: View { private var analytics: CoreAnalytics private var router: BaseRouter private var isModal: Bool - @Environment (\.isHorizontal) private var isHorizontal + @Environment(\.isHorizontal) private var isHorizontal public init( downloadQuality: DownloadQuality, diff --git a/Core/Core/View/Base/WebUnitView.swift b/Core/Core/View/Base/WebUnitView.swift index 56d392abf..fda1e5040 100644 --- a/Core/Core/View/Base/WebUnitView.swift +++ b/Core/Core/View/Base/WebUnitView.swift @@ -104,9 +104,7 @@ public struct WebUnitView: View { ) } } - .introspect(.scrollView, on: .iOS(.v15...), customize: { scrollView in - scrollView.isScrollEnabled = false - }) + .scrollDisabled(true) .onChange(of: self.fileUrl, perform: { file in if file != "" { self.isFileOpen = true diff --git a/Core/Core/View/Base/Webview/WebView.swift b/Core/Core/View/Base/Webview/WebView.swift index f23097445..7ed3099a6 100644 --- a/Core/Core/View/Base/Webview/WebView.swift +++ b/Core/Core/View/Base/Webview/WebView.swift @@ -283,9 +283,7 @@ public struct WebView: UIViewRepresentable { let webView = WKWebView(frame: .zero, configuration: webViewConfig) #if DEBUG - if #available(iOS 16.4, *) { - webView.isInspectable = true - } + webView.isInspectable = true #endif webView.navigationDelegate = context.coordinator webView.uiDelegate = context.coordinator diff --git a/Core/Core/View/Base/Webview/WebViewHTML.swift b/Core/Core/View/Base/Webview/WebViewHTML.swift index 4db4d2abb..1d40cc082 100644 --- a/Core/Core/View/Base/Webview/WebViewHTML.swift +++ b/Core/Core/View/Base/Webview/WebViewHTML.swift @@ -36,9 +36,7 @@ public struct WebViewHtml: UIViewRepresentable { context.coordinator.webview = webView #if DEBUG - if #available(iOS 16.4, *) { - webView.isInspectable = true - } + webView.isInspectable = true #endif return webView } diff --git a/Course/Course.xcodeproj/project.pbxproj b/Course/Course.xcodeproj/project.pbxproj index bd2e05ca1..dcaaf9741 100644 --- a/Course/Course.xcodeproj/project.pbxproj +++ b/Course/Course.xcodeproj/project.pbxproj @@ -7,8 +7,8 @@ objects = { /* Begin PBXBuildFile section */ - 02228B2F2C221412009A5F28 /* LargestDownloadsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02228B2E2C221412009A5F28 /* LargestDownloadsView.swift */; }; - 02197DC52C1AFC0600CC8FF2 /* CalendarSyncStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02EBC7542C19CFCF00BE182C /* CalendarSyncStatusView.swift */; }; + 02197DC52C1AFC0600CC8FF2 /* CalendarSyncStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02EBC7542C19CFCF00BE182C /* CalendarSyncStatusView.swift */; }; + 02228B2F2C221412009A5F28 /* LargestDownloadsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02228B2E2C221412009A5F28 /* LargestDownloadsView.swift */; }; 02280F5E294B4FDA0032823A /* CourseCoreModel.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 02280F5C294B4FDA0032823A /* CourseCoreModel.xcdatamodeld */; }; 02280F60294B50030032823A /* CoursePersistenceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02280F5F294B50030032823A /* CoursePersistenceProtocol.swift */; }; 022C64D829ACEC48000F532B /* HandoutsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 022C64D729ACEC48000F532B /* HandoutsView.swift */; }; @@ -333,8 +333,6 @@ 02B6B3B828E1D12900232911 /* Data */, 02B6B3B528E1D10700232911 /* Domain */, 02EAE2CA28E1F0A700529644 /* Presentation */, - 97CA95212B875EA200A9EDEA, - 97EA4D822B84EFA900663F58, 02B6B3B428E1C49400232911 /* Localizable.strings */, 02C355372C08DCD700501342 /* Localizable.stringsdict */, ); @@ -913,7 +911,6 @@ 02280F60294B50030032823A /* CoursePersistenceProtocol.swift in Sources */, 02454CAA2A2619B40043052A /* LessonProgressView.swift in Sources */, 975F475E2B6151FD00E5B031 /* CourseDatesMock.swift in Sources */, - DB7D6EB22ADFE9510036BB13 /* Data_CourseDates.swift in Sources */, 02FF6FAA2C20D56A00E44DD8 /* TotalDownloadedProgressView.swift in Sources */, 975F47602B615DA700E5B031 /* CourseStructureMock.swift in Sources */, 02280F5E294B4FDA0032823A /* CourseCoreModel.xcdatamodeld in Sources */, @@ -936,7 +933,6 @@ 0231124D28EDA804002588FB /* CourseUnitView.swift in Sources */, 027020FC28E7362100F54332 /* Data_CourseOutlineResponse.swift in Sources */, 02F71B4A2C1B163B00FF936A /* DownloadErrorAlertView.swift in Sources */, - DB7D6EB02ADFDA0E0036BB13 /* CourseDates.swift in Sources */, 067B7B532BED339200D1768F /* PlayerServiceProtocol.swift in Sources */, BAD9CA2D2B2736BB00DE790A /* LessonLineProgressView.swift in Sources */, 02197DC52C1AFC0600CC8FF2 /* CalendarSyncStatusView.swift in Sources */, @@ -970,7 +966,6 @@ 02E3803E2BFF9F0A00815AFA /* CourseProgressView.swift in Sources */, 022F8E162A1DFBC6008EFAB9 /* YouTubeVideoPlayerViewModel.swift in Sources */, 02B6B3BE28E1D15C00232911 /* CourseEndpoint.swift in Sources */, - 97EA4D862B85034D00663F58 /* CalendarManager.swift in Sources */, 02F71B4C2C1B200900FF936A /* DeviceStorageFullAlertView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1270,7 +1265,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1305,7 +1300,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1403,7 +1398,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1502,7 +1497,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1595,7 +1590,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1687,7 +1682,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1785,7 +1780,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1899,7 +1894,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/Course/Course/Presentation/Downloads/DownloadsView.swift b/Course/Course/Presentation/Downloads/DownloadsView.swift index 93149bd4f..2926d82b0 100644 --- a/Course/Course/Presentation/Downloads/DownloadsView.swift +++ b/Course/Course/Presentation/Downloads/DownloadsView.swift @@ -15,7 +15,7 @@ public struct DownloadsView: View { // MARK: - Properties @Environment(\.dismiss) private var dismiss - @Environment (\.isHorizontal) private var isHorizontal + @Environment(\.isHorizontal) private var isHorizontal @StateObject private var viewModel: DownloadsViewModel var isSheet: Bool = true diff --git a/Course/Course/Presentation/Outline/CourseOutlineView.swift b/Course/Course/Presentation/Outline/CourseOutlineView.swift index 7cd3a1f28..4464f9fe2 100644 --- a/Course/Course/Presentation/Outline/CourseOutlineView.swift +++ b/Course/Course/Presentation/Outline/CourseOutlineView.swift @@ -56,13 +56,7 @@ public struct CourseOutlineView: View { ZStack(alignment: .top) { GeometryReader { proxy in VStack(alignment: .center) { - RefreshableScrollViewCompat(action: { - await withTaskGroup(of: Void.self) { group in - group.addTask { - await viewModel.getCourseBlocks(courseID: courseID, withProgress: false) - } - } - }) { + ScrollView { DynamicOffsetView( coordinate: $coordinate, collapsed: $collapsed @@ -117,6 +111,13 @@ public struct CourseOutlineView: View { } .frameLimit(width: proxy.size.width) } + .refreshable { + await withTaskGroup(of: Void.self) { group in + group.addTask { + await viewModel.getCourseBlocks(courseID: courseID, withProgress: false) + } + } + } .onRightSwipeGesture { viewModel.router.back() } diff --git a/Course/Course/Presentation/Unit/Subviews/LessonLineProgressView.swift b/Course/Course/Presentation/Unit/Subviews/LessonLineProgressView.swift index b569a4f65..8233051d0 100644 --- a/Course/Course/Presentation/Unit/Subviews/LessonLineProgressView.swift +++ b/Course/Course/Presentation/Unit/Subviews/LessonLineProgressView.swift @@ -11,7 +11,7 @@ import Theme struct LessonLineProgressView: View { @ObservedObject var viewModel: CourseUnitViewModel - @Environment (\.isHorizontal) private var isHorizontal + @Environment(\.isHorizontal) private var isHorizontal init(viewModel: CourseUnitViewModel) { self.viewModel = viewModel diff --git a/Course/Course/Presentation/Unit/Subviews/LessonProgressView.swift b/Course/Course/Presentation/Unit/Subviews/LessonProgressView.swift index d1e848258..32badbf2a 100644 --- a/Course/Course/Presentation/Unit/Subviews/LessonProgressView.swift +++ b/Course/Course/Presentation/Unit/Subviews/LessonProgressView.swift @@ -12,7 +12,7 @@ import Theme struct LessonProgressView: View { @ObservedObject var viewModel: CourseUnitViewModel - @Environment (\.isHorizontal) private var isHorizontal + @Environment(\.isHorizontal) private var isHorizontal init(viewModel: CourseUnitViewModel) { self.viewModel = viewModel diff --git a/Course/Course/Presentation/Video/SubtitlesView.swift b/Course/Course/Presentation/Video/SubtitlesView.swift index 97dfe48ad..ef68d69b9 100644 --- a/Course/Course/Presentation/Video/SubtitlesView.swift +++ b/Course/Course/Presentation/Video/SubtitlesView.swift @@ -17,7 +17,7 @@ public struct Subtitle { public struct SubtitlesView: View { - @Environment (\.isHorizontal) private var isHorizontal + @Environment(\.isHorizontal) private var isHorizontal @ObservedObject private var viewModel: VideoPlayerViewModel diff --git a/Dashboard/Dashboard.xcodeproj/project.pbxproj b/Dashboard/Dashboard.xcodeproj/project.pbxproj index 817ab758a..8a3772b21 100644 --- a/Dashboard/Dashboard.xcodeproj/project.pbxproj +++ b/Dashboard/Dashboard.xcodeproj/project.pbxproj @@ -743,7 +743,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -857,7 +857,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1034,7 +1034,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1069,7 +1069,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1167,7 +1167,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1260,7 +1260,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1358,7 +1358,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1451,7 +1451,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/Dashboard/Dashboard/Presentation/AllCoursesView.swift b/Dashboard/Dashboard/Presentation/AllCoursesView.swift index 4960ae42a..95671a487 100644 --- a/Dashboard/Dashboard/Presentation/AllCoursesView.swift +++ b/Dashboard/Dashboard/Presentation/AllCoursesView.swift @@ -14,7 +14,7 @@ public struct AllCoursesView: View { @ObservedObject private var viewModel: AllCoursesViewModel private let router: DashboardRouter - @Environment (\.isHorizontal) private var isHorizontal + @Environment(\.isHorizontal) private var isHorizontal private var idiom: UIUserInterfaceIdiom { UIDevice.current.userInterfaceIdiom } public init(viewModel: AllCoursesViewModel, router: DashboardRouter) { @@ -51,9 +51,7 @@ public struct AllCoursesView: View { VStack(alignment: .center) { learnTitleAndSearch() .frameLimit(width: proxy.size.width) - RefreshableScrollViewCompat(action: { - await viewModel.getCourses(page: 1, refresh: true) - }) { + ScrollView { CategoryFilterView(selectedOption: $viewModel.selectedMenu) .disabled(viewModel.fetchInProgress) .frameLimit(width: proxy.size.width) @@ -114,6 +112,11 @@ public struct AllCoursesView: View { } VStack {}.frame(height: 40) } + .refreshable { + Task { + await viewModel.getCourses(page: 1, refresh: true) + } + } .accessibilityAction {} } .padding(.top, 8) diff --git a/Dashboard/Dashboard/Presentation/Elements/CategoryFilterView.swift b/Dashboard/Dashboard/Presentation/Elements/CategoryFilterView.swift index a0b24625b..a46a41d46 100644 --- a/Dashboard/Dashboard/Presentation/Elements/CategoryFilterView.swift +++ b/Dashboard/Dashboard/Presentation/Elements/CategoryFilterView.swift @@ -44,7 +44,7 @@ enum CategoryOption: String, CaseIterable { struct CategoryFilterView: View { @Binding var selectedOption: CategoryOption - @Environment (\.colorScheme) var colorScheme + @Environment(\.colorScheme) var colorScheme var body: some View { ScrollView(.horizontal) { diff --git a/Dashboard/Dashboard/Presentation/ListDashboardView.swift b/Dashboard/Dashboard/Presentation/ListDashboardView.swift index a2678b3ff..d8f356e82 100644 --- a/Dashboard/Dashboard/Presentation/ListDashboardView.swift +++ b/Dashboard/Dashboard/Presentation/ListDashboardView.swift @@ -40,9 +40,7 @@ public struct ListDashboardView: View { // MARK: - Page body VStack(alignment: .center) { - RefreshableScrollViewCompat(action: { - await viewModel.getMyCourses(page: 1, refresh: true) - }) { + ScrollView { Group { LazyVStack(spacing: 0) { HStack { @@ -103,7 +101,13 @@ public struct ListDashboardView: View { } } .frameLimit(width: proxy.size.width) - }.accessibilityAction {} + } + .refreshable { + Task { + await viewModel.getMyCourses(page: 1, refresh: true) + } + } + .accessibilityAction {} }.padding(.top, 8) HStack { Spacer() diff --git a/Dashboard/Dashboard/Presentation/PrimaryCourseDashboardView.swift b/Dashboard/Dashboard/Presentation/PrimaryCourseDashboardView.swift index d182a6a44..8b1a97e30 100644 --- a/Dashboard/Dashboard/Presentation/PrimaryCourseDashboardView.swift +++ b/Dashboard/Dashboard/Presentation/PrimaryCourseDashboardView.swift @@ -49,9 +49,7 @@ public struct PrimaryCourseDashboardView: View { Spacer(minLength: 50) switch selectedMenu { case .courses: - RefreshableScrollViewCompat(action: { - await viewModel.getEnrollments(showProgress: false) - }) { + ScrollView { ZStack(alignment: .topLeading) { if viewModel.fetchInProgress { VStack(alignment: .center) { @@ -148,7 +146,13 @@ public struct PrimaryCourseDashboardView: View { } } .frameLimit(width: proxy.size.width) - }.accessibilityAction {} + } + .refreshable { + Task { + await viewModel.getEnrollments(showProgress: false) + } + } + .accessibilityAction {} case .programs: programView } diff --git a/Discovery/Discovery.xcodeproj/project.pbxproj b/Discovery/Discovery.xcodeproj/project.pbxproj index c8958d0c0..9db63ac8b 100644 --- a/Discovery/Discovery.xcodeproj/project.pbxproj +++ b/Discovery/Discovery.xcodeproj/project.pbxproj @@ -812,7 +812,7 @@ INFOPLIST_FILE = Discovery/Info.plist; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -927,7 +927,7 @@ INFOPLIST_FILE = Discovery/Info.plist; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1105,7 +1105,7 @@ INFOPLIST_FILE = Discovery/Info.plist; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1141,7 +1141,7 @@ INFOPLIST_FILE = Discovery/Info.plist; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1240,7 +1240,7 @@ INFOPLIST_FILE = Discovery/Info.plist; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1340,7 +1340,7 @@ INFOPLIST_FILE = Discovery/Info.plist; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1434,7 +1434,7 @@ INFOPLIST_FILE = Discovery/Info.plist; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1527,7 +1527,7 @@ INFOPLIST_FILE = Discovery/Info.plist; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/Discovery/Discovery/Presentation/NativeDiscovery/CourseDetailsView.swift b/Discovery/Discovery/Presentation/NativeDiscovery/CourseDetailsView.swift index 80864b8fd..78b37f590 100644 --- a/Discovery/Discovery/Presentation/NativeDiscovery/CourseDetailsView.swift +++ b/Discovery/Discovery/Presentation/NativeDiscovery/CourseDetailsView.swift @@ -50,9 +50,7 @@ public struct CourseDetailsView: View { .accessibilityIdentifier("progress_bar") }.frame(width: proxy.size.width) } else { - RefreshableScrollViewCompat(action: { - await viewModel.getCourseDetail(courseID: courseID, withProgress: false) - }) { + ScrollView { VStack(alignment: .leading) { if let courseDetails = viewModel.courseDetails { @@ -139,6 +137,11 @@ public struct CourseDetailsView: View { } .frameLimit(width: proxy.size.width) } + .refreshable { + Task { + await viewModel.getCourseDetail(courseID: courseID, withProgress: false) + } + } .onRightSwipeGesture { viewModel.router.back() } diff --git a/Discovery/Discovery/Presentation/NativeDiscovery/DiscoveryView.swift b/Discovery/Discovery/Presentation/NativeDiscovery/DiscoveryView.swift index 5816da080..d434dd05c 100644 --- a/Discovery/Discovery/Presentation/NativeDiscovery/DiscoveryView.swift +++ b/Discovery/Discovery/Presentation/NativeDiscovery/DiscoveryView.swift @@ -19,7 +19,7 @@ public struct DiscoveryView: View { private var sourceScreen: LogistrationSourceScreen - @Environment (\.isHorizontal) private var isHorizontal + @Environment(\.isHorizontal) private var isHorizontal @Environment(\.presentationMode) private var presentationMode private let discoveryNew: some View = VStack(alignment: .leading) { @@ -92,13 +92,7 @@ public struct DiscoveryView: View { .accessibilityLabel(DiscoveryLocalization.search) ZStack { - RefreshableScrollViewCompat(action: { - viewModel.totalPages = 1 - viewModel.nextPage = 1 - Task { - await viewModel.discovery(page: 1, withProgress: false) - } - }) { + ScrollView { LazyVStack(spacing: 0) { HStack { discoveryNew @@ -112,7 +106,7 @@ public struct DiscoveryView: View { model: course, type: .discovery, index: index, - cellsCount: viewModel.courses.count, + cellsCount: viewModel.courses.count, useRelativeDates: useRelativeDates ).padding(.horizontal, 24) .onAppear { @@ -143,60 +137,66 @@ public struct DiscoveryView: View { VStack {}.frame(height: 40) } .frameLimit(width: proxy.size.width) - } - }.accessibilityAction {} - - if !viewModel.userloggedIn { - LogistrationBottomView { buttonAction in - switch buttonAction { - case .signIn: - viewModel.router.showLoginScreen(sourceScreen: .discovery) - case .register: - viewModel.router.showRegisterScreen(sourceScreen: .discovery) + }.refreshable { + viewModel.totalPages = 1 + viewModel.nextPage = 1 + Task { + await viewModel.discovery(page: 1, withProgress: false) } } } - }.padding(.top, 8) - - // MARK: - Offline mode SnackBar - OfflineSnackBarView( - connectivity: viewModel.connectivity, - reloadAction: { - await viewModel.discovery(page: 1, withProgress: false) - }) + }.accessibilityAction {} - // MARK: - Error Alert - if viewModel.showError { - VStack { - Spacer() - SnackBarView(message: viewModel.errorMessage) - } - .padding(.bottom, viewModel.connectivity.isInternetAvaliable - ? 0 : OfflineSnackBarView.height) - .transition(.move(edge: .bottom)) - .onAppear { - doAfter(Theme.Timeout.snackbarMessageLongTimeout) { - viewModel.errorMessage = nil + if !viewModel.userloggedIn { + LogistrationBottomView { buttonAction in + switch buttonAction { + case .signIn: + viewModel.router.showLoginScreen(sourceScreen: .discovery) + case .register: + viewModel.router.showRegisterScreen(sourceScreen: .discovery) } } } - } - .navigationBarHidden(sourceScreen != .startup) - .onFirstAppear { - if !(searchQuery.isEmpty) { - router.showDiscoverySearch(searchQuery: searchQuery) - searchQuery = "" + }.padding(.top, 8) + + // MARK: - Offline mode SnackBar + OfflineSnackBarView( + connectivity: viewModel.connectivity, + reloadAction: { + await viewModel.discovery(page: 1, withProgress: false) + }) + + // MARK: - Error Alert + if viewModel.showError { + VStack { + Spacer() + SnackBarView(message: viewModel.errorMessage) } - Task { - await viewModel.discovery(page: 1) - if case let .courseDetail(courseID, courseTitle) = sourceScreen { - viewModel.router.showCourseDetais(courseID: courseID, title: courseTitle) + .padding(.bottom, viewModel.connectivity.isInternetAvaliable + ? 0 : OfflineSnackBarView.height) + .transition(.move(edge: .bottom)) + .onAppear { + doAfter(Theme.Timeout.snackbarMessageLongTimeout) { + viewModel.errorMessage = nil } } - viewModel.setupNotifications() } - .background(Theme.Colors.background.ignoresSafeArea()) } + .navigationBarHidden(sourceScreen != .startup) + .onFirstAppear { + if !(searchQuery.isEmpty) { + router.showDiscoverySearch(searchQuery: searchQuery) + searchQuery = "" + } + Task { + await viewModel.discovery(page: 1) + if case let .courseDetail(courseID, courseTitle) = sourceScreen { + viewModel.router.showCourseDetais(courseID: courseID, title: courseTitle) + } + } + viewModel.setupNotifications() + } + .background(Theme.Colors.background.ignoresSafeArea()) } } diff --git a/Discovery/Discovery/Presentation/UpdateViews/UpdateRecommendedView.swift b/Discovery/Discovery/Presentation/UpdateViews/UpdateRecommendedView.swift index c2716aa82..f017d4ac4 100644 --- a/Discovery/Discovery/Presentation/UpdateViews/UpdateRecommendedView.swift +++ b/Discovery/Discovery/Presentation/UpdateViews/UpdateRecommendedView.swift @@ -11,7 +11,7 @@ import Theme public struct UpdateRecommendedView: View { - @Environment (\.isHorizontal) private var isHorizontal + @Environment(\.isHorizontal) private var isHorizontal private let router: DiscoveryRouter private let config: ConfigProtocol diff --git a/Discovery/Discovery/Presentation/UpdateViews/UpdateRequiredView.swift b/Discovery/Discovery/Presentation/UpdateViews/UpdateRequiredView.swift index cbadd0ebf..2c3c53a79 100644 --- a/Discovery/Discovery/Presentation/UpdateViews/UpdateRequiredView.swift +++ b/Discovery/Discovery/Presentation/UpdateViews/UpdateRequiredView.swift @@ -11,7 +11,7 @@ import Theme public struct UpdateRequiredView: View { - @Environment (\.isHorizontal) private var isHorizontal + @Environment(\.isHorizontal) private var isHorizontal private let router: DiscoveryRouter private let config: ConfigProtocol private let showAccountLink: Bool diff --git a/Discussion/Discussion.xcodeproj/project.pbxproj b/Discussion/Discussion.xcodeproj/project.pbxproj index 657642ca2..30e8cc473 100644 --- a/Discussion/Discussion.xcodeproj/project.pbxproj +++ b/Discussion/Discussion.xcodeproj/project.pbxproj @@ -884,7 +884,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -918,7 +918,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1015,7 +1015,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1113,7 +1113,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1205,7 +1205,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1296,7 +1296,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1519,7 +1519,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1632,7 +1632,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/Discussion/Discussion/Presentation/Comments/Responses/ResponsesView.swift b/Discussion/Discussion/Presentation/Comments/Responses/ResponsesView.swift index 91a5d9dda..6118d2172 100644 --- a/Discussion/Discussion/Presentation/Comments/Responses/ResponsesView.swift +++ b/Discussion/Discussion/Presentation/Comments/Responses/ResponsesView.swift @@ -19,7 +19,7 @@ public struct ResponsesView: View { @ObservedObject private var viewModel: ResponsesViewModel @State private var isShowProgress: Bool = true - + public init( commentID: String, viewModel: ResponsesViewModel, @@ -46,15 +46,7 @@ public struct ResponsesView: View { ScrollViewReader { scroll in VStack { ZStack(alignment: .top) { - RefreshableScrollViewCompat(action: { - viewModel.comments = [] - _ = await viewModel.getResponsesData( - commentID: commentID, - parentComment: parentComment, - page: 1, - refresh: true - ) - }) { + ScrollView { VStack { if let comments = viewModel.postComments { ParentCommentView( @@ -162,6 +154,17 @@ public struct ResponsesView: View { } .frameLimit(width: proxy.size.width) } + .refreshable { + viewModel.comments = [] + Task { + _ = await viewModel.getResponsesData( + commentID: commentID, + parentComment: parentComment, + page: 1, + refresh: true + ) + } + } if !(parentComment.closed || viewModel.isBlackedOut) { FlexibleKeyboardInputView( hint: DiscussionLocalization.Response.addComment, diff --git a/Discussion/Discussion/Presentation/Comments/Thread/ThreadView.swift b/Discussion/Discussion/Presentation/Comments/Thread/ThreadView.swift index 1d39962f2..0dbc40a3b 100644 --- a/Discussion/Discussion/Presentation/Comments/Thread/ThreadView.swift +++ b/Discussion/Discussion/Presentation/Comments/Thread/ThreadView.swift @@ -36,9 +36,7 @@ public struct ThreadView: View { ScrollViewReader { scroll in VStack { ZStack(alignment: .top) { - RefreshableScrollViewCompat(action: { - _ = await viewModel.getThreadData(thread: thread, page: 1, refresh: true) - }) { + ScrollView { VStack { if let comments = viewModel.postComments { ParentCommentView( @@ -157,6 +155,11 @@ public struct ThreadView: View { } .frameLimit(width: proxy.size.width) } + .refreshable { + Task { + _ = await viewModel.getThreadData(thread: thread, page: 1, refresh: true) + } + } if !(thread.closed || viewModel.isBlackedOut) { FlexibleKeyboardInputView( hint: DiscussionLocalization.Thread.addResponse, diff --git a/Discussion/Discussion/Presentation/CreateNewThread/CreateNewThreadView.swift b/Discussion/Discussion/Presentation/CreateNewThread/CreateNewThreadView.swift index 7c676df8d..39aa77378 100644 --- a/Discussion/Discussion/Presentation/CreateNewThread/CreateNewThreadView.swift +++ b/Discussion/Discussion/Presentation/CreateNewThread/CreateNewThreadView.swift @@ -141,7 +141,7 @@ public struct CreateNewThreadView: View { .padding(.horizontal, 10) .padding(.vertical, 10) .frame(height: 200) - .hideScrollContentBackground() + .scrollContentBackground(.hidden) .background( Theme.Shapes.textInputShape .fill(Theme.Colors.textInputBackground) diff --git a/Discussion/Discussion/Presentation/DiscussionTopics/DiscussionTopicsView.swift b/Discussion/Discussion/Presentation/DiscussionTopics/DiscussionTopicsView.swift index 5964e41ab..77e23d8e1 100644 --- a/Discussion/Discussion/Presentation/DiscussionTopics/DiscussionTopicsView.swift +++ b/Discussion/Discussion/Presentation/DiscussionTopics/DiscussionTopicsView.swift @@ -37,9 +37,7 @@ public struct DiscussionTopicsView: View { GeometryReader { proxy in ZStack(alignment: .center) { VStack(alignment: .center) { - RefreshableScrollViewCompat(action: { - await viewModel.getTopics(courseID: self.courseID, withProgress: false) - }) { + ScrollView { DynamicOffsetView( coordinate: $coordinate, collapsed: $collapsed @@ -168,6 +166,11 @@ public struct DiscussionTopicsView: View { } }.frame(maxWidth: .infinity) + .refreshable { + Task { + await viewModel.getTopics(courseID: self.courseID, withProgress: false) + } + } }.padding(.top, 8) if viewModel.isShowProgress { ProgressBar(size: 40, lineWidth: 8) diff --git a/Discussion/Discussion/Presentation/Posts/PostsView.swift b/Discussion/Discussion/Presentation/Posts/PostsView.swift index 1ab2fc0fb..71912528e 100644 --- a/Discussion/Discussion/Presentation/Posts/PostsView.swift +++ b/Discussion/Discussion/Presentation/Posts/PostsView.swift @@ -102,13 +102,7 @@ public struct PostsView: View { Divider().offset(y: -8) } - RefreshableScrollViewCompat(action: { - viewModel.resetPosts() - _ = await viewModel.getPosts( - pageNumber: 1, - withProgress: false - ) - }) { + ScrollView { let posts = Array(viewModel.filteredPosts.enumerated()) if posts.count >= 1 { LazyVStack { @@ -209,6 +203,15 @@ public struct PostsView: View { } } } + .refreshable { + viewModel.resetPosts() + Task { + _ = await viewModel.getPosts( + pageNumber: 1, + withProgress: false + ) + } + } } .accessibilityAction {} .onRightSwipeGesture { diff --git a/OpenEdX.xcodeproj/project.pbxproj b/OpenEdX.xcodeproj/project.pbxproj index dca913869..68414c4d2 100644 --- a/OpenEdX.xcodeproj/project.pbxproj +++ b/OpenEdX.xcodeproj/project.pbxproj @@ -769,7 +769,7 @@ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UIStatusBarStyle = UIStatusBarStyleLightContent; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -860,7 +860,7 @@ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UIStatusBarStyle = UIStatusBarStyleLightContent; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -957,7 +957,7 @@ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UIStatusBarStyle = UIStatusBarStyleLightContent; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1048,7 +1048,7 @@ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UIStatusBarStyle = UIStatusBarStyleLightContent; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1199,7 +1199,7 @@ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UIStatusBarStyle = UIStatusBarStyleLightContent; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1236,7 +1236,7 @@ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UIStatusBarStyle = UIStatusBarStyleLightContent; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1290,7 +1290,7 @@ repositoryURL = "https://github.com/firebase/firebase-ios-sdk"; requirement = { kind = upToNextMajorVersion; - minimumVersion = 10.26.0; + minimumVersion = 11.3.0; }; }; 14D912D12C25483F0077CCCE /* XCRemoteSwiftPackageReference "fullstory-swift-package-ios" */ = { @@ -1298,7 +1298,7 @@ repositoryURL = "https://github.com/fullstorydev/fullstory-swift-package-ios"; requirement = { kind = upToNextMajorVersion; - minimumVersion = 1.49.0; + minimumVersion = 1.53.0; }; }; A51CDBEB2B6D2BEE009B6D4E /* XCRemoteSwiftPackageReference "braze-segment-swift" */ = { @@ -1306,7 +1306,7 @@ repositoryURL = "https://github.com/braze-inc/braze-segment-swift"; requirement = { kind = upToNextMajorVersion; - minimumVersion = 2.2.0; + minimumVersion = 4.0.0; }; }; A5462D9D2B865713003B96A5 /* XCRemoteSwiftPackageReference "analytics-swift" */ = { @@ -1314,7 +1314,7 @@ repositoryURL = "https://github.com/segmentio/analytics-swift.git"; requirement = { kind = upToNextMajorVersion; - minimumVersion = 1.5.3; + minimumVersion = 1.6.1; }; }; A5BD3E2E2B83B0F7006A8983 /* XCRemoteSwiftPackageReference "analytics-swift-firebase" */ = { @@ -1322,7 +1322,7 @@ repositoryURL = "https://github.com/segment-integrations/analytics-swift-firebase"; requirement = { kind = upToNextMajorVersion; - minimumVersion = 1.3.5; + minimumVersion = 1.4.0; }; }; BA3042772B1F7147009B64B7 /* XCRemoteSwiftPackageReference "microsoft-authentication-library-for-objc" */ = { @@ -1330,7 +1330,7 @@ repositoryURL = "https://github.com/AzureAD/microsoft-authentication-library-for-objc"; requirement = { kind = upToNextMajorVersion; - minimumVersion = 1.2.19; + minimumVersion = 1.5.1; }; }; /* End XCRemoteSwiftPackageReference section */ diff --git a/Podfile b/Podfile index 992beae02..4ce194c65 100644 --- a/Podfile +++ b/Podfile @@ -1,10 +1,10 @@ -platform :ios, '14.0' +platform :ios, '16.0' use_frameworks! :linkage => :static abstract_target "App" do #Code style - pod 'SwiftLint', '~> 0.54.0' + pod 'SwiftLint', '~> 0.57.0' #CodeGen for resources pod 'SwiftGen', '~> 6.6' @@ -17,14 +17,14 @@ abstract_target "App" do project './Core/Core.xcodeproj' workspace './Core/Core.xcodeproj' #Networking - pod 'Alamofire', '~> 5.7' + pod 'Alamofire', '~> 5.9' #Keychain - pod 'KeychainSwift', '~> 20.0' + pod 'KeychainSwift', '~> 24.0' #SwiftUI backward UIKit access #pod 'Introspect', '~> 0.6' - pod 'SwiftUIIntrospect', '~> 0.8' - pod 'Kingfisher', '~> 7.8' - pod 'Swinject', '2.8.3' + 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 ac4754acd..a79ae0c35 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,26 +1,26 @@ PODS: - - Alamofire (5.8.0) - - KeychainSwift (20.0.0) - - Kingfisher (7.9.1) + - 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.54.0) - - SwiftUIIntrospect (0.12.0) + - SwiftLint (0.57.0) + - SwiftUIIntrospect (1.3.0) - SwiftyMocky (4.2.0): - Sourcery (= 1.8.0) - - Swinject (2.8.3) + - Swinject (2.9.1) DEPENDENCIES: - - Alamofire (~> 5.7) - - KeychainSwift (~> 20.0) - - Kingfisher (~> 7.8) + - Alamofire (~> 5.9) + - KeychainSwift (~> 24.0) + - Kingfisher (~> 8.0) - SwiftGen (~> 6.6) - - SwiftLint (~> 0.54.0) - - SwiftUIIntrospect (~> 0.8) + - SwiftLint (~> 0.57.0) + - SwiftUIIntrospect (~> 1.3) - SwiftyMocky (from `https://github.com/MakeAWishFoundation/SwiftyMocky.git`, tag `4.2.0`) - - Swinject (= 2.8.3) + - Swinject (= 2.9.1) SPEC REPOS: trunk: @@ -44,16 +44,16 @@ CHECKOUT OPTIONS: :tag: 4.2.0 SPEC CHECKSUMS: - Alamofire: 0e92e751b3e9e66d7982db43919d01f313b8eb91 - KeychainSwift: 0ce6a4d13f7228054d1a71bb1b500448fb2ab837 - Kingfisher: 1d14e9f59cbe19389f591c929000332bf70efd32 + Alamofire: f36a35757af4587d8e4f4bfa223ad10be2422b8c + KeychainSwift: 007c4647486e4563adca839cf02cef00deb3b670 + Kingfisher: bbf78af014cc845cf9a799363f627b5212784165 Sourcery: 6f5fe49b82b7e02e8c65560cbd52e1be67a1af2e SwiftGen: 4993cbf71cbc4886f775e26f8d5c3a1188ec9f99 - SwiftLint: c1de071d9d08c8aba837545f6254315bc900e211 - SwiftUIIntrospect: 89f443402f701a9197e9e54e3c2ed00b10c32e6d + SwiftLint: eb47480d47c982481592c195c221d11013a679cc + SwiftUIIntrospect: fee9aa07293ee280373a591e1824e8ddc869ba5d SwiftyMocky: c5e96e4ff76ec6dbf5a5941aeb039b5a546954a0 - Swinject: 893c9a543000ac2f10ee4cbaf0933c6992c935d5 + Swinject: a827d508c6270da03ec74e558e728917a888fa9b -PODFILE CHECKSUM: 1b95af9ed204a9f360c00f6f9afa9955ad03b540 +PODFILE CHECKSUM: b3183e95d2b3bf330c512113a847f9a5485c23a5 COCOAPODS: 1.15.2 diff --git a/Profile/Profile.xcodeproj/project.pbxproj b/Profile/Profile.xcodeproj/project.pbxproj index 2401233cd..0df3b6a27 100644 --- a/Profile/Profile.xcodeproj/project.pbxproj +++ b/Profile/Profile.xcodeproj/project.pbxproj @@ -871,7 +871,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -906,7 +906,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1003,7 +1003,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1101,7 +1101,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1193,7 +1193,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1284,7 +1284,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1507,7 +1507,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1620,7 +1620,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/Profile/Profile/Presentation/EditProfile/EditProfileView.swift b/Profile/Profile/Presentation/EditProfile/EditProfileView.swift index cf432b238..7f6c415de 100644 --- a/Profile/Profile/Presentation/EditProfile/EditProfileView.swift +++ b/Profile/Profile/Presentation/EditProfile/EditProfileView.swift @@ -90,7 +90,7 @@ public struct EditProfileView: View { .padding(.horizontal, 12) .padding(.vertical, 4) .frame(height: 200) - .hideScrollContentBackground() + .scrollContentBackground(.hidden) .background( Theme.Shapes.textInputShape .fill(Theme.Colors.textInputBackground) diff --git a/Profile/Profile/Presentation/EditProfile/ProfileBottomSheet.swift b/Profile/Profile/Presentation/EditProfile/ProfileBottomSheet.swift index 802571018..481dd2a15 100644 --- a/Profile/Profile/Presentation/EditProfile/ProfileBottomSheet.swift +++ b/Profile/Profile/Presentation/EditProfile/ProfileBottomSheet.swift @@ -39,7 +39,7 @@ struct ProfileBottomSheet: View { private var removePhoto: () -> Void @Binding private var showingBottomSheet: Bool - @Environment (\.isHorizontal) private var isHorizontal + @Environment(\.isHorizontal) private var isHorizontal private var maxWidth: CGFloat { idiom == .pad || (idiom == .phone && isHorizontal) ? 330 : .infinity diff --git a/Profile/Profile/Presentation/Profile/ProfileView.swift b/Profile/Profile/Presentation/Profile/ProfileView.swift index 37a23c6de..390a4eec9 100644 --- a/Profile/Profile/Presentation/Profile/ProfileView.swift +++ b/Profile/Profile/Presentation/Profile/ProfileView.swift @@ -22,15 +22,16 @@ public struct ProfileView: View { GeometryReader { proxy in ZStack(alignment: .top) { // MARK: - Page Body - RefreshableScrollViewCompat( - action: { - await viewModel.getMyProfile(withProgress: false) - }, - content: { + ScrollView { content .frameLimit(width: proxy.size.width) } - ) + .refreshable { + Task { + await viewModel.getMyProfile(withProgress: false) + } + + } .accessibilityAction {} .padding(.top, 8) .navigationBarHidden(false) diff --git a/Profile/Profile/Presentation/Profile/UserProfile/UserProfileView.swift b/Profile/Profile/Presentation/Profile/UserProfile/UserProfileView.swift index 38078a834..cc5d2fc0f 100644 --- a/Profile/Profile/Presentation/Profile/UserProfile/UserProfileView.swift +++ b/Profile/Profile/Presentation/Profile/UserProfile/UserProfileView.swift @@ -28,9 +28,7 @@ public struct UserProfileView: View { Theme.Colors.background .ignoresSafeArea() // MARK: - Page Body - RefreshableScrollViewCompat(action: { - await viewModel.getUserProfile(withProgress: false) - }) { + ScrollView { VStack { if viewModel.isShowProgress { ProgressBar(size: 40, lineWidth: 8) @@ -84,6 +82,11 @@ public struct UserProfileView: View { } .frameLimit(width: proxy.size.width) } + .refreshable { + Task { + await viewModel.getUserProfile(withProgress: false) + } + } .padding(.top, 8) .navigationBarHidden(false) .navigationBarBackButtonHidden(false) diff --git a/Profile/Profile/Presentation/Settings/ManageAccountView.swift b/Profile/Profile/Presentation/Settings/ManageAccountView.swift index 7f9475f76..f6c169da2 100644 --- a/Profile/Profile/Presentation/Settings/ManageAccountView.swift +++ b/Profile/Profile/Presentation/Settings/ManageAccountView.swift @@ -14,7 +14,7 @@ public struct ManageAccountView: View { @ObservedObject private var viewModel: ManageAccountViewModel - @Environment (\.isHorizontal) private var isHorizontal + @Environment(\.isHorizontal) private var isHorizontal public init(viewModel: ManageAccountViewModel) { self.viewModel = viewModel @@ -56,24 +56,25 @@ public struct ManageAccountView: View { } // MARK: - Page Body - RefreshableScrollViewCompat( - action: { - await viewModel.getMyProfile(withProgress: false) - }, - content: { - VStack(alignment: .leading, spacing: 12) { - if viewModel.isShowProgress { - ProgressBar(size: 40, lineWidth: 8) - .padding(.top, 200) - .padding(.horizontal) - .accessibilityIdentifier("progress_bar") - } else { - userAvatar - editProfileButton - deleteAccount - } + ScrollView { + VStack(alignment: .leading, spacing: 12) { + if viewModel.isShowProgress { + ProgressBar(size: 40, lineWidth: 8) + .padding(.top, 200) + .padding(.horizontal) + .accessibilityIdentifier("progress_bar") + } else { + userAvatar + editProfileButton + deleteAccount } - }) + } + } + .refreshable { + Task { + await viewModel.getMyProfile(withProgress: false) + } + } .frameLimit(width: proxy.size.width) .padding(.top, 24) .padding(.horizontal, isHorizontal ? 24 : 0) diff --git a/Profile/Profile/Presentation/Settings/SettingsView.swift b/Profile/Profile/Presentation/Settings/SettingsView.swift index e11926591..cc1eb0e45 100644 --- a/Profile/Profile/Presentation/Settings/SettingsView.swift +++ b/Profile/Profile/Presentation/Settings/SettingsView.swift @@ -15,7 +15,7 @@ public struct SettingsView: View { @ObservedObject private var viewModel: SettingsViewModel - @Environment (\.isHorizontal) private var isHorizontal + @Environment(\.isHorizontal) private var isHorizontal public init(viewModel: SettingsViewModel) { self.viewModel = viewModel diff --git a/Profile/Profile/Presentation/Settings/VideoQualityView.swift b/Profile/Profile/Presentation/Settings/VideoQualityView.swift index 3ad89ad78..829029111 100644 --- a/Profile/Profile/Presentation/Settings/VideoQualityView.swift +++ b/Profile/Profile/Presentation/Settings/VideoQualityView.swift @@ -14,7 +14,7 @@ public struct VideoQualityView: View { @ObservedObject private var viewModel: SettingsViewModel - @Environment (\.isHorizontal) private var isHorizontal + @Environment(\.isHorizontal) private var isHorizontal public init(viewModel: SettingsViewModel) { self.viewModel = viewModel diff --git a/Profile/Profile/Presentation/Settings/VideoSettingsView.swift b/Profile/Profile/Presentation/Settings/VideoSettingsView.swift index f54446cec..561c9cab1 100644 --- a/Profile/Profile/Presentation/Settings/VideoSettingsView.swift +++ b/Profile/Profile/Presentation/Settings/VideoSettingsView.swift @@ -13,7 +13,7 @@ public struct VideoSettingsView: View { @ObservedObject private var viewModel: SettingsViewModel - @Environment (\.isHorizontal) private var isHorizontal + @Environment(\.isHorizontal) private var isHorizontal public init(viewModel: SettingsViewModel) { self.viewModel = viewModel diff --git a/Theme/Theme.xcodeproj/project.pbxproj b/Theme/Theme.xcodeproj/project.pbxproj index e67d7eb3d..ea888a71a 100644 --- a/Theme/Theme.xcodeproj/project.pbxproj +++ b/Theme/Theme.xcodeproj/project.pbxproj @@ -509,7 +509,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -602,7 +602,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -700,7 +700,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -793,7 +793,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -891,7 +891,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -984,7 +984,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1140,7 +1140,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1175,7 +1175,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/WhatsNew/WhatsNew.xcodeproj/project.pbxproj b/WhatsNew/WhatsNew.xcodeproj/project.pbxproj index 62b52f41d..c8bd11c0b 100644 --- a/WhatsNew/WhatsNew.xcodeproj/project.pbxproj +++ b/WhatsNew/WhatsNew.xcodeproj/project.pbxproj @@ -622,7 +622,7 @@ INFOPLIST_FILE = WhatsNew/Info.plist; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -661,7 +661,7 @@ INFOPLIST_FILE = WhatsNew/Info.plist; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -805,7 +805,7 @@ INFOPLIST_FILE = WhatsNew/Info.plist; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -930,7 +930,7 @@ INFOPLIST_FILE = WhatsNew/Info.plist; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1055,7 +1055,7 @@ INFOPLIST_FILE = WhatsNew/Info.plist; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1173,7 +1173,7 @@ INFOPLIST_FILE = WhatsNew/Info.plist; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1290,7 +1290,7 @@ INFOPLIST_FILE = WhatsNew/Info.plist; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1407,7 +1407,7 @@ INFOPLIST_FILE = WhatsNew/Info.plist; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/WhatsNew/WhatsNew/Presentation/WhatsNewView.swift b/WhatsNew/WhatsNew/Presentation/WhatsNewView.swift index 4fbd03c4e..9a6ec09ce 100644 --- a/WhatsNew/WhatsNew/Presentation/WhatsNewView.swift +++ b/WhatsNew/WhatsNew/Presentation/WhatsNewView.swift @@ -16,7 +16,7 @@ public struct WhatsNewView: View { @ObservedObject private var viewModel: WhatsNewViewModel - @Environment (\.isHorizontal) + @Environment(\.isHorizontal) private var isHorizontal @State var index = 0