Upgrade to RN 0.73 (#1339)

* Upgrade to RN 0.73 with upgrade helper

* Upgrade testing-library

* Comment announcements

* Comment out UserProfle test

* Mock function used to calculate masonry layout

* There should not be a modal here

* There is actually also no modal here

* Use View if SafeAreaView is undefined

* Replace fast image library that was failing tests because of not being maintained

* Clear mocks in useTaxon test

* Remove legacy deps from testing flow

* Snapshot update

* Revert "Snapshot update"

This reverts commit bca8b296df.

* Update package-lock.json

* Clean-start

* Update project.pbxproj

* Reenable test that failed before updating dependency

* Reenable test that failed because of dependencies

* Remove comment
This commit is contained in:
Johannes Klein
2024-04-08 15:28:06 +02:00
committed by GitHub
parent c801451ddb
commit d6afb4b386
33 changed files with 2943 additions and 6148 deletions

View File

@@ -17,6 +17,16 @@ node_modules/react-native/Libraries/polyfills/.*
; Ignore these files
.*/node_modules/react-native/sdks/hermes/external/flowtest/test/flow/comment_interning/program_comment_directive.js
.*/node_modules/react-native/Libraries/DevToolsSettings/DevToolsSettingsManager.d.ts
.*/node_modules/react-native/Libraries/Network/RCTNetworking.js.flow
.*/node_modules/react-native/Libraries/NativeComponent/BaseViewConfig.js.flow
.*/node_modules/react-native/Libraries/DevToolsSettings/DevToolsSettingsManager.js.flow
.*/node_modules/metro/node_modules/hermes-estree/dist/generated/predicates.js.flow
.*/node_modules/metro-babel-transformer/node_modules/hermes-estree/dist/generated/predicates.js.flow
.*/node_modules/@react-native/dev-middleware/dist/utils/DefaultBrowserLauncher.js.flow
.*/node_modules/@react-native/community-cli-plugin/dist/commands/start/index.js.flow
.*/node_modules/@react-native/community-cli-plugin/dist/commands/ram-bundle/index.js.flow
.*/node_modules/@react-native/community-cli-plugin/dist/commands/bundle/index.js.flow
.*/node_modules/@react-native/community-cli-plugin/dist/commands/bundle/buildBundle.js.flow
[untyped]
.*/node_modules/@react-native-community/cli/.*/.*

View File

@@ -32,7 +32,7 @@ jobs:
- name: Install Dependencies
if: steps.cache.outputs.cache-hit != 'true'
run: npm install --legacy-peer-deps
run: npm install
- run: npm run lint
- run: npm test

View File

@@ -7,7 +7,7 @@ ruby ">= 2.6.10"
# Cocoapods 1.15 introduced a bug which break the build. We will remove the upper
# bound in the template on Cocoapods with next React Native release.
gem "cocoapods", ">= 1.13", "< 1.15"
gem "activesupport", ">= 6.1.7.3", "< 7.1.0"
gem "activesupport", ">= 6.1.7.5", "< 7.1.0"
gem "fastlane"
gem "nokogiri"

View File

@@ -1,4 +1,5 @@
apply plugin: "com.android.application"
apply plugin: "org.jetbrains.kotlin.android"
apply plugin: "com.facebook.react"
@@ -102,7 +103,8 @@ keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
android {
ndkVersion rootProject.ext.ndkVersion
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
compileSdk rootProject.ext.compileSdkVersion
namespace "org.inaturalist.iNaturalistMobile"
defaultConfig {
@@ -160,6 +162,7 @@ dependencies {
// The version of react-native is set by the React Native Gradle Plugin
implementation("com.facebook.react:react-android")
implementation("com.facebook.react:flipper-integration")
@@ -167,12 +170,6 @@ dependencies {
// https://github.com/wix/Detox/issues/3147
implementation("com.google.android.material:material:1.3.0")
debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}")
debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
exclude group:'com.squareup.okhttp3', module:'okhttp'
}
debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}")
if (hermesEnabled.toBoolean()) {
implementation("com.facebook.react:hermes-android")
} else {

View File

@@ -2,12 +2,9 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<application
android:usesCleartextTraffic="true"
tools:targetApi="28"
tools:ignore="GoogleAppIndexingWarning">
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" android:exported="false" />
tools:ignore="GoogleAppIndexingWarning"/>
</application>
</manifest>

View File

@@ -1,41 +0,0 @@
package org.inaturalist.iNaturalistMobile;
import com.facebook.react.ReactActivity;
import com.facebook.react.ReactActivityDelegate;
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint;
import com.facebook.react.defaults.DefaultReactActivityDelegate;
import android.os.Bundle;
public class MainActivity extends ReactActivity {
/**
* Needed for react-native-screens / react-navigation
* https://reactnavigation.org/docs/getting-started/
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(null);
}
/**
* Returns the name of the main component registered from JavaScript. This is used to schedule
* rendering of the component.
*/
@Override
protected String getMainComponentName() {
return "iNaturalistReactNative";
}
/**
* Returns the instance of the {@link ReactActivityDelegate}. Here we use a util class {@link
* DefaultReactActivityDelegate} which allows you to easily enable Fabric and Concurrent React
* (aka React 18) with two boolean flags.
*/
@Override
protected ReactActivityDelegate createReactActivityDelegate() {
return new DefaultReactActivityDelegate(
this,
getMainComponentName(),
// If you opted-in for the New Architecture, we enable the Fabric Renderer.
DefaultNewArchitectureEntryPoint.getFabricEnabled());
}
}

View File

@@ -0,0 +1,30 @@
package org.inaturalist.iNaturalistMobile
import com.facebook.react.ReactActivity
import com.facebook.react.ReactActivityDelegate
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled
import com.facebook.react.defaults.DefaultReactActivityDelegate
import android.os.Bundle
class MainActivity : ReactActivity() {
/**
* Needed for react-native-screens / react-navigation
* https://reactnavigation.org/docs/getting-started/
*/
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(null)
}
/**
* Returns the name of the main component registered from JavaScript. This is used to schedule
* rendering of the component.
*/
override fun getMainComponentName(): String = "iNaturalistReactNative"
/**
* Returns the instance of the [ReactActivityDelegate]. We use [DefaultReactActivityDelegate]
* which allows you to enable New Architecture with a single boolean flags [fabricEnabled]
*/
override fun createReactActivityDelegate(): ReactActivityDelegate =
DefaultReactActivityDelegate(this, mainComponentName, fabricEnabled)
}

View File

@@ -1,62 +0,0 @@
package org.inaturalist.iNaturalistMobile;
import android.app.Application;
import com.facebook.react.PackageList;
import com.facebook.react.ReactApplication;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint;
import com.facebook.react.defaults.DefaultReactNativeHost;
import com.facebook.soloader.SoLoader;
import java.util.List;
public class MainApplication extends Application implements ReactApplication {
private final ReactNativeHost mReactNativeHost =
new DefaultReactNativeHost(this) {
@Override
public boolean getUseDeveloperSupport() {
return BuildConfig.DEBUG;
}
@Override
protected List<ReactPackage> getPackages() {
@SuppressWarnings("UnnecessaryLocalVariable")
List<ReactPackage> packages = new PackageList(this).getPackages();
// Packages that cannot be autolinked yet can be added manually here, for example:
// packages.add(new MyReactNativePackage());
return packages;
}
@Override
protected String getJSMainModuleName() {
return "index";
}
@Override
protected boolean isNewArchEnabled() {
return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED;
}
@Override
protected Boolean isHermesEnabled() {
return BuildConfig.IS_HERMES_ENABLED;
}
};
@Override
public ReactNativeHost getReactNativeHost() {
return mReactNativeHost;
}
@Override
public void onCreate() {
super.onCreate();
SoLoader.init(this, /* native exopackage */ false);
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
// If you opted-in for the New Architecture, we load the native entry point for this app.
DefaultNewArchitectureEntryPoint.load();
}
ReactNativeFlipper.initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
}
}

View File

@@ -0,0 +1,45 @@
package org.inaturalist.iNaturalistMobile
import android.app.Application
import com.facebook.react.PackageList
import com.facebook.react.ReactApplication
import com.facebook.react.ReactHost
import com.facebook.react.ReactNativeHost
import com.facebook.react.ReactPackage
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load
import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost
import com.facebook.react.defaults.DefaultReactNativeHost
import com.facebook.react.flipper.ReactNativeFlipper
import com.facebook.soloader.SoLoader
class MainApplication : Application(), ReactApplication {
override val reactNativeHost: ReactNativeHost =
object : DefaultReactNativeHost(this) {
override fun getPackages(): List<ReactPackage> =
PackageList(this).packages.apply {
// Packages that cannot be autolinked yet can be added manually here, for example:
// add(MyReactNativePackage())
}
override fun getJSMainModuleName(): String = "index"
override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG
override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED
override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED
}
override val reactHost: ReactHost
get() = getDefaultReactHost(this.applicationContext, reactNativeHost)
override fun onCreate() {
super.onCreate()
SoLoader.init(this, false)
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
// If you opted-in for the New Architecture, we load the native entry point for this app.
load()
}
ReactNativeFlipper.initializeFlipper(this, reactNativeHost.reactInstanceManager)
}
}

View File

@@ -1,20 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* <p>This source code is licensed under the MIT license found in the LICENSE file in the root
* directory of this source tree.
*/
package org.inaturalist.iNaturalistMobile;
import android.content.Context;
import com.facebook.react.ReactInstanceManager;
/**
* Class responsible of loading Flipper inside your React Native application. This is the release
* flavor of it so it's empty as we don't want to load Flipper.
*/
public class ReactNativeFlipper {
public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) {
// Do nothing as we don't want to initialize Flipper on Release.
}
}

View File

@@ -4,13 +4,12 @@ import org.apache.tools.ant.taskdefs.condition.Os
buildscript {
ext {
buildToolsVersion = "33.0.0"
buildToolsVersion = "34.0.0"
minSdkVersion = 26
compileSdkVersion = 33
targetSdkVersion = 33
kotlinVersion = "1.7.21"
// We use NDK 23 which has both M1 support and is the side-by-side NDK version from AGP.
ndkVersion = "23.1.7779620"
compileSdkVersion = 34
targetSdkVersion = 34
ndkVersion = "25.1.8937393"
kotlinVersion = "1.8.0"
// This specifies which tensorflow-lite version to use for our vision-plugin.
tensorflowVersion = "2.4.0"
}
@@ -21,10 +20,12 @@ buildscript {
dependencies {
classpath("com.android.tools.build:gradle")
classpath("com.facebook.react:react-native-gradle-plugin")
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin")
}
}
apply plugin: "com.facebook.react.rootproject"
allprojects {
repositories {
// Detox Android setup

View File

@@ -24,7 +24,6 @@ android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true
FLIPPER_VERSION=0.182.0
# Use this property to specify which architecture you want to build.
# You can also override it from the CLI using
# ./gradlew <task> -PreactNativeArchitectures=x86_64

View File

Binary file not shown.

View File

@@ -1,6 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

21
android/gradlew vendored
View File

@@ -83,10 +83,8 @@ done
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
@@ -133,10 +131,13 @@ location of your Java installation."
fi
else
JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
fi
# Increase the maximum file descriptors if we can.
@@ -144,7 +145,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
# shellcheck disable=SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
@@ -152,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
# shellcheck disable=SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
@@ -197,6 +198,10 @@ if "$cygwin" || "$msys" ; then
done
fi
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
@@ -241,4 +246,4 @@ eval "set -- $(
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"
exec "$JAVACMD" "$@"

View File

@@ -1,5 +1,5 @@
module.exports = {
presets: ["module:metro-react-native-babel-preset"],
presets: ["module:@react-native/babel-preset"],
plugins: [
"react-native-worklets-core/plugin",
"transform-inline-environment-variables",

View File

@@ -59,14 +59,8 @@ end
target "iNaturalistReactNative" do
config = use_native_modules!
# Flags change depending on the env values.
flags = get_default_flags
use_react_native!(
path: config[:reactNativePath],
# Hermes is now enabled by default. Disable by setting this flag to false.
hermes_enabled: flags[:hermes_enabled],
fabric_enabled: flags[:fabric_enabled],
# Enables Flipper.
#
# Note that if you have use_frameworks! enabled, Flipper will not work and
@@ -108,7 +102,6 @@ target "iNaturalistReactNative" do
config[:reactNativePath],
mac_catalyst_enabled: false
)
__apply_Xcode_12_5_M1_post_install_workaround( installer )
# Add these lines for Xcode 14 builds
installer.generated_projects.each do | project |
project.targets.each do | target |

View File

File diff suppressed because it is too large Load Diff

View File

@@ -8,6 +8,7 @@
/* Begin PBXBuildFile section */
00E356F31AD99517003FC87E /* iNaturalistReactNativeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* iNaturalistReactNativeTests.m */; };
03BE06B8FED98F5CD10273BB /* libPods-iNaturalistReactNative.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 20043186B311EE211FEB259A /* libPods-iNaturalistReactNative.a */; };
13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; };
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
@@ -15,7 +16,6 @@
197A169D2A7C2567001A03DC /* cvmodel.mlmodel in Sources */ = {isa = PBXBuildFile; fileRef = 197A169B2A7C2567001A03DC /* cvmodel.mlmodel */; };
197A169E2A7C2567001A03DC /* taxonomy.json in Resources */ = {isa = PBXBuildFile; fileRef = 197A169C2A7C2567001A03DC /* taxonomy.json */; };
1EF13134839B4163B7221B1C /* Whitney-Light-Italic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 280EEAE853724445825C0BD1 /* Whitney-Light-Italic.otf */; };
20A80CB2AD058BDA23462D38 /* libPods-iNaturalistReactNative-ShareExtension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BBAA404A663814006B0F659A /* libPods-iNaturalistReactNative-ShareExtension.a */; };
24C2A4FB10654A9FA5F6BA36 /* Whitney-Light.otf in Resources */ = {isa = PBXBuildFile; fileRef = C13A1C5596344F5F8830E524 /* Whitney-Light.otf */; };
374CB22F29943E63005885ED /* Whitney-BookItalic-Pro.otf in Resources */ = {isa = PBXBuildFile; fileRef = 374CB22E29943E63005885ED /* Whitney-BookItalic-Pro.otf */; };
42832120F7C944B980FD13BC /* Whitney-MediumItalic-Pro.otf in Resources */ = {isa = PBXBuildFile; fileRef = 097C2902AB1249AA9846CED3 /* Whitney-MediumItalic-Pro.otf */; };
@@ -33,7 +33,6 @@
8F1AC6782BC1B610002F994B /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 8F1AC6762BC1B610002F994B /* PrivacyInfo.xcprivacy */; };
8F1AC6792BC1B610002F994B /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 8F1AC6762BC1B610002F994B /* PrivacyInfo.xcprivacy */; };
9136560F8A3E4C53B7BD08AE /* Whitney-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = B5F7CCA093BF4208980F1C36 /* Whitney-Medium.otf */; };
A019DB3A4661689827F5BB56 /* libPods-iNaturalistReactNative.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 486ED9661FEC89EDDBE3DA02 /* libPods-iNaturalistReactNative.a */; };
A252B2AEA64E47C9AC1D20E8 /* Whitney-Light-Pro.otf in Resources */ = {isa = PBXBuildFile; fileRef = BA9D41ECEBFA4C38B74009B3 /* Whitney-Light-Pro.otf */; };
A64FC9A5388A49568EC932B6 /* Whitney-Semibold-Italic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 63C92696AD524E14B655C56A /* Whitney-Semibold-Italic.otf */; };
B197D1A2DFD9440C9581D513 /* Whitney-Book-Pro.otf in Resources */ = {isa = PBXBuildFile; fileRef = 62CACBCC44D64A7EB95AACF1 /* Whitney-Book-Pro.otf */; };
@@ -42,6 +41,7 @@
CD4D097140634EE091BB5818 /* Whitney-Book.otf in Resources */ = {isa = PBXBuildFile; fileRef = 8EB5F71FA6C34855B03FE3FB /* Whitney-Book.otf */; };
CD871292AF3144DC9F9240BA /* Whitney-Semibold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 4A5C60A9F7DF42F49CED09FC /* Whitney-Semibold.otf */; };
D2853A71785A4FF6AB137F4C /* INatIcon.ttf in Resources */ = {isa = PBXBuildFile; fileRef = CC5CF9E037E74ADF9CF9710B /* INatIcon.ttf */; };
E23E0899594A7C6DF680FFDB /* libPods-iNaturalistReactNative-ShareExtension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A336AF0ADEAE537AB1B73F98 /* libPods-iNaturalistReactNative-ShareExtension.a */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -92,15 +92,15 @@
197A169C2A7C2567001A03DC /* taxonomy.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = taxonomy.json; sourceTree = "<group>"; };
19916F1F2B4F1871000A2D91 /* iNaturalistReactNativeRelease.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = iNaturalistReactNativeRelease.entitlements; path = iNaturalistReactNative/iNaturalistReactNativeRelease.entitlements; sourceTree = "<group>"; };
19A5877328F8E3310016D128 /* iNaturalistReactNative-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "iNaturalistReactNative-Bridging-Header.h"; sourceTree = "<group>"; };
20043186B311EE211FEB259A /* libPods-iNaturalistReactNative.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-iNaturalistReactNative.a"; sourceTree = BUILT_PRODUCTS_DIR; };
280EEAE853724445825C0BD1 /* Whitney-Light-Italic.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Whitney-Light-Italic.otf"; path = "../assets/fonts/Whitney-Light-Italic.otf"; sourceTree = "<group>"; };
2B8BE6258F04B67C38DE834A /* Pods-iNaturalistReactNative.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iNaturalistReactNative.release.xcconfig"; path = "Target Support Files/Pods-iNaturalistReactNative/Pods-iNaturalistReactNative.release.xcconfig"; sourceTree = "<group>"; };
374CB22E29943E63005885ED /* Whitney-BookItalic-Pro.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Whitney-BookItalic-Pro.otf"; path = "../assets/fonts/Whitney-BookItalic-Pro.otf"; sourceTree = "<group>"; };
486ED9661FEC89EDDBE3DA02 /* libPods-iNaturalistReactNative.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-iNaturalistReactNative.a"; sourceTree = BUILT_PRODUCTS_DIR; };
4A5C60A9F7DF42F49CED09FC /* Whitney-Semibold.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Whitney-Semibold.otf"; path = "../assets/fonts/Whitney-Semibold.otf"; sourceTree = "<group>"; };
5EA1E325EE494FF8BE364F00 /* Whitney-LightItalic-Pro.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Whitney-LightItalic-Pro.otf"; path = "../assets/fonts/Whitney-LightItalic-Pro.otf"; sourceTree = "<group>"; };
62CACBCC44D64A7EB95AACF1 /* Whitney-Book-Pro.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Whitney-Book-Pro.otf"; path = "../assets/fonts/Whitney-Book-Pro.otf"; sourceTree = "<group>"; };
63C92696AD524E14B655C56A /* Whitney-Semibold-Italic.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Whitney-Semibold-Italic.otf"; path = "../assets/fonts/Whitney-Semibold-Italic.otf"; sourceTree = "<group>"; };
657E03B58B8E44588A5933FA /* Whitney-Book-Italic.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Whitney-Book-Italic.otf"; path = "../assets/fonts/Whitney-Book-Italic.otf"; sourceTree = "<group>"; };
6836402D214AF8075A93F130 /* Pods-iNaturalistReactNative.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iNaturalistReactNative.release.xcconfig"; path = "Target Support Files/Pods-iNaturalistReactNative/Pods-iNaturalistReactNative.release.xcconfig"; sourceTree = "<group>"; };
81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = iNaturalistReactNative/LaunchScreen.storyboard; sourceTree = "<group>"; };
8B65ED2B29F575C10054CCEF /* iNaturalistReactNative-ShareExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "iNaturalistReactNative-ShareExtension.appex"; sourceTree = BUILT_PRODUCTS_DIR; };
8B65ED3029F575C10054CCEF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = "<group>"; };
@@ -111,19 +111,19 @@
8B8BAD0429F54EB300CE5C9F /* iNaturalistReactNative.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = iNaturalistReactNative.entitlements; path = iNaturalistReactNative/iNaturalistReactNative.entitlements; sourceTree = "<group>"; };
8EB5F71FA6C34855B03FE3FB /* Whitney-Book.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Whitney-Book.otf"; path = "../assets/fonts/Whitney-Book.otf"; sourceTree = "<group>"; };
8F1AC6762BC1B610002F994B /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
A336AF0ADEAE537AB1B73F98 /* libPods-iNaturalistReactNative-ShareExtension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-iNaturalistReactNative-ShareExtension.a"; sourceTree = BUILT_PRODUCTS_DIR; };
B397CFD4AEFF474A89A3D27B /* Whitney-Semibold-Pro.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Whitney-Semibold-Pro.otf"; path = "../assets/fonts/Whitney-Semibold-Pro.otf"; sourceTree = "<group>"; };
B5F7CCA093BF4208980F1C36 /* Whitney-Medium.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Whitney-Medium.otf"; path = "../assets/fonts/Whitney-Medium.otf"; sourceTree = "<group>"; };
B8FC28F6DD66FAD52B79E072 /* Pods-iNaturalistReactNative.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iNaturalistReactNative.debug.xcconfig"; path = "Target Support Files/Pods-iNaturalistReactNative/Pods-iNaturalistReactNative.debug.xcconfig"; sourceTree = "<group>"; };
BA9D41ECEBFA4C38B74009B3 /* Whitney-Light-Pro.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Whitney-Light-Pro.otf"; path = "../assets/fonts/Whitney-Light-Pro.otf"; sourceTree = "<group>"; };
BBAA404A663814006B0F659A /* libPods-iNaturalistReactNative-ShareExtension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-iNaturalistReactNative-ShareExtension.a"; sourceTree = BUILT_PRODUCTS_DIR; };
C13A1C5596344F5F8830E524 /* Whitney-Light.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Whitney-Light.otf"; path = "../assets/fonts/Whitney-Light.otf"; sourceTree = "<group>"; };
CC5CF9E037E74ADF9CF9710B /* INatIcon.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = INatIcon.ttf; path = ../assets/fonts/INatIcon.ttf; sourceTree = "<group>"; };
CEBBC55F32B65362EB71A4C6 /* Pods-iNaturalistReactNative-ShareExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iNaturalistReactNative-ShareExtension.debug.xcconfig"; path = "Target Support Files/Pods-iNaturalistReactNative-ShareExtension/Pods-iNaturalistReactNative-ShareExtension.debug.xcconfig"; sourceTree = "<group>"; };
D09FA3A0162844FF80A5EF96 /* Whitney-Medium-Pro.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Whitney-Medium-Pro.otf"; path = "../assets/fonts/Whitney-Medium-Pro.otf"; sourceTree = "<group>"; };
D7AE5BDBC584A83878A04344 /* Pods-iNaturalistReactNative-ShareExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iNaturalistReactNative-ShareExtension.debug.xcconfig"; path = "Target Support Files/Pods-iNaturalistReactNative-ShareExtension/Pods-iNaturalistReactNative-ShareExtension.debug.xcconfig"; sourceTree = "<group>"; };
D8663889EABFBFC3077401E3 /* Pods-iNaturalistReactNative-ShareExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iNaturalistReactNative-ShareExtension.release.xcconfig"; path = "Target Support Files/Pods-iNaturalistReactNative-ShareExtension/Pods-iNaturalistReactNative-ShareExtension.release.xcconfig"; sourceTree = "<group>"; };
DC9FE0074F1340B0A5F2EA35 /* Whitney-Medium-Italic.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Whitney-Medium-Italic.otf"; path = "../assets/fonts/Whitney-Medium-Italic.otf"; sourceTree = "<group>"; };
E67BC54FF5D9263C1DCFB23D /* Pods-iNaturalistReactNative-ShareExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iNaturalistReactNative-ShareExtension.release.xcconfig"; path = "Target Support Files/Pods-iNaturalistReactNative-ShareExtension/Pods-iNaturalistReactNative-ShareExtension.release.xcconfig"; sourceTree = "<group>"; };
ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
EE004FD2EC174086A7AB2908 /* inaturalisticons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = inaturalisticons.ttf; path = ../assets/fonts/inaturalisticons.ttf; sourceTree = "<group>"; };
FF1A612F80DAF77B84AD4694 /* Pods-iNaturalistReactNative.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iNaturalistReactNative.debug.xcconfig"; path = "Target Support Files/Pods-iNaturalistReactNative/Pods-iNaturalistReactNative.debug.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -139,7 +139,7 @@
buildActionMask = 2147483647;
files = (
5A8D64AB921678B40E0229C8 /* BuildFile in Frameworks */,
A019DB3A4661689827F5BB56 /* libPods-iNaturalistReactNative.a in Frameworks */,
03BE06B8FED98F5CD10273BB /* libPods-iNaturalistReactNative.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -147,7 +147,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
20A80CB2AD058BDA23462D38 /* libPods-iNaturalistReactNative-ShareExtension.a in Frameworks */,
E23E0899594A7C6DF680FFDB /* libPods-iNaturalistReactNative-ShareExtension.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -193,8 +193,8 @@
isa = PBXGroup;
children = (
ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
BBAA404A663814006B0F659A /* libPods-iNaturalistReactNative-ShareExtension.a */,
486ED9661FEC89EDDBE3DA02 /* libPods-iNaturalistReactNative.a */,
20043186B311EE211FEB259A /* libPods-iNaturalistReactNative.a */,
A336AF0ADEAE537AB1B73F98 /* libPods-iNaturalistReactNative-ShareExtension.a */,
);
name = Frameworks;
sourceTree = "<group>";
@@ -202,10 +202,10 @@
3610B9F08DA0E49FEE702ABA /* Pods */ = {
isa = PBXGroup;
children = (
FF1A612F80DAF77B84AD4694 /* Pods-iNaturalistReactNative.debug.xcconfig */,
CEBBC55F32B65362EB71A4C6 /* Pods-iNaturalistReactNative-ShareExtension.debug.xcconfig */,
E67BC54FF5D9263C1DCFB23D /* Pods-iNaturalistReactNative-ShareExtension.release.xcconfig */,
6836402D214AF8075A93F130 /* Pods-iNaturalistReactNative.release.xcconfig */,
B8FC28F6DD66FAD52B79E072 /* Pods-iNaturalistReactNative.debug.xcconfig */,
2B8BE6258F04B67C38DE834A /* Pods-iNaturalistReactNative.release.xcconfig */,
D7AE5BDBC584A83878A04344 /* Pods-iNaturalistReactNative-ShareExtension.debug.xcconfig */,
D8663889EABFBFC3077401E3 /* Pods-iNaturalistReactNative-ShareExtension.release.xcconfig */,
);
path = Pods;
sourceTree = "<group>";
@@ -316,15 +316,14 @@
isa = PBXNativeTarget;
buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "iNaturalistReactNative" */;
buildPhases = (
281FB0614D8CC389D289F282 /* [CP] Check Pods Manifest.lock */,
FD10A7F022414F080027D42C /* Start Packager */,
075F7EA7751B87EC3B297227 /* [CP] Check Pods Manifest.lock */,
13B07F871A680F5B00A75B9A /* Sources */,
13B07F8C1A680F5B00A75B9A /* Frameworks */,
13B07F8E1A680F5B00A75B9A /* Resources */,
00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
8BD9FE6729C0DD4D00133738 /* Embed Foundation Extensions */,
8157AEAF25C42F6282FF94AF /* [CP] Embed Pods Frameworks */,
A92C6264D0048B2088429716 /* [CP] Copy Pods Resources */,
2043FC43F173730C7484F6DD /* [CP] Embed Pods Frameworks */,
6F0B58D8C90D100E5D22E3B4 /* [CP] Copy Pods Resources */,
);
buildRules = (
);
@@ -340,11 +339,11 @@
isa = PBXNativeTarget;
buildConfigurationList = 8B65ED3829F575C10054CCEF /* Build configuration list for PBXNativeTarget "iNaturalistReactNative-ShareExtension" */;
buildPhases = (
196B2C937A277D0F8EC4B1DE /* [CP] Check Pods Manifest.lock */,
0C866C7E94EED4236278F673 /* [CP] Check Pods Manifest.lock */,
8B65ED2729F575C10054CCEF /* Sources */,
8B65ED2829F575C10054CCEF /* Frameworks */,
8B65ED2929F575C10054CCEF /* Resources */,
0CA1C9E281D0AF6ECD506E51 /* [CP] Copy Pods Resources */,
5DB819C6801A71EDC9EE6A6B /* [CP] Copy Pods Resources */,
);
buildRules = (
);
@@ -464,46 +463,7 @@
shellPath = /bin/sh;
shellScript = "set -e\n\nWITH_ENVIRONMENT=\"../node_modules/react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"../node_modules/react-native/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n";
};
0CA1C9E281D0AF6ECD506E51 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-iNaturalistReactNative-ShareExtension/Pods-iNaturalistReactNative-ShareExtension-resources-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Copy Pods Resources";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-iNaturalistReactNative-ShareExtension/Pods-iNaturalistReactNative-ShareExtension-resources-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-iNaturalistReactNative-ShareExtension/Pods-iNaturalistReactNative-ShareExtension-resources.sh\"\n";
showEnvVarsInLog = 0;
};
196B2C937A277D0F8EC4B1DE /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-iNaturalistReactNative-ShareExtension-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
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;
};
281FB0614D8CC389D289F282 /* [CP] Check Pods Manifest.lock */ = {
075F7EA7751B87EC3B297227 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -525,7 +485,29 @@
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;
};
8157AEAF25C42F6282FF94AF /* [CP] Embed Pods Frameworks */ = {
0C866C7E94EED4236278F673 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-iNaturalistReactNative-ShareExtension-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
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;
};
2043FC43F173730C7484F6DD /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -542,7 +524,24 @@
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-iNaturalistReactNative/Pods-iNaturalistReactNative-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
A92C6264D0048B2088429716 /* [CP] Copy Pods Resources */ = {
5DB819C6801A71EDC9EE6A6B /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-iNaturalistReactNative-ShareExtension/Pods-iNaturalistReactNative-ShareExtension-resources-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Copy Pods Resources";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-iNaturalistReactNative-ShareExtension/Pods-iNaturalistReactNative-ShareExtension-resources-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-iNaturalistReactNative-ShareExtension/Pods-iNaturalistReactNative-ShareExtension-resources.sh\"\n";
showEnvVarsInLog = 0;
};
6F0B58D8C90D100E5D22E3B4 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -559,25 +558,6 @@
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-iNaturalistReactNative/Pods-iNaturalistReactNative-resources.sh\"\n";
showEnvVarsInLog = 0;
};
FD10A7F022414F080027D42C /* Start Packager */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "Start Packager";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@@ -645,7 +625,7 @@
"$(inherited)",
);
INFOPLIST_FILE = iNaturalistReactNativeTests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -670,7 +650,7 @@
DEVELOPMENT_TEAM = N5J7L4P93Z;
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "i386 arm64";
INFOPLIST_FILE = iNaturalistReactNativeTests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -689,7 +669,7 @@
};
13B07F941A680F5B00A75B9A /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = FF1A612F80DAF77B84AD4694 /* Pods-iNaturalistReactNative.debug.xcconfig */;
baseConfigurationReference = B8FC28F6DD66FAD52B79E072 /* Pods-iNaturalistReactNative.debug.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
@@ -812,7 +792,7 @@
};
13B07F951A680F5B00A75B9A /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 6836402D214AF8075A93F130 /* Pods-iNaturalistReactNative.release.xcconfig */;
baseConfigurationReference = 2B8BE6258F04B67C38DE834A /* Pods-iNaturalistReactNative.release.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
@@ -936,7 +916,7 @@
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "c++17";
CLANG_CXX_LANGUAGE_STANDARD = "c++20";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
@@ -981,7 +961,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
LD_RUNPATH_SEARCH_PATHS = (
/usr/lib/swift,
"$(inherited)",
@@ -999,10 +979,12 @@
"-DFOLLY_NO_CONFIG",
"-DFOLLY_MOBILE=1",
"-DFOLLY_USE_LIBCPP=1",
"-DFOLLY_CFG_NO_COROUTINES=1",
);
OTHER_LDFLAGS = "$(inherited)";
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
USE_HERMES = true;
};
name = Debug;
};
@@ -1011,7 +993,7 @@
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "c++17";
CLANG_CXX_LANGUAGE_STANDARD = "c++20";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
@@ -1052,7 +1034,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
LD_RUNPATH_SEARCH_PATHS = (
/usr/lib/swift,
"$(inherited)",
@@ -1069,17 +1051,19 @@
"-DFOLLY_NO_CONFIG",
"-DFOLLY_MOBILE=1",
"-DFOLLY_USE_LIBCPP=1",
"-DFOLLY_CFG_NO_COROUTINES=1",
);
OTHER_LDFLAGS = "$(inherited)";
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
USE_HERMES = true;
VALIDATE_PRODUCT = YES;
};
name = Release;
};
8B65ED3629F575C10054CCEF /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = CEBBC55F32B65362EB71A4C6 /* Pods-iNaturalistReactNative-ShareExtension.debug.xcconfig */;
baseConfigurationReference = D7AE5BDBC584A83878A04344 /* Pods-iNaturalistReactNative-ShareExtension.debug.xcconfig */;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
@@ -1099,7 +1083,7 @@
INFOPLIST_FILE = "iNaturalistReactNative-ShareExtension/Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = "iNaturalistReactNative-ShareExtension";
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -1122,7 +1106,7 @@
};
8B65ED3729F575C10054CCEF /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = E67BC54FF5D9263C1DCFB23D /* Pods-iNaturalistReactNative-ShareExtension.release.xcconfig */;
baseConfigurationReference = D8663889EABFBFC3077401E3 /* Pods-iNaturalistReactNative-ShareExtension.release.xcconfig */;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
@@ -1144,7 +1128,7 @@
INFOPLIST_FILE = "iNaturalistReactNative-ShareExtension/Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = "iNaturalistReactNative-ShareExtension";
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",

View File

@@ -37,6 +37,11 @@
}
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
return [self getBundleURL];
}
- (NSURL *)getBundleURL
{
#if DEBUG
return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"];

View File

@@ -42,7 +42,13 @@
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSAppTransportSecurity</key>
<dict/>
<dict>
<!-- Do not change NSAllowsArbitraryLoads to true, or you will risk app rejection! -->
<key>NSAllowsArbitraryLoads</key>
<false/>
<key>NSAllowsLocalNetworking</key>
<true/>
</dict>
<key>NSAppleMusicUsageDescription</key>
<string>Add existing photos and sounds to your observations.</string>
<key>NSCameraUsageDescription</key>

7038
package-lock.json generated
View File

File diff suppressed because it is too large Load Diff

View File

@@ -35,12 +35,13 @@
},
"dependencies": {
"@bam.tech/react-native-image-resizer": "^3.0.7",
"@candlefinance/faster-image": "^1.4.3",
"@formidable-webview/webshell": "^2.6.0",
"@gorhom/bottom-sheet": "^4.6.1",
"@react-native-async-storage/async-storage": "^1.23.1",
"@react-native-camera-roll/camera-roll": "^7.5.2",
"@react-native-clipboard/clipboard": "^1.13.2",
"@react-native-community/datetimepicker": "^7.6.2",
"@react-native-community/datetimepicker": "^7.6.3",
"@react-native-community/geolocation": "^3.2.1",
"@react-native-community/netinfo": "^11.3.1",
"@react-native-community/slider": "^4.5.0",
@@ -73,7 +74,7 @@
"react": "18.2.0",
"react-dom": "18.2.0",
"react-i18next": "^14.1.0",
"react-native": "0.72.12",
"react-native": "0.73.6",
"react-native-animated-dots-carousel": "^1.0.2",
"react-native-audio-recorder-player": "^3.6.7",
"react-native-bouncy-checkbox": "^3.0.7",
@@ -85,7 +86,6 @@
"react-native-event-listeners": "^1.0.7",
"react-native-exception-handler": "^2.10.10",
"react-native-exif-reader": "github:inaturalist/react-native-exif-reader",
"react-native-fast-image": "^8.6.3",
"react-native-fs": "^2.20.0",
"react-native-geocoder-reborn": "^0.9.0",
"react-native-gesture-handler": "^2.16.0",
@@ -134,15 +134,17 @@
"@babel/runtime": "^7.24.4",
"@faker-js/faker": "^8.4.1",
"@fluent/syntax": "^0.19.0",
"@react-native/eslint-config": "^0.72.2",
"@react-native/metro-config": "^0.72.12",
"@react-native/babel-preset": "0.73.21",
"@react-native/eslint-config": "0.73.2",
"@react-native/metro-config": "0.73.5",
"@react-native/typescript-config": "0.73.1",
"@tanstack/eslint-plugin-query": "^5.28.11",
"@testing-library/jest-native": "^5.4.3",
"@testing-library/react-native": "^12.4.5",
"@tsconfig/react-native": "^3.0.0",
"@types/react": "^18.2.74",
"@types/react-test-renderer": "^18.0.7",
"@xhmikosr/downloader": "^15.0.1",
"babel-jest": "^29.6.3",
"babel-plugin-module-resolver": "^5.0.0",
"babel-plugin-transform-inline-environment-variables": "^0.4.4",
"babel-plugin-transform-remove-console": "^6.9.4",
@@ -169,8 +171,6 @@
"husky": "^9.0.11",
"jest": "^29.7.0",
"jest-fetch-mock": "github:jefflau/jest-fetch-mock",
"metro-config": "0.73.9",
"metro-react-native-babel-preset": "^0.76.9",
"nock": "^13.5.4",
"patch-package": "^8.0.0",
"react-native-accessibility-engine": "^3.2.0",
@@ -178,7 +178,7 @@
"react-native-config-node": "^0.0.3",
"react-test-renderer": "18.2.0",
"tailwindcss": "^3.3.2",
"typescript": "^5.4.4",
"typescript": "5.0.4",
"yargs": "^17.7.2"
},
"engines": {

View File

@@ -1,7 +1,7 @@
// @flow
import classNames from "classnames";
import { FastImage as Image } from "components/styledComponents";
import { FasterImageView as Image } from "components/styledComponents";
import type { Node } from "react";
import React from "react";
import colors from "styles/tailwindColors";

View File

@@ -1,5 +1,6 @@
// @flow
import { FasterImageView as UnstyledFasterImageView } from "@candlefinance/faster-image";
import {
BottomSheetTextInput as StyledBottomSheetTextInput
} from "@gorhom/bottom-sheet";
@@ -17,16 +18,18 @@ import {
TextInput as UntyledTextInput,
View as UnstyledView
} from "react-native";
// eslint-disable-next-line import/no-extraneous-dependencies
import UnstyledFastImage from "react-native-fast-image";
import UnstyledLinearGradient from "react-native-linear-gradient";
// $FlowIgnore
const View = styled( UnstyledView );
// $FlowIgnore
const KeyboardAvoidingView = styled( UnstyledKeyboardAvoidingView );
// Since upgrading to React Native 0.73 UnstyledSafeAreaView is undefined in the jest tests
// Why I don't know. This is just to fix the failing tests.
// $FlowIgnore
const SafeAreaView = styled( UnstyledSafeAreaView );
const SafeAreaView = styled( UnstyledSafeAreaView === undefined
? UnstyledView
: UnstyledSafeAreaView );
// $FlowIgnore
const ScrollView = styled( UnstyledScrollView );
// $FlowIgnore
@@ -71,11 +74,11 @@ const fontMonoClass: string = ( Platform.OS === "ios"
const LinearGradient = styled( UnstyledLinearGradient );
// $FlowIgnore
const FastImage = styled( UnstyledFastImage );
const FasterImageView = styled( UnstyledFasterImageView );
export {
BottomSheetTextInput,
FastImage,
FasterImageView,
fontMonoClass,
Image,
ImageBackground,

View File

@@ -379,14 +379,6 @@ inatjs.observations.updates.mockResolvedValue( makeResponse( ) );
jest.mock( "react-native-audio-recorder-player", ( ) => MockAudioRecorderPlayer );
jest.mock( "react-native-fast-image", ( ) => {
const actualNav = jest.requireActual( "react-native-fast-image" );
return {
...actualNav,
preload: jest.fn( )
};
} );
jest.mock( "@react-native-clipboard/clipboard", () => mockClipboard );
jest.mock( "react-native-webview", () => {

View File

@@ -244,36 +244,6 @@ exports[`CustomTabBar should render correctly 1`] = `
</Text>
</View>
</View>
<Modal
animationType="none"
deviceHeight={null}
deviceWidth={null}
hardwareAccelerated={false}
hideModalContentWhileAnimating={true}
onBackdropPress={[Function]}
onModalHide={[Function]}
onModalWillHide={[Function]}
onModalWillShow={[Function]}
onRequestClose={[Function]}
onSwipeComplete={[Function]}
panResponderThreshold={4}
scrollHorizontal={false}
scrollOffset={0}
scrollOffsetMax={0}
scrollTo={null}
statusBarTranslucent={false}
supportedOrientations={
[
"portrait",
"landscape",
]
}
swipeDirection="down"
swipeThreshold={100}
transparent={true}
useNativeDriverForBackdrop={true}
visible={false}
/>
<View
accessibilityHint="Opens add observation modal."
accessibilityLabel="Add observations"

View File

@@ -5,6 +5,8 @@ import PhotoCarousel from "components/Camera/StandardCamera/PhotoCarousel";
import React from "react";
import useStore from "stores/useStore";
jest.mock( "components/MediaViewer/MediaViewerModal", ( ) => jest.fn( ( ) => null ) );
const initialStoreState = useStore.getState( );
// For snapshots we want test data not to be random
@@ -27,6 +29,8 @@ describe( "PhotoCarousel", ( ) => {
<PhotoCarousel photoUris={mockPhotoUris} />
);
await screen.findByTestId( `PhotoCarousel.displayPhoto.${mockPhotoUris[0]}` );
// Snapshot test
expect( screen ).toMatchSnapshot();
} );
@@ -36,6 +40,8 @@ describe( "PhotoCarousel", ( ) => {
<PhotoCarousel photoUris={mockPhotoUris} isLargeScreen />
);
await screen.findByTestId( `PhotoCarousel.displayPhoto.${mockPhotoUris[0]}` );
// Snapshot test
expect( screen ).toMatchSnapshot();
} );

View File

@@ -33,7 +33,7 @@ exports[`PhotoCarousel renders correctly 1`] = `
onScrollEndDrag={[Function]}
removeClippedSubviews={false}
renderItem={[Function]}
scrollEventThrottle={50}
scrollEventThrottle={0.0001}
stickyHeaderIndices={[]}
viewabilityConfigCallbackPairs={[]}
>
@@ -547,36 +547,6 @@ exports[`PhotoCarousel renders correctly 1`] = `
</View>
</View>
</RCTScrollView>
<Modal
animationType="none"
deviceHeight={null}
deviceWidth={null}
hardwareAccelerated={false}
hideModalContentWhileAnimating={true}
onBackdropPress={[Function]}
onModalHide={[Function]}
onModalWillHide={[Function]}
onModalWillShow={[Function]}
onRequestClose={[Function]}
onSwipeComplete={[Function]}
panResponderThreshold={4}
scrollHorizontal={false}
scrollOffset={0}
scrollOffsetMax={0}
scrollTo={null}
statusBarTranslucent={false}
supportedOrientations={
[
"portrait",
"landscape",
]
}
swipeDirection={null}
swipeThreshold={100}
transparent={true}
useNativeDriverForBackdrop={true}
visible={false}
/>
</View>
`;
@@ -613,7 +583,7 @@ exports[`PhotoCarousel renders correctly for large screen 1`] = `
onScrollEndDrag={[Function]}
removeClippedSubviews={false}
renderItem={[Function]}
scrollEventThrottle={50}
scrollEventThrottle={0.0001}
stickyHeaderIndices={[]}
viewabilityConfigCallbackPairs={[]}
>
@@ -1142,35 +1112,5 @@ exports[`PhotoCarousel renders correctly for large screen 1`] = `
</View>
</View>
</RCTScrollView>
<Modal
animationType="none"
deviceHeight={null}
deviceWidth={null}
hardwareAccelerated={false}
hideModalContentWhileAnimating={true}
onBackdropPress={[Function]}
onModalHide={[Function]}
onModalWillHide={[Function]}
onModalWillShow={[Function]}
onRequestClose={[Function]}
onSwipeComplete={[Function]}
panResponderThreshold={4}
scrollHorizontal={false}
scrollOffset={0}
scrollOffsetMax={0}
scrollTo={null}
statusBarTranslucent={false}
supportedOrientations={
[
"portrait",
"landscape",
]
}
swipeDirection={null}
swipeThreshold={100}
transparent={true}
useNativeDriverForBackdrop={true}
visible={false}
/>
</View>
`;

View File

@@ -1,10 +1,15 @@
import { render, screen } from "@testing-library/react-native";
import { render, screen, waitFor } from "@testing-library/react-native";
import ObsMedia from "components/ObsDetails/ObsMedia";
import _ from "lodash";
import React from "react";
import { Image } from "react-native";
import factory from "tests/factory";
import faker from "tests/helpers/faker";
Image.getSize = jest.fn( ( uri, callback ) => {
callback( { width: 1024, height: 768 } );
} );
const mockObservation = factory( "LocalObservation", {
created_at: "2022-11-27T19:07:41-08:00",
time_observed_at: "2023-12-14T21:07:41-09:30",
@@ -56,12 +61,16 @@ describe( "ObsMedia", () => {
it( "should show photo with given url", async () => {
render( <ObsMedia photos={mockPhotos} tablet={false} /> );
const photo = await screen.findByTestId( "ObsMedia.photo" );
expect( photo.props.source ).toStrictEqual( expectedImageSource );
await waitFor( () => {
expect( photo.props.source ).toStrictEqual( expectedImageSource );
} );
} );
it( "should show photo with given url on tablet", async () => {
render( <ObsMedia photos={mockPhotos} tablet /> );
const photo = await screen.findByTestId( "ObsMedia.photo" );
expect( photo.props.source ).toStrictEqual( expectedImageSource );
await waitFor( () => {
expect( photo.props.source ).toStrictEqual( expectedImageSource );
} );
} );
} );

View File

@@ -1,155 +1,98 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`UserIcon displays active user image correctly 1`] = `
<View
<FasterImageView
accessibilityIgnoresInvertColors={true}
accessibilityRole="image"
source={
{
"uri": "some_uri",
}
}
style={
[
{
"overflow": "hidden",
},
[
[
{
"borderBottomLeftRadius": 9999,
"borderBottomRightRadius": 9999,
"borderTopLeftRadius": 9999,
"borderTopRightRadius": 9999,
},
{
"width": 40,
},
{
"height": 40,
},
{
"borderColor": "#74AC00",
"borderWidth": 3,
},
],
{
"borderBottomLeftRadius": 9999,
"borderBottomRightRadius": 9999,
"borderTopLeftRadius": 9999,
"borderTopRightRadius": 9999,
},
{
"width": 40,
},
{
"height": 40,
},
{
"borderColor": "#74AC00",
"borderWidth": 3,
},
],
]
}
>
<FastImageView
accessibilityIgnoresInvertColors={true}
accessibilityRole="image"
defaultSource={null}
resizeMode="cover"
source={
{
"uri": "some_uri",
}
}
style={
{
"bottom": 0,
"left": 0,
"position": "absolute",
"right": 0,
"top": 0,
}
}
testID="UserIcon.photo"
/>
</View>
testID="UserIcon.photo"
/>
`;
exports[`UserIcon displays small user image correctly 1`] = `
<View
<FasterImageView
accessibilityIgnoresInvertColors={true}
accessibilityRole="image"
source={
{
"uri": "some_uri",
}
}
style={
[
{
"overflow": "hidden",
},
[
[
{
"borderBottomLeftRadius": 9999,
"borderBottomRightRadius": 9999,
"borderTopLeftRadius": 9999,
"borderTopRightRadius": 9999,
},
{
"width": 22,
},
{
"height": 22,
},
],
{
"borderBottomLeftRadius": 9999,
"borderBottomRightRadius": 9999,
"borderTopLeftRadius": 9999,
"borderTopRightRadius": 9999,
},
{
"width": 22,
},
{
"height": 22,
},
],
]
}
>
<FastImageView
accessibilityIgnoresInvertColors={true}
accessibilityRole="image"
defaultSource={null}
resizeMode="cover"
source={
{
"uri": "some_uri",
}
}
style={
{
"bottom": 0,
"left": 0,
"position": "absolute",
"right": 0,
"top": 0,
}
}
testID="UserIcon.photo"
/>
</View>
testID="UserIcon.photo"
/>
`;
exports[`UserIcon displays user image correctly 1`] = `
<View
<FasterImageView
accessibilityIgnoresInvertColors={true}
accessibilityRole="image"
source={
{
"uri": "some_uri",
}
}
style={
[
{
"overflow": "hidden",
},
[
[
{
"borderBottomLeftRadius": 9999,
"borderBottomRightRadius": 9999,
"borderTopLeftRadius": 9999,
"borderTopRightRadius": 9999,
},
{
"width": 40,
},
{
"height": 40,
},
],
{
"borderBottomLeftRadius": 9999,
"borderBottomRightRadius": 9999,
"borderTopLeftRadius": 9999,
"borderTopRightRadius": 9999,
},
{
"width": 40,
},
{
"height": 40,
},
],
]
}
>
<FastImageView
accessibilityIgnoresInvertColors={true}
accessibilityRole="image"
defaultSource={null}
resizeMode="cover"
source={
{
"uri": "some_uri",
}
}
style={
{
"bottom": 0,
"left": 0,
"position": "absolute",
"right": 0,
"top": 0,
}
}
testID="UserIcon.photo"
/>
</View>
testID="UserIcon.photo"
/>
`;

View File

@@ -60,7 +60,9 @@ describe( "UserProfile", () => {
new RegExp( t( "OBSERVATIONS-WITHOUT-NUMBER", { count: mockUser.observations_count } ) )
)
).toBeTruthy( );
expect( screen.getByTestId( "UserIcon.photo" ).props.source ).toStrictEqual( {
const userIcon = screen.getByTestId( "UserIcon.photo" );
expect( userIcon ).toBeTruthy( );
expect( userIcon.props.source ).toStrictEqual( {
uri: mockUser.icon_url
} );
} );

View File

@@ -1,3 +1,3 @@
{
"extends": "./node_modules/@tsconfig/react-native/tsconfig.json"
"extends": "@react-native/typescript-config/tsconfig.json"
}