diff --git a/.gitignore b/.gitignore index 012205e8..4aedd892 100644 --- a/.gitignore +++ b/.gitignore @@ -43,6 +43,8 @@ local.properties *.iml *.hprof .cxx/ +*.keystore +!debug.keystore # node.js # @@ -50,12 +52,6 @@ node_modules/ npm-debug.log yarn-error.log -# BUCK -buck-out/ -\.buckd/ -*.keystore -!debug.keystore - # Bundle artifacts *.jsbundle @@ -67,6 +63,9 @@ buck-out/ web-build/ dist/ +# Temporary files created by Metro to check the health of the file watcher +.metro-health-check* + # @end expo-cli # yarn 3 diff --git a/.nvmrc b/.nvmrc index 19c7bdba..25bf17fc 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -16 \ No newline at end of file +18 \ No newline at end of file diff --git a/README.md b/README.md index d88717bc..df4b242e 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ Please **do not** create a pull request to update translation. tooot's translati - [@Hikaru](https://github.com/Hikali-47041) and [@la_la](https://mstdn.jp/@la_la_la) for Japanese translation - [@hellojaccc](https://github.com/hellojaccc) for Korean translation - [@jan-vandenberg](https://crowdin.com/profile/jan-vandenberg) for Dutch translation +- [@gaute](https://gauteweb.net/) for Norwegian translation - [@luizpicolo](https://github.com/luizpicolo) for Brazilian Portuguese - [@janlindblom](https://github.com/janlindblom) for Swedish - [@ihoryan](https://crowdin.com/profile/ihoryan) for Ukrainian diff --git a/android/app/BUCK b/android/app/BUCK deleted file mode 100644 index 418189ca..00000000 --- a/android/app/BUCK +++ /dev/null @@ -1,55 +0,0 @@ -# To learn about Buck see [Docs](https://buckbuild.com/). -# To run your application with Buck: -# - install Buck -# - `npm start` - to start the packager -# - `cd android` -# - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"` -# - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck -# - `buck install -r android/app` - compile, install and run application -# - -load(":build_defs.bzl", "create_aar_targets", "create_jar_targets") - -lib_deps = [] - -create_aar_targets(glob(["libs/*.aar"])) - -create_jar_targets(glob(["libs/*.jar"])) - -android_library( - name = "all-libs", - exported_deps = lib_deps, -) - -android_library( - name = "app-code", - srcs = glob([ - "src/main/java/**/*.java", - ]), - deps = [ - ":all-libs", - ":build_config", - ":res", - ], -) - -android_build_config( - name = "build_config", - package = "com.xmflsct.app.tooot", -) - -android_resource( - name = "res", - package = "com.xmflsct.app.tooot", - res = "src/main/res", -) - -android_binary( - name = "app", - keystore = "//android/keystores:debug", - manifest = "src/main/AndroidManifest.xml", - package_type = "debug", - deps = [ - ":app-code", - ], -) diff --git a/android/app/build.gradle b/android/app/build.gradle index 6411e770..82a666b9 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,129 +1,86 @@ apply plugin: "com.android.application" +apply plugin: "com.facebook.react" apply plugin: 'com.google.gms.google-services' 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 - * and bundleReleaseJsAndAssets). - * These basically call `react-native bundle` with the correct arguments during the Android build - * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the - * bundle directly from the development server. Below you can see all the possible configurations - * and their defaults. If you decide to add a configuration block, make sure to add it before the - * `apply from: "../../node_modules/react-native/react.gradle"` line. - * - * project.ext.react = [ - * // the name of the generated asset file containing your JS bundle - * bundleAssetName: "index.android.bundle", - * - * // the entry file for bundle generation. If none specified and - * // "index.android.js" exists, it will be used. Otherwise "index.js" is - * // default. Can be overridden with ENTRY_FILE environment variable. - * entryFile: "index.android.js", - * - * // https://reactnative.dev/docs/performance#enable-the-ram-format - * bundleCommand: "ram-bundle", - * - * // whether to bundle JS and assets in debug mode - * bundleInDebug: false, - * - * // whether to bundle JS and assets in release mode - * bundleInRelease: true, - * - * // whether to bundle JS and assets in another build variant (if configured). - * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants - * // The configuration property can be in the following formats - * // 'bundleIn${productFlavor}${buildType}' - * // 'bundleIn${buildType}' - * // bundleInFreeDebug: true, - * // bundleInPaidRelease: true, - * // bundleInBeta: true, - * - * // whether to disable dev mode in custom build variants (by default only disabled in release) - * // for example: to disable dev mode in the staging build type (if configured) - * devDisabledInStaging: true, - * // The configuration property can be in the following formats - * // 'devDisabledIn${productFlavor}${buildType}' - * // 'devDisabledIn${buildType}' - * - * // the root of your project, i.e. where "package.json" lives - * root: "../../", - * - * // where to put the JS bundle asset in debug mode - * jsBundleDirDebug: "$buildDir/intermediates/assets/debug", - * - * // where to put the JS bundle asset in release mode - * jsBundleDirRelease: "$buildDir/intermediates/assets/release", - * - * // where to put drawable resources / React Native assets, e.g. the ones you use via - * // require('./image.png')), in debug mode - * resourcesDirDebug: "$buildDir/intermediates/res/merged/debug", - * - * // where to put drawable resources / React Native assets, e.g. the ones you use via - * // require('./image.png')), in release mode - * resourcesDirRelease: "$buildDir/intermediates/res/merged/release", - * - * // by default the gradle tasks are skipped if none of the JS files or assets change; this means - * // that we don't look at files in android/ or ios/ to determine whether the tasks are up to - * // date; if you have any other folders that you want to ignore for performance reasons (gradle - * // indexes the entire tree), add them here. Alternatively, if you have JS files in android/ - * // for example, you might want to remove it from here. - * inputExcludes: ["android/**", "ios/**"], - * - * // override which node gets called and with what additional arguments - * nodeExecutableAndArgs: ["node"], - * - * // supply additional arguments to the packager - * extraPackagerArgs: [] - * ] + * This is the configuration block to customize your React Native Android app. + * By default you don't need to apply any configuration, just uncomment the lines you need. */ -project.ext.react = [ - enableHermes: true, -] - -apply from: new File(["node", "--print", "require.resolve('react-native/package.json')"].execute().text.trim(), "../react.gradle") +react { + /* Folders */ + // The root of your project, i.e. where "package.json" lives. Default is '..' + // root = file("../") + // The folder where the react-native NPM package is. Default is ../node_modules/react-native + // reactNativeDir = file("../node_modules/react-native") + // The folder where the react-native Codegen package is. Default is ../node_modules/react-native-codegen + // codegenDir = file("../node_modules/react-native-codegen") + // The cli.js file which is the React Native CLI entrypoint. Default is ../node_modules/react-native/cli.js + // cliFile = file("../node_modules/react-native/cli.js") + /* Variants */ + // The list of variants to that are debuggable. For those we're going to + // skip the bundling of the JS bundle and the assets. By default is just 'debug'. + // If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants. + // debuggableVariants = ["liteDebug", "prodDebug"] + /* Bundling */ + // A list containing the node command and its flags. Default is just 'node'. + // nodeExecutableAndArgs = ["node"] + // + // The command to run when bundling. By default is 'bundle' + // bundleCommand = "ram-bundle" + // + // The path to the CLI configuration file. Default is empty. + // bundleConfig = file(../rn-cli.config.js) + // + // The name of the generated asset file containing your JS bundle + // bundleAssetName = "MyApplication.android.bundle" + // + // The entry file for bundle generation. Default is 'index.android.js' or 'index.js' + // entryFile = file("../js/MyApplication.android.js") + // + // A list of extra flags to pass to the 'bundle' commands. + // See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle + // extraPackagerArgs = [] + /* Hermes Commands */ + // The hermes compiler command to run. By default it is 'hermesc' + // hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc" + // + // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map" + // hermesFlags = ["-O", "-output-source-map"] +} /** - * Set this to true to create two separate APKs instead of one: - * - An APK that only works on ARM devices - * - An APK that only works on x86 devices - * The advantage is the size of the APK is reduced by about 4MB. - * Upload all the APKs to the Play Store and people will download - * the correct one based on the CPU architecture of their device. + * Set this to true to create four separate APKs instead of one, + * one for each native architecture. This is useful if you don't + * use App Bundles (https://developer.android.com/guide/app-bundle/) + * and want to have separate APKs to upload to the Play Store. */ def enableSeparateBuildPerCPUArchitecture = false /** - * Run Proguard to shrink the Java bytecode in release builds. + * Set this to true to Run Proguard on Release builds to minify the Java bytecode. */ def enableProguardInReleaseBuilds = false /** - * The preferred build flavor of JavaScriptCore. + * The preferred build flavor of JavaScriptCore (JSC) * * For example, to use the international variant, you can use: * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` * * The international variant includes ICU i18n library and necessary data * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that - * give correct results when using with locales other than en-US. Note that + * give correct results when using with locales other than en-US. Note that * this variant is about 6MiB larger per architecture than default. */ def jscFlavor = 'org.webkit:android-jsc:+' /** - * Whether to enable the Hermes VM. - * - * This should be set on project.ext.react and mirrored here. If it is not set - * on project.ext.react, JavaScript will not be compiled to Hermes Bytecode - * and the benefits of using Hermes will therefore be sharply reduced. - */ -def enableHermes = project.ext.react.get("enableHermes", true); - -/** - * Architectures to build native code for. + * Private function to get the list of Native Architectures you want to build. + * This reads the value from reactNativeArchitectures in your gradle.properties + * file and works together with the --active-arch-only flag of react-native run-android. */ def reactNativeArchitectures() { def value = project.getProperties().get("reactNativeArchitectures") @@ -140,69 +97,13 @@ android { targetCompatibility JavaVersion.VERSION_1_8 } + namespace "com.xmflsct.app.tooot" defaultConfig { applicationId 'com.xmflsct.app.tooot' minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 50 versionName "0.2" - buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString() - if (isNewArchitectureEnabled()) { - // We configure the CMake build only if you decide to opt-in for the New Architecture. - externalNativeBuild { - cmake { - arguments "-DPROJECT_BUILD_DIR=$buildDir", - "-DREACT_ANDROID_DIR=$rootDir/../node_modules/react-native/ReactAndroid", - "-DREACT_ANDROID_BUILD_DIR=$rootDir/../node_modules/react-native/ReactAndroid/build", - "-DNODE_MODULES_DIR=$rootDir/../node_modules", - "-DANDROID_STL=c++_shared" - } - } - if (!enableSeparateBuildPerCPUArchitecture) { - ndk { - abiFilters (*reactNativeArchitectures()) - } - } - } - } - if (isNewArchitectureEnabled()) { - // We configure the CMake build only if you decide to opt-in for the New Architecture. - externalNativeBuild { - cmake { - path "$projectDir/src/main/jni/CMakeLists.txt" - } - } - 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 configureCMakeDebug* tasks and the preBuild tasks. - // This can be removed once this is solved: https://issuetracker.google.com/issues/207403732 - configureCMakeRelWithDebInfo.dependsOn(preReleaseBuild) - configureCMakeDebug.dependsOn(preDebugBuild) - reactNativeArchitectures().each { architecture -> - tasks.findByName("configureCMakeDebug[${architecture}]")?.configure { - dependsOn("preDebugBuild") - } - tasks.findByName("configureCMakeRelWithDebInfo[${architecture}]")?.configure { - dependsOn("preReleaseBuild") - } - } - } } splits { abi { @@ -232,7 +133,6 @@ android { proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" } } - namespace 'com.xmflsct.app.tooot' // applicationVariants are e.g. debug, release applicationVariants.all { variant -> @@ -255,10 +155,6 @@ dependencies { force = true } - implementation fileTree(dir: "libs", include: ["*.jar"]) - //noinspection GradleDynamicVersion - implementation "com.facebook.react:react-native:+" // From node_modules - def isGifEnabled = (findProperty('expo.gif.enabled') ?: "") == "true"; def isWebpEnabled = (findProperty('expo.webp.enabled') ?: "") == "true"; def isWebpAnimatedEnabled = (findProperty('expo.webp.animated') ?: "") == "true"; @@ -284,58 +180,21 @@ dependencies { } } - implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0" - debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") { - exclude group:'com.facebook.fbjni' - } + // The version of react-native is set by the React Native Gradle Plugin + implementation("com.facebook.react:react-android") + implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.0.0") + debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") { - exclude group:'com.facebook.flipper' exclude group:'com.squareup.okhttp3', module:'okhttp' } - debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") { - exclude group:'com.facebook.flipper' - } - if (enableHermes) { - //noinspection GradleDynamicVersion - implementation("com.facebook.react:hermes-engine:+") { // From node_modules - exclude group:'com.facebook.fbjni' - } + debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") + if (hermesEnabled.toBoolean()) { + implementation("com.facebook.react:hermes-android") } else { implementation jscFlavor } } -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 transitive 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") - substitute(module("com.facebook.react:hermes-engine")) - .using(project(":ReactAndroid:hermes-engine")) - .because("On New Architecture we're building Hermes 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.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" -} diff --git a/android/app/build_defs.bzl b/android/app/build_defs.bzl deleted file mode 100644 index fff270f8..00000000 --- a/android/app/build_defs.bzl +++ /dev/null @@ -1,19 +0,0 @@ -"""Helper definitions to glob .aar and .jar targets""" - -def create_aar_targets(aarfiles): - for aarfile in aarfiles: - name = "aars__" + aarfile[aarfile.rindex("/") + 1:aarfile.rindex(".aar")] - lib_deps.append(":" + name) - android_prebuilt_aar( - name = name, - aar = aarfile, - ) - -def create_jar_targets(jarfiles): - for jarfile in jarfiles: - name = "jars__" + jarfile[jarfile.rindex("/") + 1:jarfile.rindex(".jar")] - lib_deps.append(":" + name) - prebuilt_jar( - name = name, - binary_jar = jarfile, - ) diff --git a/android/app/src/debug/java/com/tooot/ReactNativeFlipper.java b/android/app/src/debug/java/com/tooot/ReactNativeFlipper.java index 15f30c10..65d4ac23 100644 --- a/android/app/src/debug/java/com/tooot/ReactNativeFlipper.java +++ b/android/app/src/debug/java/com/tooot/ReactNativeFlipper.java @@ -17,7 +17,6 @@ import com.facebook.flipper.plugins.inspector.DescriptorMapping; import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin; 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; @@ -25,12 +24,15 @@ import com.facebook.react.bridge.ReactContext; import com.facebook.react.modules.network.NetworkingModule; import okhttp3.OkHttpClient; +/** + * Class responsible of loading Flipper inside your React Native application. This is the debug + * flavor of it. Here you can add your own plugins and customize the Flipper setup. + */ public class ReactNativeFlipper { public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { if (FlipperUtils.shouldEnableFlipper(context)) { final FlipperClient client = AndroidFlipperClient.getInstance(context); client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults())); - client.addPlugin(new ReactFlipperPlugin()); client.addPlugin(new DatabasesFlipperPlugin(context)); client.addPlugin(new SharedPreferencesFlipperPlugin(context)); client.addPlugin(CrashReporterPlugin.getInstance()); diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 3b22e22f..b59f9ac8 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,6 +1,4 @@ - + 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 ba646dfe..519061ba 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 @@ -3,7 +3,8 @@ import android.os.Bundle; import com.facebook.react.ReactActivity; import com.facebook.react.ReactActivityDelegate; -import com.facebook.react.ReactRootView; +import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint; +import com.facebook.react.defaults.DefaultReactActivityDelegate; import expo.modules.ReactActivityDelegateWrapper; @@ -23,31 +24,19 @@ public class MainActivity extends ReactActivity { } /** - * Returns the instance of the {@link ReactActivityDelegate}. There the RootView is created and - * you can specify the renderer you wish to use - the new renderer (Fabric) or the old renderer - * (Paper). + * Returns the instance of the {@link ReactActivityDelegate}. Here we use a util class {@link + * DefaultReactActivityDelegate} which allows you to easily enable Fabric and Concurrent React + * (aka React 18) with two boolean flags. */ @Override protected ReactActivityDelegate createReactActivityDelegate() { - return new 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; - } - - @Override - protected boolean isConcurrentRootEnabled() { - // If you opted-in for the New Architecture, we enable Concurrent Root (i.e. React 18). - // More on this on https://reactjs.org/blog/2022/03/29/react-v18.html - return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED; - } + return new DefaultReactActivityDelegate( + this, + getMainComponentName(), + // If you opted-in for the New Architecture, we enable the Fabric Renderer. + DefaultNewArchitectureEntryPoint.getFabricEnabled(), // fabricEnabled + // If you opted-in for the New Architecture, we enable Concurrent React (i.e. React 18). + DefaultNewArchitectureEntryPoint.getConcurrentReactEnabled() // concurrentRootEnabled + ); } } 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 df6bdbcf..a7c328ba 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 @@ -1,32 +1,26 @@ package com.xmflsct.app.tooot; import android.app.Application; -import android.content.Context; import android.content.res.Configuration; import androidx.annotation.NonNull; import com.facebook.react.PackageList; 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.react.defaults.DefaultNewArchitectureEntryPoint; +import com.facebook.react.defaults.DefaultReactNativeHost; import com.facebook.soloader.SoLoader; import expo.modules.ApplicationLifecycleDispatcher; import expo.modules.ReactNativeHostWrapper; -import java.lang.reflect.InvocationTargetException; import java.util.List; -import com.facebook.react.bridge.JSIModulePackage; // <- react-native-reanimated-v2 -import com.swmansion.reanimated.ReanimatedJSIModulePackage; // <- react-native-reanimated-v2 - public class MainApplication extends Application implements ReactApplication { private final ReactNativeHost mReactNativeHost = new ReactNativeHostWrapper( this, - new ReactNativeHost(this) { + new DefaultReactNativeHost(this) { @Override public boolean getUseDeveloperSupport() { return BuildConfig.DEBUG; @@ -46,67 +40,30 @@ public class MainApplication extends Application implements ReactApplication { return "index"; } - @Override // <- react-native-reanimated-v2 - protected JSIModulePackage getJSIModulePackage() { - return new ReanimatedJSIModulePackage(); + @Override + protected boolean isNewArchEnabled() { + return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED; + } + @Override + protected Boolean isHermesEnabled() { + return BuildConfig.IS_HERMES_ENABLED; } }); @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()); - ApplicationLifecycleDispatcher.onApplicationCreate(this); - } - - @Override - public void onConfigurationChanged(@NonNull Configuration newConfig) { - super.onConfigurationChanged(newConfig); - ApplicationLifecycleDispatcher.onConfigurationChanged(this, newConfig); - } - - /** - * Loads Flipper in React Native templates. Call this in the onCreate method with something like - * initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); - * - * @param context - * @param reactInstanceManager - */ - private static void initializeFlipper( - Context context, ReactInstanceManager reactInstanceManager) { - if (BuildConfig.DEBUG) { - try { - /* - We use reflection here to pick up the class that initializes Flipper, - since Flipper library is not available in release mode - */ - Class aClass = Class.forName("com.xmflsct.app.tooot.ReactNativeFlipper"); - aClass - .getMethod("initializeFlipper", Context.class, ReactInstanceManager.class) - .invoke(null, context, reactInstanceManager); - } catch (ClassNotFoundException e) { - e.printStackTrace(); - } catch (NoSuchMethodException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } + if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { + // If you opted-in for the New Architecture, we load the native entry point for this app. + DefaultNewArchitectureEntryPoint.load(); } + // ReactNativeFlipper.initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); } } diff --git a/android/app/src/release/java/com/xmflsct/app/tooot/ReactNativeFlipper.java b/android/app/src/release/java/com/xmflsct/app/tooot/ReactNativeFlipper.java new file mode 100644 index 00000000..5eed4742 --- /dev/null +++ b/android/app/src/release/java/com/xmflsct/app/tooot/ReactNativeFlipper.java @@ -0,0 +1,20 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + *

This source code is licensed under the MIT license found in the LICENSE file in the root + * directory of this source tree. + */ +package com.rndiffapp; + +import android.content.Context; +import com.facebook.react.ReactInstanceManager; + +/** + * Class responsible of loading Flipper inside your React Native application. This is the release + * flavor of it so it's empty as we don't want to load Flipper. + */ +public class ReactNativeFlipper { + public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { + // Do nothing as we don't want to initialize Flipper on Release. + } +} \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle index 65e07931..3126c6b9 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -2,19 +2,14 @@ buildscript { ext { - buildToolsVersion = "31.0.0" + buildToolsVersion = "33.0.0" minSdkVersion = 21 - compileSdkVersion = 31 - targetSdkVersion = 31 - kotlinVersion = '1.6.10' + compileSdkVersion = 33 + targetSdkVersion = 33 + kotlinVersion = '1.8.10' - 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 { - // Otherwise we default to the side-by-side NDK version from AGP. - ndkVersion = "21.4.7075529" - } + // We use NDK 23 which has both M1 support and is the side-by-side NDK version from AGP. + ndkVersion = "23.1.7779620" } repositories { google() @@ -22,31 +17,8 @@ buildscript { jcenter() } dependencies { - classpath('com.android.tools.build:gradle:7.2.2') + classpath("com.android.tools.build:gradle:7.4.1") classpath("com.facebook.react:react-native-gradle-plugin") - classpath("de.undercouch:gradle-download-task:5.0.1") classpath 'com.google.gms:google-services:4.3.14' - - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files - } -} - -allprojects { - repositories { - mavenLocal() - maven { - // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm - url(new File(["node", "--print", "require.resolve('react-native/package.json')"].execute().text.trim(), "../android")) - } - maven { - // Android JSC is installed from npm - url(new File(["node", "--print", "require.resolve('jsc-android/package.json')"].execute().text.trim(), "../dist")) - } - - google() - mavenCentral() - jcenter() - maven { url 'https://www.jitpack.io' } } } diff --git a/android/gradle.properties b/android/gradle.properties index 717237a0..46f5dec1 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -39,6 +39,10 @@ reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 # are providing them. newArchEnabled=false +# Use this property to enable or disable the Hermes JS engine. +# If set to false, you will be using JSC instead. +hermesEnabled=true + org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=4096m -XX:+HeapDumpOnOutOfMemoryError org.gradle.daemon=true org.gradle.parallel=true diff --git a/android/settings.gradle b/android/settings.gradle index 1e5efc0c..8f4a7f84 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -9,9 +9,3 @@ 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') - include(":ReactAndroid:hermes-engine") - project(":ReactAndroid:hermes-engine").projectDir = file('../node_modules/react-native/ReactAndroid/hermes-engine') -} diff --git a/app.config.ts b/app.config.ts index 087f6bc6..88e1fd9d 100644 --- a/app.config.ts +++ b/app.config.ts @@ -8,6 +8,7 @@ export default (): ExpoConfig => ({ slug: 'tooot', scheme: 'tooot', version, + // @ts-ignore extra: { environment: process.env.ENVIRONMENT }, privacy: 'hidden', ios: { diff --git a/crowdin.yml b/crowdin.yml index 061efd79..986b2bd0 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -1,10 +1,5 @@ -# 'preserve_hierarchy': true - files: - [ - { - 'source': '/src/i18n/en/**/*.json', - 'translation': '/src/i18n/%osx_locale%/**/%original_file_name%', - 'ignore': ['*.ts'], - }, - ] + - source: /src/i18n/en/**/*.json + translation: /src/i18n/%osx_locale%/**/%original_file_name% + ignore: + - '*.ts' diff --git a/fastlane/metadata/en-US/release_notes.txt b/fastlane/metadata/en-US/release_notes.txt index 46181811..4745108d 100644 --- a/fastlane/metadata/en-US/release_notes.txt +++ b/fastlane/metadata/en-US/release_notes.txt @@ -1,9 +1,4 @@ Enjoy toooting! This version includes following improvements and fixes: -- Auto fetch remote content in conversations! -- Remember last read position in timeline! -- Follow a user with other logged in accounts -- Allowing adding more context of reports -- Option to disable autoplay gif -- Hide boosts from users -- Followed hashtags are underlined -- Support GoToSocial \ No newline at end of file +- Added following remote instance +- Added set note of followed users +- Best effort load remote user's toots \ No newline at end of file diff --git a/fastlane/metadata/zh-Hans/release_notes.txt b/fastlane/metadata/zh-Hans/release_notes.txt index df4f1cc5..97fbf0b1 100644 --- a/fastlane/metadata/zh-Hans/release_notes.txt +++ b/fastlane/metadata/zh-Hans/release_notes.txt @@ -1,9 +1,4 @@ toooting愉快!此版本包括以下改进和修复: -- 主动获取对话的远程内容 -- 自动加载上次我的关注的阅读位置 -- 用其它已登陆的账户关注用户 -- 可添加举报细节 -- 新增暂停自动播放gif动画选项 -- 隐藏用户的转嘟 -- 下划线高亮正在关注的话题标签 -- 支持GoToSocial \ No newline at end of file +- 新增关注远程实例功能 +- 新增关注用户备注功能 +- 加载远程用户的嘟文 \ No newline at end of file diff --git a/ios/Podfile b/ios/Podfile index faa262d6..f2f83aea 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -3,7 +3,13 @@ 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, '13.0' -install! 'cocoapods', :deterministic_uuids => false +prepare_react_native_project! +flipper_config = ENV['NO_FLIPPER'] == "1" ? FlipperConfiguration.disabled : FlipperConfiguration.enabled +linkage = ENV['USE_FRAMEWORKS'] +if linkage != nil + Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green + use_frameworks! :linkage => linkage.to_sym +end require 'json' podfile_properties = JSON.parse(File.read('./Podfile.properties.json')) rescue {} @@ -19,7 +25,6 @@ target 'tooot' do :path => config[:reactNativePath], :hermes_enabled => true, :fabric_enabled => flags[:fabric_enabled], - # :flipper_configuration => FlipperConfiguration.enabled(["Debug"], { 'Flipper' => '0.159.0' }), :flipper_configuration => FlipperConfiguration.disabled, # An absolute path to your application root. :app_path => "#{Pod::Config.instance.installation_root}/.." diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 4f7f6b9f..f5b404c0 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,69 +1,70 @@ PODS: - boost (1.76.0) - DoubleConversion (1.1.6) - - EXApplication (5.0.1): + - EXApplication (5.1.1): - ExpoModulesCore - - EXAV (13.2.0): + - EXAV (13.2.1): - ExpoModulesCore - ReactCommon/turbomodule/core - - EXConstants (14.2.0): + - EXConstants (14.2.1): - ExpoModulesCore - - EXErrorRecovery (4.0.1): + - EXErrorRecovery (4.1.1): - ExpoModulesCore - - EXFileSystem (15.2.0): + - EXFileSystem (15.2.2): - ExpoModulesCore - - EXFont (11.0.1): + - EXFont (11.1.1): - ExpoModulesCore - - EXNotifications (0.17.0): + - EXNotifications (0.18.1): - ExpoModulesCore - - Expo (47.0.13): + - Expo (48.0.0-beta.2): - ExpoModulesCore - - ExpoCrypto (12.2.0): + - ExpoCrypto (12.2.1): - ExpoModulesCore - - ExpoHaptics (12.2.0): + - ExpoHaptics (12.2.1): - ExpoModulesCore - - ExpoImage (1.0.0-beta.6): + - ExpoImage (1.0.0): - ExpoModulesCore - SDWebImage (~> 5.15.0) - SDWebImageAVIFCoder (~> 0.9.4) - SDWebImageSVGCoder (~> 1.6.1) - SDWebImageWebPCoder (~> 0.9.1) - - ExpoKeepAwake (11.0.1): + - ExpoKeepAwake (12.0.1): - ExpoModulesCore - - ExpoLocalization (14.1.0): + - ExpoLocalization (14.1.1): - ExpoModulesCore - - ExpoModulesCore (1.1.1): + - ExpoModulesCore (1.2.1): - React-Core + - React-RCTAppDelegate - ReactCommon/turbomodule/core - - ExpoRandom (13.1.0): + - ExpoStoreReview (6.2.1): - ExpoModulesCore - - ExpoStoreReview (6.2.0): + - ExpoVideoThumbnails (7.2.1): - ExpoModulesCore - - ExpoVideoThumbnails (7.2.0): + - ExpoWebBrowser (12.1.1): - ExpoModulesCore - - ExpoWebBrowser (12.0.0): + - EXScreenCapture (5.1.1): - ExpoModulesCore - - EXScreenCapture (5.1.0): - - ExpoModulesCore - - EXScreenOrientation (5.1.0): + - EXScreenOrientation (5.1.1): - ExpoModulesCore - React-Core - - EXSecureStore (12.1.0): + - EXSecureStore (12.1.1): - ExpoModulesCore - - EXSplashScreen (0.17.5): + - EXSplashScreen (0.18.1): - ExpoModulesCore - React-Core - - FBLazyVector (0.70.7) - - FBReactNativeSpec (0.70.7): + - FBLazyVector (0.71.3) + - FBReactNativeSpec (0.71.3): - RCT-Folly (= 2021.07.22.00) - - RCTRequired (= 0.70.7) - - RCTTypeSafety (= 0.70.7) - - React-Core (= 0.70.7) - - React-jsi (= 0.70.7) - - ReactCommon/turbomodule/core (= 0.70.7) + - RCTRequired (= 0.71.3) + - RCTTypeSafety (= 0.71.3) + - React-Core (= 0.71.3) + - React-jsi (= 0.71.3) + - ReactCommon/turbomodule/core (= 0.71.3) - fmt (6.2.1) - glog (0.3.5) - - hermes-engine (0.70.7) + - hermes-engine (0.71.3): + - hermes-engine/Pre-built (= 0.71.3) + - hermes-engine/Pre-built (0.71.3) - libaom (2.0.2): - libvmaf - libavif (0.10.1): @@ -103,235 +104,258 @@ PODS: - fmt (~> 6.2.1) - glog - libevent - - RCTRequired (0.70.7) - - RCTTypeSafety (0.70.7): - - FBLazyVector (= 0.70.7) - - RCTRequired (= 0.70.7) - - React-Core (= 0.70.7) - - React (0.70.7): - - React-Core (= 0.70.7) - - React-Core/DevSupport (= 0.70.7) - - React-Core/RCTWebSocket (= 0.70.7) - - React-RCTActionSheet (= 0.70.7) - - React-RCTAnimation (= 0.70.7) - - React-RCTBlob (= 0.70.7) - - React-RCTImage (= 0.70.7) - - React-RCTLinking (= 0.70.7) - - React-RCTNetwork (= 0.70.7) - - React-RCTSettings (= 0.70.7) - - React-RCTText (= 0.70.7) - - React-RCTVibration (= 0.70.7) - - React-bridging (0.70.7): - - RCT-Folly (= 2021.07.22.00) - - React-jsi (= 0.70.7) - - React-callinvoker (0.70.7) - - React-Codegen (0.70.7): - - FBReactNativeSpec (= 0.70.7) - - RCT-Folly (= 2021.07.22.00) - - RCTRequired (= 0.70.7) - - RCTTypeSafety (= 0.70.7) - - React-Core (= 0.70.7) - - React-jsi (= 0.70.7) - - React-jsiexecutor (= 0.70.7) - - ReactCommon/turbomodule/core (= 0.70.7) - - React-Core (0.70.7): + - RCTRequired (0.71.3) + - RCTTypeSafety (0.71.3): + - FBLazyVector (= 0.71.3) + - RCTRequired (= 0.71.3) + - React-Core (= 0.71.3) + - React (0.71.3): + - React-Core (= 0.71.3) + - React-Core/DevSupport (= 0.71.3) + - React-Core/RCTWebSocket (= 0.71.3) + - React-RCTActionSheet (= 0.71.3) + - React-RCTAnimation (= 0.71.3) + - React-RCTBlob (= 0.71.3) + - React-RCTImage (= 0.71.3) + - React-RCTLinking (= 0.71.3) + - React-RCTNetwork (= 0.71.3) + - React-RCTSettings (= 0.71.3) + - React-RCTText (= 0.71.3) + - React-RCTVibration (= 0.71.3) + - React-callinvoker (0.71.3) + - React-Codegen (0.71.3): + - FBReactNativeSpec + - hermes-engine + - RCT-Folly + - RCTRequired + - RCTTypeSafety + - React-Core + - React-jsi + - React-jsiexecutor + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - React-Core (0.71.3): - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-Core/Default (= 0.70.7) - - React-cxxreact (= 0.70.7) - - React-jsi (= 0.70.7) - - React-jsiexecutor (= 0.70.7) - - React-perflogger (= 0.70.7) + - React-Core/Default (= 0.71.3) + - React-cxxreact (= 0.71.3) + - React-hermes + - React-jsi (= 0.71.3) + - React-jsiexecutor (= 0.71.3) + - React-perflogger (= 0.71.3) - Yoga - - React-Core/CoreModulesHeaders (0.70.7): + - React-Core/CoreModulesHeaders (0.71.3): - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.70.7) - - React-jsi (= 0.70.7) - - React-jsiexecutor (= 0.70.7) - - React-perflogger (= 0.70.7) + - React-cxxreact (= 0.71.3) + - React-hermes + - React-jsi (= 0.71.3) + - React-jsiexecutor (= 0.71.3) + - React-perflogger (= 0.71.3) - Yoga - - React-Core/Default (0.70.7): + - React-Core/Default (0.71.3): - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-cxxreact (= 0.70.7) - - React-jsi (= 0.70.7) - - React-jsiexecutor (= 0.70.7) - - React-perflogger (= 0.70.7) + - React-cxxreact (= 0.71.3) + - React-hermes + - React-jsi (= 0.71.3) + - React-jsiexecutor (= 0.71.3) + - React-perflogger (= 0.71.3) - Yoga - - React-Core/DevSupport (0.70.7): + - React-Core/DevSupport (0.71.3): - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-Core/Default (= 0.70.7) - - React-Core/RCTWebSocket (= 0.70.7) - - React-cxxreact (= 0.70.7) - - React-jsi (= 0.70.7) - - React-jsiexecutor (= 0.70.7) - - React-jsinspector (= 0.70.7) - - React-perflogger (= 0.70.7) + - React-Core/Default (= 0.71.3) + - React-Core/RCTWebSocket (= 0.71.3) + - React-cxxreact (= 0.71.3) + - React-hermes + - React-jsi (= 0.71.3) + - React-jsiexecutor (= 0.71.3) + - React-jsinspector (= 0.71.3) + - React-perflogger (= 0.71.3) - Yoga - - React-Core/RCTActionSheetHeaders (0.70.7): + - React-Core/RCTActionSheetHeaders (0.71.3): - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.70.7) - - React-jsi (= 0.70.7) - - React-jsiexecutor (= 0.70.7) - - React-perflogger (= 0.70.7) + - React-cxxreact (= 0.71.3) + - React-hermes + - React-jsi (= 0.71.3) + - React-jsiexecutor (= 0.71.3) + - React-perflogger (= 0.71.3) - Yoga - - React-Core/RCTAnimationHeaders (0.70.7): + - React-Core/RCTAnimationHeaders (0.71.3): - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.70.7) - - React-jsi (= 0.70.7) - - React-jsiexecutor (= 0.70.7) - - React-perflogger (= 0.70.7) + - React-cxxreact (= 0.71.3) + - React-hermes + - React-jsi (= 0.71.3) + - React-jsiexecutor (= 0.71.3) + - React-perflogger (= 0.71.3) - Yoga - - React-Core/RCTBlobHeaders (0.70.7): + - React-Core/RCTBlobHeaders (0.71.3): - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.70.7) - - React-jsi (= 0.70.7) - - React-jsiexecutor (= 0.70.7) - - React-perflogger (= 0.70.7) + - React-cxxreact (= 0.71.3) + - React-hermes + - React-jsi (= 0.71.3) + - React-jsiexecutor (= 0.71.3) + - React-perflogger (= 0.71.3) - Yoga - - React-Core/RCTImageHeaders (0.70.7): + - React-Core/RCTImageHeaders (0.71.3): - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.70.7) - - React-jsi (= 0.70.7) - - React-jsiexecutor (= 0.70.7) - - React-perflogger (= 0.70.7) + - React-cxxreact (= 0.71.3) + - React-hermes + - React-jsi (= 0.71.3) + - React-jsiexecutor (= 0.71.3) + - React-perflogger (= 0.71.3) - Yoga - - React-Core/RCTLinkingHeaders (0.70.7): + - React-Core/RCTLinkingHeaders (0.71.3): - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.70.7) - - React-jsi (= 0.70.7) - - React-jsiexecutor (= 0.70.7) - - React-perflogger (= 0.70.7) + - React-cxxreact (= 0.71.3) + - React-hermes + - React-jsi (= 0.71.3) + - React-jsiexecutor (= 0.71.3) + - React-perflogger (= 0.71.3) - Yoga - - React-Core/RCTNetworkHeaders (0.70.7): + - React-Core/RCTNetworkHeaders (0.71.3): - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.70.7) - - React-jsi (= 0.70.7) - - React-jsiexecutor (= 0.70.7) - - React-perflogger (= 0.70.7) + - React-cxxreact (= 0.71.3) + - React-hermes + - React-jsi (= 0.71.3) + - React-jsiexecutor (= 0.71.3) + - React-perflogger (= 0.71.3) - Yoga - - React-Core/RCTSettingsHeaders (0.70.7): + - React-Core/RCTSettingsHeaders (0.71.3): - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.70.7) - - React-jsi (= 0.70.7) - - React-jsiexecutor (= 0.70.7) - - React-perflogger (= 0.70.7) + - React-cxxreact (= 0.71.3) + - React-hermes + - React-jsi (= 0.71.3) + - React-jsiexecutor (= 0.71.3) + - React-perflogger (= 0.71.3) - Yoga - - React-Core/RCTTextHeaders (0.70.7): + - React-Core/RCTTextHeaders (0.71.3): - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.70.7) - - React-jsi (= 0.70.7) - - React-jsiexecutor (= 0.70.7) - - React-perflogger (= 0.70.7) + - React-cxxreact (= 0.71.3) + - React-hermes + - React-jsi (= 0.71.3) + - React-jsiexecutor (= 0.71.3) + - React-perflogger (= 0.71.3) - Yoga - - React-Core/RCTVibrationHeaders (0.70.7): + - React-Core/RCTVibrationHeaders (0.71.3): - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.70.7) - - React-jsi (= 0.70.7) - - React-jsiexecutor (= 0.70.7) - - React-perflogger (= 0.70.7) + - React-cxxreact (= 0.71.3) + - React-hermes + - React-jsi (= 0.71.3) + - React-jsiexecutor (= 0.71.3) + - React-perflogger (= 0.71.3) - Yoga - - React-Core/RCTWebSocket (0.70.7): + - React-Core/RCTWebSocket (0.71.3): - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-Core/Default (= 0.70.7) - - React-cxxreact (= 0.70.7) - - React-jsi (= 0.70.7) - - React-jsiexecutor (= 0.70.7) - - React-perflogger (= 0.70.7) + - React-Core/Default (= 0.71.3) + - React-cxxreact (= 0.71.3) + - React-hermes + - React-jsi (= 0.71.3) + - React-jsiexecutor (= 0.71.3) + - React-perflogger (= 0.71.3) - Yoga - - React-CoreModules (0.70.7): + - React-CoreModules (0.71.3): - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.70.7) - - React-Codegen (= 0.70.7) - - React-Core/CoreModulesHeaders (= 0.70.7) - - React-jsi (= 0.70.7) - - React-RCTImage (= 0.70.7) - - ReactCommon/turbomodule/core (= 0.70.7) - - React-cxxreact (0.70.7): + - RCTTypeSafety (= 0.71.3) + - React-Codegen (= 0.71.3) + - React-Core/CoreModulesHeaders (= 0.71.3) + - React-jsi (= 0.71.3) + - React-RCTBlob + - React-RCTImage (= 0.71.3) + - ReactCommon/turbomodule/core (= 0.71.3) + - React-cxxreact (0.71.3): - boost (= 1.76.0) - DoubleConversion - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-callinvoker (= 0.70.7) - - React-jsi (= 0.70.7) - - React-jsinspector (= 0.70.7) - - React-logger (= 0.70.7) - - React-perflogger (= 0.70.7) - - React-runtimeexecutor (= 0.70.7) - - React-hermes (0.70.7): + - React-callinvoker (= 0.71.3) + - React-jsi (= 0.71.3) + - React-jsinspector (= 0.71.3) + - React-logger (= 0.71.3) + - React-perflogger (= 0.71.3) + - React-runtimeexecutor (= 0.71.3) + - React-hermes (0.71.3): - DoubleConversion - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - RCT-Folly/Futures (= 2021.07.22.00) - - React-cxxreact (= 0.70.7) - - React-jsi (= 0.70.7) - - React-jsiexecutor (= 0.70.7) - - React-jsinspector (= 0.70.7) - - React-perflogger (= 0.70.7) - - React-jsi (0.70.7): + - React-cxxreact (= 0.71.3) + - React-jsi + - React-jsiexecutor (= 0.71.3) + - React-jsinspector (= 0.71.3) + - React-perflogger (= 0.71.3) + - React-jsi (0.71.3): - boost (= 1.76.0) - DoubleConversion - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-jsi/Default (= 0.70.7) - - React-jsi/Default (0.70.7): - - boost (= 1.76.0) + - React-jsiexecutor (0.71.3): - DoubleConversion - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-jsiexecutor (0.70.7): - - DoubleConversion - - glog - - RCT-Folly (= 2021.07.22.00) - - React-cxxreact (= 0.70.7) - - React-jsi (= 0.70.7) - - React-perflogger (= 0.70.7) - - React-jsinspector (0.70.7) - - React-logger (0.70.7): + - React-cxxreact (= 0.71.3) + - React-jsi (= 0.71.3) + - React-perflogger (= 0.71.3) + - React-jsinspector (0.71.3) + - React-logger (0.71.3): - glog - react-native-blur (4.3.0): - React-Core - - react-native-cameraroll (5.2.3): + - react-native-cameraroll (5.2.4): - React-Core - - react-native-image-picker (5.0.1): + - react-native-image-picker (5.1.0): - React-Core - react-native-ios-context-menu (1.15.3): - React-Core - react-native-language-detection (0.2.2): - React - - react-native-menu (0.7.3): - - React - - react-native-mmkv (2.5.1): + - react-native-mmkv (2.7.0): - MMKV (>= 1.2.13) - React-Core - react-native-netinfo (9.3.7): - React-Core - - react-native-pager-view (6.1.2): + - react-native-pager-view (6.1.4): - React-Core - - react-native-paste-input (0.6.1): + - react-native-paste-input (0.6.2): - React-Core - Swime (= 3.0.6) - react-native-quick-base64 (2.0.5): @@ -342,81 +366,99 @@ PODS: - RCTTypeSafety - React-Core - ReactCommon/turbomodule/core - - react-native-segmented-control (2.2.2): + - react-native-segmented-control (2.4.0): - React-Core - - React-perflogger (0.70.7) - - React-RCTActionSheet (0.70.7): - - React-Core/RCTActionSheetHeaders (= 0.70.7) - - React-RCTAnimation (0.70.7): + - React-perflogger (0.71.3) + - React-RCTActionSheet (0.71.3): + - React-Core/RCTActionSheetHeaders (= 0.71.3) + - React-RCTAnimation (0.71.3): - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.70.7) - - React-Codegen (= 0.70.7) - - React-Core/RCTAnimationHeaders (= 0.70.7) - - React-jsi (= 0.70.7) - - ReactCommon/turbomodule/core (= 0.70.7) - - React-RCTBlob (0.70.7): + - RCTTypeSafety (= 0.71.3) + - React-Codegen (= 0.71.3) + - React-Core/RCTAnimationHeaders (= 0.71.3) + - React-jsi (= 0.71.3) + - ReactCommon/turbomodule/core (= 0.71.3) + - React-RCTAppDelegate (0.71.3): + - RCT-Folly + - RCTRequired + - RCTTypeSafety + - React-Core + - ReactCommon/turbomodule/core + - React-RCTBlob (0.71.3): + - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-Codegen (= 0.70.7) - - React-Core/RCTBlobHeaders (= 0.70.7) - - React-Core/RCTWebSocket (= 0.70.7) - - React-jsi (= 0.70.7) - - React-RCTNetwork (= 0.70.7) - - ReactCommon/turbomodule/core (= 0.70.7) - - React-RCTImage (0.70.7): + - React-Codegen (= 0.71.3) + - React-Core/RCTBlobHeaders (= 0.71.3) + - React-Core/RCTWebSocket (= 0.71.3) + - React-jsi (= 0.71.3) + - React-RCTNetwork (= 0.71.3) + - ReactCommon/turbomodule/core (= 0.71.3) + - React-RCTImage (0.71.3): - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.70.7) - - React-Codegen (= 0.70.7) - - React-Core/RCTImageHeaders (= 0.70.7) - - React-jsi (= 0.70.7) - - React-RCTNetwork (= 0.70.7) - - ReactCommon/turbomodule/core (= 0.70.7) - - React-RCTLinking (0.70.7): - - React-Codegen (= 0.70.7) - - React-Core/RCTLinkingHeaders (= 0.70.7) - - React-jsi (= 0.70.7) - - ReactCommon/turbomodule/core (= 0.70.7) - - React-RCTNetwork (0.70.7): + - RCTTypeSafety (= 0.71.3) + - React-Codegen (= 0.71.3) + - React-Core/RCTImageHeaders (= 0.71.3) + - React-jsi (= 0.71.3) + - React-RCTNetwork (= 0.71.3) + - ReactCommon/turbomodule/core (= 0.71.3) + - React-RCTLinking (0.71.3): + - React-Codegen (= 0.71.3) + - React-Core/RCTLinkingHeaders (= 0.71.3) + - React-jsi (= 0.71.3) + - ReactCommon/turbomodule/core (= 0.71.3) + - React-RCTNetwork (0.71.3): - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.70.7) - - React-Codegen (= 0.70.7) - - React-Core/RCTNetworkHeaders (= 0.70.7) - - React-jsi (= 0.70.7) - - ReactCommon/turbomodule/core (= 0.70.7) - - React-RCTSettings (0.70.7): + - RCTTypeSafety (= 0.71.3) + - React-Codegen (= 0.71.3) + - React-Core/RCTNetworkHeaders (= 0.71.3) + - React-jsi (= 0.71.3) + - ReactCommon/turbomodule/core (= 0.71.3) + - React-RCTSettings (0.71.3): - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.70.7) - - React-Codegen (= 0.70.7) - - React-Core/RCTSettingsHeaders (= 0.70.7) - - React-jsi (= 0.70.7) - - ReactCommon/turbomodule/core (= 0.70.7) - - React-RCTText (0.70.7): - - React-Core/RCTTextHeaders (= 0.70.7) - - React-RCTVibration (0.70.7): + - RCTTypeSafety (= 0.71.3) + - React-Codegen (= 0.71.3) + - React-Core/RCTSettingsHeaders (= 0.71.3) + - React-jsi (= 0.71.3) + - ReactCommon/turbomodule/core (= 0.71.3) + - React-RCTText (0.71.3): + - React-Core/RCTTextHeaders (= 0.71.3) + - React-RCTVibration (0.71.3): - RCT-Folly (= 2021.07.22.00) - - React-Codegen (= 0.70.7) - - React-Core/RCTVibrationHeaders (= 0.70.7) - - React-jsi (= 0.70.7) - - ReactCommon/turbomodule/core (= 0.70.7) - - React-runtimeexecutor (0.70.7): - - React-jsi (= 0.70.7) - - ReactCommon/turbomodule/core (0.70.7): + - React-Codegen (= 0.71.3) + - React-Core/RCTVibrationHeaders (= 0.71.3) + - React-jsi (= 0.71.3) + - ReactCommon/turbomodule/core (= 0.71.3) + - React-runtimeexecutor (0.71.3): + - React-jsi (= 0.71.3) + - ReactCommon/turbomodule/bridging (0.71.3): - DoubleConversion - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-bridging (= 0.70.7) - - React-callinvoker (= 0.70.7) - - React-Core (= 0.70.7) - - React-cxxreact (= 0.70.7) - - React-jsi (= 0.70.7) - - React-logger (= 0.70.7) - - React-perflogger (= 0.70.7) + - React-callinvoker (= 0.71.3) + - React-Core (= 0.71.3) + - React-cxxreact (= 0.71.3) + - React-jsi (= 0.71.3) + - React-logger (= 0.71.3) + - React-perflogger (= 0.71.3) + - ReactCommon/turbomodule/core (0.71.3): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-callinvoker (= 0.71.3) + - React-Core (= 0.71.3) + - React-cxxreact (= 0.71.3) + - React-jsi (= 0.71.3) + - React-logger (= 0.71.3) + - React-perflogger (= 0.71.3) - RNCAsyncStorage (1.17.11): - React-Core - RNCClipboard (1.11.1): - React-Core - RNGestureHandler (2.9.0): - React-Core - - RNReanimated (2.14.4): + - RNReanimated (3.0.0-rc.10): - DoubleConversion - FBLazyVector - FBReactNativeSpec @@ -443,19 +485,19 @@ PODS: - React-RCTText - ReactCommon/turbomodule/core - Yoga - - RNScreens (3.19.0): + - RNScreens (3.20.0): - React-Core - React-RCTImage - - RNSentry (4.14.0): + - RNSentry (5.0.0): - React-Core - - Sentry/HybridSDK (= 7.31.5) + - Sentry/HybridSDK (= 8.0.0) - RNShareMenu (6.0.0): - React - RNSVG (13.8.0): - React-Core - - SDWebImage (5.15.0): - - SDWebImage/Core (= 5.15.0) - - SDWebImage/Core (5.15.0) + - SDWebImage (5.15.4): + - SDWebImage/Core (= 5.15.4) + - SDWebImage/Core (5.15.4) - SDWebImageAVIFCoder (0.9.5): - libavif (>= 0.9.1) - SDWebImage (~> 5.10) @@ -464,7 +506,9 @@ PODS: - SDWebImageWebPCoder (0.9.1): - libwebp (~> 1.0) - SDWebImage/Core (~> 5.13) - - Sentry/HybridSDK (7.31.5) + - Sentry/HybridSDK (8.0.0): + - SentryPrivate (= 8.0.0) + - SentryPrivate (8.0.0) - Swime (3.0.6) - Yoga (1.14.0) @@ -485,7 +529,6 @@ DEPENDENCIES: - ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`) - ExpoLocalization (from `../node_modules/expo-localization/ios`) - ExpoModulesCore (from `../node_modules/expo-modules-core`) - - ExpoRandom (from `../node_modules/expo-random/ios`) - ExpoStoreReview (from `../node_modules/expo-store-review/ios`) - ExpoVideoThumbnails (from `../node_modules/expo-video-thumbnails/ios`) - ExpoWebBrowser (from `../node_modules/expo-web-browser/ios`) @@ -496,13 +539,12 @@ DEPENDENCIES: - 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 (from `../node_modules/react-native/sdks/hermes/hermes-engine.podspec`) + - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) - 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-bridging (from `../node_modules/react-native/ReactCommon`) - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) - React-Codegen (from `build/generated/ios`) - React-Core (from `../node_modules/react-native/`) @@ -519,17 +561,17 @@ DEPENDENCIES: - react-native-image-picker (from `../node_modules/react-native-image-picker`) - react-native-ios-context-menu (from `../node_modules/react-native-ios-context-menu`) - react-native-language-detection (from `../node_modules/react-native-language-detection`) - - "react-native-menu (from `../node_modules/@react-native-menu/menu`)" - react-native-mmkv (from `../node_modules/react-native-mmkv`) - "react-native-netinfo (from `../node_modules/@react-native-community/netinfo`)" - react-native-pager-view (from `../node_modules/react-native-pager-view`) - "react-native-paste-input (from `../node_modules/@mattermost/react-native-paste-input`)" - react-native-quick-base64 (from `../node_modules/react-native-quick-base64`) - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) - - "react-native-segmented-control (from `../node_modules/@react-native-community/segmented-control`)" + - "react-native-segmented-control (from `../node_modules/@react-native-segmented-control/segmented-control`)" - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) + - React-RCTAppDelegate (from `../node_modules/react-native/Libraries/AppDelegate`) - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) @@ -564,6 +606,7 @@ SPEC REPOS: - SDWebImageSVGCoder - SDWebImageWebPCoder - Sentry + - SentryPrivate - Swime EXTERNAL SOURCES: @@ -599,8 +642,6 @@ EXTERNAL SOURCES: :path: "../node_modules/expo-localization/ios" ExpoModulesCore: :path: "../node_modules/expo-modules-core" - ExpoRandom: - :path: "../node_modules/expo-random/ios" ExpoStoreReview: :path: "../node_modules/expo-store-review/ios" ExpoVideoThumbnails: @@ -622,7 +663,7 @@ EXTERNAL SOURCES: glog: :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" hermes-engine: - :podspec: "../node_modules/react-native/sdks/hermes/hermes-engine.podspec" + :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" RCT-Folly: :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" RCTRequired: @@ -631,8 +672,6 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/Libraries/TypeSafety" React: :path: "../node_modules/react-native/" - React-bridging: - :path: "../node_modules/react-native/ReactCommon" React-callinvoker: :path: "../node_modules/react-native/ReactCommon/callinvoker" React-Codegen: @@ -663,8 +702,6 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-ios-context-menu" react-native-language-detection: :path: "../node_modules/react-native-language-detection" - react-native-menu: - :path: "../node_modules/@react-native-menu/menu" react-native-mmkv: :path: "../node_modules/react-native-mmkv" react-native-netinfo: @@ -678,13 +715,15 @@ EXTERNAL SOURCES: react-native-safe-area-context: :path: "../node_modules/react-native-safe-area-context" react-native-segmented-control: - :path: "../node_modules/@react-native-community/segmented-control" + :path: "../node_modules/@react-native-segmented-control/segmented-control" React-perflogger: :path: "../node_modules/react-native/ReactCommon/reactperflogger" React-RCTActionSheet: :path: "../node_modules/react-native/Libraries/ActionSheetIOS" React-RCTAnimation: :path: "../node_modules/react-native/Libraries/NativeAnimation" + React-RCTAppDelegate: + :path: "../node_modules/react-native/Libraries/AppDelegate" React-RCTBlob: :path: "../node_modules/react-native/Libraries/Blob" React-RCTImage: @@ -723,35 +762,34 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/yoga" SPEC CHECKSUMS: - boost: a7c83b31436843459a1961bfd74b96033dc77234 + boost: 57d2868c099736d80fcd648bf211b4431e51a558 DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 - EXApplication: 034b1c40a8e9fe1bff76a1e511ee90dff64ad834 - EXAV: 1242c4c206fc522058a2749019064e979a4c0b76 - EXConstants: 397186c7e312c33eb1ab85fa1f434dc123778136 - EXErrorRecovery: ae43433feb0608a64dc5b1c8363b3e7769a9ea24 - EXFileSystem: d9fea7fe7a4390a0ef226cac33958de9178388b9 - EXFont: 319606bfe48c33b5b5063fb0994afdc496befe80 - EXNotifications: babce2a87b7922051354fcfe7a74dd279b7e272a - Expo: b9fa98bf260992312ee3c424400819fb9beadafe - ExpoCrypto: 98c71864077c4d0fe798a6a5aee1a8c1294cef85 - ExpoHaptics: 97c532f311c3e638c14a6134f23564d007b76de4 - ExpoImage: 748f2b8d3974f1d51c7706fd61057b93241738aa - ExpoKeepAwake: 69b59d0a8d2b24de9f82759c39b3821fec030318 - ExpoLocalization: 28ce7cfa174a752f7ace84189710f1385373655b - ExpoModulesCore: 485dff3a59b036a33b6050c0a5aea3cf1037fdd1 - ExpoRandom: d8fc05d0d071485b06a97ab2a78cb7f8082052cd - ExpoStoreReview: e96ba0690ea21dc5d341cfafd0b26bac7bc974f5 - ExpoVideoThumbnails: 865fa65f2b4f006ff02ef9e3e9c10370d9442d0a - ExpoWebBrowser: 073e50f16669d498fb49063b9b7fe780b24f7fda - EXScreenCapture: bcf94c8199cd1876166e384b2398ff519a8ef7ee - EXScreenOrientation: d43067a93e75234a7ce5154e2759fff2238dbfd5 - EXSecureStore: ec150f49b22269022c6184f1711abb05fe98d72d - EXSplashScreen: 3e989924f61a8dd07ee4ea584c6ba14be9b51949 - FBLazyVector: a6454570f573a0f6f1d397e5a95c13e8e45d1700 - FBReactNativeSpec: 09e8dfba44487e5dc4882a9f5318cde67549549c + EXApplication: d8f53a7eee90a870a75656280e8d4b85726ea903 + EXAV: f1f69397ecdcf44cfacd4ff5d338cd1b96891e87 + EXConstants: f348da07e21b23d2b085e270d7b74f282df1a7d9 + EXErrorRecovery: ebb57ae947ff94667f1cbc12f403bb5a043d734d + EXFileSystem: 844e86ca9b5375486ecc4ef06d3838d5597d895d + EXFont: 6ea3800df746be7233208d80fe379b8ed74f4272 + EXNotifications: dd628737af60fc8cc62dccebacd326b0fbbc0dcb + Expo: 1b7b4ec09bd939db6d98985231a0789aa3f6670a + ExpoCrypto: 477dfe89c81527b376f2c344ca1d2a01244b243c + ExpoHaptics: 5156bc5160d8e04c170dd6e645a71154951a2ad9 + ExpoImage: b6a65c4aa891cdf00bfba0da46df14b27ae09cc7 + ExpoKeepAwake: 69f5f627670d62318410392d03e0b5db0f85759a + ExpoLocalization: f26cd431ad9ea3533c5b08c4fabd879176a794bb + ExpoModulesCore: 2f4bd2ae0cd03d30c3c286f5d843e22f72ccdb55 + ExpoStoreReview: d057dcca4b9c95f3c9db11bd2e168dab9cba59f3 + ExpoVideoThumbnails: 0021303b614a89fcc5df8b59d9d37ddf14a7d4cf + ExpoWebBrowser: 033d34c478d9986da2f1679729041423837626e0 + EXScreenCapture: d9284f4a6508c86d0d463805b93672397d18de0f + EXScreenOrientation: 52220f8f2477ed25a37e3b2cdbbaa8635d250256 + EXSecureStore: e8923258361cc406d0401af380f12bd05b2b720f + EXSplashScreen: cd7fb052dff5ba8311d5c2455ecbebffe1b7a8ca + FBLazyVector: 60195509584153283780abdac5569feffb8f08cc + FBReactNativeSpec: 9c191fb58d06dc05ab5559a5505fc32139e9e4a2 fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b - hermes-engine: 566e656aa95456a3f3f739fd76ea9a9656f2633f + hermes-engine: 38bfe887e456b33b697187570a08de33969f5db7 libaom: 9bb51e0f8f9192245e3ca2a1c9e4375d9cbccc52 libavif: e242998ccec1c83bcba0bbdc256f460ad5077348 libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 @@ -759,62 +797,62 @@ SPEC CHECKSUMS: libwebp: f62cb61d0a484ba548448a4bd52aabf150ff6eef MMKV: 7f34558bbb5a33b0eaefae2de4b6a20a2ffdad6f MMKVCore: ddf41b9d9262f058419f9ba7598719af56c02cd3 - RCT-Folly: 0080d0a6ebf2577475bda044aa59e2ca1f909cda - RCTRequired: 837880d26ec119e105317dc28a456f3016bf16d1 - RCTTypeSafety: 5c854c04c3383cab04f404e25d408ed52124b300 - React: ec6efc54c0fbb7c2e7147624c78065be80753082 - React-bridging: 7dd96a58f896a1a7422a491d17ec644e87277953 - React-callinvoker: f348d204f7bbe6020d4fd0dd57303f5b48a28003 - React-Codegen: 73350192a09163a640c23baf795464474be0d793 - React-Core: c57b11fd672421049038ef36881372da2605a0cd - React-CoreModules: 2d91acffc3924adac6b508e3fc44121aa719ec40 - React-cxxreact: ee2ab13a1db086dc152421aa42dc94cc68f412a1 - React-hermes: be9d64f5019238ce22ae4e7d242c4f2e96d60595 - React-jsi: 04031a830f9714e95d517153817ba7bfc15bfdf8 - React-jsiexecutor: e95cdd036e7947ddf87f3049319ac3064deb76b5 - React-jsinspector: 1c34fea1868136ecde647bc11fae9266d4143693 - React-logger: e9f407f9fdf3f3ce7749ae6f88affe63e8446019 + RCT-Folly: 424b8c9a7a0b9ab2886ffe9c3b041ef628fd4fb1 + RCTRequired: bec48f07daf7bcdc2655a0cde84e07d24d2a9e2a + RCTTypeSafety: 171394eebacf71e1cfad79dbfae7ee8fc16ca80a + React: d7433ccb6a8c36e4cbed59a73c0700fc83c3e98a + React-callinvoker: 15f165009bd22ae829b2b600e50bcc98076ce4b8 + React-Codegen: b5910000eaf1e0c2f47d29be6f82f5f1264420d7 + React-Core: b6f2f78d580a90b83fd7b0d1c6911c799f6eac82 + React-CoreModules: e0cbc1a4f4f3f60e23c476fef7ab37be363ea8c1 + React-cxxreact: c87f3f124b2117d00d410b35f16c2257e25e50fa + React-hermes: c64ca6bdf16a7069773103c9bedaf30ec90ab38f + React-jsi: 39729361645568e238081b3b3180fbad803f25a4 + React-jsiexecutor: 515b703d23ffadeac7687bc2d12fb08b90f0aaa1 + React-jsinspector: 9f7c9137605e72ca0343db4cea88006cb94856dd + React-logger: 957e5dc96d9dbffc6e0f15e0ee4d2b42829ff207 react-native-blur: 50c9feabacbc5f49b61337ebc32192c6be7ec3c3 - react-native-cameraroll: 5b25d0be40185d02e522bf2abf8a1ba4e8faa107 - react-native-image-picker: 8cb4280e2c1efc3daeb2d9d597f9429a60472e40 + react-native-cameraroll: cb752fda6d5268f1646b4390bd5be1f27706b9a0 + react-native-image-picker: c33d4e79f0a14a2b66e5065e14946ae63749660b react-native-ios-context-menu: e529171ba760a1af7f2ef0729f5a7f4d226171c5 react-native-language-detection: f414937fa715108ab50a6269a3de0bcb95e4ceb0 - react-native-menu: 9d7d6f819cc7fa14a15cf86888c53f3240d86f1b - react-native-mmkv: 69b9c003f10afdd01addf7c6ee784ce42ee2eff3 + react-native-mmkv: a2a40a0458bdbc9d43c4e7752ecfc5e3a87b66dd react-native-netinfo: 2517ad504b3d303e90d7a431b0fcaef76d207983 - react-native-pager-view: 54bed894cecebe28cede54c01038d9d1e122de43 - react-native-paste-input: fb7156dc75960c9895ddd9b9d68eeb874c9f323a + react-native-pager-view: b58cb9e9f42f64e50cab3040815772c1d119a2e2 + react-native-paste-input: 3392800944a47c00dddbff23c31c281482209679 react-native-quick-base64: e657e9197e61b60a9dec49807843052b830da254 react-native-safe-area-context: 39c2d8be3328df5d437ac1700f4f3a4f75716acc - react-native-segmented-control: 65df6cd0619b780b3843d574a72d4c7cec396097 - React-perflogger: 52a94f38c19a518d05726624b49bfc192639374d - React-RCTActionSheet: 7b89fe64a852bc3ae39b91dbd142ef09931ef3f7 - React-RCTAnimation: ad84bfbf8c5f6f77e65092d0c2b0506b80b5cf99 - React-RCTBlob: e4ee3ab649459329f5aa59d903762bfbd6164220 - React-RCTImage: aeb508f6ac80a94904a646dde61b0f67ea757ea7 - React-RCTLinking: 1171b3fdc265c479b7039069ce7e8fef68ca70aa - React-RCTNetwork: 5d87cc4afd1fcef86fb2f804f26366f0314769fe - React-RCTSettings: 644545854880b7d03c49f620664a307fd4613a1d - React-RCTText: f8e4a283be2290a76b89f4a83ba2277faf90930d - React-RCTVibration: eb7837d55b87c7a4ead3ab7632ad70dca87c65dc - React-runtimeexecutor: 7cec9ed92ebde8309902530bb566819645c84ee5 - ReactCommon: 0253d197eaa7f6689dcd3e7d5360449ab93e10df + react-native-segmented-control: 06607462630512ff8eef652ec560e6235a30cc3e + React-perflogger: af8a3d31546077f42d729b949925cc4549f14def + React-RCTActionSheet: 57cc5adfefbaaf0aae2cf7e10bccd746f2903673 + React-RCTAnimation: 11c61e94da700c4dc915cf134513764d87fc5e2b + React-RCTAppDelegate: c3980adeaadcfd6cb495532e928b36ac6db3c14a + React-RCTBlob: ccc5049d742b41971141415ca86b83b201495695 + React-RCTImage: 7a9226b0944f1e76e8e01e35a9245c2477cdbabb + React-RCTLinking: bbe8cc582046a9c04f79c235b73c93700263e8b4 + React-RCTNetwork: fc2ca322159dc54e06508d4f5c3e934da63dc013 + React-RCTSettings: f1e9db2cdf946426d3f2b210e4ff4ce0f0d842ef + React-RCTText: 1c41dd57e5d742b1396b4eeb251851ce7ff0fca1 + React-RCTVibration: 5199a180d04873366a83855de55ac33ce60fe4d5 + React-runtimeexecutor: 7bf0dafc7b727d93c8cb94eb00a9d3753c446c3e + ReactCommon: 6f65ea5b7d84deb9e386f670dd11ce499ded7b40 RNCAsyncStorage: 8616bd5a58af409453ea4e1b246521bb76578d60 RNCClipboard: 2834e1c4af68697089cdd455ee4a4cdd198fa7dd RNGestureHandler: 071d7a9ad81e8b83fe7663b303d132406a7d8f39 - RNReanimated: 6668b0587bebd4b15dd849b99e5a9c70fc12ed95 - RNScreens: ea4cd3a853063cda19a4e3c28d2e52180c80f4eb - RNSentry: 7e90aec2633d2fdad8aeb839c9915e4376fd27d1 + RNReanimated: fbc356493970e3acddc15586b1bccb5eab3ff1ec + RNScreens: 218801c16a2782546d30bd2026bb625c0302d70f + RNSentry: eff1f32fe84682feb09a36c5e5f513d6ef964b70 RNShareMenu: cb9dac548c8bf147d06f0bf07296ad51ea9f5fc3 RNSVG: c1e76b81c76cdcd34b4e1188852892dc280eb902 - SDWebImage: 9bec4c5cdd9579e1f57104735ee0c37df274d593 + SDWebImage: 1c39de67663e5eebb2f41324d5d580eeea12dd4c SDWebImageAVIFCoder: d759e21cf4efb640cc97250566aa556ad8bb877c SDWebImageSVGCoder: 6fc109f9c2a82ab44510fff410b88b1a6c271ee8 SDWebImageWebPCoder: 18503de6621dd2c420d680e33d46bf8e1d5169b0 - Sentry: 4c9babff9034785067c896fd580b1f7de44da020 + Sentry: 2158a4621096dcd0a3a4f7c80b84b04dde261035 + SentryPrivate: 1e3acf96ee818a8d0d95b8e922d39ab6be338ea0 Swime: d7b2c277503b6cea317774aedc2dce05613f8b0b - Yoga: 92d086bb705a41cc588599b51db726ba7b1d341c + Yoga: 5ed1699acbba8863755998a4245daa200ff3817b -PODFILE CHECKSUM: 08742f25aa1cdb93d6d5d5efeafd8803ba02b689 +PODFILE CHECKSUM: 61a84f1ad8a466fbbbf09e0f8bb3ed30b2d5e301 COCOAPODS: 1.11.3 diff --git a/ios/nb.lproj/InfoPlist.strings b/ios/nb.lproj/InfoPlist.strings new file mode 100644 index 00000000..58304fef --- /dev/null +++ b/ios/nb.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +"NSPhotoLibraryAddUsageDescription" = "La tooot lagre bilder på kamerarullen"; +"NSPhotoLibraryUsageDescription" = "La tooot lagre bilder på kamerarullen"; diff --git a/ios/tooot.xcodeproj/project.pbxproj b/ios/tooot.xcodeproj/project.pbxproj index 908f700c..c50b04c7 100644 --- a/ios/tooot.xcodeproj/project.pbxproj +++ b/ios/tooot.xcodeproj/project.pbxproj @@ -87,6 +87,7 @@ E6A4895D293C1F740047951A /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/InfoPlist.strings; sourceTree = ""; }; E6C8B26628F5F9FC0062CF2E /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/InfoPlist.strings; sourceTree = ""; }; E6D64C7A294A90840098F3AC /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/InfoPlist.strings; sourceTree = ""; }; + E6FD3AA7299EE8A900774C18 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/InfoPlist.strings; sourceTree = ""; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; ED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; }; /* End PBXFileReference section */ @@ -300,6 +301,7 @@ nl, ca, uk, + nb, ); mainGroup = 83CBB9F61A601CBA00E9B192; productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; @@ -382,7 +384,7 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-tooot/Pods-tooot-frameworks.sh", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/hermes.framework/hermes", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( @@ -533,6 +535,7 @@ E6217B7E293C1EBF00B1755E /* nl */, E6A4895D293C1F740047951A /* ca */, E6D64C7A294A90840098F3AC /* uk */, + E6FD3AA7299EE8A900774C18 /* nb */, ); name = InfoPlist.strings; sourceTree = ""; @@ -573,8 +576,9 @@ PRODUCT_BUNDLE_IDENTIFIER = com.xmflsct.app.tooot; PRODUCT_NAME = tooot; PROVISIONING_PROFILE_SPECIFIER = "match AdHoc com.xmflsct.app.tooot"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = YES; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_OBJC_BRIDGING_HEADER = "tooot-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_PRECOMPILE_BRIDGING_HEADER = YES; @@ -612,8 +616,9 @@ PRODUCT_BUNDLE_IDENTIFIER = com.xmflsct.app.tooot; PRODUCT_NAME = tooot; PROVISIONING_PROFILE_SPECIFIER = "match AppStore com.xmflsct.app.tooot"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = YES; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_OBJC_BRIDGING_HEADER = "tooot-Bridging-Header.h"; SWIFT_PRECOMPILE_BRIDGING_HEADER = YES; SWIFT_VERSION = 5.0; diff --git a/ios/tooot/AppDelegate.h b/ios/tooot/AppDelegate.h index ff99e11a..c1f4f9fa 100644 --- a/ios/tooot/AppDelegate.h +++ b/ios/tooot/AppDelegate.h @@ -1,9 +1,9 @@ #import -#import +#import #import #import -@interface AppDelegate : EXAppDelegateWrapper +@interface AppDelegate : RCTAppDelegate @end diff --git a/ios/tooot/AppDelegate.mm b/ios/tooot/AppDelegate.mm index 50f14335..bb0106f9 100644 --- a/ios/tooot/AppDelegate.mm +++ b/ios/tooot/AppDelegate.mm @@ -1,88 +1,16 @@ #import "AppDelegate.h" -#import #import -#import - -#import #import #import -#if RCT_NEW_ARCH_ENABLED -#import -#import -#import -#import -#import -#import - -#import - -static NSString *const kRNConcurrentRoot = @"concurrentRoot"; - -@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 = [self.reactDelegate createRootViewWithBridge:bridge moduleName:@"main" initialProperties:nil]; - - // NSDictionary *initProps = [self prepareInitialProps]; - // UIView *rootView = RCTAppSetupDefaultRootView(bridge, @"tooot", initProps); - - 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; -} - -/// This method controls whether the `concurrentRoot`feature of React18 is turned on or off. -/// -/// @see: https://reactjs.org/blog/2022/03/29/react-v18.html -/// @note: This requires to be rendering on Fabric (i.e. on the New Architecture). -/// @return: `true` if the `concurrentRoot` feture is enabled. Otherwise, it returns `false`. -- (BOOL)concurrentRootEnabled -{ - // Switch this bool to turn on and off the concurrent root - return false; -} -- (NSDictionary *)prepareInitialProps -{ - NSMutableDictionary *initProps = [NSMutableDictionary new]; -#ifdef RCT_NEW_ARCH_ENABLED - initProps[kRNConcurrentRoot] = @([self concurrentRootEnabled]); -#endif - return initProps; + self.moduleName = @"main"; + return [super application:application didFinishLaunchingWithOptions:launchOptions]; } - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge @@ -94,40 +22,16 @@ static NSString *const kRNConcurrentRoot = @"concurrentRoot"; #endif } -#if RCT_NEW_ARCH_ENABLED - -#pragma mark - RCTCxxBridgeDelegate - -- (std::unique_ptr)jsExecutorFactoryForBridge:(RCTBridge *)bridge +/// This method controls whether the `concurrentRoot`feature of React18 is turned on or off. +/// +/// @see: https://reactjs.org/blog/2022/03/29/react-v18.html +/// @note: This requires to be rendering on Fabric (i.e. on the New Architecture). +/// @return: `true` if the `concurrentRoot` feature is enabled. Otherwise, it returns `false`. +- (BOOL)concurrentRootEnabled { - _turboModuleManager = [[RCTTurboModuleManager alloc] initWithBridge:bridge delegate:self jsInvoker:bridge.jsCallInvoker]; - return RCTAppSetupDefaultJsExecutorFactory(bridge, _turboModuleManager); + return true; } -#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; diff --git a/ios/tooot/Info.plist b/ios/tooot/Info.plist index 4317bfa3..a70dccd6 100644 --- a/ios/tooot/Info.plist +++ b/ios/tooot/Info.plist @@ -1,92 +1,92 @@ - - CFBundleAllowMixedLocalizations - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - tooot - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 0.2 - CFBundleSignature - ???? - CFBundleURLTypes - - - CFBundleTypeRole - Editor - CFBundleURLName - com.xmflsct.app.tooot - CFBundleURLSchemes - - tooot-share - tooot - - - - CFBundleVersion - 2102022230 - ITSAppUsesNonExemptEncryption - - LSApplicationCategoryType - public.app-category.social-networking - LSRequiresIPhoneOS - - NSAppTransportSecurity - - NSExceptionDomains - - localhost - - NSExceptionAllowsInsecureHTTPLoads - - - - - NSLocationWhenInUseUsageDescription - - NSMainNibFile - LaunchScreen - NSMicrophoneUsageDescription - $(PRODUCT_NAME) DOES NOT need microphone permission. Please reject this request. - NSPhotoLibraryAddUsageDescription - Allow $(PRODUCT_NAME) to save an image to your camera roll - NSPhotoLibraryUsageDescription - Allow $(PRODUCT_NAME) to access your camera roll to attach photos or videos to your toot - UILaunchStoryboardName - SplashScreen - UIRequiredDeviceCapabilities - - armv7 - - UIRequiresFullScreen - - UIStatusBarHidden - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIUserInterfaceStyle - Automatic - UIViewControllerBasedStatusBarAppearance - - CADisableMinimumFrameDurationOnPhone - - + + CADisableMinimumFrameDurationOnPhone + + CFBundleAllowMixedLocalizations + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + tooot + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 0.2 + CFBundleSignature + ???? + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + com.xmflsct.app.tooot + CFBundleURLSchemes + + tooot-share + tooot + + + + CFBundleVersion + 2102022230 + ITSAppUsesNonExemptEncryption + + LSApplicationCategoryType + public.app-category.social-networking + LSRequiresIPhoneOS + + NSAppTransportSecurity + + NSExceptionDomains + + localhost + + NSExceptionAllowsInsecureHTTPLoads + + + + + NSLocationWhenInUseUsageDescription + + NSMainNibFile + LaunchScreen + NSMicrophoneUsageDescription + $(PRODUCT_NAME) DOES NOT need microphone permission. Please reject this request. + NSPhotoLibraryAddUsageDescription + Allow $(PRODUCT_NAME) to save an image to your camera roll + NSPhotoLibraryUsageDescription + Allow $(PRODUCT_NAME) to access your camera roll to attach photos or videos to your toot + UILaunchStoryboardName + SplashScreen + UIRequiredDeviceCapabilities + + armv7 + + UIRequiresFullScreen + + UIStatusBarHidden + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIUserInterfaceStyle + Automatic + UIViewControllerBasedStatusBarAppearance + + diff --git a/package.json b/package.json index cc378172..b6680f5e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tooot", - "version": "4.8.8", + "version": "4.9.0", "description": "tooot for Mastodon", "author": "xmflsct ", "license": "GPL-3.0-or-later", @@ -11,6 +11,7 @@ "scripts": { "start": "react-native start", "android": "react-native run-android", + "phone": "react-native run-ios --device", "iphone": "react-native run-ios --simulator 'iPhone 14 Pro'", "ipad": "react-native run-ios --simulator 'iPad Pro (11-inch) (4th generation)'", "app:build": "bundle exec fastlane", @@ -18,91 +19,88 @@ }, "dependencies": { "@expo/react-native-action-sheet": "^4.0.1", - "@formatjs/intl-datetimeformat": "^6.4.3", - "@formatjs/intl-getcanonicallocales": "^2.0.5", - "@formatjs/intl-locale": "^3.0.11", - "@formatjs/intl-numberformat": "^8.3.3", - "@formatjs/intl-pluralrules": "^5.1.8", - "@formatjs/intl-relativetimeformat": "^11.1.8", - "@mattermost/react-native-paste-input": "^0.6.1", + "@formatjs/intl-datetimeformat": "^6.5.1", + "@formatjs/intl-getcanonicallocales": "^2.1.0", + "@formatjs/intl-locale": "^3.1.1", + "@formatjs/intl-numberformat": "^8.3.5", + "@formatjs/intl-pluralrules": "^5.1.10", + "@formatjs/intl-relativetimeformat": "^11.1.10", + "@mattermost/react-native-paste-input": "^0.6.2", "@neverdull-agency/expo-unlimited-secure-store": "^1.0.10", "@react-native-async-storage/async-storage": "~1.17.11", - "@react-native-camera-roll/camera-roll": "^5.2.3", + "@react-native-camera-roll/camera-roll": "^5.2.4", "@react-native-clipboard/clipboard": "^1.11.1", "@react-native-community/blur": "^4.3.0", "@react-native-community/netinfo": "9.3.7", - "@react-native-community/segmented-control": "^2.2.2", - "@react-native-firebase/app": "^16.7.0", + "@react-native-firebase/app": "^17.3.1", "@react-native-menu/menu": "^0.7.3", - "@react-navigation/bottom-tabs": "^6.5.4", - "@react-navigation/native": "^6.1.3", - "@react-navigation/native-stack": "^6.9.9", - "@react-navigation/stack": "^6.3.12", - "@sentry/react-native": "4.14.0", + "@react-native-segmented-control/segmented-control": "^2.4.0", + "@react-navigation/bottom-tabs": "^6.5.6", + "@react-navigation/native": "^6.1.5", + "@react-navigation/native-stack": "^6.9.11", + "@react-navigation/stack": "^6.3.15", + "@sentry/react-native": "5.0.0", "@sharcoux/slider": "^6.1.1", - "@tanstack/react-query": "^4.24.4", - "axios": "^1.2.4", + "@tanstack/react-query": "^4.24.10", + "axios": "^1.3.4", "diff": "^5.1.0", - "expo": "^47.0.13", - "expo-auth-session": "^3.8.0", - "expo-av": "^13.1.0", - "expo-constants": "^14.1.0", - "expo-crypto": "^12.1.0", - "expo-file-system": "^15.1.1", - "expo-haptics": "^12.1.0", - "expo-image": "^1.0.0-beta.6", - "expo-linking": "^3.3.0", - "expo-localization": "^14.0.0", - "expo-notifications": "^0.17.0", - "expo-random": "^13.0.0", - "expo-screen-capture": "^5.0.0", - "expo-screen-orientation": "^5.0.1", - "expo-secure-store": "^12.0.0", - "expo-splash-screen": "^0.17.5", - "expo-store-review": "^6.1.0", - "expo-video-thumbnails": "^7.1.0", - "expo-web-browser": "~12.0.0", + "expo": "48.0.0-beta.2", + "expo-auth-session": "^4.0.3", + "expo-av": "^13.2.1", + "expo-constants": "^14.2.1", + "expo-crypto": "^12.2.1", + "expo-file-system": "^15.2.2", + "expo-haptics": "^12.2.1", + "expo-image": "^1.0.0", + "expo-linking": "^4.0.1", + "expo-localization": "^14.1.1", + "expo-notifications": "^0.18.1", + "expo-screen-capture": "^5.1.1", + "expo-screen-orientation": "^5.1.1", + "expo-secure-store": "^12.1.1", + "expo-splash-screen": "^0.18.1", + "expo-store-review": "^6.2.1", + "expo-video-thumbnails": "^7.2.1", + "expo-web-browser": "~12.1.1", "htmlparser2": "^8.0.1", - "i18next": "^22.4.9", + "i18next": "^22.4.10", "linkify-it": "^4.0.1", "lodash": "^4.17.21", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-i18next": "^12.1.4", - "react-intl": "^6.2.7", - "react-native": "^0.70.7", + "react-i18next": "^12.2.0", + "react-intl": "^6.2.10", + "react-native": "^0.71.3", "react-native-flash-message": "^0.4.0", "react-native-gesture-handler": "~2.9.0", - "react-native-image-picker": "^5.0.1", + "react-native-image-picker": "^5.1.0", "react-native-ios-context-menu": "^1.15.3", "react-native-language-detection": "^0.2.2", - "react-native-mmkv": "~2.5.1", - "react-native-pager-view": "^6.1.2", + "react-native-mmkv": "~2.7.0", + "react-native-pager-view": "^6.1.4", "react-native-quick-base64": "^2.0.5", - "react-native-reanimated": "^2.14.4", + "react-native-reanimated": "^3.0.0-rc.10", "react-native-reanimated-zoom": "^0.3.3", "react-native-safe-area-context": "^4.5.0", - "react-native-screens": "^3.19.0", + "react-native-screens": "^3.20.0", "react-native-share-menu": "^6.0.0", "react-native-svg": "^13.8.0", "react-native-swipe-list-view": "^3.2.9", - "react-native-tab-view": "^3.3.4", - "react-redux": "^8.0.5", + "react-native-tab-view": "^3.5.0", "rn-placeholder": "^3.0.3", "url-parse": "^1.5.10", "zeego": "^1.0.2" }, "devDependencies": { - "@babel/core": "^7.20.12", - "@babel/plugin-proposal-optional-chaining": "^7.20.7", - "@babel/preset-typescript": "^7.18.6", - "@expo/config": "^7.0.3", + "@babel/core": "^7.21.0", + "@babel/plugin-proposal-optional-chaining": "^7.21.0", + "@babel/preset-typescript": "^7.21.0", + "@expo/config": "^8.0.2", "@types/diff": "^5.0.2", "@types/linkify-it": "^3.0.2", "@types/lodash": "^4.14.191", - "@types/react": "^18.0.27", - "@types/react-dom": "^18.0.10", - "@types/react-native": "^0.70.10", + "@types/react": "^18.0.28", + "@types/react-dom": "^18.0.11", "@types/react-native-share-menu": "^5.0.2", "@types/url-parse": "^1.4.8", "babel-plugin-module-resolver": "^5.0.0", diff --git a/react-native.config.js b/react-native.config.js index 541747c5..82d5a886 100644 --- a/react-native.config.js +++ b/react-native.config.js @@ -4,6 +4,16 @@ module.exports = { platforms: { ios: null } + }, + '@react-native-menu/menu': { + platforms: { + ios: null + } + }, + 'react-native-ios-context-menu': { + platforms: { + android: null + } } } } diff --git a/src/@types/app.d.ts b/src/@types/app.d.ts index 3b2b9525..36b6ff82 100644 --- a/src/@types/app.d.ts +++ b/src/@types/app.d.ts @@ -3,7 +3,7 @@ declare namespace App { | 'Following' | 'Local' | 'LocalPublic' - | 'Trending' + | 'Explore' | 'Notifications' | 'Hashtag' | 'List' diff --git a/src/@types/mastodon.d.ts b/src/@types/mastodon.d.ts index 2a90a73a..37ed36fd 100644 --- a/src/@types/mastodon.d.ts +++ b/src/@types/mastodon.d.ts @@ -33,7 +33,7 @@ declare namespace Mastodon { role?: Role // Internal - _remote?: boolean + _remote?: string // domain } type Announcement = { @@ -400,7 +400,7 @@ declare namespace Mastodon { url: string // Internal - _remote?: boolean + _remote?: string // domain } type Notification = diff --git a/src/App.tsx b/src/App.tsx index 89748fed..2340ef34 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,5 +1,4 @@ import { ActionSheetProvider } from '@expo/react-native-action-sheet' -import * as Sentry from '@sentry/react-native' import { QueryClientProvider } from '@tanstack/react-query' import AccessibilityManager from '@utils/accessibility/AccessibilityManager' import { connectVerify } from '@utils/api/helpers/connect' @@ -18,16 +17,15 @@ import ThemeManager from '@utils/styles/ThemeManager' import * as Localization from 'expo-localization' import * as SplashScreen from 'expo-splash-screen' import React, { useCallback, useEffect, useState } from 'react' -import { LogBox, Platform } from 'react-native' +import { Platform } from 'react-native' import { GestureHandlerRootView } from 'react-native-gesture-handler' import { SafeAreaProvider } from 'react-native-safe-area-context' import { enableFreeze } from 'react-native-screens' import i18n from './i18n' import Screens from './screens' -Platform.select({ - android: LogBox.ignoreLogs(['Setting a timer for a long period of time']) -}) +log('log', 'App', 'delay splash') +SplashScreen.preventAutoHideAsync() dev() sentry() @@ -36,9 +34,6 @@ audio() push() enableFreeze(true) -log('log', 'App', 'delay splash') -SplashScreen.preventAutoHideAsync() - const App: React.FC = () => { log('log', 'App', 'rendering App') const [appIsReady, setAppIsReady] = useState(false) @@ -121,4 +116,4 @@ const App: React.FC = () => { ) } -export default Sentry.wrap(App) +export default App diff --git a/src/components/Account.tsx b/src/components/Account.tsx index b0b9fdba..75ddfac4 100644 --- a/src/components/Account.tsx +++ b/src/components/Account.tsx @@ -42,7 +42,7 @@ const ComponentAccount: React.FC = ({ account, props, style={{ width: StyleConstants.Avatar.S, height: StyleConstants.Avatar.S, - borderRadius: 8, + borderRadius: StyleConstants.BorderRadius, marginRight: StyleConstants.Spacing.S }} dim diff --git a/src/components/AccountButton.tsx b/src/components/AccountButton.tsx index 9e481745..f6ea0a49 100644 --- a/src/components/AccountButton.tsx +++ b/src/components/AccountButton.tsx @@ -45,7 +45,7 @@ const AccountButton: React.FC = ({ account, additionalActions }) => { width: StyleConstants.Font.Size.L, height: StyleConstants.Font.Size.L }} - style={{ borderRadius: StyleConstants.Font.Size.L / 2, overflow: 'hidden' }} + style={{ borderRadius: 99, overflow: 'hidden' }} /> = ({ }} style={[ { - borderRadius: 100, + borderRadius: 99, justifyContent: 'center', alignItems: 'center', borderWidth: overlay ? 0 : selected ? 1.5 : 1, diff --git a/src/components/Emojis/Button.tsx b/src/components/Emojis/Button.tsx index 98ca98d6..f9776ee5 100644 --- a/src/components/Emojis/Button.tsx +++ b/src/components/Emojis/Button.tsx @@ -35,7 +35,7 @@ const EmojisButton: React.FC = () => { borderWidth: 2, borderColor: colors.primaryDefault, padding: StyleConstants.Spacing.Global.PagePadding / 2, - borderRadius: 100 + borderRadius: 99 }} > { )} renderItem={listItem} - windowSize={4} contentContainerStyle={{ paddingHorizontal: StyleConstants.Spacing.Global.PagePadding, minHeight: 32 * 2 + StyleConstants.Spacing.M * 3 diff --git a/src/components/GracefullyImage.tsx b/src/components/GracefullyImage.tsx index 23ce899f..f4b4ca49 100644 --- a/src/components/GracefullyImage.tsx +++ b/src/components/GracefullyImage.tsx @@ -21,14 +21,9 @@ export interface Props { onPress?: () => void style?: StyleProp imageStyle?: ImageStyle - // For image viewer when there is no image size available - setImageDimensions?: React.Dispatch< - React.SetStateAction<{ - width: number - height: number - }> - > + dim?: boolean + withoutTransition?: boolean enableLiveTextInteraction?: boolean } @@ -41,8 +36,8 @@ const GracefullyImage = ({ onPress, style, imageStyle, - setImageDimensions, dim, + withoutTransition = false, enableLiveTextInteraction = false }: Props) => { const { reduceMotionEnabled } = useAccessibility() @@ -64,15 +59,10 @@ const GracefullyImage = ({ > { - if (setImageDimensions && event.source) { - setImageDimensions(event.source) - } - }} onError={() => { if ( sources.default?.uri && diff --git a/src/components/Header/Left.tsx b/src/components/Header/Left.tsx index b2f39d0d..6d33efa7 100644 --- a/src/components/Header/Left.tsx +++ b/src/components/Header/Left.tsx @@ -51,7 +51,7 @@ const HeaderLeft: React.FC = ({ minWidth: 44, marginLeft: native ? -StyleConstants.Spacing.S : StyleConstants.Spacing.S, ...(type === undefined && { - borderRadius: 100 + borderRadius: 99 }), ...(type === 'text' && { paddingHorizontal: StyleConstants.Spacing.S diff --git a/src/components/Header/Right.tsx b/src/components/Header/Right.tsx index 91ab09f2..a918cbf9 100644 --- a/src/components/Header/Right.tsx +++ b/src/components/Header/Right.tsx @@ -98,9 +98,7 @@ const HeaderRight: React.FC = ({ minHeight: 44, minWidth: 44, marginRight: native ? -StyleConstants.Spacing.S : StyleConstants.Spacing.S, - ...(type === undefined && { - borderRadius: 100 - }), + ...(type === undefined && { borderRadius: 99 }), ...(type === 'text' && { paddingHorizontal: StyleConstants.Spacing.S }) diff --git a/src/components/Input.tsx b/src/components/Input.tsx index 736b2af6..a1fd45f8 100644 --- a/src/components/Input.tsx +++ b/src/components/Input.tsx @@ -1,6 +1,6 @@ import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' -import React, { forwardRef, RefObject } from 'react' +import React, { ForwardedRef, forwardRef } from 'react' import { Platform, TextInput, TextInputProps, View } from 'react-native' import Animated, { useAnimatedStyle, withTiming } from 'react-native-reanimated' import { EmojisState } from './Emojis/Context' @@ -35,7 +35,7 @@ const ComponentInput = forwardRef( isFocused, ...props }: Props, - ref: RefObject + ref: ForwardedRef ) => { const { colors, mode } = useTheme() diff --git a/src/components/Instance/index.tsx b/src/components/Instance/index.tsx index d9997133..ef24f068 100644 --- a/src/components/Instance/index.tsx +++ b/src/components/Instance/index.tsx @@ -173,6 +173,10 @@ const ComponentInstance: React.FC = ({ lists: { shown: false }, announcements: { shown: false, unread: 0 } }, + page_account_timeline: { + excludeBoosts: true, + excludeReplies: true + }, drafts: [], emojis_frequent: [] } diff --git a/src/components/Menu/Row.tsx b/src/components/Menu/Row.tsx index ffad2741..c381ccb7 100644 --- a/src/components/Menu/Row.tsx +++ b/src/components/Menu/Row.tsx @@ -22,7 +22,7 @@ export interface Props { switchDisabled?: boolean switchOnValueChange?: () => void - iconBack?: 'chevron-right' | 'external-link' | 'check' + iconBack?: 'chevron-right' | 'chevron-down' | 'external-link' | 'check' iconBackColor?: ColorDefinitions loading?: boolean @@ -66,14 +66,7 @@ const MenuRow: React.FC = ({ }} > - + = ({ width: 8, height: 8, backgroundColor: colors.red, - borderRadius: 8, + borderRadius: StyleConstants.BorderRadius, marginRight: StyleConstants.Spacing.S }} /> diff --git a/src/components/ModalScrollView.tsx b/src/components/ModalScrollView.tsx index 302ffeef..61a5174c 100644 --- a/src/components/ModalScrollView.tsx +++ b/src/components/ModalScrollView.tsx @@ -1,11 +1,11 @@ import { useHeaderHeight } from '@react-navigation/elements' import { StyleConstants } from '@utils/styles/constants' -import { forwardRef, PropsWithChildren, RefObject } from 'react' +import { ForwardedRef, forwardRef, PropsWithChildren } from 'react' import { KeyboardAvoidingView, Platform, ScrollView } from 'react-native' import { SafeAreaView } from 'react-native-safe-area-context' export const ModalScrollView = forwardRef( - ({ children }: PropsWithChildren, ref: RefObject) => { + ({ children }: PropsWithChildren, ref: ForwardedRef) => { const headerHeight = useHeaderHeight() return ( diff --git a/src/components/Relationship/Outgoing.tsx b/src/components/Relationship/Outgoing.tsx index e4fabbf2..685a0518 100644 --- a/src/components/Relationship/Outgoing.tsx +++ b/src/components/Relationship/Outgoing.tsx @@ -29,20 +29,20 @@ const RelationshipOutgoing: React.FC = ({ id }: Props) => { const queryKeyRelationship: QueryKeyRelationship = ['Relationship', { id }] const queryClient = useQueryClient() const mutation = useRelationshipMutation({ - onSuccess: (res, { payload: { action } }) => { + onSuccess: (res, vars) => { haptics('Success') queryClient.setQueryData(queryKeyRelationship, [res]) - if (action === 'block') { + if (vars.type === 'outgoing' && vars.payload.action === 'block') { const queryKey = ['Timeline', { page: 'Following' }] queryClient.invalidateQueries({ queryKey, exact: false }) } }, - onError: (err: any, { payload: { action } }) => { + onError: (err: any, vars) => { displayMessage({ theme, type: 'error', message: t('common:message.error.message', { - function: t(`componentRelationship:${action}.function` as any) + function: t(`componentRelationship:${(vars.payload as any).action}.function` as any) }), ...(err.status && typeof err.status === 'number' && diff --git a/src/components/SwipeToActions.tsx b/src/components/SwipeToActions.tsx index 74f6e01f..4306f8d2 100644 --- a/src/components/SwipeToActions.tsx +++ b/src/components/SwipeToActions.tsx @@ -31,9 +31,11 @@ export const SwipeToActions = ({ haptics(action.haptic || 'Light') action.onPress({ item }) }} + style={{ backgroundColor: 'rgba(0, 255, 0, 0.2)' }} > = ({ conversation, queryKey, highlig = ({ conversation, queryKey, highlig ) } -export default React.memo(TimelineConversation, () => true) +export default React.memo(TimelineConversation) diff --git a/src/components/Timeline/Default.tsx b/src/components/Timeline/Default.tsx index b21a2e34..8fb6eb52 100644 --- a/src/components/Timeline/Default.tsx +++ b/src/components/Timeline/Default.tsx @@ -251,4 +251,4 @@ const TimelineDefault: React.FC = ({ ) } -export default React.memo(TimelineDefault, () => true) +export default React.memo(TimelineDefault) diff --git a/src/components/Timeline/Notifications.tsx b/src/components/Timeline/Notifications.tsx index 2c7f4892..c1030c56 100644 --- a/src/components/Timeline/Notifications.tsx +++ b/src/components/Timeline/Notifications.tsx @@ -209,4 +209,4 @@ const TimelineNotifications: React.FC = ({ notification, queryKey }) => { ) } -export default React.memo(TimelineNotifications, () => true) +export default React.memo(TimelineNotifications) diff --git a/src/components/Timeline/Refresh.tsx b/src/components/Timeline/Refresh.tsx index d401d8d4..fd399d9c 100644 --- a/src/components/Timeline/Refresh.tsx +++ b/src/components/Timeline/Refresh.tsx @@ -156,10 +156,22 @@ const TimelineRefresh: React.FC = ({ >(queryKey, old => { if (!old) return old + let count = 0 + const keepPagesCount = Math.max( + 1, + old.pages.findIndex(page => { + count = count + page.body.length + return count >= 20 + }) + ) + prevCache.current = res.body.slice(0, -PREV_PER_BATCH) return { ...old, - pages: [{ ...res, body: res.body.slice(-PREV_PER_BATCH) }, ...old.pages] + pages: [ + { ...res, body: res.body.slice(-PREV_PER_BATCH) }, + ...old.pages.slice(0, keepPagesCount) + ] } }) @@ -177,7 +189,7 @@ const TimelineRefresh: React.FC = ({ flRef.current?.scrollToOffset({ offset: scrollY.value - 15, animated: true }) } - await new Promise(promise => setTimeout(promise, 64)) + await new Promise(promise => setTimeout(promise, 8)) queryClient.setQueryData< InfiniteData< PagedResponse<(Mastodon.Status | Mastodon.Notification | Mastodon.Conversation)[]> @@ -244,7 +256,7 @@ const TimelineRefresh: React.FC = ({ return } }, - [] + [queryKey[1]] ) if (!isFetched) return null diff --git a/src/components/Timeline/Shared/Actions.tsx b/src/components/Timeline/Shared/Actions.tsx index 3178e62a..c71c23db 100644 --- a/src/components/Timeline/Shared/Actions.tsx +++ b/src/components/Timeline/Shared/Actions.tsx @@ -103,7 +103,7 @@ const TimelineActions: React.FC = () => { cancelButtonIndex: 2, ...androidActionSheetStyles(colors) }, - (selectedIndex: number) => { + selectedIndex => { switch (selectedIndex) { case 0: mutation.mutate({ diff --git a/src/components/Timeline/Shared/Attachment/Audio.tsx b/src/components/Timeline/Shared/Attachment/Audio.tsx index ca78968d..ca75708f 100644 --- a/src/components/Timeline/Shared/Attachment/Audio.tsx +++ b/src/components/Timeline/Shared/Attachment/Audio.tsx @@ -5,8 +5,9 @@ import { connectMedia } from '@utils/api/helpers/connect' import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' import { Audio } from 'expo-av' -import React, { useCallback, useEffect, useRef, useState } from 'react' -import { AppState, AppStateStatus, StyleSheet, View } from 'react-native' +import React, { useCallback, useContext, useEffect, useRef, useState } from 'react' +import { AppState, AppStateStatus, View } from 'react-native' +import StatusContext from '../Context' import AttachmentAltText from './AltText' import { aspectRatio } from './dimensions' @@ -18,6 +19,7 @@ export interface Props { } const AttachmentAudio: React.FC = ({ total, index, sensitiveShown, audio }) => { + const { inThread } = useContext(StatusContext) const { colors } = useTheme() const [audioPlayer, setAudioPlayer] = useState() @@ -60,15 +62,25 @@ const AttachmentAudio: React.FC = ({ total, index, sensitiveShown, audio return ( - + {sensitiveShown ? ( audio.blurhash ? ( = ({ total, index, sensitiveShown, audio height: '100%' }} dim + withoutTransition={inThread} /> ) : null ) : ( @@ -88,8 +101,9 @@ const AttachmentAudio: React.FC = ({ total, index, sensitiveShown, audio default: { uri: audio.preview_url }, remote: { uri: audio.preview_remote_url } }} - style={styles.background} + style={{ position: 'absolute', width: '100%', height: '100%' }} dim + withoutTransition={inThread} /> ) : null}