diff --git a/.github/actions/setup-android/action.yml b/.github/actions/setup-android/action.yml index a870fda907..9801c3601b 100644 --- a/.github/actions/setup-android/action.yml +++ b/.github/actions/setup-android/action.yml @@ -62,7 +62,7 @@ runs: - name: Setup Ruby if: ${{ inputs.setup-ruby == 'true' }} - uses: ruby/setup-ruby@v1.190.0 + uses: ruby/setup-ruby@v1.194.0 with: ruby-version: '3.3.0' bundler-cache: true diff --git a/.github/actions/setup-ios/action.yml b/.github/actions/setup-ios/action.yml index 91f5e57f24..e9b66da753 100644 --- a/.github/actions/setup-ios/action.yml +++ b/.github/actions/setup-ios/action.yml @@ -20,7 +20,7 @@ runs: - name: Setup Xcode version uses: maxim-lobanov/setup-xcode@v1.6.0 with: - xcode-version: '15.4' + xcode-version: '16.0' - name: Homebrew install git-crypt run: brew install git-crypt @@ -49,7 +49,7 @@ runs: shell: bash - name: Setup Ruby - uses: ruby/setup-ruby@v1.190.0 + uses: ruby/setup-ruby@v1.194.0 with: ruby-version: '3.3.0' bundler-cache: true diff --git a/.github/workflows/automerge_into_release.yml b/.github/workflows/automerge_into_release.yml index 722d75a7a3..c14443df11 100644 --- a/.github/workflows/automerge_into_release.yml +++ b/.github/workflows/automerge_into_release.yml @@ -27,7 +27,7 @@ jobs: automerge: needs: files-changed name: Automerge - runs-on: macos-14 + runs-on: macos-15 steps: - name: Checkout @@ -37,7 +37,7 @@ jobs: token: ${{ secrets.GH_PAT }} - name: Setup Ruby - uses: ruby/setup-ruby@v1.190.0 + uses: ruby/setup-ruby@v1.194.0 with: ruby-version: "3.3.0" bundler-cache: true diff --git a/.github/workflows/build_caches.yml b/.github/workflows/build_caches.yml index 33cdd576e0..7b5fc48f75 100644 --- a/.github/workflows/build_caches.yml +++ b/.github/workflows/build_caches.yml @@ -50,7 +50,7 @@ jobs: needs: files-changed if: ${{ github.event_name == 'workflow_dispatch' || needs.files-changed.outputs.ios == 'true' }} name: Build iOS Caches - runs-on: macos-14 + runs-on: macos-15 timeout-minutes: 60 steps: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b7bd1e1c46..6d474ce37f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -110,7 +110,7 @@ jobs: needs: files-changed if: ${{ needs.files-changed.outputs.ios == 'true' || needs.files-changed.outputs.shared == 'true' }} name: Run SwiftLint - runs-on: macos-14 + runs-on: macos-15 timeout-minutes: 10 steps: @@ -118,7 +118,7 @@ jobs: uses: actions/checkout@v4 - name: Setup Ruby - uses: ruby/setup-ruby@v1.190.0 + uses: ruby/setup-ruby@v1.194.0 with: ruby-version: "3.3.0" bundler-cache: true @@ -193,7 +193,7 @@ jobs: build-ios: needs: swiftlint name: Build iOS - runs-on: macos-14 + runs-on: macos-15 timeout-minutes: 30 steps: diff --git a/.github/workflows/ios_beta_deployment.yml b/.github/workflows/ios_beta_deployment.yml index d5cf3e81c4..1bd7f57725 100644 --- a/.github/workflows/ios_beta_deployment.yml +++ b/.github/workflows/ios_beta_deployment.yml @@ -34,7 +34,7 @@ jobs: deployment: name: iOS Beta Deployment needs: gradle-wrapper-validation - runs-on: macos-14 + runs-on: macos-15 environment: ios_production timeout-minutes: 60 diff --git a/.github/workflows/ios_release_deployment.yml b/.github/workflows/ios_release_deployment.yml index a98c8a8631..8f1402f4ee 100644 --- a/.github/workflows/ios_release_deployment.yml +++ b/.github/workflows/ios_release_deployment.yml @@ -30,7 +30,7 @@ jobs: deployment: name: iOS Release Deployment needs: gradle-wrapper-validation - runs-on: macos-14 + runs-on: macos-15 environment: ios_production timeout-minutes: 60 diff --git a/.github/workflows/ios_unit_testing.yml b/.github/workflows/ios_unit_testing.yml index b538755125..dd6b8161dd 100644 --- a/.github/workflows/ios_unit_testing.yml +++ b/.github/workflows/ios_unit_testing.yml @@ -18,7 +18,7 @@ jobs: test: if: ${{ vars.IS_IOS_UNIT_TESTING_ENABLED == 'true' }} name: Run iOS unit tests - runs-on: macos-14 + runs-on: macos-15 timeout-minutes: 60 steps: diff --git a/iosHyperskillApp/Podfile b/iosHyperskillApp/Podfile index 045cd22969..b6d4e120b2 100644 --- a/iosHyperskillApp/Podfile +++ b/iosHyperskillApp/Podfile @@ -12,7 +12,7 @@ target "iosHyperskillApp" do pod "shared", :path => "../shared" pod "SwiftLint", "0.54.0" - pod "Sentry", "8.17.2" + pod "Sentry", "8.36.0" pod "RevenueCat", "4.41.1" diff --git a/iosHyperskillApp/Podfile.lock b/iosHyperskillApp/Podfile.lock index 1b80130672..9961fbbcaa 100644 --- a/iosHyperskillApp/Podfile.lock +++ b/iosHyperskillApp/Podfile.lock @@ -96,12 +96,9 @@ PODS: - PanModal (1.2.7) - PromisesObjC (2.4.0) - RevenueCat (4.41.1) - - Sentry (8.17.2): - - Sentry/Core (= 8.17.2) - - SentryPrivate (= 8.17.2) - - Sentry/Core (8.17.2): - - SentryPrivate (= 8.17.2) - - SentryPrivate (8.17.2) + - Sentry (8.36.0): + - Sentry/Core (= 8.36.0) + - Sentry/Core (8.36.0) - shared (1.0): - RevenueCat (= 4.41.1) - SkeletonUI (1.0.11) @@ -130,7 +127,7 @@ DEPENDENCIES: - NukeUI (from `https://github.com/kean/NukeUI.git`, tag `0.8.3`) - PanModal (from `https://github.com/ivan-magda/PanModal.git`, branch `remove-presenting-appearance-transitions`) - RevenueCat (= 4.41.1) - - Sentry (= 8.17.2) + - Sentry (= 8.36.0) - shared (from `../shared`) - SkeletonUI (= 1.0.11) - SnapKit (= 5.7.1) @@ -167,7 +164,6 @@ SPEC REPOS: - PromisesObjC - RevenueCat - Sentry - - SentryPrivate - SkeletonUI - SnapKit - STRegex @@ -240,8 +236,7 @@ SPEC CHECKSUMS: PanModal: 3e16ead1a907fb06f4df3f13492fd00149fa4974 PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 RevenueCat: 1e7be26ae57d83bfd4191c9c4f1a01b3b409b215 - Sentry: 64a9f9c3637af913adcf53deced05bbe452d1410 - SentryPrivate: 024c6fed507ac39ae98e6d087034160f942920d5 + Sentry: f8374b5415bc38dfb5645941b3ae31230fbeae57 shared: 347ef463ef2f66af50fc8e59d533b6007bc63518 SkeletonUI: a5514a3877d39f28229c852a567660d0f7542330 SnapKit: d612e99e678a2d3b95bf60b0705ed0a35c03484a @@ -250,6 +245,6 @@ SPEC CHECKSUMS: SVProgressHUD: 4837c74bdfe2e51e8821c397825996a8d7de6e22 SwiftLint: c1de071d9d08c8aba837545f6254315bc900e211 -PODFILE CHECKSUM: 1177593fe82412f60dfb7e58578b56066fe42f4f +PODFILE CHECKSUM: 09fa07fe4459b0ac13f67c359df0395b665b2ccf COCOAPODS: 1.16.2 diff --git a/iosHyperskillApp/iosHyperskillApp.xcodeproj/project.pbxproj b/iosHyperskillApp/iosHyperskillApp.xcodeproj/project.pbxproj index dd9e3e0eb1..58c0b24b57 100644 --- a/iosHyperskillApp/iosHyperskillApp.xcodeproj/project.pbxproj +++ b/iosHyperskillApp/iosHyperskillApp.xcodeproj/project.pbxproj @@ -6013,6 +6013,7 @@ SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -6067,6 +6068,7 @@ SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 5.0; VALIDATE_PRODUCT = YES; }; name = Release; diff --git a/iosHyperskillApp/iosHyperskillApp/Sources/Frameworks/ContentProcessor/View/UIKit/ProcessedContentWebView.swift b/iosHyperskillApp/iosHyperskillApp/Sources/Frameworks/ContentProcessor/View/UIKit/ProcessedContentWebView.swift index fa78f00e19..1e59c5f7ce 100644 --- a/iosHyperskillApp/iosHyperskillApp/Sources/Frameworks/ContentProcessor/View/UIKit/ProcessedContentWebView.swift +++ b/iosHyperskillApp/iosHyperskillApp/Sources/Frameworks/ContentProcessor/View/UIKit/ProcessedContentWebView.swift @@ -1,6 +1,6 @@ import SnapKit import UIKit -import WebKit +@preconcurrency import WebKit protocol ProcessedContentWebViewDelegate: AnyObject { func processedContentTextViewDidLoadContent(_ view: ProcessedContentWebView) diff --git a/iosHyperskillApp/iosHyperskillApp/Sources/Frameworks/WebController/WebControllerManager.swift b/iosHyperskillApp/iosHyperskillApp/Sources/Frameworks/WebController/WebControllerManager.swift index 7618c5b952..1ea826cd16 100644 --- a/iosHyperskillApp/iosHyperskillApp/Sources/Frameworks/WebController/WebControllerManager.swift +++ b/iosHyperskillApp/iosHyperskillApp/Sources/Frameworks/WebController/WebControllerManager.swift @@ -2,7 +2,7 @@ import SafariServices import shared import SVProgressHUD import UIKit -import WebKit +@preconcurrency import WebKit final class WebControllerManager: NSObject { static let shared = WebControllerManager() diff --git a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/AuthCredentials/Views/AuthCredentialsView.swift b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/AuthCredentials/Views/AuthCredentialsView.swift index a77e71dac4..50ba3340af 100644 --- a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/AuthCredentials/Views/AuthCredentialsView.swift +++ b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/AuthCredentials/Views/AuthCredentialsView.swift @@ -87,18 +87,8 @@ struct AuthCredentialsView: View { } } -#Preview("iPhone 15 Pro") { +#if DEBUG +#Preview { AuthCredentialsAssembly().makeModule() - .previewDevice(PreviewDevice(rawValue: "iPhone 15 Pro")) -} - -#Preview("iPhone SE (Dark)") { - AuthCredentialsAssembly().makeModule() - .previewDevice(PreviewDevice(rawValue: "iPhone SE (3rd generation)")) - .preferredColorScheme(.dark) -} - -#Preview("iPad") { - AuthCredentialsAssembly().makeModule() - .previewDevice(PreviewDevice(rawValue: "iPad (10th generation)")) } +#endif diff --git a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/Comments/Views/Content/CommentsContentView.swift b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/Comments/Views/Content/CommentsContentView.swift index e2c257fc89..6a268e538f 100644 --- a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/Comments/Views/Content/CommentsContentView.swift +++ b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/Comments/Views/Content/CommentsContentView.swift @@ -85,9 +85,9 @@ struct CommentsContentView: View { } } -extension CommentsScreenViewState.DiscussionItem: Identifiable {} +extension shared.CommentsScreenViewState.DiscussionItem: @retroactive Swift.Identifiable {} -extension CommentsScreenViewState.CommentItem: Identifiable {} +extension shared.CommentsScreenViewState.CommentItem: @retroactive Swift.Identifiable {} extension CommentsCommentView { init( diff --git a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/GamificationToolbar/Views/ProgressBarButtonItem.swift b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/GamificationToolbar/Views/ProgressBarButtonItem.swift index 14123d317f..ca8a8a186d 100644 --- a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/GamificationToolbar/Views/ProgressBarButtonItem.swift +++ b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/GamificationToolbar/Views/ProgressBarButtonItem.swift @@ -55,7 +55,9 @@ struct ProgressBarButtonItem: View { } } -#Preview { +#if DEBUG +@available(iOS 17, *) +#Preview(traits: .sizeThatFitsLayout) { VStack { ProgressBarButtonItem( progress: 0.65, @@ -73,5 +75,5 @@ struct ProgressBarButtonItem: View { } .padding() .background(Color(ColorPalette.background)) - .previewLayout(.sizeThatFits) } +#endif diff --git a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/ProgressScreen/Views/ProgressScreenCardView.swift b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/ProgressScreen/Views/ProgressScreenCardView.swift index c9fda0b593..ff20055252 100644 --- a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/ProgressScreen/Views/ProgressScreenCardView.swift +++ b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/ProgressScreen/Views/ProgressScreenCardView.swift @@ -75,7 +75,9 @@ struct ProgressScreenCardView: View { } } -#Preview { +#if DEBUG +@available(iOS 17, *) +#Preview(traits: .sizeThatFitsLayout) { let appearance = ProgressScreenCardView.Appearance( spacing: LayoutInsets.defaultInset, interitemSpacing: LayoutInsets.smallInset, @@ -111,7 +113,7 @@ struct ProgressScreenCardView: View { subtitle: "Time to complete the track" ) } - .previewLayout(.sizeThatFits) .padding() .background(Color.systemGroupedBackground) } +#endif diff --git a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/Search/SearchViewModel.swift b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/Search/SearchViewModel.swift index c1f376b634..986bd4feb7 100644 --- a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/Search/SearchViewModel.swift +++ b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/Search/SearchViewModel.swift @@ -49,4 +49,4 @@ final class SearchViewModel: FeatureViewModel< } } -extension SearchFeatureSearchResultsViewStateContent.Item: Identifiable {} +extension shared.SearchFeatureSearchResultsViewStateContent.Item: @retroactive Swift.Identifiable {} diff --git a/iosHyperskillApp/iosHyperskillApp/Sources/Services/Auth/Social/SDKs/AppleIDSocialAuthSDKProvider.swift b/iosHyperskillApp/iosHyperskillApp/Sources/Services/Auth/Social/SDKs/AppleIDSocialAuthSDKProvider.swift index 73d46ccf61..9f00e18ed2 100644 --- a/iosHyperskillApp/iosHyperskillApp/Sources/Services/Auth/Social/SDKs/AppleIDSocialAuthSDKProvider.swift +++ b/iosHyperskillApp/iosHyperskillApp/Sources/Services/Auth/Social/SDKs/AppleIDSocialAuthSDKProvider.swift @@ -121,23 +121,19 @@ extension AppleIDSocialAuthSDKProvider: ASAuthorizationControllerDelegate { } private func handleDidCompleteWithError(_ error: Error) { - let sdkError: SocialAuthSDKError = { + let sdkError: SocialAuthSDKError = if let sdkError = error as? SocialAuthSDKError { - return sdkError + sdkError } else if let authorizationError = error as? ASAuthorizationError { switch authorizationError.code { case .canceled: - return .canceled - case .unknown, .invalidResponse, .notHandled, .failed, .notInteractive: - return .connectionError(originalError: error) - @unknown default: - return .connectionError(originalError: error) + .canceled + default: + .connectionError(originalError: error) } } else { - return .connectionError(originalError: error) + .connectionError(originalError: error) } - }() - completionHandler?(.failure(sdkError)) } } diff --git a/iosHyperskillApp/iosHyperskillApp/Sources/Systems/AppsFlyerManager.swift b/iosHyperskillApp/iosHyperskillApp/Sources/Systems/AppsFlyerManager.swift index d4012e5a56..e37ca562d9 100644 --- a/iosHyperskillApp/iosHyperskillApp/Sources/Systems/AppsFlyerManager.swift +++ b/iosHyperskillApp/iosHyperskillApp/Sources/Systems/AppsFlyerManager.swift @@ -78,7 +78,7 @@ final class AppsFlyerManager: AppsFlyerAnalyticEngine { values: values, completionHandler: { dictionaryOrNil, errorOrNil in if let error = errorOrNil { - assertionFailure("AppsFlyerManager: failed log event = \(name) with error =\(error)") + print("AppsFlyerManager: failed log event = \(name), values = \(values), error =\(error)") } else { print(""" AppsFlyerManager: successfully logged event = \(name) with result = \(String(describing: dictionaryOrNil))