diff --git a/.envrc.example b/.envrc.example index ef1c1556..a45f2cc7 100644 --- a/.envrc.example +++ b/.envrc.example @@ -5,7 +5,7 @@ export SENTRY_PROJECT="" export SENTRY_AUTH_TOKEN="" export SENTRY_DSN="" -export TOOOT_API_KEY="" +export TOOOT_PUSH_KEY_PUBLIC="" # Fastlane start export LC_ALL="" diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..0f1e6eb0 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +custom: ['https://www.buymeacoffee.com/xmflsct'] diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 73ce0f1d..3789e0fc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,7 +7,7 @@ on: jobs: build: - runs-on: macos-10.15 + runs-on: macos-11 steps: - name: -- Step 0 -- Extract branch name shell: bash @@ -18,13 +18,13 @@ jobs: - name: -- Step 2 -- Setup node uses: actions/setup-node@v2 with: - node-version: 14.x + node-version: 16.x - name: -- Step 3 -- Use Expo action - uses: expo/expo-github-action@v5 + uses: expo/expo-github-action@v6 with: - expo-version: 4.x - expo-username: ${{ secrets.EXPO_USERNAME }} - expo-token: ${{ secrets.EXPO_TOKEN }} + expo-version: 5.x + username: ${{ secrets.EXPO_USERNAME }} + token: ${{ secrets.EXPO_TOKEN }} - name: -- Step 4 -- Install node dependencies run: yarn install - name: -- Step 5 -- Install native dependencies @@ -33,6 +33,7 @@ jobs: run: bundle install - name: -- Step 7 -- Run fastlane env: + DEVELOPER_DIR: /Applications/Xcode_13.2.1.app/Contents/Developer ENVIRONMENT: ${{ steps.branch.outputs.branch }} LC_ALL: en_US.UTF-8 LANG: en_US.UTF-8 @@ -40,7 +41,7 @@ jobs: SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }} SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} SENTRY_DSN: ${{ secrets.SENTRY_DSN }} - TOOOT_API_KEY: ${{ secrets.TOOOT_API_KEY }} + TOOOT_PUSH_KEY_PUBLIC: ${{ secrets.TOOOT_PUSH_KEY_PUBLIC }} FASTLANE_USER: ${{ secrets.FASTLANE_USER }} MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} MATCH_GIT_URL: ${{ secrets.MATCH_GIT_URL }} diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml new file mode 100644 index 00000000..7b7f9a11 --- /dev/null +++ b/.github/workflows/codeql-analysis.yml @@ -0,0 +1,70 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ main ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ main ] + schedule: + - cron: '35 4 * * 4' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'javascript' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] + # Learn more about CodeQL language support at https://git.io/codeql-language-support + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v1 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl + + # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language + + #- run: | + # make bootstrap + # make release + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 diff --git a/Gemfile.lock b/Gemfile.lock index 2fe8dde7..2288987d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,41 +1,43 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.3) - activesupport (5.2.5) + CFPropertyList (3.0.5) + rexml + activesupport (6.1.4.1) concurrent-ruby (~> 1.0, >= 1.0.2) - i18n (>= 0.7, < 2) - minitest (~> 5.1) - tzinfo (~> 1.1) - addressable (2.7.0) + i18n (>= 1.6, < 2) + minitest (>= 5.1) + tzinfo (~> 2.0) + zeitwerk (~> 2.3) + addressable (2.8.0) public_suffix (>= 2.0.2, < 5.0) algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) artifactory (3.0.15) atomos (0.1.3) - aws-eventstream (1.1.1) - aws-partitions (1.455.0) - aws-sdk-core (3.114.0) + aws-eventstream (1.2.0) + aws-partitions (1.551.0) + aws-sdk-core (3.125.5) aws-eventstream (~> 1, >= 1.0.2) - aws-partitions (~> 1, >= 1.239.0) + aws-partitions (~> 1, >= 1.525.0) aws-sigv4 (~> 1.1) jmespath (~> 1.0) - aws-sdk-kms (1.43.0) - aws-sdk-core (~> 3, >= 3.112.0) + aws-sdk-kms (1.53.0) + aws-sdk-core (~> 3, >= 3.125.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.94.1) - aws-sdk-core (~> 3, >= 3.112.0) + aws-sdk-s3 (1.111.3) + aws-sdk-core (~> 3, >= 3.125.0) aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.1) - aws-sigv4 (1.2.3) + aws-sigv4 (~> 1.4) + aws-sigv4 (1.4.0) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) - claide (1.0.3) - cocoapods (1.10.1) - addressable (~> 2.6) + claide (1.1.0) + cocoapods (1.11.2) + addressable (~> 2.8) claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.10.1) + cocoapods-core (= 1.11.2) cocoapods-deintegrate (>= 1.0.3, < 2.0) cocoapods-downloader (>= 1.4.0, < 2.0) cocoapods-plugins (>= 1.0.0, < 2.0) @@ -46,26 +48,26 @@ GEM escape (~> 0.0.4) fourflusher (>= 2.3.0, < 3.0) gh_inspector (~> 1.0) - molinillo (~> 0.6.6) + molinillo (~> 0.8.0) nap (~> 1.0) - ruby-macho (~> 1.4) - xcodeproj (>= 1.19.0, < 2.0) - cocoapods-core (1.10.1) - activesupport (> 5.0, < 6) - addressable (~> 2.6) + ruby-macho (>= 1.0, < 3.0) + xcodeproj (>= 1.21.0, < 2.0) + cocoapods-core (1.11.2) + activesupport (>= 5.0, < 7) + addressable (~> 2.8) algoliasearch (~> 1.0) concurrent-ruby (~> 1.1) fuzzy_match (~> 2.0.4) nap (~> 1.0) netrc (~> 0.11) - public_suffix + public_suffix (~> 4.0) typhoeus (~> 1.0) - cocoapods-deintegrate (1.0.4) - cocoapods-downloader (1.4.0) + cocoapods-deintegrate (1.0.5) + cocoapods-downloader (1.5.1) cocoapods-plugins (1.0.0) nap - cocoapods-search (1.0.0) - cocoapods-trunk (1.5.0) + cocoapods-search (1.0.1) + cocoapods-trunk (1.6.0) nap (>= 0.8, < 2.0) netrc (~> 0.11) cocoapods-try (1.2.0) @@ -73,36 +75,50 @@ GEM colored2 (3.1.2) commander (4.6.0) highline (~> 2.0.0) - concurrent-ruby (1.1.8) + concurrent-ruby (1.1.9) declarative (0.0.20) - digest-crc (0.6.3) + digest-crc (0.6.4) rake (>= 12.0.0, < 14.0.0) domain_name (0.5.20190701) unf (>= 0.0.5, < 1.0.0) dotenv (2.7.6) - emoji_regex (3.2.2) + emoji_regex (3.2.3) escape (0.0.4) - ethon (0.12.0) - ffi (>= 1.3.0) - excon (0.81.0) - faraday (1.4.1) + ethon (0.15.0) + ffi (>= 1.15.0) + excon (0.90.0) + faraday (1.9.3) + faraday-em_http (~> 1.0) + faraday-em_synchrony (~> 1.0) faraday-excon (~> 1.1) + faraday-httpclient (~> 1.0) + faraday-multipart (~> 1.0) faraday-net_http (~> 1.0) - faraday-net_http_persistent (~> 1.1) - multipart-post (>= 1.2, < 3) + faraday-net_http_persistent (~> 1.0) + faraday-patron (~> 1.0) + faraday-rack (~> 1.0) + faraday-retry (~> 1.0) ruby2_keywords (>= 0.0.4) faraday-cookie_jar (0.0.7) faraday (>= 0.8.0) http-cookie (~> 1.0.0) + faraday-em_http (1.0.0) + faraday-em_synchrony (1.0.0) faraday-excon (1.1.0) + faraday-httpclient (1.0.1) + faraday-multipart (1.0.3) + multipart-post (>= 1.2, < 3) faraday-net_http (1.0.1) - faraday-net_http_persistent (1.1.0) - faraday_middleware (1.0.0) + faraday-net_http_persistent (1.2.0) + faraday-patron (1.0.0) + faraday-rack (1.0.0) + faraday-retry (1.0.3) + faraday_middleware (1.2.0) faraday (~> 1.0) - fastimage (2.2.3) - fastlane (2.182.0) + fastimage (2.2.6) + fastlane (2.203.0) CFPropertyList (>= 2.3, < 4.0.0) - addressable (>= 2.3, < 3.0.0) + addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) aws-sdk-s3 (~> 1.0) babosa (>= 1.0.3, < 2.0.0) @@ -117,14 +133,16 @@ GEM faraday_middleware (~> 1.0) fastimage (>= 2.1.0, < 3.0.0) gh_inspector (>= 1.1.2, < 2.0.0) - google-api-client (>= 0.37.0, < 0.39.0) - google-cloud-storage (>= 1.15.0, < 2.0.0) + google-apis-androidpublisher_v3 (~> 0.3) + google-apis-playcustomapp_v1 (~> 0.1) + google-cloud-storage (~> 1.31) highline (~> 2.0) json (< 3.0.0) jwt (>= 2.1.0, < 3) mini_magick (>= 4.9.4, < 5.0.0) multipart-post (~> 2.0.0) naturally (~> 2.2) + optparse (~> 0.1.1) plist (>= 3.1.0, < 4.0.0) rubyzip (>= 2.0.0, < 3.0.0) security (= 0.1.3) @@ -138,80 +156,76 @@ GEM xcpretty (~> 0.3.0) xcpretty-travis-formatter (>= 0.0.3) fastlane-plugin-json (1.0.0) - fastlane-plugin-sentry (1.8.1) + fastlane-plugin-sentry (1.11.0) fastlane-plugin-versioning_android (0.1.0) fastlane-plugin-yarn (1.2) - ffi (1.15.0) + ffi (1.15.4) fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) - google-api-client (0.38.0) + google-apis-androidpublisher_v3 (0.16.0) + google-apis-core (>= 0.4, < 2.a) + google-apis-core (0.4.2) addressable (~> 2.5, >= 2.5.1) - googleauth (~> 0.9) - httpclient (>= 2.8.1, < 3.0) + googleauth (>= 0.16.2, < 2.a) + httpclient (>= 2.8.1, < 3.a) mini_mime (~> 1.0) representable (~> 3.0) - retriable (>= 2.0, < 4.0) - signet (~> 0.12) - google-apis-core (0.3.0) - addressable (~> 2.5, >= 2.5.1) - googleauth (~> 0.14) - httpclient (>= 2.8.1, < 3.0) - mini_mime (~> 1.0) - representable (~> 3.0) - retriable (>= 2.0, < 4.0) + retriable (>= 2.0, < 4.a) rexml - signet (~> 0.14) webrick - google-apis-iamcredentials_v1 (0.3.0) - google-apis-core (~> 0.1) - google-apis-storage_v1 (0.3.0) - google-apis-core (~> 0.1) + google-apis-iamcredentials_v1 (0.10.0) + google-apis-core (>= 0.4, < 2.a) + google-apis-playcustomapp_v1 (0.7.0) + google-apis-core (>= 0.4, < 2.a) + google-apis-storage_v1 (0.11.0) + google-apis-core (>= 0.4, < 2.a) google-cloud-core (1.6.0) google-cloud-env (~> 1.0) google-cloud-errors (~> 1.0) google-cloud-env (1.5.0) faraday (>= 0.17.3, < 2.0) - google-cloud-errors (1.1.0) - google-cloud-storage (1.31.0) - addressable (~> 2.5) + google-cloud-errors (1.2.0) + google-cloud-storage (1.36.0) + addressable (~> 2.8) digest-crc (~> 0.4) google-apis-iamcredentials_v1 (~> 0.1) google-apis-storage_v1 (~> 0.1) - google-cloud-core (~> 1.2) - googleauth (~> 0.9) + google-cloud-core (~> 1.6) + googleauth (>= 0.16.2, < 2.a) mini_mime (~> 1.0) - googleauth (0.16.2) + googleauth (1.1.0) faraday (>= 0.17.3, < 2.0) jwt (>= 1.4, < 3.0) memoist (~> 0.16) multi_json (~> 1.11) os (>= 0.9, < 2.0) - signet (~> 0.14) + signet (>= 0.16, < 2.a) highline (2.0.3) - http-cookie (1.0.3) + http-cookie (1.0.4) domain_name (~> 0.5) httpclient (2.8.3) - i18n (1.8.9) + i18n (1.8.10) concurrent-ruby (~> 1.0) - jmespath (1.4.0) - json (2.5.1) - jwt (2.2.3) + jmespath (1.5.0) + json (2.6.1) + jwt (2.3.0) memoist (0.16.2) mini_magick (4.11.0) - mini_mime (1.1.0) + mini_mime (1.1.2) minitest (5.14.4) - molinillo (0.6.6) + molinillo (0.8.0) multi_json (1.15.0) multipart-post (2.0.0) nanaimo (0.3.0) nap (1.1.0) naturally (2.2.1) netrc (0.11.0) - os (1.1.1) + optparse (0.1.1) + os (1.1.4) plist (3.6.0) public_suffix (4.0.6) - rake (13.0.3) + rake (13.0.6) representable (3.1.1) declarative (< 0.1.0) trailblazer-option (>= 0.1.1, < 0.2.0) @@ -219,12 +233,12 @@ GEM retriable (3.1.2) rexml (3.2.5) rouge (2.0.7) - ruby-macho (1.4.0) - ruby2_keywords (0.0.4) - rubyzip (2.3.0) + ruby-macho (2.5.1) + ruby2_keywords (0.0.5) + rubyzip (2.3.2) security (0.1.3) - signet (0.15.0) - addressable (~> 2.3) + signet (0.16.0) + addressable (~> 2.8) faraday (>= 0.17.3, < 2.0) jwt (>= 1.5, < 3.0) multi_json (~> 1.10) @@ -234,36 +248,38 @@ GEM terminal-notifier (2.0.0) terminal-table (1.8.0) unicode-display_width (~> 1.1, >= 1.1.1) - thread_safe (0.3.6) - trailblazer-option (0.1.1) + trailblazer-option (0.1.2) tty-cursor (0.7.1) tty-screen (0.8.1) tty-spinner (0.9.3) tty-cursor (~> 0.7) typhoeus (1.4.0) ethon (>= 0.9.0) - tzinfo (1.2.9) - thread_safe (~> 0.1) + tzinfo (2.0.4) + concurrent-ruby (~> 1.0) uber (0.1.0) unf (0.1.4) unf_ext - unf_ext (0.0.7.7) - unicode-display_width (1.7.0) + unf_ext (0.0.8) + unicode-display_width (1.8.0) webrick (1.7.0) word_wrap (1.0.0) - xcodeproj (1.19.0) + xcodeproj (1.21.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) colored2 (~> 3.1) nanaimo (~> 0.3.0) + rexml (~> 3.2.4) xcpretty (0.3.0) rouge (~> 2.0.7) xcpretty-travis-formatter (1.0.1) xcpretty (~> 0.2, >= 0.0.7) + zeitwerk (2.5.1) PLATFORMS universal-darwin-20 + universal-darwin-21 DEPENDENCIES cocoapods @@ -274,4 +290,4 @@ DEPENDENCIES fastlane-plugin-yarn BUNDLED WITH - 2.2.8 + 2.2.17 diff --git a/VERSIONING.md b/VERSIONING.md index c9d788ad..6d9e4861 100644 --- a/VERSIONING.md +++ b/VERSIONING.md @@ -5,7 +5,7 @@ * A new app store version has to be submitted. * Outdated versions in principle do not receive further OTA updates. -## Minor releases - App Store and OTA +## Minor releases - App Store "Minor releases" are artifacts published as `?.y.?`: * An artifact can be released as `?.y.?` when there is no change nor update made to the native modules. @@ -21,11 +21,12 @@ ## OTA release channels - * `MAJOR-environment`. Environments include `release`, `candidate` and `development`. + * `MAJOR.MINOR-environment`. Environments include `release`, `candidate` and `development`. ## Major versions mapping to native module versions -| Major version | Native module version | Expo version | -| :-----------: | :-------------------: | :----------: | -| `0` | `210201` | `40.0.0` | -| `1` | `210317` | `40.0.0` | \ No newline at end of file +| Version | Native module version | Expo version | +| :------:| :-------------------: | :----------: | +| `0-` | `210201` | `40.0.0` | +| `1-` | `210317` | `40.0.0` | +| `2.2` | `210916` | `41.0.0` | \ No newline at end of file diff --git a/android/app/build.gradle b/android/app/build.gradle index 69182fd5..0568f271 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -78,13 +78,11 @@ import com.android.build.OutputFile */ project.ext.react = [ - enableHermes: true + enableHermes: (findProperty('expo.jsEngine') ?: "jsc") == "hermes", + cliPath: new File(["node", "--print", "require.resolve('react-native/package.json')"].execute().text.trim(), "../cli.js") ] -apply from: '../../node_modules/react-native-unimodules/gradle.groovy' -apply from: "../../node_modules/react-native/react.gradle" -apply from: "../../node_modules/expo-constants/scripts/get-app-config-android.gradle" -apply from: "../../node_modules/expo-updates/scripts/create-manifest-android.gradle" +apply from: new File(["node", "--print", "require.resolve('react-native/package.json')"].execute().text.trim(), "../react.gradle") /** * Set this to true to create two separate APKs instead of one: @@ -190,9 +188,39 @@ android { } dependencies { + implementation ("androidx.lifecycle:lifecycle-runtime-ktx:2.3.0") { + force = true + } + implementation fileTree(dir: "libs", include: ["*.jar"]) //noinspection GradleDynamicVersion implementation "com.facebook.react:react-native:+" // From node_modules + + def isGifEnabled = (findProperty('expo.gif.enabled') ?: "") == "true"; + def isWebpEnabled = (findProperty('expo.webp.enabled') ?: "") == "true"; + def isWebpAnimatedEnabled = (findProperty('expo.webp.animated') ?: "") == "true"; + + // If your app supports Android versions before Ice Cream Sandwich (API level 14) + // All fresco packages should use the same version + if (isGifEnabled || isWebpEnabled) { + implementation 'com.facebook.fresco:fresco:2.0.0' + implementation 'com.facebook.fresco:imagepipeline-okhttp3:2.0.0' + } + + if (isGifEnabled) { + // For animated gif support + implementation 'com.facebook.fresco:animated-gif:2.0.0' + } + + if (isWebpEnabled) { + // For webp support + implementation 'com.facebook.fresco:webpsupport:2.0.0' + if (isWebpAnimatedEnabled) { + // Animated webp support + implementation 'com.facebook.fresco:animated-webp:2.0.0' + } + } + implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0" debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") { exclude group:'com.facebook.fbjni' @@ -204,12 +232,10 @@ dependencies { debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") { exclude group:'com.facebook.flipper' } - addUnimodulesDependencies() if (enableHermes) { - def hermesPath = "../../node_modules/hermes-engine/android/"; - debugImplementation files(hermesPath + "hermes-debug.aar") - releaseImplementation files(hermesPath + "hermes-release.aar") + debugImplementation files(new File(["node", "--print", "require.resolve('hermes-engine/package.json')"].execute().text.trim(), "../android/hermes-debug.aar")) + releaseImplementation files(new File(["node", "--print", "require.resolve('hermes-engine/package.json')"].execute().text.trim(), "../android/hermes-release.aar")) } else { implementation jscFlavor } @@ -222,6 +248,7 @@ task copyDownloadableDepsToLibs(type: Copy) { into 'libs' } -apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) +apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json')"].execute().text.trim(), "../native_modules.gradle"); +applyNativeModulesAppBuildGradle(project) apply plugin: 'com.google.gms.google-services' diff --git a/android/app/src/main/java/com/xmflsct/app/tooot/MainActivity.java b/android/app/src/main/java/com/xmflsct/app/tooot/MainActivity.java index aee28cd6..b7611a1b 100644 --- a/android/app/src/main/java/com/xmflsct/app/tooot/MainActivity.java +++ b/android/app/src/main/java/com/xmflsct/app/tooot/MainActivity.java @@ -1,7 +1,4 @@ package com.xmflsct.app.tooot; -import android.content.res.Configuration; -import android.content.Intent; - import android.os.Bundle; import com.facebook.react.ReactActivity; @@ -9,30 +6,14 @@ import com.facebook.react.ReactActivityDelegate; import com.facebook.react.ReactRootView; import com.swmansion.gesturehandler.react.RNGestureHandlerEnabledRootView; -import expo.modules.splashscreen.singletons.SplashScreen; -import expo.modules.splashscreen.SplashScreenImageResizeMode; - +import expo.modules.ReactActivityDelegateWrapper; public class MainActivity extends ReactActivity { - - // Added automatically by Expo Config - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - Intent intent = new Intent("onConfigurationChanged"); - intent.putExtra("newConfig", newConfig); - sendBroadcast(intent); - } - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(null); - // SplashScreen.show(...) has to be called after super.onCreate(...) - // Below line is handled by '@expo/configure-splash-screen' command and it's discouraged to modify it manually - SplashScreen.show(this, SplashScreenImageResizeMode.CONTAIN, ReactRootView.class, false); } - /** * Returns the name of the main component registered from JavaScript. * This is used to schedule rendering of the component. @@ -44,11 +25,14 @@ public class MainActivity extends ReactActivity { @Override protected ReactActivityDelegate createReactActivityDelegate() { - return new ReactActivityDelegate(this, getMainComponentName()) { - @Override - protected ReactRootView createRootView() { - return new RNGestureHandlerEnabledRootView(MainActivity.this); + return new ReactActivityDelegateWrapper( + this, + new ReactActivityDelegate(this, getMainComponentName()) { + @Override + protected ReactRootView createRootView() { + return new RNGestureHandlerEnabledRootView(MainActivity.this); + } } - }; + ); } } diff --git a/android/app/src/main/java/com/xmflsct/app/tooot/MainApplication.java b/android/app/src/main/java/com/xmflsct/app/tooot/MainApplication.java index 7bf44f4e..0669a1bf 100644 --- a/android/app/src/main/java/com/xmflsct/app/tooot/MainApplication.java +++ b/android/app/src/main/java/com/xmflsct/app/tooot/MainApplication.java @@ -2,7 +2,8 @@ package com.xmflsct.app.tooot; import android.app.Application; import android.content.Context; -import android.net.Uri; +import android.content.res.Configuration; +import androidx.annotation.NonNull; import com.facebook.react.PackageList; import com.facebook.react.ReactApplication; @@ -11,32 +12,21 @@ import com.facebook.react.ReactNativeHost; import com.facebook.react.ReactPackage; import com.facebook.react.shell.MainReactPackage; import com.facebook.soloader.SoLoader; -import com.xmflsct.app.tooot.generated.BasePackageList; -import org.unimodules.adapters.react.ReactAdapterPackage; -import org.unimodules.adapters.react.ModuleRegistryAdapter; -import org.unimodules.adapters.react.ReactModuleRegistryProvider; -import org.unimodules.core.interfaces.Package; -import org.unimodules.core.interfaces.SingletonModule; -import expo.modules.constants.ConstantsPackage; -import expo.modules.permissions.PermissionsPackage; -import expo.modules.filesystem.FileSystemPackage; +import expo.modules.ApplicationLifecycleDispatcher; +import expo.modules.ReactNativeHostWrapper; import expo.modules.updates.UpdatesController; import java.lang.reflect.InvocationTargetException; -import java.util.Arrays; import java.util.List; -import javax.annotation.Nullable; - import com.facebook.react.bridge.JSIModulePackage; // <- react-native-reanimated-v2 - import com.swmansion.reanimated.ReanimatedJSIModulePackage; // <- react-native-reanimated-v2 +import com.facebook.react.bridge.JSIModulePackage; // <- react-native-reanimated-v2 +import com.swmansion.reanimated.ReanimatedJSIModulePackage; // <- react-native-reanimated-v2 public class MainApplication extends Application implements ReactApplication { - private final ReactModuleRegistryProvider mModuleRegistryProvider = new ReactModuleRegistryProvider( - new BasePackageList().getPackageList() - ); - - private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { + private final ReactNativeHost mReactNativeHost = new ReactNativeHostWrapper( + this, + new ReactNativeHost(this) { @Override public boolean getUseDeveloperSupport() { return BuildConfig.DEBUG; @@ -44,8 +34,10 @@ public class MainApplication extends Application implements ReactApplication { @Override protected List getPackages() { + @SuppressWarnings("UnnecessaryLocalVariable") List packages = new PackageList(this).getPackages(); - packages.add(new ModuleRegistryAdapter(mModuleRegistryProvider)); + // Packages that cannot be autolinked yet can be added manually here, for example: + // packages.add(new MyReactNativePackage()); return packages; } @@ -58,25 +50,7 @@ public class MainApplication extends Application implements ReactApplication { protected JSIModulePackage getJSIModulePackage() { return new ReanimatedJSIModulePackage(); } - - @Override - protected @Nullable String getJSBundleFile() { - if (BuildConfig.DEBUG) { - return super.getJSBundleFile(); - } else { - return UpdatesController.getInstance().getLaunchAssetFile(); - } - } - - @Override - protected @Nullable String getBundleAssetName() { - if (BuildConfig.DEBUG) { - return super.getBundleAssetName(); - } else { - return UpdatesController.getInstance().getBundleAssetName(); - } - } - }; + }); @Override public ReactNativeHost getReactNativeHost() { @@ -88,11 +62,14 @@ public class MainApplication extends Application implements ReactApplication { super.onCreate(); SoLoader.init(this, /* native exopackage */ false); - if (!BuildConfig.DEBUG) { - UpdatesController.initialize(this); - } - initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); + ApplicationLifecycleDispatcher.onApplicationCreate(this); + } + + @Override + public void onConfigurationChanged(@NonNull Configuration newConfig) { + super.onConfigurationChanged(newConfig); + ApplicationLifecycleDispatcher.onConfigurationChanged(this, newConfig); } /** diff --git a/android/app/src/main/java/com/xmflsct/app/tooot/generated/BasePackageList.java b/android/app/src/main/java/com/xmflsct/app/tooot/generated/BasePackageList.java deleted file mode 100644 index b7aecbc5..00000000 --- a/android/app/src/main/java/com/xmflsct/app/tooot/generated/BasePackageList.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.xmflsct.app.tooot.generated; - -import java.util.Arrays; -import java.util.List; -import org.unimodules.core.interfaces.Package; - -public class BasePackageList { - public List getPackageList() { - return Arrays.asList( - new expo.modules.application.ApplicationPackage(), - new expo.modules.av.AVPackage(), - new expo.modules.constants.ConstantsPackage(), - new expo.modules.crypto.CryptoPackage(), - new expo.modules.device.DevicePackage(), - new expo.modules.errorrecovery.ErrorRecoveryPackage(), - new expo.modules.filesystem.FileSystemPackage(), - new expo.modules.firebase.analytics.FirebaseAnalyticsPackage(), - new expo.modules.firebase.core.FirebaseCorePackage(), - new expo.modules.font.FontLoaderPackage(), - new expo.modules.haptics.HapticsPackage(), - new expo.modules.imageloader.ImageLoaderPackage(), - new expo.modules.imagemanipulator.ImageManipulatorPackage(), - new expo.modules.imagepicker.ImagePickerPackage(), - new expo.modules.keepawake.KeepAwakePackage(), - new expo.modules.localization.LocalizationPackage(), - new expo.modules.notifications.NotificationsPackage(), - new expo.modules.permissions.PermissionsPackage(), - new expo.modules.screencapture.ScreenCapturePackage(), - new expo.modules.securestore.SecureStorePackage(), - new expo.modules.splashscreen.SplashScreenPackage(), - new expo.modules.storereview.StoreReviewPackage(), - new expo.modules.updates.UpdatesPackage(), - new expo.modules.videothumbnails.VideoThumbnailsPackage(), - new expo.modules.webbrowser.WebBrowserPackage() - ); - } -} diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 94c07c32..1f97fdc0 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -1,4 +1,6 @@ tooot + contain + false \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle index 014c558e..3e8039ac 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -2,19 +2,21 @@ buildscript { ext { - buildToolsVersion = "29.0.3" + buildToolsVersion = "30.0.2" minSdkVersion = 21 compileSdkVersion = 30 targetSdkVersion = 30 - ndkVersion = "20.1.5948944" + ndkVersion = "21.4.7075529" + kotlinVersion = '1.5.32' } repositories { google() + mavenCentral() jcenter() } dependencies { classpath 'com.google.gms:google-services:4.3.3' - classpath("com.android.tools.build:gradle:4.1.0") + classpath("com.android.tools.build:gradle:4.2.0") // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -26,14 +28,15 @@ allprojects { mavenLocal() maven { // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm - url("$rootDir/../node_modules/react-native/android") + url(new File(["node", "--print", "require.resolve('react-native/package.json')"].execute().text.trim(), "../android")) } maven { // Android JSC is installed from npm - url("$rootDir/../node_modules/jsc-android/dist") + url(new File(["node", "--print", "require.resolve('jsc-android/package.json')"].execute().text.trim(), "../dist")) } google() + mavenCentral() jcenter() maven { url 'https://www.jitpack.io' } } diff --git a/android/gradle.properties b/android/gradle.properties index 2ac55671..3f2121f6 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -31,4 +31,16 @@ FLIPPER_VERSION=0.75.1 org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=4096m -XX:+HeapDumpOnOutOfMemoryError org.gradle.daemon=true org.gradle.parallel=true -org.gradle.configureondemand=true \ No newline at end of file +org.gradle.configureondemand=true + +# The hosted JavaScript engine +# Supported values: expo.jsEngine = "hermes" | "jsc" +expo.jsEngine=hermes + +# Enable GIF support in React Native images (~200 B increase) +expo.gif.enabled=true +# Enable webp support in React Native images (~85 KB increase) +expo.webp.enabled=true +# Enable animated webp support (~3.4 MB increase) +# Disabled by default because iOS doesn't support animated webp +expo.webp.animated=false \ No newline at end of file diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 14e30f74..1f3fdbc5 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/android/settings.gradle b/android/settings.gradle index bf1e0259..cc93a0c0 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,9 +1,9 @@ rootProject.name = 'tooot' -apply from: '../node_modules/react-native-unimodules/gradle.groovy' -includeUnimodulesProjects() +apply from: new File(["node", "--print", "require.resolve('expo/package.json')"].execute().text.trim(), "../scripts/autolinking.gradle"); +useExpoModules() -apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); +apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json')"].execute().text.trim(), "../native_modules.gradle"); applyNativeModulesSettingsGradle(settings) include ':app' diff --git a/app.config.ts b/app.config.ts index 6344887b..6a93b58a 100644 --- a/app.config.ts +++ b/app.config.ts @@ -8,13 +8,13 @@ export default (): ExpoConfig => ({ name: 'tooot', description: 'tooot for Mastodon', slug: 'tooot', + scheme: 'tooot', version: toootVersion, - sdkVersion: versions.expo, privacy: 'hidden', assetBundlePatterns: ['assets/*'], extra: { sentryDSN: process.env.SENTRY_DSN, - toootApiKey: process.env.TOOOT_API_KEY + toootPushKeyPublic: process.env.TOOOT_PUSH_KEY_PUBLIC }, hooks: { postPublish: [ @@ -30,11 +30,11 @@ export default (): ExpoConfig => ({ } ] }, + jsEngine: 'hermes', ios: { bundleIdentifier: 'com.xmflsct.app.tooot' }, android: { - versionCode: 4, package: 'com.xmflsct.app.tooot', googleServicesFile: './configs/google-services.json', permissions: ['CAMERA', 'VIBRATE'] diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 7298ff94..0964385d 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -1,4 +1,4 @@ -fastlane_version "2.180.1" +fastlane_version "2.203.0" skip_docs ensure_env_vars( @@ -8,7 +8,7 @@ ensure_env_vars( VERSIONS = read_json( json_path: "./package.json" )[:versions] ENVIRONMENT = ENV["ENVIRONMENT"] VERSION = "#{VERSIONS[:major]}.#{VERSIONS[:minor]}" -RELEASE_CHANNEL = "#{VERSIONS[:major]}-#{ENVIRONMENT}" +RELEASE_CHANNEL = "#{VERSIONS[:major]}.#{VERSIONS[:minor]}-#{ENVIRONMENT}" BUILD_NUMBER = "#{Time.now.strftime("%y%m%d")}#{ENV["GITHUB_RUN_NUMBER"]}" GITHUB_REPO = "tooot-app/app" case ENVIRONMENT @@ -91,6 +91,7 @@ private_lane :build_ios do dsym_path: DSYM_FILE ) upload_to_testflight( + skip_submission: true, ipa: IPA_FILE, demo_account_required: true, distribute_external: true, @@ -107,6 +108,11 @@ private_lane :build_ios do silent: true ) upload_to_app_store( ipa: IPA_FILE, app_version: VERSION ) + download_dsyms( version: VERSION, build_number: BUILD_NUMBER, wait_for_dsym_processing: true ) + sentry_upload_dsym( + org_slug: ENV["SENTRY_ORGANIZATION"], + project_slug: ENV["SENTRY_PROJECT"], + ) else if !is_ci match( type: "adhoc", readonly: true ) diff --git a/fastlane/metadata/en-US/release_notes.txt b/fastlane/metadata/en-US/release_notes.txt index bd3b8146..b81243d0 100644 --- a/fastlane/metadata/en-US/release_notes.txt +++ b/fastlane/metadata/en-US/release_notes.txt @@ -1,2 +1 @@ -Added translation option, translation service is provided by various providers -When updating profile, now avatar and banner can be uploaded +Support iPad \ No newline at end of file diff --git a/fastlane/metadata/zh-Hans/description.txt b/fastlane/metadata/zh-Hans/description.txt index bc36625d..b6a299e0 100644 --- a/fastlane/metadata/zh-Hans/description.txt +++ b/fastlane/metadata/zh-Hans/description.txt @@ -1,6 +1,7 @@ tooot是一个专门为中文用户社区所打造的开源、简洁长毛象客户端。使用此客户端需要已经拥有一个长毛象(https://joinmastodon.org/)账号。 tooot支持: +- iPad - 多账号登录 - 黑暗或自适应模式 - 可调整正文字体大小 diff --git a/fastlane/metadata/zh-Hans/release_notes.txt b/fastlane/metadata/zh-Hans/release_notes.txt index 74a22c55..6b6d6a1a 100644 --- a/fastlane/metadata/zh-Hans/release_notes.txt +++ b/fastlane/metadata/zh-Hans/release_notes.txt @@ -1,2 +1 @@ -加入翻译嘟文支持,翻译服务由多个服务商提供 -修改个人信息里可以上传头像及横幅 +添加支持iPad diff --git a/fastlane/screenshots/en-US/0_iPad.png b/fastlane/screenshots/en-US/0_iPad.png new file mode 100644 index 00000000..35363cf7 Binary files /dev/null and b/fastlane/screenshots/en-US/0_iPad.png differ diff --git a/fastlane/screenshots/en-US/0_ipadPro129.png b/fastlane/screenshots/en-US/0_ipadPro129.png new file mode 100644 index 00000000..35363cf7 Binary files /dev/null and b/fastlane/screenshots/en-US/0_ipadPro129.png differ diff --git a/fastlane/screenshots/en-US/1_iPad.png b/fastlane/screenshots/en-US/1_iPad.png new file mode 100644 index 00000000..26a2e0ec Binary files /dev/null and b/fastlane/screenshots/en-US/1_iPad.png differ diff --git a/fastlane/screenshots/en-US/1_ipadPro129.png b/fastlane/screenshots/en-US/1_ipadPro129.png new file mode 100644 index 00000000..26a2e0ec Binary files /dev/null and b/fastlane/screenshots/en-US/1_ipadPro129.png differ diff --git a/fastlane/screenshots/en-US/2_iPad.png b/fastlane/screenshots/en-US/2_iPad.png new file mode 100644 index 00000000..312537e8 Binary files /dev/null and b/fastlane/screenshots/en-US/2_iPad.png differ diff --git a/fastlane/screenshots/en-US/2_ipadPro129.png b/fastlane/screenshots/en-US/2_ipadPro129.png new file mode 100644 index 00000000..312537e8 Binary files /dev/null and b/fastlane/screenshots/en-US/2_ipadPro129.png differ diff --git a/fastlane/screenshots/en-US/3_iPad.png b/fastlane/screenshots/en-US/3_iPad.png new file mode 100644 index 00000000..22231cd9 Binary files /dev/null and b/fastlane/screenshots/en-US/3_iPad.png differ diff --git a/fastlane/screenshots/en-US/3_ipadPro129.png b/fastlane/screenshots/en-US/3_ipadPro129.png new file mode 100644 index 00000000..22231cd9 Binary files /dev/null and b/fastlane/screenshots/en-US/3_ipadPro129.png differ diff --git a/fastlane/screenshots/zh-Hans/0_iPad.png b/fastlane/screenshots/zh-Hans/0_iPad.png new file mode 100644 index 00000000..5dbf6196 Binary files /dev/null and b/fastlane/screenshots/zh-Hans/0_iPad.png differ diff --git a/fastlane/screenshots/zh-Hans/0_ipadPro129.png b/fastlane/screenshots/zh-Hans/0_ipadPro129.png new file mode 100644 index 00000000..5dbf6196 Binary files /dev/null and b/fastlane/screenshots/zh-Hans/0_ipadPro129.png differ diff --git a/fastlane/screenshots/zh-Hans/1_iPad.png b/fastlane/screenshots/zh-Hans/1_iPad.png new file mode 100644 index 00000000..2e6de471 Binary files /dev/null and b/fastlane/screenshots/zh-Hans/1_iPad.png differ diff --git a/fastlane/screenshots/zh-Hans/1_ipadPro129.png b/fastlane/screenshots/zh-Hans/1_ipadPro129.png new file mode 100644 index 00000000..2e6de471 Binary files /dev/null and b/fastlane/screenshots/zh-Hans/1_ipadPro129.png differ diff --git a/fastlane/screenshots/zh-Hans/2_iPad.png b/fastlane/screenshots/zh-Hans/2_iPad.png new file mode 100644 index 00000000..02c6b176 Binary files /dev/null and b/fastlane/screenshots/zh-Hans/2_iPad.png differ diff --git a/fastlane/screenshots/zh-Hans/2_ipadPro129.png b/fastlane/screenshots/zh-Hans/2_ipadPro129.png new file mode 100644 index 00000000..02c6b176 Binary files /dev/null and b/fastlane/screenshots/zh-Hans/2_ipadPro129.png differ diff --git a/fastlane/screenshots/zh-Hans/3_iPad.png b/fastlane/screenshots/zh-Hans/3_iPad.png new file mode 100644 index 00000000..e5376321 Binary files /dev/null and b/fastlane/screenshots/zh-Hans/3_iPad.png differ diff --git a/fastlane/screenshots/zh-Hans/3_ipadPro129.png b/fastlane/screenshots/zh-Hans/3_ipadPro129.png new file mode 100644 index 00000000..e5376321 Binary files /dev/null and b/fastlane/screenshots/zh-Hans/3_ipadPro129.png differ diff --git a/ios/File.swift b/ios/File.swift index 5c905f26..8ac9906c 100644 --- a/ios/File.swift +++ b/ios/File.swift @@ -2,7 +2,7 @@ // File.swift // tooot // -// Created by Zheng Zhiyuan (SEBD) on 2021-03-15. +// Created by Zhiyuan Zheng on 2021-08-22. // import Foundation diff --git a/ios/Podfile b/ios/Podfile index db4de4cc..4d27b3b8 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -1,17 +1,19 @@ -require_relative '../node_modules/react-native/scripts/react_native_pods' -require_relative '../node_modules/react-native-unimodules/cocoapods.rb' -require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules' +require File.join(File.dirname(`node --print "require.resolve('expo/package.json')"`), "scripts/autolinking") +require File.join(File.dirname(`node --print "require.resolve('react-native/package.json')"`), "scripts/react_native_pods") +require File.join(File.dirname(`node --print "require.resolve('@react-native-community/cli-platform-ios/package.json')"`), "native_modules") -platform :ios, '11.0' +platform :ios, '12.0' + +require 'json' +podfile_properties = JSON.parse(File.read('./Podfile.properties.json')) rescue {} target 'tooot' do - use_unimodules! + use_expo_modules! config = use_native_modules! use_react_native!( :path => config[:reactNativePath], - # to enable hermes on iOS, change `false` to `true` and then install pods - :hermes_enabled => true + :hermes_enabled => podfile_properties['expo.jsEngine'] == 'hermes' ) # Enables Flipper. diff --git a/ios/Podfile.lock b/ios/Podfile.lock index b70113fb..90e1f496 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,85 +1,85 @@ PODS: - - boost-for-react-native (1.63.0) + - boost (1.76.0) - DoubleConversion (1.1.6) - - EXApplication (3.1.2): - - UMCore - - EXAV (9.1.2): - - UMCore - - UMFileSystemInterface - - UMPermissionsInterface - - EXConstants (10.1.3): - - UMConstantsInterface - - UMCore - - EXCrypto (9.1.0): - - UMCore - - EXDevice (2.4.0): - - UMCore - - EXErrorRecovery (2.1.0): - - UMCore - - EXFileSystem (11.0.2): - - UMCore - - UMFileSystemInterface - - EXFirebaseAnalytics (4.0.2): + - EXApplication (4.0.1): + - ExpoModulesCore + - EXAV (10.2.1): + - ExpoModulesCore + - ReactCommon/turbomodule/core + - EXConstants (13.0.2): + - ExpoModulesCore + - EXCrypto (10.1.2): + - ExpoModulesCore + - EXDevice (4.1.1): + - ExpoModulesCore + - EXErrorRecovery (3.0.5): + - ExpoModulesCore + - EXFileSystem (13.2.0): + - ExpoModulesCore + - EXFirebaseAnalytics (6.0.1): - EXFirebaseCore + - ExpoModulesCore - Firebase/Core (= 7.7.0) - - UMCore - - EXFirebaseCore (3.0.0): + - EXFirebaseCore (4.1.0): + - ExpoModulesCore - Firebase/Core (= 7.7.0) - - UMCore - - EXFont (9.1.0): - - UMCore - - UMFontInterface - - EXHaptics (10.0.0): - - UMCore - - EXImageLoader (2.1.1): + - EXFont (10.0.5): + - ExpoModulesCore + - EXImageLoader (3.1.0): + - ExpoModulesCore - React-Core - - UMCore - - UMImageLoaderInterface - - EXImageManipulator (9.1.0): - - UMCore - - UMFileSystemInterface - - UMImageLoaderInterface - - EXImagePicker (10.1.4): - - UMCore - - UMFileSystemInterface - - UMPermissionsInterface - - EXKeepAwake (9.1.2): - - UMCore - - EXLocalization (10.1.0): - - UMCore - - EXNotifications (0.11.6): - - UMCore - - UMPermissionsInterface - - EXPermissions (12.0.1): - - UMCore - - UMPermissionsInterface - - EXRandom (11.1.2): + - EXImageManipulator (10.2.1): + - EXImageLoader + - ExpoModulesCore + - EXImagePicker (12.0.2): + - ExpoModulesCore + - EXJSONUtils (0.2.0) + - EXKeepAwake (10.0.2): + - ExpoModulesCore + - EXManifests (0.2.2): + - EXJSONUtils + - EXNotifications (0.14.1): + - ExpoModulesCore + - Expo (44.0.6): + - ExpoModulesCore + - ExpoHaptics (11.1.1): + - ExpoModulesCore + - ExpoLocalization (12.0.1): + - ExpoModulesCore + - ExpoModulesCore (0.6.5): - React-Core - - EXScreenCapture (3.1.0): - - UMCore - - EXSecureStore (10.1.0): - - UMCore - - EXSplashScreen (0.10.2): + - ReactCommon/turbomodule/core + - EXRandom (12.1.2): - React-Core - - UMCore - - EXStoreReview (4.0.2): - - UMCore - - EXUpdates (0.3.5): - - React - - UMCore - - EXVideoThumbnails (5.1.0): - - UMCore - - UMFileSystemInterface - - EXWebBrowser (9.1.0): - - UMCore - - FBLazyVector (0.64.1) - - FBReactNativeSpec (0.64.1): - - RCT-Folly (= 2020.01.13.00) - - RCTRequired (= 0.64.1) - - RCTTypeSafety (= 0.64.1) - - React-Core (= 0.64.1) - - React-jsi (= 0.64.1) - - ReactCommon/turbomodule/core (= 0.64.1) + - EXScreenCapture (4.1.1): + - ExpoModulesCore + - EXSecureStore (11.1.1): + - ExpoModulesCore + - EXSplashScreen (0.14.2): + - ExpoModulesCore + - React-Core + - EXStoreReview (5.1.1): + - ExpoModulesCore + - EXStructuredHeaders (2.1.0) + - EXUpdates (0.11.3): + - EXManifests + - ExpoModulesCore + - EXStructuredHeaders + - EXUpdatesInterface + - React-Core + - EXUpdatesInterface (0.5.0) + - EXVideoThumbnails (6.2.0): + - ExpoModulesCore + - EXWebBrowser (10.1.1): + - ExpoModulesCore + - FBLazyVector (0.66.4) + - FBReactNativeSpec (0.66.4): + - RCT-Folly (= 2021.06.28.00-v2) + - RCTRequired (= 0.66.4) + - RCTTypeSafety (= 0.66.4) + - React-Core (= 0.66.4) + - React-jsi (= 0.66.4) + - ReactCommon/turbomodule/core (= 0.66.4) - Firebase/Core (7.7.0): - Firebase/CoreOnly - FirebaseAnalytics (= 7.7.0) @@ -108,6 +108,7 @@ PODS: - GoogleUtilities/Environment (~> 7.0) - GoogleUtilities/UserDefaults (~> 7.0) - PromisesObjC (~> 1.2) + - fmt (6.2.1) - glog (0.3.5) - GoogleAppMeasurement (7.7.0): - GoogleUtilities/AppDelegateSwizzler (~> 7.0) @@ -119,339 +120,345 @@ PODS: - GoogleUtilities/Environment (~> 7.2) - nanopb (~> 2.30907.0) - PromisesObjC (~> 1.2) - - GoogleUtilities/AppDelegateSwizzler (7.4.1): + - GoogleUtilities/AppDelegateSwizzler (7.7.0): - GoogleUtilities/Environment - GoogleUtilities/Logger - GoogleUtilities/Network - - GoogleUtilities/Environment (7.4.1): - - PromisesObjC (~> 1.2) - - GoogleUtilities/Logger (7.4.1): + - GoogleUtilities/Environment (7.7.0): + - PromisesObjC (< 3.0, >= 1.2) + - GoogleUtilities/Logger (7.7.0): - GoogleUtilities/Environment - - GoogleUtilities/MethodSwizzler (7.4.1): + - GoogleUtilities/MethodSwizzler (7.7.0): - GoogleUtilities/Logger - - GoogleUtilities/Network (7.4.1): + - GoogleUtilities/Network (7.7.0): - GoogleUtilities/Logger - "GoogleUtilities/NSData+zlib" - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (7.4.1)" - - GoogleUtilities/Reachability (7.4.1): + - "GoogleUtilities/NSData+zlib (7.7.0)" + - GoogleUtilities/Reachability (7.7.0): - GoogleUtilities/Logger - - GoogleUtilities/UserDefaults (7.4.1): + - GoogleUtilities/UserDefaults (7.7.0): - GoogleUtilities/Logger - - hermes-engine (0.7.2) + - hermes-engine (0.9.0) - libevent (2.1.12) - - libwebp (1.2.0): - - libwebp/demux (= 1.2.0) - - libwebp/mux (= 1.2.0) - - libwebp/webp (= 1.2.0) - - libwebp/demux (1.2.0): + - libwebp (1.2.1): + - libwebp/demux (= 1.2.1) + - libwebp/mux (= 1.2.1) + - libwebp/webp (= 1.2.1) + - libwebp/demux (1.2.1): - libwebp/webp - - libwebp/mux (1.2.0): + - libwebp/mux (1.2.1): - libwebp/demux - - libwebp/webp (1.2.0) + - libwebp/webp (1.2.1) - nanopb (2.30907.0): - nanopb/decode (= 2.30907.0) - nanopb/encode (= 2.30907.0) - nanopb/decode (2.30907.0) - nanopb/encode (2.30907.0) - PromisesObjC (1.2.12) - - RCT-Folly (2020.01.13.00): - - boost-for-react-native + - RCT-Folly (2021.06.28.00-v2): + - boost - DoubleConversion + - fmt (~> 6.2.1) - glog - - RCT-Folly/Default (= 2020.01.13.00) - - RCT-Folly/Default (2020.01.13.00): - - boost-for-react-native + - RCT-Folly/Default (= 2021.06.28.00-v2) + - RCT-Folly/Default (2021.06.28.00-v2): + - boost - DoubleConversion + - fmt (~> 6.2.1) - glog - - RCT-Folly/Futures (2020.01.13.00): - - boost-for-react-native + - RCT-Folly/Futures (2021.06.28.00-v2): + - boost - DoubleConversion + - fmt (~> 6.2.1) - glog - libevent - - RCTRequired (0.64.1) - - RCTTypeSafety (0.64.1): - - FBLazyVector (= 0.64.1) - - RCT-Folly (= 2020.01.13.00) - - RCTRequired (= 0.64.1) - - React-Core (= 0.64.1) - - React (0.64.1): - - React-Core (= 0.64.1) - - React-Core/DevSupport (= 0.64.1) - - React-Core/RCTWebSocket (= 0.64.1) - - React-RCTActionSheet (= 0.64.1) - - React-RCTAnimation (= 0.64.1) - - React-RCTBlob (= 0.64.1) - - React-RCTImage (= 0.64.1) - - React-RCTLinking (= 0.64.1) - - React-RCTNetwork (= 0.64.1) - - React-RCTSettings (= 0.64.1) - - React-RCTText (= 0.64.1) - - React-RCTVibration (= 0.64.1) - - React-callinvoker (0.64.1) - - React-Core (0.64.1): + - RCTRequired (0.66.4) + - RCTTypeSafety (0.66.4): + - FBLazyVector (= 0.66.4) + - RCT-Folly (= 2021.06.28.00-v2) + - RCTRequired (= 0.66.4) + - React-Core (= 0.66.4) + - React (0.66.4): + - React-Core (= 0.66.4) + - React-Core/DevSupport (= 0.66.4) + - React-Core/RCTWebSocket (= 0.66.4) + - React-RCTActionSheet (= 0.66.4) + - React-RCTAnimation (= 0.66.4) + - React-RCTBlob (= 0.66.4) + - React-RCTImage (= 0.66.4) + - React-RCTLinking (= 0.66.4) + - React-RCTNetwork (= 0.66.4) + - React-RCTSettings (= 0.66.4) + - React-RCTText (= 0.66.4) + - React-RCTVibration (= 0.66.4) + - React-callinvoker (0.66.4) + - React-Core (0.66.4): - glog - - RCT-Folly (= 2020.01.13.00) - - React-Core/Default (= 0.64.1) - - React-cxxreact (= 0.64.1) - - React-jsi (= 0.64.1) - - React-jsiexecutor (= 0.64.1) - - React-perflogger (= 0.64.1) + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default (= 0.66.4) + - React-cxxreact (= 0.66.4) + - React-jsi (= 0.66.4) + - React-jsiexecutor (= 0.66.4) + - React-perflogger (= 0.66.4) - Yoga - - React-Core/CoreModulesHeaders (0.64.1): + - React-Core/CoreModulesHeaders (0.66.4): - glog - - RCT-Folly (= 2020.01.13.00) + - RCT-Folly (= 2021.06.28.00-v2) - React-Core/Default - - React-cxxreact (= 0.64.1) - - React-jsi (= 0.64.1) - - React-jsiexecutor (= 0.64.1) - - React-perflogger (= 0.64.1) + - React-cxxreact (= 0.66.4) + - React-jsi (= 0.66.4) + - React-jsiexecutor (= 0.66.4) + - React-perflogger (= 0.66.4) - Yoga - - React-Core/Default (0.64.1): + - React-Core/Default (0.66.4): - glog - - RCT-Folly (= 2020.01.13.00) - - React-cxxreact (= 0.64.1) - - React-jsi (= 0.64.1) - - React-jsiexecutor (= 0.64.1) - - React-perflogger (= 0.64.1) + - RCT-Folly (= 2021.06.28.00-v2) + - React-cxxreact (= 0.66.4) + - React-jsi (= 0.66.4) + - React-jsiexecutor (= 0.66.4) + - React-perflogger (= 0.66.4) - Yoga - - React-Core/DevSupport (0.64.1): + - React-Core/DevSupport (0.66.4): - glog - - RCT-Folly (= 2020.01.13.00) - - React-Core/Default (= 0.64.1) - - React-Core/RCTWebSocket (= 0.64.1) - - React-cxxreact (= 0.64.1) - - React-jsi (= 0.64.1) - - React-jsiexecutor (= 0.64.1) - - React-jsinspector (= 0.64.1) - - React-perflogger (= 0.64.1) + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default (= 0.66.4) + - React-Core/RCTWebSocket (= 0.66.4) + - React-cxxreact (= 0.66.4) + - React-jsi (= 0.66.4) + - React-jsiexecutor (= 0.66.4) + - React-jsinspector (= 0.66.4) + - React-perflogger (= 0.66.4) - Yoga - - React-Core/Hermes (0.64.1): + - React-Core/RCTActionSheetHeaders (0.66.4): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.66.4) + - React-jsi (= 0.66.4) + - React-jsiexecutor (= 0.66.4) + - React-perflogger (= 0.66.4) + - Yoga + - React-Core/RCTAnimationHeaders (0.66.4): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.66.4) + - React-jsi (= 0.66.4) + - React-jsiexecutor (= 0.66.4) + - React-perflogger (= 0.66.4) + - Yoga + - React-Core/RCTBlobHeaders (0.66.4): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.66.4) + - React-jsi (= 0.66.4) + - React-jsiexecutor (= 0.66.4) + - React-perflogger (= 0.66.4) + - Yoga + - React-Core/RCTImageHeaders (0.66.4): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.66.4) + - React-jsi (= 0.66.4) + - React-jsiexecutor (= 0.66.4) + - React-perflogger (= 0.66.4) + - Yoga + - React-Core/RCTLinkingHeaders (0.66.4): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.66.4) + - React-jsi (= 0.66.4) + - React-jsiexecutor (= 0.66.4) + - React-perflogger (= 0.66.4) + - Yoga + - React-Core/RCTNetworkHeaders (0.66.4): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.66.4) + - React-jsi (= 0.66.4) + - React-jsiexecutor (= 0.66.4) + - React-perflogger (= 0.66.4) + - Yoga + - React-Core/RCTSettingsHeaders (0.66.4): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.66.4) + - React-jsi (= 0.66.4) + - React-jsiexecutor (= 0.66.4) + - React-perflogger (= 0.66.4) + - Yoga + - React-Core/RCTTextHeaders (0.66.4): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.66.4) + - React-jsi (= 0.66.4) + - React-jsiexecutor (= 0.66.4) + - React-perflogger (= 0.66.4) + - Yoga + - React-Core/RCTVibrationHeaders (0.66.4): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.66.4) + - React-jsi (= 0.66.4) + - React-jsiexecutor (= 0.66.4) + - React-perflogger (= 0.66.4) + - Yoga + - React-Core/RCTWebSocket (0.66.4): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default (= 0.66.4) + - React-cxxreact (= 0.66.4) + - React-jsi (= 0.66.4) + - React-jsiexecutor (= 0.66.4) + - React-perflogger (= 0.66.4) + - Yoga + - React-CoreModules (0.66.4): + - FBReactNativeSpec (= 0.66.4) + - RCT-Folly (= 2021.06.28.00-v2) + - RCTTypeSafety (= 0.66.4) + - React-Core/CoreModulesHeaders (= 0.66.4) + - React-jsi (= 0.66.4) + - React-RCTImage (= 0.66.4) + - ReactCommon/turbomodule/core (= 0.66.4) + - React-cxxreact (0.66.4): + - boost (= 1.76.0) + - DoubleConversion + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-callinvoker (= 0.66.4) + - React-jsi (= 0.66.4) + - React-jsinspector (= 0.66.4) + - React-logger (= 0.66.4) + - React-perflogger (= 0.66.4) + - React-runtimeexecutor (= 0.66.4) + - React-hermes (0.66.4): + - DoubleConversion - glog - hermes-engine - - RCT-Folly (= 2020.01.13.00) - - RCT-Folly/Futures - - React-cxxreact (= 0.64.1) - - React-jsi (= 0.64.1) - - React-jsiexecutor (= 0.64.1) - - React-perflogger (= 0.64.1) - - Yoga - - React-Core/RCTActionSheetHeaders (0.64.1): - - glog - - RCT-Folly (= 2020.01.13.00) - - React-Core/Default - - React-cxxreact (= 0.64.1) - - React-jsi (= 0.64.1) - - React-jsiexecutor (= 0.64.1) - - React-perflogger (= 0.64.1) - - Yoga - - React-Core/RCTAnimationHeaders (0.64.1): - - glog - - RCT-Folly (= 2020.01.13.00) - - React-Core/Default - - React-cxxreact (= 0.64.1) - - React-jsi (= 0.64.1) - - React-jsiexecutor (= 0.64.1) - - React-perflogger (= 0.64.1) - - Yoga - - React-Core/RCTBlobHeaders (0.64.1): - - glog - - RCT-Folly (= 2020.01.13.00) - - React-Core/Default - - React-cxxreact (= 0.64.1) - - React-jsi (= 0.64.1) - - React-jsiexecutor (= 0.64.1) - - React-perflogger (= 0.64.1) - - Yoga - - React-Core/RCTImageHeaders (0.64.1): - - glog - - RCT-Folly (= 2020.01.13.00) - - React-Core/Default - - React-cxxreact (= 0.64.1) - - React-jsi (= 0.64.1) - - React-jsiexecutor (= 0.64.1) - - React-perflogger (= 0.64.1) - - Yoga - - React-Core/RCTLinkingHeaders (0.64.1): - - glog - - RCT-Folly (= 2020.01.13.00) - - React-Core/Default - - React-cxxreact (= 0.64.1) - - React-jsi (= 0.64.1) - - React-jsiexecutor (= 0.64.1) - - React-perflogger (= 0.64.1) - - Yoga - - React-Core/RCTNetworkHeaders (0.64.1): - - glog - - RCT-Folly (= 2020.01.13.00) - - React-Core/Default - - React-cxxreact (= 0.64.1) - - React-jsi (= 0.64.1) - - React-jsiexecutor (= 0.64.1) - - React-perflogger (= 0.64.1) - - Yoga - - React-Core/RCTSettingsHeaders (0.64.1): - - glog - - RCT-Folly (= 2020.01.13.00) - - React-Core/Default - - React-cxxreact (= 0.64.1) - - React-jsi (= 0.64.1) - - React-jsiexecutor (= 0.64.1) - - React-perflogger (= 0.64.1) - - Yoga - - React-Core/RCTTextHeaders (0.64.1): - - glog - - RCT-Folly (= 2020.01.13.00) - - React-Core/Default - - React-cxxreact (= 0.64.1) - - React-jsi (= 0.64.1) - - React-jsiexecutor (= 0.64.1) - - React-perflogger (= 0.64.1) - - Yoga - - React-Core/RCTVibrationHeaders (0.64.1): - - glog - - RCT-Folly (= 2020.01.13.00) - - React-Core/Default - - React-cxxreact (= 0.64.1) - - React-jsi (= 0.64.1) - - React-jsiexecutor (= 0.64.1) - - React-perflogger (= 0.64.1) - - Yoga - - React-Core/RCTWebSocket (0.64.1): - - glog - - RCT-Folly (= 2020.01.13.00) - - React-Core/Default (= 0.64.1) - - React-cxxreact (= 0.64.1) - - React-jsi (= 0.64.1) - - React-jsiexecutor (= 0.64.1) - - React-perflogger (= 0.64.1) - - Yoga - - React-CoreModules (0.64.1): - - FBReactNativeSpec (= 0.64.1) - - RCT-Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.64.1) - - React-Core/CoreModulesHeaders (= 0.64.1) - - React-jsi (= 0.64.1) - - React-RCTImage (= 0.64.1) - - ReactCommon/turbomodule/core (= 0.64.1) - - React-cxxreact (0.64.1): - - boost-for-react-native (= 1.63.0) + - RCT-Folly (= 2021.06.28.00-v2) + - RCT-Folly/Futures (= 2021.06.28.00-v2) + - React-cxxreact (= 0.66.4) + - React-jsi (= 0.66.4) + - React-jsiexecutor (= 0.66.4) + - React-jsinspector (= 0.66.4) + - React-perflogger (= 0.66.4) + - React-jsi (0.66.4): + - boost (= 1.76.0) - DoubleConversion - glog - - RCT-Folly (= 2020.01.13.00) - - React-callinvoker (= 0.64.1) - - React-jsi (= 0.64.1) - - React-jsinspector (= 0.64.1) - - React-perflogger (= 0.64.1) - - React-runtimeexecutor (= 0.64.1) - - React-jsi (0.64.1): - - boost-for-react-native (= 1.63.0) + - RCT-Folly (= 2021.06.28.00-v2) + - React-jsi/Default (= 0.66.4) + - React-jsi/Default (0.66.4): + - boost (= 1.76.0) - DoubleConversion - glog - - RCT-Folly (= 2020.01.13.00) - - React-jsi/Default (= 0.64.1) - - React-jsi/Default (0.64.1): - - boost-for-react-native (= 1.63.0) + - RCT-Folly (= 2021.06.28.00-v2) + - React-jsiexecutor (0.66.4): - DoubleConversion - glog - - RCT-Folly (= 2020.01.13.00) - - React-jsiexecutor (0.64.1): - - DoubleConversion + - RCT-Folly (= 2021.06.28.00-v2) + - React-cxxreact (= 0.66.4) + - React-jsi (= 0.66.4) + - React-perflogger (= 0.66.4) + - React-jsinspector (0.66.4) + - React-logger (0.66.4): - glog - - RCT-Folly (= 2020.01.13.00) - - React-cxxreact (= 0.64.1) - - React-jsi (= 0.64.1) - - React-perflogger (= 0.64.1) - - React-jsinspector (0.64.1) - react-native-blur (0.8.0): - React - - react-native-blurhash (1.1.4): + - react-native-blurhash (1.1.8): - React-Core - - react-native-cameraroll (4.0.4): + - react-native-cameraroll (4.1.2): - React-Core - - react-native-netinfo (6.0.0): + - react-native-netinfo (7.1.9): - React-Core - - react-native-pager-view (5.1.9): + - react-native-pager-view (5.4.9): - React-Core - - react-native-safe-area-context (3.2.0): + - react-native-safe-area-context (3.3.2): - React-Core - react-native-segmented-control (2.2.2): - React-Core - - React-perflogger (0.64.1) - - React-RCTActionSheet (0.64.1): - - React-Core/RCTActionSheetHeaders (= 0.64.1) - - React-RCTAnimation (0.64.1): - - FBReactNativeSpec (= 0.64.1) - - RCT-Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.64.1) - - React-Core/RCTAnimationHeaders (= 0.64.1) - - React-jsi (= 0.64.1) - - ReactCommon/turbomodule/core (= 0.64.1) - - React-RCTBlob (0.64.1): - - FBReactNativeSpec (= 0.64.1) - - RCT-Folly (= 2020.01.13.00) - - React-Core/RCTBlobHeaders (= 0.64.1) - - React-Core/RCTWebSocket (= 0.64.1) - - React-jsi (= 0.64.1) - - React-RCTNetwork (= 0.64.1) - - ReactCommon/turbomodule/core (= 0.64.1) - - React-RCTImage (0.64.1): - - FBReactNativeSpec (= 0.64.1) - - RCT-Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.64.1) - - React-Core/RCTImageHeaders (= 0.64.1) - - React-jsi (= 0.64.1) - - React-RCTNetwork (= 0.64.1) - - ReactCommon/turbomodule/core (= 0.64.1) - - React-RCTLinking (0.64.1): - - FBReactNativeSpec (= 0.64.1) - - React-Core/RCTLinkingHeaders (= 0.64.1) - - React-jsi (= 0.64.1) - - ReactCommon/turbomodule/core (= 0.64.1) - - React-RCTNetwork (0.64.1): - - FBReactNativeSpec (= 0.64.1) - - RCT-Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.64.1) - - React-Core/RCTNetworkHeaders (= 0.64.1) - - React-jsi (= 0.64.1) - - ReactCommon/turbomodule/core (= 0.64.1) - - React-RCTSettings (0.64.1): - - FBReactNativeSpec (= 0.64.1) - - RCT-Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.64.1) - - React-Core/RCTSettingsHeaders (= 0.64.1) - - React-jsi (= 0.64.1) - - ReactCommon/turbomodule/core (= 0.64.1) - - React-RCTText (0.64.1): - - React-Core/RCTTextHeaders (= 0.64.1) - - React-RCTVibration (0.64.1): - - FBReactNativeSpec (= 0.64.1) - - RCT-Folly (= 2020.01.13.00) - - React-Core/RCTVibrationHeaders (= 0.64.1) - - React-jsi (= 0.64.1) - - ReactCommon/turbomodule/core (= 0.64.1) - - React-runtimeexecutor (0.64.1): - - React-jsi (= 0.64.1) - - ReactCommon/turbomodule/core (0.64.1): + - React-perflogger (0.66.4) + - React-RCTActionSheet (0.66.4): + - React-Core/RCTActionSheetHeaders (= 0.66.4) + - React-RCTAnimation (0.66.4): + - FBReactNativeSpec (= 0.66.4) + - RCT-Folly (= 2021.06.28.00-v2) + - RCTTypeSafety (= 0.66.4) + - React-Core/RCTAnimationHeaders (= 0.66.4) + - React-jsi (= 0.66.4) + - ReactCommon/turbomodule/core (= 0.66.4) + - React-RCTBlob (0.66.4): + - FBReactNativeSpec (= 0.66.4) + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/RCTBlobHeaders (= 0.66.4) + - React-Core/RCTWebSocket (= 0.66.4) + - React-jsi (= 0.66.4) + - React-RCTNetwork (= 0.66.4) + - ReactCommon/turbomodule/core (= 0.66.4) + - React-RCTImage (0.66.4): + - FBReactNativeSpec (= 0.66.4) + - RCT-Folly (= 2021.06.28.00-v2) + - RCTTypeSafety (= 0.66.4) + - React-Core/RCTImageHeaders (= 0.66.4) + - React-jsi (= 0.66.4) + - React-RCTNetwork (= 0.66.4) + - ReactCommon/turbomodule/core (= 0.66.4) + - React-RCTLinking (0.66.4): + - FBReactNativeSpec (= 0.66.4) + - React-Core/RCTLinkingHeaders (= 0.66.4) + - React-jsi (= 0.66.4) + - ReactCommon/turbomodule/core (= 0.66.4) + - React-RCTNetwork (0.66.4): + - FBReactNativeSpec (= 0.66.4) + - RCT-Folly (= 2021.06.28.00-v2) + - RCTTypeSafety (= 0.66.4) + - React-Core/RCTNetworkHeaders (= 0.66.4) + - React-jsi (= 0.66.4) + - ReactCommon/turbomodule/core (= 0.66.4) + - React-RCTSettings (0.66.4): + - FBReactNativeSpec (= 0.66.4) + - RCT-Folly (= 2021.06.28.00-v2) + - RCTTypeSafety (= 0.66.4) + - React-Core/RCTSettingsHeaders (= 0.66.4) + - React-jsi (= 0.66.4) + - ReactCommon/turbomodule/core (= 0.66.4) + - React-RCTText (0.66.4): + - React-Core/RCTTextHeaders (= 0.66.4) + - React-RCTVibration (0.66.4): + - FBReactNativeSpec (= 0.66.4) + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/RCTVibrationHeaders (= 0.66.4) + - React-jsi (= 0.66.4) + - ReactCommon/turbomodule/core (= 0.66.4) + - React-runtimeexecutor (0.66.4): + - React-jsi (= 0.66.4) + - ReactCommon/turbomodule/core (0.66.4): - DoubleConversion - glog - - RCT-Folly (= 2020.01.13.00) - - React-callinvoker (= 0.64.1) - - React-Core (= 0.64.1) - - React-cxxreact (= 0.64.1) - - React-jsi (= 0.64.1) - - React-perflogger (= 0.64.1) - - RNCAsyncStorage (1.15.4): + - RCT-Folly (= 2021.06.28.00-v2) + - React-callinvoker (= 0.66.4) + - React-Core (= 0.66.4) + - React-cxxreact (= 0.66.4) + - React-jsi (= 0.66.4) + - React-logger (= 0.66.4) + - React-perflogger (= 0.66.4) + - RNCAsyncStorage (1.15.17): - React-Core - - RNCMaskedView (0.1.11): - - React - - RNFastImage (8.3.4): + - RNFastImage (8.5.11): - React-Core - - SDWebImage (~> 5.8) - - SDWebImageWebPCoder (~> 0.6.1) - - RNGestureHandler (1.10.3): + - SDWebImage (~> 5.11.1) + - SDWebImageWebPCoder (~> 0.8.4) + - RNGestureHandler (2.2.0): - React-Core - - RNReanimated (2.1.0): + - RNReanimated (2.3.1): - DoubleConversion - FBLazyVector - FBReactNativeSpec @@ -477,51 +484,31 @@ PODS: - React-RCTNetwork - React-RCTSettings - React-RCTText - - React-RCTVibration - ReactCommon/turbomodule/core - Yoga - - RNScreens (3.3.0): + - RNScreens (3.10.2): - React-Core - React-RCTImage - - RNSentry (2.4.3): + - RNSentry (3.2.13): - React-Core - - Sentry (= 6.1.4) + - Sentry (= 7.9.0) - RNSVG (12.1.1): - React - SDWebImage (5.11.1): - SDWebImage/Core (= 5.11.1) - SDWebImage/Core (5.11.1) - - SDWebImageWebPCoder (0.6.1): + - SDWebImageWebPCoder (0.8.4): - libwebp (~> 1.0) - - SDWebImage/Core (~> 5.7) - - Sentry (6.1.4): - - Sentry/Core (= 6.1.4) - - Sentry/Core (6.1.4) - - UMAppLoader (2.1.0) - - UMBarCodeScannerInterface (6.1.0): - - UMCore - - UMCameraInterface (6.1.0): - - UMCore - - UMConstantsInterface (6.1.0): - - UMCore - - UMCore (7.1.0) - - UMFaceDetectorInterface (6.1.0) - - UMFileSystemInterface (6.1.0) - - UMFontInterface (6.1.0) - - UMImageLoaderInterface (6.1.0) - - UMPermissionsInterface (6.1.0): - - UMCore - - UMReactNativeAdapter (6.2.2): - - React-Core - - UMCore - - UMFontInterface - - UMSensorsInterface (6.1.0): - - UMCore - - UMTaskManagerInterface (6.1.0): - - UMCore + - SDWebImage/Core (~> 5.10) + - Sentry (7.9.0): + - Sentry/Core (= 7.9.0) + - Sentry/Core (7.9.0) + - UMTaskManagerInterface (7.1.0): + - ExpoModulesCore - Yoga (1.14.0) DEPENDENCIES: + - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) - EXApplication (from `../node_modules/expo-application/ios`) - EXAV (from `../node_modules/expo-av/ios`) @@ -533,26 +520,31 @@ DEPENDENCIES: - EXFirebaseAnalytics (from `../node_modules/expo-firebase-analytics/ios`) - EXFirebaseCore (from `../node_modules/expo-firebase-core/ios`) - EXFont (from `../node_modules/expo-font/ios`) - - EXHaptics (from `../node_modules/expo-haptics/ios`) - EXImageLoader (from `../node_modules/expo-image-loader/ios`) - EXImageManipulator (from `../node_modules/expo-image-manipulator/ios`) - EXImagePicker (from `../node_modules/expo-image-picker/ios`) + - EXJSONUtils (from `../node_modules/expo-json-utils/ios`) - EXKeepAwake (from `../node_modules/expo-keep-awake/ios`) - - EXLocalization (from `../node_modules/expo-localization/ios`) + - EXManifests (from `../node_modules/expo-manifests/ios`) - EXNotifications (from `../node_modules/expo-notifications/ios`) - - EXPermissions (from `../node_modules/expo-permissions/ios`) + - Expo (from `../node_modules/expo/ios`) + - ExpoHaptics (from `../node_modules/expo-haptics/ios`) + - ExpoLocalization (from `../node_modules/expo-localization/ios`) + - ExpoModulesCore (from `../node_modules/expo-modules-core/ios`) - EXRandom (from `../node_modules/expo-random/ios`) - EXScreenCapture (from `../node_modules/expo-screen-capture/ios`) - EXSecureStore (from `../node_modules/expo-secure-store/ios`) - EXSplashScreen (from `../node_modules/expo-splash-screen/ios`) - EXStoreReview (from `../node_modules/expo-store-review/ios`) + - EXStructuredHeaders (from `../node_modules/expo-structured-headers/ios`) - EXUpdates (from `../node_modules/expo-updates/ios`) + - EXUpdatesInterface (from `../node_modules/expo-updates-interface/ios`) - EXVideoThumbnails (from `../node_modules/expo-video-thumbnails/ios`) - EXWebBrowser (from `../node_modules/expo-web-browser/ios`) - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`) - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) - - hermes-engine (~> 0.7.2) + - hermes-engine (~> 0.9.0) - libevent (~> 2.1.12) - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) @@ -561,13 +553,14 @@ DEPENDENCIES: - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) - React-Core (from `../node_modules/react-native/`) - React-Core/DevSupport (from `../node_modules/react-native/`) - - React-Core/Hermes (from `../node_modules/react-native/`) - React-Core/RCTWebSocket (from `../node_modules/react-native/`) - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) + - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`) - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`) + - React-logger (from `../node_modules/react-native/ReactCommon/logger`) - "react-native-blur (from `../node_modules/@react-native-community/blur`)" - react-native-blurhash (from `../node_modules/react-native-blurhash`) - "react-native-cameraroll (from `../node_modules/@react-native-community/cameraroll`)" @@ -588,36 +581,23 @@ DEPENDENCIES: - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)" - - "RNCMaskedView (from `../node_modules/@react-native-community/masked-view`)" - RNFastImage (from `../node_modules/react-native-fast-image`) - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) - RNReanimated (from `../node_modules/react-native-reanimated`) - RNScreens (from `../node_modules/react-native-screens`) - "RNSentry (from `../node_modules/@sentry/react-native`)" - RNSVG (from `../node_modules/react-native-svg`) - - UMAppLoader (from `../node_modules/unimodules-app-loader/ios`) - - UMBarCodeScannerInterface (from `../node_modules/unimodules-barcode-scanner-interface/ios`) - - UMCameraInterface (from `../node_modules/unimodules-camera-interface/ios`) - - UMConstantsInterface (from `../node_modules/unimodules-constants-interface/ios`) - - "UMCore (from `../node_modules/@unimodules/core/ios`)" - - UMFaceDetectorInterface (from `../node_modules/unimodules-face-detector-interface/ios`) - - UMFileSystemInterface (from `../node_modules/unimodules-file-system-interface/ios`) - - UMFontInterface (from `../node_modules/unimodules-font-interface/ios`) - - UMImageLoaderInterface (from `../node_modules/unimodules-image-loader-interface/ios`) - - UMPermissionsInterface (from `../node_modules/unimodules-permissions-interface/ios`) - - "UMReactNativeAdapter (from `../node_modules/@unimodules/react-native-adapter/ios`)" - - UMSensorsInterface (from `../node_modules/unimodules-sensors-interface/ios`) - UMTaskManagerInterface (from `../node_modules/unimodules-task-manager-interface/ios`) - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) SPEC REPOS: trunk: - - boost-for-react-native - Firebase - FirebaseAnalytics - FirebaseCore - FirebaseCoreDiagnostics - FirebaseInstallations + - fmt - GoogleAppMeasurement - GoogleDataTransport - GoogleUtilities @@ -631,6 +611,8 @@ SPEC REPOS: - Sentry EXTERNAL SOURCES: + boost: + :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" DoubleConversion: :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" EXApplication: @@ -653,22 +635,28 @@ EXTERNAL SOURCES: :path: "../node_modules/expo-firebase-core/ios" EXFont: :path: "../node_modules/expo-font/ios" - EXHaptics: - :path: "../node_modules/expo-haptics/ios" EXImageLoader: :path: "../node_modules/expo-image-loader/ios" EXImageManipulator: :path: "../node_modules/expo-image-manipulator/ios" EXImagePicker: :path: "../node_modules/expo-image-picker/ios" + EXJSONUtils: + :path: "../node_modules/expo-json-utils/ios" EXKeepAwake: :path: "../node_modules/expo-keep-awake/ios" - EXLocalization: - :path: "../node_modules/expo-localization/ios" + EXManifests: + :path: "../node_modules/expo-manifests/ios" EXNotifications: :path: "../node_modules/expo-notifications/ios" - EXPermissions: - :path: "../node_modules/expo-permissions/ios" + Expo: + :path: "../node_modules/expo/ios" + ExpoHaptics: + :path: "../node_modules/expo-haptics/ios" + ExpoLocalization: + :path: "../node_modules/expo-localization/ios" + ExpoModulesCore: + :path: "../node_modules/expo-modules-core/ios" EXRandom: :path: "../node_modules/expo-random/ios" EXScreenCapture: @@ -679,8 +667,12 @@ EXTERNAL SOURCES: :path: "../node_modules/expo-splash-screen/ios" EXStoreReview: :path: "../node_modules/expo-store-review/ios" + EXStructuredHeaders: + :path: "../node_modules/expo-structured-headers/ios" EXUpdates: :path: "../node_modules/expo-updates/ios" + EXUpdatesInterface: + :path: "../node_modules/expo-updates-interface/ios" EXVideoThumbnails: :path: "../node_modules/expo-video-thumbnails/ios" EXWebBrowser: @@ -707,12 +699,16 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/React/CoreModules" React-cxxreact: :path: "../node_modules/react-native/ReactCommon/cxxreact" + React-hermes: + :path: "../node_modules/react-native/ReactCommon/hermes" React-jsi: :path: "../node_modules/react-native/ReactCommon/jsi" React-jsiexecutor: :path: "../node_modules/react-native/ReactCommon/jsiexecutor" React-jsinspector: :path: "../node_modules/react-native/ReactCommon/jsinspector" + React-logger: + :path: "../node_modules/react-native/ReactCommon/logger" react-native-blur: :path: "../node_modules/@react-native-community/blur" react-native-blurhash: @@ -753,8 +749,6 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon" RNCAsyncStorage: :path: "../node_modules/@react-native-async-storage/async-storage" - RNCMaskedView: - :path: "../node_modules/@react-native-community/masked-view" RNFastImage: :path: "../node_modules/react-native-fast-image" RNGestureHandler: @@ -767,136 +761,107 @@ EXTERNAL SOURCES: :path: "../node_modules/@sentry/react-native" RNSVG: :path: "../node_modules/react-native-svg" - UMAppLoader: - :path: "../node_modules/unimodules-app-loader/ios" - UMBarCodeScannerInterface: - :path: "../node_modules/unimodules-barcode-scanner-interface/ios" - UMCameraInterface: - :path: "../node_modules/unimodules-camera-interface/ios" - UMConstantsInterface: - :path: "../node_modules/unimodules-constants-interface/ios" - UMCore: - :path: "../node_modules/@unimodules/core/ios" - UMFaceDetectorInterface: - :path: "../node_modules/unimodules-face-detector-interface/ios" - UMFileSystemInterface: - :path: "../node_modules/unimodules-file-system-interface/ios" - UMFontInterface: - :path: "../node_modules/unimodules-font-interface/ios" - UMImageLoaderInterface: - :path: "../node_modules/unimodules-image-loader-interface/ios" - UMPermissionsInterface: - :path: "../node_modules/unimodules-permissions-interface/ios" - UMReactNativeAdapter: - :path: "../node_modules/@unimodules/react-native-adapter/ios" - UMSensorsInterface: - :path: "../node_modules/unimodules-sensors-interface/ios" UMTaskManagerInterface: :path: "../node_modules/unimodules-task-manager-interface/ios" Yoga: :path: "../node_modules/react-native/ReactCommon/yoga" SPEC CHECKSUMS: - boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c - DoubleConversion: cf9b38bf0b2d048436d9a82ad2abe1404f11e7de - EXApplication: 4797b8b37f0b0470f587fdccf6407f44b50d18b5 - EXAV: f7c1b9af3aff7834cbdbe3e002d1f70e21c38320 - EXConstants: c4dd28acc12039c999612507a5f935556f2c86ce - EXCrypto: 9cbeb90f6c60a8ae9f26242fd2db916b21c55700 - EXDevice: 01f54314f618aa4098893f66cd8f2a8a411f33ee - EXErrorRecovery: 720641265b8cf95e6cdeb1884ac38e794a352488 - EXFileSystem: dcf2273f49431e5037347c733a2dc5d08e0d0a9e - EXFirebaseAnalytics: aa820eafe8527a32f65a285047ce475e622c7e8f - EXFirebaseCore: 7865e37021ddcff5c575a4598686a2939d6c4183 - EXFont: d6fb79f9863120f0d0b26b0c2d1453bc9511e9df - EXHaptics: 2de40c5f50a9e78da92c209db06db5134d8cac0b - EXImageLoader: da941c9399e01ec28f2d5b270bdd21f2c8ca596c - EXImageManipulator: a099e4694070c7cb86aa0b0b1afa3ea184153a7d - EXImagePicker: dd05b8a5cb782c79d07d1d72e5850c6acc2b9a37 - EXKeepAwake: d4e4a3ed8c1c4fd940dd62fc5a8be2a190371fd4 - EXLocalization: f139efe4a06be1041815879959346e3d437a6e93 - EXNotifications: c13e078d83ce01c7aeb8e3f44a48c13f50099291 - EXPermissions: 8f8c1c05580c4e02d4ee2c8dd74bfe173ff6a723 - EXRandom: cbd66cd45434a494f5ef98650eec1f8d78b90270 - EXScreenCapture: 2903dace06f2d06cc161017637cc4cbfcaa98986 - EXSecureStore: da5a255445bb6ee8b8ac54f65412bc803272bd87 - EXSplashScreen: a9baaf4fa866003884c90ba049f18760d6a8ce39 - EXStoreReview: b1f68ed0369b0f1c443214ac8d6881ef3b64de9a - EXUpdates: 74b39409f68eca207075d87b0077bdf37865a8bf - EXVideoThumbnails: cd257fc6e07884a704a5674d362a6410933acb68 - EXWebBrowser: 0b466c50e5ff61c9758095d49d5081e3229d77ac - FBLazyVector: 7b423f9e248eae65987838148c36eec1dbfe0b53 - FBReactNativeSpec: 5058d1917c80dca4b9ed89bdf94385315939ab80 + boost: a7c83b31436843459a1961bfd74b96033dc77234 + DoubleConversion: 831926d9b8bf8166fd87886c4abab286c2422662 + EXApplication: bdc8dc27713235565da1029a34385229f31b8e08 + EXAV: b9ed0c201092244c46aa78f907f5c66176bed236 + EXConstants: 88bf79622fbd9b476c96d8ec57fe97ca44fe8e3c + EXCrypto: ab2ba0df3136a5f2407b8c7e70eb498ac20d704f + EXDevice: aa5e1edbf350481a948c3258b750dd11e6e4579e + EXErrorRecovery: b0d7582714a2cc896e94a2308a356f94dbf14ef7 + EXFileSystem: 7bcd3c1428698150d5c8ca140c8183f2ee204048 + EXFirebaseAnalytics: a7ec2dd1394ad0de5c0c63fac0deee496f798284 + EXFirebaseCore: 16f39b0ea94ce985a8f2e16cc796bf79bdcfa297 + EXFont: 2597c10ac85a69d348d44d7873eccf5a7576ef5e + EXImageLoader: df83442d32bcfb57b7cfc5690096b6caf8203f8d + EXImageManipulator: 60d1bf3f1d7709453b1feb38adf8594b7f58710f + EXImagePicker: bf4d62532cc2bf217edbe4abbb0014e73e079eac + EXJSONUtils: f515cf71710855d7ba5bfc6752af3b9a6f6aad01 + EXKeepAwake: bf48d7f740a5cd2befed6cf9a49911d385c6c47d + EXManifests: 50e42e01335df4e54109dee7be5a91bfd37347db + EXNotifications: a7d582fa800d77f4a75bd22d52e84e2fbcee26df + Expo: 534e51e607aba8229293297da5585f4b26f50fa1 + ExpoHaptics: 0d0b69b2414755a4057ffad0a10315902c0ea1b7 + ExpoLocalization: 72b4524c167da6c4e2a0bbe09176ff8b2c4eddbe + ExpoModulesCore: 32c0ccb47f477d330ee93db72505380adf0de09a + EXRandom: 1d00fd04d7d874c0c9d1ff87cee59ffe0b638a3d + EXScreenCapture: 9bfdadf17f0b1dd082edb704764f1724176b2f27 + EXSecureStore: b80c74c5ee29d0160c2aace3fd9a24a5edc20015 + EXSplashScreen: 21669e598804ee810547dbb6692c8deb5dd8dbf3 + EXStoreReview: 5a24fd222d193878a7d4f6059dd19f51c808af66 + EXStructuredHeaders: 2ce79a3770bd3795bade1aab215ada70deae8bbc + EXUpdates: 98b9e647ce7a0e9d5ab67135bf42188c750a99eb + EXUpdatesInterface: f459b515151bd73fff7a35366eace34a6c6a0d3f + EXVideoThumbnails: 847d648d6f4bc0c1afad05caa56a487dc543445e + EXWebBrowser: f1573262c5de753987ed526c630076eda130804d + FBLazyVector: e5569e42a1c79ca00521846c223173a57aca1fe1 + FBReactNativeSpec: fe08c1cd7e2e205718d77ad14b34957cce949b58 Firebase: cd2ab85eec8170dc260186159f21072ecb679ad5 FirebaseAnalytics: f3f8f75de34fe04141a69bb1c4bd7e24a80178e1 FirebaseCore: ac35d680a0bf32319a59966a1478e0741536b97b FirebaseCoreDiagnostics: 3d36e05da74cb8b7ce30e6594a8f201b982c725c FirebaseInstallations: a58d4f72ec5861840b84df489f2668d970df558a - glog: 73c2498ac6884b13ede40eda8228cb1eee9d9d62 + fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 + glog: 5337263514dd6f09803962437687240c5dc39aa4 GoogleAppMeasurement: 0c3b134b2c0a90c4c24833873894bfe0e42a0384 GoogleDataTransport: 8b0e733ea77c9218778e5a9e34ba9508b8328939 - GoogleUtilities: f8a43108b38a68eebe8b3540e1f4f2d28843ce20 - hermes-engine: 7d97ba46a1e29bacf3e3c61ecb2804a5ddd02d4f + GoogleUtilities: e0913149f6b0625b553d70dae12b49fc62914fd1 + hermes-engine: bf7577d12ac6ccf53ab8b5af3c6ccf0dd8458c5c libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 - libwebp: e90b9c01d99205d03b6bb8f2c8c415e5a4ef66f0 + libwebp: 98a37e597e40bfdb4c911fc98f2c53d0b12d05fc nanopb: 59221d7f958fb711001e6a449489542d92ae113e PromisesObjC: 3113f7f76903778cf4a0586bd1ab89329a0b7b97 - RCT-Folly: ec7a233ccc97cc556cf7237f0db1ff65b986f27c - RCTRequired: ec2ebc96b7bfba3ca5c32740f5a0c6a014a274d2 - RCTTypeSafety: 22567f31e67c3e088c7ac23ea46ab6d4779c0ea5 - React: a241e3dbb1e91d06332f1dbd2b3ab26e1a4c4b9d - React-callinvoker: da4d1c6141696a00163960906bc8a55b985e4ce4 - React-Core: 46ba164c437d7dac607b470c83c8308b05799748 - React-CoreModules: 217bd14904491c7b9940ff8b34a3fe08013c2f14 - React-cxxreact: 0090588ae6660c4615d3629fdd5c768d0983add4 - React-jsi: 5de8204706bd872b78ea646aee5d2561ca1214b6 - React-jsiexecutor: 124e8f99992490d0d13e0649d950d3e1aae06fe9 - React-jsinspector: 500a59626037be5b3b3d89c5151bc3baa9abf1a9 + RCT-Folly: a21c126816d8025b547704b777a2ba552f3d9fa9 + RCTRequired: 4bf86c70714490bca4bf2696148638284622644b + RCTTypeSafety: c475a7059eb77935fa53d2c17db299893f057d5d + React: f64af14e3f2c50f6f2c91a5fd250e4ff1b3c3459 + React-callinvoker: b74e4ae80287780dcdf0cab262bcb581eeef56e7 + React-Core: 3eb7432bad96ff1d25aebc1defbae013fee2fd0e + React-CoreModules: ad9e1fd5650e16666c57a08328df86fd7e480cb9 + React-cxxreact: 02633ff398cf7e91a2c1e12590d323c4a4b8668a + React-hermes: 7b4c6617b4d4c880d0f44e629651810bf3417440 + React-jsi: 805c41a927d6499fb811772acb971467d9204633 + React-jsiexecutor: 94ce921e1d8ce7023366873ec371f3441383b396 + React-jsinspector: d0374f7509d407d2264168b6d0fad0b54e300b85 + React-logger: 933f80c97c633ee8965d609876848148e3fef438 react-native-blur: cad4d93b364f91e7b7931b3fa935455487e5c33c - react-native-blurhash: ec98d751a9cb9075cef0b9e3188244c517d6ab22 - react-native-cameraroll: 88f4e62d9ecd0e1f253abe4f685474f2ea14bfa2 - react-native-netinfo: e849fc21ca2f4128a5726c801a82fc6f4a6db50d - react-native-pager-view: 14653de580178af7e65aa7e3fa08b4f243c86d4d - react-native-safe-area-context: f0906bf8bc9835ac9a9d3f97e8bde2a997d8da79 + react-native-blurhash: b7ed7b7de81ae1f9ce52d694f43c5b5cddddcae1 + react-native-cameraroll: 2957f2bce63ae896a848fbe0d5352c1bd4d20866 + react-native-netinfo: 87e5bfaf21ea5c6c110941290aa481dd8e849f98 + react-native-pager-view: 3ee7d4c7697fb3ef788346e834a60cca97ed8540 + react-native-safe-area-context: 584dc04881deb49474363f3be89e4ca0e854c057 react-native-segmented-control: 65df6cd0619b780b3843d574a72d4c7cec396097 - React-perflogger: aad6d4b4a267936b3667260d1f649b6f6069a675 - React-RCTActionSheet: fc376be462c9c8d6ad82c0905442fd77f82a9d2a - React-RCTAnimation: ba0a1c3a2738be224a08092fa7f1b444ab77d309 - React-RCTBlob: f758d4403fc5828a326dc69e27b41e1a92f34947 - React-RCTImage: ce57088705f4a8d03f6594b066a59c29143ba73e - React-RCTLinking: 852a3a95c65fa63f657a4b4e2d3d83a815e00a7c - React-RCTNetwork: 9d7ccb8a08d522d71700b4fb677d9fa28cccd118 - React-RCTSettings: d8aaf4389ff06114dee8c42ef5f0f2915946011e - React-RCTText: 809c12ed6b261796ba056c04fcd20d8b90bcc81d - React-RCTVibration: 4b99a7f5c6c0abbc5256410cc5425fb8531986e1 - React-runtimeexecutor: ff951a0c241bfaefc4940a3f1f1a229e7cb32fa6 - ReactCommon: bedc99ed4dae329c4fcf128d0c31b9115e5365ca - RNCAsyncStorage: f47a7e8f927f7c9da947491fc55752eb9ce17f2d - RNCMaskedView: 0e1bc4bfa8365eba5fbbb71e07fbdc0555249489 - RNFastImage: d4870d58f5936111c56218dbd7fcfc18e65b58ff - RNGestureHandler: a479ebd5ed4221a810967000735517df0d2db211 - RNReanimated: b8c8004b43446e3c2709fe64b2b41072f87428ad - RNScreens: bf59f17fbf001f1025243eeed5f19419d3c11ef2 - RNSentry: 6f8f9ee7e4c939dcd35e5633b94d0e3782888e46 + React-perflogger: 93075d8931c32cd1fce8a98c15d2d5ccc4d891bd + React-RCTActionSheet: 7d3041e6761b4f3044a37079ddcb156575fb6d89 + React-RCTAnimation: 743e88b55ac62511ae5c2e22803d4f503f2a3a13 + React-RCTBlob: bee3a2f98fa7fc25c957c8643494244f74bea0a0 + React-RCTImage: 19fc9e29b06cc38611c553494f8d3040bf78c24e + React-RCTLinking: dc799503979c8c711126d66328e7ce8f25c2848f + React-RCTNetwork: 417e4e34cf3c19eaa5fd4e9eb20180d662a799ce + React-RCTSettings: 4df89417265af26501a7e0e9192a34d3d9848dff + React-RCTText: f8a21c3499ab322326290fa9b701ae29aa093aa5 + React-RCTVibration: e3ffca672dd3772536cb844274094b0e2c31b187 + React-runtimeexecutor: dec32ee6f2e2a26e13e58152271535fadff5455a + ReactCommon: 57b69f6383eafcbd7da625bfa6003810332313c4 + RNCAsyncStorage: 6bd5a7ba3dde1c3facba418aa273f449bdc5437a + RNFastImage: 1f2cab428712a4baaf78d6169eaec7f622556dd7 + RNGestureHandler: bf572f552ea324acd5b5464b8d30755b2d8c1de6 + RNReanimated: da3860204e5660c0dd66739936732197d359d753 + RNScreens: d6da2b9e29cf523832c2542f47bf1287318b1868 + RNSentry: 0aa1567f66c20390f3834637fc4f73380dcd0774 RNSVG: 551acb6562324b1d52a4e0758f7ca0ec234e278f SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d - SDWebImageWebPCoder: d0dac55073088d24b2ac1b191a71a8f8d0adac21 - Sentry: 9d055e2de30a77685e86b219acf02e59b82091fc - UMAppLoader: fe2708bb0ac5cd70052bc207d06aa3b7e72b9e97 - UMBarCodeScannerInterface: 79f92bea5f7af39b381a4c82298105ceb537408a - UMCameraInterface: 81ff46700da88435f17afedfc88915eaede7e6a6 - UMConstantsInterface: bb94dd46039dcde276ed50225b29e22785e604bf - UMCore: 60b35f4d217461f7b54934b0c5be67442871f01f - UMFaceDetectorInterface: 791eec55ffca1171992976b7eceb73e69e391c58 - UMFileSystemInterface: f72245e90ce78fa6427180ff0b0904ead13d8161 - UMFontInterface: 5843cff7db85a42ba629aaac53d33091c35524d3 - UMImageLoaderInterface: 9ddffeb644b3f45d4eb0c2f51a2fd95fd5c8d1a4 - UMPermissionsInterface: 40b72935a7d12a3f60dc6b7bb99ce47908380cb1 - UMReactNativeAdapter: 65ada852a648fcb6674acfbfe72ccb095f2f5b75 - UMSensorsInterface: a5e9db661e5d9ae214762033d725989880ae6993 - UMTaskManagerInterface: 203c11259d2699b5b3a4eda4adbc466f5cb5c561 - Yoga: a7de31c64fe738607e7a3803e3f591a4b1df7393 + SDWebImageWebPCoder: f93010f3f6c031e2f8fb3081ca4ee6966c539815 + Sentry: 2f7e91f247cfb05b05bd01e0b5d0692557a7687b + UMTaskManagerInterface: 6f7150f9ec9bc6f2760eeae532a70de71ff951c1 + Yoga: e7dc4e71caba6472ff48ad7d234389b91dadc280 -PODFILE CHECKSUM: 34cad1fa3f14caa5b138177b6379ac2cba0e1087 +PODFILE CHECKSUM: 9bf9d386bac4ff98f76fc93f120c9922660384b5 -COCOAPODS: 1.10.1 +COCOAPODS: 1.11.2 diff --git a/ios/Podfile.properties.json b/ios/Podfile.properties.json new file mode 100644 index 00000000..cb338dda --- /dev/null +++ b/ios/Podfile.properties.json @@ -0,0 +1,3 @@ +{ + "expo.jsEngine": "hermes" +} \ No newline at end of file diff --git a/ios/tooot-Bridging-Header.h b/ios/tooot-Bridging-Header.h index 1b2cb5d6..a95e1c67 100644 --- a/ios/tooot-Bridging-Header.h +++ b/ios/tooot-Bridging-Header.h @@ -1,3 +1,4 @@ +#import // // Use this file to import your target's public headers that you would like to expose to Swift. // diff --git a/ios/tooot.xcodeproj/project.pbxproj b/ios/tooot.xcodeproj/project.pbxproj index 0e2771ea..58ae0126 100644 --- a/ios/tooot.xcodeproj/project.pbxproj +++ b/ios/tooot.xcodeproj/project.pbxproj @@ -18,6 +18,7 @@ 96905EF65AED1B983A6B3ABC /* libPods-tooot.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-tooot.a */; }; BB2F792D24A3F905000567C9 /* Expo.plist in Resources */ = {isa = PBXBuildFile; fileRef = BB2F792C24A3F905000567C9 /* Expo.plist */; }; DA8B5B7F0DED488CAC0FF169 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = B96B72E5384D44A7B240B27E /* GoogleService-Info.plist */; }; + E3BC22F5F8ABE515E14CF199 /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D878F932AF7A9974E06E461 /* ExpoModulesProvider.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -37,6 +38,7 @@ 5EE44DD52600124E00A9BCED /* File.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = File.swift; sourceTree = ""; }; 6C2E3173556A471DD304B334 /* Pods-tooot.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-tooot.debug.xcconfig"; path = "Target Support Files/Pods-tooot/Pods-tooot.debug.xcconfig"; sourceTree = ""; }; 7A4D352CD337FB3A3BF06240 /* Pods-tooot.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-tooot.release.xcconfig"; path = "Target Support Files/Pods-tooot/Pods-tooot.release.xcconfig"; sourceTree = ""; }; + 9D878F932AF7A9974E06E461 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-tooot/ExpoModulesProvider.swift"; sourceTree = ""; }; AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SplashScreen.storyboard; path = tooot/SplashScreen.storyboard; sourceTree = ""; }; B96B72E5384D44A7B240B27E /* GoogleService-Info.plist */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "tooot/GoogleService-Info.plist"; sourceTree = ""; }; BB2F792C24A3F905000567C9 /* Expo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Expo.plist; sourceTree = ""; }; @@ -75,6 +77,14 @@ name = tooot; sourceTree = ""; }; + 1568DA5289D5AE7A39201A34 /* tooot */ = { + isa = PBXGroup; + children = ( + 9D878F932AF7A9974E06E461 /* ExpoModulesProvider.swift */, + ); + name = tooot; + sourceTree = ""; + }; 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { isa = PBXGroup; children = ( @@ -85,6 +95,14 @@ name = Frameworks; sourceTree = ""; }; + 2FFEB4B0D00502D5425CDDC2 /* ExpoModulesProviders */ = { + isa = PBXGroup; + children = ( + 1568DA5289D5AE7A39201A34 /* tooot */, + ); + name = ExpoModulesProviders; + sourceTree = ""; + }; 832341AE1AAA6A7D00B99B32 /* Libraries */ = { isa = PBXGroup; children = ( @@ -102,6 +120,7 @@ 2D16E6871FA4F8E400B85C8A /* Frameworks */, D65327D7A22EEC0BE12398D9 /* Pods */, 5EE44DD42600124E00A9BCED /* tooot-Bridging-Header.h */, + 2FFEB4B0D00502D5425CDDC2 /* ExpoModulesProviders */, ); indentWidth = 2; sourceTree = ""; @@ -148,7 +167,7 @@ 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */, - 5C5B41FC5F9DBE367CF7EF21 /* [CP] Embed Pods Frameworks */, + 49D30A53634620EF2A5C6692 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -165,7 +184,7 @@ 83CBB9F71A601CBA00E9B192 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1130; + LastUpgradeCheck = 1320; TargetAttributes = { 13B07F861A680F5B00A75B9A = { DevelopmentTeam = 8EGBLQ2MA6; @@ -247,14 +266,14 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 5C5B41FC5F9DBE367CF7EF21 /* [CP] Embed Pods Frameworks */ = { + 49D30A53634620EF2A5C6692 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-tooot/Pods-tooot-frameworks.sh", - "${PODS_ROOT}/hermes-engine/destroot/Library/Frameworks/iphoneos/hermes.framework", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/hermes.framework/hermes", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( @@ -272,10 +291,14 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-tooot/Pods-tooot-resources.sh", + "${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/EXConstants.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/EXUpdates/EXUpdates.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle", ); name = "[CP] Copy Pods Resources"; outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXConstants.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXUpdates.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle", ); runOnlyForDeploymentPostprocessing = 0; @@ -312,6 +335,7 @@ 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, 5EE44DD62600124E00A9BCED /* File.swift in Sources */, 13B07FC11A68108700A75B9A /* main.m in Sources */, + E3BC22F5F8ABE515E14CF199 /* ExpoModulesProvider.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -357,7 +381,7 @@ "FB_SONARKIT_ENABLED=1", ); INFOPLIST_FILE = tooot/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_LDFLAGS = ( "$(inherited)", @@ -367,10 +391,12 @@ PRODUCT_BUNDLE_IDENTIFIER = com.xmflsct.app.tooot; PRODUCT_NAME = tooot; PROVISIONING_PROFILE_SPECIFIER = "match AdHoc com.xmflsct.app.tooot"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; SWIFT_OBJC_BRIDGING_HEADER = "tooot-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 1; + TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; }; name = Debug; @@ -388,7 +414,7 @@ DEVELOPMENT_TEAM = 8EGBLQ2MA6; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; INFOPLIST_FILE = tooot/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_LDFLAGS = ( "$(inherited)", @@ -398,9 +424,11 @@ PRODUCT_BUNDLE_IDENTIFIER = com.xmflsct.app.tooot; PRODUCT_NAME = tooot; PROVISIONING_PROFILE_SPECIFIER = "match AppStore com.xmflsct.app.tooot"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; SWIFT_OBJC_BRIDGING_HEADER = "tooot-Bridging-Header.h"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 1; + TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; }; name = Release; @@ -428,6 +456,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -454,7 +483,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; LIBRARY_SEARCH_PATHS = ( "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", @@ -490,6 +519,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -509,7 +539,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; LIBRARY_SEARCH_PATHS = ( "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", @@ -518,6 +548,7 @@ ); MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; VALIDATE_PRODUCT = YES; }; name = Release; diff --git a/ios/tooot.xcodeproj/xcshareddata/xcschemes/tooot.xcscheme b/ios/tooot.xcodeproj/xcshareddata/xcschemes/tooot.xcscheme index 2b18cadf..7e3f825d 100644 --- a/ios/tooot.xcodeproj/xcshareddata/xcschemes/tooot.xcscheme +++ b/ios/tooot.xcodeproj/xcshareddata/xcschemes/tooot.xcscheme @@ -1,6 +1,6 @@ -#import #import #import -#import +#import -@interface AppDelegate : UMAppDelegateWrapper +@interface AppDelegate : EXAppDelegateWrapper @end diff --git a/ios/tooot/AppDelegate.m b/ios/tooot/AppDelegate.m index 6b5d1c23..8a102a58 100644 --- a/ios/tooot/AppDelegate.m +++ b/ios/tooot/AppDelegate.m @@ -4,12 +4,7 @@ #import #import #import - -#import -#import -#import -#import -#import +#import #if defined(FB_SONARKIT_ENABLED) && __has_include() #import @@ -19,8 +14,6 @@ #import #import -#import - // iOS 9.x or newer - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url @@ -50,13 +43,6 @@ static void InitializeFlipper(UIApplication *application) { } #endif -@interface AppDelegate () - -@property (nonatomic, strong) UMModuleRegistryAdapter *moduleRegistryAdapter; -@property (nonatomic, strong) NSDictionary *launchOptions; - -@end - @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions @@ -65,57 +51,34 @@ static void InitializeFlipper(UIApplication *application) { InitializeFlipper(application); #endif - self.moduleRegistryAdapter = [[UMModuleRegistryAdapter alloc] initWithModuleRegistryProvider:[[UMModuleRegistryProvider alloc] init]]; - self.launchOptions = launchOptions; + RCTBridge *bridge = [self.reactDelegate createBridgeWithDelegate:self launchOptions:launchOptions]; + RCTRootView *rootView = [self.reactDelegate createRootViewWithBridge:bridge moduleName:@"main" initialProperties:nil]; + rootView.backgroundColor = [UIColor colorNamed:@"SplashScreenBackgroundColor"]; self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; - #ifdef DEBUG - [self initializeReactNativeApp]; - #else - EXUpdatesAppController *controller = [EXUpdatesAppController sharedInstance]; - controller.delegate = self; - [controller startAndShowLaunchScreen:self.window]; - #endif + UIViewController *rootViewController = [self.reactDelegate createRootViewController]; + rootViewController.view = rootView; + self.window.rootViewController = rootViewController; + [self.window makeKeyAndVisible]; [super application:application didFinishLaunchingWithOptions:launchOptions]; return YES; } -- (RCTBridge *)initializeReactNativeApp -{ - RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:self.launchOptions]; - RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge moduleName:@"main" initialProperties:nil]; - rootView.backgroundColor = [UIColor colorNamed:@"Background"]; - - UIViewController *rootViewController = [UIViewController new]; - rootViewController.view = rootView; - self.window.rootViewController = rootViewController; - [self.window makeKeyAndVisible]; - - return bridge; - } - - (NSArray> *)extraModulesForBridge:(RCTBridge *)bridge { - NSArray> *extraModules = [_moduleRegistryAdapter extraModulesForBridge:bridge]; // If you'd like to export some custom RCTBridgeModules that are not Expo modules, add them here! - return extraModules; + return @[]; } - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge { #ifdef DEBUG return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil]; #else - return [[EXUpdatesAppController sharedInstance] launchAssetUrl]; + return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; #endif } -- (void)appController:(EXUpdatesAppController *)appController didStartWithSuccess:(BOOL)success { - appController.bridge = [self initializeReactNativeApp]; - EXSplashScreenService *splashScreenService = (EXSplashScreenService *)[UMModuleRegistryProvider getSingletonModuleForClass:[EXSplashScreenService class]]; - [splashScreenService showSplashScreenFor:self.window.rootViewController]; -} - // Linking API - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary *)options { return [RCTLinkingManager application:application openURL:url options:options]; diff --git a/ios/tooot/Images.xcassets/Contents.json b/ios/tooot/Images.xcassets/Contents.json index 2d92bd53..73c00596 100644 --- a/ios/tooot/Images.xcassets/Contents.json +++ b/ios/tooot/Images.xcassets/Contents.json @@ -1,6 +1,6 @@ { "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } } diff --git a/ios/tooot/Images.xcassets/SplashScreenBackground.imageset/Contents.json b/ios/tooot/Images.xcassets/SplashScreenBackground.imageset/Contents.json deleted file mode 100644 index 847f2599..00000000 --- a/ios/tooot/Images.xcassets/SplashScreenBackground.imageset/Contents.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "images": [ - { - "idiom": "universal", - "filename": "background.png", - "scale": "1x" - }, - { - "appearances": [ - { - "appearance": "luminosity", - "value": "dark" - } - ], - "idiom": "universal", - "filename": "dark_background.png", - "scale": "1x" - }, - { - "idiom": "universal", - "scale": "2x" - }, - { - "appearances": [ - { - "appearance": "luminosity", - "value": "dark" - } - ], - "idiom": "universal", - "scale": "2x" - }, - { - "idiom": "universal", - "scale": "3x" - }, - { - "appearances": [ - { - "appearance": "luminosity", - "value": "dark" - } - ], - "idiom": "universal", - "scale": "3x" - } - ], - "info": { - "version": 1, - "author": "xcode" - } -} \ No newline at end of file diff --git a/ios/tooot/Images.xcassets/SplashScreenBackground.imageset/background.png b/ios/tooot/Images.xcassets/SplashScreenBackground.imageset/background.png deleted file mode 100644 index 8f04420e..00000000 Binary files a/ios/tooot/Images.xcassets/SplashScreenBackground.imageset/background.png and /dev/null differ diff --git a/ios/tooot/Images.xcassets/SplashScreenBackground.imageset/dark_background.png b/ios/tooot/Images.xcassets/SplashScreenBackground.imageset/dark_background.png deleted file mode 100644 index eadb301d..00000000 Binary files a/ios/tooot/Images.xcassets/SplashScreenBackground.imageset/dark_background.png and /dev/null differ diff --git a/ios/tooot/Images.xcassets/SplashScreenBackgroundColor.colorset/Contents.json b/ios/tooot/Images.xcassets/SplashScreenBackgroundColor.colorset/Contents.json new file mode 100644 index 00000000..dd794a6f --- /dev/null +++ b/ios/tooot/Images.xcassets/SplashScreenBackgroundColor.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "250", + "green" : "250", + "red" : "250" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "18", + "green" : "18", + "red" : "18" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/tooot/Info.plist b/ios/tooot/Info.plist index e325df39..7baa3965 100644 --- a/ios/tooot/Info.plist +++ b/ios/tooot/Info.plist @@ -37,6 +37,8 @@ 2102022230 ITSAppUsesNonExemptEncryption + LSApplicationCategoryType + public.app-category.social-networking LSRequiresIPhoneOS NSAppTransportSecurity @@ -50,12 +52,14 @@ - NSMicrophoneUsageDescription - $(PRODUCT_NAME) DOES NOT need microphone permission. Please reject this request. NSCameraUsageDescription Allow $(PRODUCT_NAME) to capture photo or video and attach it to your toot NSLocationWhenInUseUsageDescription - + + NSMainNibFile + LaunchScreen + NSMicrophoneUsageDescription + $(PRODUCT_NAME) DOES NOT need microphone permission. Please reject this request. NSPhotoLibraryAddUsageDescription Allow $(PRODUCT_NAME) to save an image to your camera roll NSPhotoLibraryUsageDescription diff --git a/ios/tooot/SplashScreen.storyboard b/ios/tooot/SplashScreen.storyboard index 24eec3df..23a5deaa 100644 --- a/ios/tooot/SplashScreen.storyboard +++ b/ios/tooot/SplashScreen.storyboard @@ -1,91 +1,41 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/tooot/Supporting/Expo.plist b/ios/tooot/Supporting/Expo.plist index 51168cbe..bba13d22 100644 --- a/ios/tooot/Supporting/Expo.plist +++ b/ios/tooot/Supporting/Expo.plist @@ -11,7 +11,7 @@ EXUpdatesReleaseChannel 0-development EXUpdatesSDKVersion - 40.0.0 + 0 EXUpdatesURL https://exp.host/@xmflsct/tooot diff --git a/ios/tooot/noop-file.swift b/ios/tooot/noop-file.swift new file mode 100644 index 00000000..9835ba30 --- /dev/null +++ b/ios/tooot/noop-file.swift @@ -0,0 +1,4 @@ +// +// @generated +// A blank Swift file must be created for native modules with Swift files to work correctly. +// \ No newline at end of file diff --git a/ios/tooot/tooot.entitlements b/ios/tooot/tooot.entitlements index 018a6e20..d7a186c6 100644 --- a/ios/tooot/tooot.entitlements +++ b/ios/tooot/tooot.entitlements @@ -1,8 +1,20 @@ - - aps-environment - development - - \ No newline at end of file + + aps-environment + development + com.apple.security.app-sandbox + + com.apple.security.device.audio-input + + com.apple.security.device.camera + + com.apple.security.network.client + + com.apple.security.personal-information.location + + com.apple.security.personal-information.photos-library + + + diff --git a/package.json b/package.json index 1bf34b16..fdb60233 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,11 @@ { "name": "tooot", "versions": { - "native": "210511", - "major": 2, - "minor": 1, - "patch": 2, - "expo": "41.0.0" + "native": "220204", + "major": 3, + "minor": 3, + "patch": 0, + "expo": "44.0.0" }, "description": "tooot app for Mastodon", "author": "xmflsct ", @@ -17,110 +17,103 @@ "scripts": { "start": "react-native start", "android": "react-native run-android", - "ios": "react-native run-ios", + "iphone": "react-native run-ios", + "ipad": "react-native run-ios --simulator 'iPad mini (6th generation)'", "app:build": "bundle exec fastlane build", - "test": "jest --watchAll", "release": "scripts/release.sh", - "clean": "react-native-clean-project" + "clean": "react-native-clean-project", + "postinstall": "patch-package" }, "dependencies": { - "@expo/react-native-action-sheet": "^3.9.0", - "@neverdull-agency/expo-unlimited-secure-store": "^1.0.10", - "@react-native-async-storage/async-storage": "^1.15.4", - "@react-native-community/blur": "^3.6.0", - "@react-native-community/cameraroll": "^4.0.4", - "@react-native-community/masked-view": "0.1.11", - "@react-native-community/netinfo": "6.0.0", + "@expo/react-native-action-sheet": "3.13.0", + "@neverdull-agency/expo-unlimited-secure-store": "1.0.10", + "@react-native-async-storage/async-storage": "1.15.17", + "@react-native-community/blur": "3.6.0", + "@react-native-community/cameraroll": "4.1.2", + "@react-native-community/netinfo": "7.1.9", "@react-native-community/segmented-control": "2.2.2", - "@react-navigation/bottom-tabs": "^5.11.11", - "@react-navigation/native": "^5.9.4", - "@react-navigation/stack": "^5.14.5", - "@reduxjs/toolkit": "^1.5.1", - "@sentry/react-native": "^2.4.3", - "@sharcoux/slider": "^5.3.0", - "axios": "^0.21.1", - "expo": "^41.0.1", - "expo-auth-session": "~3.2.3", - "expo-av": "~9.1.2", - "expo-crypto": "~9.1.0", - "expo-firebase-analytics": "~4.0.2", - "expo-haptics": "~10.0.0", - "expo-image-manipulator": "~9.1.0", - "expo-image-picker": "~10.1.4", - "expo-linking": "~2.2.3", - "expo-localization": "~10.1.0", - "expo-notifications": "~0.11.6", - "expo-random": "~11.1.2", - "expo-screen-capture": "^3.1.0", - "expo-secure-store": "~10.1.0", - "expo-splash-screen": "~0.10.2", - "expo-status-bar": "~1.0.4", - "expo-store-review": "~4.0.2", - "expo-video-thumbnails": "~5.1.0", - "expo-web-browser": "~9.1.0", - "i18next": "^20.3.0", - "li": "^1.3.0", - "lodash": "^4.17.21", + "@react-navigation/bottom-tabs": "6.2.0", + "@react-navigation/native": "6.0.8", + "@react-navigation/native-stack": "6.4.1", + "@react-navigation/stack": "6.1.1", + "@reduxjs/toolkit": "1.7.2", + "@sentry/react-native": "3.2.13", + "@sharcoux/slider": "5.6.4", + "axios": "0.24.0", + "expo": "44.0.6", + "expo-auth-session": "3.5.0", + "expo-av": "10.2.1", + "expo-constants": "^13.0.2", + "expo-crypto": "10.1.2", + "expo-device": "4.1.1", + "expo-file-system": "13.2.0", + "expo-firebase-analytics": "6.0.1", + "expo-haptics": "11.1.1", + "expo-image-manipulator": "10.2.1", + "expo-image-picker": "12.0.2", + "expo-linking": "3.0.0", + "expo-localization": "12.0.1", + "expo-notifications": "0.14.1", + "expo-random": "12.1.2", + "expo-screen-capture": "4.1.1", + "expo-secure-store": "11.1.1", + "expo-splash-screen": "0.14.2", + "expo-store-review": "5.1.1", + "expo-updates": "0.11.3", + "expo-video-thumbnails": "6.2.0", + "expo-web-browser": "10.1.1", + "i18next": "20.6.1", + "li": "1.3.0", + "lodash": "4.17.21", "react": "17.0.2", "react-dom": "17.0.2", - "react-i18next": "^11.9.0", - "react-native": "~0.64.1", - "react-native-animated-spinkit": "^1.5.2", - "react-native-blurhash": "^1.1.4", - "react-native-fast-image": "^8.3.4", - "react-native-feather": "^1.0.2", - "react-native-flash-message": "^0.1.23", - "react-native-gesture-handler": "~1.10.3", - "react-native-htmlview": "^0.16.0", - "react-native-pager-view": "5.1.9", - "react-native-reanimated": "~2.1.0", - "react-native-safe-area-context": "3.2.0", - "react-native-screens": "~3.3.0", + "react-i18next": "11.15.3", + "react-native": "0.66.4", + "react-native-animated-spinkit": "1.5.2", + "react-native-base64": "^0.2.1", + "react-native-blurhash": "1.1.8", + "react-native-fast-image": "8.5.11", + "react-native-feather": "1.1.2", + "react-native-flash-message": "0.2.1", + "react-native-gesture-handler": "2.2.0", + "react-native-htmlview": "0.16.0", + "react-native-pager-view": "5.4.9", + "react-native-reanimated": "2.3.1", + "react-native-safe-area-context": "3.3.2", + "react-native-screens": "3.10.2", "react-native-svg": "12.1.1", - "react-native-swipe-list-view": "^3.2.7", - "react-native-tab-view": "^3.0.1", - "react-native-unimodules": "~0.13.3", - "react-query": "^3.16.0", - "react-redux": "^7.2.4", - "react-timeago": "^5.2.0", - "redux-persist": "^6.0.0", - "rn-placeholder": "^3.0.3", - "sentry-expo": "^3.1.3", - "tslib": "^2.2.0", - "valid-url": "^1.0.9" + "react-native-swipe-list-view": "3.2.9", + "react-native-tab-view": "3.1.1", + "react-query": "3.34.12", + "react-redux": "7.2.6", + "react-timeago": "6.2.1", + "redux-persist": "6.0.0", + "rn-placeholder": "3.0.3", + "sentry-expo": "4.0.3", + "tslib": "2.3.1", + "valid-url": "1.0.9" }, "devDependencies": { - "@babel/core": "~7.14.3", - "@babel/plugin-proposal-optional-chaining": "^7.14.2", - "@babel/preset-typescript": "^7.13.0", - "@expo/config": "^3.3.43", - "@jest/types": "^26.6.2", - "@testing-library/jest-native": "^4.0.1", - "@testing-library/react-hooks": "^5.1.2", - "@testing-library/react-native": "^7.2.0", - "@types/jest": "^26.0.23", - "@types/lodash": "^4.14.170", - "@types/react": "~17.0.8", - "@types/react-dom": "~17.0.5", - "@types/react-native": "~0.64.6", - "@types/react-navigation": "^3.4.0", - "@types/react-redux": "^7.1.16", - "@types/react-test-renderer": "^17.0.1", - "@types/react-timeago": "^4.1.2", - "@types/valid-url": "^1.0.3", - "@welldone-software/why-did-you-render": "^6.1.4", - "babel-jest": "~26.6.3", - "babel-plugin-module-resolver": "^4.1.0", - "babel-plugin-transform-remove-console": "^6.9.4", - "chalk": "^4.1.1", - "dotenv": "^10.0.0", - "jest": "^26.6.3", - "jest-expo": "^41.0.0", - "nock": "^13.0.11", - "react-native-clean-project": "^3.6.4", - "react-navigation": "^4.4.4", - "react-navigation-stack": "^2.10.4", - "react-test-renderer": "^17.0.2", - "typescript": "~4.2.4" + "@babel/core": "7.17.0", + "@babel/plugin-proposal-optional-chaining": "7.16.7", + "@babel/preset-typescript": "7.16.7", + "@expo/config": "6.0.16", + "@types/lodash": "4.14.178", + "@types/react": "17.0.39", + "@types/react-dom": "17.0.11", + "@types/react-native": "0.66.15", + "@types/react-native-base64": "^0.2.0", + "@types/react-redux": "7.1.22", + "@types/react-timeago": "4.1.3", + "@types/valid-url": "1.0.3", + "@welldone-software/why-did-you-render": "6.2.3", + "babel-plugin-module-resolver": "4.1.0", + "babel-plugin-transform-remove-console": "6.9.4", + "chalk": "4.1.2", + "dotenv": "16.0.0", + "patch-package": "6.4.7", + "postinstall-postinstall": "2.1.0", + "react-native-clean-project": "4.0.0", + "typescript": "4.5.5" } } diff --git a/patches/expo-av+10.2.1.patch b/patches/expo-av+10.2.1.patch new file mode 100644 index 00000000..4fea8f38 --- /dev/null +++ b/patches/expo-av+10.2.1.patch @@ -0,0 +1,81 @@ +diff --git a/node_modules/expo-av/ios/EXAV/EXAV.m b/node_modules/expo-av/ios/EXAV/EXAV.m +index d255852..edf934f 100644 +--- a/node_modules/expo-av/ios/EXAV/EXAV.m ++++ b/node_modules/expo-av/ios/EXAV/EXAV.m +@@ -63,7 +63,7 @@ NSString *const EXDidUpdateMetadataEventName = @"didUpdateMetadata"; + @property (nonatomic, assign) BOOL audioRecorderShouldBeginRecording; + @property (nonatomic, assign) int audioRecorderDurationMillis; + +-@property (nonatomic, weak) EXModuleRegistry *moduleRegistry; ++@property (nonatomic, weak) EXModuleRegistry *expoModuleRegistry; + @property (nonatomic, weak) id permissionsManager; + + @end +@@ -106,7 +106,7 @@ EX_EXPORT_MODULE(ExponentAV); + + - (void)installJsiBindings + { +- id jsContextProvider = [_moduleRegistry getModuleImplementingProtocol:@protocol(EXJavaScriptContextProvider)]; ++ id jsContextProvider = [_expoModuleRegistry getModuleImplementingProtocol:@protocol(EXJavaScriptContextProvider)]; + void *jsRuntimePtr = [jsContextProvider javaScriptRuntimePointer]; + if (jsRuntimePtr) { + [self installJSIBindingsForRuntime:jsRuntimePtr withSoundDictionary:_soundDictionary]; +@@ -131,16 +131,16 @@ EX_EXPORT_MODULE(ExponentAV); + + #pragma mark - Expo experience lifecycle + +-- (void)setModuleRegistry:(EXModuleRegistry *)moduleRegistry ++- (void)setModuleRegistry:(EXModuleRegistry *)expoModuleRegistry + { +- [[_moduleRegistry getModuleImplementingProtocol:@protocol(EXAppLifecycleService)] unregisterAppLifecycleListener:self]; +- _moduleRegistry = moduleRegistry; +- _kernelAudioSessionManagerDelegate = [_moduleRegistry getSingletonModuleForName:@"AudioSessionManager"]; ++ [[_expoModuleRegistry getModuleImplementingProtocol:@protocol(EXAppLifecycleService)] unregisterAppLifecycleListener:self]; ++ _expoModuleRegistry = expoModuleRegistry; ++ _kernelAudioSessionManagerDelegate = [_expoModuleRegistry getSingletonModuleForName:@"AudioSessionManager"]; + if (!_isBackgrounded) { + [_kernelAudioSessionManagerDelegate moduleDidForeground:self]; + } +- [[_moduleRegistry getModuleImplementingProtocol:@protocol(EXAppLifecycleService)] registerAppLifecycleListener:self]; +- _permissionsManager = [_moduleRegistry getModuleImplementingProtocol:@protocol(EXPermissionsInterface)]; ++ [[_expoModuleRegistry getModuleImplementingProtocol:@protocol(EXAppLifecycleService)] registerAppLifecycleListener:self]; ++ _permissionsManager = [_expoModuleRegistry getModuleImplementingProtocol:@protocol(EXPermissionsInterface)]; + [EXPermissionsMethodsDelegate registerRequesters:@[[EXAudioRecordingPermissionRequester new]] withPermissionsManager:_permissionsManager]; + } + +@@ -478,7 +478,7 @@ withEXVideoViewForTag:(nonnull NSNumber *)reactTag + { + // TODO check that the bridge is still valid after the dispatch + // TODO check if the queues are ok +- [[_moduleRegistry getModuleImplementingProtocol:@protocol(EXUIManager)] executeUIBlock:^(id view) { ++ [[_expoModuleRegistry getModuleImplementingProtocol:@protocol(EXUIManager)] executeUIBlock:^(id view) { + if ([view isKindOfClass:[EXVideoView class]]) { + block(view); + } else { +@@ -566,7 +566,7 @@ withEXVideoViewForTag:(nonnull NSNumber *)reactTag + return EXErrorWithMessage(@"Recorder is already prepared."); + } + +- id fileSystem = [_moduleRegistry getModuleImplementingProtocol:@protocol(EXFileSystemInterface)]; ++ id fileSystem = [_expoModuleRegistry getModuleImplementingProtocol:@protocol(EXFileSystemInterface)]; + + if (!fileSystem) { + return EXErrorWithMessage(@"No FileSystem module."); +@@ -726,7 +726,7 @@ EX_EXPORT_METHOD_AS(loadForSound, + + - (void)sendEventWithName:(NSString *)eventName body:(NSDictionary *)body + { +- [[_moduleRegistry getModuleImplementingProtocol:@protocol(EXEventEmitterService)] sendEventWithName:eventName body:body]; ++ [[_expoModuleRegistry getModuleImplementingProtocol:@protocol(EXEventEmitterService)] sendEventWithName:eventName body:body]; + } + + EX_EXPORT_METHOD_AS(unloadForSound, +@@ -984,7 +984,7 @@ EX_EXPORT_METHOD_AS(unloadAudioRecorder, + - (void)dealloc + { + [_kernelAudioSessionManagerDelegate moduleWillDeallocate:self]; +- [[_moduleRegistry getModuleImplementingProtocol:@protocol(EXAppLifecycleService)] unregisterAppLifecycleListener:self]; ++ [[_expoModuleRegistry getModuleImplementingProtocol:@protocol(EXAppLifecycleService)] unregisterAppLifecycleListener:self]; + [[NSNotificationCenter defaultCenter] removeObserver:self]; + + // This will clear all @properties and deactivate the audio session: diff --git a/patches/expo-file-system+13.2.0.patch b/patches/expo-file-system+13.2.0.patch new file mode 100644 index 00000000..d7eb9e91 --- /dev/null +++ b/patches/expo-file-system+13.2.0.patch @@ -0,0 +1,166 @@ +diff --git a/node_modules/expo-file-system/android/src/main/java/expo/modules/filesystem/FileSystemModule.kt b/node_modules/expo-file-system/android/src/main/java/expo/modules/filesystem/FileSystemModule.kt +index 53bf40f..0ba5d89 100644 +--- a/node_modules/expo-file-system/android/src/main/java/expo/modules/filesystem/FileSystemModule.kt ++++ b/node_modules/expo-file-system/android/src/main/java/expo/modules/filesystem/FileSystemModule.kt +@@ -56,6 +56,7 @@ import okhttp3.Callback + import okhttp3.Headers + import okhttp3.JavaNetCookieJar + import okhttp3.MediaType ++import okhttp3.MediaType.Companion.toMediaTypeOrNull + import okhttp3.MultipartBody + import okhttp3.OkHttpClient + import okhttp3.Request +@@ -63,11 +64,7 @@ import okhttp3.RequestBody + import okhttp3.Response + import okhttp3.ResponseBody + +-import okio.Buffer +-import okio.BufferedSource +-import okio.ForwardingSource +-import okio.Okio +-import okio.Source ++import okio.* + + import org.apache.commons.codec.binary.Hex + import org.apache.commons.codec.digest.DigestUtils +@@ -766,7 +763,7 @@ open class FileSystemModule( + } + + val body = createRequestBody(options, decorator, fileUri.toFile()) +- return requestBuilder.method(method, body).build() ++ return method?.let { requestBuilder.method(it, body).build() } + } catch (e: Exception) { + e.message?.let { Log.e(TAG, it) } + promise.reject(e) +@@ -791,7 +788,7 @@ open class FileSystemModule( + } ?: URLConnection.guessContentTypeFromName(file.name) + + val fieldName = options["fieldName"]?.let { it as String } ?: file.name +- bodyBuilder.addFormDataPart(fieldName, file.name, decorator.decorate(RequestBody.create(MediaType.parse(mimeType), file))) ++ bodyBuilder.addFormDataPart(fieldName, file.name, decorator.decorate(RequestBody.create(mimeType.toMediaTypeOrNull(), file))) + bodyBuilder.build() + } + else -> { +@@ -816,9 +813,9 @@ open class FileSystemModule( + + override fun onResponse(call: Call, response: Response) { + val result = Bundle().apply { +- putString("body", response.body()?.string()) +- putInt("status", response.code()) +- putBundle("headers", translateHeaders(response.headers())) ++ putString("body", response.body?.string()) ++ putInt("status", response.code) ++ putBundle("headers", translateHeaders(response.headers)) + } + response.close() + promise.resolve(result) +@@ -866,7 +863,7 @@ open class FileSystemModule( + taskHandlers[uuid] = TaskHandler(call) + call.enqueue(object : Callback { + override fun onFailure(call: Call, e: IOException) { +- if (call.isCanceled) { ++ if (call.isCanceled()) { + promise.resolve(null) + return + } +@@ -876,11 +873,11 @@ open class FileSystemModule( + + override fun onResponse(call: Call, response: Response) { + val result = Bundle() +- val body = response.body() ++ val body = response.body + result.apply { + putString("body", body?.string()) +- putInt("status", response.code()) +- putBundle("headers", translateHeaders(response.headers())) ++ putInt("status", response.code) ++ putBundle("headers", translateHeaders(response.headers)) + } + response.close() + promise.resolve(result) +@@ -900,10 +897,10 @@ open class FileSystemModule( + val resources = context.resources + val packageName = context.packageName + val resourceId = resources.getIdentifier(url, "raw", packageName) +- val bufferedSource = Okio.buffer(Okio.source(context.resources.openRawResource(resourceId))) ++ val bufferedSource = context.resources.openRawResource(resourceId).source().buffer() + val file = uri.toFile() + file.delete() +- val sink = Okio.buffer(Okio.sink(file)) ++ val sink = file.sink().buffer() + sink.writeAll(bufferedSource) + sink.close() + val result = Bundle() +@@ -934,13 +931,13 @@ open class FileSystemModule( + override fun onResponse(call: Call, response: Response) { + val file = uri.toFile() + file.delete() +- val sink = Okio.buffer(Okio.sink(file)) +- sink.writeAll(response.body()!!.source()) ++ val sink = file.sink().buffer() ++ sink.writeAll(response.body!!.source()) + sink.close() + val result = Bundle().apply { + putString("uri", Uri.fromFile(file).toString()) +- putInt("status", response.code()) +- putBundle("headers", translateHeaders(response.headers())) ++ putInt("status", response.code) ++ putBundle("headers", translateHeaders(response.headers)) + if (options?.get("md5") == true) { + putString("md5", md5(file)) + } +@@ -1003,7 +1000,7 @@ open class FileSystemModule( + ?.addNetworkInterceptor { chain -> + val originalResponse = chain.proceed(chain.request()) + originalResponse.newBuilder() +- .body(ProgressResponseBody(originalResponse.body(), progressListener)) ++ .body(ProgressResponseBody(originalResponse.body, progressListener)) + .build() + } + ?.build() +@@ -1098,7 +1095,7 @@ open class FileSystemModule( + val options = params[0]?.options + return try { + val response = call!!.execute() +- val responseBody = response.body() ++ val responseBody = response.body + val input = BufferedInputStream(responseBody!!.byteStream()) + val output = FileOutputStream(file, isResume == true) + val data = ByteArray(1024) +@@ -1108,15 +1105,15 @@ open class FileSystemModule( + } + val result = Bundle().apply { + putString("uri", Uri.fromFile(file).toString()) +- putInt("status", response.code()) +- putBundle("headers", translateHeaders(response.headers())) ++ putInt("status", response.code) ++ putBundle("headers", translateHeaders(response.headers)) + options?.get("md5").takeIf { it == true }?.let { putString("md5", file?.let { md5(it) }) } + } + response.close() + promise?.resolve(result) + null + } catch (e: Exception) { +- if (call?.isCanceled == true) { ++ if (call?.isCanceled() == true) { + promise?.resolve(null) + return null + } +@@ -1139,7 +1136,7 @@ open class FileSystemModule( + override fun contentLength(): Long = responseBody?.contentLength() ?: -1 + + override fun source(): BufferedSource = +- bufferedSource ?: Okio.buffer(source(responseBody!!.source())) ++ bufferedSource ?: source(responseBody!!.source()).buffer() + + private fun source(source: Source): Source { + return object : ForwardingSource(source) { +@@ -1304,7 +1301,7 @@ open class FileSystemModule( + // Copied out of React Native's `NetworkingModule.java` + private fun translateHeaders(headers: Headers): Bundle { + val responseHeaders = Bundle() +- for (i in 0 until headers.size()) { ++ for (i in 0 until headers.size) { + val headerName = headers.name(i) + // multiple values for the same header + if (responseHeaders[headerName] != null) { diff --git a/patches/expo-updates+0.11.3.patch b/patches/expo-updates+0.11.3.patch new file mode 100644 index 00000000..023cb268 --- /dev/null +++ b/patches/expo-updates+0.11.3.patch @@ -0,0 +1,106 @@ +diff --git a/node_modules/expo-updates/android/src/main/java/expo/modules/updates/loader/Crypto.kt b/node_modules/expo-updates/android/src/main/java/expo/modules/updates/loader/Crypto.kt +index 69d5957..ec9858c 100644 +--- a/node_modules/expo-updates/android/src/main/java/expo/modules/updates/loader/Crypto.kt ++++ b/node_modules/expo-updates/android/src/main/java/expo/modules/updates/loader/Crypto.kt +@@ -47,7 +47,7 @@ object Crypto { + override fun onResponse(call: Call, response: Response) { + val exception: Exception = try { + val isValid = verifyPublicRSASignature( +- response.body()!!.string(), plainText, cipherText ++ response.body!!.string(), plainText, cipherText + ) + listener.onCompleted(isValid) + return +diff --git a/node_modules/expo-updates/android/src/main/java/expo/modules/updates/loader/FileDownloader.kt b/node_modules/expo-updates/android/src/main/java/expo/modules/updates/loader/FileDownloader.kt +index 530a259..3c70674 100644 +--- a/node_modules/expo-updates/android/src/main/java/expo/modules/updates/loader/FileDownloader.kt ++++ b/node_modules/expo-updates/android/src/main/java/expo/modules/updates/loader/FileDownloader.kt +@@ -14,6 +14,7 @@ import expo.modules.updates.manifest.ManifestHeaderData + import expo.modules.updates.manifest.UpdateManifest + import expo.modules.updates.selectionpolicy.SelectionPolicies + import okhttp3.* ++import okhttp3.Headers.Companion.toHeaders + import org.json.JSONArray + import org.json.JSONException + import org.json.JSONObject +@@ -65,14 +66,14 @@ open class FileDownloader(context: Context) { + if (!response.isSuccessful) { + callback.onFailure( + Exception( +- "Network request failed: " + response.body()!! ++ "Network request failed: " + response.body!! + .string() + ) + ) + return + } + try { +- response.body()!!.byteStream().use { inputStream -> ++ response.body!!.byteStream().use { inputStream -> + val hash = UpdatesUtils.sha256AndWriteToFile(inputStream, destination) + callback.onSuccess(destination, hash) + } +@@ -100,7 +101,7 @@ open class FileDownloader(context: Context) { + + parseMultipartManifestResponse(response, boundaryParameter, configuration, callback) + } else { +- val responseHeaders = response.headers() ++ val responseHeaders = response.headers + val manifestHeaderData = ManifestHeaderData( + protocolVersion = responseHeaders["expo-protocol-version"], + manifestFilters = responseHeaders["expo-manifest-filters"], +@@ -108,7 +109,7 @@ open class FileDownloader(context: Context) { + manifestSignature = responseHeaders["expo-manifest-signature"], + ) + +- parseManifest(response.body()!!.string(), manifestHeaderData, null, configuration, callback) ++ parseManifest(response.body!!.string(), manifestHeaderData, null, configuration, callback) + } + } + +@@ -124,14 +125,14 @@ open class FileDownloader(context: Context) { + val value = line.substring(indexOfSeparator + 1).trim() + headers[key] = value + } +- return Headers.of(headers) ++ return headers.toHeaders() + } + + private fun parseMultipartManifestResponse(response: Response, boundary: String, configuration: UpdatesConfiguration, callback: ManifestDownloadCallback) { + var manifestPartBodyAndHeaders: Pair? = null + var extensionsBody: String? = null + +- val multipartStream = MultipartStream(response.body()!!.byteStream(), boundary.toByteArray()) ++ val multipartStream = MultipartStream(response.body!!.byteStream(), boundary.toByteArray()) + + try { + var nextPart = multipartStream.skipPreamble() +@@ -178,7 +179,7 @@ open class FileDownloader(context: Context) { + return + } + +- val responseHeaders = response.headers() ++ val responseHeaders = response.headers + val manifestHeaderData = ManifestHeaderData( + protocolVersion = responseHeaders["expo-protocol-version"], + manifestFilters = responseHeaders["expo-manifest-filters"], +@@ -275,7 +276,7 @@ open class FileDownloader(context: Context) { + callback.onFailure( + "Failed to download manifest from URL: " + configuration.updateUrl, + Exception( +- response.body()!!.string() ++ response.body!!.string() + ) + ) + return +@@ -464,7 +465,9 @@ open class FileDownloader(context: Context) { + if (runtimeVersion != null && runtimeVersion.isNotEmpty()) { + header("Expo-Runtime-Version", runtimeVersion) + } else { +- header("Expo-SDK-Version", sdkVersion) ++ if (sdkVersion != null) { ++ header("Expo-SDK-Version", sdkVersion) ++ } + } + } + .header("Expo-Release-Channel", configuration.releaseChannel) \ No newline at end of file diff --git a/patches/react-native-fast-image+8.5.11.patch b/patches/react-native-fast-image+8.5.11.patch new file mode 100644 index 00000000..a4b97089 --- /dev/null +++ b/patches/react-native-fast-image+8.5.11.patch @@ -0,0 +1,10 @@ +diff --git a/node_modules/react-native-fast-image/android/build.gradle b/node_modules/react-native-fast-image/android/build.gradle +index 5b21cd5..19d82f8 100644 +--- a/node_modules/react-native-fast-image/android/build.gradle ++++ b/node_modules/react-native-fast-image/android/build.gradle +@@ -65,4 +65,5 @@ dependencies { + implementation "com.github.bumptech.glide:glide:${glideVersion}" + implementation "com.github.bumptech.glide:okhttp3-integration:${glideVersion}" + annotationProcessor "com.github.bumptech.glide:compiler:${glideVersion}" ++ implementation 'com.github.penfeizhou.android.animation:glide-plugin:2.12.0' + } diff --git a/scripts/release.sh b/scripts/release.sh index 8ba2bfd1..b7534c7e 100755 --- a/scripts/release.sh +++ b/scripts/release.sh @@ -5,4 +5,4 @@ if [ $# -ne 1 ]; then exit 1 fi -expo publish --target bare --release-channel=$1 \ No newline at end of file +expo publish --quiet --target bare --release-channel=$1 \ No newline at end of file diff --git a/src/@types/mastodon.d.ts b/src/@types/mastodon.d.ts index c0154742..de1742b7 100644 --- a/src/@types/mastodon.d.ts +++ b/src/@types/mastodon.d.ts @@ -299,8 +299,28 @@ declare namespace Mastodon { // Others thumbnail?: string contact_account?: Account - - // Custom + configuration?: { + statuses: { + max_characters: number + max_media_attachments: number + characters_reserved_per_url: number + } + media_attachments: { + supported_mime_types: string[] + image_size_limit: number + image_matrix_limit: number + video_size_limit: number + video_frame_rate_limit: number + video_matrix_limit: number + } + polls: { + max_options: number + max_characters_per_option: number + min_expiration: number + max_expiration: number + } + } + // Custom - to be deprecated in v4 max_toot_chars?: number } diff --git a/src/@types/react-navigation.d.ts b/src/@types/react-navigation.d.ts deleted file mode 100644 index 5f522ea1..00000000 --- a/src/@types/react-navigation.d.ts +++ /dev/null @@ -1,152 +0,0 @@ -declare namespace Nav { - type RootStackParamList = { - 'Screen-Tabs': undefined - 'Screen-Actions': - | { - type: 'status' - queryKey: QueryKeyTimeline - rootQueryKey?: QueryKeyTimeline - status: Mastodon.Status - } - | { - type: 'account' - account: Mastodon.Account - } - | { - type: 'notifications_filter' - } - 'Screen-Announcements': { showAll: boolean } - 'Screen-Compose': - | { - type: 'edit' - incomingStatus: Mastodon.Status - replyToStatus?: Mastodon.Status - queryKey?: [ - 'Timeline', - { - page: App.Pages - hashtag?: Mastodon.Tag['name'] - list?: Mastodon.List['id'] - toot?: Mastodon.Status['id'] - account?: Mastodon.Account['id'] - } - ] - } - | { - type: 'reply' - incomingStatus: Mastodon.Status - accts: Mastodon.Account['acct'][] - queryKey?: [ - 'Timeline', - { - page: App.Pages - hashtag?: Mastodon.Tag['name'] - list?: Mastodon.List['id'] - toot?: Mastodon.Status['id'] - account?: Mastodon.Account['id'] - } - ] - } - | { - type: 'conversation' - accts: Mastodon.Account['acct'][] - } - | undefined - 'Screen-ImagesViewer': { - imageUrls: { - id: Mastodon.Attachment['id'] - preview_url: Mastodon.AttachmentImage['preview_url'] - url: Mastodon.AttachmentImage['url'] - remote_url?: Mastodon.AttachmentImage['remote_url'] - blurhash: Mastodon.AttachmentImage['blurhash'] - width?: number - height?: number - }[] - id: Mastodon.Attachment['id'] - } - } - - type ScreenComposeStackParamList = { - 'Screen-Compose-Root': undefined - 'Screen-Compose-EditAttachment': { index: number } - 'Screen-Compose-DraftsList': { timestamp: number } - } - - type ScreenTabsStackParamList = { - 'Tab-Local': undefined - 'Tab-Public': undefined - 'Tab-Compose': undefined - 'Tab-Notifications': undefined - 'Tab-Me': undefined - } - - type TabSharedStackParamList = { - 'Tab-Shared-Account': { - account: Mastodon.Account | Mastodon.Mention - } - 'Tab-Shared-Attachments': { account: Mastodon.Account } - 'Tab-Shared-Hashtag': { - hashtag: Mastodon.Tag['name'] - } - 'Tab-Shared-Search': { text: string | undefined } - 'Tab-Shared-Toot': { - toot: Mastodon.Status - rootQueryKey?: QueryKeyTimeline - } - 'Tab-Shared-Users': - | { - reference: 'accounts' - id: Mastodon.Account['id'] - type: 'following' | 'followers' - count: number - } - | { - reference: 'statuses' - id: Mastodon.Status['id'] - type: 'reblogged_by' | 'favourited_by' - count: number - } - } - - type TabLocalStackParamList = { - 'Tab-Local-Root': undefined - } & TabSharedStackParamList - - type TabPublicStackParamList = { - 'Tab-Public-Root': undefined - } & TabSharedStackParamList - - type TabNotificationsStackParamList = { - 'Tab-Notifications-Root': undefined - } & TabSharedStackParamList - - type TabMeStackParamList = { - 'Tab-Me-Root': undefined - 'Tab-Me-Bookmarks': undefined - 'Tab-Me-Conversations': undefined - 'Tab-Me-Favourites': undefined - 'Tab-Me-Lists': undefined - 'Tab-Me-Lists-List': { - list: Mastodon.List['id'] - title: Mastodon.List['title'] - } - 'Tab-Me-Profile': undefined - 'Tab-Me-Push': undefined - 'Tab-Me-Settings': undefined - 'Tab-Me-Settings-Fontsize': undefined - 'Tab-Me-Switch': undefined - } & TabSharedStackParamList - - type TabMeProfileStackParamList = { - 'Tab-Me-Profile-Root': undefined - 'Tab-Me-Profile-Name': { - display_name: Mastodon.Account['display_name'] - } - 'Tab-Me-Profile-Note': { - note: Mastodon.Source['note'] - } - 'Tab-Me-Profile-Fields': { - fields?: Mastodon.Source['fields'] - } - } -} diff --git a/src/App.tsx b/src/App.tsx index b035ff10..21c6fbf3 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -9,12 +9,17 @@ import netInfo from '@root/startup/netInfo' import sentry from '@root/startup/sentry' import { persistor, store } from '@root/store' import AccessibilityManager from '@utils/accessibility/AccessibilityManager' -import { getSettingsLanguage } from '@utils/slices/settingsSlice' +import { + changeLanguage, + getSettingsLanguage +} from '@utils/slices/settingsSlice' import ThemeManager from '@utils/styles/ThemeManager' import * as Notifications from 'expo-notifications' import * as SplashScreen from 'expo-splash-screen' import React, { useCallback, useEffect, useState } from 'react' import { AppState, LogBox, Platform } from 'react-native' +import { GestureHandlerRootView } from 'react-native-gesture-handler' +import { enableFreeze } from 'react-native-screens' import { QueryClientProvider } from 'react-query' import { Provider } from 'react-redux' import { PersistGate } from 'redux-persist/integration/react' @@ -28,6 +33,7 @@ dev() sentry() audio() push() +enableFreeze(true) const App: React.FC = () => { log('log', 'App', 'rendering App') @@ -38,10 +44,10 @@ const App: React.FC = () => { Notifications.dismissAllNotificationsAsync() }, []) useEffect(() => { - AppState.addEventListener('change', appStateEffect) + const appStateListener = AppState.addEventListener('change', appStateEffect) return () => { - AppState.removeEventListener('change', appStateEffect) + appStateListener.remove() } }, []) @@ -83,6 +89,9 @@ const App: React.FC = () => { if (bootstrapped) { log('log', 'App', 'loading actual app :)') const language = getSettingsLanguage(store.getState()) + if (!language) { + store.dispatch(changeLanguage('en')) + } i18n.changeLanguage(language) return ( @@ -101,15 +110,17 @@ const App: React.FC = () => { ) return ( - - - - - + + + + + + + ) } diff --git a/src/Screens.tsx b/src/Screens.tsx index 955f9a31..86d27c7f 100644 --- a/src/Screens.tsx +++ b/src/Screens.tsx @@ -1,33 +1,36 @@ -import { HeaderCenter, HeaderLeft } from '@components/Header' -import { displayMessage, Message, removeMessage } from '@components/Message' +import { HeaderLeft } from '@components/Header' +import { displayMessage, Message } from '@components/Message' import navigationRef from '@helpers/navigationRef' -import { useNetInfo } from '@react-native-community/netinfo' import { NavigationContainer } from '@react-navigation/native' +import { createNativeStackNavigator } from '@react-navigation/native-stack' import ScreenActions from '@screens/Actions' import ScreenAnnouncements from '@screens/Announcements' import ScreenCompose from '@screens/Compose' import ScreenImagesViewer from '@screens/ImagesViewer' import ScreenTabs from '@screens/Tabs' +import initQuery from '@utils/initQuery' +import { RootStackParamList } from '@utils/navigation/navigators' import pushUseConnect from '@utils/push/useConnect' import pushUseReceive from '@utils/push/useReceive' import pushUseRespond from '@utils/push/useRespond' import { updatePreviousTab } from '@utils/slices/contextsSlice' import { updateAccountPreferences } from '@utils/slices/instances/updateAccountPreferences' +import { updateConfiguration } from '@utils/slices/instances/updateConfiguration' import { updateFilters } from '@utils/slices/instances/updateFilters' import { getInstanceActive, getInstances } from '@utils/slices/instancesSlice' import { useTheme } from '@utils/styles/ThemeManager' import { themes } from '@utils/styles/themes' import * as Analytics from 'expo-firebase-analytics' +import * as Linking from 'expo-linking' import { addScreenshotListener } from 'expo-screen-capture' -import React, { useCallback, useEffect, useRef } from 'react' +import React, { useCallback, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { Alert, Platform, StatusBar } from 'react-native' -import { createNativeStackNavigator } from 'react-native-screens/native-stack' -import { onlineManager, useQueryClient } from 'react-query' +import { useQueryClient } from 'react-query' import { useDispatch, useSelector } from 'react-redux' import * as Sentry from 'sentry-expo' -const Stack = createNativeStackNavigator() +const Stack = createNativeStackNavigator() export interface Props { localCorrupt?: string @@ -45,35 +48,15 @@ const Screens: React.FC = ({ localCorrupt }) => { const routeRef = useRef<{ name?: string; params?: {} }>() - const isConnected = useNetInfo().isConnected - useEffect(() => { - switch (isConnected) { - case true: - onlineManager.setOnline(isConnected) - removeMessage() - break - case false: - onlineManager.setOnline(isConnected) - displayMessage({ - mode, - type: 'error', - message: t('network.disconnected.message'), - description: t('network.disconnected.description'), - autoHide: false - }) - break - } - }, [isConnected]) - // Push hooks const instances = useSelector( getInstances, (prev, next) => prev.length === next.length ) const queryClient = useQueryClient() - pushUseConnect({ navigationRef, mode, t, instances, dispatch }) - pushUseReceive({ navigationRef, queryClient, instances }) - pushUseRespond({ navigationRef, queryClient, instances, dispatch }) + pushUseConnect({ t, instances }) + pushUseReceive({ instances }) + pushUseRespond({ instances }) // Prevent screenshot alert useEffect(() => { @@ -96,7 +79,7 @@ const Screens: React.FC = ({ localCorrupt }) => { type: 'error', mode }) - navigationRef.current?.navigate('Screen-Tabs', { + navigationRef.navigate('Screen-Tabs', { screen: 'Tab-Me' }) } @@ -107,6 +90,7 @@ const Screens: React.FC = ({ localCorrupt }) => { // Lazily update users's preferences, for e.g. composing default visibility useEffect(() => { if (instanceActive !== -1) { + dispatch(updateConfiguration()) dispatch(updateFilters()) dispatch(updateAccountPreferences()) } @@ -114,7 +98,7 @@ const Screens: React.FC = ({ localCorrupt }) => { // Callbacks const navigationContainerOnReady = useCallback(() => { - const currentRoute = navigationRef.current?.getCurrentRoute() + const currentRoute = navigationRef.getCurrentRoute() routeRef.current = { name: currentRoute?.name, params: currentRoute?.params @@ -124,7 +108,7 @@ const Screens: React.FC = ({ localCorrupt }) => { }, []) const navigationContainerOnStateChange = useCallback(() => { const previousRoute = routeRef.current - const currentRoute = navigationRef.current?.getCurrentRoute() + const currentRoute = navigationRef.getCurrentRoute() const matchTabName = currentRoute?.name?.match(/(Tab-.*)-Root/) if (matchTabName) { @@ -133,7 +117,7 @@ const Screens: React.FC = ({ localCorrupt }) => { } if (previousRoute?.name !== currentRoute?.name) { - Analytics.setCurrentScreen(currentRoute?.name) + Analytics.logEvent('screen_view', { screen_name: currentRoute?.name }) Sentry.Native.setContext('page', { previous: previousRoute, current: currentRoute @@ -143,6 +127,39 @@ const Screens: React.FC = ({ localCorrupt }) => { routeRef.current = currentRoute }, []) + // Deep linking for compose + const [deeplinked, setDeeplinked] = useState(false) + useEffect(() => { + const getUrlAsync = async () => { + setDeeplinked(true) + + const initialUrl = await Linking.parseInitialURLAsync() + + if (initialUrl.path) { + const paths = initialUrl.path.split('/') + + if (paths && paths.length) { + const instanceIndex = instances.findIndex( + instance => paths[0] === `@${instance.account.acct}@${instance.uri}` + ) + if (instanceIndex !== -1 && instanceActive !== instanceIndex) { + initQuery({ + instance: instances[instanceIndex], + prefetch: { enabled: true } + }) + } + } + } + + if (initialUrl.hostname === 'compose') { + navigationRef.navigate('Screen-Compose') + } + } + if (!deeplinked) { + getUrlAsync() + } + }, [instanceActive, instances, deeplinked]) + return ( <> = ({ localCorrupt }) => { name='Screen-Actions' component={ScreenActions} options={{ - stackPresentation: 'transparentModal', - stackAnimation: 'fade', + presentation: 'transparentModal', + animation: 'fade', headerShown: false }} /> @@ -175,38 +192,33 @@ const Screens: React.FC = ({ localCorrupt }) => { name='Screen-Announcements' component={ScreenAnnouncements} options={({ navigation }) => ({ - stackPresentation: 'transparentModal', - stackAnimation: 'fade', + presentation: 'transparentModal', + animation: 'fade', headerShown: true, - headerHideShadow: true, - headerTopInsetEnabled: false, + headerShadowVisible: false, + headerTransparent: true, headerStyle: { backgroundColor: 'transparent' }, headerLeft: () => ( navigation.goBack()} /> ), - headerTitle: t('screenAnnouncements:heading'), - ...(Platform.OS === 'android' && { - headerCenter: () => ( - - ) - }) + title: t('screenAnnouncements:heading') })} /> diff --git a/src/api/general.ts b/src/api/general.ts index 6d3c3b6e..20849953 100644 --- a/src/api/general.ts +++ b/src/api/general.ts @@ -1,6 +1,6 @@ import axios from 'axios' import chalk from 'chalk' -import { Constants } from 'react-native-unimodules' +import Constants from 'expo-constants' import * as Sentry from 'sentry-expo' const ctx = new chalk.Instance({ level: 3 }) @@ -24,7 +24,7 @@ const apiGeneral = async ({ params, headers, body, - sentry = false + sentry = true }: Params): Promise<{ body: T }> => { console.log( ctx.bgGreen.bold(' API general ') + @@ -46,7 +46,7 @@ const apiGeneral = async ({ params, headers: { 'Content-Type': 'application/json', - 'User-Agent': `tooot/${Constants.manifest.version}`, + 'User-Agent': `tooot/${Constants.manifest?.version}`, Accept: '*/*', ...headers }, @@ -58,8 +58,12 @@ const apiGeneral = async ({ }) }) .catch(error => { - if (sentry) { - Sentry.Native.setExtras(error.response) + if (sentry && Math.random() < 0.01) { + Sentry.Native.setExtras({ + API: 'general', + ...(error.response && { response: error.response }), + ...(error.request && { request: error.request }) + }) Sentry.Native.captureException(error) } diff --git a/src/api/instance.ts b/src/api/instance.ts index cd3a3c9e..81236aeb 100644 --- a/src/api/instance.ts +++ b/src/api/instance.ts @@ -1,8 +1,9 @@ import { RootState } from '@root/store' import axios, { AxiosRequestConfig } from 'axios' import chalk from 'chalk' +import Constants from 'expo-constants' import li from 'li' -import { Constants } from 'react-native-unimodules' +import * as Sentry from 'sentry-expo' const ctx = new chalk.Instance({ level: 3 }) @@ -21,6 +22,11 @@ export type Params = { > } +export type InstanceResponse = { + body: T + links: { prev?: string; next?: string } +} + const apiInstance = async ({ method, version = 'v1', @@ -29,7 +35,7 @@ const apiInstance = async ({ headers, body, extras -}: Params): Promise<{ body: T; links: { prev?: string; next?: string } }> => { +}: Params): Promise> => { const { store } = require('@root/store') const state = store.getState() as RootState const instanceActive = state.instances.instances.findIndex( @@ -68,7 +74,7 @@ const apiInstance = async ({ params, headers: { 'Content-Type': 'application/json', - 'User-Agent': `tooot/${Constants.manifest.version}`, + 'User-Agent': `tooot/${Constants.manifest?.version}`, Accept: '*/*', ...headers, ...(token && { @@ -92,6 +98,15 @@ const apiInstance = async ({ }) }) .catch(error => { + if (Math.random() < 0.001) { + Sentry.Native.setExtras({ + API: 'instance', + ...(error.response && { response: error.response }), + ...(error.request && { request: error.request }) + }) + Sentry.Native.captureException(error) + } + if (error.response) { // The request was made and the server responded with a status code // that falls out of the range of 2xx diff --git a/src/api/tooot.ts b/src/api/tooot.ts index 0958661a..8017944a 100644 --- a/src/api/tooot.ts +++ b/src/api/tooot.ts @@ -1,13 +1,13 @@ +import { mapEnvironment } from '@utils/checkEnvironment' import axios from 'axios' import chalk from 'chalk' -import { Constants } from 'react-native-unimodules' +import Constants from 'expo-constants' import * as Sentry from 'sentry-expo' const ctx = new chalk.Instance({ level: 3 }) export type Params = { - service: 'push' | 'translate' - method: 'get' | 'post' + method: 'get' | 'post' | 'put' | 'delete' url: string params?: { [key: string]: string | number | boolean | string[] | number[] | boolean[] @@ -17,19 +17,20 @@ export type Params = { sentry?: boolean } -const DOMAIN = __DEV__ ? 'testapi.tooot.app' : 'api.tooot.app' +export const TOOOT_API_DOMAIN = mapEnvironment({ + release: 'api.tooot.app', + candidate: 'api-candidate.tooot.app', + development: 'api-development.tooot.app' +}) const apiTooot = async ({ - service, method, url, params, headers, body, - sentry = false + sentry = true }: Params): Promise<{ body: T }> => { - const key = Constants.manifest.extra?.toootApiKey - console.log( ctx.bgGreen.bold(' API tooot ') + ' ' + @@ -43,13 +44,12 @@ const apiTooot = async ({ return axios({ timeout: method === 'post' ? 1000 * 60 : 1000 * 15, method, - baseURL: `https://${DOMAIN}/`, - url: `${service}/${url}`, + baseURL: `https://${TOOOT_API_DOMAIN}/`, + url: `${url}`, params, headers: { - ...(key && { 'x-tooot-key': key }), 'Content-Type': 'application/json', - 'User-Agent': `tooot/${Constants.manifest.version}`, + 'User-Agent': `tooot/${Constants.manifest?.version}`, Accept: '*/*', ...headers }, @@ -61,8 +61,12 @@ const apiTooot = async ({ }) }) .catch(error => { - if (sentry) { - Sentry.Native.setExtras(error.response) + if (sentry && Math.random() < 0.01) { + Sentry.Native.setExtras({ + API: 'tooot', + ...(error.response && { response: error.response }), + ...(error.request && { request: error.request }) + }) Sentry.Native.captureException(error) } diff --git a/src/components/Account.tsx b/src/components/Account.tsx index 1b4d78f7..ca9d2f17 100644 --- a/src/components/Account.tsx +++ b/src/components/Account.tsx @@ -1,6 +1,7 @@ import { ParseEmojis } from '@components/Parse' import { useNavigation } from '@react-navigation/native' import { StackNavigationProp } from '@react-navigation/stack' +import { TabLocalStackParamList } from '@utils/navigation/navigators' import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' import React, { useCallback } from 'react' @@ -21,7 +22,7 @@ const ComponentAccount: React.FC = ({ }) => { const { theme } = useTheme() const navigation = useNavigation< - StackNavigationProp + StackNavigationProp >() const onPress = useCallback(() => { diff --git a/src/components/Instance.tsx b/src/components/Instance.tsx index 27659c53..1b46c7d5 100644 --- a/src/components/Instance.tsx +++ b/src/components/Instance.tsx @@ -170,7 +170,6 @@ const ComponentInstance: React.FC = ({ ]} onChangeText={onChangeText} autoCapitalize='none' - autoCorrect={false} clearButtonMode='never' keyboardType='url' textContentType='URL' @@ -183,6 +182,8 @@ const ComponentInstance: React.FC = ({ onFocus: () => setTimeout(() => scrollViewRef.current?.scrollToEnd(), 150) })} + autoCorrect={false} + spellCheck={false} />