diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 3d107e31..91fdb20f 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -19,17 +19,22 @@ jobs:
uses: actions/setup-node@v3
with:
node-version: 16
- - name: -- Step 3 -- Use Expo action
+ - name: -- Step 3 -- Setup Java
+ uses: actions/setup-java@v3
+ with:
+ distribution: 'zulu'
+ java-version: '11'
+ - name: -- Step 4 -- Use Expo action
uses: expo/expo-github-action@v6
with:
expo-version: 5.x
username: ${{ secrets.EXPO_USERNAME }}
token: ${{ secrets.EXPO_TOKEN }}
- - name: -- Step 4 -- Install node dependencies
+ - name: -- Step 5 -- Install node dependencies
run: yarn install
- - name: -- Step 5 -- Install ruby dependencies
+ - name: -- Step 6 -- Install ruby dependencies
run: bundle install
- - name: -- Step 6 -- Run fastlane
+ - name: -- Step 7 -- Run fastlane
env:
DEVELOPER_DIR: /Applications/Xcode_13.3.1.app/Contents/Developer
ENVIRONMENT: ${{ steps.branch.outputs.branch }}
diff --git a/__tests__/components/Button.js b/__tests__/components/Button.js
deleted file mode 100644
index 9a2e0b8c..00000000
--- a/__tests__/components/Button.js
+++ /dev/null
@@ -1,96 +0,0 @@
-import React from 'react'
-import {
- toBeDisabled,
- toHaveStyle,
- toHaveTextContent
-} from '@testing-library/jest-native'
-import { cleanup, fireEvent, render } from '@testing-library/react-native/pure'
-
-import Button from '@components/Button'
-
-expect.extend({ toBeDisabled, toHaveStyle, toHaveTextContent })
-
-describe('Testing component button', () => {
- afterEach(cleanup)
-
- describe('static button', () => {
- it('with text only', () => {
- const onPress = jest.fn()
- const { getByTestId, toJSON } = render(
-
- )
- fireEvent.press(getByTestId('base'))
-
- expect(onPress).toHaveBeenCalled()
- expect(onPress).toHaveBeenCalledTimes(1)
- expect(getByTestId('text')).toHaveTextContent('Test Button')
- expect(toJSON()).toMatchSnapshot()
- })
-
- it('with icon only', () => {
- const onPress = jest.fn()
- const { getByTestId, toJSON } = render(
-
- )
- fireEvent.press(getByTestId('base'))
-
- expect(onPress).toHaveBeenCalled()
- expect(onPress).toHaveBeenCalledTimes(1)
- expect(toJSON()).toMatchSnapshot()
- })
-
- it('loading state', () => {
- const { getByTestId, toJSON } = render(
-
- )
-
- expect(getByTestId('base')).toBeDisabled()
- expect(toJSON()).toMatchSnapshot()
- })
-
- it('disabled state', () => {
- const { getByTestId, toJSON } = render(
-
- )
-
- expect(getByTestId('base')).toBeDisabled()
- expect(toJSON()).toMatchSnapshot()
- })
-
- it('apply custom styling', () => {
- const { getByTestId, toJSON } = render(
-
- )
-
- expect(getByTestId('base')).toHaveStyle({ backgroundColor: 'black' })
- expect(toJSON()).toMatchSnapshot()
- })
- })
-
- describe('dynamic button', () => {
- it('from default to loading', () => {
- const onPress = jest.fn()
- const { getByTestId, rerender } = render(
-
- )
- rerender()
-
- expect(getByTestId('base')).toBeDisabled()
- })
-
- it('from default to disabled', () => {
- const onPress = jest.fn()
- const { getByTestId, rerender } = render(
-
- )
- rerender()
-
- expect(getByTestId('base')).toBeDisabled()
- })
- })
-})
diff --git a/__tests__/components/Menu/Header.js b/__tests__/components/Menu/Header.js
deleted file mode 100644
index 057fce85..00000000
--- a/__tests__/components/Menu/Header.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import React from 'react'
-import { cleanup, render } from '@testing-library/react-native/pure'
-
-import MenuHeader from '@components/Menu/Header'
-
-describe('Testing component menu header', () => {
- afterEach(cleanup)
-
- it('with text only', () => {
- const { getByText, toJSON } = render()
-
- getByText('test')
- expect(toJSON()).toMatchSnapshot()
- })
-})
diff --git a/__tests__/components/Menu/Row.js b/__tests__/components/Menu/Row.js
deleted file mode 100644
index fec1d70b..00000000
--- a/__tests__/components/Menu/Row.js
+++ /dev/null
@@ -1,50 +0,0 @@
-import React from 'react'
-import { toBeDisabled } from '@testing-library/jest-native'
-import { cleanup, fireEvent, render } from '@testing-library/react-native'
-
-import MenuRow from '@components/Menu/Row'
-
-expect.extend({ toBeDisabled })
-
-describe('Testing component menu row', () => {
- afterEach(cleanup)
-
- it('with title only', () => {
- const { getByText, toJSON } = render()
- getByText('test title')
- expect(toJSON()).toMatchSnapshot()
- })
-
- it('with title and content', () => {
- const { getByText, toJSON } = render(
-
- )
- getByText('test title')
- getByText('test content')
- expect(toJSON()).toMatchSnapshot()
- })
-
- it('on press event', () => {
- const onPress = jest.fn()
- const { getByTestId, toJSON } = render(
-
- )
- fireEvent.press(getByTestId('base'))
-
- expect(onPress).toHaveBeenCalled()
- expect(onPress).toHaveBeenCalledTimes(1)
- expect(toJSON()).toMatchSnapshot()
- })
-
- it('loading state', () => {
- const onPress = jest.fn()
- const { getByTestId, toJSON } = render(
-
- )
- fireEvent.press(getByTestId('base'))
-
- expect(onPress).toHaveBeenCalledTimes(0)
- expect(getByTestId('base')).toBeDisabled()
- expect(toJSON()).toMatchSnapshot()
- })
-})
diff --git a/__tests__/components/Menu/__snapshots__/Header.js.snap b/__tests__/components/Menu/__snapshots__/Header.js.snap
deleted file mode 100644
index 077a9a17..00000000
--- a/__tests__/components/Menu/__snapshots__/Header.js.snap
+++ /dev/null
@@ -1,30 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Testing component menu header with text only 1`] = `
-
-
- test
-
-
-`;
diff --git a/__tests__/components/Menu/__snapshots__/Row.js.snap b/__tests__/components/Menu/__snapshots__/Row.js.snap
deleted file mode 100644
index 52661a5d..00000000
--- a/__tests__/components/Menu/__snapshots__/Row.js.snap
+++ /dev/null
@@ -1,302 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Testing component menu row loading state 1`] = `
-
-
-
-
-
- test
-
-
-
-
-
-`;
-
-exports[`Testing component menu row on press event 1`] = `
-
-
-
-
-
- test
-
-
-
-
-
-`;
-
-exports[`Testing component menu row with title and content 1`] = `
-
-
-
-
-
- test title
-
-
-
-
-
- test content
-
-
-
-
-`;
-
-exports[`Testing component menu row with title only 1`] = `
-
-
-
-
-
- test title
-
-
-
-
-
-`;
diff --git a/__tests__/components/Timelines/Timeline/Shared/Card.js b/__tests__/components/Timelines/Timeline/Shared/Card.js
deleted file mode 100644
index e43eecd9..00000000
--- a/__tests__/components/Timelines/Timeline/Shared/Card.js
+++ /dev/null
@@ -1,59 +0,0 @@
-import React from 'react'
-import {
- toBeDisabled,
- toContainElement,
- toHaveStyle,
- toHaveTextContent
-} from '@testing-library/jest-native'
-import { cleanup, render } from '@testing-library/react-native/pure'
-
-import Card from '@components/Timelines/Timeline/Shared/Card'
-
-expect.extend({
- toBeDisabled,
- toContainElement,
- toHaveStyle,
- toHaveTextContent
-})
-
-describe('Testing component timeline card', () => {
- afterEach(cleanup)
-
- it('with text only', () => {
- const { getByTestId, queryByTestId, toJSON } = render(
-
- )
-
- expect(queryByTestId('image')).toBeNull()
- expect(getByTestId('base')).toContainElement(getByTestId('title'))
- expect(queryByTestId('description')).toBeNull()
-
- expect(getByTestId('title')).toHaveTextContent('Title')
- expect(toJSON()).toMatchSnapshot()
- })
-
- it('with text and description', () => {
- const { getByTestId, queryByTestId, toJSON } = render(
-
- )
-
- expect(queryByTestId('image')).toBeNull()
- expect(getByTestId('base')).toContainElement(getByTestId('title'))
- expect(getByTestId('base')).toContainElement(getByTestId('description'))
-
- expect(getByTestId('title')).toHaveTextContent('Title')
- expect(getByTestId('description')).toHaveTextContent('Description')
- expect(toJSON()).toMatchSnapshot()
- })
-})
diff --git a/__tests__/components/Timelines/Timeline/Shared/__snapshots__/Card.js.snap b/__tests__/components/Timelines/Timeline/Shared/__snapshots__/Card.js.snap
deleted file mode 100644
index c9fd5e61..00000000
--- a/__tests__/components/Timelines/Timeline/Shared/__snapshots__/Card.js.snap
+++ /dev/null
@@ -1,155 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Testing component timeline card with text and description 1`] = `
-
-
-
- Title
-
-
- Description
-
-
- http://example.com
-
-
-
-`;
-
-exports[`Testing component timeline card with text only 1`] = `
-
-
-
- Title
-
-
- http://example.com
-
-
-
-`;
diff --git a/__tests__/components/__snapshots__/Button.js.snap b/__tests__/components/__snapshots__/Button.js.snap
deleted file mode 100644
index aa9be260..00000000
--- a/__tests__/components/__snapshots__/Button.js.snap
+++ /dev/null
@@ -1,474 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Testing component button static button apply custom styling 1`] = `
-
-
-
- test
-
-
-
-`;
-
-exports[`Testing component button static button disabled state 1`] = `
-
-
-
- test
-
-
-
-`;
-
-exports[`Testing component button static button loading state 1`] = `
-
-
-
- test
-
-
-
-
-
-
-
-
-
-
-
-
-
-`;
-
-exports[`Testing component button static button with icon only 1`] = `
-
-
-
-
-
-
-
-
-
-
-
-`;
-
-exports[`Testing component button static button with text only 1`] = `
-
-
-
- Test Button
-
-
-
-`;
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 0568f271..31495c9f 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -1,6 +1,7 @@
apply plugin: "com.android.application"
import com.android.build.OutputFile
+import org.apache.tools.ant.taskdefs.condition.Os
/**
* The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
@@ -79,7 +80,6 @@ import com.android.build.OutputFile
project.ext.react = [
enableHermes: (findProperty('expo.jsEngine') ?: "jsc") == "hermes",
- cliPath: new File(["node", "--print", "require.resolve('react-native/package.json')"].execute().text.trim(), "../cli.js")
]
apply from: new File(["node", "--print", "require.resolve('react-native/package.json')"].execute().text.trim(), "../react.gradle")
@@ -121,6 +121,14 @@ def jscFlavor = 'org.webkit:android-jsc:+'
*/
def enableHermes = project.ext.react.get("enableHermes", true);
+/**
+ * Architectures to build native code for.
+ */
+def reactNativeArchitectures() {
+ def value = project.getProperties().get("reactNativeArchitectures")
+ return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
+}
+
android {
ndkVersion rootProject.ext.ndkVersion
@@ -137,17 +145,86 @@ android {
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 50
versionName "0.2"
+ buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
+ if (isNewArchitectureEnabled()) {
+ // We configure the NDK build only if you decide to opt-in for the New Architecture.
+ externalNativeBuild {
+ ndkBuild {
+ arguments "APP_PLATFORM=android-21",
+ "APP_STL=c++_shared",
+ "NDK_TOOLCHAIN_VERSION=clang",
+ "GENERATED_SRC_DIR=$buildDir/generated/source",
+ "PROJECT_BUILD_DIR=$buildDir",
+ "REACT_ANDROID_DIR=$rootDir/../node_modules/react-native/ReactAndroid",
+ "REACT_ANDROID_BUILD_DIR=$rootDir/../node_modules/react-native/ReactAndroid/build"
+ cFlags "-Wall", "-Werror", "-fexceptions", "-frtti", "-DWITH_INSPECTOR=1"
+ cppFlags "-std=c++17"
+ // Make sure this target name is the same you specify inside the
+ // src/main/jni/Android.mk file for the `LOCAL_MODULE` variable.
+ targets "tooot_appmodules"
+ // Fix for windows limit on number of character in file paths and in command lines
+ if (Os.isFamily(Os.FAMILY_WINDOWS)) {
+ arguments "NDK_OUT=${rootProject.projectDir.getParent()}\\.cxx",
+ "NDK_APP_SHORT_COMMANDS=true"
+ }
+ }
+ }
+ if (!enableSeparateBuildPerCPUArchitecture) {
+ ndk {
+ abiFilters (*reactNativeArchitectures())
+ }
+ }
+ }
manifestPlaceholders = [
expoSDK: project.hasProperty('expoSDK') ? project.property('expoSDK') : "",
releaseChannel: project.hasProperty('releaseChannel') ? project.property('releaseChannel') : "default"
]
}
+ if (isNewArchitectureEnabled()) {
+ // We configure the NDK build only if you decide to opt-in for the New Architecture.
+ externalNativeBuild {
+ ndkBuild {
+ path "$projectDir/src/main/jni/Android.mk"
+ }
+ }
+ def reactAndroidProjectDir = project(':ReactAndroid').projectDir
+ def packageReactNdkDebugLibs = tasks.register("packageReactNdkDebugLibs", Copy) {
+ dependsOn(":ReactAndroid:packageReactNdkDebugLibsForBuck")
+ from("$reactAndroidProjectDir/src/main/jni/prebuilt/lib")
+ into("$buildDir/react-ndk/exported")
+ }
+ def packageReactNdkReleaseLibs = tasks.register("packageReactNdkReleaseLibs", Copy) {
+ dependsOn(":ReactAndroid:packageReactNdkReleaseLibsForBuck")
+ from("$reactAndroidProjectDir/src/main/jni/prebuilt/lib")
+ into("$buildDir/react-ndk/exported")
+ }
+ afterEvaluate {
+ // If you wish to add a custom TurboModule or component locally,
+ // you should uncomment this line.
+ // preBuild.dependsOn("generateCodegenArtifactsFromSchema")
+ preDebugBuild.dependsOn(packageReactNdkDebugLibs)
+ preReleaseBuild.dependsOn(packageReactNdkReleaseLibs)
+ // Due to a bug inside AGP, we have to explicitly set a dependency
+ // between configureNdkBuild* tasks and the preBuild tasks.
+ // This can be removed once this is solved: https://issuetracker.google.com/issues/207403732
+ configureNdkBuildRelease.dependsOn(preReleaseBuild)
+ configureNdkBuildDebug.dependsOn(preDebugBuild)
+ reactNativeArchitectures().each { architecture ->
+ tasks.findByName("configureNdkBuildDebug[${architecture}]")?.configure {
+ dependsOn("preDebugBuild")
+ }
+ tasks.findByName("configureNdkBuildRelease[${architecture}]")?.configure {
+ dependsOn("preReleaseBuild")
+ }
+ }
+ }
+ }
splits {
abi {
reset()
enable enableSeparateBuildPerCPUArchitecture
universalApk false // If true, also generate a universal APK
- include "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
+ include (*reactNativeArchitectures())
}
}
signingConfigs {
@@ -241,14 +318,34 @@ dependencies {
}
}
+if (isNewArchitectureEnabled()) {
+ // If new architecture is enabled, we let you build RN from source
+ // Otherwise we fallback to a prebuilt .aar bundled in the NPM package.
+ // This will be applied to all the imported transtitive dependency.
+ configurations.all {
+ resolutionStrategy.dependencySubstitution {
+ substitute(module("com.facebook.react:react-native"))
+ .using(project(":ReactAndroid")).because("On New Architecture we're building React Native from source")
+ }
+ }
+}
+
// Run this once to be able to run the application with BUCK
// puts all compile dependencies into folder libs for BUCK to use
task copyDownloadableDepsToLibs(type: Copy) {
- from configurations.compile
+ from configurations.implementation
into 'libs'
}
apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json')"].execute().text.trim(), "../native_modules.gradle");
applyNativeModulesAppBuildGradle(project)
+def isNewArchitectureEnabled() {
+ // To opt-in for the New Architecture, you can either:
+ // - Set `newArchEnabled` to true inside the `gradle.properties` file
+ // - Invoke gradle with `-newArchEnabled=true`
+ // - Set an environment variable `ORG_GRADLE_PROJECT_newArchEnabled=true`
+ return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true"
+}
+
apply plugin: 'com.google.gms.google-services'
diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml
index 32862006..80d6cfa1 100644
--- a/android/app/src/debug/AndroidManifest.xml
+++ b/android/app/src/debug/AndroidManifest.xml
@@ -7,6 +7,6 @@
android:usesCleartextTraffic="true"
tools:targetApi="28"
tools:ignore="GoogleAppIndexingWarning">
-
+
diff --git a/android/app/src/debug/java/com/tooot/ReactNativeFlipper.java b/android/app/src/debug/java/com/tooot/ReactNativeFlipper.java
index b65a923d..15f30c10 100644
--- a/android/app/src/debug/java/com/tooot/ReactNativeFlipper.java
+++ b/android/app/src/debug/java/com/tooot/ReactNativeFlipper.java
@@ -19,6 +19,7 @@ import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor;
import com.facebook.flipper.plugins.network.NetworkFlipperPlugin;
import com.facebook.flipper.plugins.react.ReactFlipperPlugin;
import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin;
+import com.facebook.react.ReactInstanceEventListener;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.modules.network.NetworkingModule;
@@ -48,7 +49,7 @@ public class ReactNativeFlipper {
ReactContext reactContext = reactInstanceManager.getCurrentReactContext();
if (reactContext == null) {
reactInstanceManager.addReactInstanceEventListener(
- new ReactInstanceManager.ReactInstanceEventListener() {
+ new ReactInstanceEventListener() {
@Override
public void onReactContextInitialized(ReactContext reactContext) {
reactInstanceManager.removeReactInstanceEventListener(this);
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 7a814b0f..f8d6647f 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -19,7 +19,7 @@
-
+
@@ -31,12 +31,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
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 3abbde29..69944bb8 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
@@ -13,12 +13,33 @@ public class MainActivity extends ReactActivity {
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 "main";
+ /**
+ * Returns the name of the main component registered from JavaScript.
+ * This is used to schedule rendering of the component.
+ */
+ @Override
+ protected String getMainComponentName() {
+ return "main";
+ }
+
+ /**
+ * Returns the instance of the {@link ReactActivityDelegate}. There the RootView is created and
+ * you can specify the rendered you wish to use (Fabric or the older renderer).
+ */
+ @Override
+ protected ReactActivityDelegate createReactActivityDelegate() {
+ return new ReactActivityDelegateWrapper(this, new MainActivityDelegate(this, getMainComponentName()));
+ }
+ public static class MainActivityDelegate extends ReactActivityDelegate {
+ public MainActivityDelegate(ReactActivity activity, String mainComponentName) {
+ super(activity, mainComponentName);
}
+ @Override
+ protected ReactRootView createRootView() {
+ ReactRootView reactRootView = new ReactRootView(getContext());
+ // If you opted-in for the New Architecture, we enable the Fabric Renderer.
+ reactRootView.setIsFabric(BuildConfig.IS_NEW_ARCHITECTURE_ENABLED);
+ return reactRootView;
+ }
+ }
}
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 0669a1bf..97c73b7a 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
@@ -10,6 +10,7 @@ import com.facebook.react.ReactApplication;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
+import com.facebook.react.config.ReactFeatureFlags;
import com.facebook.react.shell.MainReactPackage;
import com.facebook.soloader.SoLoader;
@@ -54,12 +55,19 @@ public class MainApplication extends Application implements ReactApplication {
@Override
public ReactNativeHost getReactNativeHost() {
+ // if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
+ // return mNewArchitectureNativeHost;
+ // } else {
+ // return mReactNativeHost;
+ // }
return mReactNativeHost;
}
@Override
public void onCreate() {
super.onCreate();
+ // If you opted-in for the New Architecture, we enable the TurboModule system
+ ReactFeatureFlags.useTurboModules = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED;
SoLoader.init(this, /* native exopackage */ false);
initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
diff --git a/android/build.gradle b/android/build.gradle
index 3e8039ac..d77937dc 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -1,13 +1,24 @@
+import org.apache.tools.ant.taskdefs.condition.Os
+
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext {
- buildToolsVersion = "30.0.2"
+ buildToolsVersion = "31.0.0"
minSdkVersion = 21
- compileSdkVersion = 30
- targetSdkVersion = 30
- ndkVersion = "21.4.7075529"
- kotlinVersion = '1.5.32'
+ compileSdkVersion = 31
+ targetSdkVersion = 31
+ if (System.properties['os.arch'] == "aarch64") {
+ // For M1 Users we need to use the NDK 24 which added support for aarch64
+ ndkVersion = "24.0.8215888"
+ } else if (Os.isFamily(Os.FAMILY_WINDOWS)) {
+ // For Android Users, we need to use NDK 23, otherwise the build will
+ // fail due to paths longer than the OS limit
+ ndkVersion = "23.1.7779620"
+ } else {
+ // Otherwise we default to the side-by-side NDK version from AGP.
+ ndkVersion = "21.4.7075529"
+ }
}
repositories {
google()
@@ -16,7 +27,9 @@ buildscript {
}
dependencies {
classpath 'com.google.gms:google-services:4.3.3'
- classpath("com.android.tools.build:gradle:4.2.0")
+ classpath("com.android.tools.build:gradle:7.0.4")
+ classpath("com.facebook.react:react-native-gradle-plugin")
+ classpath("de.undercouch:gradle-download-task:4.1.2")
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
diff --git a/android/gradle.properties b/android/gradle.properties
index 3f2121f6..2f0b0ba8 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -26,7 +26,18 @@ android.useAndroidX=true
android.enableJetifier=true
# Version of flipper SDK to use with React Native
-FLIPPER_VERSION=0.75.1
+FLIPPER_VERSION=0.125.0
+
+# Use this property to specify which architecture you want to build.
+# You can also override it from the CLI using
+# ./gradlew -PreactNativeArchitectures=x86_64
+reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64
+# Use this property to enable support to the new architecture.
+# This will allow you to use TurboModules and the Fabric render in
+# your application. You should enable this flag either if you want
+# to write custom TurboModules/Fabric components OR use libraries that
+# are providing them.
+newArchEnabled=false
org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=4096m -XX:+HeapDumpOnOutOfMemoryError
org.gradle.daemon=true
diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar
index 2c6137b8..7454180f 100644
Binary files a/android/gradle/wrapper/gradle-wrapper.jar and b/android/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
index 1f3fdbc5..669386b8 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.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/android/gradlew b/android/gradlew
index 2fe81a7d..051ac43b 100755
--- a/android/gradlew
+++ b/android/gradlew
@@ -1,4 +1,4 @@
-#!/usr/bin/env sh
+#!/bin/sh
#
# Copyright 2015 the original author or authors.
@@ -24,60 +24,51 @@
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
+app_path=$0
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
+APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
+APP_BASE_NAME=${0##*/}
# 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"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
+MAX_FD=maximum
warn () {
echo "$*"
-}
+} >&2
die () {
echo
echo "$*"
echo
exit 1
-}
+} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
-case "`uname`" in
- CYGWIN* )
- cygwin=true
- ;;
- Darwin* )
- darwin=true
- ;;
- MINGW* )
- msys=true
- ;;
- NONSTOP* )
- nonstop=true
- ;;
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
@@ -86,9 +77,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
- JAVACMD="$JAVA_HOME/jre/sh/java"
+ JAVACMD=$JAVA_HOME/jre/sh/java
else
- JAVACMD="$JAVA_HOME/bin/java"
+ JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -97,7 +88,7 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
- JAVACMD="java"
+ 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.
Please set the JAVA_HOME variable in your environment to match the
@@ -105,79 +96,91 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
- MAX_FD_LIMIT=`ulimit -H -n`
- if [ $? -eq 0 ] ; then
- if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
- MAX_FD="$MAX_FD_LIMIT"
- fi
- ulimit -n $MAX_FD
- if [ $? -ne 0 ] ; then
- warn "Could not set maximum file descriptor limit: $MAX_FD"
- fi
- else
- warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
- fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
- GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin or MSYS, switch paths to Windows format before running java
-if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
- APP_HOME=`cygpath --path --mixed "$APP_HOME"`
- CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
- JAVACMD=`cygpath --unix "$JAVACMD"`
-
- # We build the pattern for arguments to be converted via cygpath
- ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
- SEP=""
- for dir in $ROOTDIRSRAW ; do
- ROOTDIRS="$ROOTDIRS$SEP$dir"
- SEP="|"
- done
- OURCYGPATTERN="(^($ROOTDIRS))"
- # Add a user-defined pattern to the cygpath arguments
- if [ "$GRADLE_CYGPATTERN" != "" ] ; then
- OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
- fi
- # Now convert the arguments - kludge to limit ourselves to /bin/sh
- i=0
- for arg in "$@" ; do
- CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
- CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
-
- if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
- eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
- else
- eval `echo args$i`="\"$arg\""
- fi
- i=`expr $i + 1`
- done
- case $i in
- 0) set -- ;;
- 1) set -- "$args0" ;;
- 2) set -- "$args0" "$args1" ;;
- 3) set -- "$args0" "$args1" "$args2" ;;
- 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
-# Escape application args
-save () {
- for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
- echo " "
-}
-APP_ARGS=`save "$@"`
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
-# Collect all arguments for the java command, following the shell quoting and substitution rules
-eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
+ fi
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
+ done
+fi
+
+# 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
+# double quotes to make sure that they get re-expanded; and
+# * put everything else in single quotes, so that it's not re-expanded.
+set -- \
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
+ -classpath "$CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ "$@"
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+# set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"$@"'
exec "$JAVACMD" "$@"
diff --git a/android/settings.gradle b/android/settings.gradle
index cc93a0c0..715df6f2 100644
--- a/android/settings.gradle
+++ b/android/settings.gradle
@@ -7,3 +7,9 @@ apply from: new File(["node", "--print", "require.resolve('@react-native-communi
applyNativeModulesSettingsGradle(settings)
include ':app'
+
+includeBuild('../node_modules/react-native-gradle-plugin')
+if (settings.hasProperty("newArchEnabled") && settings.newArchEnabled == "true") {
+ include(":ReactAndroid")
+ project(":ReactAndroid").projectDir = file('../node_modules/react-native/ReactAndroid')
+}
diff --git a/app.config.ts b/app.config.ts
index 6a93b58a..c0114653 100644
--- a/app.config.ts
+++ b/app.config.ts
@@ -37,6 +37,7 @@ export default (): ExpoConfig => ({
android: {
package: 'com.xmflsct.app.tooot',
googleServicesFile: './configs/google-services.json',
- permissions: ['CAMERA', 'VIBRATE']
+ permissions: ['CAMERA', 'VIBRATE'],
+ blockedPermissions: ['USE_BIOMETRIC', 'USE_FINGERPRINT']
}
})
diff --git a/ios/Podfile b/ios/Podfile
index 96639ed2..fff36772 100644
--- a/ios/Podfile
+++ b/ios/Podfile
@@ -3,17 +3,32 @@ require File.join(File.dirname(`node --print "require.resolve('react-native/pack
require File.join(File.dirname(`node --print "require.resolve('@react-native-community/cli-platform-ios/package.json')"`), "native_modules")
platform :ios, '12.0'
+install! 'cocoapods', :deterministic_uuids => false
require 'json'
podfile_properties = JSON.parse(File.read('./Podfile.properties.json')) rescue {}
target 'tooot' do
use_expo_modules!
+ post_integrate do |installer|
+ begin
+ expo_patch_react_imports!(installer)
+ rescue => e
+ Pod::UI.warn e
+ end
+ end
+
config = use_native_modules!
+ # Flags change depending on the env values.
+ flags = get_default_flags()
+
use_react_native!(
:path => config[:reactNativePath],
- :hermes_enabled => podfile_properties['expo.jsEngine'] == 'hermes'
+ :hermes_enabled => podfile_properties['expo.jsEngine'] == 'hermes',
+ :fabric_enabled => flags[:fabric_enabled],
+ # An absolute path to your application root.
+ :app_path => "#{Pod::Config.instance.installation_root}/.."
)
# Enables Flipper.
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index 588aa9ea..c804af7a 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -1,125 +1,154 @@
PODS:
+ - ASN1Decoder (1.8.0)
- boost (1.76.0)
- DoubleConversion (1.1.6)
- - EXApplication (4.0.2):
+ - EASClient (0.2.1):
- ExpoModulesCore
- - EXAV (10.2.1):
+ - EXApplication (4.1.0):
- ExpoModulesCore
- - ReactCommon/turbomodule/core
- - EXConstants (13.0.2):
+ - EXAV (11.2.3):
- ExpoModulesCore
- - EXCrypto (10.1.2):
+ - React-runtimeexecutor
+ - ReactCommon
+ - EXConstants (13.1.1):
- ExpoModulesCore
- - EXDevice (4.1.1):
+ - EXDevice (4.2.0):
- ExpoModulesCore
- - EXErrorRecovery (3.0.5):
+ - EXErrorRecovery (3.1.0):
- ExpoModulesCore
- - EXFileSystem (13.2.0):
+ - EXFileSystem (14.0.0):
- ExpoModulesCore
- - EXFirebaseAnalytics (6.0.1):
+ - EXFirebaseAnalytics (7.0.0):
- EXFirebaseCore
- ExpoModulesCore
- - Firebase/Core (= 7.7.0)
- - EXFirebaseCore (4.1.1):
+ - Firebase/Core (= 8.14.0)
+ - EXFirebaseCore (5.0.0):
- ExpoModulesCore
- - Firebase/Core (= 7.7.0)
- - EXFont (10.0.5):
+ - Firebase/Core (= 8.14.0)
+ - EXFont (10.1.0):
- ExpoModulesCore
- - EXImageLoader (3.1.1):
+ - EXImageLoader (3.2.0):
- ExpoModulesCore
- React-Core
- - EXImageManipulator (10.2.1):
+ - EXJSONUtils (0.3.0)
+ - EXManifests (0.3.0):
+ - EXJSONUtils
+ - EXNotifications (0.15.2):
+ - ExpoModulesCore
+ - Expo (45.0.1):
+ - ExpoModulesCore
+ - ExpoCrypto (10.2.0):
+ - ExpoModulesCore
+ - ExpoHaptics (11.2.0):
+ - ExpoModulesCore
+ - ExpoImageManipulator (10.3.1):
- EXImageLoader
- ExpoModulesCore
- - EXImagePicker (12.0.2):
+ - ExpoImagePicker (13.1.1):
- ExpoModulesCore
- - EXJSONUtils (0.2.1)
- - EXKeepAwake (10.0.2):
+ - ExpoKeepAwake (10.1.1):
- ExpoModulesCore
- - EXManifests (0.2.4):
- - EXJSONUtils
- - EXNotifications (0.14.1):
+ - ExpoLocalization (13.0.0):
- ExpoModulesCore
- - Expo (44.0.6):
- - ExpoModulesCore
- - ExpoHaptics (11.1.1):
- - ExpoModulesCore
- - ExpoLocalization (12.0.1):
- - ExpoModulesCore
- - ExpoModulesCore (0.6.5):
+ - ExpoModulesCore (0.9.1):
- React-Core
- ReactCommon/turbomodule/core
- - EXRandom (12.1.2):
- - React-Core
- - EXScreenCapture (4.1.1):
+ - ExpoRandom (12.2.0):
- ExpoModulesCore
- - EXSecureStore (11.1.1):
+ - ExpoWebBrowser (10.2.0):
- ExpoModulesCore
- - EXSplashScreen (0.14.2):
+ - EXScreenCapture (4.2.0):
+ - ExpoModulesCore
+ - EXSecureStore (11.2.0):
+ - ExpoModulesCore
+ - EXSplashScreen (0.15.1):
- ExpoModulesCore
- React-Core
- - EXStoreReview (5.1.1):
+ - EXStoreReview (5.2.0):
- ExpoModulesCore
- - EXStructuredHeaders (2.1.1)
- - EXUpdates (0.11.6):
+ - EXStructuredHeaders (2.2.1)
+ - EXUpdates (0.13.1):
+ - ASN1Decoder (~> 1.8)
+ - EASClient
- EXManifests
- ExpoModulesCore
- EXStructuredHeaders
- EXUpdatesInterface
- React-Core
- - EXUpdatesInterface (0.5.1)
- - EXVideoThumbnails (6.2.0):
+ - EXUpdatesInterface (0.6.0)
+ - EXVideoThumbnails (6.3.0):
- ExpoModulesCore
- - EXWebBrowser (10.1.1):
- - ExpoModulesCore
- - FBLazyVector (0.67.4)
- - FBReactNativeSpec (0.67.4):
+ - FBLazyVector (0.68.1)
+ - FBReactNativeSpec (0.68.1):
- RCT-Folly (= 2021.06.28.00-v2)
- - RCTRequired (= 0.67.4)
- - RCTTypeSafety (= 0.67.4)
- - React-Core (= 0.67.4)
- - React-jsi (= 0.67.4)
- - ReactCommon/turbomodule/core (= 0.67.4)
- - Firebase/Core (7.7.0):
+ - RCTRequired (= 0.68.1)
+ - RCTTypeSafety (= 0.68.1)
+ - React-Core (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - ReactCommon/turbomodule/core (= 0.68.1)
+ - Firebase/Core (8.14.0):
- Firebase/CoreOnly
- - FirebaseAnalytics (= 7.7.0)
- - Firebase/CoreOnly (7.7.0):
- - FirebaseCore (= 7.7.0)
- - FirebaseAnalytics (7.7.0):
- - FirebaseCore (~> 7.0)
- - FirebaseInstallations (~> 7.0)
- - GoogleAppMeasurement (= 7.7.0)
- - GoogleUtilities/AppDelegateSwizzler (~> 7.0)
- - GoogleUtilities/MethodSwizzler (~> 7.0)
- - GoogleUtilities/Network (~> 7.0)
- - "GoogleUtilities/NSData+zlib (~> 7.0)"
- - nanopb (~> 2.30907.0)
- - FirebaseCore (7.7.0):
- - FirebaseCoreDiagnostics (~> 7.4)
- - GoogleUtilities/Environment (~> 7.0)
- - GoogleUtilities/Logger (~> 7.0)
- - FirebaseCoreDiagnostics (7.9.0):
- - GoogleDataTransport (~> 8.0)
- - GoogleUtilities/Environment (~> 7.0)
- - GoogleUtilities/Logger (~> 7.0)
- - nanopb (~> 2.30907.0)
- - FirebaseInstallations (7.11.0):
- - FirebaseCore (~> 7.0)
- - GoogleUtilities/Environment (~> 7.0)
- - GoogleUtilities/UserDefaults (~> 7.0)
- - PromisesObjC (~> 1.2)
+ - FirebaseAnalytics (~> 8.14.0)
+ - Firebase/CoreOnly (8.14.0):
+ - FirebaseCore (= 8.14.0)
+ - FirebaseAnalytics (8.14.0):
+ - FirebaseAnalytics/AdIdSupport (= 8.14.0)
+ - FirebaseCore (~> 8.0)
+ - FirebaseInstallations (~> 8.0)
+ - GoogleUtilities/AppDelegateSwizzler (~> 7.7)
+ - GoogleUtilities/MethodSwizzler (~> 7.7)
+ - GoogleUtilities/Network (~> 7.7)
+ - "GoogleUtilities/NSData+zlib (~> 7.7)"
+ - nanopb (~> 2.30908.0)
+ - FirebaseAnalytics/AdIdSupport (8.14.0):
+ - FirebaseCore (~> 8.0)
+ - FirebaseInstallations (~> 8.0)
+ - GoogleAppMeasurement (= 8.14.0)
+ - GoogleUtilities/AppDelegateSwizzler (~> 7.7)
+ - GoogleUtilities/MethodSwizzler (~> 7.7)
+ - GoogleUtilities/Network (~> 7.7)
+ - "GoogleUtilities/NSData+zlib (~> 7.7)"
+ - nanopb (~> 2.30908.0)
+ - FirebaseCore (8.14.0):
+ - FirebaseCoreDiagnostics (~> 8.0)
+ - GoogleUtilities/Environment (~> 7.7)
+ - GoogleUtilities/Logger (~> 7.7)
+ - FirebaseCoreDiagnostics (8.15.0):
+ - GoogleDataTransport (~> 9.1)
+ - GoogleUtilities/Environment (~> 7.7)
+ - GoogleUtilities/Logger (~> 7.7)
+ - nanopb (~> 2.30908.0)
+ - FirebaseInstallations (8.15.0):
+ - FirebaseCore (~> 8.0)
+ - GoogleUtilities/Environment (~> 7.7)
+ - GoogleUtilities/UserDefaults (~> 7.7)
+ - PromisesObjC (< 3.0, >= 1.2)
- fmt (6.2.1)
- glog (0.3.5)
- - GoogleAppMeasurement (7.7.0):
- - GoogleUtilities/AppDelegateSwizzler (~> 7.0)
- - GoogleUtilities/MethodSwizzler (~> 7.0)
- - GoogleUtilities/Network (~> 7.0)
- - "GoogleUtilities/NSData+zlib (~> 7.0)"
- - nanopb (~> 2.30907.0)
- - GoogleDataTransport (8.3.1):
- - GoogleUtilities/Environment (~> 7.2)
- - nanopb (~> 2.30907.0)
- - PromisesObjC (~> 1.2)
+ - GoogleAppMeasurement (8.14.0):
+ - GoogleAppMeasurement/AdIdSupport (= 8.14.0)
+ - GoogleUtilities/AppDelegateSwizzler (~> 7.7)
+ - GoogleUtilities/MethodSwizzler (~> 7.7)
+ - GoogleUtilities/Network (~> 7.7)
+ - "GoogleUtilities/NSData+zlib (~> 7.7)"
+ - nanopb (~> 2.30908.0)
+ - GoogleAppMeasurement/AdIdSupport (8.14.0):
+ - GoogleAppMeasurement/WithoutAdIdSupport (= 8.14.0)
+ - GoogleUtilities/AppDelegateSwizzler (~> 7.7)
+ - GoogleUtilities/MethodSwizzler (~> 7.7)
+ - GoogleUtilities/Network (~> 7.7)
+ - "GoogleUtilities/NSData+zlib (~> 7.7)"
+ - nanopb (~> 2.30908.0)
+ - GoogleAppMeasurement/WithoutAdIdSupport (8.14.0):
+ - GoogleUtilities/AppDelegateSwizzler (~> 7.7)
+ - GoogleUtilities/MethodSwizzler (~> 7.7)
+ - GoogleUtilities/Network (~> 7.7)
+ - "GoogleUtilities/NSData+zlib (~> 7.7)"
+ - nanopb (~> 2.30908.0)
+ - GoogleDataTransport (9.1.4):
+ - GoogleUtilities/Environment (~> 7.7)
+ - nanopb (< 2.30910.0, >= 2.30908.0)
+ - PromisesObjC (< 3.0, >= 1.2)
- GoogleUtilities/AppDelegateSwizzler (7.7.0):
- GoogleUtilities/Environment
- GoogleUtilities/Logger
@@ -139,7 +168,7 @@ PODS:
- GoogleUtilities/Logger
- GoogleUtilities/UserDefaults (7.7.0):
- GoogleUtilities/Logger
- - hermes-engine (0.9.0)
+ - hermes-engine (0.11.0)
- libevent (2.1.12)
- libwebp (1.2.1):
- libwebp/demux (= 1.2.1)
@@ -150,12 +179,12 @@ PODS:
- libwebp/mux (1.2.1):
- libwebp/demux
- 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)
+ - nanopb (2.30908.0):
+ - nanopb/decode (= 2.30908.0)
+ - nanopb/encode (= 2.30908.0)
+ - nanopb/decode (2.30908.0)
+ - nanopb/encode (2.30908.0)
+ - PromisesObjC (2.1.0)
- RCT-Folly (2021.06.28.00-v2):
- boost
- DoubleConversion
@@ -173,203 +202,212 @@ PODS:
- fmt (~> 6.2.1)
- glog
- libevent
- - RCTRequired (0.67.4)
- - RCTTypeSafety (0.67.4):
- - FBLazyVector (= 0.67.4)
+ - RCTRequired (0.68.1)
+ - RCTTypeSafety (0.68.1):
+ - FBLazyVector (= 0.68.1)
- RCT-Folly (= 2021.06.28.00-v2)
- - RCTRequired (= 0.67.4)
- - React-Core (= 0.67.4)
- - React (0.67.4):
- - React-Core (= 0.67.4)
- - React-Core/DevSupport (= 0.67.4)
- - React-Core/RCTWebSocket (= 0.67.4)
- - React-RCTActionSheet (= 0.67.4)
- - React-RCTAnimation (= 0.67.4)
- - React-RCTBlob (= 0.67.4)
- - React-RCTImage (= 0.67.4)
- - React-RCTLinking (= 0.67.4)
- - React-RCTNetwork (= 0.67.4)
- - React-RCTSettings (= 0.67.4)
- - React-RCTText (= 0.67.4)
- - React-RCTVibration (= 0.67.4)
- - React-callinvoker (0.67.4)
- - React-Core (0.67.4):
+ - RCTRequired (= 0.68.1)
+ - React-Core (= 0.68.1)
+ - React (0.68.1):
+ - React-Core (= 0.68.1)
+ - React-Core/DevSupport (= 0.68.1)
+ - React-Core/RCTWebSocket (= 0.68.1)
+ - React-RCTActionSheet (= 0.68.1)
+ - React-RCTAnimation (= 0.68.1)
+ - React-RCTBlob (= 0.68.1)
+ - React-RCTImage (= 0.68.1)
+ - React-RCTLinking (= 0.68.1)
+ - React-RCTNetwork (= 0.68.1)
+ - React-RCTSettings (= 0.68.1)
+ - React-RCTText (= 0.68.1)
+ - React-RCTVibration (= 0.68.1)
+ - React-callinvoker (0.68.1)
+ - React-Codegen (0.68.1):
+ - FBReactNativeSpec (= 0.68.1)
+ - RCT-Folly (= 2021.06.28.00-v2)
+ - RCTRequired (= 0.68.1)
+ - RCTTypeSafety (= 0.68.1)
+ - React-Core (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - React-jsiexecutor (= 0.68.1)
+ - ReactCommon/turbomodule/core (= 0.68.1)
+ - React-Core (0.68.1):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- - React-Core/Default (= 0.67.4)
- - React-cxxreact (= 0.67.4)
- - React-jsi (= 0.67.4)
- - React-jsiexecutor (= 0.67.4)
- - React-perflogger (= 0.67.4)
+ - React-Core/Default (= 0.68.1)
+ - React-cxxreact (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - React-jsiexecutor (= 0.68.1)
+ - React-perflogger (= 0.68.1)
- Yoga
- - React-Core/CoreModulesHeaders (0.67.4):
+ - React-Core/CoreModulesHeaders (0.68.1):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- - React-cxxreact (= 0.67.4)
- - React-jsi (= 0.67.4)
- - React-jsiexecutor (= 0.67.4)
- - React-perflogger (= 0.67.4)
+ - React-cxxreact (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - React-jsiexecutor (= 0.68.1)
+ - React-perflogger (= 0.68.1)
- Yoga
- - React-Core/Default (0.67.4):
+ - React-Core/Default (0.68.1):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- - React-cxxreact (= 0.67.4)
- - React-jsi (= 0.67.4)
- - React-jsiexecutor (= 0.67.4)
- - React-perflogger (= 0.67.4)
+ - React-cxxreact (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - React-jsiexecutor (= 0.68.1)
+ - React-perflogger (= 0.68.1)
- Yoga
- - React-Core/DevSupport (0.67.4):
+ - React-Core/DevSupport (0.68.1):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- - React-Core/Default (= 0.67.4)
- - React-Core/RCTWebSocket (= 0.67.4)
- - React-cxxreact (= 0.67.4)
- - React-jsi (= 0.67.4)
- - React-jsiexecutor (= 0.67.4)
- - React-jsinspector (= 0.67.4)
- - React-perflogger (= 0.67.4)
+ - React-Core/Default (= 0.68.1)
+ - React-Core/RCTWebSocket (= 0.68.1)
+ - React-cxxreact (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - React-jsiexecutor (= 0.68.1)
+ - React-jsinspector (= 0.68.1)
+ - React-perflogger (= 0.68.1)
- Yoga
- - React-Core/RCTActionSheetHeaders (0.67.4):
+ - React-Core/RCTActionSheetHeaders (0.68.1):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- - React-cxxreact (= 0.67.4)
- - React-jsi (= 0.67.4)
- - React-jsiexecutor (= 0.67.4)
- - React-perflogger (= 0.67.4)
+ - React-cxxreact (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - React-jsiexecutor (= 0.68.1)
+ - React-perflogger (= 0.68.1)
- Yoga
- - React-Core/RCTAnimationHeaders (0.67.4):
+ - React-Core/RCTAnimationHeaders (0.68.1):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- - React-cxxreact (= 0.67.4)
- - React-jsi (= 0.67.4)
- - React-jsiexecutor (= 0.67.4)
- - React-perflogger (= 0.67.4)
+ - React-cxxreact (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - React-jsiexecutor (= 0.68.1)
+ - React-perflogger (= 0.68.1)
- Yoga
- - React-Core/RCTBlobHeaders (0.67.4):
+ - React-Core/RCTBlobHeaders (0.68.1):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- - React-cxxreact (= 0.67.4)
- - React-jsi (= 0.67.4)
- - React-jsiexecutor (= 0.67.4)
- - React-perflogger (= 0.67.4)
+ - React-cxxreact (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - React-jsiexecutor (= 0.68.1)
+ - React-perflogger (= 0.68.1)
- Yoga
- - React-Core/RCTImageHeaders (0.67.4):
+ - React-Core/RCTImageHeaders (0.68.1):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- - React-cxxreact (= 0.67.4)
- - React-jsi (= 0.67.4)
- - React-jsiexecutor (= 0.67.4)
- - React-perflogger (= 0.67.4)
+ - React-cxxreact (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - React-jsiexecutor (= 0.68.1)
+ - React-perflogger (= 0.68.1)
- Yoga
- - React-Core/RCTLinkingHeaders (0.67.4):
+ - React-Core/RCTLinkingHeaders (0.68.1):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- - React-cxxreact (= 0.67.4)
- - React-jsi (= 0.67.4)
- - React-jsiexecutor (= 0.67.4)
- - React-perflogger (= 0.67.4)
+ - React-cxxreact (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - React-jsiexecutor (= 0.68.1)
+ - React-perflogger (= 0.68.1)
- Yoga
- - React-Core/RCTNetworkHeaders (0.67.4):
+ - React-Core/RCTNetworkHeaders (0.68.1):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- - React-cxxreact (= 0.67.4)
- - React-jsi (= 0.67.4)
- - React-jsiexecutor (= 0.67.4)
- - React-perflogger (= 0.67.4)
+ - React-cxxreact (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - React-jsiexecutor (= 0.68.1)
+ - React-perflogger (= 0.68.1)
- Yoga
- - React-Core/RCTSettingsHeaders (0.67.4):
+ - React-Core/RCTSettingsHeaders (0.68.1):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- - React-cxxreact (= 0.67.4)
- - React-jsi (= 0.67.4)
- - React-jsiexecutor (= 0.67.4)
- - React-perflogger (= 0.67.4)
+ - React-cxxreact (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - React-jsiexecutor (= 0.68.1)
+ - React-perflogger (= 0.68.1)
- Yoga
- - React-Core/RCTTextHeaders (0.67.4):
+ - React-Core/RCTTextHeaders (0.68.1):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- - React-cxxreact (= 0.67.4)
- - React-jsi (= 0.67.4)
- - React-jsiexecutor (= 0.67.4)
- - React-perflogger (= 0.67.4)
+ - React-cxxreact (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - React-jsiexecutor (= 0.68.1)
+ - React-perflogger (= 0.68.1)
- Yoga
- - React-Core/RCTVibrationHeaders (0.67.4):
+ - React-Core/RCTVibrationHeaders (0.68.1):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- - React-cxxreact (= 0.67.4)
- - React-jsi (= 0.67.4)
- - React-jsiexecutor (= 0.67.4)
- - React-perflogger (= 0.67.4)
+ - React-cxxreact (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - React-jsiexecutor (= 0.68.1)
+ - React-perflogger (= 0.68.1)
- Yoga
- - React-Core/RCTWebSocket (0.67.4):
+ - React-Core/RCTWebSocket (0.68.1):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- - React-Core/Default (= 0.67.4)
- - React-cxxreact (= 0.67.4)
- - React-jsi (= 0.67.4)
- - React-jsiexecutor (= 0.67.4)
- - React-perflogger (= 0.67.4)
+ - React-Core/Default (= 0.68.1)
+ - React-cxxreact (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - React-jsiexecutor (= 0.68.1)
+ - React-perflogger (= 0.68.1)
- Yoga
- - React-CoreModules (0.67.4):
- - FBReactNativeSpec (= 0.67.4)
+ - React-CoreModules (0.68.1):
- RCT-Folly (= 2021.06.28.00-v2)
- - RCTTypeSafety (= 0.67.4)
- - React-Core/CoreModulesHeaders (= 0.67.4)
- - React-jsi (= 0.67.4)
- - React-RCTImage (= 0.67.4)
- - ReactCommon/turbomodule/core (= 0.67.4)
- - React-cxxreact (0.67.4):
+ - RCTTypeSafety (= 0.68.1)
+ - React-Codegen (= 0.68.1)
+ - React-Core/CoreModulesHeaders (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - React-RCTImage (= 0.68.1)
+ - ReactCommon/turbomodule/core (= 0.68.1)
+ - React-cxxreact (0.68.1):
- boost (= 1.76.0)
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- - React-callinvoker (= 0.67.4)
- - React-jsi (= 0.67.4)
- - React-jsinspector (= 0.67.4)
- - React-logger (= 0.67.4)
- - React-perflogger (= 0.67.4)
- - React-runtimeexecutor (= 0.67.4)
- - React-hermes (0.67.4):
+ - React-callinvoker (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - React-jsinspector (= 0.68.1)
+ - React-logger (= 0.68.1)
+ - React-perflogger (= 0.68.1)
+ - React-runtimeexecutor (= 0.68.1)
+ - React-hermes (0.68.1):
- DoubleConversion
- glog
- hermes-engine
- RCT-Folly (= 2021.06.28.00-v2)
- RCT-Folly/Futures (= 2021.06.28.00-v2)
- - React-cxxreact (= 0.67.4)
- - React-jsi (= 0.67.4)
- - React-jsiexecutor (= 0.67.4)
- - React-jsinspector (= 0.67.4)
- - React-perflogger (= 0.67.4)
- - React-jsi (0.67.4):
+ - React-cxxreact (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - React-jsiexecutor (= 0.68.1)
+ - React-jsinspector (= 0.68.1)
+ - React-perflogger (= 0.68.1)
+ - React-jsi (0.68.1):
- boost (= 1.76.0)
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- - React-jsi/Default (= 0.67.4)
- - React-jsi/Default (0.67.4):
+ - React-jsi/Default (= 0.68.1)
+ - React-jsi/Default (0.68.1):
- boost (= 1.76.0)
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- - React-jsiexecutor (0.67.4):
+ - React-jsiexecutor (0.68.1):
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- - React-cxxreact (= 0.67.4)
- - React-jsi (= 0.67.4)
- - React-perflogger (= 0.67.4)
- - React-jsinspector (0.67.4)
- - React-logger (0.67.4):
+ - React-cxxreact (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - React-perflogger (= 0.68.1)
+ - React-jsinspector (0.68.1)
+ - React-logger (0.68.1):
- glog
- react-native-blur (0.8.0):
- React
@@ -377,6 +415,8 @@ PODS:
- React-Core
- react-native-cameraroll (4.1.2):
- React-Core
+ - react-native-image-keyboard (2.2.0):
+ - React
- react-native-netinfo (8.3.0):
- React-Core
- react-native-pager-view (5.4.11):
@@ -389,78 +429,107 @@ PODS:
- ReactCommon/turbomodule/core
- react-native-segmented-control (2.2.2):
- React-Core
- - React-perflogger (0.67.4)
- - React-RCTActionSheet (0.67.4):
- - React-Core/RCTActionSheetHeaders (= 0.67.4)
- - React-RCTAnimation (0.67.4):
- - FBReactNativeSpec (= 0.67.4)
+ - React-perflogger (0.68.1)
+ - React-RCTActionSheet (0.68.1):
+ - React-Core/RCTActionSheetHeaders (= 0.68.1)
+ - React-RCTAnimation (0.68.1):
- RCT-Folly (= 2021.06.28.00-v2)
- - RCTTypeSafety (= 0.67.4)
- - React-Core/RCTAnimationHeaders (= 0.67.4)
- - React-jsi (= 0.67.4)
- - ReactCommon/turbomodule/core (= 0.67.4)
- - React-RCTBlob (0.67.4):
- - FBReactNativeSpec (= 0.67.4)
+ - RCTTypeSafety (= 0.68.1)
+ - React-Codegen (= 0.68.1)
+ - React-Core/RCTAnimationHeaders (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - ReactCommon/turbomodule/core (= 0.68.1)
+ - React-RCTBlob (0.68.1):
- RCT-Folly (= 2021.06.28.00-v2)
- - React-Core/RCTBlobHeaders (= 0.67.4)
- - React-Core/RCTWebSocket (= 0.67.4)
- - React-jsi (= 0.67.4)
- - React-RCTNetwork (= 0.67.4)
- - ReactCommon/turbomodule/core (= 0.67.4)
- - React-RCTImage (0.67.4):
- - FBReactNativeSpec (= 0.67.4)
+ - React-Codegen (= 0.68.1)
+ - React-Core/RCTBlobHeaders (= 0.68.1)
+ - React-Core/RCTWebSocket (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - React-RCTNetwork (= 0.68.1)
+ - ReactCommon/turbomodule/core (= 0.68.1)
+ - React-RCTImage (0.68.1):
- RCT-Folly (= 2021.06.28.00-v2)
- - RCTTypeSafety (= 0.67.4)
- - React-Core/RCTImageHeaders (= 0.67.4)
- - React-jsi (= 0.67.4)
- - React-RCTNetwork (= 0.67.4)
- - ReactCommon/turbomodule/core (= 0.67.4)
- - React-RCTLinking (0.67.4):
- - FBReactNativeSpec (= 0.67.4)
- - React-Core/RCTLinkingHeaders (= 0.67.4)
- - React-jsi (= 0.67.4)
- - ReactCommon/turbomodule/core (= 0.67.4)
- - React-RCTNetwork (0.67.4):
- - FBReactNativeSpec (= 0.67.4)
+ - RCTTypeSafety (= 0.68.1)
+ - React-Codegen (= 0.68.1)
+ - React-Core/RCTImageHeaders (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - React-RCTNetwork (= 0.68.1)
+ - ReactCommon/turbomodule/core (= 0.68.1)
+ - React-RCTLinking (0.68.1):
+ - React-Codegen (= 0.68.1)
+ - React-Core/RCTLinkingHeaders (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - ReactCommon/turbomodule/core (= 0.68.1)
+ - React-RCTNetwork (0.68.1):
- RCT-Folly (= 2021.06.28.00-v2)
- - RCTTypeSafety (= 0.67.4)
- - React-Core/RCTNetworkHeaders (= 0.67.4)
- - React-jsi (= 0.67.4)
- - ReactCommon/turbomodule/core (= 0.67.4)
- - React-RCTSettings (0.67.4):
- - FBReactNativeSpec (= 0.67.4)
+ - RCTTypeSafety (= 0.68.1)
+ - React-Codegen (= 0.68.1)
+ - React-Core/RCTNetworkHeaders (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - ReactCommon/turbomodule/core (= 0.68.1)
+ - React-RCTSettings (0.68.1):
- RCT-Folly (= 2021.06.28.00-v2)
- - RCTTypeSafety (= 0.67.4)
- - React-Core/RCTSettingsHeaders (= 0.67.4)
- - React-jsi (= 0.67.4)
- - ReactCommon/turbomodule/core (= 0.67.4)
- - React-RCTText (0.67.4):
- - React-Core/RCTTextHeaders (= 0.67.4)
- - React-RCTVibration (0.67.4):
- - FBReactNativeSpec (= 0.67.4)
+ - RCTTypeSafety (= 0.68.1)
+ - React-Codegen (= 0.68.1)
+ - React-Core/RCTSettingsHeaders (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - ReactCommon/turbomodule/core (= 0.68.1)
+ - React-RCTText (0.68.1):
+ - React-Core/RCTTextHeaders (= 0.68.1)
+ - React-RCTVibration (0.68.1):
- RCT-Folly (= 2021.06.28.00-v2)
- - React-Core/RCTVibrationHeaders (= 0.67.4)
- - React-jsi (= 0.67.4)
- - ReactCommon/turbomodule/core (= 0.67.4)
- - React-runtimeexecutor (0.67.4):
- - React-jsi (= 0.67.4)
- - ReactCommon/turbomodule/core (0.67.4):
+ - React-Codegen (= 0.68.1)
+ - React-Core/RCTVibrationHeaders (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - ReactCommon/turbomodule/core (= 0.68.1)
+ - React-runtimeexecutor (0.68.1):
+ - React-jsi (= 0.68.1)
+ - ReactCommon (0.68.1):
+ - React-logger (= 0.68.1)
+ - ReactCommon/react_debug_core (= 0.68.1)
+ - ReactCommon/turbomodule (= 0.68.1)
+ - ReactCommon/react_debug_core (0.68.1):
+ - React-logger (= 0.68.1)
+ - ReactCommon/turbomodule (0.68.1):
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- - React-callinvoker (= 0.67.4)
- - React-Core (= 0.67.4)
- - React-cxxreact (= 0.67.4)
- - React-jsi (= 0.67.4)
- - React-logger (= 0.67.4)
- - React-perflogger (= 0.67.4)
+ - React-callinvoker (= 0.68.1)
+ - React-Core (= 0.68.1)
+ - React-cxxreact (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - React-logger (= 0.68.1)
+ - React-perflogger (= 0.68.1)
+ - ReactCommon/turbomodule/core (= 0.68.1)
+ - ReactCommon/turbomodule/samples (= 0.68.1)
+ - ReactCommon/turbomodule/core (0.68.1):
+ - DoubleConversion
+ - glog
+ - RCT-Folly (= 2021.06.28.00-v2)
+ - React-callinvoker (= 0.68.1)
+ - React-Core (= 0.68.1)
+ - React-cxxreact (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - React-logger (= 0.68.1)
+ - React-perflogger (= 0.68.1)
+ - ReactCommon/turbomodule/samples (0.68.1):
+ - DoubleConversion
+ - glog
+ - RCT-Folly (= 2021.06.28.00-v2)
+ - React-callinvoker (= 0.68.1)
+ - React-Core (= 0.68.1)
+ - React-cxxreact (= 0.68.1)
+ - React-jsi (= 0.68.1)
+ - React-logger (= 0.68.1)
+ - React-perflogger (= 0.68.1)
+ - ReactCommon/turbomodule/core (= 0.68.1)
- RNCAsyncStorage (1.17.3):
- React-Core
- RNFastImage (8.5.11):
- React-Core
- SDWebImage (~> 5.12.5)
- SDWebImageWebPCoder (~> 0.8.4)
- - RNGestureHandler (2.4.1):
+ - RNGestureHandler (2.4.2):
- React-Core
- RNReanimated (2.8.0):
- DoubleConversion
@@ -492,7 +561,7 @@ PODS:
- RNScreens (3.13.1):
- React-Core
- React-RCTImage
- - RNSentry (3.4.1):
+ - RNSentry (3.4.2):
- React-Core
- Sentry (= 7.11.0)
- RNShareMenu (5.0.5):
@@ -508,17 +577,15 @@ PODS:
- Sentry (7.11.0):
- Sentry/Core (= 7.11.0)
- Sentry/Core (7.11.0)
- - UMTaskManagerInterface (7.1.1):
- - 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`)
+ - EASClient (from `../node_modules/expo-eas-client/ios`)
- EXApplication (from `../node_modules/expo-application/ios`)
- EXAV (from `../node_modules/expo-av/ios`)
- EXConstants (from `../node_modules/expo-constants/ios`)
- - EXCrypto (from `../node_modules/expo-crypto/ios`)
- EXDevice (from `../node_modules/expo-device/ios`)
- EXErrorRecovery (from `../node_modules/expo-error-recovery/ios`)
- EXFileSystem (from `../node_modules/expo-file-system/ios`)
@@ -526,17 +593,19 @@ DEPENDENCIES:
- EXFirebaseCore (from `../node_modules/expo-firebase-core/ios`)
- EXFont (from `../node_modules/expo-font/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`)
- EXManifests (from `../node_modules/expo-manifests/ios`)
- EXNotifications (from `../node_modules/expo-notifications/ios`)
- Expo (from `../node_modules/expo/ios`)
+ - ExpoCrypto (from `../node_modules/expo-crypto/ios`)
- ExpoHaptics (from `../node_modules/expo-haptics/ios`)
+ - ExpoImageManipulator (from `../node_modules/expo-image-manipulator/ios`)
+ - ExpoImagePicker (from `../node_modules/expo-image-picker/ios`)
+ - ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`)
- ExpoLocalization (from `../node_modules/expo-localization/ios`)
- ExpoModulesCore (from `../node_modules/expo-modules-core/ios`)
- - EXRandom (from `../node_modules/expo-random/ios`)
+ - ExpoRandom (from `../node_modules/expo-random/ios`)
+ - ExpoWebBrowser (from `../node_modules/expo-web-browser/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`)
@@ -545,17 +614,17 @@ DEPENDENCIES:
- 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.9.0)
+ - hermes-engine (~> 0.11.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`)
- RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`)
- React (from `../node_modules/react-native/`)
- React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`)
+ - React-Codegen (from `build/generated/ios`)
- React-Core (from `../node_modules/react-native/`)
- React-Core/DevSupport (from `../node_modules/react-native/`)
- React-Core/RCTWebSocket (from `../node_modules/react-native/`)
@@ -569,6 +638,7 @@ DEPENDENCIES:
- "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`)"
+ - react-native-image-keyboard (from `../node_modules/react-native-image-keyboard`)
- "react-native-netinfo (from `../node_modules/@react-native-community/netinfo`)"
- react-native-pager-view (from `../node_modules/react-native-pager-view`)
- react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`)
@@ -593,11 +663,11 @@ DEPENDENCIES:
- "RNSentry (from `../node_modules/@sentry/react-native`)"
- RNShareMenu (from `../node_modules/react-native-share-menu`)
- RNSVG (from `../node_modules/react-native-svg`)
- - UMTaskManagerInterface (from `../node_modules/unimodules-task-manager-interface/ios`)
- Yoga (from `../node_modules/react-native/ReactCommon/yoga`)
SPEC REPOS:
trunk:
+ - ASN1Decoder
- Firebase
- FirebaseAnalytics
- FirebaseCore
@@ -621,14 +691,14 @@ EXTERNAL SOURCES:
:podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec"
DoubleConversion:
:podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec"
+ EASClient:
+ :path: "../node_modules/expo-eas-client/ios"
EXApplication:
:path: "../node_modules/expo-application/ios"
EXAV:
:path: "../node_modules/expo-av/ios"
EXConstants:
:path: "../node_modules/expo-constants/ios"
- EXCrypto:
- :path: "../node_modules/expo-crypto/ios"
EXDevice:
:path: "../node_modules/expo-device/ios"
EXErrorRecovery:
@@ -643,28 +713,32 @@ EXTERNAL SOURCES:
:path: "../node_modules/expo-font/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"
EXManifests:
:path: "../node_modules/expo-manifests/ios"
EXNotifications:
:path: "../node_modules/expo-notifications/ios"
Expo:
:path: "../node_modules/expo/ios"
+ ExpoCrypto:
+ :path: "../node_modules/expo-crypto/ios"
ExpoHaptics:
:path: "../node_modules/expo-haptics/ios"
+ ExpoImageManipulator:
+ :path: "../node_modules/expo-image-manipulator/ios"
+ ExpoImagePicker:
+ :path: "../node_modules/expo-image-picker/ios"
+ ExpoKeepAwake:
+ :path: "../node_modules/expo-keep-awake/ios"
ExpoLocalization:
:path: "../node_modules/expo-localization/ios"
ExpoModulesCore:
:path: "../node_modules/expo-modules-core/ios"
- EXRandom:
+ ExpoRandom:
:path: "../node_modules/expo-random/ios"
+ ExpoWebBrowser:
+ :path: "../node_modules/expo-web-browser/ios"
EXScreenCapture:
:path: "../node_modules/expo-screen-capture/ios"
EXSecureStore:
@@ -681,8 +755,6 @@ EXTERNAL SOURCES:
:path: "../node_modules/expo-updates-interface/ios"
EXVideoThumbnails:
:path: "../node_modules/expo-video-thumbnails/ios"
- EXWebBrowser:
- :path: "../node_modules/expo-web-browser/ios"
FBLazyVector:
:path: "../node_modules/react-native/Libraries/FBLazyVector"
FBReactNativeSpec:
@@ -699,6 +771,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native/"
React-callinvoker:
:path: "../node_modules/react-native/ReactCommon/callinvoker"
+ React-Codegen:
+ :path: build/generated/ios
React-Core:
:path: "../node_modules/react-native/"
React-CoreModules:
@@ -721,6 +795,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native-blurhash"
react-native-cameraroll:
:path: "../node_modules/@react-native-community/cameraroll"
+ react-native-image-keyboard:
+ :path: "../node_modules/react-native-image-keyboard"
react-native-netinfo:
:path: "../node_modules/@react-native-community/netinfo"
react-native-pager-view:
@@ -769,108 +845,109 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native-share-menu"
RNSVG:
:path: "../node_modules/react-native-svg"
- UMTaskManagerInterface:
- :path: "../node_modules/unimodules-task-manager-interface/ios"
Yoga:
:path: "../node_modules/react-native/ReactCommon/yoga"
SPEC CHECKSUMS:
+ ASN1Decoder: 6110fdeacfdb41559b1481457a1645be716610aa
boost: a7c83b31436843459a1961bfd74b96033dc77234
DoubleConversion: 831926d9b8bf8166fd87886c4abab286c2422662
- EXApplication: 54fe5bd6268d697771645e8f1aef8b806a65247a
- EXAV: b9ed0c201092244c46aa78f907f5c66176bed236
- EXConstants: 88bf79622fbd9b476c96d8ec57fe97ca44fe8e3c
- EXCrypto: ab2ba0df3136a5f2407b8c7e70eb498ac20d704f
- EXDevice: aa5e1edbf350481a948c3258b750dd11e6e4579e
- EXErrorRecovery: b0d7582714a2cc896e94a2308a356f94dbf14ef7
- EXFileSystem: 7bcd3c1428698150d5c8ca140c8183f2ee204048
- EXFirebaseAnalytics: a7ec2dd1394ad0de5c0c63fac0deee496f798284
- EXFirebaseCore: 52151d0b008b99983e6a120cea94466ee760a4e9
- EXFont: 2597c10ac85a69d348d44d7873eccf5a7576ef5e
- EXImageLoader: 347b72c2ec2df65120ccec40ea65a4c4f24317ff
- EXImageManipulator: 60d1bf3f1d7709453b1feb38adf8594b7f58710f
- EXImagePicker: bf4d62532cc2bf217edbe4abbb0014e73e079eac
- EXJSONUtils: 5ee0d5cf76da70ad86f0be1a41cc70f47d69e06f
- EXKeepAwake: bf48d7f740a5cd2befed6cf9a49911d385c6c47d
- EXManifests: d3464cd2278f4a19cd80c1aa673231570b534c11
- EXNotifications: a7d582fa800d77f4a75bd22d52e84e2fbcee26df
- Expo: 534e51e607aba8229293297da5585f4b26f50fa1
- ExpoHaptics: 0d0b69b2414755a4057ffad0a10315902c0ea1b7
- ExpoLocalization: 72b4524c167da6c4e2a0bbe09176ff8b2c4eddbe
- ExpoModulesCore: 32c0ccb47f477d330ee93db72505380adf0de09a
- EXRandom: 1d00fd04d7d874c0c9d1ff87cee59ffe0b638a3d
- EXScreenCapture: 9bfdadf17f0b1dd082edb704764f1724176b2f27
- EXSecureStore: b80c74c5ee29d0160c2aace3fd9a24a5edc20015
- EXSplashScreen: 21669e598804ee810547dbb6692c8deb5dd8dbf3
- EXStoreReview: 5a24fd222d193878a7d4f6059dd19f51c808af66
- EXStructuredHeaders: 4993087b2010dbcc510f5d92555b36f523425e8d
- EXUpdates: bd5fa64f02685ed3e96be86b5ca350cdc2cd8d02
- EXUpdatesInterface: a9814f422d3cd6e7cfd260d13c27786148ece20e
- EXVideoThumbnails: 847d648d6f4bc0c1afad05caa56a487dc543445e
- EXWebBrowser: f1573262c5de753987ed526c630076eda130804d
- FBLazyVector: f7b0632c6437e312acf6349288d9aa4cb6d59030
- FBReactNativeSpec: 0f4e1f4cfeace095694436e7c7fcc5bf4b03a0ff
- Firebase: cd2ab85eec8170dc260186159f21072ecb679ad5
- FirebaseAnalytics: f3f8f75de34fe04141a69bb1c4bd7e24a80178e1
- FirebaseCore: ac35d680a0bf32319a59966a1478e0741536b97b
- FirebaseCoreDiagnostics: 3d36e05da74cb8b7ce30e6594a8f201b982c725c
- FirebaseInstallations: a58d4f72ec5861840b84df489f2668d970df558a
+ EASClient: 93565f4d024559b75eac62bc7d50acaa354614f6
+ EXApplication: d6562af1204162e0ac46d341a7d4e5dc720b33de
+ EXAV: 88f61c5af8415715b7ee51f084c1020235b85c56
+ EXConstants: fdbe52259365b6a6faaa5e99a3b82cfa6bc2eb61
+ EXDevice: 0115b360059ccd32c1701744e374e3259ffbdd3c
+ EXErrorRecovery: 3ce46e5d42e53c0371ff048a7f0cbc959968ef4a
+ EXFileSystem: 2aa2d9289f84bca9532b9ccbd81504fa31eb1ded
+ EXFirebaseAnalytics: aeefc63f92277313c3ee86da6a7ecf892f345ed1
+ EXFirebaseCore: bdfa87df74fa1b74a6b38957561456aabad28a4f
+ EXFont: 04235cc22e6fef86028feb67db452978dc6f240f
+ EXImageLoader: b88e053d760f85a82405b1db2de4abf11978fc9f
+ EXJSONUtils: 2a74b8f40f1523cc3f92af99c91aa78201737a77
+ EXManifests: 0c6134b7b6f3236a93a778c3f44ba1cfb3f9fa3d
+ EXNotifications: ea9fc56d27d1fee229489c5d8f452c7f367c237e
+ Expo: a3583452183bed29dbd6ed6c8d5d8e73cbfbe76f
+ ExpoCrypto: d0d0f3e20875dc450b4ec88f0fb608da5c2c6c17
+ ExpoHaptics: ad58ec96a25e57579c14a47c7d71f0de0de8656a
+ ExpoImageManipulator: b55580bbc7b10099c7707949903e7176a8542ee8
+ ExpoImagePicker: d9d6b4f29db437fc7796f13cee5f133f5b4b5f7c
+ ExpoKeepAwake: c0c494b442ecd8122974c13b93ccfb57bd408e88
+ ExpoLocalization: 8f619bb6eec64575cd5220bfabbd7b4e2d6f33f8
+ ExpoModulesCore: 5597629698cc026bd3dff1ef182fe2cc67c31084
+ ExpoRandom: 14df0976aa363a71a730ceb7655250f3047c0e42
+ ExpoWebBrowser: 818c519c3519cdd79780228039938fbd8236c885
+ EXScreenCapture: cbee2204f313038a1819d31ad99a31e15f8e0f59
+ EXSecureStore: aaae919d83aec2faf031e99398807edac0313285
+ EXSplashScreen: 34f460788db8d682883871708dddbfac72095bb7
+ EXStoreReview: e61fbd500624ee7363ab134ee247cff380a8b254
+ EXStructuredHeaders: 5d86829469399370a9fc7cb1e4391b09de87681d
+ EXUpdates: 08c3931d6a5f39686091130a10310266ae3ba5f9
+ EXUpdatesInterface: 0b101ace1dbfa0f64260a5df31c71d03c66cca54
+ EXVideoThumbnails: 19e055dc3245b53c536da9e0ef9c618fd2118297
+ FBLazyVector: 2c76493a346ef8cacf1f442926a39f805fffec1f
+ FBReactNativeSpec: 371350f24afa87b6aba606972ec959dcd4a95c9a
+ Firebase: 7e8fe528c161b9271d365217a74c16aaf834578e
+ FirebaseAnalytics: 2fc3876e2eb347673ad2f35e249ae7b15d6c88f5
+ FirebaseCore: b84a44ee7ba999e0f9f76d198a9c7f60a797b848
+ FirebaseCoreDiagnostics: 92e07a649aeb66352b319d43bdd2ee3942af84cb
+ FirebaseInstallations: 40bd9054049b2eae9a2c38ef1c3dd213df3605cd
fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9
- glog: 85ecdd10ee8d8ec362ef519a6a45ff9aa27b2e85
- GoogleAppMeasurement: 0c3b134b2c0a90c4c24833873894bfe0e42a0384
- GoogleDataTransport: 8b0e733ea77c9218778e5a9e34ba9508b8328939
+ glog: 476ee3e89abb49e07f822b48323c51c57124b572
+ GoogleAppMeasurement: 71156240babd3cc6ced03e0d54816f01a880c730
+ GoogleDataTransport: 5fffe35792f8b96ec8d6775f5eccd83c998d5a3b
GoogleUtilities: e0913149f6b0625b553d70dae12b49fc62914fd1
- hermes-engine: bf7577d12ac6ccf53ab8b5af3c6ccf0dd8458c5c
+ hermes-engine: 84e3af1ea01dd7351ac5d8689cbbea1f9903ffc3
libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913
libwebp: 98a37e597e40bfdb4c911fc98f2c53d0b12d05fc
- nanopb: 59221d7f958fb711001e6a449489542d92ae113e
- PromisesObjC: 3113f7f76903778cf4a0586bd1ab89329a0b7b97
- RCT-Folly: 803a9cfd78114b2ec0f140cfa6fa2a6bafb2d685
- RCTRequired: 0aa6c1c27e1d65920df35ceea5341a5fe76bdb79
- RCTTypeSafety: d76a59d00632891e11ed7522dba3fd1a995e573a
- React: ab8c09da2e7704f4b3ebad4baa6cfdfcc852dcb5
- React-callinvoker: 216fb96b482da516b8aba4142b145938f6ea92f0
- React-Core: af99b93aff83599485e0e0879879aafa35ceae32
- React-CoreModules: 137a054ce8c547e81dc3502933b1bc0fd08df05d
- React-cxxreact: ec5ee6b08664f5b8ac71d8ad912f54d540c4f817
- React-hermes: 644e034cf9eb99c2f867c325c589c85b5c918ef7
- React-jsi: 3e084c80fd364cee64668d5df46d40c39f7973e1
- React-jsiexecutor: cbdf37cebdc4f5d8b3d0bf5ccaa6147fd9de9f3d
- React-jsinspector: f4775ea9118cbe1f72b834f0f842baa7a99508d8
- React-logger: a1f028f6d8639a3f364ef80419e5e862e1115250
+ nanopb: a0ba3315591a9ae0a16a309ee504766e90db0c96
+ PromisesObjC: 99b6f43f9e1044bd87a95a60beff28c2c44ddb72
+ RCT-Folly: 4d8508a426467c48885f1151029bc15fa5d7b3b8
+ RCTRequired: 00581111c53531e39e3c6346ef0d2c0cf52a5a37
+ RCTTypeSafety: 07e03ee7800e7dd65cba8e52ad0c2edb06c96604
+ React: e61f4bf3c573d0c61c56b53dc3eb1d9daf0768a0
+ React-callinvoker: 047d47230bb6fd66827f8cb0bea4e944ffd1309b
+ React-Codegen: bb0403cde7374af091530e84e492589485aab480
+ React-Core: a4a3a8e10d004b08e013c3d0438259dd89a3894c
+ React-CoreModules: bb9f8bc36f1ae6d780b856927fa9d4aa01ccccc0
+ React-cxxreact: 7dd472aefb8629d6080cbb859240bafccd902704
+ React-hermes: a245deb80c8d0bc35ed599109562c1c75ca803bc
+ React-jsi: b25808afe821b607d51c779bdd1717be8393b7ec
+ React-jsiexecutor: 4a4bae5671b064a2248a690cf75957669489d08c
+ React-jsinspector: 218a2503198ff28a085f8e16622a8d8f507c8019
+ React-logger: f79dd3cc0f9b44f5611c6c7862badd891a862cf8
react-native-blur: cad4d93b364f91e7b7931b3fa935455487e5c33c
react-native-blurhash: add4df9a937b4e021a24bc67a0714f13e0bd40b7
react-native-cameraroll: 2957f2bce63ae896a848fbe0d5352c1bd4d20866
+ react-native-image-keyboard: adbf5996b8592a7d8cb8d3e431a9607f9cf3b270
react-native-netinfo: 3671b091c4843fda5e153612866ef4024b8f5d62
react-native-pager-view: 7f00d63688f7df9fad86dfb0154814419cc5eb8d
react-native-safe-area-context: ebf8c413eb8b5f7c392a036a315eb7b46b96845f
react-native-segmented-control: 65df6cd0619b780b3843d574a72d4c7cec396097
- React-perflogger: 0afaf2f01a47fd0fc368a93bfbb5bd3b26db6e7f
- React-RCTActionSheet: 59f35c4029e0b532fc42114241a06e170b7431a2
- React-RCTAnimation: aae4f4bed122e78bdab72f7118d291d70a932ce2
- React-RCTBlob: f6fb23394b4f28cd86fa7e9f5f6ae45c23669fda
- React-RCTImage: 638815cf96124386dd296067246d91441932ae3f
- React-RCTLinking: 254dd06283dd6fdb784285f95e7cec8053c3270f
- React-RCTNetwork: 8a4c2d4f357268e520b060572d02bc69a9b991fb
- React-RCTSettings: 35d44cbb9972ab933bd0a59ea3e6646dcb030ba3
- React-RCTText: cc5315df8458cfa7b537e621271ef43273955a97
- React-RCTVibration: 3b52a7dced19cdb025b4f88ab26ceb2d85f30ba2
- React-runtimeexecutor: a9d3c82ddf7ffdad9fbe6a81c6d6f8c06385464d
- ReactCommon: 07d0c460b9ba9af3eaf1b8f5abe7daaad28c9c4e
+ React-perflogger: 30ab8d6db10e175626069e742eead3ebe8f24fd5
+ React-RCTActionSheet: 4b45da334a175b24dabe75f856b98fed3dfd6201
+ React-RCTAnimation: d6237386cb04500889877845b3e9e9291146bc2e
+ React-RCTBlob: bc9e2cd738c43bd2948e862e371402ef9584730a
+ React-RCTImage: 9f8cac465c6e5837007f59ade2a0a741016dd6a3
+ React-RCTLinking: 5073abb7d30cc0824b2172bd4582fc15bfc40510
+ React-RCTNetwork: 28ff94aa7d8fc117fc800b87dd80869a00d2bef3
+ React-RCTSettings: f27aa036f7270fe6ca43f8cdd1819e821fa429a0
+ React-RCTText: 7cb6f86fa7bc86f22f16333ad243b158e63b2a68
+ React-RCTVibration: 9e344c840176b0af9c84d5019eb4fed8b3c105a1
+ React-runtimeexecutor: 7285b499d0339104b2813a1f58ad1ada4adbd6c0
+ ReactCommon: bf2888a826ceedf54b99ad1b6182d1bc4a8a3984
RNCAsyncStorage: 005c0e2f09575360f142d0d1f1f15e4ec575b1af
RNFastImage: 945abf54742505d790d9024d230c69b1e866bc88
- RNGestureHandler: 4f4986408310a43f1606c391f38f76e0d6e790d5
- RNReanimated: 46cdb89ca59ab7181334f4ed05a70e82ddb36751
+ RNGestureHandler: 61628a2c859172551aa2100d3e73d1e57878392f
+ RNReanimated: 64573e25e078ae6bec03b891586d50b9ec284393
RNScreens: 40a2cb40a02a609938137a1e0acfbf8fc9eebf19
- RNSentry: fbbdcd7213058e3de5fbaa452b25a06a16b4b382
+ RNSentry: 2cd1daa124b0d9fd0dfc2cb6094fdd168cb579bc
RNShareMenu: c69282e50ac439737a86949a55c7b023b90027c8
RNSVG: 302bfc9905bd8122f08966dc2ce2d07b7b52b9f8
SDWebImage: 0905f1b7760fc8ac4198cae0036600d67478751e
SDWebImageWebPCoder: f93010f3f6c031e2f8fb3081ca4ee6966c539815
Sentry: 0c5cd63d714187b4a39c331c1f0eb04ba7868341
- UMTaskManagerInterface: 3184c93ecc290bd422c6e344badc89b601e9c29b
- Yoga: d6b6a80659aa3e91aaba01d0012e7edcbedcbecd
+ Yoga: 17cd9a50243093b547c1e539c749928dd68152da
-PODFILE CHECKSUM: 040599cb42f9766a495935deae4c4908f2041ece
+PODFILE CHECKSUM: d6d20fa7c51228cebc309aed987ed7d8f4274844
COCOAPODS: 1.11.3
diff --git a/ios/tooot.xcodeproj/project.pbxproj b/ios/tooot.xcodeproj/project.pbxproj
index c6f043dd..6b21cb87 100644
--- a/ios/tooot.xcodeproj/project.pbxproj
+++ b/ios/tooot.xcodeproj/project.pbxproj
@@ -7,7 +7,6 @@
objects = {
/* Begin PBXBuildFile section */
- 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };
13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; };
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
@@ -20,6 +19,7 @@
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 */; };
+ E613A80B28282A01003C97D6 /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = E613A80A28282A01003C97D6 /* AppDelegate.mm */; };
E633A42B281EAEAB000E540F /* ShareExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = E633A420281EAEAB000E540F /* ShareExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
E633A430281EAF38000E540F /* ShareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E633A42F281EAF38000E540F /* ShareViewController.swift */; };
/* End PBXBuildFile section */
@@ -52,7 +52,6 @@
008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; };
13B07F961A680F5B00A75B9A /* tooot.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = tooot.app; sourceTree = BUILT_PRODUCTS_DIR; };
13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = tooot/AppDelegate.h; sourceTree = ""; };
- 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = tooot/AppDelegate.m; sourceTree = ""; };
13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; };
13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = tooot/Images.xcassets; sourceTree = ""; };
13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = tooot/Info.plist; sourceTree = ""; };
@@ -72,6 +71,7 @@
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 = ""; };
+ E613A80A28282A01003C97D6 /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = tooot/AppDelegate.mm; sourceTree = ""; };
E633A420281EAEAB000E540F /* ShareExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = ShareExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
E633A427281EAEAB000E540F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
E633A42F281EAF38000E540F /* ShareViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ShareViewController.swift; path = "../../node_modules/react-native-share-menu/ios/ShareViewController.swift"; sourceTree = ""; };
@@ -103,10 +103,10 @@
13B07FAE1A68108700A75B9A /* tooot */ = {
isa = PBXGroup;
children = (
+ E613A80A28282A01003C97D6 /* AppDelegate.mm */,
BB2F792B24A3F905000567C9 /* Supporting */,
008F07F21AC5B25A0029DE68 /* main.jsbundle */,
13B07FAF1A68108700A75B9A /* AppDelegate.h */,
- 13B07FB01A68108700A75B9A /* AppDelegate.m */,
13B07FB51A68108700A75B9A /* Images.xcassets */,
13B07FB61A68108700A75B9A /* Info.plist */,
13B07FB11A68108700A75B9A /* LaunchScreen.xib */,
@@ -465,9 +465,9 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
- 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */,
5EE44DD62600124E00A9BCED /* File.swift in Sources */,
13B07FC11A68108700A75B9A /* main.m in Sources */,
+ E613A80B28282A01003C97D6 /* AppDelegate.mm in Sources */,
E3BC22F5F8ABE515E14CF199 /* ExpoModulesProvider.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -539,6 +539,7 @@
"-ObjC",
"-lc++",
);
+ OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG";
PRODUCT_BUNDLE_IDENTIFIER = com.xmflsct.app.tooot;
PRODUCT_NAME = tooot;
PROVISIONING_PROFILE_SPECIFIER = "match AdHoc com.xmflsct.app.tooot";
@@ -574,6 +575,7 @@
"-ObjC",
"-lc++",
);
+ OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE";
PRODUCT_BUNDLE_IDENTIFIER = com.xmflsct.app.tooot;
PRODUCT_NAME = tooot;
PROVISIONING_PROFILE_SPECIFIER = "match AppStore com.xmflsct.app.tooot";
@@ -734,6 +736,7 @@
MARKETING_VERSION = 1.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
+ OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG";
PRODUCT_BUNDLE_IDENTIFIER = com.xmflsct.app.tooot.ShareExtension;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "match AdHoc com.xmflsct.app.tooot.ShareExtension";
@@ -777,6 +780,7 @@
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
MARKETING_VERSION = 1.0;
MTL_FAST_MATH = YES;
+ OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE";
PRODUCT_BUNDLE_IDENTIFIER = com.xmflsct.app.tooot.ShareExtension;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "match AppStore com.xmflsct.app.tooot.ShareExtension";
diff --git a/ios/tooot/AppDelegate.m b/ios/tooot/AppDelegate.m
deleted file mode 100644
index 07d19ba1..00000000
--- a/ios/tooot/AppDelegate.m
+++ /dev/null
@@ -1,103 +0,0 @@
-#import "AppDelegate.h"
-
-#import
-#import
-#import
-#import
-#import
-
-#import
-
-#if defined(FB_SONARKIT_ENABLED) && __has_include()
-#import
-#import
-#import
-#import
-#import
-#import
-
-// iOS 9.x or newer
-- (BOOL)application:(UIApplication *)application
- openURL:(NSURL *)url
- options:(NSDictionary *)options
-{
- return [RCTLinkingManager application:application openURL:url options:options];
-}
-
-// iOS 8.x or older
-- (BOOL)application:(UIApplication *)application
- openURL:(NSURL *)url
- sourceApplication:(NSString *)sourceApplication
- annotation:(id)annotation
-{
- return [RCTLinkingManager application:application openURL:url
- sourceApplication:sourceApplication annotation:annotation];
-}
-
-static void InitializeFlipper(UIApplication *application) {
- FlipperClient *client = [FlipperClient sharedClient];
- SKDescriptorMapper *layoutDescriptorMapper = [[SKDescriptorMapper alloc] initWithDefaults];
- [client addPlugin:[[FlipperKitLayoutPlugin alloc] initWithRootNode:application withDescriptorMapper:layoutDescriptorMapper]];
- [client addPlugin:[[FKUserDefaultsPlugin alloc] initWithSuiteName:nil]];
- [client addPlugin:[FlipperKitReactPlugin new]];
- [client addPlugin:[[FlipperKitNetworkPlugin alloc] initWithNetworkAdapter:[SKIOSNetworkAdapter new]]];
- [client start];
-}
-#endif
-
-@implementation AppDelegate
-
-- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
-{
-#if defined(FB_SONARKIT_ENABLED) && __has_include()
- InitializeFlipper(application);
-#endif
-
- 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];
- UIViewController *rootViewController = [self.reactDelegate createRootViewController];
- rootViewController.view = rootView;
- self.window.rootViewController = rootViewController;
- [self.window makeKeyAndVisible];
-
- [super application:application didFinishLaunchingWithOptions:launchOptions];
-
- return YES;
-}
-
-- (NSArray> *)extraModulesForBridge:(RCTBridge *)bridge
-{
- // If you'd like to export some custom RCTBridgeModules that are not Expo modules, add them here!
- return @[];
-}
-
-- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge {
- #ifdef DEBUG
- return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
- #else
- return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
- #endif
-}
-
-// Linking API
-- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary *)options {
- NSString *urlString = url.absoluteString;
-
- if ([urlString hasPrefix:@"tooot-share://"]) {
- NSLog(@"Entered with the following string: %@s", urlString);
- return [ShareMenuManager application:application openURL:url options:options];
- }
-
- return [RCTLinkingManager application:application openURL:url options:options];
-}
-
-// Universal Links
-- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray> * _Nullable))restorationHandler {
- return [RCTLinkingManager application:application
- continueUserActivity:userActivity
- restorationHandler:restorationHandler];
-}
-
-@end
diff --git a/ios/tooot/AppDelegate.mm b/ios/tooot/AppDelegate.mm
new file mode 100644
index 00000000..85019cd2
--- /dev/null
+++ b/ios/tooot/AppDelegate.mm
@@ -0,0 +1,126 @@
+#import "AppDelegate.h"
+
+#import
+#import
+#import
+
+#import
+
+#import
+#import
+
+#if RCT_NEW_ARCH_ENABLED
+#import
+#import
+#import
+#import
+#import
+#import
+
+#import
+
+@interface AppDelegate () {
+ RCTTurboModuleManager *_turboModuleManager;
+ RCTSurfacePresenterBridgeAdapter *_bridgeAdapter;
+ std::shared_ptr _reactNativeConfig;
+ facebook::react::ContextContainer::Shared _contextContainer;
+}
+@end
+#endif
+
+@implementation AppDelegate
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+{
+ RCTAppSetupPrepareApp(application);
+
+ RCTBridge *bridge = [self.reactDelegate createBridgeWithDelegate:self launchOptions:launchOptions];
+
+#if RCT_NEW_ARCH_ENABLED
+ _contextContainer = std::make_shared();
+ _reactNativeConfig = std::make_shared();
+ _contextContainer->insert("ReactNativeConfig", _reactNativeConfig);
+ _bridgeAdapter = [[RCTSurfacePresenterBridgeAdapter alloc] initWithBridge:bridge contextContainer:_contextContainer];
+ bridge.surfacePresenter = _bridgeAdapter.surfacePresenter;
+#endif
+
+ UIView *rootView = RCTAppSetupDefaultRootView(bridge, @"main", nil);
+
+ if (@available(iOS 13.0, *)) {
+ rootView.backgroundColor = [UIColor colorNamed:@"SplashScreenBackgroundColor"];
+ } else {
+ rootView.backgroundColor = [UIColor whiteColor];
+ }
+
+ self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
+ UIViewController *rootViewController = [self.reactDelegate createRootViewController];
+ rootViewController.view = rootView;
+ self.window.rootViewController = rootViewController;
+ [self.window makeKeyAndVisible];
+ [super application:application didFinishLaunchingWithOptions:launchOptions];
+ return YES;
+}
+
+- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
+{
+#if DEBUG
+ return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"];
+#else
+ return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
+#endif
+}
+
+#if RCT_NEW_ARCH_ENABLED
+
+#pragma mark - RCTCxxBridgeDelegate
+
+- (std::unique_ptr)jsExecutorFactoryForBridge:(RCTBridge *)bridge
+{
+ _turboModuleManager = [[RCTTurboModuleManager alloc] initWithBridge:bridge delegate:self jsInvoker:bridge.jsCallInvoker];
+ return RCTAppSetupDefaultJsExecutorFactory(bridge, _turboModuleManager);
+}
+
+#pragma mark RCTTurboModuleManagerDelegate
+
+- (Class)getModuleClassFromName:(const char *)name
+{
+ return RCTCoreModulesClassProvider(name);
+}
+
+- (std::shared_ptr)getTurboModule:(const std::string &)name jsInvoker:(std::shared_ptr)jsInvoker
+{
+ return nullptr;
+}
+
+- (std::shared_ptr)getTurboModule:(const std::string &)name initParams: (const facebook::react::ObjCTurboModule::InitParams &)params
+{
+ return nullptr;
+}
+
+- (id)getModuleInstanceFromClass:(Class)moduleClass
+{
+ return RCTAppSetupDefaultModuleFromClass(moduleClass);
+}
+
+#endif
+
+// Linking API
+- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary *)options {
+ NSString *urlString = url.absoluteString;
+
+ if ([urlString hasPrefix:@"tooot-share://"]) {
+ NSLog(@"Entered with the following string: %@s", urlString);
+ return [ShareMenuManager application:application openURL:url options:options];
+ }
+
+ return [RCTLinkingManager application:application openURL:url options:options];
+}
+
+// Universal Links
+- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray> * _Nullable))restorationHandler {
+ return [RCTLinkingManager application:application
+ continueUserActivity:userActivity
+ restorationHandler:restorationHandler];
+}
+
+@end
\ No newline at end of file
diff --git a/ios/tooot/main.m b/ios/tooot/main.m
index 25181b6c..707f29d8 100644
--- a/ios/tooot/main.m
+++ b/ios/tooot/main.m
@@ -2,7 +2,7 @@
#import "AppDelegate.h"
-int main(int argc, char * argv[]) {
+int main(int argc, char *argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
diff --git a/jest.config.js b/jest.config.js
deleted file mode 100644
index 281d0829..00000000
--- a/jest.config.js
+++ /dev/null
@@ -1,31 +0,0 @@
-module.exports = {
- preset: 'jest-expo',
- collectCoverage: true,
- collectCoverageFrom: [
- 'src /**/*.{ts,tsx}',
- '!**/coverage /**',
- '!**/node_modules /**',
- '!**/app.config.ts',
- '!**/babel.config.js',
- '!**/jest.setup.ts'
- ],
- setupFiles: [
- '/jest/async-storage.js',
- '/jest/react-native.js',
- '/jest/react-navigation.js'
- ],
- transformIgnorePatterns: [
- 'node_modules/(?!(jest-)?react-native' +
- '|react-clone-referenced-element' +
- '|@react-native-community' +
- '|expo(nent)?' +
- '|@expo(nent)?/.*' +
- '|react-navigation' +
- '|@react-navigation/.*|@unimodules/.*|unimodules' +
- '|sentry-expo' +
- '|native-base' +
- '|@sentry/.*' +
- '|redux-persist-expo-securestore' +
- ')'
- ]
-}
diff --git a/jest/async-storage.js b/jest/async-storage.js
deleted file mode 100644
index 2b54cedb..00000000
--- a/jest/async-storage.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import mockAsyncStorage from '@react-native-async-storage/async-storage/jest/async-storage-mock'
-
-jest.mock('@react-native-async-storage/async-storage', () => mockAsyncStorage)
diff --git a/jest/react-native.js b/jest/react-native.js
deleted file mode 100644
index a4590f23..00000000
--- a/jest/react-native.js
+++ /dev/null
@@ -1,6 +0,0 @@
-jest.mock('react-native/Libraries/LayoutAnimation/LayoutAnimation', () => ({
- ...require.requireActual(
- 'react-native/Libraries/LayoutAnimation/LayoutAnimation'
- ),
- configureNext: jest.fn()
-}))
diff --git a/jest/react-navigation.js b/jest/react-navigation.js
deleted file mode 100644
index dcf265e1..00000000
--- a/jest/react-navigation.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import 'react-native-gesture-handler/jestSetup'
-
-jest.mock('react-native-reanimated', () => {
- const Reanimated = require('react-native-reanimated/mock')
-
- // The mock for `call` immediately calls the callback which is incorrect
- // So we override it with a no-op
- Reanimated.default.call = () => {}
-
- return Reanimated
-})
-
-// Silence the warning: Animated: `useNativeDriver` is not supported because the native animated module is missing
-jest.mock('react-native/Libraries/Animated/src/NativeAnimatedHelper')
diff --git a/package.json b/package.json
index 3e8a9733..6e518004 100644
--- a/package.json
+++ b/package.json
@@ -1,11 +1,11 @@
{
"name": "tooot",
"versions": {
- "native": "220428",
+ "native": "220508",
"major": 4,
"minor": 0,
"patch": 0,
- "expo": "44.0.0"
+ "expo": "45.0.0"
},
"description": "tooot app for Mastodon",
"author": "xmflsct ",
@@ -26,6 +26,12 @@
},
"dependencies": {
"@expo/react-native-action-sheet": "3.13.0",
+ "@formatjs/intl-datetimeformat": "^5.0.2",
+ "@formatjs/intl-getcanonicallocales": "^1.9.2",
+ "@formatjs/intl-locale": "^2.4.47",
+ "@formatjs/intl-numberformat": "^7.4.3",
+ "@formatjs/intl-pluralrules": "^4.3.3",
+ "@formatjs/intl-relativetimeformat": "^10.0.1",
"@neverdull-agency/expo-unlimited-secure-store": "1.0.10",
"@react-native-async-storage/async-storage": "1.17.3",
"@react-native-community/blur": "3.6.0",
@@ -37,46 +43,48 @@
"@react-navigation/native-stack": "6.6.2",
"@react-navigation/stack": "6.2.1",
"@reduxjs/toolkit": "1.8.1",
- "@sentry/react-native": "3.4.1",
- "@sharcoux/slider": "6.0.2",
+ "@sentry/react-native": "3.4.2",
+ "@sharcoux/slider": "6.0.3",
"axios": "0.27.2",
- "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.6",
- "expo-video-thumbnails": "6.2.0",
- "expo-web-browser": "10.1.1",
- "i18next": "21.6.16",
+ "expo": "45.0.1",
+ "expo-auth-session": "3.6.0",
+ "expo-av": "11.2.3",
+ "expo-constants": "^13.1.1",
+ "expo-crypto": "10.2.0",
+ "expo-device": "4.2.0",
+ "expo-file-system": "14.0.0",
+ "expo-firebase-analytics": "7.0.0",
+ "expo-haptics": "11.2.0",
+ "expo-image-manipulator": "10.3.1",
+ "expo-image-picker": "13.1.1",
+ "expo-linking": "3.1.0",
+ "expo-localization": "13.0.0",
+ "expo-notifications": "0.15.2",
+ "expo-random": "12.2.0",
+ "expo-screen-capture": "4.2.0",
+ "expo-secure-store": "11.2.0",
+ "expo-splash-screen": "0.15.1",
+ "expo-store-review": "5.2.0",
+ "expo-updates": "0.13.1",
+ "expo-video-thumbnails": "6.3.0",
+ "expo-web-browser": "10.2.0",
+ "i18next": "21.8.0",
"li": "1.3.0",
"lodash": "4.17.21",
"react": "17.0.2",
"react-dom": "17.0.2",
- "react-i18next": "11.16.7",
- "react-native": "0.67.4",
+ "react-i18next": "11.16.9",
+ "react-intl": "^5.25.1",
+ "react-native": "0.68.1",
"react-native-animated-spinkit": "1.5.2",
"react-native-base64": "^0.2.1",
"react-native-blurhash": "1.1.10",
"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.4.1",
+ "react-native-gesture-handler": "2.4.2",
"react-native-htmlview": "0.16.0",
+ "react-native-image-keyboard": "^2.2.0",
"react-native-pager-view": "5.4.11",
"react-native-reanimated": "2.8.0",
"react-native-safe-area-context": "4.2.5",
@@ -85,9 +93,8 @@
"react-native-svg": "12.3.0",
"react-native-swipe-list-view": "3.2.9",
"react-native-tab-view": "3.1.1",
- "react-query": "3.38.0",
+ "react-query": "3.39.0",
"react-redux": "8.0.1",
- "react-timeago": "6.2.1",
"redux-persist": "6.0.0",
"rn-placeholder": "3.0.3",
"sentry-expo": "4.1.1",
@@ -95,7 +102,7 @@
"valid-url": "1.0.9"
},
"devDependencies": {
- "@babel/core": "7.17.9",
+ "@babel/core": "7.17.10",
"@babel/plugin-proposal-optional-chaining": "7.16.7",
"@babel/preset-typescript": "7.16.7",
"@expo/config": "6.0.23",
@@ -115,7 +122,11 @@
"patch-package": "6.4.7",
"postinstall-postinstall": "2.1.0",
"react-native-clean-project": "4.0.1",
- "typescript": "4.6.3"
+ "typescript": "4.6.4"
+ },
+ "resolutions": {
+ "@types/react": "17.0.43",
+ "@types/react-dom": "17.0.14"
},
"expo": {
"autolinking": {
diff --git a/patches/@types+react-native-share-menu+5.0.2.patch b/patches/@types+react-native-share-menu+5.0.2.patch
index 997211e6..9d30b147 100644
--- a/patches/@types+react-native-share-menu+5.0.2.patch
+++ b/patches/@types+react-native-share-menu+5.0.2.patch
@@ -1,18 +1,22 @@
diff --git a/node_modules/@types/react-native-share-menu/index.d.ts b/node_modules/@types/react-native-share-menu/index.d.ts
-index f52822c..b1d3bdd 100755
+index f52822c..ee98565 100755
--- a/node_modules/@types/react-native-share-menu/index.d.ts
+++ b/node_modules/@types/react-native-share-menu/index.d.ts
-@@ -6,9 +6,7 @@
+@@ -5,11 +5,9 @@
+ // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
// Minimum TypeScript Version: 3.7
- export interface ShareData {
+-export interface ShareData {
- mimeType: string;
- data: string | string[];
- extraData?: object | undefined;
+-}
++export type ShareData = {
+ data: {mimeType: string; data: string}[];
- }
++} | {mimeType: string; data: string | string[]}
export type ShareCallback = (share?: ShareData) => void;
+
@@ -28,7 +26,7 @@ interface ShareMenuReactView {
dismissExtension(error?: string): void;
openApp(): void;
diff --git a/patches/expo-av+10.2.1.patch b/patches/expo-av+10.2.1.patch
deleted file mode 100644
index 4fea8f38..00000000
--- a/patches/expo-av+10.2.1.patch
+++ /dev/null
@@ -1,81 +0,0 @@
-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
deleted file mode 100644
index d7eb9e91..00000000
--- a/patches/expo-file-system+13.2.0.patch
+++ /dev/null
@@ -1,166 +0,0 @@
-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/src/App.tsx b/src/App.tsx
index 21c6fbf3..84c4bc99 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -1,4 +1,31 @@
import { ActionSheetProvider } from '@expo/react-native-action-sheet'
+import '@formatjs/intl-getcanonicallocales/polyfill'
+import '@formatjs/intl-locale/polyfill'
+import '@formatjs/intl-pluralrules/polyfill'
+import '@formatjs/intl-pluralrules/locale-data/de'
+import '@formatjs/intl-pluralrules/locale-data/en'
+import '@formatjs/intl-pluralrules/locale-data/ko'
+import '@formatjs/intl-pluralrules/locale-data/vi'
+import '@formatjs/intl-pluralrules/locale-data/zh'
+import '@formatjs/intl-numberformat/polyfill'
+import '@formatjs/intl-numberformat/locale-data/de'
+import '@formatjs/intl-numberformat/locale-data/en'
+import '@formatjs/intl-numberformat/locale-data/ko'
+import '@formatjs/intl-numberformat/locale-data/vi'
+import '@formatjs/intl-numberformat/locale-data/zh'
+import '@formatjs/intl-datetimeformat/polyfill'
+import '@formatjs/intl-datetimeformat/locale-data/de'
+import '@formatjs/intl-datetimeformat/locale-data/en'
+import '@formatjs/intl-datetimeformat/locale-data/ko'
+import '@formatjs/intl-datetimeformat/locale-data/vi'
+import '@formatjs/intl-datetimeformat/locale-data/zh'
+import '@formatjs/intl-datetimeformat/add-all-tz'
+import '@formatjs/intl-relativetimeformat/polyfill'
+import '@formatjs/intl-relativetimeformat/locale-data/de'
+import '@formatjs/intl-relativetimeformat/locale-data/en'
+import '@formatjs/intl-relativetimeformat/locale-data/ko'
+import '@formatjs/intl-relativetimeformat/locale-data/vi'
+import '@formatjs/intl-relativetimeformat/locale-data/zh'
import queryClient from '@helpers/queryClient'
import i18n from '@root/i18n/i18n'
import Screens from '@root/Screens'
@@ -6,7 +33,9 @@ import audio from '@root/startup/audio'
import dev from '@root/startup/dev'
import log from '@root/startup/log'
import netInfo from '@root/startup/netInfo'
+import push from '@root/startup/push'
import sentry from '@root/startup/sentry'
+import timezone from '@root/startup/timezone'
import { persistor, store } from '@root/store'
import AccessibilityManager from '@utils/accessibility/AccessibilityManager'
import {
@@ -19,11 +48,12 @@ 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 'react-native-image-keyboard'
import { enableFreeze } from 'react-native-screens'
import { QueryClientProvider } from 'react-query'
import { Provider } from 'react-redux'
import { PersistGate } from 'redux-persist/integration/react'
-import push from './startup/push'
+import { IntlProvider } from 'react-intl'
Platform.select({
android: LogBox.ignoreLogs(['Setting a timer for a long period of time'])
@@ -33,6 +63,7 @@ dev()
sentry()
audio()
push()
+timezone()
enableFreeze(true)
const App: React.FC = () => {
@@ -91,13 +122,18 @@ const App: React.FC = () => {
const language = getSettingsLanguage(store.getState())
if (!language) {
store.dispatch(changeLanguage('en'))
+ i18n.changeLanguage('en')
+ } else {
+ i18n.changeLanguage(language)
}
- i18n.changeLanguage(language)
+
return (
-
+
+
+
diff --git a/src/Screens.tsx b/src/Screens.tsx
index 9065ee5d..6fa2fa60 100644
--- a/src/Screens.tsx
+++ b/src/Screens.tsx
@@ -161,61 +161,159 @@ const Screens: React.FC = ({ localCorrupt }) => {
// Share Extension
const handleShare = useCallback(
- (item?: { data?: { mimeType: string; data: string }[] }) => {
+ (
+ item?:
+ | {
+ data: { mimeType: string; data: string }[]
+ mimeType: undefined
+ }
+ | { data: string | string[]; mimeType: string }
+ ) => {
if (instanceActive < 0) {
return
}
- if (!item || !item.data || !Array.isArray(item.data) || !item.data) {
+ if (!item || !item.data) {
return
}
let text: string | undefined = undefined
let images: { type: string; uri: string }[] = []
let video: { type: string; uri: string } | undefined = undefined
- item.data.forEach((d, i) => {
- const typesImage = ['png', 'jpg', 'jpeg', 'gif']
- const typesVideo = ['mp4', 'm4v', 'mov', 'webm']
- const { mimeType, data } = d
- console.log('mimeType', mimeType)
- console.log('data', data)
- if (mimeType.startsWith('image/')) {
- if (!typesImage.includes(mimeType.split('/')[1])) {
- console.warn('Image type not supported:', mimeType.split('/')[1])
+
+ switch (Platform.OS) {
+ case 'ios':
+ if (!Array.isArray(item.data) || !item.data) {
return
}
- images.push({ type: mimeType.split('/')[1], uri: data })
- } else if (mimeType.startsWith('video/')) {
- if (!typesVideo.includes(mimeType.split('/')[1])) {
- console.warn('Video type not supported:', mimeType.split('/')[1])
+
+ item.data.forEach(d => {
+ if (typeof d === 'string') return
+ const typesImage = ['png', 'jpg', 'jpeg', 'gif']
+ const typesVideo = ['mp4', 'm4v', 'mov', 'webm']
+ const { mimeType, data } = d
+ if (mimeType.startsWith('image/')) {
+ if (!typesImage.includes(mimeType.split('/')[1])) {
+ console.warn(
+ 'Image type not supported:',
+ mimeType.split('/')[1]
+ )
+ displayMessage({
+ message: t('shareError.imageNotSupported', {
+ type: mimeType.split('/')[1]
+ }),
+ type: 'error',
+ theme
+ })
+ return
+ }
+ images.push({ type: mimeType.split('/')[1], uri: data })
+ } else if (mimeType.startsWith('video/')) {
+ if (!typesVideo.includes(mimeType.split('/')[1])) {
+ console.warn(
+ 'Video type not supported:',
+ mimeType.split('/')[1]
+ )
+ displayMessage({
+ message: t('shareError.videoNotSupported', {
+ type: mimeType.split('/')[1]
+ }),
+ type: 'error',
+ theme
+ })
+ return
+ }
+ video = { type: mimeType.split('/')[1], uri: data }
+ } else {
+ if (typesImage.includes(data.split('.').pop() || '')) {
+ images.push({ type: data.split('.').pop()!, uri: data })
+ return
+ }
+ if (typesVideo.includes(data.split('.').pop() || '')) {
+ video = { type: data.split('.').pop()!, uri: data }
+ return
+ }
+ text = !text ? data : text.concat(text, `\n${data}`)
+ }
+ })
+ break
+ case 'android':
+ if (!item.mimeType) {
return
}
- video = { type: mimeType.split('/')[1], uri: data }
- } else {
- if (typesImage.includes(data.split('.').pop() || '')) {
- images.push({ type: data.split('.').pop()!, uri: data })
- return
+ let tempData: string[]
+ if (!Array.isArray(item.data)) {
+ tempData = [item.data]
+ } else {
+ tempData = item.data
}
- if (typesVideo.includes(data.split('.').pop() || '')) {
- video = { type: data.split('.').pop()!, uri: data }
- return
- }
- text = !text ? data : text.concat(text, `\n${data}`)
- }
- })
- navigationRef.navigate('Screen-Compose', {
- type: 'share',
- text,
- images,
- video
- })
+ tempData.forEach(d => {
+ const typesImage = ['png', 'jpg', 'jpeg', 'gif']
+ const typesVideo = ['mp4', 'm4v', 'mov', 'webm', 'mpeg']
+ if (item.mimeType!.startsWith('image/')) {
+ if (!typesImage.includes(item.mimeType.split('/')[1])) {
+ console.warn(
+ 'Image type not supported:',
+ item.mimeType.split('/')[1]
+ )
+ displayMessage({
+ message: t('shareError.imageNotSupported', {
+ type: item.mimeType.split('/')[1]
+ }),
+ type: 'error',
+ theme
+ })
+ return
+ }
+ images.push({ type: item.mimeType.split('/')[1], uri: d })
+ } else if (item.mimeType.startsWith('video/')) {
+ if (!typesVideo.includes(item.mimeType.split('/')[1])) {
+ console.warn(
+ 'Video type not supported:',
+ item.mimeType.split('/')[1]
+ )
+ displayMessage({
+ message: t('shareError.videoNotSupported', {
+ type: item.mimeType.split('/')[1]
+ }),
+ type: 'error',
+ theme
+ })
+ return
+ }
+ video = { type: item.mimeType.split('/')[1], uri: d }
+ } else {
+ if (typesImage.includes(d.split('.').pop() || '')) {
+ images.push({ type: d.split('.').pop()!, uri: d })
+ return
+ }
+ if (typesVideo.includes(d.split('.').pop() || '')) {
+ video = { type: d.split('.').pop()!, uri: d }
+ return
+ }
+ text = !text ? d : text.concat(text, `\n${d}`)
+ }
+ })
+ break
+ }
+
+ if (!text && (!images || !images.length) && !video) {
+ return
+ } else {
+ navigationRef.navigate('Screen-Compose', {
+ type: 'share',
+ text,
+ images,
+ video
+ })
+ }
},
[instanceActive]
)
useEffect(() => {
- ShareMenu.getInitialShare(item => handleShare(item))
+ ShareMenu.getInitialShare(handleShare)
}, [])
useEffect(() => {
- const listener = ShareMenu.addNewShareListener(item => handleShare(item))
+ const listener = ShareMenu.addNewShareListener(handleShare)
return () => {
listener.remove()
}
diff --git a/src/components/Account.tsx b/src/components/Account.tsx
index 7dff9669..b3415253 100644
--- a/src/components/Account.tsx
+++ b/src/components/Account.tsx
@@ -5,9 +5,10 @@ import { TabLocalStackParamList } from '@utils/navigation/navigators'
import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager'
import React, { useCallback } from 'react'
-import { Pressable, StyleSheet, Text, View } from 'react-native'
+import { Pressable, View } from 'react-native'
import analytics from './analytics'
import GracefullyImage from './GracefullyImage'
+import CustomText from './Text'
export interface Props {
account: Mastodon.Account
@@ -32,50 +33,45 @@ const ComponentAccount: React.FC = ({
return (
-
+
-
-
+
@{account.acct}
-
+
)
}
-const styles = StyleSheet.create({
- itemDefault: {
- paddingHorizontal: StyleConstants.Spacing.Global.PagePadding,
- paddingVertical: StyleConstants.Spacing.M
- },
- itemAccount: {
- flexDirection: 'row',
- alignItems: 'center'
- },
- itemAccountAvatar: {
- alignSelf: 'flex-start',
- width: StyleConstants.Avatar.S,
- height: StyleConstants.Avatar.S,
- borderRadius: 6,
- marginRight: StyleConstants.Spacing.S
- },
- itemAccountAcct: { marginTop: StyleConstants.Spacing.XS }
-})
-
export default ComponentAccount
diff --git a/src/components/Button.tsx b/src/components/Button.tsx
index ffdb695f..579134b7 100644
--- a/src/components/Button.tsx
+++ b/src/components/Button.tsx
@@ -7,12 +7,11 @@ import {
AccessibilityProps,
Pressable,
StyleProp,
- StyleSheet,
- Text,
View,
ViewStyle
} from 'react-native'
import { Flow } from 'react-native-animated-spinkit'
+import CustomText from './Text'
export interface Props {
accessibilityLabel?: AccessibilityProps['accessibilityLabel']
@@ -116,7 +115,7 @@ const Button: React.FC = ({
case 'text':
return (
<>
- = ({
busy: loading
}}
style={[
- styles.button,
{
+ borderRadius: 100,
+ justifyContent: 'center',
+ alignItems: 'center',
borderWidth: overlay ? 0 : 1,
borderColor: mainColor,
backgroundColor: colorBackground,
@@ -170,12 +171,4 @@ const Button: React.FC = ({
)
}
-const styles = StyleSheet.create({
- button: {
- borderRadius: 100,
- justifyContent: 'center',
- alignItems: 'center'
- }
-})
-
export default Button
diff --git a/src/components/Emojis/List.tsx b/src/components/Emojis/List.tsx
index df213f1c..48eb8ba3 100644
--- a/src/components/Emojis/List.tsx
+++ b/src/components/Emojis/List.tsx
@@ -1,3 +1,4 @@
+import CustomText from '@components/Text'
import { useAppDispatch } from '@root/store'
import { useAccessibility } from '@utils/accessibility/AccessibilityManager'
import { countInstanceEmoji } from '@utils/slices/instancesSlice'
@@ -11,8 +12,6 @@ import {
findNodeHandle,
Pressable,
SectionList,
- StyleSheet,
- Text,
View
} from 'react-native'
import FastImage from 'react-native-fast-image'
@@ -30,7 +29,12 @@ const EmojisList = React.memo(
const listHeader = useCallback(
({ section: { title } }) => (
- {title}
+
+ {title}
+
),
[]
)
@@ -38,7 +42,15 @@ const EmojisList = React.memo(
const listItem = useCallback(
({ index, item }: { item: Mastodon.Emoji[]; index: number }) => {
return (
-
+
{item.map(emoji => {
const uri = reduceMotionEnabled ? emoji.static_url : emoji.url
if (validUrl.isHttpsUri(uri)) {
@@ -64,7 +76,12 @@ const EmojisList = React.memo(
'screenCompose:content.root.footer.emojis.accessibilityHint'
)}
source={{ uri }}
- style={styles.emoji}
+ style={{
+ width: 32,
+ height: 32,
+ padding: StyleConstants.Spacing.S,
+ margin: StyleConstants.Spacing.S
+ }}
/>
)
@@ -104,23 +121,4 @@ const EmojisList = React.memo(
() => true
)
-const styles = StyleSheet.create({
- group: {
- position: 'absolute',
- ...StyleConstants.FontStyle.S
- },
- emojis: {
- flex: 1,
- flexWrap: 'wrap',
- marginTop: StyleConstants.Spacing.M,
- marginRight: StyleConstants.Spacing.S
- },
- emoji: {
- width: 32,
- height: 32,
- padding: StyleConstants.Spacing.S,
- margin: StyleConstants.Spacing.S
- }
-})
-
export default EmojisList
diff --git a/src/components/Hashtag.tsx b/src/components/Hashtag.tsx
index fede3ab9..7efccdf3 100644
--- a/src/components/Hashtag.tsx
+++ b/src/components/Hashtag.tsx
@@ -4,8 +4,9 @@ import { TabLocalStackParamList } from '@utils/navigation/navigators'
import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager'
import React, { useCallback } from 'react'
-import { Pressable, StyleSheet, Text } from 'react-native'
+import { Pressable } from 'react-native'
import analytics from './analytics'
+import CustomText from './Text'
export interface Props {
hashtag: Mastodon.Tag
@@ -30,23 +31,14 @@ const ComponentHashtag: React.FC = ({
return (
-
+
#{hashtag.name}
-
+
)
}
-const styles = StyleSheet.create({
- itemDefault: {
- padding: StyleConstants.Spacing.S * 1.5
- },
- itemHashtag: {
- ...StyleConstants.FontStyle.M
- }
-})
-
export default ComponentHashtag
diff --git a/src/components/Header/Center.tsx b/src/components/Header/Center.tsx
index eb6965ea..5b8656d3 100644
--- a/src/components/Header/Center.tsx
+++ b/src/components/Header/Center.tsx
@@ -1,7 +1,7 @@
+import CustomText from '@components/Text'
import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager'
import React from 'react'
-import { StyleSheet, Text } from 'react-native'
export interface Props {
content: string
@@ -14,11 +14,12 @@ const HeaderCenter = React.memo(
const { colors } = useTheme()
return (
-
)
@@ -26,11 +27,4 @@ const HeaderCenter = React.memo(
(prev, next) => prev.content === next.content
)
-const styles = StyleSheet.create({
- text: {
- fontSize: 18,
- fontWeight: StyleConstants.Font.Weight.Bold
- }
-})
-
export default HeaderCenter
diff --git a/src/components/Header/Left.tsx b/src/components/Header/Left.tsx
index 6aabba0d..afb0bb87 100644
--- a/src/components/Header/Left.tsx
+++ b/src/components/Header/Left.tsx
@@ -1,8 +1,9 @@
import Icon from '@components/Icon'
+import CustomText from '@components/Text'
import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager'
import React, { useMemo } from 'react'
-import { Pressable, StyleSheet, Text } from 'react-native'
+import { Pressable } from 'react-native'
export interface Props {
type?: 'icon' | 'text'
@@ -34,8 +35,9 @@ const HeaderLeft: React.FC = ({
)
case 'text':
return (
-
)
@@ -46,38 +48,27 @@ const HeaderLeft: React.FC = ({
)
}
-const styles = StyleSheet.create({
- base: {
- flexDirection: 'row',
- justifyContent: 'center',
- alignItems: 'center'
- },
- text: {
- ...StyleConstants.FontStyle.M
- }
-})
-
export default HeaderLeft
diff --git a/src/components/Header/Right.tsx b/src/components/Header/Right.tsx
index 94ebf1d8..3c833c86 100644
--- a/src/components/Header/Right.tsx
+++ b/src/components/Header/Right.tsx
@@ -1,14 +1,9 @@
import Icon from '@components/Icon'
+import CustomText from '@components/Text'
import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager'
import React, { useMemo } from 'react'
-import {
- AccessibilityProps,
- Pressable,
- StyleSheet,
- Text,
- View
-} from 'react-native'
+import { AccessibilityProps, Pressable, View } from 'react-native'
import { Flow } from 'react-native-animated-spinkit'
export interface Props {
@@ -72,14 +67,12 @@ const HeaderRight: React.FC = ({
case 'text':
return (
<>
-
{loading && loadingSpinkit}
@@ -97,38 +90,27 @@ const HeaderRight: React.FC = ({
onPress={onPress}
children={children}
disabled={disabled || loading}
- style={[
- styles.base,
- {
- backgroundColor: background
- ? colors.backgroundOverlayDefault
- : undefined,
- minHeight: 44,
- minWidth: 44,
- marginRight: native
- ? -StyleConstants.Spacing.S
- : StyleConstants.Spacing.S,
- ...(type === 'icon' && {
- borderRadius: 100
- }),
- ...(type === 'text' && {
- paddingHorizontal: StyleConstants.Spacing.S
- })
- }
- ]}
+ style={{
+ flexDirection: 'row',
+ justifyContent: 'center',
+ alignItems: 'center',
+ backgroundColor: background
+ ? colors.backgroundOverlayDefault
+ : undefined,
+ minHeight: 44,
+ minWidth: 44,
+ marginRight: native
+ ? -StyleConstants.Spacing.S
+ : StyleConstants.Spacing.S,
+ ...(type === 'icon' && {
+ borderRadius: 100
+ }),
+ ...(type === 'text' && {
+ paddingHorizontal: StyleConstants.Spacing.S
+ })
+ }}
/>
)
}
-const styles = StyleSheet.create({
- base: {
- flexDirection: 'row',
- justifyContent: 'center',
- alignItems: 'center'
- },
- text: {
- ...StyleConstants.FontStyle.M
- }
-})
-
export default HeaderRight
diff --git a/src/components/Input.tsx b/src/components/Input.tsx
index 123c8165..d3f7f34b 100644
--- a/src/components/Input.tsx
+++ b/src/components/Input.tsx
@@ -9,17 +9,11 @@ import React, {
useRef,
useState
} from 'react'
-import {
- Platform,
- StyleSheet,
- Text,
- TextInput,
- TextInputProps,
- View
-} from 'react-native'
+import { Platform, TextInput, TextInputProps, View } from 'react-native'
import Animated, { useAnimatedStyle, withTiming } from 'react-native-reanimated'
import { ComponentEmojis, EmojisButton, EmojisList } from './Emojis'
import EmojisContext from './Emojis/helpers/EmojisContext'
+import CustomText from './Text'
export interface Props {
autoFocus?: boolean
@@ -106,14 +100,14 @@ const Input: React.FC = ({
maxLength={options?.maxLength}
>
{({ emojisDispatch }) => (
@@ -124,16 +118,15 @@ const Input: React.FC = ({
setInputFocused(false)
emojisDispatch({ type: 'activate', payload: false })
}}
- style={[
- styles.textInput,
- {
- color: colors.primaryDefault,
- minHeight:
- Platform.OS === 'ios' && multiline
- ? StyleConstants.Font.LineHeight.M * 5
- : undefined
- }
- ]}
+ style={{
+ flex: 1,
+ fontSize: StyleConstants.Font.Size.M,
+ color: colors.primaryDefault,
+ minHeight:
+ Platform.OS === 'ios' && multiline
+ ? StyleConstants.Font.LineHeight.M * 5
+ : undefined
+ }}
onChangeText={setValue}
onSelectionChange={onSelectionChange}
value={value}
@@ -149,16 +142,25 @@ const Input: React.FC = ({
{title ? (
{title}
) : null}
{options?.maxLength && value?.length ? (
-
+
{value?.length} / {options.maxLength}
-
+
) : null}
{inputFocused ? : null}
@@ -168,24 +170,4 @@ const Input: React.FC = ({
)
}
-const styles = StyleSheet.create({
- base: {
- alignItems: 'flex-end',
- borderWidth: 1,
- marginVertical: StyleConstants.Spacing.S,
- padding: StyleConstants.Spacing.S
- },
- title: {
- position: 'absolute'
- },
- textInput: {
- flex: 1,
- fontSize: StyleConstants.Font.Size.M
- },
- maxLength: {
- ...StyleConstants.FontStyle.S,
- paddingLeft: StyleConstants.Spacing.XS
- }
-})
-
export default Input
diff --git a/src/components/Instance.tsx b/src/components/Instance.tsx
index 868929c0..5e8c1c75 100644
--- a/src/components/Instance.tsx
+++ b/src/components/Instance.tsx
@@ -15,8 +15,6 @@ import {
Image,
KeyboardAvoidingView,
Platform,
- StyleSheet,
- Text,
TextInput,
View
} from 'react-native'
@@ -26,6 +24,7 @@ import { Placeholder } from 'rn-placeholder'
import analytics from './analytics'
import InstanceAuth from './Instance/Auth'
import InstanceInfo from './Instance/Info'
+import CustomText from './Text'
export interface Props {
scrollViewRef?: RefObject
@@ -134,40 +133,50 @@ const ComponentInstance: React.FC = ({
behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
>
{!disableHeaderImage ? (
-
+
) : null}
-
-
+
+
= ({
content={instanceQuery.data?.title || undefined}
potentialWidth={2}
/>
-
+
= ({
potentialWidth={4}
/>
= ({
potentialWidth={4}
/>
= ({
/>
-
+
- {
if (screenReaderEnabled) {
@@ -254,7 +276,7 @@ const ComponentInstance: React.FC = ({
}}
>
{t('server.disclaimer.base')}
- {
@@ -265,8 +287,8 @@ const ComponentInstance: React.FC = ({
}}
>
{t('server.disclaimer.privacy')}
-
-
+
+
@@ -276,54 +298,4 @@ const ComponentInstance: React.FC = ({
)
}
-const styles = StyleSheet.create({
- imageContainer: { flexDirection: 'row' },
- image: { resizeMode: 'contain', flex: 1, aspectRatio: 16 / 9 },
- base: {
- marginTop: StyleConstants.Spacing.L,
- marginHorizontal: StyleConstants.Spacing.Global.PagePadding
- },
- inputRow: {
- flexDirection: 'row',
- marginHorizontal: StyleConstants.Spacing.Global.PagePadding
- },
- prefix: {
- borderBottomWidth: 1,
- ...StyleConstants.FontStyle.M
- },
- textInput: {
- flex: 1,
- borderBottomWidth: 1,
- ...StyleConstants.FontStyle.M,
- marginRight: StyleConstants.Spacing.M
- },
- instanceStats: {
- flex: 1,
- flexDirection: 'row'
- },
- stat1: {
- alignItems: 'flex-start'
- },
- stat2: {
- alignItems: 'center'
- },
- stat3: {
- alignItems: 'flex-end'
- },
- disclaimer: {
- flexDirection: 'row',
- marginHorizontal: StyleConstants.Spacing.Global.PagePadding,
- marginVertical: StyleConstants.Spacing.M
- },
- disclaimerIcon: {
- marginTop:
- (StyleConstants.Font.LineHeight.S - StyleConstants.Font.Size.S) / 2,
- marginRight: StyleConstants.Spacing.XS
- },
- disclaimerText: {
- flex: 1,
- ...StyleConstants.FontStyle.S
- }
-})
-
export default ComponentInstance
diff --git a/src/components/Instance/Info.tsx b/src/components/Instance/Info.tsx
index 7a2ca6b1..cc985bd5 100644
--- a/src/components/Instance/Info.tsx
+++ b/src/components/Instance/Info.tsx
@@ -1,7 +1,8 @@
+import CustomText from '@components/Text'
import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager'
import React from 'react'
-import { StyleSheet, Text, View, ViewStyle } from 'react-native'
+import { View, ViewStyle } from 'react-native'
import { PlaceholderLine } from 'rn-placeholder'
export interface Props {
@@ -16,14 +17,33 @@ const InstanceInfo = React.memo(
const { colors } = useTheme()
return (
-
-
- {header}
-
+
+
{content ? (
-
- {content}
-
+
) : (
prev.content === next.content
)
-const styles = StyleSheet.create({
- base: {
- flex: 1,
- marginTop: StyleConstants.Spacing.M,
- paddingLeft: StyleConstants.Spacing.Global.PagePadding,
- paddingRight: StyleConstants.Spacing.Global.PagePadding
- },
- header: {
- ...StyleConstants.FontStyle.S,
- fontWeight: StyleConstants.Font.Weight.Bold,
- marginBottom: StyleConstants.Spacing.XS
- },
- content: {
- ...StyleConstants.FontStyle.M
- }
-})
-
export default InstanceInfo
diff --git a/src/components/Menu/Header.tsx b/src/components/Menu/Header.tsx
index fca2e036..9b2077f1 100644
--- a/src/components/Menu/Header.tsx
+++ b/src/components/Menu/Header.tsx
@@ -1,7 +1,8 @@
import React from 'react'
-import { StyleSheet, Text, View } from 'react-native'
+import { View } from 'react-native'
import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager'
+import CustomText from '@components/Text'
export interface Props {
heading: string
@@ -11,20 +12,16 @@ const MenuHeader: React.FC = ({ heading }) => {
const { colors } = useTheme()
return (
-
- {heading}
+
+
+ {heading}
+
)
}
-const styles = StyleSheet.create({
- base: {
- paddingBottom: StyleConstants.Spacing.S
- },
- text: {
- ...StyleConstants.FontStyle.S,
- fontWeight: StyleConstants.Font.Weight.Bold
- }
-})
-
export default MenuHeader
diff --git a/src/components/Menu/Row.tsx b/src/components/Menu/Row.tsx
index b44e68d3..130a7bf3 100644
--- a/src/components/Menu/Row.tsx
+++ b/src/components/Menu/Row.tsx
@@ -1,4 +1,5 @@
import Icon from '@components/Icon'
+import CustomText from '@components/Text'
import { useAccessibility } from '@utils/accessibility/AccessibilityManager'
import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager'
@@ -99,12 +100,13 @@ const MenuRow: React.FC = ({
/>
) : null}
-
{title}
-
+
@@ -112,18 +114,15 @@ const MenuRow: React.FC = ({
{content ? (
typeof content === 'string' ? (
-
{content}
-
+
) : (
content
)
@@ -150,9 +149,9 @@ const MenuRow: React.FC = ({
) : null}
{description ? (
-
+
{description}
-
+
) : null}
@@ -187,9 +186,6 @@ const styles = StyleSheet.create({
main: {
flex: 1
},
- title: {
- ...StyleConstants.FontStyle.M
- },
description: {
...StyleConstants.FontStyle.S
},
diff --git a/src/components/Message.tsx b/src/components/Message.tsx
index ab6c1468..4fb35c62 100644
--- a/src/components/Message.tsx
+++ b/src/components/Message.tsx
@@ -59,7 +59,7 @@ const displayMessage = ({
if (ref) {
ref.current?.showMessage({
- duration: type === 'error' ? 5000 : duration === 'short' ? 1500 : 3000,
+ duration: type === 'error' ? 8000 : duration === 'short' ? 3000 : 5000,
autoHide,
message,
description,
diff --git a/src/components/Parse/Emojis.tsx b/src/components/Parse/Emojis.tsx
index 0a06b02c..58e905b5 100644
--- a/src/components/Parse/Emojis.tsx
+++ b/src/components/Parse/Emojis.tsx
@@ -1,10 +1,11 @@
+import CustomText from '@components/Text'
import { useAccessibility } from '@utils/accessibility/AccessibilityManager'
import { getSettingsFontsize } from '@utils/slices/settingsSlice'
import { StyleConstants } from '@utils/styles/constants'
import { adaptiveScale } from '@utils/styles/scaling'
import { useTheme } from '@utils/styles/ThemeManager'
import React, { useMemo } from 'react'
-import { StyleSheet, Text } from 'react-native'
+import { StyleSheet } from 'react-native'
import FastImage from 'react-native-fast-image'
import { useSelector } from 'react-redux'
import validUrl from 'valid-url'
@@ -57,7 +58,7 @@ const ParseEmojis = React.memo(
}, [theme, adaptiveFontsize])
return (
-
+
{emojis ? (
content
.split(regexEmoji)
@@ -69,30 +70,34 @@ const ParseEmojis = React.memo(
return emojiShortcode === `:${emoji.shortcode}:`
})
if (emojiIndex === -1) {
- return {emojiShortcode}
+ return (
+
+ {emojiShortcode}
+
+ )
} else {
const uri = reduceMotionEnabled
? emojis[emojiIndex].static_url
: emojis[emojiIndex].url
if (validUrl.isHttpsUri(uri)) {
return (
-
+
{i === 0 ? ' ' : undefined}
-
+
)
} else {
return null
}
}
} else {
- return {str}
+ return {str}
}
})
) : (
- {content}
+ {content}
)}
-
+
)
},
(prev, next) => prev.content === next.content
diff --git a/src/components/Parse/HTML.tsx b/src/components/Parse/HTML.tsx
index cb9cb39d..d5a2dac7 100644
--- a/src/components/Parse/HTML.tsx
+++ b/src/components/Parse/HTML.tsx
@@ -2,6 +2,7 @@ import analytics from '@components/analytics'
import Icon from '@components/Icon'
import openLink from '@components/openLink'
import ParseEmojis from '@components/Parse/Emojis'
+import CustomText from '@components/Text'
import { useNavigation, useRoute } from '@react-navigation/native'
import { StackNavigationProp } from '@react-navigation/stack'
import { TabLocalStackParamList } from '@utils/navigation/navigators'
@@ -12,7 +13,7 @@ import { adaptiveScale } from '@utils/styles/scaling'
import { useTheme } from '@utils/styles/ThemeManager'
import React, { useCallback, useState } from 'react'
import { useTranslation } from 'react-i18next'
-import { Pressable, Text, View } from 'react-native'
+import { Pressable, View } from 'react-native'
import HTMLView from 'react-native-htmlview'
import { useSelector } from 'react-redux'
@@ -53,7 +54,7 @@ const renderNode = ({
? routeParams.hashtag !== tag[1] && routeParams.hashtag !== tag[2]
: true
return (
-
{node.children[0].data}
{node.children[1]?.children[0].data}
-
+
)
} else if (classes.includes('mention') && mentions) {
const accountIndex = mentions.findIndex(
@@ -82,7 +83,7 @@ const renderNode = ({
? routeParams.account.id !== mentions[accountIndex]?.id
: true
return (
-
{node.children[0].data}
{node.children[1]?.children[0].data}
-
+
)
}
} else {
@@ -113,7 +114,7 @@ const renderNode = ({
const shouldBeTag =
tags && tags.filter(tag => `#${tag.name}` === content).length > 0
return (
-
) : null}
-
+
)
}
break
@@ -252,7 +253,7 @@ const ParseHTML = React.memo(
return (
-
- = ({ date }) => {
- const { t } = useTranslation('componentRelativeTime')
-
- return (
-
- )
-}
-
-export default RelativeTime
diff --git a/src/components/Text.tsx b/src/components/Text.tsx
new file mode 100644
index 00000000..ec6faa2d
--- /dev/null
+++ b/src/components/Text.tsx
@@ -0,0 +1,60 @@
+import { useAccessibility } from '@utils/accessibility/AccessibilityManager'
+import { StyleConstants } from '@utils/styles/constants'
+import { Text, TextProps, TextStyle } from 'react-native'
+
+type Props =
+ | {
+ style?: Omit
+ fontStyle?: undefined
+ fontSize?: 'S' | 'M' | 'L'
+ lineHeight?: 'S' | 'M' | 'L'
+ fontWeight?: 'Normal' | 'Bold'
+ }
+ | {
+ style?: Omit
+ fontStyle: 'S' | 'M' | 'L'
+ fontSize?: undefined
+ lineHeight?: undefined
+ fontWeight?: 'Normal' | 'Bold'
+ }
+
+const CustomText: React.FC = ({
+ children,
+ style,
+ fontStyle,
+ fontSize,
+ fontWeight = 'Normal',
+ lineHeight,
+ ...rest
+}) => {
+ const { boldTextEnabled } = useAccessibility()
+
+ enum BoldMapping {
+ 'Normal' = '600',
+ 'Bold' = '800'
+ }
+
+ return (
+
+ )
+}
+
+export default CustomText
diff --git a/src/components/Timeline/Default.tsx b/src/components/Timeline/Default.tsx
index 5a235b34..3605f240 100644
--- a/src/components/Timeline/Default.tsx
+++ b/src/components/Timeline/Default.tsx
@@ -102,6 +102,7 @@ const TimelineDefault = React.memo(
queryKey={disableOnPress ? undefined : queryKey}
rootQueryKey={disableOnPress ? undefined : rootQueryKey}
status={actualStatus}
+ highlighted={highlighted}
/>
diff --git a/src/components/Timeline/Empty.tsx b/src/components/Timeline/Empty.tsx
index 145db777..af5227e5 100644
--- a/src/components/Timeline/Empty.tsx
+++ b/src/components/Timeline/Empty.tsx
@@ -1,12 +1,13 @@
import analytics from '@components/analytics'
import Button from '@components/Button'
import Icon from '@components/Icon'
+import CustomText from '@components/Text'
import { QueryKeyTimeline, useTimelineQuery } from '@utils/queryHooks/timeline'
import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager'
import React from 'react'
import { useTranslation } from 'react-i18next'
-import { StyleSheet, Text, View } from 'react-native'
+import { View } from 'react-native'
import { Circle } from 'react-native-animated-spinkit'
export interface Props {
@@ -40,9 +41,16 @@ const TimelineEmpty = React.memo(
size={StyleConstants.Font.Size.L}
color={colors.primaryDefault}
/>
-
+
{t('empty.error.message')}
-
+
-
+
{t('empty.success.message')}
-
+
>
)
}
@@ -85,12 +100,4 @@ const TimelineEmpty = React.memo(
() => true
)
-const styles = StyleSheet.create({
- error: {
- ...StyleConstants.FontStyle.M,
- marginTop: StyleConstants.Spacing.S,
- marginBottom: StyleConstants.Spacing.L
- }
-})
-
export default TimelineEmpty
diff --git a/src/components/Timeline/Footer.tsx b/src/components/Timeline/Footer.tsx
index 95392e59..ab4e1934 100644
--- a/src/components/Timeline/Footer.tsx
+++ b/src/components/Timeline/Footer.tsx
@@ -1,10 +1,11 @@
import Icon from '@components/Icon'
+import CustomText from '@components/Text'
import { QueryKeyTimeline, useTimelineQuery } from '@utils/queryHooks/timeline'
import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager'
import React from 'react'
import { Trans } from 'react-i18next'
-import { Text, View } from 'react-native'
+import { View } from 'react-native'
import { Circle } from 'react-native-animated-spinkit'
export interface Props {
@@ -38,9 +39,7 @@ const TimelineFooter = React.memo(
{!disableInfinity && hasNextPage ? (
) : (
-
+
]}
/>
-
+
)}
)
diff --git a/src/components/Timeline/Lookback.tsx b/src/components/Timeline/Lookback.tsx
index ff4b78ca..aaa9ee2e 100644
--- a/src/components/Timeline/Lookback.tsx
+++ b/src/components/Timeline/Lookback.tsx
@@ -1,8 +1,9 @@
+import CustomText from '@components/Text'
import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager'
import React from 'react'
import { useTranslation } from 'react-i18next'
-import { Text, View } from 'react-native'
+import { View } from 'react-native'
const TimelineLookback = React.memo(
() => {
@@ -19,14 +20,9 @@ const TimelineLookback = React.memo(
backgroundColor: colors.backgroundDefault
}}
>
-
+
{t('lookback.message')}
-
+
)
},
diff --git a/src/components/Timeline/Refresh.tsx b/src/components/Timeline/Refresh.tsx
index 10d2a4c8..71b0d266 100644
--- a/src/components/Timeline/Refresh.tsx
+++ b/src/components/Timeline/Refresh.tsx
@@ -1,5 +1,6 @@
import haptics from '@components/haptics'
import Icon from '@components/Icon'
+import CustomText from '@components/Text'
import {
QueryKeyTimeline,
TimelineData,
@@ -9,7 +10,7 @@ import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager'
import React, { RefObject, useCallback, useRef, useState } from 'react'
import { useTranslation } from 'react-i18next'
-import { FlatList, Platform, StyleSheet, Text, View } from 'react-native'
+import { FlatList, Platform, View } from 'react-native'
import { Circle } from 'react-native-animated-spinkit'
import Animated, {
Extrapolate,
@@ -251,9 +252,18 @@ const TimelineRefresh: React.FC = ({
return (
-
+
{isFetching ? (
-
+
= ({
) : (
<>
-
-
+
@@ -285,9 +305,15 @@ const TimelineRefresh: React.FC = ({
}
/>
-
-
+
@@ -299,25 +325,4 @@ const TimelineRefresh: React.FC = ({
)
}
-const styles = StyleSheet.create({
- base: {
- position: 'absolute',
- top: 0,
- left: 0,
- right: 0,
- height: CONTAINER_HEIGHT * 2,
- alignItems: 'center'
- },
- container1: {
- flex: 1,
- flexDirection: 'row',
- height: CONTAINER_HEIGHT
- },
- container2: { height: CONTAINER_HEIGHT, justifyContent: 'center' },
- explanation: {
- fontSize: StyleConstants.Font.Size.S,
- lineHeight: CONTAINER_HEIGHT
- }
-})
-
export default TimelineRefresh
diff --git a/src/components/Timeline/Shared/Actions.tsx b/src/components/Timeline/Shared/Actions.tsx
index 336a5217..21668903 100644
--- a/src/components/Timeline/Shared/Actions.tsx
+++ b/src/components/Timeline/Shared/Actions.tsx
@@ -1,6 +1,7 @@
import analytics from '@components/analytics'
import Icon from '@components/Icon'
import { displayMessage } from '@components/Message'
+import CustomText from '@components/Text'
import { useNavigation } from '@react-navigation/native'
import { StackNavigationProp } from '@react-navigation/stack'
import { RootStackParamList } from '@utils/navigation/navigators'
@@ -13,7 +14,7 @@ import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager'
import React, { useCallback, useMemo } from 'react'
import { useTranslation } from 'react-i18next'
-import { Pressable, StyleSheet, Text, View } from 'react-native'
+import { Pressable, StyleSheet, View } from 'react-native'
import { useQueryClient } from 'react-query'
export interface Props {
@@ -185,7 +186,7 @@ const TimelineActions: React.FC = ({
size={StyleConstants.Font.Size.L}
/>
{status.replies_count > 0 ? (
- = ({
}}
>
{status.replies_count}
-
+
) : null}
>
),
@@ -213,7 +214,7 @@ const TimelineActions: React.FC = ({
size={StyleConstants.Font.Size.L}
/>
{status.reblogs_count > 0 ? (
- = ({
}}
>
{status.reblogs_count}
-
+
) : null}
>
)
@@ -236,7 +237,7 @@ const TimelineActions: React.FC = ({
size={StyleConstants.Font.Size.L}
/>
{status.favourites_count > 0 ? (
- = ({
}}
>
{status.favourites_count}
-
+
) : null}
>
)
@@ -269,7 +270,7 @@ const TimelineActions: React.FC = ({
: StyleConstants.Avatar.M + StyleConstants.Spacing.S
}}
>
-
+
= ({
}
const styles = StyleSheet.create({
- actions: {
- flexDirection: 'row'
- },
action: {
flex: 1,
flexDirection: 'row',
diff --git a/src/components/Timeline/Shared/Attachment/Unsupported.tsx b/src/components/Timeline/Shared/Attachment/Unsupported.tsx
index 03d8d260..3d5d5db9 100644
--- a/src/components/Timeline/Shared/Attachment/Unsupported.tsx
+++ b/src/components/Timeline/Shared/Attachment/Unsupported.tsx
@@ -1,11 +1,12 @@
import analytics from '@components/analytics'
import Button from '@components/Button'
import openLink from '@components/openLink'
+import CustomText from '@components/Text'
import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager'
import React from 'react'
import { useTranslation } from 'react-i18next'
-import { StyleSheet, Text, View } from 'react-native'
+import { View } from 'react-native'
import { Blurhash } from 'react-native-blurhash'
import attachmentAspectRatio from './aspectRatio'
@@ -27,10 +28,14 @@ const AttachmentUnsupported: React.FC = ({
return (
{attachment.blurhash ? (
= ({
) : null}
{!sensitiveShown ? (
<>
-
{t('shared.attachment.unsupported.text')}
-
+
{attachment.remote_url ? (