mirror of
				https://github.com/tooot-app/app
				synced 2025-06-05 22:19:13 +02:00 
			
		
		
		
	Merge branch 'main' into release
This commit is contained in:
		
							
								
								
									
										11
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -43,6 +43,8 @@ local.properties | |||||||
| *.iml | *.iml | ||||||
| *.hprof | *.hprof | ||||||
| .cxx/ | .cxx/ | ||||||
|  | *.keystore | ||||||
|  | !debug.keystore | ||||||
|  |  | ||||||
| # node.js | # node.js | ||||||
| # | # | ||||||
| @@ -50,12 +52,6 @@ node_modules/ | |||||||
| npm-debug.log | npm-debug.log | ||||||
| yarn-error.log | yarn-error.log | ||||||
|  |  | ||||||
| # BUCK |  | ||||||
| buck-out/ |  | ||||||
| \.buckd/ |  | ||||||
| *.keystore |  | ||||||
| !debug.keystore |  | ||||||
|  |  | ||||||
| # Bundle artifacts | # Bundle artifacts | ||||||
| *.jsbundle | *.jsbundle | ||||||
|  |  | ||||||
| @@ -67,6 +63,9 @@ buck-out/ | |||||||
| web-build/ | web-build/ | ||||||
| dist/ | dist/ | ||||||
|  |  | ||||||
|  | # Temporary files created by Metro to check the health of the file watcher | ||||||
|  | .metro-health-check* | ||||||
|  |  | ||||||
| # @end expo-cli | # @end expo-cli | ||||||
|  |  | ||||||
| # yarn 3 | # yarn 3 | ||||||
|   | |||||||
| @@ -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 | - [@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 | - [@hellojaccc](https://github.com/hellojaccc) for Korean translation | ||||||
| - [@jan-vandenberg](https://crowdin.com/profile/jan-vandenberg) for Dutch 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 | - [@luizpicolo](https://github.com/luizpicolo) for Brazilian Portuguese | ||||||
| - [@janlindblom](https://github.com/janlindblom) for Swedish | - [@janlindblom](https://github.com/janlindblom) for Swedish | ||||||
| - [@ihoryan](https://crowdin.com/profile/ihoryan) for Ukrainian | - [@ihoryan](https://crowdin.com/profile/ihoryan) for Ukrainian | ||||||
|   | |||||||
| @@ -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", |  | ||||||
|     ], |  | ||||||
| ) |  | ||||||
| @@ -1,107 +1,71 @@ | |||||||
| apply plugin: "com.android.application" | apply plugin: "com.android.application" | ||||||
|  | apply plugin: "com.facebook.react" | ||||||
| apply plugin: 'com.google.gms.google-services' | apply plugin: 'com.google.gms.google-services' | ||||||
|  |  | ||||||
| import com.android.build.OutputFile | 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 |  * This is the configuration block to customize your React Native Android app. | ||||||
|  * and bundleReleaseJsAndAssets). |  * By default you don't need to apply any configuration, just uncomment the lines you need. | ||||||
|  * 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: [] |  | ||||||
|  * ] |  | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| project.ext.react = [ | react { | ||||||
|     enableHermes: true, |     /* Folders */ | ||||||
| ] |     //   The root of your project, i.e. where "package.json" lives. Default is '..' | ||||||
|  |     // root = file("../") | ||||||
| apply from: new File(["node", "--print", "require.resolve('react-native/package.json')"].execute().text.trim(), "../react.gradle") |     //   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: |  * Set this to true to create four separate APKs instead of one, | ||||||
|  *   - An APK that only works on ARM devices |  * one for each native architecture. This is useful if you don't | ||||||
|  *   - An APK that only works on x86 devices |  * use App Bundles (https://developer.android.com/guide/app-bundle/) | ||||||
|  * The advantage is the size of the APK is reduced by about 4MB. |  * and want to have separate APKs to upload to the Play Store. | ||||||
|  * Upload all the APKs to the Play Store and people will download |  | ||||||
|  * the correct one based on the CPU architecture of their device. |  | ||||||
|  */ |  */ | ||||||
| def enableSeparateBuildPerCPUArchitecture = false | 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 | 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: |  * For example, to use the international variant, you can use: | ||||||
|  * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` |  * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` | ||||||
| @@ -114,16 +78,9 @@ def enableProguardInReleaseBuilds = false | |||||||
| def jscFlavor = 'org.webkit:android-jsc:+' | def jscFlavor = 'org.webkit:android-jsc:+' | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Whether to enable the Hermes VM. |  * Private function to get the list of Native Architectures you want to build. | ||||||
|  * |  * This reads the value from reactNativeArchitectures in your gradle.properties | ||||||
|  * This should be set on project.ext.react and mirrored here.  If it is not set |  * file and works together with the --active-arch-only flag of react-native run-android. | ||||||
|  * 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. |  | ||||||
|  */ |  */ | ||||||
| def reactNativeArchitectures() { | def reactNativeArchitectures() { | ||||||
|     def value = project.getProperties().get("reactNativeArchitectures") |     def value = project.getProperties().get("reactNativeArchitectures") | ||||||
| @@ -140,69 +97,13 @@ android { | |||||||
|         targetCompatibility JavaVersion.VERSION_1_8 |         targetCompatibility JavaVersion.VERSION_1_8 | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     namespace "com.xmflsct.app.tooot" | ||||||
|     defaultConfig { |     defaultConfig { | ||||||
|         applicationId 'com.xmflsct.app.tooot' |         applicationId 'com.xmflsct.app.tooot' | ||||||
|         minSdkVersion rootProject.ext.minSdkVersion |         minSdkVersion rootProject.ext.minSdkVersion | ||||||
|         targetSdkVersion rootProject.ext.targetSdkVersion |         targetSdkVersion rootProject.ext.targetSdkVersion | ||||||
|         versionCode 50 |         versionCode 50 | ||||||
|         versionName "0.2" |         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 { |     splits { | ||||||
|         abi { |         abi { | ||||||
| @@ -232,7 +133,6 @@ android { | |||||||
|             proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" |             proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     namespace 'com.xmflsct.app.tooot' |  | ||||||
|  |  | ||||||
|     // applicationVariants are e.g. debug, release |     // applicationVariants are e.g. debug, release | ||||||
|     applicationVariants.all { variant -> |     applicationVariants.all { variant -> | ||||||
| @@ -255,10 +155,6 @@ dependencies { | |||||||
|         force = true |         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 isGifEnabled = (findProperty('expo.gif.enabled') ?: "") == "true"; | ||||||
|     def isWebpEnabled = (findProperty('expo.webp.enabled') ?: "") == "true"; |     def isWebpEnabled = (findProperty('expo.webp.enabled') ?: "") == "true"; | ||||||
|     def isWebpAnimatedEnabled = (findProperty('expo.webp.animated') ?: "") == "true"; |     def isWebpAnimatedEnabled = (findProperty('expo.webp.animated') ?: "") == "true"; | ||||||
| @@ -284,58 +180,21 @@ dependencies { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0" |     // The version of react-native is set by the React Native Gradle Plugin | ||||||
|     debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") { |     implementation("com.facebook.react:react-android") | ||||||
|       exclude group:'com.facebook.fbjni' |     implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.0.0") | ||||||
|     } |     debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") | ||||||
|     debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") { |     debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") { | ||||||
|         exclude group:'com.facebook.flipper' |  | ||||||
|         exclude group:'com.squareup.okhttp3', module:'okhttp' |         exclude group:'com.squareup.okhttp3', module:'okhttp' | ||||||
|     } |     } | ||||||
|     debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") { |  | ||||||
|         exclude group:'com.facebook.flipper' |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if (enableHermes) { |     debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") | ||||||
|         //noinspection GradleDynamicVersion |     if (hermesEnabled.toBoolean()) { | ||||||
|         implementation("com.facebook.react:hermes-engine:+") { // From node_modules |         implementation("com.facebook.react:hermes-android") | ||||||
|             exclude group:'com.facebook.fbjni' |  | ||||||
|         } |  | ||||||
|     } else { |     } else { | ||||||
|         implementation jscFlavor |         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"); | apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json')"].execute().text.trim(), "../native_modules.gradle"); | ||||||
| applyNativeModulesAppBuildGradle(project) | 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" |  | ||||||
| } |  | ||||||
|   | |||||||
| @@ -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, |  | ||||||
|         ) |  | ||||||
| @@ -17,7 +17,6 @@ import com.facebook.flipper.plugins.inspector.DescriptorMapping; | |||||||
| import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin; | import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin; | ||||||
| import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor; | import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor; | ||||||
| import com.facebook.flipper.plugins.network.NetworkFlipperPlugin; | import com.facebook.flipper.plugins.network.NetworkFlipperPlugin; | ||||||
| import com.facebook.flipper.plugins.react.ReactFlipperPlugin; |  | ||||||
| import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin; | import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin; | ||||||
| import com.facebook.react.ReactInstanceEventListener; | import com.facebook.react.ReactInstanceEventListener; | ||||||
| import com.facebook.react.ReactInstanceManager; | import com.facebook.react.ReactInstanceManager; | ||||||
| @@ -25,12 +24,15 @@ import com.facebook.react.bridge.ReactContext; | |||||||
| import com.facebook.react.modules.network.NetworkingModule; | import com.facebook.react.modules.network.NetworkingModule; | ||||||
| import okhttp3.OkHttpClient; | 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 class ReactNativeFlipper { | ||||||
|   public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { |   public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { | ||||||
|     if (FlipperUtils.shouldEnableFlipper(context)) { |     if (FlipperUtils.shouldEnableFlipper(context)) { | ||||||
|       final FlipperClient client = AndroidFlipperClient.getInstance(context); |       final FlipperClient client = AndroidFlipperClient.getInstance(context); | ||||||
|       client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults())); |       client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults())); | ||||||
|       client.addPlugin(new ReactFlipperPlugin()); |  | ||||||
|       client.addPlugin(new DatabasesFlipperPlugin(context)); |       client.addPlugin(new DatabasesFlipperPlugin(context)); | ||||||
|       client.addPlugin(new SharedPreferencesFlipperPlugin(context)); |       client.addPlugin(new SharedPreferencesFlipperPlugin(context)); | ||||||
|       client.addPlugin(CrashReporterPlugin.getInstance()); |       client.addPlugin(CrashReporterPlugin.getInstance()); | ||||||
|   | |||||||
| @@ -1,6 +1,4 @@ | |||||||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | <manifest xmlns:android="http://schemas.android.com/apk/res/android"> | ||||||
|   xmlns:tools="http://schemas.android.com/tools" |  | ||||||
|   package="com.xmflsct.app.tooot"> |  | ||||||
|   <uses-permission android:name="android.permission.INTERNET"/> |   <uses-permission android:name="android.permission.INTERNET"/> | ||||||
|   <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> |   <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> | ||||||
|   <uses-permission android:name="android.permission.READ_PHONE_STATE"/> |   <uses-permission android:name="android.permission.READ_PHONE_STATE"/> | ||||||
|   | |||||||
| @@ -3,7 +3,8 @@ import android.os.Bundle; | |||||||
|  |  | ||||||
| import com.facebook.react.ReactActivity; | import com.facebook.react.ReactActivity; | ||||||
| import com.facebook.react.ReactActivityDelegate; | 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; | 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 |    * Returns the instance of the {@link ReactActivityDelegate}. Here we use a util class {@link | ||||||
|    * you can specify the renderer you wish to use - the new renderer (Fabric) or the old renderer |    * DefaultReactActivityDelegate} which allows you to easily enable Fabric and Concurrent React | ||||||
|    * (Paper). |    * (aka React 18) with two boolean flags. | ||||||
|    */ |    */ | ||||||
|   @Override |   @Override | ||||||
|   protected ReactActivityDelegate createReactActivityDelegate() { |   protected ReactActivityDelegate createReactActivityDelegate() { | ||||||
|     return new ReactActivityDelegateWrapper(this, new MainActivityDelegate(this, getMainComponentName())); |     return new DefaultReactActivityDelegate( | ||||||
|   } |         this, | ||||||
|   public static class MainActivityDelegate extends ReactActivityDelegate { |         getMainComponentName(), | ||||||
|     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. |         // If you opted-in for the New Architecture, we enable the Fabric Renderer. | ||||||
|       reactRootView.setIsFabric(BuildConfig.IS_NEW_ARCHITECTURE_ENABLED); |         DefaultNewArchitectureEntryPoint.getFabricEnabled(), // fabricEnabled | ||||||
|       return reactRootView; |         // If you opted-in for the New Architecture, we enable Concurrent React (i.e. React 18). | ||||||
|     } |         DefaultNewArchitectureEntryPoint.getConcurrentReactEnabled() // concurrentRootEnabled | ||||||
|  |         ); | ||||||
|     @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; |  | ||||||
|     } |  | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,32 +1,26 @@ | |||||||
| package com.xmflsct.app.tooot; | package com.xmflsct.app.tooot; | ||||||
|  |  | ||||||
| import android.app.Application; | import android.app.Application; | ||||||
| import android.content.Context; |  | ||||||
| import android.content.res.Configuration; | import android.content.res.Configuration; | ||||||
| import androidx.annotation.NonNull; | import androidx.annotation.NonNull; | ||||||
|  |  | ||||||
| import com.facebook.react.PackageList; | import com.facebook.react.PackageList; | ||||||
| import com.facebook.react.ReactApplication; | import com.facebook.react.ReactApplication; | ||||||
| import com.facebook.react.ReactInstanceManager; |  | ||||||
| import com.facebook.react.ReactNativeHost; | import com.facebook.react.ReactNativeHost; | ||||||
| import com.facebook.react.ReactPackage; | import com.facebook.react.ReactPackage; | ||||||
| import com.facebook.react.config.ReactFeatureFlags; | import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint; | ||||||
| import com.facebook.react.shell.MainReactPackage; | import com.facebook.react.defaults.DefaultReactNativeHost; | ||||||
| import com.facebook.soloader.SoLoader; | import com.facebook.soloader.SoLoader; | ||||||
|  |  | ||||||
| import expo.modules.ApplicationLifecycleDispatcher; | import expo.modules.ApplicationLifecycleDispatcher; | ||||||
| import expo.modules.ReactNativeHostWrapper; | import expo.modules.ReactNativeHostWrapper; | ||||||
|  |  | ||||||
| import java.lang.reflect.InvocationTargetException; |  | ||||||
| import java.util.List; | 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 { | public class MainApplication extends Application implements ReactApplication { | ||||||
|   private final ReactNativeHost mReactNativeHost = new ReactNativeHostWrapper( |   private final ReactNativeHost mReactNativeHost = new ReactNativeHostWrapper( | ||||||
|     this, |     this, | ||||||
|     new ReactNativeHost(this) { |     new DefaultReactNativeHost(this) { | ||||||
|     @Override |     @Override | ||||||
|     public boolean getUseDeveloperSupport() { |     public boolean getUseDeveloperSupport() { | ||||||
|       return BuildConfig.DEBUG; |       return BuildConfig.DEBUG; | ||||||
| @@ -46,67 +40,30 @@ public class MainApplication extends Application implements ReactApplication { | |||||||
|       return "index"; |       return "index"; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override // <- react-native-reanimated-v2 |     @Override | ||||||
|     protected JSIModulePackage getJSIModulePackage() { |     protected boolean isNewArchEnabled() { | ||||||
|       return new ReanimatedJSIModulePackage(); |       return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED; | ||||||
|  |     } | ||||||
|  |     @Override | ||||||
|  |     protected Boolean isHermesEnabled() { | ||||||
|  |       return BuildConfig.IS_HERMES_ENABLED; | ||||||
|     } |     } | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   @Override |   @Override | ||||||
|   public ReactNativeHost getReactNativeHost() { |   public ReactNativeHost getReactNativeHost() { | ||||||
|     // if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { |  | ||||||
|     //   return mNewArchitectureNativeHost; |  | ||||||
|     // } else { |  | ||||||
|     //   return mReactNativeHost; |  | ||||||
|     // } |  | ||||||
|     return mReactNativeHost; |     return mReactNativeHost; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @Override |   @Override | ||||||
|   public void onCreate() { |   public void onCreate() { | ||||||
|     super.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); |     SoLoader.init(this, /* native exopackage */ false); | ||||||
|  |  | ||||||
|     initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); |     if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { | ||||||
|     ApplicationLifecycleDispatcher.onApplicationCreate(this); |       // If you opted-in for the New Architecture, we load the native entry point for this app. | ||||||
|   } |       DefaultNewArchitectureEntryPoint.load(); | ||||||
|  |  | ||||||
|   @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(); |  | ||||||
|       } |  | ||||||
|     } |     } | ||||||
|  |     // ReactNativeFlipper.initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -0,0 +1,20 @@ | |||||||
|  | /** | ||||||
|  |  * Copyright (c) Meta Platforms, Inc. and affiliates. | ||||||
|  |  * | ||||||
|  |  * <p>This source code is licensed under the MIT license found in the LICENSE file in the root | ||||||
|  |  * directory of this source tree. | ||||||
|  |  */ | ||||||
|  | package 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. | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -2,19 +2,14 @@ | |||||||
|  |  | ||||||
| buildscript { | buildscript { | ||||||
|     ext { |     ext { | ||||||
|         buildToolsVersion = "31.0.0" |         buildToolsVersion = "33.0.0" | ||||||
|         minSdkVersion = 21 |         minSdkVersion = 21 | ||||||
|         compileSdkVersion = 31 |         compileSdkVersion = 33 | ||||||
|         targetSdkVersion = 31 |         targetSdkVersion = 33 | ||||||
|         kotlinVersion = '1.6.10' |         kotlinVersion = '1.8.10' | ||||||
|  |  | ||||||
|         if (System.properties['os.arch'] == "aarch64") { |         // We use NDK 23 which has both M1 support and is the side-by-side NDK version from AGP. | ||||||
|             // For M1 Users we need to use the NDK 24 which added support for aarch64 |         ndkVersion = "23.1.7779620" | ||||||
|             ndkVersion = "24.0.8215888" |  | ||||||
|         } else { |  | ||||||
|             // Otherwise we default to the side-by-side NDK version from AGP. |  | ||||||
|             ndkVersion = "21.4.7075529" |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
|     repositories { |     repositories { | ||||||
|         google() |         google() | ||||||
| @@ -22,31 +17,8 @@ buildscript { | |||||||
|         jcenter() |         jcenter() | ||||||
|     } |     } | ||||||
|     dependencies { |     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("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' |         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' } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -39,6 +39,10 @@ reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 | |||||||
| # are providing them. | # are providing them. | ||||||
| newArchEnabled=false | 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.jvmargs=-Xmx4096m -XX:MaxPermSize=4096m -XX:+HeapDumpOnOutOfMemoryError | ||||||
| org.gradle.daemon=true | org.gradle.daemon=true | ||||||
| org.gradle.parallel=true | org.gradle.parallel=true | ||||||
|   | |||||||
| @@ -9,9 +9,3 @@ applyNativeModulesSettingsGradle(settings) | |||||||
| include ':app' | include ':app' | ||||||
|  |  | ||||||
| includeBuild('../node_modules/react-native-gradle-plugin') | 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') |  | ||||||
| } |  | ||||||
|   | |||||||
| @@ -8,6 +8,7 @@ export default (): ExpoConfig => ({ | |||||||
|   slug: 'tooot', |   slug: 'tooot', | ||||||
|   scheme: 'tooot', |   scheme: 'tooot', | ||||||
|   version, |   version, | ||||||
|  |   // @ts-ignore | ||||||
|   extra: { environment: process.env.ENVIRONMENT }, |   extra: { environment: process.env.ENVIRONMENT }, | ||||||
|   privacy: 'hidden', |   privacy: 'hidden', | ||||||
|   ios: { |   ios: { | ||||||
|   | |||||||
							
								
								
									
										13
									
								
								crowdin.yml
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								crowdin.yml
									
									
									
									
									
								
							| @@ -1,10 +1,5 @@ | |||||||
| # 'preserve_hierarchy': true |  | ||||||
|  |  | ||||||
| files: | files: | ||||||
|   [ |   - source: /src/i18n/en/**/*.json | ||||||
|     { |     translation: /src/i18n/%osx_locale%/**/%original_file_name% | ||||||
|       'source': '/src/i18n/en/**/*.json', |     ignore: | ||||||
|       'translation': '/src/i18n/%osx_locale%/**/%original_file_name%', |       - '*.ts' | ||||||
|       'ignore': ['*.ts'], |  | ||||||
|     }, |  | ||||||
|   ] |  | ||||||
|   | |||||||
| @@ -1,9 +1,4 @@ | |||||||
| Enjoy toooting! This version includes following improvements and fixes: | Enjoy toooting! This version includes following improvements and fixes: | ||||||
| - Auto fetch remote content in conversations! | - Added following remote instance | ||||||
| - Remember last read position in timeline! | - Added set note of followed users | ||||||
| - Follow a user with other logged in accounts | - Best effort load remote user's toots | ||||||
| - Allowing adding more context of reports |  | ||||||
| - Option to disable autoplay gif |  | ||||||
| - Hide boosts from users |  | ||||||
| - Followed hashtags are underlined |  | ||||||
| - Support GoToSocial |  | ||||||
| @@ -1,9 +1,4 @@ | |||||||
| toooting愉快!此版本包括以下改进和修复: | toooting愉快!此版本包括以下改进和修复: | ||||||
| - 主动获取对话的远程内容 | - 新增关注远程实例功能 | ||||||
| - 自动加载上次我的关注的阅读位置 | - 新增关注用户备注功能 | ||||||
| - 用其它已登陆的账户关注用户 | - 加载远程用户的嘟文 | ||||||
| - 可添加举报细节 |  | ||||||
| - 新增暂停自动播放gif动画选项 |  | ||||||
| - 隐藏用户的转嘟 |  | ||||||
| - 下划线高亮正在关注的话题标签 |  | ||||||
| - 支持GoToSocial |  | ||||||
| @@ -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") | require File.join(File.dirname(`node --print "require.resolve('@react-native-community/cli-platform-ios/package.json')"`), "native_modules") | ||||||
|  |  | ||||||
| platform :ios, '13.0' | 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' | require 'json' | ||||||
| podfile_properties = JSON.parse(File.read('./Podfile.properties.json')) rescue {} | podfile_properties = JSON.parse(File.read('./Podfile.properties.json')) rescue {} | ||||||
| @@ -19,7 +25,6 @@ target 'tooot' do | |||||||
|     :path => config[:reactNativePath], |     :path => config[:reactNativePath], | ||||||
|     :hermes_enabled => true, |     :hermes_enabled => true, | ||||||
|     :fabric_enabled => flags[:fabric_enabled], |     :fabric_enabled => flags[:fabric_enabled], | ||||||
|     # :flipper_configuration => FlipperConfiguration.enabled(["Debug"], { 'Flipper' => '0.159.0' }), |  | ||||||
|     :flipper_configuration => FlipperConfiguration.disabled, |     :flipper_configuration => FlipperConfiguration.disabled, | ||||||
|     # An absolute path to your application root. |     # An absolute path to your application root. | ||||||
|     :app_path => "#{Pod::Config.instance.installation_root}/.." |     :app_path => "#{Pod::Config.instance.installation_root}/.." | ||||||
|   | |||||||
							
								
								
									
										684
									
								
								ios/Podfile.lock
									
									
									
									
									
								
							
							
						
						
									
										684
									
								
								ios/Podfile.lock
									
									
									
									
									
								
							| @@ -1,69 +1,70 @@ | |||||||
| PODS: | PODS: | ||||||
|   - boost (1.76.0) |   - boost (1.76.0) | ||||||
|   - DoubleConversion (1.1.6) |   - DoubleConversion (1.1.6) | ||||||
|   - EXApplication (5.0.1): |   - EXApplication (5.1.1): | ||||||
|     - ExpoModulesCore |     - ExpoModulesCore | ||||||
|   - EXAV (13.2.0): |   - EXAV (13.2.1): | ||||||
|     - ExpoModulesCore |     - ExpoModulesCore | ||||||
|     - ReactCommon/turbomodule/core |     - ReactCommon/turbomodule/core | ||||||
|   - EXConstants (14.2.0): |   - EXConstants (14.2.1): | ||||||
|     - ExpoModulesCore |     - ExpoModulesCore | ||||||
|   - EXErrorRecovery (4.0.1): |   - EXErrorRecovery (4.1.1): | ||||||
|     - ExpoModulesCore |     - ExpoModulesCore | ||||||
|   - EXFileSystem (15.2.0): |   - EXFileSystem (15.2.2): | ||||||
|     - ExpoModulesCore |     - ExpoModulesCore | ||||||
|   - EXFont (11.0.1): |   - EXFont (11.1.1): | ||||||
|     - ExpoModulesCore |     - ExpoModulesCore | ||||||
|   - EXNotifications (0.17.0): |   - EXNotifications (0.18.1): | ||||||
|     - ExpoModulesCore |     - ExpoModulesCore | ||||||
|   - Expo (47.0.13): |   - Expo (48.0.0-beta.2): | ||||||
|     - ExpoModulesCore |     - ExpoModulesCore | ||||||
|   - ExpoCrypto (12.2.0): |   - ExpoCrypto (12.2.1): | ||||||
|     - ExpoModulesCore |     - ExpoModulesCore | ||||||
|   - ExpoHaptics (12.2.0): |   - ExpoHaptics (12.2.1): | ||||||
|     - ExpoModulesCore |     - ExpoModulesCore | ||||||
|   - ExpoImage (1.0.0-beta.6): |   - ExpoImage (1.0.0): | ||||||
|     - ExpoModulesCore |     - ExpoModulesCore | ||||||
|     - SDWebImage (~> 5.15.0) |     - SDWebImage (~> 5.15.0) | ||||||
|     - SDWebImageAVIFCoder (~> 0.9.4) |     - SDWebImageAVIFCoder (~> 0.9.4) | ||||||
|     - SDWebImageSVGCoder (~> 1.6.1) |     - SDWebImageSVGCoder (~> 1.6.1) | ||||||
|     - SDWebImageWebPCoder (~> 0.9.1) |     - SDWebImageWebPCoder (~> 0.9.1) | ||||||
|   - ExpoKeepAwake (11.0.1): |   - ExpoKeepAwake (12.0.1): | ||||||
|     - ExpoModulesCore |     - ExpoModulesCore | ||||||
|   - ExpoLocalization (14.1.0): |   - ExpoLocalization (14.1.1): | ||||||
|     - ExpoModulesCore |     - ExpoModulesCore | ||||||
|   - ExpoModulesCore (1.1.1): |   - ExpoModulesCore (1.2.1): | ||||||
|     - React-Core |     - React-Core | ||||||
|  |     - React-RCTAppDelegate | ||||||
|     - ReactCommon/turbomodule/core |     - ReactCommon/turbomodule/core | ||||||
|   - ExpoRandom (13.1.0): |   - ExpoStoreReview (6.2.1): | ||||||
|     - ExpoModulesCore |     - ExpoModulesCore | ||||||
|   - ExpoStoreReview (6.2.0): |   - ExpoVideoThumbnails (7.2.1): | ||||||
|     - ExpoModulesCore |     - ExpoModulesCore | ||||||
|   - ExpoVideoThumbnails (7.2.0): |   - ExpoWebBrowser (12.1.1): | ||||||
|     - ExpoModulesCore |     - ExpoModulesCore | ||||||
|   - ExpoWebBrowser (12.0.0): |   - EXScreenCapture (5.1.1): | ||||||
|     - ExpoModulesCore |     - ExpoModulesCore | ||||||
|   - EXScreenCapture (5.1.0): |   - EXScreenOrientation (5.1.1): | ||||||
|     - ExpoModulesCore |  | ||||||
|   - EXScreenOrientation (5.1.0): |  | ||||||
|     - ExpoModulesCore |     - ExpoModulesCore | ||||||
|     - React-Core |     - React-Core | ||||||
|   - EXSecureStore (12.1.0): |   - EXSecureStore (12.1.1): | ||||||
|     - ExpoModulesCore |     - ExpoModulesCore | ||||||
|   - EXSplashScreen (0.17.5): |   - EXSplashScreen (0.18.1): | ||||||
|     - ExpoModulesCore |     - ExpoModulesCore | ||||||
|     - React-Core |     - React-Core | ||||||
|   - FBLazyVector (0.70.7) |   - FBLazyVector (0.71.3) | ||||||
|   - FBReactNativeSpec (0.70.7): |   - FBReactNativeSpec (0.71.3): | ||||||
|     - RCT-Folly (= 2021.07.22.00) |     - RCT-Folly (= 2021.07.22.00) | ||||||
|     - RCTRequired (= 0.70.7) |     - RCTRequired (= 0.71.3) | ||||||
|     - RCTTypeSafety (= 0.70.7) |     - RCTTypeSafety (= 0.71.3) | ||||||
|     - React-Core (= 0.70.7) |     - React-Core (= 0.71.3) | ||||||
|     - React-jsi (= 0.70.7) |     - React-jsi (= 0.71.3) | ||||||
|     - ReactCommon/turbomodule/core (= 0.70.7) |     - ReactCommon/turbomodule/core (= 0.71.3) | ||||||
|   - fmt (6.2.1) |   - fmt (6.2.1) | ||||||
|   - glog (0.3.5) |   - 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): |   - libaom (2.0.2): | ||||||
|     - libvmaf |     - libvmaf | ||||||
|   - libavif (0.10.1): |   - libavif (0.10.1): | ||||||
| @@ -103,235 +104,258 @@ PODS: | |||||||
|     - fmt (~> 6.2.1) |     - fmt (~> 6.2.1) | ||||||
|     - glog |     - glog | ||||||
|     - libevent |     - libevent | ||||||
|   - RCTRequired (0.70.7) |   - RCTRequired (0.71.3) | ||||||
|   - RCTTypeSafety (0.70.7): |   - RCTTypeSafety (0.71.3): | ||||||
|     - FBLazyVector (= 0.70.7) |     - FBLazyVector (= 0.71.3) | ||||||
|     - RCTRequired (= 0.70.7) |     - RCTRequired (= 0.71.3) | ||||||
|     - React-Core (= 0.70.7) |     - React-Core (= 0.71.3) | ||||||
|   - React (0.70.7): |   - React (0.71.3): | ||||||
|     - React-Core (= 0.70.7) |     - React-Core (= 0.71.3) | ||||||
|     - React-Core/DevSupport (= 0.70.7) |     - React-Core/DevSupport (= 0.71.3) | ||||||
|     - React-Core/RCTWebSocket (= 0.70.7) |     - React-Core/RCTWebSocket (= 0.71.3) | ||||||
|     - React-RCTActionSheet (= 0.70.7) |     - React-RCTActionSheet (= 0.71.3) | ||||||
|     - React-RCTAnimation (= 0.70.7) |     - React-RCTAnimation (= 0.71.3) | ||||||
|     - React-RCTBlob (= 0.70.7) |     - React-RCTBlob (= 0.71.3) | ||||||
|     - React-RCTImage (= 0.70.7) |     - React-RCTImage (= 0.71.3) | ||||||
|     - React-RCTLinking (= 0.70.7) |     - React-RCTLinking (= 0.71.3) | ||||||
|     - React-RCTNetwork (= 0.70.7) |     - React-RCTNetwork (= 0.71.3) | ||||||
|     - React-RCTSettings (= 0.70.7) |     - React-RCTSettings (= 0.71.3) | ||||||
|     - React-RCTText (= 0.70.7) |     - React-RCTText (= 0.71.3) | ||||||
|     - React-RCTVibration (= 0.70.7) |     - React-RCTVibration (= 0.71.3) | ||||||
|   - React-bridging (0.70.7): |   - React-callinvoker (0.71.3) | ||||||
|     - RCT-Folly (= 2021.07.22.00) |   - React-Codegen (0.71.3): | ||||||
|     - React-jsi (= 0.70.7) |     - FBReactNativeSpec | ||||||
|   - React-callinvoker (0.70.7) |     - hermes-engine | ||||||
|   - React-Codegen (0.70.7): |     - RCT-Folly | ||||||
|     - FBReactNativeSpec (= 0.70.7) |     - RCTRequired | ||||||
|     - RCT-Folly (= 2021.07.22.00) |     - RCTTypeSafety | ||||||
|     - RCTRequired (= 0.70.7) |     - React-Core | ||||||
|     - RCTTypeSafety (= 0.70.7) |     - React-jsi | ||||||
|     - React-Core (= 0.70.7) |     - React-jsiexecutor | ||||||
|     - React-jsi (= 0.70.7) |     - ReactCommon/turbomodule/bridging | ||||||
|     - React-jsiexecutor (= 0.70.7) |     - ReactCommon/turbomodule/core | ||||||
|     - ReactCommon/turbomodule/core (= 0.70.7) |   - React-Core (0.71.3): | ||||||
|   - React-Core (0.70.7): |  | ||||||
|     - glog |     - glog | ||||||
|  |     - hermes-engine | ||||||
|     - RCT-Folly (= 2021.07.22.00) |     - RCT-Folly (= 2021.07.22.00) | ||||||
|     - React-Core/Default (= 0.70.7) |     - React-Core/Default (= 0.71.3) | ||||||
|     - React-cxxreact (= 0.70.7) |     - React-cxxreact (= 0.71.3) | ||||||
|     - React-jsi (= 0.70.7) |     - React-hermes | ||||||
|     - React-jsiexecutor (= 0.70.7) |     - React-jsi (= 0.71.3) | ||||||
|     - React-perflogger (= 0.70.7) |     - React-jsiexecutor (= 0.71.3) | ||||||
|  |     - React-perflogger (= 0.71.3) | ||||||
|     - Yoga |     - Yoga | ||||||
|   - React-Core/CoreModulesHeaders (0.70.7): |   - React-Core/CoreModulesHeaders (0.71.3): | ||||||
|     - glog |     - glog | ||||||
|  |     - hermes-engine | ||||||
|     - RCT-Folly (= 2021.07.22.00) |     - RCT-Folly (= 2021.07.22.00) | ||||||
|     - React-Core/Default |     - React-Core/Default | ||||||
|     - React-cxxreact (= 0.70.7) |     - React-cxxreact (= 0.71.3) | ||||||
|     - React-jsi (= 0.70.7) |     - React-hermes | ||||||
|     - React-jsiexecutor (= 0.70.7) |     - React-jsi (= 0.71.3) | ||||||
|     - React-perflogger (= 0.70.7) |     - React-jsiexecutor (= 0.71.3) | ||||||
|  |     - React-perflogger (= 0.71.3) | ||||||
|     - Yoga |     - Yoga | ||||||
|   - React-Core/Default (0.70.7): |   - React-Core/Default (0.71.3): | ||||||
|     - glog |     - glog | ||||||
|  |     - hermes-engine | ||||||
|     - RCT-Folly (= 2021.07.22.00) |     - RCT-Folly (= 2021.07.22.00) | ||||||
|     - React-cxxreact (= 0.70.7) |     - React-cxxreact (= 0.71.3) | ||||||
|     - React-jsi (= 0.70.7) |     - React-hermes | ||||||
|     - React-jsiexecutor (= 0.70.7) |     - React-jsi (= 0.71.3) | ||||||
|     - React-perflogger (= 0.70.7) |     - React-jsiexecutor (= 0.71.3) | ||||||
|  |     - React-perflogger (= 0.71.3) | ||||||
|     - Yoga |     - Yoga | ||||||
|   - React-Core/DevSupport (0.70.7): |   - React-Core/DevSupport (0.71.3): | ||||||
|     - glog |     - glog | ||||||
|  |     - hermes-engine | ||||||
|     - RCT-Folly (= 2021.07.22.00) |     - RCT-Folly (= 2021.07.22.00) | ||||||
|     - React-Core/Default (= 0.70.7) |     - React-Core/Default (= 0.71.3) | ||||||
|     - React-Core/RCTWebSocket (= 0.70.7) |     - React-Core/RCTWebSocket (= 0.71.3) | ||||||
|     - React-cxxreact (= 0.70.7) |     - React-cxxreact (= 0.71.3) | ||||||
|     - React-jsi (= 0.70.7) |     - React-hermes | ||||||
|     - React-jsiexecutor (= 0.70.7) |     - React-jsi (= 0.71.3) | ||||||
|     - React-jsinspector (= 0.70.7) |     - React-jsiexecutor (= 0.71.3) | ||||||
|     - React-perflogger (= 0.70.7) |     - React-jsinspector (= 0.71.3) | ||||||
|  |     - React-perflogger (= 0.71.3) | ||||||
|     - Yoga |     - Yoga | ||||||
|   - React-Core/RCTActionSheetHeaders (0.70.7): |   - React-Core/RCTActionSheetHeaders (0.71.3): | ||||||
|     - glog |     - glog | ||||||
|  |     - hermes-engine | ||||||
|     - RCT-Folly (= 2021.07.22.00) |     - RCT-Folly (= 2021.07.22.00) | ||||||
|     - React-Core/Default |     - React-Core/Default | ||||||
|     - React-cxxreact (= 0.70.7) |     - React-cxxreact (= 0.71.3) | ||||||
|     - React-jsi (= 0.70.7) |     - React-hermes | ||||||
|     - React-jsiexecutor (= 0.70.7) |     - React-jsi (= 0.71.3) | ||||||
|     - React-perflogger (= 0.70.7) |     - React-jsiexecutor (= 0.71.3) | ||||||
|  |     - React-perflogger (= 0.71.3) | ||||||
|     - Yoga |     - Yoga | ||||||
|   - React-Core/RCTAnimationHeaders (0.70.7): |   - React-Core/RCTAnimationHeaders (0.71.3): | ||||||
|     - glog |     - glog | ||||||
|  |     - hermes-engine | ||||||
|     - RCT-Folly (= 2021.07.22.00) |     - RCT-Folly (= 2021.07.22.00) | ||||||
|     - React-Core/Default |     - React-Core/Default | ||||||
|     - React-cxxreact (= 0.70.7) |     - React-cxxreact (= 0.71.3) | ||||||
|     - React-jsi (= 0.70.7) |     - React-hermes | ||||||
|     - React-jsiexecutor (= 0.70.7) |     - React-jsi (= 0.71.3) | ||||||
|     - React-perflogger (= 0.70.7) |     - React-jsiexecutor (= 0.71.3) | ||||||
|  |     - React-perflogger (= 0.71.3) | ||||||
|     - Yoga |     - Yoga | ||||||
|   - React-Core/RCTBlobHeaders (0.70.7): |   - React-Core/RCTBlobHeaders (0.71.3): | ||||||
|     - glog |     - glog | ||||||
|  |     - hermes-engine | ||||||
|     - RCT-Folly (= 2021.07.22.00) |     - RCT-Folly (= 2021.07.22.00) | ||||||
|     - React-Core/Default |     - React-Core/Default | ||||||
|     - React-cxxreact (= 0.70.7) |     - React-cxxreact (= 0.71.3) | ||||||
|     - React-jsi (= 0.70.7) |     - React-hermes | ||||||
|     - React-jsiexecutor (= 0.70.7) |     - React-jsi (= 0.71.3) | ||||||
|     - React-perflogger (= 0.70.7) |     - React-jsiexecutor (= 0.71.3) | ||||||
|  |     - React-perflogger (= 0.71.3) | ||||||
|     - Yoga |     - Yoga | ||||||
|   - React-Core/RCTImageHeaders (0.70.7): |   - React-Core/RCTImageHeaders (0.71.3): | ||||||
|     - glog |     - glog | ||||||
|  |     - hermes-engine | ||||||
|     - RCT-Folly (= 2021.07.22.00) |     - RCT-Folly (= 2021.07.22.00) | ||||||
|     - React-Core/Default |     - React-Core/Default | ||||||
|     - React-cxxreact (= 0.70.7) |     - React-cxxreact (= 0.71.3) | ||||||
|     - React-jsi (= 0.70.7) |     - React-hermes | ||||||
|     - React-jsiexecutor (= 0.70.7) |     - React-jsi (= 0.71.3) | ||||||
|     - React-perflogger (= 0.70.7) |     - React-jsiexecutor (= 0.71.3) | ||||||
|  |     - React-perflogger (= 0.71.3) | ||||||
|     - Yoga |     - Yoga | ||||||
|   - React-Core/RCTLinkingHeaders (0.70.7): |   - React-Core/RCTLinkingHeaders (0.71.3): | ||||||
|     - glog |     - glog | ||||||
|  |     - hermes-engine | ||||||
|     - RCT-Folly (= 2021.07.22.00) |     - RCT-Folly (= 2021.07.22.00) | ||||||
|     - React-Core/Default |     - React-Core/Default | ||||||
|     - React-cxxreact (= 0.70.7) |     - React-cxxreact (= 0.71.3) | ||||||
|     - React-jsi (= 0.70.7) |     - React-hermes | ||||||
|     - React-jsiexecutor (= 0.70.7) |     - React-jsi (= 0.71.3) | ||||||
|     - React-perflogger (= 0.70.7) |     - React-jsiexecutor (= 0.71.3) | ||||||
|  |     - React-perflogger (= 0.71.3) | ||||||
|     - Yoga |     - Yoga | ||||||
|   - React-Core/RCTNetworkHeaders (0.70.7): |   - React-Core/RCTNetworkHeaders (0.71.3): | ||||||
|     - glog |     - glog | ||||||
|  |     - hermes-engine | ||||||
|     - RCT-Folly (= 2021.07.22.00) |     - RCT-Folly (= 2021.07.22.00) | ||||||
|     - React-Core/Default |     - React-Core/Default | ||||||
|     - React-cxxreact (= 0.70.7) |     - React-cxxreact (= 0.71.3) | ||||||
|     - React-jsi (= 0.70.7) |     - React-hermes | ||||||
|     - React-jsiexecutor (= 0.70.7) |     - React-jsi (= 0.71.3) | ||||||
|     - React-perflogger (= 0.70.7) |     - React-jsiexecutor (= 0.71.3) | ||||||
|  |     - React-perflogger (= 0.71.3) | ||||||
|     - Yoga |     - Yoga | ||||||
|   - React-Core/RCTSettingsHeaders (0.70.7): |   - React-Core/RCTSettingsHeaders (0.71.3): | ||||||
|     - glog |     - glog | ||||||
|  |     - hermes-engine | ||||||
|     - RCT-Folly (= 2021.07.22.00) |     - RCT-Folly (= 2021.07.22.00) | ||||||
|     - React-Core/Default |     - React-Core/Default | ||||||
|     - React-cxxreact (= 0.70.7) |     - React-cxxreact (= 0.71.3) | ||||||
|     - React-jsi (= 0.70.7) |     - React-hermes | ||||||
|     - React-jsiexecutor (= 0.70.7) |     - React-jsi (= 0.71.3) | ||||||
|     - React-perflogger (= 0.70.7) |     - React-jsiexecutor (= 0.71.3) | ||||||
|  |     - React-perflogger (= 0.71.3) | ||||||
|     - Yoga |     - Yoga | ||||||
|   - React-Core/RCTTextHeaders (0.70.7): |   - React-Core/RCTTextHeaders (0.71.3): | ||||||
|     - glog |     - glog | ||||||
|  |     - hermes-engine | ||||||
|     - RCT-Folly (= 2021.07.22.00) |     - RCT-Folly (= 2021.07.22.00) | ||||||
|     - React-Core/Default |     - React-Core/Default | ||||||
|     - React-cxxreact (= 0.70.7) |     - React-cxxreact (= 0.71.3) | ||||||
|     - React-jsi (= 0.70.7) |     - React-hermes | ||||||
|     - React-jsiexecutor (= 0.70.7) |     - React-jsi (= 0.71.3) | ||||||
|     - React-perflogger (= 0.70.7) |     - React-jsiexecutor (= 0.71.3) | ||||||
|  |     - React-perflogger (= 0.71.3) | ||||||
|     - Yoga |     - Yoga | ||||||
|   - React-Core/RCTVibrationHeaders (0.70.7): |   - React-Core/RCTVibrationHeaders (0.71.3): | ||||||
|     - glog |     - glog | ||||||
|  |     - hermes-engine | ||||||
|     - RCT-Folly (= 2021.07.22.00) |     - RCT-Folly (= 2021.07.22.00) | ||||||
|     - React-Core/Default |     - React-Core/Default | ||||||
|     - React-cxxreact (= 0.70.7) |     - React-cxxreact (= 0.71.3) | ||||||
|     - React-jsi (= 0.70.7) |     - React-hermes | ||||||
|     - React-jsiexecutor (= 0.70.7) |     - React-jsi (= 0.71.3) | ||||||
|     - React-perflogger (= 0.70.7) |     - React-jsiexecutor (= 0.71.3) | ||||||
|  |     - React-perflogger (= 0.71.3) | ||||||
|     - Yoga |     - Yoga | ||||||
|   - React-Core/RCTWebSocket (0.70.7): |   - React-Core/RCTWebSocket (0.71.3): | ||||||
|     - glog |     - glog | ||||||
|  |     - hermes-engine | ||||||
|     - RCT-Folly (= 2021.07.22.00) |     - RCT-Folly (= 2021.07.22.00) | ||||||
|     - React-Core/Default (= 0.70.7) |     - React-Core/Default (= 0.71.3) | ||||||
|     - React-cxxreact (= 0.70.7) |     - React-cxxreact (= 0.71.3) | ||||||
|     - React-jsi (= 0.70.7) |     - React-hermes | ||||||
|     - React-jsiexecutor (= 0.70.7) |     - React-jsi (= 0.71.3) | ||||||
|     - React-perflogger (= 0.70.7) |     - React-jsiexecutor (= 0.71.3) | ||||||
|  |     - React-perflogger (= 0.71.3) | ||||||
|     - Yoga |     - Yoga | ||||||
|   - React-CoreModules (0.70.7): |   - React-CoreModules (0.71.3): | ||||||
|     - RCT-Folly (= 2021.07.22.00) |     - RCT-Folly (= 2021.07.22.00) | ||||||
|     - RCTTypeSafety (= 0.70.7) |     - RCTTypeSafety (= 0.71.3) | ||||||
|     - React-Codegen (= 0.70.7) |     - React-Codegen (= 0.71.3) | ||||||
|     - React-Core/CoreModulesHeaders (= 0.70.7) |     - React-Core/CoreModulesHeaders (= 0.71.3) | ||||||
|     - React-jsi (= 0.70.7) |     - React-jsi (= 0.71.3) | ||||||
|     - React-RCTImage (= 0.70.7) |     - React-RCTBlob | ||||||
|     - ReactCommon/turbomodule/core (= 0.70.7) |     - React-RCTImage (= 0.71.3) | ||||||
|   - React-cxxreact (0.70.7): |     - ReactCommon/turbomodule/core (= 0.71.3) | ||||||
|  |   - React-cxxreact (0.71.3): | ||||||
|     - boost (= 1.76.0) |     - boost (= 1.76.0) | ||||||
|     - DoubleConversion |     - DoubleConversion | ||||||
|     - glog |     - glog | ||||||
|  |     - hermes-engine | ||||||
|     - RCT-Folly (= 2021.07.22.00) |     - RCT-Folly (= 2021.07.22.00) | ||||||
|     - React-callinvoker (= 0.70.7) |     - React-callinvoker (= 0.71.3) | ||||||
|     - React-jsi (= 0.70.7) |     - React-jsi (= 0.71.3) | ||||||
|     - React-jsinspector (= 0.70.7) |     - React-jsinspector (= 0.71.3) | ||||||
|     - React-logger (= 0.70.7) |     - React-logger (= 0.71.3) | ||||||
|     - React-perflogger (= 0.70.7) |     - React-perflogger (= 0.71.3) | ||||||
|     - React-runtimeexecutor (= 0.70.7) |     - React-runtimeexecutor (= 0.71.3) | ||||||
|   - React-hermes (0.70.7): |   - React-hermes (0.71.3): | ||||||
|     - DoubleConversion |     - DoubleConversion | ||||||
|     - glog |     - glog | ||||||
|     - hermes-engine |     - hermes-engine | ||||||
|     - RCT-Folly (= 2021.07.22.00) |     - RCT-Folly (= 2021.07.22.00) | ||||||
|     - RCT-Folly/Futures (= 2021.07.22.00) |     - RCT-Folly/Futures (= 2021.07.22.00) | ||||||
|     - React-cxxreact (= 0.70.7) |     - React-cxxreact (= 0.71.3) | ||||||
|     - React-jsi (= 0.70.7) |     - React-jsi | ||||||
|     - React-jsiexecutor (= 0.70.7) |     - React-jsiexecutor (= 0.71.3) | ||||||
|     - React-jsinspector (= 0.70.7) |     - React-jsinspector (= 0.71.3) | ||||||
|     - React-perflogger (= 0.70.7) |     - React-perflogger (= 0.71.3) | ||||||
|   - React-jsi (0.70.7): |   - React-jsi (0.71.3): | ||||||
|     - boost (= 1.76.0) |     - boost (= 1.76.0) | ||||||
|     - DoubleConversion |     - DoubleConversion | ||||||
|     - glog |     - glog | ||||||
|  |     - hermes-engine | ||||||
|     - RCT-Folly (= 2021.07.22.00) |     - RCT-Folly (= 2021.07.22.00) | ||||||
|     - React-jsi/Default (= 0.70.7) |   - React-jsiexecutor (0.71.3): | ||||||
|   - React-jsi/Default (0.70.7): |  | ||||||
|     - boost (= 1.76.0) |  | ||||||
|     - DoubleConversion |     - DoubleConversion | ||||||
|     - glog |     - glog | ||||||
|  |     - hermes-engine | ||||||
|     - RCT-Folly (= 2021.07.22.00) |     - RCT-Folly (= 2021.07.22.00) | ||||||
|   - React-jsiexecutor (0.70.7): |     - React-cxxreact (= 0.71.3) | ||||||
|     - DoubleConversion |     - React-jsi (= 0.71.3) | ||||||
|     - glog |     - React-perflogger (= 0.71.3) | ||||||
|     - RCT-Folly (= 2021.07.22.00) |   - React-jsinspector (0.71.3) | ||||||
|     - React-cxxreact (= 0.70.7) |   - React-logger (0.71.3): | ||||||
|     - React-jsi (= 0.70.7) |  | ||||||
|     - React-perflogger (= 0.70.7) |  | ||||||
|   - React-jsinspector (0.70.7) |  | ||||||
|   - React-logger (0.70.7): |  | ||||||
|     - glog |     - glog | ||||||
|   - react-native-blur (4.3.0): |   - react-native-blur (4.3.0): | ||||||
|     - React-Core |     - React-Core | ||||||
|   - react-native-cameraroll (5.2.3): |   - react-native-cameraroll (5.2.4): | ||||||
|     - React-Core |     - React-Core | ||||||
|   - react-native-image-picker (5.0.1): |   - react-native-image-picker (5.1.0): | ||||||
|     - React-Core |     - React-Core | ||||||
|   - react-native-ios-context-menu (1.15.3): |   - react-native-ios-context-menu (1.15.3): | ||||||
|     - React-Core |     - React-Core | ||||||
|   - react-native-language-detection (0.2.2): |   - react-native-language-detection (0.2.2): | ||||||
|     - React |     - React | ||||||
|   - react-native-menu (0.7.3): |   - react-native-mmkv (2.7.0): | ||||||
|     - React |  | ||||||
|   - react-native-mmkv (2.5.1): |  | ||||||
|     - MMKV (>= 1.2.13) |     - MMKV (>= 1.2.13) | ||||||
|     - React-Core |     - React-Core | ||||||
|   - react-native-netinfo (9.3.7): |   - react-native-netinfo (9.3.7): | ||||||
|     - React-Core |     - React-Core | ||||||
|   - react-native-pager-view (6.1.2): |   - react-native-pager-view (6.1.4): | ||||||
|     - React-Core |     - React-Core | ||||||
|   - react-native-paste-input (0.6.1): |   - react-native-paste-input (0.6.2): | ||||||
|     - React-Core |     - React-Core | ||||||
|     - Swime (= 3.0.6) |     - Swime (= 3.0.6) | ||||||
|   - react-native-quick-base64 (2.0.5): |   - react-native-quick-base64 (2.0.5): | ||||||
| @@ -342,81 +366,99 @@ PODS: | |||||||
|     - RCTTypeSafety |     - RCTTypeSafety | ||||||
|     - React-Core |     - React-Core | ||||||
|     - ReactCommon/turbomodule/core |     - ReactCommon/turbomodule/core | ||||||
|   - react-native-segmented-control (2.2.2): |   - react-native-segmented-control (2.4.0): | ||||||
|     - React-Core |     - React-Core | ||||||
|   - React-perflogger (0.70.7) |   - React-perflogger (0.71.3) | ||||||
|   - React-RCTActionSheet (0.70.7): |   - React-RCTActionSheet (0.71.3): | ||||||
|     - React-Core/RCTActionSheetHeaders (= 0.70.7) |     - React-Core/RCTActionSheetHeaders (= 0.71.3) | ||||||
|   - React-RCTAnimation (0.70.7): |   - React-RCTAnimation (0.71.3): | ||||||
|     - RCT-Folly (= 2021.07.22.00) |     - RCT-Folly (= 2021.07.22.00) | ||||||
|     - RCTTypeSafety (= 0.70.7) |     - RCTTypeSafety (= 0.71.3) | ||||||
|     - React-Codegen (= 0.70.7) |     - React-Codegen (= 0.71.3) | ||||||
|     - React-Core/RCTAnimationHeaders (= 0.70.7) |     - React-Core/RCTAnimationHeaders (= 0.71.3) | ||||||
|     - React-jsi (= 0.70.7) |     - React-jsi (= 0.71.3) | ||||||
|     - ReactCommon/turbomodule/core (= 0.70.7) |     - ReactCommon/turbomodule/core (= 0.71.3) | ||||||
|   - React-RCTBlob (0.70.7): |   - 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) |     - RCT-Folly (= 2021.07.22.00) | ||||||
|     - React-Codegen (= 0.70.7) |     - React-Codegen (= 0.71.3) | ||||||
|     - React-Core/RCTBlobHeaders (= 0.70.7) |     - React-Core/RCTBlobHeaders (= 0.71.3) | ||||||
|     - React-Core/RCTWebSocket (= 0.70.7) |     - React-Core/RCTWebSocket (= 0.71.3) | ||||||
|     - React-jsi (= 0.70.7) |     - React-jsi (= 0.71.3) | ||||||
|     - React-RCTNetwork (= 0.70.7) |     - React-RCTNetwork (= 0.71.3) | ||||||
|     - ReactCommon/turbomodule/core (= 0.70.7) |     - ReactCommon/turbomodule/core (= 0.71.3) | ||||||
|   - React-RCTImage (0.70.7): |   - React-RCTImage (0.71.3): | ||||||
|     - RCT-Folly (= 2021.07.22.00) |     - RCT-Folly (= 2021.07.22.00) | ||||||
|     - RCTTypeSafety (= 0.70.7) |     - RCTTypeSafety (= 0.71.3) | ||||||
|     - React-Codegen (= 0.70.7) |     - React-Codegen (= 0.71.3) | ||||||
|     - React-Core/RCTImageHeaders (= 0.70.7) |     - React-Core/RCTImageHeaders (= 0.71.3) | ||||||
|     - React-jsi (= 0.70.7) |     - React-jsi (= 0.71.3) | ||||||
|     - React-RCTNetwork (= 0.70.7) |     - React-RCTNetwork (= 0.71.3) | ||||||
|     - ReactCommon/turbomodule/core (= 0.70.7) |     - ReactCommon/turbomodule/core (= 0.71.3) | ||||||
|   - React-RCTLinking (0.70.7): |   - React-RCTLinking (0.71.3): | ||||||
|     - React-Codegen (= 0.70.7) |     - React-Codegen (= 0.71.3) | ||||||
|     - React-Core/RCTLinkingHeaders (= 0.70.7) |     - React-Core/RCTLinkingHeaders (= 0.71.3) | ||||||
|     - React-jsi (= 0.70.7) |     - React-jsi (= 0.71.3) | ||||||
|     - ReactCommon/turbomodule/core (= 0.70.7) |     - ReactCommon/turbomodule/core (= 0.71.3) | ||||||
|   - React-RCTNetwork (0.70.7): |   - React-RCTNetwork (0.71.3): | ||||||
|     - RCT-Folly (= 2021.07.22.00) |     - RCT-Folly (= 2021.07.22.00) | ||||||
|     - RCTTypeSafety (= 0.70.7) |     - RCTTypeSafety (= 0.71.3) | ||||||
|     - React-Codegen (= 0.70.7) |     - React-Codegen (= 0.71.3) | ||||||
|     - React-Core/RCTNetworkHeaders (= 0.70.7) |     - React-Core/RCTNetworkHeaders (= 0.71.3) | ||||||
|     - React-jsi (= 0.70.7) |     - React-jsi (= 0.71.3) | ||||||
|     - ReactCommon/turbomodule/core (= 0.70.7) |     - ReactCommon/turbomodule/core (= 0.71.3) | ||||||
|   - React-RCTSettings (0.70.7): |   - React-RCTSettings (0.71.3): | ||||||
|     - RCT-Folly (= 2021.07.22.00) |     - RCT-Folly (= 2021.07.22.00) | ||||||
|     - RCTTypeSafety (= 0.70.7) |     - RCTTypeSafety (= 0.71.3) | ||||||
|     - React-Codegen (= 0.70.7) |     - React-Codegen (= 0.71.3) | ||||||
|     - React-Core/RCTSettingsHeaders (= 0.70.7) |     - React-Core/RCTSettingsHeaders (= 0.71.3) | ||||||
|     - React-jsi (= 0.70.7) |     - React-jsi (= 0.71.3) | ||||||
|     - ReactCommon/turbomodule/core (= 0.70.7) |     - ReactCommon/turbomodule/core (= 0.71.3) | ||||||
|   - React-RCTText (0.70.7): |   - React-RCTText (0.71.3): | ||||||
|     - React-Core/RCTTextHeaders (= 0.70.7) |     - React-Core/RCTTextHeaders (= 0.71.3) | ||||||
|   - React-RCTVibration (0.70.7): |   - React-RCTVibration (0.71.3): | ||||||
|     - RCT-Folly (= 2021.07.22.00) |     - RCT-Folly (= 2021.07.22.00) | ||||||
|     - React-Codegen (= 0.70.7) |     - React-Codegen (= 0.71.3) | ||||||
|     - React-Core/RCTVibrationHeaders (= 0.70.7) |     - React-Core/RCTVibrationHeaders (= 0.71.3) | ||||||
|     - React-jsi (= 0.70.7) |     - React-jsi (= 0.71.3) | ||||||
|     - ReactCommon/turbomodule/core (= 0.70.7) |     - ReactCommon/turbomodule/core (= 0.71.3) | ||||||
|   - React-runtimeexecutor (0.70.7): |   - React-runtimeexecutor (0.71.3): | ||||||
|     - React-jsi (= 0.70.7) |     - React-jsi (= 0.71.3) | ||||||
|   - ReactCommon/turbomodule/core (0.70.7): |   - ReactCommon/turbomodule/bridging (0.71.3): | ||||||
|     - DoubleConversion |     - DoubleConversion | ||||||
|     - glog |     - glog | ||||||
|  |     - hermes-engine | ||||||
|     - RCT-Folly (= 2021.07.22.00) |     - RCT-Folly (= 2021.07.22.00) | ||||||
|     - React-bridging (= 0.70.7) |     - React-callinvoker (= 0.71.3) | ||||||
|     - React-callinvoker (= 0.70.7) |     - React-Core (= 0.71.3) | ||||||
|     - React-Core (= 0.70.7) |     - React-cxxreact (= 0.71.3) | ||||||
|     - React-cxxreact (= 0.70.7) |     - React-jsi (= 0.71.3) | ||||||
|     - React-jsi (= 0.70.7) |     - React-logger (= 0.71.3) | ||||||
|     - React-logger (= 0.70.7) |     - React-perflogger (= 0.71.3) | ||||||
|     - React-perflogger (= 0.70.7) |   - 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): |   - RNCAsyncStorage (1.17.11): | ||||||
|     - React-Core |     - React-Core | ||||||
|   - RNCClipboard (1.11.1): |   - RNCClipboard (1.11.1): | ||||||
|     - React-Core |     - React-Core | ||||||
|   - RNGestureHandler (2.9.0): |   - RNGestureHandler (2.9.0): | ||||||
|     - React-Core |     - React-Core | ||||||
|   - RNReanimated (2.14.4): |   - RNReanimated (3.0.0-rc.10): | ||||||
|     - DoubleConversion |     - DoubleConversion | ||||||
|     - FBLazyVector |     - FBLazyVector | ||||||
|     - FBReactNativeSpec |     - FBReactNativeSpec | ||||||
| @@ -443,19 +485,19 @@ PODS: | |||||||
|     - React-RCTText |     - React-RCTText | ||||||
|     - ReactCommon/turbomodule/core |     - ReactCommon/turbomodule/core | ||||||
|     - Yoga |     - Yoga | ||||||
|   - RNScreens (3.19.0): |   - RNScreens (3.20.0): | ||||||
|     - React-Core |     - React-Core | ||||||
|     - React-RCTImage |     - React-RCTImage | ||||||
|   - RNSentry (4.14.0): |   - RNSentry (5.0.0): | ||||||
|     - React-Core |     - React-Core | ||||||
|     - Sentry/HybridSDK (= 7.31.5) |     - Sentry/HybridSDK (= 8.0.0) | ||||||
|   - RNShareMenu (6.0.0): |   - RNShareMenu (6.0.0): | ||||||
|     - React |     - React | ||||||
|   - RNSVG (13.8.0): |   - RNSVG (13.8.0): | ||||||
|     - React-Core |     - React-Core | ||||||
|   - SDWebImage (5.15.0): |   - SDWebImage (5.15.4): | ||||||
|     - SDWebImage/Core (= 5.15.0) |     - SDWebImage/Core (= 5.15.4) | ||||||
|   - SDWebImage/Core (5.15.0) |   - SDWebImage/Core (5.15.4) | ||||||
|   - SDWebImageAVIFCoder (0.9.5): |   - SDWebImageAVIFCoder (0.9.5): | ||||||
|     - libavif (>= 0.9.1) |     - libavif (>= 0.9.1) | ||||||
|     - SDWebImage (~> 5.10) |     - SDWebImage (~> 5.10) | ||||||
| @@ -464,7 +506,9 @@ PODS: | |||||||
|   - SDWebImageWebPCoder (0.9.1): |   - SDWebImageWebPCoder (0.9.1): | ||||||
|     - libwebp (~> 1.0) |     - libwebp (~> 1.0) | ||||||
|     - SDWebImage/Core (~> 5.13) |     - 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) |   - Swime (3.0.6) | ||||||
|   - Yoga (1.14.0) |   - Yoga (1.14.0) | ||||||
|  |  | ||||||
| @@ -485,7 +529,6 @@ DEPENDENCIES: | |||||||
|   - ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`) |   - ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`) | ||||||
|   - ExpoLocalization (from `../node_modules/expo-localization/ios`) |   - ExpoLocalization (from `../node_modules/expo-localization/ios`) | ||||||
|   - ExpoModulesCore (from `../node_modules/expo-modules-core`) |   - ExpoModulesCore (from `../node_modules/expo-modules-core`) | ||||||
|   - ExpoRandom (from `../node_modules/expo-random/ios`) |  | ||||||
|   - ExpoStoreReview (from `../node_modules/expo-store-review/ios`) |   - ExpoStoreReview (from `../node_modules/expo-store-review/ios`) | ||||||
|   - ExpoVideoThumbnails (from `../node_modules/expo-video-thumbnails/ios`) |   - ExpoVideoThumbnails (from `../node_modules/expo-video-thumbnails/ios`) | ||||||
|   - ExpoWebBrowser (from `../node_modules/expo-web-browser/ios`) |   - ExpoWebBrowser (from `../node_modules/expo-web-browser/ios`) | ||||||
| @@ -496,13 +539,12 @@ DEPENDENCIES: | |||||||
|   - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) |   - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) | ||||||
|   - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`) |   - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`) | ||||||
|   - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) |   - 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) |   - libevent (~> 2.1.12) | ||||||
|   - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) |   - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) | ||||||
|   - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) |   - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) | ||||||
|   - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) |   - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) | ||||||
|   - React (from `../node_modules/react-native/`) |   - React (from `../node_modules/react-native/`) | ||||||
|   - React-bridging (from `../node_modules/react-native/ReactCommon`) |  | ||||||
|   - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) |   - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) | ||||||
|   - React-Codegen (from `build/generated/ios`) |   - React-Codegen (from `build/generated/ios`) | ||||||
|   - React-Core (from `../node_modules/react-native/`) |   - 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-image-picker (from `../node_modules/react-native-image-picker`) | ||||||
|   - react-native-ios-context-menu (from `../node_modules/react-native-ios-context-menu`) |   - 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-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-mmkv (from `../node_modules/react-native-mmkv`) | ||||||
|   - "react-native-netinfo (from `../node_modules/@react-native-community/netinfo`)" |   - "react-native-netinfo (from `../node_modules/@react-native-community/netinfo`)" | ||||||
|   - react-native-pager-view (from `../node_modules/react-native-pager-view`) |   - 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-paste-input (from `../node_modules/@mattermost/react-native-paste-input`)" | ||||||
|   - react-native-quick-base64 (from `../node_modules/react-native-quick-base64`) |   - 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-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-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) | ||||||
|   - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) |   - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) | ||||||
|   - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) |   - 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-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) | ||||||
|   - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) |   - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) | ||||||
|   - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) |   - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) | ||||||
| @@ -564,6 +606,7 @@ SPEC REPOS: | |||||||
|     - SDWebImageSVGCoder |     - SDWebImageSVGCoder | ||||||
|     - SDWebImageWebPCoder |     - SDWebImageWebPCoder | ||||||
|     - Sentry |     - Sentry | ||||||
|  |     - SentryPrivate | ||||||
|     - Swime |     - Swime | ||||||
|  |  | ||||||
| EXTERNAL SOURCES: | EXTERNAL SOURCES: | ||||||
| @@ -599,8 +642,6 @@ EXTERNAL SOURCES: | |||||||
|     :path: "../node_modules/expo-localization/ios" |     :path: "../node_modules/expo-localization/ios" | ||||||
|   ExpoModulesCore: |   ExpoModulesCore: | ||||||
|     :path: "../node_modules/expo-modules-core" |     :path: "../node_modules/expo-modules-core" | ||||||
|   ExpoRandom: |  | ||||||
|     :path: "../node_modules/expo-random/ios" |  | ||||||
|   ExpoStoreReview: |   ExpoStoreReview: | ||||||
|     :path: "../node_modules/expo-store-review/ios" |     :path: "../node_modules/expo-store-review/ios" | ||||||
|   ExpoVideoThumbnails: |   ExpoVideoThumbnails: | ||||||
| @@ -622,7 +663,7 @@ EXTERNAL SOURCES: | |||||||
|   glog: |   glog: | ||||||
|     :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" |     :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" | ||||||
|   hermes-engine: |   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: |   RCT-Folly: | ||||||
|     :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" |     :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" | ||||||
|   RCTRequired: |   RCTRequired: | ||||||
| @@ -631,8 +672,6 @@ EXTERNAL SOURCES: | |||||||
|     :path: "../node_modules/react-native/Libraries/TypeSafety" |     :path: "../node_modules/react-native/Libraries/TypeSafety" | ||||||
|   React: |   React: | ||||||
|     :path: "../node_modules/react-native/" |     :path: "../node_modules/react-native/" | ||||||
|   React-bridging: |  | ||||||
|     :path: "../node_modules/react-native/ReactCommon" |  | ||||||
|   React-callinvoker: |   React-callinvoker: | ||||||
|     :path: "../node_modules/react-native/ReactCommon/callinvoker" |     :path: "../node_modules/react-native/ReactCommon/callinvoker" | ||||||
|   React-Codegen: |   React-Codegen: | ||||||
| @@ -663,8 +702,6 @@ EXTERNAL SOURCES: | |||||||
|     :path: "../node_modules/react-native-ios-context-menu" |     :path: "../node_modules/react-native-ios-context-menu" | ||||||
|   react-native-language-detection: |   react-native-language-detection: | ||||||
|     :path: "../node_modules/react-native-language-detection" |     :path: "../node_modules/react-native-language-detection" | ||||||
|   react-native-menu: |  | ||||||
|     :path: "../node_modules/@react-native-menu/menu" |  | ||||||
|   react-native-mmkv: |   react-native-mmkv: | ||||||
|     :path: "../node_modules/react-native-mmkv" |     :path: "../node_modules/react-native-mmkv" | ||||||
|   react-native-netinfo: |   react-native-netinfo: | ||||||
| @@ -678,13 +715,15 @@ EXTERNAL SOURCES: | |||||||
|   react-native-safe-area-context: |   react-native-safe-area-context: | ||||||
|     :path: "../node_modules/react-native-safe-area-context" |     :path: "../node_modules/react-native-safe-area-context" | ||||||
|   react-native-segmented-control: |   react-native-segmented-control: | ||||||
|     :path: "../node_modules/@react-native-community/segmented-control" |     :path: "../node_modules/@react-native-segmented-control/segmented-control" | ||||||
|   React-perflogger: |   React-perflogger: | ||||||
|     :path: "../node_modules/react-native/ReactCommon/reactperflogger" |     :path: "../node_modules/react-native/ReactCommon/reactperflogger" | ||||||
|   React-RCTActionSheet: |   React-RCTActionSheet: | ||||||
|     :path: "../node_modules/react-native/Libraries/ActionSheetIOS" |     :path: "../node_modules/react-native/Libraries/ActionSheetIOS" | ||||||
|   React-RCTAnimation: |   React-RCTAnimation: | ||||||
|     :path: "../node_modules/react-native/Libraries/NativeAnimation" |     :path: "../node_modules/react-native/Libraries/NativeAnimation" | ||||||
|  |   React-RCTAppDelegate: | ||||||
|  |     :path: "../node_modules/react-native/Libraries/AppDelegate" | ||||||
|   React-RCTBlob: |   React-RCTBlob: | ||||||
|     :path: "../node_modules/react-native/Libraries/Blob" |     :path: "../node_modules/react-native/Libraries/Blob" | ||||||
|   React-RCTImage: |   React-RCTImage: | ||||||
| @@ -723,35 +762,34 @@ EXTERNAL SOURCES: | |||||||
|     :path: "../node_modules/react-native/ReactCommon/yoga" |     :path: "../node_modules/react-native/ReactCommon/yoga" | ||||||
|  |  | ||||||
| SPEC CHECKSUMS: | SPEC CHECKSUMS: | ||||||
|   boost: a7c83b31436843459a1961bfd74b96033dc77234 |   boost: 57d2868c099736d80fcd648bf211b4431e51a558 | ||||||
|   DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 |   DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 | ||||||
|   EXApplication: 034b1c40a8e9fe1bff76a1e511ee90dff64ad834 |   EXApplication: d8f53a7eee90a870a75656280e8d4b85726ea903 | ||||||
|   EXAV: 1242c4c206fc522058a2749019064e979a4c0b76 |   EXAV: f1f69397ecdcf44cfacd4ff5d338cd1b96891e87 | ||||||
|   EXConstants: 397186c7e312c33eb1ab85fa1f434dc123778136 |   EXConstants: f348da07e21b23d2b085e270d7b74f282df1a7d9 | ||||||
|   EXErrorRecovery: ae43433feb0608a64dc5b1c8363b3e7769a9ea24 |   EXErrorRecovery: ebb57ae947ff94667f1cbc12f403bb5a043d734d | ||||||
|   EXFileSystem: d9fea7fe7a4390a0ef226cac33958de9178388b9 |   EXFileSystem: 844e86ca9b5375486ecc4ef06d3838d5597d895d | ||||||
|   EXFont: 319606bfe48c33b5b5063fb0994afdc496befe80 |   EXFont: 6ea3800df746be7233208d80fe379b8ed74f4272 | ||||||
|   EXNotifications: babce2a87b7922051354fcfe7a74dd279b7e272a |   EXNotifications: dd628737af60fc8cc62dccebacd326b0fbbc0dcb | ||||||
|   Expo: b9fa98bf260992312ee3c424400819fb9beadafe |   Expo: 1b7b4ec09bd939db6d98985231a0789aa3f6670a | ||||||
|   ExpoCrypto: 98c71864077c4d0fe798a6a5aee1a8c1294cef85 |   ExpoCrypto: 477dfe89c81527b376f2c344ca1d2a01244b243c | ||||||
|   ExpoHaptics: 97c532f311c3e638c14a6134f23564d007b76de4 |   ExpoHaptics: 5156bc5160d8e04c170dd6e645a71154951a2ad9 | ||||||
|   ExpoImage: 748f2b8d3974f1d51c7706fd61057b93241738aa |   ExpoImage: b6a65c4aa891cdf00bfba0da46df14b27ae09cc7 | ||||||
|   ExpoKeepAwake: 69b59d0a8d2b24de9f82759c39b3821fec030318 |   ExpoKeepAwake: 69f5f627670d62318410392d03e0b5db0f85759a | ||||||
|   ExpoLocalization: 28ce7cfa174a752f7ace84189710f1385373655b |   ExpoLocalization: f26cd431ad9ea3533c5b08c4fabd879176a794bb | ||||||
|   ExpoModulesCore: 485dff3a59b036a33b6050c0a5aea3cf1037fdd1 |   ExpoModulesCore: 2f4bd2ae0cd03d30c3c286f5d843e22f72ccdb55 | ||||||
|   ExpoRandom: d8fc05d0d071485b06a97ab2a78cb7f8082052cd |   ExpoStoreReview: d057dcca4b9c95f3c9db11bd2e168dab9cba59f3 | ||||||
|   ExpoStoreReview: e96ba0690ea21dc5d341cfafd0b26bac7bc974f5 |   ExpoVideoThumbnails: 0021303b614a89fcc5df8b59d9d37ddf14a7d4cf | ||||||
|   ExpoVideoThumbnails: 865fa65f2b4f006ff02ef9e3e9c10370d9442d0a |   ExpoWebBrowser: 033d34c478d9986da2f1679729041423837626e0 | ||||||
|   ExpoWebBrowser: 073e50f16669d498fb49063b9b7fe780b24f7fda |   EXScreenCapture: d9284f4a6508c86d0d463805b93672397d18de0f | ||||||
|   EXScreenCapture: bcf94c8199cd1876166e384b2398ff519a8ef7ee |   EXScreenOrientation: 52220f8f2477ed25a37e3b2cdbbaa8635d250256 | ||||||
|   EXScreenOrientation: d43067a93e75234a7ce5154e2759fff2238dbfd5 |   EXSecureStore: e8923258361cc406d0401af380f12bd05b2b720f | ||||||
|   EXSecureStore: ec150f49b22269022c6184f1711abb05fe98d72d |   EXSplashScreen: cd7fb052dff5ba8311d5c2455ecbebffe1b7a8ca | ||||||
|   EXSplashScreen: 3e989924f61a8dd07ee4ea584c6ba14be9b51949 |   FBLazyVector: 60195509584153283780abdac5569feffb8f08cc | ||||||
|   FBLazyVector: a6454570f573a0f6f1d397e5a95c13e8e45d1700 |   FBReactNativeSpec: 9c191fb58d06dc05ab5559a5505fc32139e9e4a2 | ||||||
|   FBReactNativeSpec: 09e8dfba44487e5dc4882a9f5318cde67549549c |  | ||||||
|   fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 |   fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 | ||||||
|   glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b |   glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b | ||||||
|   hermes-engine: 566e656aa95456a3f3f739fd76ea9a9656f2633f |   hermes-engine: 38bfe887e456b33b697187570a08de33969f5db7 | ||||||
|   libaom: 9bb51e0f8f9192245e3ca2a1c9e4375d9cbccc52 |   libaom: 9bb51e0f8f9192245e3ca2a1c9e4375d9cbccc52 | ||||||
|   libavif: e242998ccec1c83bcba0bbdc256f460ad5077348 |   libavif: e242998ccec1c83bcba0bbdc256f460ad5077348 | ||||||
|   libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 |   libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 | ||||||
| @@ -759,62 +797,62 @@ SPEC CHECKSUMS: | |||||||
|   libwebp: f62cb61d0a484ba548448a4bd52aabf150ff6eef |   libwebp: f62cb61d0a484ba548448a4bd52aabf150ff6eef | ||||||
|   MMKV: 7f34558bbb5a33b0eaefae2de4b6a20a2ffdad6f |   MMKV: 7f34558bbb5a33b0eaefae2de4b6a20a2ffdad6f | ||||||
|   MMKVCore: ddf41b9d9262f058419f9ba7598719af56c02cd3 |   MMKVCore: ddf41b9d9262f058419f9ba7598719af56c02cd3 | ||||||
|   RCT-Folly: 0080d0a6ebf2577475bda044aa59e2ca1f909cda |   RCT-Folly: 424b8c9a7a0b9ab2886ffe9c3b041ef628fd4fb1 | ||||||
|   RCTRequired: 837880d26ec119e105317dc28a456f3016bf16d1 |   RCTRequired: bec48f07daf7bcdc2655a0cde84e07d24d2a9e2a | ||||||
|   RCTTypeSafety: 5c854c04c3383cab04f404e25d408ed52124b300 |   RCTTypeSafety: 171394eebacf71e1cfad79dbfae7ee8fc16ca80a | ||||||
|   React: ec6efc54c0fbb7c2e7147624c78065be80753082 |   React: d7433ccb6a8c36e4cbed59a73c0700fc83c3e98a | ||||||
|   React-bridging: 7dd96a58f896a1a7422a491d17ec644e87277953 |   React-callinvoker: 15f165009bd22ae829b2b600e50bcc98076ce4b8 | ||||||
|   React-callinvoker: f348d204f7bbe6020d4fd0dd57303f5b48a28003 |   React-Codegen: b5910000eaf1e0c2f47d29be6f82f5f1264420d7 | ||||||
|   React-Codegen: 73350192a09163a640c23baf795464474be0d793 |   React-Core: b6f2f78d580a90b83fd7b0d1c6911c799f6eac82 | ||||||
|   React-Core: c57b11fd672421049038ef36881372da2605a0cd |   React-CoreModules: e0cbc1a4f4f3f60e23c476fef7ab37be363ea8c1 | ||||||
|   React-CoreModules: 2d91acffc3924adac6b508e3fc44121aa719ec40 |   React-cxxreact: c87f3f124b2117d00d410b35f16c2257e25e50fa | ||||||
|   React-cxxreact: ee2ab13a1db086dc152421aa42dc94cc68f412a1 |   React-hermes: c64ca6bdf16a7069773103c9bedaf30ec90ab38f | ||||||
|   React-hermes: be9d64f5019238ce22ae4e7d242c4f2e96d60595 |   React-jsi: 39729361645568e238081b3b3180fbad803f25a4 | ||||||
|   React-jsi: 04031a830f9714e95d517153817ba7bfc15bfdf8 |   React-jsiexecutor: 515b703d23ffadeac7687bc2d12fb08b90f0aaa1 | ||||||
|   React-jsiexecutor: e95cdd036e7947ddf87f3049319ac3064deb76b5 |   React-jsinspector: 9f7c9137605e72ca0343db4cea88006cb94856dd | ||||||
|   React-jsinspector: 1c34fea1868136ecde647bc11fae9266d4143693 |   React-logger: 957e5dc96d9dbffc6e0f15e0ee4d2b42829ff207 | ||||||
|   React-logger: e9f407f9fdf3f3ce7749ae6f88affe63e8446019 |  | ||||||
|   react-native-blur: 50c9feabacbc5f49b61337ebc32192c6be7ec3c3 |   react-native-blur: 50c9feabacbc5f49b61337ebc32192c6be7ec3c3 | ||||||
|   react-native-cameraroll: 5b25d0be40185d02e522bf2abf8a1ba4e8faa107 |   react-native-cameraroll: cb752fda6d5268f1646b4390bd5be1f27706b9a0 | ||||||
|   react-native-image-picker: 8cb4280e2c1efc3daeb2d9d597f9429a60472e40 |   react-native-image-picker: c33d4e79f0a14a2b66e5065e14946ae63749660b | ||||||
|   react-native-ios-context-menu: e529171ba760a1af7f2ef0729f5a7f4d226171c5 |   react-native-ios-context-menu: e529171ba760a1af7f2ef0729f5a7f4d226171c5 | ||||||
|   react-native-language-detection: f414937fa715108ab50a6269a3de0bcb95e4ceb0 |   react-native-language-detection: f414937fa715108ab50a6269a3de0bcb95e4ceb0 | ||||||
|   react-native-menu: 9d7d6f819cc7fa14a15cf86888c53f3240d86f1b |   react-native-mmkv: a2a40a0458bdbc9d43c4e7752ecfc5e3a87b66dd | ||||||
|   react-native-mmkv: 69b9c003f10afdd01addf7c6ee784ce42ee2eff3 |  | ||||||
|   react-native-netinfo: 2517ad504b3d303e90d7a431b0fcaef76d207983 |   react-native-netinfo: 2517ad504b3d303e90d7a431b0fcaef76d207983 | ||||||
|   react-native-pager-view: 54bed894cecebe28cede54c01038d9d1e122de43 |   react-native-pager-view: b58cb9e9f42f64e50cab3040815772c1d119a2e2 | ||||||
|   react-native-paste-input: fb7156dc75960c9895ddd9b9d68eeb874c9f323a |   react-native-paste-input: 3392800944a47c00dddbff23c31c281482209679 | ||||||
|   react-native-quick-base64: e657e9197e61b60a9dec49807843052b830da254 |   react-native-quick-base64: e657e9197e61b60a9dec49807843052b830da254 | ||||||
|   react-native-safe-area-context: 39c2d8be3328df5d437ac1700f4f3a4f75716acc |   react-native-safe-area-context: 39c2d8be3328df5d437ac1700f4f3a4f75716acc | ||||||
|   react-native-segmented-control: 65df6cd0619b780b3843d574a72d4c7cec396097 |   react-native-segmented-control: 06607462630512ff8eef652ec560e6235a30cc3e | ||||||
|   React-perflogger: 52a94f38c19a518d05726624b49bfc192639374d |   React-perflogger: af8a3d31546077f42d729b949925cc4549f14def | ||||||
|   React-RCTActionSheet: 7b89fe64a852bc3ae39b91dbd142ef09931ef3f7 |   React-RCTActionSheet: 57cc5adfefbaaf0aae2cf7e10bccd746f2903673 | ||||||
|   React-RCTAnimation: ad84bfbf8c5f6f77e65092d0c2b0506b80b5cf99 |   React-RCTAnimation: 11c61e94da700c4dc915cf134513764d87fc5e2b | ||||||
|   React-RCTBlob: e4ee3ab649459329f5aa59d903762bfbd6164220 |   React-RCTAppDelegate: c3980adeaadcfd6cb495532e928b36ac6db3c14a | ||||||
|   React-RCTImage: aeb508f6ac80a94904a646dde61b0f67ea757ea7 |   React-RCTBlob: ccc5049d742b41971141415ca86b83b201495695 | ||||||
|   React-RCTLinking: 1171b3fdc265c479b7039069ce7e8fef68ca70aa |   React-RCTImage: 7a9226b0944f1e76e8e01e35a9245c2477cdbabb | ||||||
|   React-RCTNetwork: 5d87cc4afd1fcef86fb2f804f26366f0314769fe |   React-RCTLinking: bbe8cc582046a9c04f79c235b73c93700263e8b4 | ||||||
|   React-RCTSettings: 644545854880b7d03c49f620664a307fd4613a1d |   React-RCTNetwork: fc2ca322159dc54e06508d4f5c3e934da63dc013 | ||||||
|   React-RCTText: f8e4a283be2290a76b89f4a83ba2277faf90930d |   React-RCTSettings: f1e9db2cdf946426d3f2b210e4ff4ce0f0d842ef | ||||||
|   React-RCTVibration: eb7837d55b87c7a4ead3ab7632ad70dca87c65dc |   React-RCTText: 1c41dd57e5d742b1396b4eeb251851ce7ff0fca1 | ||||||
|   React-runtimeexecutor: 7cec9ed92ebde8309902530bb566819645c84ee5 |   React-RCTVibration: 5199a180d04873366a83855de55ac33ce60fe4d5 | ||||||
|   ReactCommon: 0253d197eaa7f6689dcd3e7d5360449ab93e10df |   React-runtimeexecutor: 7bf0dafc7b727d93c8cb94eb00a9d3753c446c3e | ||||||
|  |   ReactCommon: 6f65ea5b7d84deb9e386f670dd11ce499ded7b40 | ||||||
|   RNCAsyncStorage: 8616bd5a58af409453ea4e1b246521bb76578d60 |   RNCAsyncStorage: 8616bd5a58af409453ea4e1b246521bb76578d60 | ||||||
|   RNCClipboard: 2834e1c4af68697089cdd455ee4a4cdd198fa7dd |   RNCClipboard: 2834e1c4af68697089cdd455ee4a4cdd198fa7dd | ||||||
|   RNGestureHandler: 071d7a9ad81e8b83fe7663b303d132406a7d8f39 |   RNGestureHandler: 071d7a9ad81e8b83fe7663b303d132406a7d8f39 | ||||||
|   RNReanimated: 6668b0587bebd4b15dd849b99e5a9c70fc12ed95 |   RNReanimated: fbc356493970e3acddc15586b1bccb5eab3ff1ec | ||||||
|   RNScreens: ea4cd3a853063cda19a4e3c28d2e52180c80f4eb |   RNScreens: 218801c16a2782546d30bd2026bb625c0302d70f | ||||||
|   RNSentry: 7e90aec2633d2fdad8aeb839c9915e4376fd27d1 |   RNSentry: eff1f32fe84682feb09a36c5e5f513d6ef964b70 | ||||||
|   RNShareMenu: cb9dac548c8bf147d06f0bf07296ad51ea9f5fc3 |   RNShareMenu: cb9dac548c8bf147d06f0bf07296ad51ea9f5fc3 | ||||||
|   RNSVG: c1e76b81c76cdcd34b4e1188852892dc280eb902 |   RNSVG: c1e76b81c76cdcd34b4e1188852892dc280eb902 | ||||||
|   SDWebImage: 9bec4c5cdd9579e1f57104735ee0c37df274d593 |   SDWebImage: 1c39de67663e5eebb2f41324d5d580eeea12dd4c | ||||||
|   SDWebImageAVIFCoder: d759e21cf4efb640cc97250566aa556ad8bb877c |   SDWebImageAVIFCoder: d759e21cf4efb640cc97250566aa556ad8bb877c | ||||||
|   SDWebImageSVGCoder: 6fc109f9c2a82ab44510fff410b88b1a6c271ee8 |   SDWebImageSVGCoder: 6fc109f9c2a82ab44510fff410b88b1a6c271ee8 | ||||||
|   SDWebImageWebPCoder: 18503de6621dd2c420d680e33d46bf8e1d5169b0 |   SDWebImageWebPCoder: 18503de6621dd2c420d680e33d46bf8e1d5169b0 | ||||||
|   Sentry: 4c9babff9034785067c896fd580b1f7de44da020 |   Sentry: 2158a4621096dcd0a3a4f7c80b84b04dde261035 | ||||||
|  |   SentryPrivate: 1e3acf96ee818a8d0d95b8e922d39ab6be338ea0 | ||||||
|   Swime: d7b2c277503b6cea317774aedc2dce05613f8b0b |   Swime: d7b2c277503b6cea317774aedc2dce05613f8b0b | ||||||
|   Yoga: 92d086bb705a41cc588599b51db726ba7b1d341c |   Yoga: 5ed1699acbba8863755998a4245daa200ff3817b | ||||||
|  |  | ||||||
| PODFILE CHECKSUM: 08742f25aa1cdb93d6d5d5efeafd8803ba02b689 | PODFILE CHECKSUM: 61a84f1ad8a466fbbbf09e0f8bb3ed30b2d5e301 | ||||||
|  |  | ||||||
| COCOAPODS: 1.11.3 | COCOAPODS: 1.11.3 | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								ios/nb.lproj/InfoPlist.strings
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								ios/nb.lproj/InfoPlist.strings
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | |||||||
|  | "NSPhotoLibraryAddUsageDescription" = "La tooot lagre bilder på kamerarullen"; | ||||||
|  | "NSPhotoLibraryUsageDescription" = "La tooot lagre bilder på kamerarullen"; | ||||||
| @@ -87,6 +87,7 @@ | |||||||
| 		E6A4895D293C1F740047951A /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/InfoPlist.strings; sourceTree = "<group>"; }; | 		E6A4895D293C1F740047951A /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/InfoPlist.strings; sourceTree = "<group>"; }; | ||||||
| 		E6C8B26628F5F9FC0062CF2E /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/InfoPlist.strings; sourceTree = "<group>"; }; | 		E6C8B26628F5F9FC0062CF2E /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/InfoPlist.strings; sourceTree = "<group>"; }; | ||||||
| 		E6D64C7A294A90840098F3AC /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/InfoPlist.strings; sourceTree = "<group>"; }; | 		E6D64C7A294A90840098F3AC /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/InfoPlist.strings; sourceTree = "<group>"; }; | ||||||
|  | 		E6FD3AA7299EE8A900774C18 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/InfoPlist.strings; sourceTree = "<group>"; }; | ||||||
| 		ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; | 		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; }; | 		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 */ | /* End PBXFileReference section */ | ||||||
| @@ -300,6 +301,7 @@ | |||||||
| 				nl, | 				nl, | ||||||
| 				ca, | 				ca, | ||||||
| 				uk, | 				uk, | ||||||
|  | 				nb, | ||||||
| 			); | 			); | ||||||
| 			mainGroup = 83CBB9F61A601CBA00E9B192; | 			mainGroup = 83CBB9F61A601CBA00E9B192; | ||||||
| 			productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; | 			productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; | ||||||
| @@ -382,7 +384,7 @@ | |||||||
| 			); | 			); | ||||||
| 			inputPaths = ( | 			inputPaths = ( | ||||||
| 				"${PODS_ROOT}/Target Support Files/Pods-tooot/Pods-tooot-frameworks.sh", | 				"${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"; | 			name = "[CP] Embed Pods Frameworks"; | ||||||
| 			outputPaths = ( | 			outputPaths = ( | ||||||
| @@ -533,6 +535,7 @@ | |||||||
| 				E6217B7E293C1EBF00B1755E /* nl */, | 				E6217B7E293C1EBF00B1755E /* nl */, | ||||||
| 				E6A4895D293C1F740047951A /* ca */, | 				E6A4895D293C1F740047951A /* ca */, | ||||||
| 				E6D64C7A294A90840098F3AC /* uk */, | 				E6D64C7A294A90840098F3AC /* uk */, | ||||||
|  | 				E6FD3AA7299EE8A900774C18 /* nb */, | ||||||
| 			); | 			); | ||||||
| 			name = InfoPlist.strings; | 			name = InfoPlist.strings; | ||||||
| 			sourceTree = "<group>"; | 			sourceTree = "<group>"; | ||||||
| @@ -573,8 +576,9 @@ | |||||||
| 				PRODUCT_BUNDLE_IDENTIFIER = com.xmflsct.app.tooot; | 				PRODUCT_BUNDLE_IDENTIFIER = com.xmflsct.app.tooot; | ||||||
| 				PRODUCT_NAME = tooot; | 				PRODUCT_NAME = tooot; | ||||||
| 				PROVISIONING_PROFILE_SPECIFIER = "match AdHoc com.xmflsct.app.tooot"; | 				PROVISIONING_PROFILE_SPECIFIER = "match AdHoc com.xmflsct.app.tooot"; | ||||||
|  | 				SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; | ||||||
| 				SUPPORTS_MACCATALYST = YES; | 				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_OBJC_BRIDGING_HEADER = "tooot-Bridging-Header.h"; | ||||||
| 				SWIFT_OPTIMIZATION_LEVEL = "-Onone"; | 				SWIFT_OPTIMIZATION_LEVEL = "-Onone"; | ||||||
| 				SWIFT_PRECOMPILE_BRIDGING_HEADER = YES; | 				SWIFT_PRECOMPILE_BRIDGING_HEADER = YES; | ||||||
| @@ -612,8 +616,9 @@ | |||||||
| 				PRODUCT_BUNDLE_IDENTIFIER = com.xmflsct.app.tooot; | 				PRODUCT_BUNDLE_IDENTIFIER = com.xmflsct.app.tooot; | ||||||
| 				PRODUCT_NAME = tooot; | 				PRODUCT_NAME = tooot; | ||||||
| 				PROVISIONING_PROFILE_SPECIFIER = "match AppStore com.xmflsct.app.tooot"; | 				PROVISIONING_PROFILE_SPECIFIER = "match AppStore com.xmflsct.app.tooot"; | ||||||
|  | 				SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; | ||||||
| 				SUPPORTS_MACCATALYST = YES; | 				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_OBJC_BRIDGING_HEADER = "tooot-Bridging-Header.h"; | ||||||
| 				SWIFT_PRECOMPILE_BRIDGING_HEADER = YES; | 				SWIFT_PRECOMPILE_BRIDGING_HEADER = YES; | ||||||
| 				SWIFT_VERSION = 5.0; | 				SWIFT_VERSION = 5.0; | ||||||
|   | |||||||
| @@ -1,9 +1,9 @@ | |||||||
| #import <Foundation/Foundation.h> | #import <Foundation/Foundation.h> | ||||||
| #import <React/RCTBridgeDelegate.h> | #import <RCTAppDelegate.h> | ||||||
| #import <UIKit/UIKit.h> | #import <UIKit/UIKit.h> | ||||||
|  |  | ||||||
| #import <Expo/Expo.h> | #import <Expo/Expo.h> | ||||||
|  |  | ||||||
| @interface AppDelegate : EXAppDelegateWrapper <UIApplicationDelegate, RCTBridgeDelegate> | @interface AppDelegate : RCTAppDelegate | ||||||
|  |  | ||||||
| @end | @end | ||||||
|   | |||||||
| @@ -1,88 +1,16 @@ | |||||||
| #import "AppDelegate.h" | #import "AppDelegate.h" | ||||||
|  |  | ||||||
| #import <React/RCTBridge.h> |  | ||||||
| #import <React/RCTBundleURLProvider.h> | #import <React/RCTBundleURLProvider.h> | ||||||
| #import <React/RCTRootView.h> |  | ||||||
|  |  | ||||||
| #import <React/RCTAppSetupUtils.h> |  | ||||||
|  |  | ||||||
| #import <React/RCTLinkingManager.h> | #import <React/RCTLinkingManager.h> | ||||||
| #import <RNShareMenu/ShareMenuManager.h> | #import <RNShareMenu/ShareMenuManager.h> | ||||||
|  |  | ||||||
| #if RCT_NEW_ARCH_ENABLED |  | ||||||
| #import <React/CoreModulesPlugins.h> |  | ||||||
| #import <React/RCTCxxBridgeDelegate.h> |  | ||||||
| #import <React/RCTFabricSurfaceHostingProxyRootView.h> |  | ||||||
| #import <React/RCTSurfacePresenter.h> |  | ||||||
| #import <React/RCTSurfacePresenterBridgeAdapter.h> |  | ||||||
| #import <ReactCommon/RCTTurboModuleManager.h> |  | ||||||
|  |  | ||||||
| #import <react/config/ReactNativeConfig.h> |  | ||||||
|  |  | ||||||
| static NSString *const kRNConcurrentRoot = @"concurrentRoot"; |  | ||||||
|  |  | ||||||
| @interface AppDelegate () <RCTCxxBridgeDelegate, RCTTurboModuleManagerDelegate> { |  | ||||||
|   RCTTurboModuleManager *_turboModuleManager; |  | ||||||
|   RCTSurfacePresenterBridgeAdapter *_bridgeAdapter; |  | ||||||
|   std::shared_ptr<const facebook::react::ReactNativeConfig> _reactNativeConfig; |  | ||||||
|   facebook::react::ContextContainer::Shared _contextContainer; |  | ||||||
| } |  | ||||||
| @end |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| @implementation AppDelegate | @implementation AppDelegate | ||||||
|  |  | ||||||
| - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions | ||||||
| { | { | ||||||
|   RCTAppSetupPrepareApp(application); |   self.moduleName = @"main"; | ||||||
|  |   return [super application:application didFinishLaunchingWithOptions:launchOptions]; | ||||||
|   RCTBridge *bridge = [self.reactDelegate createBridgeWithDelegate:self launchOptions:launchOptions]; |  | ||||||
|  |  | ||||||
| #if RCT_NEW_ARCH_ENABLED |  | ||||||
|   _contextContainer = std::make_shared<facebook::react::ContextContainer const>(); |  | ||||||
|   _reactNativeConfig = std::make_shared<facebook::react::EmptyReactNativeConfig const>(); |  | ||||||
|   _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; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge | - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge | ||||||
| @@ -94,40 +22,16 @@ static NSString *const kRNConcurrentRoot = @"concurrentRoot"; | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| #if RCT_NEW_ARCH_ENABLED | /// This method controls whether the `concurrentRoot`feature of React18 is turned on or off. | ||||||
|  | /// | ||||||
| #pragma mark - RCTCxxBridgeDelegate | /// @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). | ||||||
| - (std::unique_ptr<facebook::react::JSExecutorFactory>)jsExecutorFactoryForBridge:(RCTBridge *)bridge | /// @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 true; | ||||||
|   return RCTAppSetupDefaultJsExecutorFactory(bridge, _turboModuleManager); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| #pragma mark RCTTurboModuleManagerDelegate |  | ||||||
|  |  | ||||||
| - (Class)getModuleClassFromName:(const char *)name |  | ||||||
| { |  | ||||||
|   return RCTCoreModulesClassProvider(name); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| - (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const std::string &)name jsInvoker:(std::shared_ptr<facebook::react::CallInvoker>)jsInvoker |  | ||||||
| { |  | ||||||
|   return nullptr; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| - (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const std::string &)name initParams: (const facebook::react::ObjCTurboModule::InitParams &)params |  | ||||||
| { |  | ||||||
|   return nullptr; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| - (id<RCTTurboModule>)getModuleInstanceFromClass:(Class)moduleClass |  | ||||||
| { |  | ||||||
|   return RCTAppSetupDefaultModuleFromClass(moduleClass); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| // Linking API | // Linking API | ||||||
| - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { | - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { | ||||||
|   NSString *urlString = url.absoluteString; |   NSString *urlString = url.absoluteString; | ||||||
|   | |||||||
| @@ -2,6 +2,8 @@ | |||||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||||||
| <plist version="1.0"> | <plist version="1.0"> | ||||||
| <dict> | <dict> | ||||||
|  | 	<key>CADisableMinimumFrameDurationOnPhone</key> | ||||||
|  | 	<true/> | ||||||
| 	<key>CFBundleAllowMixedLocalizations</key> | 	<key>CFBundleAllowMixedLocalizations</key> | ||||||
| 	<true/> | 	<true/> | ||||||
| 	<key>CFBundleDevelopmentRegion</key> | 	<key>CFBundleDevelopmentRegion</key> | ||||||
| @@ -86,7 +88,5 @@ | |||||||
| 	<string>Automatic</string> | 	<string>Automatic</string> | ||||||
| 	<key>UIViewControllerBasedStatusBarAppearance</key> | 	<key>UIViewControllerBasedStatusBarAppearance</key> | ||||||
| 	<false/> | 	<false/> | ||||||
|     <key>CADisableMinimumFrameDurationOnPhone</key> |  | ||||||
|     <true/> |  | ||||||
| </dict> | </dict> | ||||||
| </plist> | </plist> | ||||||
|   | |||||||
							
								
								
									
										108
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										108
									
								
								package.json
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|   "name": "tooot", |   "name": "tooot", | ||||||
|   "version": "4.8.8", |   "version": "4.9.0", | ||||||
|   "description": "tooot for Mastodon", |   "description": "tooot for Mastodon", | ||||||
|   "author": "xmflsct <me@xmflsct.com>", |   "author": "xmflsct <me@xmflsct.com>", | ||||||
|   "license": "GPL-3.0-or-later", |   "license": "GPL-3.0-or-later", | ||||||
| @@ -11,6 +11,7 @@ | |||||||
|   "scripts": { |   "scripts": { | ||||||
|     "start": "react-native start", |     "start": "react-native start", | ||||||
|     "android": "react-native run-android", |     "android": "react-native run-android", | ||||||
|  |     "phone": "react-native run-ios --device", | ||||||
|     "iphone": "react-native run-ios --simulator 'iPhone 14 Pro'", |     "iphone": "react-native run-ios --simulator 'iPhone 14 Pro'", | ||||||
|     "ipad": "react-native run-ios --simulator 'iPad Pro (11-inch) (4th generation)'", |     "ipad": "react-native run-ios --simulator 'iPad Pro (11-inch) (4th generation)'", | ||||||
|     "app:build": "bundle exec fastlane", |     "app:build": "bundle exec fastlane", | ||||||
| @@ -18,91 +19,88 @@ | |||||||
|   }, |   }, | ||||||
|   "dependencies": { |   "dependencies": { | ||||||
|     "@expo/react-native-action-sheet": "^4.0.1", |     "@expo/react-native-action-sheet": "^4.0.1", | ||||||
|     "@formatjs/intl-datetimeformat": "^6.4.3", |     "@formatjs/intl-datetimeformat": "^6.5.1", | ||||||
|     "@formatjs/intl-getcanonicallocales": "^2.0.5", |     "@formatjs/intl-getcanonicallocales": "^2.1.0", | ||||||
|     "@formatjs/intl-locale": "^3.0.11", |     "@formatjs/intl-locale": "^3.1.1", | ||||||
|     "@formatjs/intl-numberformat": "^8.3.3", |     "@formatjs/intl-numberformat": "^8.3.5", | ||||||
|     "@formatjs/intl-pluralrules": "^5.1.8", |     "@formatjs/intl-pluralrules": "^5.1.10", | ||||||
|     "@formatjs/intl-relativetimeformat": "^11.1.8", |     "@formatjs/intl-relativetimeformat": "^11.1.10", | ||||||
|     "@mattermost/react-native-paste-input": "^0.6.1", |     "@mattermost/react-native-paste-input": "^0.6.2", | ||||||
|     "@neverdull-agency/expo-unlimited-secure-store": "^1.0.10", |     "@neverdull-agency/expo-unlimited-secure-store": "^1.0.10", | ||||||
|     "@react-native-async-storage/async-storage": "~1.17.11", |     "@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-clipboard/clipboard": "^1.11.1", | ||||||
|     "@react-native-community/blur": "^4.3.0", |     "@react-native-community/blur": "^4.3.0", | ||||||
|     "@react-native-community/netinfo": "9.3.7", |     "@react-native-community/netinfo": "9.3.7", | ||||||
|     "@react-native-community/segmented-control": "^2.2.2", |     "@react-native-firebase/app": "^17.3.1", | ||||||
|     "@react-native-firebase/app": "^16.7.0", |  | ||||||
|     "@react-native-menu/menu": "^0.7.3", |     "@react-native-menu/menu": "^0.7.3", | ||||||
|     "@react-navigation/bottom-tabs": "^6.5.4", |     "@react-native-segmented-control/segmented-control": "^2.4.0", | ||||||
|     "@react-navigation/native": "^6.1.3", |     "@react-navigation/bottom-tabs": "^6.5.6", | ||||||
|     "@react-navigation/native-stack": "^6.9.9", |     "@react-navigation/native": "^6.1.5", | ||||||
|     "@react-navigation/stack": "^6.3.12", |     "@react-navigation/native-stack": "^6.9.11", | ||||||
|     "@sentry/react-native": "4.14.0", |     "@react-navigation/stack": "^6.3.15", | ||||||
|  |     "@sentry/react-native": "5.0.0", | ||||||
|     "@sharcoux/slider": "^6.1.1", |     "@sharcoux/slider": "^6.1.1", | ||||||
|     "@tanstack/react-query": "^4.24.4", |     "@tanstack/react-query": "^4.24.10", | ||||||
|     "axios": "^1.2.4", |     "axios": "^1.3.4", | ||||||
|     "diff": "^5.1.0", |     "diff": "^5.1.0", | ||||||
|     "expo": "^47.0.13", |     "expo": "48.0.0-beta.2", | ||||||
|     "expo-auth-session": "^3.8.0", |     "expo-auth-session": "^4.0.3", | ||||||
|     "expo-av": "^13.1.0", |     "expo-av": "^13.2.1", | ||||||
|     "expo-constants": "^14.1.0", |     "expo-constants": "^14.2.1", | ||||||
|     "expo-crypto": "^12.1.0", |     "expo-crypto": "^12.2.1", | ||||||
|     "expo-file-system": "^15.1.1", |     "expo-file-system": "^15.2.2", | ||||||
|     "expo-haptics": "^12.1.0", |     "expo-haptics": "^12.2.1", | ||||||
|     "expo-image": "^1.0.0-beta.6", |     "expo-image": "^1.0.0", | ||||||
|     "expo-linking": "^3.3.0", |     "expo-linking": "^4.0.1", | ||||||
|     "expo-localization": "^14.0.0", |     "expo-localization": "^14.1.1", | ||||||
|     "expo-notifications": "^0.17.0", |     "expo-notifications": "^0.18.1", | ||||||
|     "expo-random": "^13.0.0", |     "expo-screen-capture": "^5.1.1", | ||||||
|     "expo-screen-capture": "^5.0.0", |     "expo-screen-orientation": "^5.1.1", | ||||||
|     "expo-screen-orientation": "^5.0.1", |     "expo-secure-store": "^12.1.1", | ||||||
|     "expo-secure-store": "^12.0.0", |     "expo-splash-screen": "^0.18.1", | ||||||
|     "expo-splash-screen": "^0.17.5", |     "expo-store-review": "^6.2.1", | ||||||
|     "expo-store-review": "^6.1.0", |     "expo-video-thumbnails": "^7.2.1", | ||||||
|     "expo-video-thumbnails": "^7.1.0", |     "expo-web-browser": "~12.1.1", | ||||||
|     "expo-web-browser": "~12.0.0", |  | ||||||
|     "htmlparser2": "^8.0.1", |     "htmlparser2": "^8.0.1", | ||||||
|     "i18next": "^22.4.9", |     "i18next": "^22.4.10", | ||||||
|     "linkify-it": "^4.0.1", |     "linkify-it": "^4.0.1", | ||||||
|     "lodash": "^4.17.21", |     "lodash": "^4.17.21", | ||||||
|     "react": "^18.2.0", |     "react": "^18.2.0", | ||||||
|     "react-dom": "^18.2.0", |     "react-dom": "^18.2.0", | ||||||
|     "react-i18next": "^12.1.4", |     "react-i18next": "^12.2.0", | ||||||
|     "react-intl": "^6.2.7", |     "react-intl": "^6.2.10", | ||||||
|     "react-native": "^0.70.7", |     "react-native": "^0.71.3", | ||||||
|     "react-native-flash-message": "^0.4.0", |     "react-native-flash-message": "^0.4.0", | ||||||
|     "react-native-gesture-handler": "~2.9.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-ios-context-menu": "^1.15.3", | ||||||
|     "react-native-language-detection": "^0.2.2", |     "react-native-language-detection": "^0.2.2", | ||||||
|     "react-native-mmkv": "~2.5.1", |     "react-native-mmkv": "~2.7.0", | ||||||
|     "react-native-pager-view": "^6.1.2", |     "react-native-pager-view": "^6.1.4", | ||||||
|     "react-native-quick-base64": "^2.0.5", |     "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-reanimated-zoom": "^0.3.3", | ||||||
|     "react-native-safe-area-context": "^4.5.0", |     "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-share-menu": "^6.0.0", | ||||||
|     "react-native-svg": "^13.8.0", |     "react-native-svg": "^13.8.0", | ||||||
|     "react-native-swipe-list-view": "^3.2.9", |     "react-native-swipe-list-view": "^3.2.9", | ||||||
|     "react-native-tab-view": "^3.3.4", |     "react-native-tab-view": "^3.5.0", | ||||||
|     "react-redux": "^8.0.5", |  | ||||||
|     "rn-placeholder": "^3.0.3", |     "rn-placeholder": "^3.0.3", | ||||||
|     "url-parse": "^1.5.10", |     "url-parse": "^1.5.10", | ||||||
|     "zeego": "^1.0.2" |     "zeego": "^1.0.2" | ||||||
|   }, |   }, | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
|     "@babel/core": "^7.20.12", |     "@babel/core": "^7.21.0", | ||||||
|     "@babel/plugin-proposal-optional-chaining": "^7.20.7", |     "@babel/plugin-proposal-optional-chaining": "^7.21.0", | ||||||
|     "@babel/preset-typescript": "^7.18.6", |     "@babel/preset-typescript": "^7.21.0", | ||||||
|     "@expo/config": "^7.0.3", |     "@expo/config": "^8.0.2", | ||||||
|     "@types/diff": "^5.0.2", |     "@types/diff": "^5.0.2", | ||||||
|     "@types/linkify-it": "^3.0.2", |     "@types/linkify-it": "^3.0.2", | ||||||
|     "@types/lodash": "^4.14.191", |     "@types/lodash": "^4.14.191", | ||||||
|     "@types/react": "^18.0.27", |     "@types/react": "^18.0.28", | ||||||
|     "@types/react-dom": "^18.0.10", |     "@types/react-dom": "^18.0.11", | ||||||
|     "@types/react-native": "^0.70.10", |  | ||||||
|     "@types/react-native-share-menu": "^5.0.2", |     "@types/react-native-share-menu": "^5.0.2", | ||||||
|     "@types/url-parse": "^1.4.8", |     "@types/url-parse": "^1.4.8", | ||||||
|     "babel-plugin-module-resolver": "^5.0.0", |     "babel-plugin-module-resolver": "^5.0.0", | ||||||
|   | |||||||
| @@ -4,6 +4,16 @@ module.exports = { | |||||||
|       platforms: { |       platforms: { | ||||||
|         ios: null |         ios: null | ||||||
|       } |       } | ||||||
|  |     }, | ||||||
|  |     '@react-native-menu/menu': { | ||||||
|  |       platforms: { | ||||||
|  |         ios: null | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     'react-native-ios-context-menu': { | ||||||
|  |       platforms: { | ||||||
|  |         android: null | ||||||
|  |       } | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								src/@types/app.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								src/@types/app.d.ts
									
									
									
									
										vendored
									
									
								
							| @@ -3,7 +3,7 @@ declare namespace App { | |||||||
|     | 'Following' |     | 'Following' | ||||||
|     | 'Local' |     | 'Local' | ||||||
|     | 'LocalPublic' |     | 'LocalPublic' | ||||||
|     | 'Trending' |     | 'Explore' | ||||||
|     | 'Notifications' |     | 'Notifications' | ||||||
|     | 'Hashtag' |     | 'Hashtag' | ||||||
|     | 'List' |     | 'List' | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								src/@types/mastodon.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								src/@types/mastodon.d.ts
									
									
									
									
										vendored
									
									
								
							| @@ -33,7 +33,7 @@ declare namespace Mastodon { | |||||||
|     role?: Role |     role?: Role | ||||||
|  |  | ||||||
|     // Internal |     // Internal | ||||||
|     _remote?: boolean |     _remote?: string // domain | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   type Announcement = { |   type Announcement = { | ||||||
| @@ -400,7 +400,7 @@ declare namespace Mastodon { | |||||||
|     url: string |     url: string | ||||||
|  |  | ||||||
|     // Internal |     // Internal | ||||||
|     _remote?: boolean |     _remote?: string // domain | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   type Notification = |   type Notification = | ||||||
|   | |||||||
							
								
								
									
										13
									
								
								src/App.tsx
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								src/App.tsx
									
									
									
									
									
								
							| @@ -1,5 +1,4 @@ | |||||||
| import { ActionSheetProvider } from '@expo/react-native-action-sheet' | import { ActionSheetProvider } from '@expo/react-native-action-sheet' | ||||||
| import * as Sentry from '@sentry/react-native' |  | ||||||
| import { QueryClientProvider } from '@tanstack/react-query' | import { QueryClientProvider } from '@tanstack/react-query' | ||||||
| import AccessibilityManager from '@utils/accessibility/AccessibilityManager' | import AccessibilityManager from '@utils/accessibility/AccessibilityManager' | ||||||
| import { connectVerify } from '@utils/api/helpers/connect' | 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 Localization from 'expo-localization' | ||||||
| import * as SplashScreen from 'expo-splash-screen' | import * as SplashScreen from 'expo-splash-screen' | ||||||
| import React, { useCallback, useEffect, useState } from 'react' | 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 { GestureHandlerRootView } from 'react-native-gesture-handler' | ||||||
| import { SafeAreaProvider } from 'react-native-safe-area-context' | import { SafeAreaProvider } from 'react-native-safe-area-context' | ||||||
| import { enableFreeze } from 'react-native-screens' | import { enableFreeze } from 'react-native-screens' | ||||||
| import i18n from './i18n' | import i18n from './i18n' | ||||||
| import Screens from './screens' | import Screens from './screens' | ||||||
|  |  | ||||||
| Platform.select({ | log('log', 'App', 'delay splash') | ||||||
|   android: LogBox.ignoreLogs(['Setting a timer for a long period of time']) | SplashScreen.preventAutoHideAsync() | ||||||
| }) |  | ||||||
|  |  | ||||||
| dev() | dev() | ||||||
| sentry() | sentry() | ||||||
| @@ -36,9 +34,6 @@ audio() | |||||||
| push() | push() | ||||||
| enableFreeze(true) | enableFreeze(true) | ||||||
|  |  | ||||||
| log('log', 'App', 'delay splash') |  | ||||||
| SplashScreen.preventAutoHideAsync() |  | ||||||
|  |  | ||||||
| const App: React.FC = () => { | const App: React.FC = () => { | ||||||
|   log('log', 'App', 'rendering App') |   log('log', 'App', 'rendering App') | ||||||
|   const [appIsReady, setAppIsReady] = useState(false) |   const [appIsReady, setAppIsReady] = useState(false) | ||||||
| @@ -121,4 +116,4 @@ const App: React.FC = () => { | |||||||
|   ) |   ) | ||||||
| } | } | ||||||
|  |  | ||||||
| export default Sentry.wrap(App) | export default App | ||||||
|   | |||||||
| @@ -42,7 +42,7 @@ const ComponentAccount: React.FC<PropsWithChildren & Props> = ({ account, props, | |||||||
|               style={{ |               style={{ | ||||||
|                 width: StyleConstants.Avatar.S, |                 width: StyleConstants.Avatar.S, | ||||||
|                 height: StyleConstants.Avatar.S, |                 height: StyleConstants.Avatar.S, | ||||||
|                 borderRadius: 8, |                 borderRadius: StyleConstants.BorderRadius, | ||||||
|                 marginRight: StyleConstants.Spacing.S |                 marginRight: StyleConstants.Spacing.S | ||||||
|               }} |               }} | ||||||
|               dim |               dim | ||||||
|   | |||||||
| @@ -45,7 +45,7 @@ const AccountButton: React.FC<Props> = ({ account, additionalActions }) => { | |||||||
|           width: StyleConstants.Font.Size.L, |           width: StyleConstants.Font.Size.L, | ||||||
|           height: StyleConstants.Font.Size.L |           height: StyleConstants.Font.Size.L | ||||||
|         }} |         }} | ||||||
|         style={{ borderRadius: StyleConstants.Font.Size.L / 2, overflow: 'hidden' }} |         style={{ borderRadius: 99, overflow: 'hidden' }} | ||||||
|       /> |       /> | ||||||
|       <CustomText |       <CustomText | ||||||
|         fontStyle='M' |         fontStyle='M' | ||||||
|   | |||||||
| @@ -116,7 +116,7 @@ const Button: React.FC<Props> = ({ | |||||||
|       }} |       }} | ||||||
|       style={[ |       style={[ | ||||||
|         { |         { | ||||||
|           borderRadius: 100, |           borderRadius: 99, | ||||||
|           justifyContent: 'center', |           justifyContent: 'center', | ||||||
|           alignItems: 'center', |           alignItems: 'center', | ||||||
|           borderWidth: overlay ? 0 : selected ? 1.5 : 1, |           borderWidth: overlay ? 0 : selected ? 1.5 : 1, | ||||||
|   | |||||||
| @@ -35,7 +35,7 @@ const EmojisButton: React.FC = () => { | |||||||
|             borderWidth: 2, |             borderWidth: 2, | ||||||
|             borderColor: colors.primaryDefault, |             borderColor: colors.primaryDefault, | ||||||
|             padding: StyleConstants.Spacing.Global.PagePadding / 2, |             padding: StyleConstants.Spacing.Global.PagePadding / 2, | ||||||
|             borderRadius: 100 |             borderRadius: 99 | ||||||
|           }} |           }} | ||||||
|         > |         > | ||||||
|           <Icon |           <Icon | ||||||
|   | |||||||
| @@ -249,7 +249,6 @@ const EmojisList = () => { | |||||||
|           </CustomText> |           </CustomText> | ||||||
|         )} |         )} | ||||||
|         renderItem={listItem} |         renderItem={listItem} | ||||||
|         windowSize={4} |  | ||||||
|         contentContainerStyle={{ |         contentContainerStyle={{ | ||||||
|           paddingHorizontal: StyleConstants.Spacing.Global.PagePadding, |           paddingHorizontal: StyleConstants.Spacing.Global.PagePadding, | ||||||
|           minHeight: 32 * 2 + StyleConstants.Spacing.M * 3 |           minHeight: 32 * 2 + StyleConstants.Spacing.M * 3 | ||||||
|   | |||||||
| @@ -21,14 +21,9 @@ export interface Props { | |||||||
|   onPress?: () => void |   onPress?: () => void | ||||||
|   style?: StyleProp<ViewStyle> |   style?: StyleProp<ViewStyle> | ||||||
|   imageStyle?: ImageStyle |   imageStyle?: ImageStyle | ||||||
|   // For image viewer when there is no image size available |  | ||||||
|   setImageDimensions?: React.Dispatch< |  | ||||||
|     React.SetStateAction<{ |  | ||||||
|       width: number |  | ||||||
|       height: number |  | ||||||
|     }> |  | ||||||
|   > |  | ||||||
|   dim?: boolean |   dim?: boolean | ||||||
|  |   withoutTransition?: boolean | ||||||
|   enableLiveTextInteraction?: boolean |   enableLiveTextInteraction?: boolean | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -41,8 +36,8 @@ const GracefullyImage = ({ | |||||||
|   onPress, |   onPress, | ||||||
|   style, |   style, | ||||||
|   imageStyle, |   imageStyle, | ||||||
|   setImageDimensions, |  | ||||||
|   dim, |   dim, | ||||||
|  |   withoutTransition = false, | ||||||
|   enableLiveTextInteraction = false |   enableLiveTextInteraction = false | ||||||
| }: Props) => { | }: Props) => { | ||||||
|   const { reduceMotionEnabled } = useAccessibility() |   const { reduceMotionEnabled } = useAccessibility() | ||||||
| @@ -64,15 +59,10 @@ const GracefullyImage = ({ | |||||||
|     > |     > | ||||||
|       <Image |       <Image | ||||||
|         placeholderContentFit='cover' |         placeholderContentFit='cover' | ||||||
|         placeholder={sources.blurhash || connectMedia(sources.preview)} |         placeholder={hidden ? sources.blurhash : sources.blurhash || connectMedia(sources.preview)} | ||||||
|         source={hidden ? undefined : connectMedia(source)} |         source={hidden ? sources.blurhash : connectMedia(source)} | ||||||
|         transition={{ duration: 80 }} |         {...(!withoutTransition && !reduceMotionEnabled && { transition: { duration: 120 } })} | ||||||
|         style={{ flex: 1, ...imageStyle }} |         style={{ flex: 1, ...imageStyle }} | ||||||
|         onLoad={event => { |  | ||||||
|           if (setImageDimensions && event.source) { |  | ||||||
|             setImageDimensions(event.source) |  | ||||||
|           } |  | ||||||
|         }} |  | ||||||
|         onError={() => { |         onError={() => { | ||||||
|           if ( |           if ( | ||||||
|             sources.default?.uri && |             sources.default?.uri && | ||||||
|   | |||||||
| @@ -51,7 +51,7 @@ const HeaderLeft: React.FC<Props> = ({ | |||||||
|         minWidth: 44, |         minWidth: 44, | ||||||
|         marginLeft: native ? -StyleConstants.Spacing.S : StyleConstants.Spacing.S, |         marginLeft: native ? -StyleConstants.Spacing.S : StyleConstants.Spacing.S, | ||||||
|         ...(type === undefined && { |         ...(type === undefined && { | ||||||
|           borderRadius: 100 |           borderRadius: 99 | ||||||
|         }), |         }), | ||||||
|         ...(type === 'text' && { |         ...(type === 'text' && { | ||||||
|           paddingHorizontal: StyleConstants.Spacing.S |           paddingHorizontal: StyleConstants.Spacing.S | ||||||
|   | |||||||
| @@ -98,9 +98,7 @@ const HeaderRight: React.FC<Props> = ({ | |||||||
|         minHeight: 44, |         minHeight: 44, | ||||||
|         minWidth: 44, |         minWidth: 44, | ||||||
|         marginRight: native ? -StyleConstants.Spacing.S : StyleConstants.Spacing.S, |         marginRight: native ? -StyleConstants.Spacing.S : StyleConstants.Spacing.S, | ||||||
|         ...(type === undefined && { |         ...(type === undefined && { borderRadius: 99 }), | ||||||
|           borderRadius: 100 |  | ||||||
|         }), |  | ||||||
|         ...(type === 'text' && { |         ...(type === 'text' && { | ||||||
|           paddingHorizontal: StyleConstants.Spacing.S |           paddingHorizontal: StyleConstants.Spacing.S | ||||||
|         }) |         }) | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| import { StyleConstants } from '@utils/styles/constants' | import { StyleConstants } from '@utils/styles/constants' | ||||||
| import { useTheme } from '@utils/styles/ThemeManager' | 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 { Platform, TextInput, TextInputProps, View } from 'react-native' | ||||||
| import Animated, { useAnimatedStyle, withTiming } from 'react-native-reanimated' | import Animated, { useAnimatedStyle, withTiming } from 'react-native-reanimated' | ||||||
| import { EmojisState } from './Emojis/Context' | import { EmojisState } from './Emojis/Context' | ||||||
| @@ -35,7 +35,7 @@ const ComponentInput = forwardRef( | |||||||
|       isFocused, |       isFocused, | ||||||
|       ...props |       ...props | ||||||
|     }: Props, |     }: Props, | ||||||
|     ref: RefObject<TextInput> |     ref: ForwardedRef<TextInput> | ||||||
|   ) => { |   ) => { | ||||||
|     const { colors, mode } = useTheme() |     const { colors, mode } = useTheme() | ||||||
|  |  | ||||||
|   | |||||||
| @@ -173,6 +173,10 @@ const ComponentInstance: React.FC<Props> = ({ | |||||||
|             lists: { shown: false }, |             lists: { shown: false }, | ||||||
|             announcements: { shown: false, unread: 0 } |             announcements: { shown: false, unread: 0 } | ||||||
|           }, |           }, | ||||||
|  |           page_account_timeline: { | ||||||
|  |             excludeBoosts: true, | ||||||
|  |             excludeReplies: true | ||||||
|  |           }, | ||||||
|           drafts: [], |           drafts: [], | ||||||
|           emojis_frequent: [] |           emojis_frequent: [] | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ export interface Props { | |||||||
|   switchDisabled?: boolean |   switchDisabled?: boolean | ||||||
|   switchOnValueChange?: () => void |   switchOnValueChange?: () => void | ||||||
|  |  | ||||||
|   iconBack?: 'chevron-right' | 'external-link' | 'check' |   iconBack?: 'chevron-right' | 'chevron-down' | 'external-link' | 'check' | ||||||
|   iconBackColor?: ColorDefinitions |   iconBackColor?: ColorDefinitions | ||||||
|  |  | ||||||
|   loading?: boolean |   loading?: boolean | ||||||
| @@ -66,14 +66,7 @@ const MenuRow: React.FC<Props> = ({ | |||||||
|         }} |         }} | ||||||
|       > |       > | ||||||
|         <View style={{ flex: 1 }}> |         <View style={{ flex: 1 }}> | ||||||
|           <View |           <View style={{ flex: 1, flexDirection: 'row', justifyContent: 'space-between' }}> | ||||||
|             style={{ |  | ||||||
|               flex: 1, |  | ||||||
|               flexDirection: 'row', |  | ||||||
|               justifyContent: 'space-between', |  | ||||||
|               marginTop: StyleConstants.Spacing.S |  | ||||||
|             }} |  | ||||||
|           > |  | ||||||
|             <View |             <View | ||||||
|               style={{ |               style={{ | ||||||
|                 flexShrink: 3, |                 flexShrink: 3, | ||||||
| @@ -96,7 +89,7 @@ const MenuRow: React.FC<Props> = ({ | |||||||
|                     width: 8, |                     width: 8, | ||||||
|                     height: 8, |                     height: 8, | ||||||
|                     backgroundColor: colors.red, |                     backgroundColor: colors.red, | ||||||
|                     borderRadius: 8, |                     borderRadius: StyleConstants.BorderRadius, | ||||||
|                     marginRight: StyleConstants.Spacing.S |                     marginRight: StyleConstants.Spacing.S | ||||||
|                   }} |                   }} | ||||||
|                 /> |                 /> | ||||||
|   | |||||||
| @@ -1,11 +1,11 @@ | |||||||
| import { useHeaderHeight } from '@react-navigation/elements' | import { useHeaderHeight } from '@react-navigation/elements' | ||||||
| import { StyleConstants } from '@utils/styles/constants' | 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 { KeyboardAvoidingView, Platform, ScrollView } from 'react-native' | ||||||
| import { SafeAreaView } from 'react-native-safe-area-context' | import { SafeAreaView } from 'react-native-safe-area-context' | ||||||
|  |  | ||||||
| export const ModalScrollView = forwardRef( | export const ModalScrollView = forwardRef( | ||||||
|   ({ children }: PropsWithChildren, ref: RefObject<ScrollView>) => { |   ({ children }: PropsWithChildren, ref: ForwardedRef<ScrollView>) => { | ||||||
|     const headerHeight = useHeaderHeight() |     const headerHeight = useHeaderHeight() | ||||||
|  |  | ||||||
|     return ( |     return ( | ||||||
|   | |||||||
| @@ -29,20 +29,20 @@ const RelationshipOutgoing: React.FC<Props> = ({ id }: Props) => { | |||||||
|   const queryKeyRelationship: QueryKeyRelationship = ['Relationship', { id }] |   const queryKeyRelationship: QueryKeyRelationship = ['Relationship', { id }] | ||||||
|   const queryClient = useQueryClient() |   const queryClient = useQueryClient() | ||||||
|   const mutation = useRelationshipMutation({ |   const mutation = useRelationshipMutation({ | ||||||
|     onSuccess: (res, { payload: { action } }) => { |     onSuccess: (res, vars) => { | ||||||
|       haptics('Success') |       haptics('Success') | ||||||
|       queryClient.setQueryData<Mastodon.Relationship[]>(queryKeyRelationship, [res]) |       queryClient.setQueryData<Mastodon.Relationship[]>(queryKeyRelationship, [res]) | ||||||
|       if (action === 'block') { |       if (vars.type === 'outgoing' && vars.payload.action === 'block') { | ||||||
|         const queryKey = ['Timeline', { page: 'Following' }] |         const queryKey = ['Timeline', { page: 'Following' }] | ||||||
|         queryClient.invalidateQueries({ queryKey, exact: false }) |         queryClient.invalidateQueries({ queryKey, exact: false }) | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     onError: (err: any, { payload: { action } }) => { |     onError: (err: any, vars) => { | ||||||
|       displayMessage({ |       displayMessage({ | ||||||
|         theme, |         theme, | ||||||
|         type: 'error', |         type: 'error', | ||||||
|         message: t('common:message.error.message', { |         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 && |         ...(err.status && | ||||||
|           typeof err.status === 'number' && |           typeof err.status === 'number' && | ||||||
|   | |||||||
| @@ -31,9 +31,11 @@ export const SwipeToActions = <T extends unknown>({ | |||||||
|                 haptics(action.haptic || 'Light') |                 haptics(action.haptic || 'Light') | ||||||
|                 action.onPress({ item }) |                 action.onPress({ item }) | ||||||
|               }} |               }} | ||||||
|  |               style={{ backgroundColor: 'rgba(0, 255, 0, 0.2)' }} | ||||||
|             > |             > | ||||||
|               <View |               <View | ||||||
|                 style={{ |                 style={{ | ||||||
|  |                   flex: 1, | ||||||
|                   paddingHorizontal: StyleConstants.Spacing.L, |                   paddingHorizontal: StyleConstants.Spacing.L, | ||||||
|                   flexBasis: perActionWidth, |                   flexBasis: perActionWidth, | ||||||
|                   backgroundColor: action.color, |                   backgroundColor: action.color, | ||||||
|   | |||||||
| @@ -67,7 +67,7 @@ const TimelineConversation: React.FC<Props> = ({ conversation, queryKey, highlig | |||||||
|         <View style={{ flex: 1, width: '100%', flexDirection: 'row' }}> |         <View style={{ flex: 1, width: '100%', flexDirection: 'row' }}> | ||||||
|           <View |           <View | ||||||
|             style={{ |             style={{ | ||||||
|               borderRadius: 4, |               borderRadius: StyleConstants.BorderRadius, | ||||||
|               overflow: 'hidden', |               overflow: 'hidden', | ||||||
|               marginRight: StyleConstants.Spacing.S, |               marginRight: StyleConstants.Spacing.S, | ||||||
|               width: StyleConstants.Avatar.M, |               width: StyleConstants.Avatar.M, | ||||||
| @@ -116,4 +116,4 @@ const TimelineConversation: React.FC<Props> = ({ conversation, queryKey, highlig | |||||||
|   ) |   ) | ||||||
| } | } | ||||||
|  |  | ||||||
| export default React.memo(TimelineConversation, () => true) | export default React.memo(TimelineConversation) | ||||||
|   | |||||||
| @@ -251,4 +251,4 @@ const TimelineDefault: React.FC<Props> = ({ | |||||||
|   ) |   ) | ||||||
| } | } | ||||||
|  |  | ||||||
| export default React.memo(TimelineDefault, () => true) | export default React.memo(TimelineDefault) | ||||||
|   | |||||||
| @@ -209,4 +209,4 @@ const TimelineNotifications: React.FC<Props> = ({ notification, queryKey }) => { | |||||||
|   ) |   ) | ||||||
| } | } | ||||||
|  |  | ||||||
| export default React.memo(TimelineNotifications, () => true) | export default React.memo(TimelineNotifications) | ||||||
|   | |||||||
| @@ -156,10 +156,22 @@ const TimelineRefresh: React.FC<Props> = ({ | |||||||
|         >(queryKey, old => { |         >(queryKey, old => { | ||||||
|           if (!old) return 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) |           prevCache.current = res.body.slice(0, -PREV_PER_BATCH) | ||||||
|           return { |           return { | ||||||
|             ...old, |             ...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<Props> = ({ | |||||||
|             flRef.current?.scrollToOffset({ offset: scrollY.value - 15, animated: true }) |             flRef.current?.scrollToOffset({ offset: scrollY.value - 15, animated: true }) | ||||||
|           } |           } | ||||||
|  |  | ||||||
|           await new Promise(promise => setTimeout(promise, 64)) |           await new Promise<void>(promise => setTimeout(promise, 8)) | ||||||
|           queryClient.setQueryData< |           queryClient.setQueryData< | ||||||
|             InfiniteData< |             InfiniteData< | ||||||
|               PagedResponse<(Mastodon.Status | Mastodon.Notification | Mastodon.Conversation)[]> |               PagedResponse<(Mastodon.Status | Mastodon.Notification | Mastodon.Conversation)[]> | ||||||
| @@ -244,7 +256,7 @@ const TimelineRefresh: React.FC<Props> = ({ | |||||||
|           return |           return | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     [] |     [queryKey[1]] | ||||||
|   ) |   ) | ||||||
|  |  | ||||||
|   if (!isFetched) return null |   if (!isFetched) return null | ||||||
|   | |||||||
| @@ -103,7 +103,7 @@ const TimelineActions: React.FC = () => { | |||||||
|           cancelButtonIndex: 2, |           cancelButtonIndex: 2, | ||||||
|           ...androidActionSheetStyles(colors) |           ...androidActionSheetStyles(colors) | ||||||
|         }, |         }, | ||||||
|         (selectedIndex: number) => { |         selectedIndex => { | ||||||
|           switch (selectedIndex) { |           switch (selectedIndex) { | ||||||
|             case 0: |             case 0: | ||||||
|               mutation.mutate({ |               mutation.mutate({ | ||||||
|   | |||||||
| @@ -5,8 +5,9 @@ import { connectMedia } from '@utils/api/helpers/connect' | |||||||
| import { StyleConstants } from '@utils/styles/constants' | import { StyleConstants } from '@utils/styles/constants' | ||||||
| import { useTheme } from '@utils/styles/ThemeManager' | import { useTheme } from '@utils/styles/ThemeManager' | ||||||
| import { Audio } from 'expo-av' | import { Audio } from 'expo-av' | ||||||
| import React, { useCallback, useEffect, useRef, useState } from 'react' | import React, { useCallback, useContext, useEffect, useRef, useState } from 'react' | ||||||
| import { AppState, AppStateStatus, StyleSheet, View } from 'react-native' | import { AppState, AppStateStatus, View } from 'react-native' | ||||||
|  | import StatusContext from '../Context' | ||||||
| import AttachmentAltText from './AltText' | import AttachmentAltText from './AltText' | ||||||
| import { aspectRatio } from './dimensions' | import { aspectRatio } from './dimensions' | ||||||
|  |  | ||||||
| @@ -18,6 +19,7 @@ export interface Props { | |||||||
| } | } | ||||||
|  |  | ||||||
| const AttachmentAudio: React.FC<Props> = ({ total, index, sensitiveShown, audio }) => { | const AttachmentAudio: React.FC<Props> = ({ total, index, sensitiveShown, audio }) => { | ||||||
|  |   const { inThread } = useContext(StatusContext) | ||||||
|   const { colors } = useTheme() |   const { colors } = useTheme() | ||||||
|  |  | ||||||
|   const [audioPlayer, setAudioPlayer] = useState<Audio.Sound>() |   const [audioPlayer, setAudioPlayer] = useState<Audio.Sound>() | ||||||
| @@ -60,15 +62,25 @@ const AttachmentAudio: React.FC<Props> = ({ total, index, sensitiveShown, audio | |||||||
|   return ( |   return ( | ||||||
|     <View |     <View | ||||||
|       accessibilityLabel={audio.description} |       accessibilityLabel={audio.description} | ||||||
|       style={[ |       style={{ | ||||||
|         styles.base, |         flex: 1, | ||||||
|         { |         flexDirection: 'row', | ||||||
|           backgroundColor: colors.disabled, |         backgroundColor: colors.shimmerDefault, | ||||||
|           aspectRatio: aspectRatio({ total, index, ...audio.meta?.original }) |         aspectRatio: aspectRatio({ total, index, ...audio.meta?.original }), | ||||||
|         } |         borderRadius: StyleConstants.BorderRadius / 2, | ||||||
|       ]} |         overflow: 'hidden' | ||||||
|  |       }} | ||||||
|  |     > | ||||||
|  |       <View | ||||||
|  |         style={{ | ||||||
|  |           position: 'absolute', | ||||||
|  |           width: '100%', | ||||||
|  |           height: '100%', | ||||||
|  |           flex: 1, | ||||||
|  |           justifyContent: 'center', | ||||||
|  |           alignItems: 'center' | ||||||
|  |         }} | ||||||
|       > |       > | ||||||
|       <View style={styles.overlay}> |  | ||||||
|         {sensitiveShown ? ( |         {sensitiveShown ? ( | ||||||
|           audio.blurhash ? ( |           audio.blurhash ? ( | ||||||
|             <GracefullyImage |             <GracefullyImage | ||||||
| @@ -78,6 +90,7 @@ const AttachmentAudio: React.FC<Props> = ({ total, index, sensitiveShown, audio | |||||||
|                 height: '100%' |                 height: '100%' | ||||||
|               }} |               }} | ||||||
|               dim |               dim | ||||||
|  |               withoutTransition={inThread} | ||||||
|             /> |             /> | ||||||
|           ) : null |           ) : null | ||||||
|         ) : ( |         ) : ( | ||||||
| @@ -88,8 +101,9 @@ const AttachmentAudio: React.FC<Props> = ({ total, index, sensitiveShown, audio | |||||||
|                   default: { uri: audio.preview_url }, |                   default: { uri: audio.preview_url }, | ||||||
|                   remote: { uri: audio.preview_remote_url } |                   remote: { uri: audio.preview_remote_url } | ||||||
|                 }} |                 }} | ||||||
|                 style={styles.background} |                 style={{ position: 'absolute', width: '100%', height: '100%' }} | ||||||
|                 dim |                 dim | ||||||
|  |                 withoutTransition={inThread} | ||||||
|               /> |               /> | ||||||
|             ) : null} |             ) : null} | ||||||
|             <Button |             <Button | ||||||
| @@ -109,9 +123,8 @@ const AttachmentAudio: React.FC<Props> = ({ total, index, sensitiveShown, audio | |||||||
|             alignSelf: 'flex-end', |             alignSelf: 'flex-end', | ||||||
|             width: '100%', |             width: '100%', | ||||||
|             height: StyleConstants.Spacing.M + StyleConstants.Spacing.S * 2, |             height: StyleConstants.Spacing.M + StyleConstants.Spacing.S * 2, | ||||||
|             backgroundColor: colors.backgroundOverlayInvert, |  | ||||||
|             paddingHorizontal: StyleConstants.Spacing.Global.PagePadding, |             paddingHorizontal: StyleConstants.Spacing.Global.PagePadding, | ||||||
|             borderRadius: 100, |             borderRadius: 99, | ||||||
|             opacity: sensitiveShown ? 0.35 : undefined |             opacity: sensitiveShown ? 0.35 : undefined | ||||||
|           }} |           }} | ||||||
|         > |         > | ||||||
| @@ -121,14 +134,14 @@ const AttachmentAudio: React.FC<Props> = ({ total, index, sensitiveShown, audio | |||||||
|             value={audioPosition} |             value={audioPosition} | ||||||
|             minimumTrackTintColor={colors.secondary} |             minimumTrackTintColor={colors.secondary} | ||||||
|             maximumTrackTintColor={colors.disabled} |             maximumTrackTintColor={colors.disabled} | ||||||
|             // onSlidingStart={() => { |             onSlidingStart={() => { | ||||||
|             //   audioPlayer?.pauseAsync() |               audioPlayer?.pauseAsync() | ||||||
|             //   setAudioPlaying(false) |               setAudioPlaying(false) | ||||||
|             // }} |             }} | ||||||
|             // onSlidingComplete={value => { |             onSlidingComplete={value => { | ||||||
|             //   setAudioPosition(value) |               setAudioPosition(value) | ||||||
|             // }} |             }} | ||||||
|             enabled={false} // Bug in above sliding actions |             enabled={true} | ||||||
|             thumbSize={StyleConstants.Spacing.M} |             thumbSize={StyleConstants.Spacing.M} | ||||||
|             thumbTintColor={colors.primaryOverlay} |             thumbTintColor={colors.primaryOverlay} | ||||||
|           /> |           /> | ||||||
| @@ -139,22 +152,4 @@ const AttachmentAudio: React.FC<Props> = ({ total, index, sensitiveShown, audio | |||||||
|   ) |   ) | ||||||
| } | } | ||||||
|  |  | ||||||
| const styles = StyleSheet.create({ |  | ||||||
|   base: { |  | ||||||
|     flex: 1, |  | ||||||
|     flexBasis: '50%', |  | ||||||
|     padding: StyleConstants.Spacing.XS / 2, |  | ||||||
|     flexDirection: 'row' |  | ||||||
|   }, |  | ||||||
|   background: { position: 'absolute', width: '100%', height: '100%' }, |  | ||||||
|   overlay: { |  | ||||||
|     position: 'absolute', |  | ||||||
|     width: '100%', |  | ||||||
|     height: '100%', |  | ||||||
|     flex: 1, |  | ||||||
|     justifyContent: 'center', |  | ||||||
|     alignItems: 'center' |  | ||||||
|   } |  | ||||||
| }) |  | ||||||
|  |  | ||||||
| export default AttachmentAudio | export default AttachmentAudio | ||||||
|   | |||||||
| @@ -1,8 +1,9 @@ | |||||||
| import GracefullyImage from '@components/GracefullyImage' | import GracefullyImage from '@components/GracefullyImage' | ||||||
| import { StyleConstants } from '@utils/styles/constants' | import { StyleConstants } from '@utils/styles/constants' | ||||||
| import { useTheme } from '@utils/styles/ThemeManager' | import { useTheme } from '@utils/styles/ThemeManager' | ||||||
| import React from 'react' | import React, { useContext } from 'react' | ||||||
| import { View } from 'react-native' | import { View } from 'react-native' | ||||||
|  | import StatusContext from '../Context' | ||||||
| import AttachmentAltText from './AltText' | import AttachmentAltText from './AltText' | ||||||
| import { aspectRatio } from './dimensions' | import { aspectRatio } from './dimensions' | ||||||
|  |  | ||||||
| @@ -21,17 +22,20 @@ const AttachmentImage = ({ | |||||||
|   image, |   image, | ||||||
|   navigateToImagesViewer |   navigateToImagesViewer | ||||||
| }: Props) => { | }: Props) => { | ||||||
|  |   const { inThread } = useContext(StatusContext) | ||||||
|   const { colors } = useTheme() |   const { colors } = useTheme() | ||||||
|  |  | ||||||
|   return ( |   return ( | ||||||
|     <View |     <View | ||||||
|       style={{ |       style={{ | ||||||
|         flex: 1, |         flex: 1, | ||||||
|         flexBasis: '50%', |         backgroundColor: colors.shimmerDefault, | ||||||
|         padding: StyleConstants.Spacing.XS / 2 |         alignContent: 'center', | ||||||
|  |         justifyContent: 'center', | ||||||
|  |         borderRadius: StyleConstants.BorderRadius / 2, | ||||||
|  |         overflow: 'hidden' | ||||||
|       }} |       }} | ||||||
|     > |     > | ||||||
|       <View style={{ flex: 1, backgroundColor: colors.shimmerDefault }}> |  | ||||||
|       <GracefullyImage |       <GracefullyImage | ||||||
|         accessibilityLabel={image.description} |         accessibilityLabel={image.description} | ||||||
|         hidden={sensitiveShown} |         hidden={sensitiveShown} | ||||||
| @@ -43,8 +47,8 @@ const AttachmentImage = ({ | |||||||
|         onPress={() => navigateToImagesViewer(image.id)} |         onPress={() => navigateToImagesViewer(image.id)} | ||||||
|         style={{ aspectRatio: aspectRatio({ total, index, ...image.meta?.original }) }} |         style={{ aspectRatio: aspectRatio({ total, index, ...image.meta?.original }) }} | ||||||
|         dim |         dim | ||||||
|  |         withoutTransition={inThread} | ||||||
|       /> |       /> | ||||||
|       </View> |  | ||||||
|       <AttachmentAltText sensitiveShown={sensitiveShown} text={image.description} /> |       <AttachmentAltText sensitiveShown={sensitiveShown} text={image.description} /> | ||||||
|     </View> |     </View> | ||||||
|   ) |   ) | ||||||
|   | |||||||
| @@ -4,9 +4,10 @@ import openLink from '@components/openLink' | |||||||
| import CustomText from '@components/Text' | import CustomText from '@components/Text' | ||||||
| import { StyleConstants } from '@utils/styles/constants' | import { StyleConstants } from '@utils/styles/constants' | ||||||
| import { useTheme } from '@utils/styles/ThemeManager' | import { useTheme } from '@utils/styles/ThemeManager' | ||||||
| import React from 'react' | import React, { useContext } from 'react' | ||||||
| import { useTranslation } from 'react-i18next' | import { useTranslation } from 'react-i18next' | ||||||
| import { View } from 'react-native' | import { View } from 'react-native' | ||||||
|  | import StatusContext from '../Context' | ||||||
| import AttachmentAltText from './AltText' | import AttachmentAltText from './AltText' | ||||||
| import { aspectRatio } from './dimensions' | import { aspectRatio } from './dimensions' | ||||||
|  |  | ||||||
| @@ -18,6 +19,7 @@ export interface Props { | |||||||
| } | } | ||||||
|  |  | ||||||
| const AttachmentUnsupported: React.FC<Props> = ({ total, index, sensitiveShown, attachment }) => { | const AttachmentUnsupported: React.FC<Props> = ({ total, index, sensitiveShown, attachment }) => { | ||||||
|  |   const { inThread } = useContext(StatusContext) | ||||||
|   const { t } = useTranslation('componentTimeline') |   const { t } = useTranslation('componentTimeline') | ||||||
|   const { colors } = useTheme() |   const { colors } = useTheme() | ||||||
|  |  | ||||||
| @@ -25,21 +27,19 @@ const AttachmentUnsupported: React.FC<Props> = ({ total, index, sensitiveShown, | |||||||
|     <View |     <View | ||||||
|       style={{ |       style={{ | ||||||
|         flex: 1, |         flex: 1, | ||||||
|         flexBasis: '50%', |         aspectRatio: aspectRatio({ total, index, ...attachment.meta?.original }), | ||||||
|         padding: StyleConstants.Spacing.XS / 2, |  | ||||||
|         justifyContent: 'center', |         justifyContent: 'center', | ||||||
|         alignItems: 'center', |         alignItems: 'center', | ||||||
|         aspectRatio: aspectRatio({ total, index, ...attachment.meta?.original }) |         borderRadius: StyleConstants.BorderRadius / 2, | ||||||
|  |         overflow: 'hidden' | ||||||
|       }} |       }} | ||||||
|     > |     > | ||||||
|       {attachment.blurhash ? ( |       {attachment.blurhash ? ( | ||||||
|         <GracefullyImage |         <GracefullyImage | ||||||
|           sources={{ blurhash: attachment.blurhash }} |           sources={{ blurhash: attachment.blurhash }} | ||||||
|           style={{ |           style={{ position: 'absolute', width: '100%', height: '100%' }} | ||||||
|             position: 'absolute', |           dim | ||||||
|             width: '100%', |           withoutTransition={inThread} | ||||||
|             height: '100%' |  | ||||||
|           }} |  | ||||||
|         /> |         /> | ||||||
|       ) : null} |       ) : null} | ||||||
|       {!sensitiveShown ? ( |       {!sensitiveShown ? ( | ||||||
|   | |||||||
| @@ -2,13 +2,15 @@ import Button from '@components/Button' | |||||||
| import GracefullyImage from '@components/GracefullyImage' | import GracefullyImage from '@components/GracefullyImage' | ||||||
| import { useAccessibility } from '@utils/accessibility/AccessibilityManager' | import { useAccessibility } from '@utils/accessibility/AccessibilityManager' | ||||||
| import { connectMedia } from '@utils/api/helpers/connect' | import { connectMedia } from '@utils/api/helpers/connect' | ||||||
| import { useAccountStorage, useGlobalStorage } from '@utils/storage/actions' | import { useGlobalStorage } from '@utils/storage/actions' | ||||||
| import { StyleConstants } from '@utils/styles/constants' | import { StyleConstants } from '@utils/styles/constants' | ||||||
|  | import { useTheme } from '@utils/styles/ThemeManager' | ||||||
| import { ResizeMode, Video, VideoFullscreenUpdate } from 'expo-av' | import { ResizeMode, Video, VideoFullscreenUpdate } from 'expo-av' | ||||||
| import { Platform } from 'expo-modules-core' | import { Platform } from 'expo-modules-core' | ||||||
| import * as ScreenOrientation from 'expo-screen-orientation' | import * as ScreenOrientation from 'expo-screen-orientation' | ||||||
| import React, { useRef, useState } from 'react' | import React, { useContext, useRef, useState } from 'react' | ||||||
| import { Pressable, View } from 'react-native' | import { Pressable, View } from 'react-native' | ||||||
|  | import StatusContext from '../Context' | ||||||
| import AttachmentAltText from './AltText' | import AttachmentAltText from './AltText' | ||||||
| import { aspectRatio } from './dimensions' | import { aspectRatio } from './dimensions' | ||||||
|  |  | ||||||
| @@ -27,13 +29,10 @@ const AttachmentVideo: React.FC<Props> = ({ | |||||||
|   video, |   video, | ||||||
|   gifv = false |   gifv = false | ||||||
| }) => { | }) => { | ||||||
|  |   const { inThread } = useContext(StatusContext) | ||||||
|  |   const { colors } = useTheme() | ||||||
|   const { reduceMotionEnabled } = useAccessibility() |   const { reduceMotionEnabled } = useAccessibility() | ||||||
|   const [autoplayGifv] = useGlobalStorage.boolean('app.auto_play_gifv') |   const [shouldAutoplayGifv] = useGlobalStorage.boolean('app.auto_play_gifv') | ||||||
|   const [preferences] = useAccountStorage.object('preferences') |  | ||||||
|   const shouldAutoplayGifv = |  | ||||||
|     preferences?.['reading:autoplay:gifs'] !== undefined |  | ||||||
|       ? preferences['reading:autoplay:gifs'] |  | ||||||
|       : autoplayGifv |  | ||||||
|  |  | ||||||
|   const videoPlayer = useRef<Video>(null) |   const videoPlayer = useRef<Video>(null) | ||||||
|   const [videoLoading, setVideoLoading] = useState(false) |   const [videoLoading, setVideoLoading] = useState(false) | ||||||
| @@ -42,7 +41,11 @@ const AttachmentVideo: React.FC<Props> = ({ | |||||||
|   const playOnPress = async () => { |   const playOnPress = async () => { | ||||||
|     setVideoLoading(true) |     setVideoLoading(true) | ||||||
|     if (!videoLoaded) { |     if (!videoLoaded) { | ||||||
|       await videoPlayer.current?.loadAsync(connectMedia({ uri: video.url }) as { uri: string }) |       await videoPlayer.current?.loadAsync( | ||||||
|  |         connectMedia({ | ||||||
|  |           uri: video.url.includes('/media_proxy/') ? video.remote_url : video.url | ||||||
|  |         }) as any | ||||||
|  |       ) | ||||||
|     } |     } | ||||||
|     setVideoLoading(false) |     setVideoLoading(false) | ||||||
|  |  | ||||||
| @@ -56,9 +59,12 @@ const AttachmentVideo: React.FC<Props> = ({ | |||||||
|     <View |     <View | ||||||
|       style={{ |       style={{ | ||||||
|         flex: 1, |         flex: 1, | ||||||
|         flexBasis: '50%', |         backgroundColor: colors.shimmerDefault, | ||||||
|         padding: StyleConstants.Spacing.XS / 2, |         aspectRatio: aspectRatio({ total, index, ...video.meta?.original }), | ||||||
|         aspectRatio: aspectRatio({ total, index, ...video.meta?.original }) |         alignContent: 'center', | ||||||
|  |         justifyContent: 'center', | ||||||
|  |         borderRadius: StyleConstants.BorderRadius / 2, | ||||||
|  |         overflow: 'hidden' | ||||||
|       }} |       }} | ||||||
|     > |     > | ||||||
|       <Video |       <Video | ||||||
| @@ -123,6 +129,8 @@ const AttachmentVideo: React.FC<Props> = ({ | |||||||
|             <GracefullyImage |             <GracefullyImage | ||||||
|               sources={{ blurhash: video.blurhash }} |               sources={{ blurhash: video.blurhash }} | ||||||
|               style={{ width: '100%', height: '100%' }} |               style={{ width: '100%', height: '100%' }} | ||||||
|  |               dim | ||||||
|  |               withoutTransition={inThread} | ||||||
|             /> |             /> | ||||||
|           ) : null |           ) : null | ||||||
|         ) : !gifv || (gifv && (reduceMotionEnabled || !shouldAutoplayGifv)) ? ( |         ) : !gifv || (gifv && (reduceMotionEnabled || !shouldAutoplayGifv)) ? ( | ||||||
|   | |||||||
| @@ -10,11 +10,13 @@ export const aspectRatio = ({ | |||||||
|   height?: number |   height?: number | ||||||
| }): number => { | }): number => { | ||||||
|   const defaultCrop = |   const defaultCrop = | ||||||
|     (height || 1) / (width || 1) > 3 / 2 |     height && width | ||||||
|  |       ? height / width > 3 / 2 | ||||||
|         ? 2 / 3 |         ? 2 / 3 | ||||||
|       : (width || 1) / (height || 1) > 4 |         : width / height > 4 | ||||||
|         ? 4 |         ? 4 | ||||||
|       : (width || 1) / (height || 1) |         : width / height | ||||||
|  |       : 16 / 9 | ||||||
|  |  | ||||||
|   const isEven = total % 2 == 0 |   const isEven = total % 2 == 0 | ||||||
|   if (total > 5) { |   if (total > 5) { | ||||||
|   | |||||||
| @@ -9,19 +9,16 @@ import { StackNavigationProp } from '@react-navigation/stack' | |||||||
| import { RootStackParamList } from '@utils/navigation/navigators' | import { RootStackParamList } from '@utils/navigation/navigators' | ||||||
| import { usePreferencesQuery } from '@utils/queryHooks/preferences' | import { usePreferencesQuery } from '@utils/queryHooks/preferences' | ||||||
| import { StyleConstants } from '@utils/styles/constants' | import { StyleConstants } from '@utils/styles/constants' | ||||||
| import React, { useContext, useState } from 'react' | import { isLargeDevice } from '@utils/styles/scaling' | ||||||
|  | import { chunk } from 'lodash' | ||||||
|  | import React, { Fragment, useContext, useState } from 'react' | ||||||
| import { useTranslation } from 'react-i18next' | import { useTranslation } from 'react-i18next' | ||||||
| import { Pressable, View } from 'react-native' | import { Pressable, View } from 'react-native' | ||||||
| import StatusContext from './Context' | import StatusContext from '../Context' | ||||||
| 
 | 
 | ||||||
| const TimelineAttachment = () => { | const TimelineAttachment = () => { | ||||||
|   const { status, disableDetails } = useContext(StatusContext) |   const { status, spoilerHidden, disableDetails } = useContext(StatusContext) | ||||||
|   if ( |   if (!status || !Array.isArray(status.media_attachments) || !status.media_attachments.length) | ||||||
|     !status || |  | ||||||
|     disableDetails || |  | ||||||
|     !Array.isArray(status.media_attachments) || |  | ||||||
|     !status.media_attachments.length |  | ||||||
|   ) |  | ||||||
|     return null |     return null | ||||||
| 
 | 
 | ||||||
|   const { t } = useTranslation('componentTimeline') |   const { t } = useTranslation('componentTimeline') | ||||||
| @@ -70,14 +67,9 @@ const TimelineAttachment = () => { | |||||||
|           } |           } | ||||||
|         default: |         default: | ||||||
|           if ( |           if ( | ||||||
|             attachment.preview_url?.endsWith('.jpg') || |             // https://docs.expo.dev/versions/unversioned/sdk/image/#supported-image-formats
 | ||||||
|             attachment.preview_url?.endsWith('.jpeg') || |             attachment.preview_url?.match(/.(?:a?png|jpe?g|webp|avif|heic|gif|svg|ico|icns)$/i) || | ||||||
|             attachment.preview_url?.endsWith('.png') || |             attachment.remote_url?.match(/.(?:a?png|jpe?g|webp|avif|heic|gif|svg|ico|icns)$/i) | ||||||
|             attachment.preview_url?.endsWith('.gif') || |  | ||||||
|             attachment.remote_url?.endsWith('.jpg') || |  | ||||||
|             attachment.remote_url?.endsWith('.jpeg') || |  | ||||||
|             attachment.remote_url?.endsWith('.png') || |  | ||||||
|             attachment.remote_url?.endsWith('.gif') |  | ||||||
|           ) { |           ) { | ||||||
|             return { |             return { | ||||||
|               id: attachment.id, |               id: attachment.id, | ||||||
| @@ -96,24 +88,11 @@ const TimelineAttachment = () => { | |||||||
|     navigation.navigate('Screen-ImagesViewer', { imageUrls, id }) |     navigation.navigate('Screen-ImagesViewer', { imageUrls, id }) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   return ( |   const mapAttachmentType = (attachment: Mastodon.Attachment, index: number) => { | ||||||
|     <View> |  | ||||||
|       <View |  | ||||||
|         style={{ |  | ||||||
|           marginTop: StyleConstants.Spacing.S, |  | ||||||
|           flex: 1, |  | ||||||
|           flexDirection: 'row', |  | ||||||
|           flexWrap: 'wrap', |  | ||||||
|           justifyContent: 'center', |  | ||||||
|           alignContent: 'stretch' |  | ||||||
|         }} |  | ||||||
|       > |  | ||||||
|         {status.media_attachments.map((attachment, index) => { |  | ||||||
|     switch (attachment.type) { |     switch (attachment.type) { | ||||||
|       case 'image': |       case 'image': | ||||||
|         return ( |         return ( | ||||||
|           <AttachmentImage |           <AttachmentImage | ||||||
|                   key={index} |  | ||||||
|             total={status.media_attachments.length} |             total={status.media_attachments.length} | ||||||
|             index={index} |             index={index} | ||||||
|             sensitiveShown={sensitiveShown} |             sensitiveShown={sensitiveShown} | ||||||
| @@ -124,7 +103,6 @@ const TimelineAttachment = () => { | |||||||
|       case 'video': |       case 'video': | ||||||
|         return ( |         return ( | ||||||
|           <AttachmentVideo |           <AttachmentVideo | ||||||
|                   key={index} |  | ||||||
|             total={status.media_attachments.length} |             total={status.media_attachments.length} | ||||||
|             index={index} |             index={index} | ||||||
|             sensitiveShown={sensitiveShown} |             sensitiveShown={sensitiveShown} | ||||||
| @@ -134,7 +112,6 @@ const TimelineAttachment = () => { | |||||||
|       case 'gifv': |       case 'gifv': | ||||||
|         return ( |         return ( | ||||||
|           <AttachmentVideo |           <AttachmentVideo | ||||||
|                   key={index} |  | ||||||
|             total={status.media_attachments.length} |             total={status.media_attachments.length} | ||||||
|             index={index} |             index={index} | ||||||
|             sensitiveShown={sensitiveShown} |             sensitiveShown={sensitiveShown} | ||||||
| @@ -145,7 +122,6 @@ const TimelineAttachment = () => { | |||||||
|       case 'audio': |       case 'audio': | ||||||
|         return ( |         return ( | ||||||
|           <AttachmentAudio |           <AttachmentAudio | ||||||
|                   key={index} |  | ||||||
|             total={status.media_attachments.length} |             total={status.media_attachments.length} | ||||||
|             index={index} |             index={index} | ||||||
|             sensitiveShown={sensitiveShown} |             sensitiveShown={sensitiveShown} | ||||||
| @@ -154,30 +130,31 @@ const TimelineAttachment = () => { | |||||||
|         ) |         ) | ||||||
|       default: |       default: | ||||||
|         if ( |         if ( | ||||||
|                 attachment.preview_url?.endsWith('.jpg') || |           // https://docs.expo.dev/versions/unversioned/sdk/image/#supported-image-formats
 | ||||||
|                 attachment.preview_url?.endsWith('.jpeg') || |           attachment.preview_url?.match(/.(?:a?png|jpe?g|webp|avif|heic|gif|svg|ico|icns)$/i) || | ||||||
|                 attachment.preview_url?.endsWith('.png') || |           attachment.remote_url?.match(/.(?:a?png|jpe?g|webp|avif|heic|gif|svg|ico|icns)$/i) | ||||||
|                 attachment.preview_url?.endsWith('.gif') || |  | ||||||
|                 attachment.remote_url?.endsWith('.jpg') || |  | ||||||
|                 attachment.remote_url?.endsWith('.jpeg') || |  | ||||||
|                 attachment.remote_url?.endsWith('.png') || |  | ||||||
|                 attachment.remote_url?.endsWith('.gif') |  | ||||||
|         ) { |         ) { | ||||||
|           return ( |           return ( | ||||||
|             <AttachmentImage |             <AttachmentImage | ||||||
|                     key={index} |  | ||||||
|               total={status.media_attachments.length} |               total={status.media_attachments.length} | ||||||
|               index={index} |               index={index} | ||||||
|               sensitiveShown={sensitiveShown} |               sensitiveShown={sensitiveShown} | ||||||
|                     // @ts-ignore
 |               image={attachment as unknown as Mastodon.AttachmentImage} | ||||||
|                     image={attachment} |  | ||||||
|               navigateToImagesViewer={navigateToImagesViewer} |               navigateToImagesViewer={navigateToImagesViewer} | ||||||
|             /> |             /> | ||||||
|           ) |           ) | ||||||
|  |         } else if (attachment.remote_url?.match(/.(?:mp4|mkv)$/i)) { | ||||||
|  |           return ( | ||||||
|  |             <AttachmentVideo | ||||||
|  |               total={status.media_attachments.length} | ||||||
|  |               index={index} | ||||||
|  |               sensitiveShown={sensitiveShown} | ||||||
|  |               video={attachment as unknown as Mastodon.AttachmentVideo} | ||||||
|  |             /> | ||||||
|  |           ) | ||||||
|         } else { |         } else { | ||||||
|           return ( |           return ( | ||||||
|             <AttachmentUnsupported |             <AttachmentUnsupported | ||||||
|                     key={index} |  | ||||||
|               total={status.media_attachments.length} |               total={status.media_attachments.length} | ||||||
|               index={index} |               index={index} | ||||||
|               sensitiveShown={sensitiveShown} |               sensitiveShown={sensitiveShown} | ||||||
| @@ -186,7 +163,30 @@ const TimelineAttachment = () => { | |||||||
|           ) |           ) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|         })} |   } | ||||||
|  | 
 | ||||||
|  |   if (spoilerHidden || disableDetails) return null | ||||||
|  | 
 | ||||||
|  |   return ( | ||||||
|  |     <View style={{ marginTop: StyleConstants.Spacing.M, ...(isLargeDevice && { maxWidth: 375 }) }}> | ||||||
|  |       <View style={{ gap: StyleConstants.Spacing.XS }}> | ||||||
|  |         {chunk(status.media_attachments, 2).map((chunk, chunkIndex) => ( | ||||||
|  |           <View | ||||||
|  |             key={chunkIndex} | ||||||
|  |             style={{ | ||||||
|  |               flex: 1, | ||||||
|  |               flexDirection: 'row', | ||||||
|  |               flexWrap: 'wrap', | ||||||
|  |               justifyContent: 'center', | ||||||
|  |               alignContent: 'stretch', | ||||||
|  |               gap: StyleConstants.Spacing.XS | ||||||
|  |             }} | ||||||
|  |           > | ||||||
|  |             {chunk.map((a, aIndex) => ( | ||||||
|  |               <Fragment key={aIndex}>{mapAttachmentType(a, chunkIndex * 2 + aIndex)}</Fragment> | ||||||
|  |             ))} | ||||||
|  |           </View> | ||||||
|  |         ))} | ||||||
|       </View> |       </View> | ||||||
| 
 | 
 | ||||||
|       {defaultSensitive() && |       {defaultSensitive() && | ||||||
| @@ -223,7 +223,7 @@ const TimelineAttachment = () => { | |||||||
|             }} |             }} | ||||||
|             style={{ |             style={{ | ||||||
|               position: 'absolute', |               position: 'absolute', | ||||||
|               top: StyleConstants.Spacing.S * 2, |               top: StyleConstants.Spacing.S, | ||||||
|               left: StyleConstants.Spacing.S |               left: StyleConstants.Spacing.S | ||||||
|             }} |             }} | ||||||
|           /> |           /> | ||||||
| @@ -12,7 +12,7 @@ export interface Props { | |||||||
| } | } | ||||||
|  |  | ||||||
| const TimelineAvatar: React.FC<Props> = ({ account }) => { | const TimelineAvatar: React.FC<Props> = ({ account }) => { | ||||||
|   const { status, highlighted, disableDetails, disableOnPress, isConversation } = |   const { status, highlighted, disableDetails, disableOnPress, isConversation, inThread } = | ||||||
|     useContext(StatusContext) |     useContext(StatusContext) | ||||||
|   const actualAccount = account || status?.account |   const actualAccount = account || status?.account | ||||||
|   if (!actualAccount) return null |   if (!actualAccount) return null | ||||||
| @@ -49,11 +49,12 @@ const TimelineAvatar: React.FC<Props> = ({ account }) => { | |||||||
|             } |             } | ||||||
|       } |       } | ||||||
|       style={{ |       style={{ | ||||||
|         borderRadius: StyleConstants.Avatar.M, |         borderRadius: 99, | ||||||
|         overflow: 'hidden', |         overflow: 'hidden', | ||||||
|         marginRight: StyleConstants.Spacing.S |         marginRight: StyleConstants.Spacing.S | ||||||
|       }} |       }} | ||||||
|       dim |       dim | ||||||
|  |       withoutTransition={inThread} | ||||||
|     /> |     /> | ||||||
|   ) |   ) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -16,7 +16,7 @@ import TimelineDefault from '../Default' | |||||||
| import StatusContext from './Context' | import StatusContext from './Context' | ||||||
|  |  | ||||||
| const TimelineCard: React.FC = () => { | const TimelineCard: React.FC = () => { | ||||||
|   const { status, spoilerHidden, disableDetails } = useContext(StatusContext) |   const { status, spoilerHidden, disableDetails, inThread } = useContext(StatusContext) | ||||||
|   if (!status || !status.card) return null |   if (!status || !status.card) return null | ||||||
|  |  | ||||||
|   const { colors } = useTheme() |   const { colors } = useTheme() | ||||||
| @@ -86,6 +86,7 @@ const TimelineCard: React.FC = () => { | |||||||
|             style={{ flexBasis: StyleConstants.Font.LineHeight.M * 5 }} |             style={{ flexBasis: StyleConstants.Font.LineHeight.M * 5 }} | ||||||
|             imageStyle={{ borderTopLeftRadius: 6, borderBottomLeftRadius: 6 }} |             imageStyle={{ borderTopLeftRadius: 6, borderBottomLeftRadius: 6 }} | ||||||
|             dim |             dim | ||||||
|  |             withoutTransition={inThread} | ||||||
|           /> |           /> | ||||||
|         ) : null} |         ) : null} | ||||||
|         <View style={{ flex: 1, padding: StyleConstants.Spacing.S }}> |         <View style={{ flex: 1, padding: StyleConstants.Spacing.S }}> | ||||||
| @@ -137,7 +138,7 @@ const TimelineCard: React.FC = () => { | |||||||
|         flexDirection: 'row', |         flexDirection: 'row', | ||||||
|         marginTop: StyleConstants.Spacing.M, |         marginTop: StyleConstants.Spacing.M, | ||||||
|         borderWidth: 1, |         borderWidth: 1, | ||||||
|         borderRadius: StyleConstants.Spacing.S, |         borderRadius: StyleConstants.BorderRadius, | ||||||
|         overflow: 'hidden', |         overflow: 'hidden', | ||||||
|         borderColor: colors.border |         borderColor: colors.border | ||||||
|       }} |       }} | ||||||
|   | |||||||
| @@ -164,12 +164,12 @@ const Timeline: React.FC<Props> = ({ | |||||||
|     } |     } | ||||||
|   ) |   ) | ||||||
|  |  | ||||||
|   const latestMarker = useRef<string>() |   const latestMarker = useRef<string>('') | ||||||
|   const updateMarkers = useCallback( |   const updateMarkers = useCallback( | ||||||
|     throttle(() => { |     throttle(() => { | ||||||
|       if (readMarker) { |       if (readMarker) { | ||||||
|         const currentMarker = getAccountStorage.string(readMarker) || '0' |         const currentMarker = getAccountStorage.string(readMarker) || '0' | ||||||
|         if ((latestMarker.current || '0') > currentMarker) { |         if (latestMarker.current > currentMarker) { | ||||||
|           setAccountStorage([{ key: readMarker, value: latestMarker.current }]) |           setAccountStorage([{ key: readMarker, value: latestMarker.current }]) | ||||||
|         } else { |         } else { | ||||||
|           // setAccountStorage([{ key: readMarker, value: '105250709762254246' }]) |           // setAccountStorage([{ key: readMarker, value: '105250709762254246' }]) | ||||||
| @@ -180,9 +180,12 @@ const Timeline: React.FC<Props> = ({ | |||||||
|   ) |   ) | ||||||
|   readMarker && |   readMarker && | ||||||
|     useEffect(() => { |     useEffect(() => { | ||||||
|       const unsubscribe = navigation.addListener('blur', () => |       const unsubscribe = navigation.addListener('blur', () => { | ||||||
|  |         const currentMarker = getAccountStorage.string(readMarker) || '0' | ||||||
|  |         if (latestMarker.current > currentMarker) { | ||||||
|           setAccountStorage([{ key: readMarker, value: latestMarker.current }]) |           setAccountStorage([{ key: readMarker, value: latestMarker.current }]) | ||||||
|       ) |         } | ||||||
|  |       }) | ||||||
|       return unsubscribe |       return unsubscribe | ||||||
|     }, []) |     }, []) | ||||||
|   const viewabilityConfigCallbackPairs = useRef< |   const viewabilityConfigCallbackPairs = useRef< | ||||||
| @@ -227,7 +230,14 @@ const Timeline: React.FC<Props> = ({ | |||||||
|     } |     } | ||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   useScrollToTop(flRef) |   useScrollToTop( | ||||||
|  |     useRef({ | ||||||
|  |       scrollToTop: () => { | ||||||
|  |         shouldAutoFetch.value = false | ||||||
|  |         flRef.current?.scrollToOffset({ animated: true, offset: 0 }) | ||||||
|  |       } | ||||||
|  |     }) | ||||||
|  |   ) | ||||||
|   useGlobalStorageListener('account.active', () => |   useGlobalStorageListener('account.active', () => | ||||||
|     flRef.current?.scrollToOffset({ offset: 0, animated: false }) |     flRef.current?.scrollToOffset({ offset: 0, animated: false }) | ||||||
|   ) |   ) | ||||||
| @@ -248,13 +258,12 @@ const Timeline: React.FC<Props> = ({ | |||||||
|         ref={customFLRef || flRef} |         ref={customFLRef || flRef} | ||||||
|         scrollEventThrottle={16} |         scrollEventThrottle={16} | ||||||
|         onScroll={onScroll} |         onScroll={onScroll} | ||||||
|         windowSize={5} |  | ||||||
|         data={flattenPages(data)} |         data={flattenPages(data)} | ||||||
|         {...(customProps?.renderItem |         {...(customProps?.renderItem | ||||||
|           ? { renderItem: customProps.renderItem } |           ? { renderItem: customProps.renderItem } | ||||||
|           : { renderItem: ({ item }) => <TimelineDefault item={item} queryKey={queryKey} /> })} |           : { renderItem: ({ item }) => <TimelineDefault item={item} queryKey={queryKey} /> })} | ||||||
|         initialNumToRender={3} |         initialNumToRender={3} | ||||||
|         maxToRenderPerBatch={3} |         maxToRenderPerBatch={2} | ||||||
|         onEndReached={() => !disableInfinity && !isFetchingNextPage && fetchNextPage()} |         onEndReached={() => !disableInfinity && !isFetchingNextPage && fetchNextPage()} | ||||||
|         onEndReachedThreshold={0.75} |         onEndReachedThreshold={0.75} | ||||||
|         ListFooterComponent={ |         ListFooterComponent={ | ||||||
|   | |||||||
| @@ -105,21 +105,21 @@ const menuAccount = ({ | |||||||
|   }) |   }) | ||||||
|   const queryKeyRelationship: QueryKeyRelationship = ['Relationship', { id: actualAccount?.id }] |   const queryKeyRelationship: QueryKeyRelationship = ['Relationship', { id: actualAccount?.id }] | ||||||
|   const relationshipMutation = useRelationshipMutation({ |   const relationshipMutation = useRelationshipMutation({ | ||||||
|     onSuccess: (res, { payload: { action } }) => { |     onSuccess: (res, vars) => { | ||||||
|       haptics('Success') |       haptics('Success') | ||||||
|       queryClient.setQueryData<Mastodon.Relationship[]>(queryKeyRelationship, [res]) |       queryClient.setQueryData<Mastodon.Relationship[]>(queryKeyRelationship, [res]) | ||||||
|       if (action === 'block') { |       if (vars.type === 'outgoing' && vars.payload.action === 'block') { | ||||||
|         queryClient.invalidateQueries({ |         queryClient.invalidateQueries({ | ||||||
|           queryKey: ['Timeline', { page: 'Following' }], |           queryKey: ['Timeline', { page: 'Following' }], | ||||||
|           exact: false |           exact: false | ||||||
|         }) |         }) | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     onError: (err: any, { payload: { action } }) => { |     onError: (err: any, vars) => { | ||||||
|       displayMessage({ |       displayMessage({ | ||||||
|         type: 'danger', |         type: 'danger', | ||||||
|         message: t('common:message.error.message', { |         message: t('common:message.error.message', { | ||||||
|           function: t(`componentContextMenu:${action}.function` as any) |           function: t(`componentContextMenu:${(vars.payload as any).action}.function` as any) | ||||||
|         }), |         }), | ||||||
|         ...(err.status && |         ...(err.status && | ||||||
|           typeof err.status === 'number' && |           typeof err.status === 'number' && | ||||||
|   | |||||||
							
								
								
									
										26
									
								
								src/components/discardConfirmation.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								src/components/discardConfirmation.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | |||||||
|  | import i18n from '@i18n/index' | ||||||
|  | import { Alert } from 'react-native' | ||||||
|  |  | ||||||
|  | export const discardConfirmation = ({ | ||||||
|  |   condition, | ||||||
|  |   action | ||||||
|  | }: { | ||||||
|  |   condition: boolean | ||||||
|  |   action: () => void | ||||||
|  | }) => { | ||||||
|  |   if (condition) { | ||||||
|  |     Alert.alert(i18n.t('common:discard.title'), i18n.t('common:discard.message'), [ | ||||||
|  |       { | ||||||
|  |         text: i18n.t('common:buttons.discard'), | ||||||
|  |         style: 'destructive', | ||||||
|  |         onPress: () => action() | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         text: i18n.t('common:buttons.cancel'), | ||||||
|  |         style: 'default' | ||||||
|  |       } | ||||||
|  |     ]) | ||||||
|  |   } else { | ||||||
|  |     action() | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -4,9 +4,6 @@ import { Platform } from 'react-native' | |||||||
| const haptics = ( | const haptics = ( | ||||||
|   type: 'Success' | 'Warning' | 'Error' | 'Light' | 'Medium' | 'Heavy' |   type: 'Success' | 'Warning' | 'Error' | 'Light' | 'Medium' | 'Heavy' | ||||||
| ) => { | ) => { | ||||||
|   if (Platform.OS === 'ios' && parseInt(Platform.Version, 10) <= 12) { |  | ||||||
|     return |  | ||||||
|   } |  | ||||||
|   if (Platform.OS === 'android') { |   if (Platform.OS === 'android') { | ||||||
|     if (type === 'Error') { |     if (type === 'Error') { | ||||||
|       Haptics.impactAsync(Haptics.ImpactFeedbackStyle['Light']).catch(() => {}) |       Haptics.impactAsync(Haptics.ImpactFeedbackStyle['Light']).catch(() => {}) | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ import i18next from 'i18next' | |||||||
| import { Asset, launchImageLibrary } from 'react-native-image-picker' | import { Asset, launchImageLibrary } from 'react-native-image-picker' | ||||||
|  |  | ||||||
| const queryKeyInstance: QueryKeyInstance = ['Instance'] | const queryKeyInstance: QueryKeyInstance = ['Instance'] | ||||||
| export const MAX_MEDIA_ATTACHMENTS: number = | export const MAX_MEDIA_ATTACHMENTS = (): number => | ||||||
|   queryClient.getQueryData<Mastodon.Instance<any>>(queryKeyInstance)?.configuration?.statuses |   queryClient.getQueryData<Mastodon.Instance<any>>(queryKeyInstance)?.configuration?.statuses | ||||||
|     .max_media_attachments || 4 |     .max_media_attachments || 4 | ||||||
|  |  | ||||||
| @@ -27,7 +27,7 @@ const mediaSelector = async ({ | |||||||
|   indicateMaximum = false, |   indicateMaximum = false, | ||||||
|   showActionSheetWithOptions |   showActionSheetWithOptions | ||||||
| }: Props): Promise<Asset[]> => { | }: Props): Promise<Asset[]> => { | ||||||
|   const _maximum = maximum || MAX_MEDIA_ATTACHMENTS |   const _maximum = maximum || MAX_MEDIA_ATTACHMENTS() | ||||||
|  |  | ||||||
|   const options = () => { |   const options = () => { | ||||||
|     switch (mediaType) { |     switch (mediaType) { | ||||||
|   | |||||||
							
								
								
									
										33
									
								
								src/i18n/be/common.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								src/i18n/be/common.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | |||||||
|  | { | ||||||
|  |   "buttons": { | ||||||
|  |     "OK": "Добра", | ||||||
|  |     "apply": "Ужыць", | ||||||
|  |     "cancel": "Скасаваць", | ||||||
|  |     "discard": "Скасаваць", | ||||||
|  |     "continue": "Працягнуць", | ||||||
|  |     "create": "Стварыць", | ||||||
|  |     "delete": "Выдаліць", | ||||||
|  |     "done": "Гатова", | ||||||
|  |     "confirm": "Пацвердзіць", | ||||||
|  |     "add": "Дадаць" | ||||||
|  |   }, | ||||||
|  |   "customEmoji": { | ||||||
|  |     "accessibilityLabel": "Карыстальніцкія эмодзі {{emoji}}" | ||||||
|  |   }, | ||||||
|  |   "message": { | ||||||
|  |     "success": { | ||||||
|  |       "message": "{{function}} паспяхова" | ||||||
|  |     }, | ||||||
|  |     "warning": { | ||||||
|  |       "message": "" | ||||||
|  |     }, | ||||||
|  |     "error": { | ||||||
|  |       "message": "{{function}} не ўдалося, паспрабуйце яшчэ раз" | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "separator": ", ", | ||||||
|  |   "discard": { | ||||||
|  |     "title": "Змяненні не захаваны", | ||||||
|  |     "message": "Вашыя змены не былі захаваны. Вы хочаце скасаваць змены?" | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										106
									
								
								src/i18n/be/components/contextMenu.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								src/i18n/be/components/contextMenu.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,106 @@ | |||||||
|  | { | ||||||
|  |   "accessibilityHint": "Дзеянні для гэтага допісу, такія як яго карыстальнік або сам допіс", | ||||||
|  |   "account": { | ||||||
|  |     "title": "Дзеянні карыстальніка", | ||||||
|  |     "following": { | ||||||
|  |       "action_false": "Падпісацца на карыстальніка", | ||||||
|  |       "action_true": "Адпісацца ад карыстальніка" | ||||||
|  |     }, | ||||||
|  |     "inLists": "Спісы ў якіх ёсць карыстальнік ...", | ||||||
|  |     "showBoosts": { | ||||||
|  |       "action_false": "Паказаць пашырэнні карыстальніка", | ||||||
|  |       "action_true": "Схаваць пашырэнні карыстальніка" | ||||||
|  |     }, | ||||||
|  |     "mute": { | ||||||
|  |       "action_false": "Ігнараваць карыстальніка", | ||||||
|  |       "action_true": "Не ігнараваць карыстальніка" | ||||||
|  |     }, | ||||||
|  |     "followAs": { | ||||||
|  |       "trigger": "Падпісацца як ...", | ||||||
|  |       "succeed_default": "Цяпер вы падпісаны на @{{target}} як @{{source}}", | ||||||
|  |       "succeed_locked": "Запыт на падпіску на @{{target}} як {{source}}, чакае зацвярджэння", | ||||||
|  |       "failed": "Падпісацца як" | ||||||
|  |     }, | ||||||
|  |     "blockReport": "Заблакіраваць і паскардзіцца", | ||||||
|  |     "block": { | ||||||
|  |       "action_false": "Заблакіраваць карыстальніка", | ||||||
|  |       "action_true": "Разблакіраваць карыстальніка", | ||||||
|  |       "alert": { | ||||||
|  |         "title": "Вы ўпэўнены, што хочаце заблакіраваць {{username}}?" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "reports": { | ||||||
|  |       "action": "Паскардзіцца і заблакіраваць карыстальніка", | ||||||
|  |       "alert": { | ||||||
|  |         "title": "Вы ўпэўнены, што хочаце паскардзіцца і заблакіраваць {{username}}?" | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "at": { | ||||||
|  |     "direct": "Асабістае паведамленне", | ||||||
|  |     "public": "Публічнае паведамленне" | ||||||
|  |   }, | ||||||
|  |   "copy": { | ||||||
|  |     "action": "Скапіраваць допіс", | ||||||
|  |     "succeed": "Скапіравана" | ||||||
|  |   }, | ||||||
|  |   "instance": { | ||||||
|  |     "title": "Дзеянне інстанса", | ||||||
|  |     "block": { | ||||||
|  |       "action": "Заблакіраваць інстанс {{instance}}", | ||||||
|  |       "alert": { | ||||||
|  |         "title": "Вы ўпэўнены, што хочаце заблакіраваць {{instance}}?", | ||||||
|  |         "message": "Як правіла, вы ігнаруеце (або блакіруеце) пэўных карыстальнікаў.\n\nКалі вы блакіруеце інстанс, увесь яго кантэнт (уключаючы, напрыклад, вашых падпісчыкаў, якія яму належаць) будзе выдалены!" | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "hashtag": { | ||||||
|  |     "follow": { | ||||||
|  |       "action_false": "Падпісацца", | ||||||
|  |       "action_true": "Адпісацца" | ||||||
|  |     }, | ||||||
|  |     "filter": { | ||||||
|  |       "action": "Фільтраваць хэштэг ..." | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "share": { | ||||||
|  |     "status": { | ||||||
|  |       "action": "Абагуліць допіс" | ||||||
|  |     }, | ||||||
|  |     "account": { | ||||||
|  |       "action": "Абагуліць карыстальніка" | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "status": { | ||||||
|  |     "title": "Дзеянні допісу", | ||||||
|  |     "edit": { | ||||||
|  |       "action": "Рэдагаваць допіс" | ||||||
|  |     }, | ||||||
|  |     "delete": { | ||||||
|  |       "action": "Выдаліць допіс", | ||||||
|  |       "alert": { | ||||||
|  |         "title": "Вы ўпэўненыя, што хочаце выдаліць?", | ||||||
|  |         "message": "Усе пашырэнні і абраныя будуць выдалены, у тым ліку ўсе адказы." | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "deleteEdit": { | ||||||
|  |       "action": "Выдаліць допіс і апублікаваць нанава", | ||||||
|  |       "alert": { | ||||||
|  |         "title": "Вы пацвярджаеце выдаленне і паўторную публікацыю?", | ||||||
|  |         "message": "Усе пашырэнні і абраныя будуць выдалены, у тым ліку ўсе адказы." | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "mute": { | ||||||
|  |       "action_false": "Ігнараваць допіс і адказы", | ||||||
|  |       "action_true": "Не ігнараваць допіс і адказы" | ||||||
|  |     }, | ||||||
|  |     "pin": { | ||||||
|  |       "action_false": "Замацаваць допіс", | ||||||
|  |       "action_true": "Адмацаваць допіс" | ||||||
|  |     }, | ||||||
|  |     "filter": { | ||||||
|  |       "action_false": "Фільтраваць допіс ...", | ||||||
|  |       "action_true": "Кіраваць фільтрамі ..." | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										3
									
								
								src/i18n/be/components/emojis.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								src/i18n/be/components/emojis.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | |||||||
|  | { | ||||||
|  |   "frequentUsed": "Часта выкарыстоўваецца" | ||||||
|  | } | ||||||
							
								
								
									
										25
									
								
								src/i18n/be/components/instance.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								src/i18n/be/components/instance.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | { | ||||||
|  |   "server": { | ||||||
|  |     "textInput": { | ||||||
|  |       "placeholder": "Дамен інстанса" | ||||||
|  |     }, | ||||||
|  |     "whitelisted": "Гэта можа быць асобнік з белага спісу, з якога tooot не можа атрымаць даныя да ўваходу ў сістэму.", | ||||||
|  |     "button": "Увайсці", | ||||||
|  |     "information": { | ||||||
|  |       "name": "Назва", | ||||||
|  |       "description": "Апісанне" | ||||||
|  |     }, | ||||||
|  |     "disclaimer": { | ||||||
|  |       "base": "У працэсе ўваходу ў сістэму выкарыстоўваецца сістэмны браўзер, таму інфармацыя аб вашым уліковым запісе не будзе даступная праграме." | ||||||
|  |     }, | ||||||
|  |     "terms": { | ||||||
|  |       "base": "Уваходзячы, вы згаджаецеся з <0>палітыкай прыватнасці</0> і <1>ўмовамі абслугоўвання</1>." | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "update": { | ||||||
|  |     "alert": { | ||||||
|  |       "title": "Уваход выкананы", | ||||||
|  |       "message": "Вы можаце ўвайсці ў іншы ўліковы запіс, захоўваючы бягучыя ўліковыя запісы" | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										10
									
								
								src/i18n/be/components/mediaSelector.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/i18n/be/components/mediaSelector.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | |||||||
|  | { | ||||||
|  |   "title": "Выбар крыніцы медыя", | ||||||
|  |   "message": "Файлы EXIF не падтрымліваюцца", | ||||||
|  |   "options": { | ||||||
|  |     "image": "Запампаваць фота", | ||||||
|  |     "image_max": "Запампаваць фота (макс. {{max}})", | ||||||
|  |     "video": "Запампаваць відэа", | ||||||
|  |     "video_max": "Запампаваць відэа (макс. {{max}})" | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										8
									
								
								src/i18n/be/components/parse.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/i18n/be/components/parse.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | |||||||
|  | { | ||||||
|  |   "HTML": { | ||||||
|  |     "accessibilityHint": "Націсніце, каб разгарнуць або згарнуць змесціва", | ||||||
|  |     "expanded": "{{hint}}{{moreLines}}", | ||||||
|  |     "moreLines": " (яшчэ {{count}} радкоў)", | ||||||
|  |     "defaultHint": "Доўгі допіс" | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										16
									
								
								src/i18n/be/components/relationship.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/i18n/be/components/relationship.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | |||||||
|  | { | ||||||
|  |   "follow": { | ||||||
|  |     "function": "Падпісацца на карыстальніка" | ||||||
|  |   }, | ||||||
|  |   "block": { | ||||||
|  |     "function": "Заблакіраваць карыстальніка" | ||||||
|  |   }, | ||||||
|  |   "button": { | ||||||
|  |     "error": "Памылка загрузкі", | ||||||
|  |     "blocked_by": "Заблакіраваны карыстальнікам", | ||||||
|  |     "blocking": "Разблакіраваць", | ||||||
|  |     "following": "Адпісацца", | ||||||
|  |     "requested": "Скасаваць запыт", | ||||||
|  |     "default": "Падпісацца" | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										168
									
								
								src/i18n/be/components/timeline.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								src/i18n/be/components/timeline.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,168 @@ | |||||||
|  | { | ||||||
|  |   "empty": { | ||||||
|  |     "error": { | ||||||
|  |       "message": "Памылка загрузкі", | ||||||
|  |       "button": "Паўтарыць" | ||||||
|  |     }, | ||||||
|  |     "success": { | ||||||
|  |       "message": "Стужка пуста" | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "end": { | ||||||
|  |     "message": "Вось і канец, хочаце кубачак <0 />?" | ||||||
|  |   }, | ||||||
|  |   "lookback": { | ||||||
|  |     "message": "Апошні раз прачытана ў" | ||||||
|  |   }, | ||||||
|  |   "refresh": { | ||||||
|  |     "fetchPreviousPage": "Навейшае", | ||||||
|  |     "refetch": "Да новых", | ||||||
|  |     "fetching": "Атрыманне новых допісаў ...", | ||||||
|  |     "fetched": { | ||||||
|  |       "none": "Няма новых допісаў", | ||||||
|  |       "found": "Атрымана {{count}} допісаў" | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "shared": { | ||||||
|  |     "actioned": { | ||||||
|  |       "pinned": "Замацавана", | ||||||
|  |       "favourite": "{{name}} упадабаў ваш допіс", | ||||||
|  |       "status": "{{name}} толькі што апублікаваў допіс", | ||||||
|  |       "follow": "{{name}} падпісаўся на вас", | ||||||
|  |       "follow_request": "{{name}} хоча падпісацца на вас", | ||||||
|  |       "poll": "Апытанне, дзе вы прынялі ўдзел, скончылася", | ||||||
|  |       "reblog": { | ||||||
|  |         "default": "{{name}} пашырыў(-ла)", | ||||||
|  |         "myself": "Я пашырыў", | ||||||
|  |         "notification": "{{name}} пашырыў ваш допіс" | ||||||
|  |       }, | ||||||
|  |       "update": "Пашырэнне было адрэдагавана", | ||||||
|  |       "admin.sign_up": "{{name}} далучыўся да інстанса", | ||||||
|  |       "admin.report": "{{name}} паскардзіўся на:" | ||||||
|  |     }, | ||||||
|  |     "actions": { | ||||||
|  |       "reply": { | ||||||
|  |         "accessibilityLabel": "Адказаць на допіс" | ||||||
|  |       }, | ||||||
|  |       "reblogged": { | ||||||
|  |         "accessibilityLabel": "Пашырыць допіс", | ||||||
|  |         "function": "Пашырыць допіс", | ||||||
|  |         "options": { | ||||||
|  |           "title": "Выберыце бачнасць пашырэння", | ||||||
|  |           "public": "Публічнае пашырэнне", | ||||||
|  |           "unlisted": "Прыватнае пашырэнне" | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |       "favourited": { | ||||||
|  |         "accessibilityLabel": "Дадаць гэта допіс у абранае", | ||||||
|  |         "function": "Дадаць у абранае" | ||||||
|  |       }, | ||||||
|  |       "bookmarked": { | ||||||
|  |         "accessibilityLabel": "Дадаць гэты допіс у закладкі", | ||||||
|  |         "function": "Дадаць допіс у закладкі" | ||||||
|  |       }, | ||||||
|  |       "openReport": "Адкрыць скаргу" | ||||||
|  |     }, | ||||||
|  |     "actionsUsers": { | ||||||
|  |       "reblogged_by": { | ||||||
|  |         "accessibilityLabel": "{{count}} карыстальнікаў пашырылі гэты допіс", | ||||||
|  |         "accessibilityHint": "Націсніце, каб даведацца пра карыстальнікаў", | ||||||
|  |         "text": "$t(screenTabs:shared.users.statuses.reblogged_by)" | ||||||
|  |       }, | ||||||
|  |       "favourited_by": { | ||||||
|  |         "accessibilityLabel": "{{count}} карыстальнікаў дадалі гэты допіс у абранае", | ||||||
|  |         "accessibilityHint": "Націсніце, каб даведацца пра карыстальнікаў", | ||||||
|  |         "text": "$t(screenTabs:shared.users.statuses.favourited_by)" | ||||||
|  |       }, | ||||||
|  |       "history": { | ||||||
|  |         "accessibilityLabel": "Гэты допіс быў адрэдагаваны {{count}} разоў", | ||||||
|  |         "accessibilityHint": "Націсніце, каб прагледзець поўную гісторыю рэдагавання", | ||||||
|  |         "text_one": "{{count}} рэдагаванне", | ||||||
|  |         "text_other": "{{count}} рэдагаванняў" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "attachment": { | ||||||
|  |       "sensitive": { | ||||||
|  |         "button": "Паказаць далікатнае медыя" | ||||||
|  |       }, | ||||||
|  |       "unsupported": { | ||||||
|  |         "text": "Памылка загрузкі", | ||||||
|  |         "button": "Паспрабуйце аддаленую спасылку" | ||||||
|  |       }, | ||||||
|  |       "altText": "Альтэрнатыўны тэкст" | ||||||
|  |     }, | ||||||
|  |     "avatar": { | ||||||
|  |       "accessibilityLabel": "Аватар {{name}}", | ||||||
|  |       "accessibilityHint": "Націсніце, каб перайсці на старонку {{name}}" | ||||||
|  |     }, | ||||||
|  |     "content": { | ||||||
|  |       "expandHint": "Схаваны змест" | ||||||
|  |     }, | ||||||
|  |     "filtered": { | ||||||
|  |       "reveal": "Усё роўна паказаць", | ||||||
|  |       "match_v1": "Адфільтравана: {{phrase}}.", | ||||||
|  |       "match_v2_one": "Адфільтравана па {{filters}}.", | ||||||
|  |       "match_v2_other": "Адфільтравана {{count}} фільтрамі, {{filters}}." | ||||||
|  |     }, | ||||||
|  |     "fullConversation": "Чытаць размовы", | ||||||
|  |     "translate": { | ||||||
|  |       "default": "Перакласці", | ||||||
|  |       "succeed": "Перакладзена {{provider}} з {{source}}", | ||||||
|  |       "failed": "Не ўдалося перакласці", | ||||||
|  |       "source_not_supported": "Мова допісу не падтрымліваецца", | ||||||
|  |       "target_not_supported": "Гэтая мова не падтрымліваецца" | ||||||
|  |     }, | ||||||
|  |     "header": { | ||||||
|  |       "shared": { | ||||||
|  |         "account": { | ||||||
|  |           "name": { | ||||||
|  |             "accessibilityHint": "Бачнае імя карыстальніка" | ||||||
|  |           }, | ||||||
|  |           "account": { | ||||||
|  |             "accessibilityHint": "Профіль карыстальніка" | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         "application": "праз {{application}}", | ||||||
|  |         "edited": { | ||||||
|  |           "accessibilityLabel": "Допіс адрэдагаваны" | ||||||
|  |         }, | ||||||
|  |         "muted": { | ||||||
|  |           "accessibilityLabel": "Допіс ігнаруецца" | ||||||
|  |         }, | ||||||
|  |         "replies": "Адказы <0 />", | ||||||
|  |         "visibility": { | ||||||
|  |           "direct": { | ||||||
|  |             "accessibilityLabel": "Адправіць асабістае паведамленне" | ||||||
|  |           }, | ||||||
|  |           "private": { | ||||||
|  |             "accessibilityLabel": "Допіс бачны толькі падпісчыкам" | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |       "conversation": { | ||||||
|  |         "withAccounts": "З", | ||||||
|  |         "delete": { | ||||||
|  |           "function": "Выдаліць асабістае паведамленне" | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "poll": { | ||||||
|  |       "meta": { | ||||||
|  |         "button": { | ||||||
|  |           "vote": "Галасаванне", | ||||||
|  |           "refresh": "Абнавіць" | ||||||
|  |         }, | ||||||
|  |         "count": { | ||||||
|  |           "voters_one": "{{count}} карыстальнік прагаласаваў", | ||||||
|  |           "voters_other": "{{count}} карыстальнікаў прагаласавала", | ||||||
|  |           "votes_one": "{{count}} голас", | ||||||
|  |           "votes_other": "{{count}} галасоў" | ||||||
|  |         }, | ||||||
|  |         "expiration": { | ||||||
|  |           "expired": "Галасаванне скончылася", | ||||||
|  |           "until": "Заканчваецца <0 />" | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										17
									
								
								src/i18n/be/screens.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/i18n/be/screens.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | |||||||
|  | { | ||||||
|  |   "screenshot": { | ||||||
|  |     "title": "Абарона прыватнасці", | ||||||
|  |     "message": "Калі ласка, не раскрывайце асобу іншых карыстальнікаў, такіх як імя карыстальніка, аватар і г.д. Дзякуй!" | ||||||
|  |   }, | ||||||
|  |   "localCorrupt": { | ||||||
|  |     "message": "Тэрмін дзеяння ўваходу скончыўся. Увайдзіце яшчэ раз" | ||||||
|  |   }, | ||||||
|  |   "pushError": { | ||||||
|  |     "message": "Памылка сэрвісу Push", | ||||||
|  |     "description": "Паўторна ўключыце push-апавяшчэнне ў наладах" | ||||||
|  |   }, | ||||||
|  |   "shareError": { | ||||||
|  |     "imageNotSupported": "Тып відарыса {{type}} не падтрымліваецца", | ||||||
|  |     "videoNotSupported": "Тып відэа {{type}} не падтрымліваецца" | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										6
									
								
								src/i18n/be/screens/accountSelection.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								src/i18n/be/screens/accountSelection.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | { | ||||||
|  |   "heading": "Абагуліць з ...", | ||||||
|  |   "content": { | ||||||
|  |     "select_account": "Выберыце ўліковы запіс" | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										10
									
								
								src/i18n/be/screens/announcements.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/i18n/be/screens/announcements.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | |||||||
|  | { | ||||||
|  |   "heading": "Аб'явы", | ||||||
|  |   "content": { | ||||||
|  |     "published": "Апублікавана <0 />", | ||||||
|  |     "button": { | ||||||
|  |       "read": "Прачытана", | ||||||
|  |       "unread": "Адзначыць як прачытанае" | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										171
									
								
								src/i18n/be/screens/compose.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										171
									
								
								src/i18n/be/screens/compose.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,171 @@ | |||||||
|  | { | ||||||
|  |   "heading": { | ||||||
|  |     "left": { | ||||||
|  |       "alert": { | ||||||
|  |         "title": "Скасаваць рэдагаванне?", | ||||||
|  |         "buttons": { | ||||||
|  |           "save": "Захаваць чарнавік", | ||||||
|  |           "delete": "Выдаліць чарнавік" | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "right": { | ||||||
|  |       "button": { | ||||||
|  |         "default": "Допіс", | ||||||
|  |         "conversation": "Асабістае паведамленне", | ||||||
|  |         "reply": "Адказаць", | ||||||
|  |         "deleteEdit": "Допіс", | ||||||
|  |         "edit": "Допіс", | ||||||
|  |         "share": "Допіс" | ||||||
|  |       }, | ||||||
|  |       "alert": { | ||||||
|  |         "default": { | ||||||
|  |           "title": "Не ўдалося апублікаваць допіс", | ||||||
|  |           "button": "Паўтарыць спробу" | ||||||
|  |         }, | ||||||
|  |         "removeReply": { | ||||||
|  |           "title": "Допіс для адказу не знойдзены", | ||||||
|  |           "description": "Допіс для адказу магчыма быў выдалены. Вы жадаеце выдаліць яго са свайго допісу?", | ||||||
|  |           "confirm": "Выдаліць спасылку" | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "content": { | ||||||
|  |     "root": { | ||||||
|  |       "header": { | ||||||
|  |         "postingAs": "Апублікаваць як @{{acct}}@{{domain}}", | ||||||
|  |         "spoilerInput": { | ||||||
|  |           "placeholder": "Тэкст папярэджання" | ||||||
|  |         }, | ||||||
|  |         "textInput": { | ||||||
|  |           "placeholder": "Што адбываецца?", | ||||||
|  |           "keyboardImage": { | ||||||
|  |             "exceedMaximum": { | ||||||
|  |               "title": "Дасягнута максімальная колькасць далучэнняў" | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |       "footer": { | ||||||
|  |         "attachments": { | ||||||
|  |           "sensitive": "Пазначыць далучэнні як далікатныя", | ||||||
|  |           "remove": { | ||||||
|  |             "accessibilityLabel": "Выдаліць запампаванае далучэнне, нумар {{attachment}}" | ||||||
|  |           }, | ||||||
|  |           "edit": { | ||||||
|  |             "accessibilityLabel": "Рэдагаваць запампаванае далучэнне, нумар {{attachment}}" | ||||||
|  |           }, | ||||||
|  |           "upload": { | ||||||
|  |             "accessibilityLabel": "Запампаваць больш далучэнняў" | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         "emojis": { | ||||||
|  |           "accessibilityHint": "Націсніце, каб дадаць эмодзі ў допіс" | ||||||
|  |         }, | ||||||
|  |         "poll": { | ||||||
|  |           "option": { | ||||||
|  |             "placeholder": { | ||||||
|  |               "accessibilityLabel": "Варыянт апытання {{index}}", | ||||||
|  |               "single": "Адзіны выбар", | ||||||
|  |               "multiple": "Множны выбар" | ||||||
|  |             } | ||||||
|  |           }, | ||||||
|  |           "quantity": { | ||||||
|  |             "reduce": { | ||||||
|  |               "accessibilityLabel": "Паменшыць колькасць варыянтаў адказу да {{amount}}", | ||||||
|  |               "accessibilityHint": "Дасягнута мінімальная колькасць варыянтаў адказу, зараз {{amount}}" | ||||||
|  |             }, | ||||||
|  |             "increase": { | ||||||
|  |               "accessibilityLabel": "Павялічыць колькасць варыянтаў адказу да {{amount}}", | ||||||
|  |               "accessibilityHint": "Дасягнута максімальная колькасць варыянтаў адказу, зараз {{amount}}" | ||||||
|  |             } | ||||||
|  |           }, | ||||||
|  |           "multiple": { | ||||||
|  |             "heading": "Тып выбару", | ||||||
|  |             "options": { | ||||||
|  |               "single": "Адзіны выбар", | ||||||
|  |               "multiple": "Множны выбар" | ||||||
|  |             } | ||||||
|  |           }, | ||||||
|  |           "expiration": { | ||||||
|  |             "heading": "Тэрмін дзеяння", | ||||||
|  |             "options": { | ||||||
|  |               "300": "5 хвілін", | ||||||
|  |               "1800": "30 хвілін", | ||||||
|  |               "3600": "1 гадзіна", | ||||||
|  |               "21600": "6 гадзін", | ||||||
|  |               "86400": "1 дзень", | ||||||
|  |               "259200": "3 дні", | ||||||
|  |               "604800": "7 дзён" | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |       "actions": { | ||||||
|  |         "attachment": { | ||||||
|  |           "accessibilityLabel": "Запампаваць далучэнне", | ||||||
|  |           "accessibilityHint": "Немагчыма дадаць апытанне, пры наяўнасці далучэнняў", | ||||||
|  |           "failed": { | ||||||
|  |             "alert": { | ||||||
|  |               "title": "Памылка запампоўкі", | ||||||
|  |               "button": "Паўтарыць спробу" | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         "poll": { | ||||||
|  |           "accessibilityLabel": "Дадаць апытанне", | ||||||
|  |           "accessibilityHint": "Немагчыма далучыць файлы, калі ёсць актыўнае апытанне" | ||||||
|  |         }, | ||||||
|  |         "visibility": { | ||||||
|  |           "accessibilityLabel": "Бачнасць допісу: {{visibility}}", | ||||||
|  |           "title": "Бачнасць допісу", | ||||||
|  |           "options": { | ||||||
|  |             "public": "Публічны", | ||||||
|  |             "unlisted": "Прыватны", | ||||||
|  |             "private": "Толькі для падпісчыкаў", | ||||||
|  |             "direct": "Асабістае паведамленне" | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         "spoiler": { | ||||||
|  |           "accessibilityLabel": "Папярэджанне" | ||||||
|  |         }, | ||||||
|  |         "emoji": { | ||||||
|  |           "accessibilityLabel": "Дадаць эмодзі", | ||||||
|  |           "accessibilityHint": "Адкрыйце панэль выбару эмодзі, правядзіце гарызантальна, каб змяніць старонку" | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |       "drafts_one": "Чарнавік ({{count}})", | ||||||
|  |       "drafts_other": "Чарнавікі ({{count}})" | ||||||
|  |     }, | ||||||
|  |     "editAttachment": { | ||||||
|  |       "header": { | ||||||
|  |         "title": "Рэдагаваць далучэнне", | ||||||
|  |         "right": { | ||||||
|  |           "accessibilityLabel": "Захаваць змены", | ||||||
|  |           "failed": { | ||||||
|  |             "title": "Збой рэдагавання", | ||||||
|  |             "button": "Паўтарыць спробу" | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |       "content": { | ||||||
|  |         "altText": { | ||||||
|  |           "heading": "Апішыце медыя для людзей са слабым зрокам", | ||||||
|  |           "placeholder": "Вы можаце дадаць апісанне, якое часам называюць alt-тэкстам, да вашых медыя файлаў, каб яны былі даступныя яшчэ большай колькасці людзей, у тым ліку сляпым і людзям са слабым зрокам.\n\nДобрыя апісанні - сціслыя, але апісваюць тое, што знаходзіцца у вашых медыя, дастаткова дакладна, каб зразумець іх кантэкст." | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "draftsList": { | ||||||
|  |       "header": { | ||||||
|  |         "title": "Чарнавік" | ||||||
|  |       }, | ||||||
|  |       "warning": "Чарнавікі захоўваюцца толькі лакальна і могуць быць страчаны. Раім не выкарыстоўваць чарнавікі як доўгатэрміновае сховішча.", | ||||||
|  |       "content": { | ||||||
|  |         "accessibilityHint": "Чарнавік захаваны, націсніце для рэдагавання", | ||||||
|  |         "textEmpty": "Змест пусты" | ||||||
|  |       }, | ||||||
|  |       "checkAttachment": "Праверка далучэнняў на серверы..." | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										16
									
								
								src/i18n/be/screens/imageViewer.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/i18n/be/screens/imageViewer.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | |||||||
|  | { | ||||||
|  |   "content": { | ||||||
|  |     "actions": { | ||||||
|  |       "accessibilityLabel": "Больш дзеянняў на гэтым відарысе", | ||||||
|  |       "accessibilityHint": "Вы можаце захаваць або абагуліць гэты відарыс" | ||||||
|  |     }, | ||||||
|  |     "options": { | ||||||
|  |       "save": "Захаваць відарыс", | ||||||
|  |       "share": "Абагуліць відарыс" | ||||||
|  |     }, | ||||||
|  |     "save": { | ||||||
|  |       "succeed": "Відарыс захаваны", | ||||||
|  |       "failed": "Не атрымалася захаваць відарыс" | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										486
									
								
								src/i18n/be/screens/tabs.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										486
									
								
								src/i18n/be/screens/tabs.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,486 @@ | |||||||
|  | { | ||||||
|  |   "tabs": { | ||||||
|  |     "local": { | ||||||
|  |       "name": "Падпіскі", | ||||||
|  |       "options": { | ||||||
|  |         "showBoosts": "Паказваць пашырэнні", | ||||||
|  |         "showReplies": "Паказваць адказы" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "public": { | ||||||
|  |       "segments": { | ||||||
|  |         "federated": "Глабальнае", | ||||||
|  |         "local": "Мясцовае", | ||||||
|  |         "explore": "Агляд" | ||||||
|  |       }, | ||||||
|  |       "exploring": { | ||||||
|  |         "heading": "Агляд", | ||||||
|  |         "trending": "Папулярныя", | ||||||
|  |         "followRemote": "Падпісацца на аддалены інстанс", | ||||||
|  |         "noTitle": "Няма загалоўка", | ||||||
|  |         "errors": { | ||||||
|  |           "existed": "Вы ўжо падпісаныя на гэты аддалены інстанс.", | ||||||
|  |           "notAvailable": "Стужка гэтага інстанса недаступная для ўсіх. Паспрабуйце іншы інстанс." | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "notifications": { | ||||||
|  |       "name": "Апавяшчэнні" | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "common": { | ||||||
|  |     "search": { | ||||||
|  |       "accessibilityLabel": "Пошук", | ||||||
|  |       "accessibilityHint": "" | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "notifications": { | ||||||
|  |     "filters": { | ||||||
|  |       "accessibilityLabel": "Фільтр", | ||||||
|  |       "accessibilityHint": "", | ||||||
|  |       "title": "Паказваць апавяшчэнні" | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "me": { | ||||||
|  |     "stacks": { | ||||||
|  |       "bookmarks": { | ||||||
|  |         "name": "Закладкі" | ||||||
|  |       }, | ||||||
|  |       "conversations": { | ||||||
|  |         "name": "Асабістыя паведамленні" | ||||||
|  |       }, | ||||||
|  |       "favourites": { | ||||||
|  |         "name": "" | ||||||
|  |       }, | ||||||
|  |       "followedTags": { | ||||||
|  |         "name": "" | ||||||
|  |       }, | ||||||
|  |       "fontSize": { | ||||||
|  |         "name": "Памер шрыфту" | ||||||
|  |       }, | ||||||
|  |       "language": { | ||||||
|  |         "name": "Мова" | ||||||
|  |       }, | ||||||
|  |       "list": { | ||||||
|  |         "name": "Спіс: {{list}}" | ||||||
|  |       }, | ||||||
|  |       "listAccounts": { | ||||||
|  |         "name": "Карыстальнікі ў спісе: {{list}}" | ||||||
|  |       }, | ||||||
|  |       "listAdd": { | ||||||
|  |         "name": "Стварыць спіс" | ||||||
|  |       }, | ||||||
|  |       "listEdit": { | ||||||
|  |         "name": "Рэдагаваць дэталі спісу" | ||||||
|  |       }, | ||||||
|  |       "lists": { | ||||||
|  |         "name": "Спісы" | ||||||
|  |       }, | ||||||
|  |       "push": { | ||||||
|  |         "name": "Push-апавяшчэнні" | ||||||
|  |       }, | ||||||
|  |       "preferences": { | ||||||
|  |         "name": "" | ||||||
|  |       }, | ||||||
|  |       "preferencesFilters": { | ||||||
|  |         "name": "" | ||||||
|  |       }, | ||||||
|  |       "preferencesFilterAdd": { | ||||||
|  |         "name": "" | ||||||
|  |       }, | ||||||
|  |       "preferencesFilterEdit": { | ||||||
|  |         "name": "Рэдагаваць фільтр" | ||||||
|  |       }, | ||||||
|  |       "profile": { | ||||||
|  |         "name": "Рэдагаваць Профіль" | ||||||
|  |       }, | ||||||
|  |       "profileName": { | ||||||
|  |         "name": "Рэдагаваць бачнае імя" | ||||||
|  |       }, | ||||||
|  |       "profileNote": { | ||||||
|  |         "name": "Рэдагаваць апісанне" | ||||||
|  |       }, | ||||||
|  |       "profileFields": { | ||||||
|  |         "name": "Рэдагаваць метаданыя" | ||||||
|  |       }, | ||||||
|  |       "settings": { | ||||||
|  |         "name": "" | ||||||
|  |       }, | ||||||
|  |       "switch": { | ||||||
|  |         "name": "" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "fontSize": { | ||||||
|  |       "demo": "", | ||||||
|  |       "sizes": { | ||||||
|  |         "S": "S", | ||||||
|  |         "M": "M - Стандартны", | ||||||
|  |         "L": "L", | ||||||
|  |         "XL": "XL", | ||||||
|  |         "XXL": "XXL" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "listAccounts": { | ||||||
|  |       "heading": "Кіраваць карыстальнікамі", | ||||||
|  |       "error": "Выдаліць карыстальніка са спісу", | ||||||
|  |       "empty": "У гэтым спісе няма карыстальнікаў" | ||||||
|  |     }, | ||||||
|  |     "listEdit": { | ||||||
|  |       "heading": "Рэдагаваць дэталі спісу", | ||||||
|  |       "title": "Назва", | ||||||
|  |       "repliesPolicy": { | ||||||
|  |         "heading": "Адказы будуць бачныя для:", | ||||||
|  |         "options": { | ||||||
|  |           "none": "", | ||||||
|  |           "list": "", | ||||||
|  |           "followed": "" | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "listDelete": { | ||||||
|  |       "heading": "Выдаліць спіс", | ||||||
|  |       "confirm": { | ||||||
|  |         "title": "Выдаліць спіс \"{{list}}\"?", | ||||||
|  |         "message": "" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "preferences": { | ||||||
|  |       "visibility": { | ||||||
|  |         "title": "", | ||||||
|  |         "options": { | ||||||
|  |           "public": "", | ||||||
|  |           "unlisted": "", | ||||||
|  |           "private": "" | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |       "sensitive": { | ||||||
|  |         "title": "" | ||||||
|  |       }, | ||||||
|  |       "media": { | ||||||
|  |         "title": "", | ||||||
|  |         "options": { | ||||||
|  |           "default": "", | ||||||
|  |           "show_all": "", | ||||||
|  |           "hide_all": "" | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |       "spoilers": { | ||||||
|  |         "title": "" | ||||||
|  |       }, | ||||||
|  |       "autoplay_gifs": { | ||||||
|  |         "title": "" | ||||||
|  |       }, | ||||||
|  |       "filters": { | ||||||
|  |         "title": "", | ||||||
|  |         "content": "" | ||||||
|  |       }, | ||||||
|  |       "web_only": { | ||||||
|  |         "title": "", | ||||||
|  |         "description": "" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "preferencesFilters": { | ||||||
|  |       "expired": "", | ||||||
|  |       "keywords_one": "", | ||||||
|  |       "keywords_other": "", | ||||||
|  |       "statuses_one": "", | ||||||
|  |       "statuses_other": "", | ||||||
|  |       "context": "", | ||||||
|  |       "contexts": { | ||||||
|  |         "home": "", | ||||||
|  |         "notifications": "", | ||||||
|  |         "public": "", | ||||||
|  |         "thread": "", | ||||||
|  |         "account": "" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "preferencesFilter": { | ||||||
|  |       "name": "", | ||||||
|  |       "expiration": "Заканчэнне тэрміну дзеяння", | ||||||
|  |       "expirationOptions": { | ||||||
|  |         "0": "Ніколі", | ||||||
|  |         "1800": "Праз 30 хвілін", | ||||||
|  |         "3600": "Праз 1 гадзіну", | ||||||
|  |         "43200": "Праз 12 гадзін", | ||||||
|  |         "86400": "Праз 1 дзень", | ||||||
|  |         "604800": "Праз 1 тыдзень", | ||||||
|  |         "18144000": "Праз 1 месяц" | ||||||
|  |       }, | ||||||
|  |       "context": "", | ||||||
|  |       "contexts": { | ||||||
|  |         "home": "", | ||||||
|  |         "notifications": "Апавяшчэнне", | ||||||
|  |         "public": "", | ||||||
|  |         "thread": "", | ||||||
|  |         "account": "" | ||||||
|  |       }, | ||||||
|  |       "action": "", | ||||||
|  |       "actions": { | ||||||
|  |         "warn": "", | ||||||
|  |         "hide": "" | ||||||
|  |       }, | ||||||
|  |       "keywords": "", | ||||||
|  |       "keyword": "", | ||||||
|  |       "statuses": "" | ||||||
|  |     }, | ||||||
|  |     "profile": { | ||||||
|  |       "feedback": { | ||||||
|  |         "succeed": "", | ||||||
|  |         "failed": "" | ||||||
|  |       }, | ||||||
|  |       "root": { | ||||||
|  |         "name": { | ||||||
|  |           "title": "" | ||||||
|  |         }, | ||||||
|  |         "avatar": { | ||||||
|  |           "title": "Аватар", | ||||||
|  |           "description": "Будзе паменшана да 400x400 пікселяў" | ||||||
|  |         }, | ||||||
|  |         "header": { | ||||||
|  |           "title": "Відарыс банера", | ||||||
|  |           "description": "Будзе паменшаны да 1500x500 пікселяў" | ||||||
|  |         }, | ||||||
|  |         "note": { | ||||||
|  |           "title": "Апісанне" | ||||||
|  |         }, | ||||||
|  |         "fields": { | ||||||
|  |           "title": "Метаданыя", | ||||||
|  |           "total_one": "", | ||||||
|  |           "total_other": "" | ||||||
|  |         }, | ||||||
|  |         "lock": { | ||||||
|  |           "title": "", | ||||||
|  |           "description": "" | ||||||
|  |         }, | ||||||
|  |         "bot": { | ||||||
|  |           "title": "", | ||||||
|  |           "description": "" | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |       "fields": { | ||||||
|  |         "group": "", | ||||||
|  |         "label": "", | ||||||
|  |         "content": "" | ||||||
|  |       }, | ||||||
|  |       "mediaSelectionFailed": "" | ||||||
|  |     }, | ||||||
|  |     "push": { | ||||||
|  |       "notAvailable": "", | ||||||
|  |       "enable": { | ||||||
|  |         "direct": "", | ||||||
|  |         "settings": "" | ||||||
|  |       }, | ||||||
|  |       "missingServerKey": { | ||||||
|  |         "message": "", | ||||||
|  |         "description": "" | ||||||
|  |       }, | ||||||
|  |       "global": { | ||||||
|  |         "heading": "", | ||||||
|  |         "description": "" | ||||||
|  |       }, | ||||||
|  |       "decode": { | ||||||
|  |         "heading": "", | ||||||
|  |         "description": "" | ||||||
|  |       }, | ||||||
|  |       "default": { | ||||||
|  |         "heading": "" | ||||||
|  |       }, | ||||||
|  |       "follow": { | ||||||
|  |         "heading": "" | ||||||
|  |       }, | ||||||
|  |       "follow_request": { | ||||||
|  |         "heading": "" | ||||||
|  |       }, | ||||||
|  |       "favourite": { | ||||||
|  |         "heading": "" | ||||||
|  |       }, | ||||||
|  |       "reblog": { | ||||||
|  |         "heading": "" | ||||||
|  |       }, | ||||||
|  |       "mention": { | ||||||
|  |         "heading": "" | ||||||
|  |       }, | ||||||
|  |       "poll": { | ||||||
|  |         "heading": "" | ||||||
|  |       }, | ||||||
|  |       "status": { | ||||||
|  |         "heading": "" | ||||||
|  |       }, | ||||||
|  |       "update": { | ||||||
|  |         "heading": "" | ||||||
|  |       }, | ||||||
|  |       "admin.sign_up": { | ||||||
|  |         "heading": "" | ||||||
|  |       }, | ||||||
|  |       "admin.report": { | ||||||
|  |         "heading": "" | ||||||
|  |       }, | ||||||
|  |       "howitworks": "" | ||||||
|  |     }, | ||||||
|  |     "root": { | ||||||
|  |       "announcements": { | ||||||
|  |         "content": { | ||||||
|  |           "unread": "", | ||||||
|  |           "read": "", | ||||||
|  |           "empty": "" | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |       "push": { | ||||||
|  |         "content_true": "Уключана", | ||||||
|  |         "content_false": "Адключана" | ||||||
|  |       }, | ||||||
|  |       "logout": { | ||||||
|  |         "button": "Выйсці", | ||||||
|  |         "alert": { | ||||||
|  |           "title": "Вы ўпэўнены, што хочаце выйсці?", | ||||||
|  |           "message": "Пасля выхаду з сістэмы неабходна зноў увайсці ў яе", | ||||||
|  |           "buttons": { | ||||||
|  |             "logout": "Выйсці" | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "settings": { | ||||||
|  |       "theme": { | ||||||
|  |         "heading": "Знешні выгляд", | ||||||
|  |         "options": { | ||||||
|  |           "auto": "", | ||||||
|  |           "light": "Светлы рэжым", | ||||||
|  |           "dark": "Цёмны рэжым" | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |       "darkTheme": { | ||||||
|  |         "heading": "Цёмная тэма", | ||||||
|  |         "options": { | ||||||
|  |           "lighter": "Прадвызначаная", | ||||||
|  |           "darker": "Сапраўдны чорны" | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |       "browser": { | ||||||
|  |         "heading": "Адкрыццё спасылак", | ||||||
|  |         "options": { | ||||||
|  |           "internal": "Унутры праграмы", | ||||||
|  |           "external": "Выкарыстоўваць сістэмны браўзер" | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |       "autoplayGifv": { | ||||||
|  |         "heading": "" | ||||||
|  |       }, | ||||||
|  |       "feedback": { | ||||||
|  |         "heading": "" | ||||||
|  |       }, | ||||||
|  |       "support": { | ||||||
|  |         "heading": "" | ||||||
|  |       }, | ||||||
|  |       "contact": { | ||||||
|  |         "heading": "" | ||||||
|  |       }, | ||||||
|  |       "version": "", | ||||||
|  |       "instanceVersion": "Версія Mastodon: v{{version}}" | ||||||
|  |     }, | ||||||
|  |     "switch": { | ||||||
|  |       "existing": "", | ||||||
|  |       "new": "Увайсці ў інстанс" | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "shared": { | ||||||
|  |     "account": { | ||||||
|  |       "actions": { | ||||||
|  |         "accessibilityLabel": "", | ||||||
|  |         "accessibilityHint": "" | ||||||
|  |       }, | ||||||
|  |       "followed_by": "", | ||||||
|  |       "privateNote": "", | ||||||
|  |       "moved": "", | ||||||
|  |       "created_at": "", | ||||||
|  |       "summary": { | ||||||
|  |         "statuses_count": "{{count}} допісаў" | ||||||
|  |       }, | ||||||
|  |       "toots": { | ||||||
|  |         "default": "Допісы", | ||||||
|  |         "all": "Допісы і адказы" | ||||||
|  |       }, | ||||||
|  |       "suspended": "" | ||||||
|  |     }, | ||||||
|  |     "accountInLists": { | ||||||
|  |       "name": "Спісы @{{username}}", | ||||||
|  |       "inLists": "У спісах", | ||||||
|  |       "notInLists": "Іншыя спісы" | ||||||
|  |     }, | ||||||
|  |     "attachments": { | ||||||
|  |       "name": "" | ||||||
|  |     }, | ||||||
|  |     "filter": { | ||||||
|  |       "name": "", | ||||||
|  |       "existed": "" | ||||||
|  |     }, | ||||||
|  |     "history": { | ||||||
|  |       "name": "Гісторыя рэдагавання" | ||||||
|  |     }, | ||||||
|  |     "report": { | ||||||
|  |       "name": "", | ||||||
|  |       "report": "", | ||||||
|  |       "forward": { | ||||||
|  |         "heading": "Ананімна пераслаць на аддалены сервер {{instance}}" | ||||||
|  |       }, | ||||||
|  |       "reasons": { | ||||||
|  |         "heading": "", | ||||||
|  |         "spam": "Гэта спам", | ||||||
|  |         "other": "Гэта нешта іншае", | ||||||
|  |         "violation": "Гэта парушае правілы сервера" | ||||||
|  |       }, | ||||||
|  |       "comment": { | ||||||
|  |         "heading": "" | ||||||
|  |       }, | ||||||
|  |       "violatedRules": { | ||||||
|  |         "heading": "Парушэнне правіл сервера" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "search": { | ||||||
|  |       "header": { | ||||||
|  |         "prefix": "Пошук", | ||||||
|  |         "placeholder": "..." | ||||||
|  |       }, | ||||||
|  |       "empty": { | ||||||
|  |         "general": "", | ||||||
|  |         "advanced": { | ||||||
|  |           "header": "", | ||||||
|  |           "example": { | ||||||
|  |             "account": "", | ||||||
|  |             "hashtag": "", | ||||||
|  |             "statusLink": "", | ||||||
|  |             "accountLink": "" | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         "trending": { | ||||||
|  |           "tags": "" | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |       "sections": { | ||||||
|  |         "accounts": "", | ||||||
|  |         "hashtags": "", | ||||||
|  |         "statuses": "" | ||||||
|  |       }, | ||||||
|  |       "notFound": "", | ||||||
|  |       "noResult": "" | ||||||
|  |     }, | ||||||
|  |     "toot": { | ||||||
|  |       "name": "", | ||||||
|  |       "remoteFetch": { | ||||||
|  |         "title": "", | ||||||
|  |         "message": "" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "users": { | ||||||
|  |       "accounts": { | ||||||
|  |         "following": "", | ||||||
|  |         "followers": "" | ||||||
|  |       }, | ||||||
|  |       "statuses": { | ||||||
|  |         "reblogged_by": "", | ||||||
|  |         "favourited_by": "" | ||||||
|  |       }, | ||||||
|  |       "resultIncomplete": "Вынікі з аддаленага інстанса няпоўныя" | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -8,7 +8,8 @@ | |||||||
|     "create": "Crea", |     "create": "Crea", | ||||||
|     "delete": "Esborra", |     "delete": "Esborra", | ||||||
|     "done": "Fet", |     "done": "Fet", | ||||||
|     "confirm": "Confirma" |     "confirm": "Confirma", | ||||||
|  |     "add": "Afegeix" | ||||||
|   }, |   }, | ||||||
|   "customEmoji": { |   "customEmoji": { | ||||||
|     "accessibilityLabel": "Emoji personalitzat {{emoji}}" |     "accessibilityLabel": "Emoji personalitzat {{emoji}}" | ||||||
|   | |||||||
| @@ -7,9 +7,7 @@ | |||||||
|     "button": "Inicia la sessió", |     "button": "Inicia la sessió", | ||||||
|     "information": { |     "information": { | ||||||
|       "name": "Nom", |       "name": "Nom", | ||||||
|       "accounts": "Usuaris", |       "description": "Descripció" | ||||||
|       "statuses": "Publicacions", |  | ||||||
|       "domains": "Universos" |  | ||||||
|     }, |     }, | ||||||
|     "disclaimer": { |     "disclaimer": { | ||||||
|       "base": "L'inici de sessió fa servir el navegador del sistema. Per tant, el tooot no accedirà a la informació del compte." |       "base": "L'inici de sessió fa servir el navegador del sistema. Per tant, el tooot no accedirà a la informació del compte." | ||||||
|   | |||||||
| @@ -26,15 +26,15 @@ | |||||||
|   "shared": { |   "shared": { | ||||||
|     "actioned": { |     "actioned": { | ||||||
|       "pinned": "Fixat", |       "pinned": "Fixat", | ||||||
|       "favourite": "{{name}} ha marcat la teva publicació com a favorita", |       "favourite": "{{name}} ha marcat com a favorita", | ||||||
|       "status": "{{name}} ha publicat", |       "status": "{{name}} ha publicat", | ||||||
|       "follow": "{{name}} et segueix", |       "follow": "{{name}} et segueix", | ||||||
|       "follow_request": "{{name}} ha sol·licitat seguir-te", |       "follow_request": "{{name}} ha sol·licitat seguir-te", | ||||||
|       "poll": "S'ha acabat una enquesta en què havies participat", |       "poll": "S'ha acabat l'enquesta", | ||||||
|       "reblog": { |       "reblog": { | ||||||
|         "default": "{{name}} ha impulsat", |         "default": "{{name}} ha impulsat", | ||||||
|         "myself": "He impulsat", |         "myself": "He impulsat", | ||||||
|         "notification": "{{name}} ha impulsat la teva publicació" |         "notification": "{{name}} ha impulsat" | ||||||
|       }, |       }, | ||||||
|       "update": "L'impuls ha sigut editat", |       "update": "L'impuls ha sigut editat", | ||||||
|       "admin.sign_up": "{{name}} s'ha unit a la instància", |       "admin.sign_up": "{{name}} s'ha unit a la instància", | ||||||
|   | |||||||
| @@ -11,7 +11,17 @@ | |||||||
|       "segments": { |       "segments": { | ||||||
|         "federated": "Federat", |         "federated": "Federat", | ||||||
|         "local": "Local", |         "local": "Local", | ||||||
|         "trending": "Tendència" |         "explore": "Explora" | ||||||
|  |       }, | ||||||
|  |       "exploring": { | ||||||
|  |         "heading": "Explorant", | ||||||
|  |         "trending": "Tendència", | ||||||
|  |         "followRemote": "Segueix la instància remota", | ||||||
|  |         "noTitle": "Sense títol", | ||||||
|  |         "errors": { | ||||||
|  |           "existed": "Ja segueixes aquesta instància remota.", | ||||||
|  |           "notAvailable": "Aquesta cronologia no és accessible públicament. Prova-ho amb una altra instància." | ||||||
|  |         } | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "notifications": { |     "notifications": { | ||||||
| @@ -101,7 +111,7 @@ | |||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "fontSize": { |     "fontSize": { | ||||||
|       "demo": "<p>Això és una publicació de prova😊. Pots escollir entre moltes opcions<br /><br />Aquesta configuració només afecta el contingut principal de les publicacions, però altres mides de la font.</p>", |       "demo": "<p>Això és una publicació de prova 😊. Pots escollir entre moltes opcions.<br /><br />Aquesta configuració només afecta el contingut principal de les publicacions, però altres mides de la font.</p>", | ||||||
|       "sizes": { |       "sizes": { | ||||||
|         "S": "S", |         "S": "S", | ||||||
|         "M": "M - Per defecte", |         "M": "M - Per defecte", | ||||||
| @@ -380,6 +390,7 @@ | |||||||
|         "accessibilityHint": "Pots silenciar, bloquejar, denunciar o compartir aquest usuari" |         "accessibilityHint": "Pots silenciar, bloquejar, denunciar o compartir aquest usuari" | ||||||
|       }, |       }, | ||||||
|       "followed_by": " et segueix", |       "followed_by": " et segueix", | ||||||
|  |       "privateNote": "Estableix una nota privada", | ||||||
|       "moved": "S'ha traslladat", |       "moved": "S'ha traslladat", | ||||||
|       "created_at": "Es va unir el dia {{date}}", |       "created_at": "Es va unir el dia {{date}}", | ||||||
|       "summary": { |       "summary": { | ||||||
|   | |||||||
| @@ -8,7 +8,8 @@ | |||||||
|     "create": "", |     "create": "", | ||||||
|     "delete": "", |     "delete": "", | ||||||
|     "done": "", |     "done": "", | ||||||
|     "confirm": "" |     "confirm": "", | ||||||
|  |     "add": "" | ||||||
|   }, |   }, | ||||||
|   "customEmoji": { |   "customEmoji": { | ||||||
|     "accessibilityLabel": "" |     "accessibilityLabel": "" | ||||||
|   | |||||||
| @@ -7,9 +7,7 @@ | |||||||
|     "button": "", |     "button": "", | ||||||
|     "information": { |     "information": { | ||||||
|       "name": "", |       "name": "", | ||||||
|       "accounts": "", |       "description": "" | ||||||
|       "statuses": "", |  | ||||||
|       "domains": "" |  | ||||||
|     }, |     }, | ||||||
|     "disclaimer": { |     "disclaimer": { | ||||||
|       "base": "" |       "base": "" | ||||||
|   | |||||||
| @@ -11,7 +11,17 @@ | |||||||
|       "segments": { |       "segments": { | ||||||
|         "federated": "", |         "federated": "", | ||||||
|         "local": "", |         "local": "", | ||||||
|         "trending": "" |         "explore": "" | ||||||
|  |       }, | ||||||
|  |       "exploring": { | ||||||
|  |         "heading": "", | ||||||
|  |         "trending": "", | ||||||
|  |         "followRemote": "", | ||||||
|  |         "noTitle": "", | ||||||
|  |         "errors": { | ||||||
|  |           "existed": "", | ||||||
|  |           "notAvailable": "" | ||||||
|  |         } | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "notifications": { |     "notifications": { | ||||||
| @@ -380,6 +390,7 @@ | |||||||
|         "accessibilityHint": "" |         "accessibilityHint": "" | ||||||
|       }, |       }, | ||||||
|       "followed_by": "", |       "followed_by": "", | ||||||
|  |       "privateNote": "", | ||||||
|       "moved": "", |       "moved": "", | ||||||
|       "created_at": "", |       "created_at": "", | ||||||
|       "summary": { |       "summary": { | ||||||
|   | |||||||
| @@ -8,7 +8,8 @@ | |||||||
|     "create": "Erstellen", |     "create": "Erstellen", | ||||||
|     "delete": "Löschen", |     "delete": "Löschen", | ||||||
|     "done": "Fertig", |     "done": "Fertig", | ||||||
|     "confirm": "Bestätigen" |     "confirm": "Bestätigen", | ||||||
|  |     "add": "Hinzufügen" | ||||||
|   }, |   }, | ||||||
|   "customEmoji": { |   "customEmoji": { | ||||||
|     "accessibilityLabel": "Eigenes Emoji {{emoji}}" |     "accessibilityLabel": "Eigenes Emoji {{emoji}}" | ||||||
|   | |||||||
| @@ -7,9 +7,7 @@ | |||||||
|     "button": "Login", |     "button": "Login", | ||||||
|     "information": { |     "information": { | ||||||
|       "name": "Name", |       "name": "Name", | ||||||
|       "accounts": "Konten", |       "description": "Beschreibung" | ||||||
|       "statuses": "Tröts", |  | ||||||
|       "domains": "Domains" |  | ||||||
|     }, |     }, | ||||||
|     "disclaimer": { |     "disclaimer": { | ||||||
|       "base": "Der Login erfolgt über den Browser, sodass deine Kontoinformationen für die App nicht sichtbar sind." |       "base": "Der Login erfolgt über den Browser, sodass deine Kontoinformationen für die App nicht sichtbar sind." | ||||||
|   | |||||||
| @@ -11,7 +11,17 @@ | |||||||
|       "segments": { |       "segments": { | ||||||
|         "federated": "Föderiert", |         "federated": "Föderiert", | ||||||
|         "local": "Lokal", |         "local": "Lokal", | ||||||
|         "trending": "Im Trend" |         "explore": "Entdecken" | ||||||
|  |       }, | ||||||
|  |       "exploring": { | ||||||
|  |         "heading": "Entdecken", | ||||||
|  |         "trending": "Angesagt", | ||||||
|  |         "followRemote": "Remote-Instanz folgen", | ||||||
|  |         "noTitle": "Kein Titel", | ||||||
|  |         "errors": { | ||||||
|  |           "existed": "", | ||||||
|  |           "notAvailable": "" | ||||||
|  |         } | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "notifications": { |     "notifications": { | ||||||
| @@ -380,6 +390,7 @@ | |||||||
|         "accessibilityHint": "Du kannst diesen Benutzer stummschalten, blockieren, melden oder teilen" |         "accessibilityHint": "Du kannst diesen Benutzer stummschalten, blockieren, melden oder teilen" | ||||||
|       }, |       }, | ||||||
|       "followed_by": " folgt dir", |       "followed_by": " folgt dir", | ||||||
|  |       "privateNote": "Notiz privat erstellen", | ||||||
|       "moved": "Benutzer umgezogen", |       "moved": "Benutzer umgezogen", | ||||||
|       "created_at": "Registriert am: {{date}}", |       "created_at": "Registriert am: {{date}}", | ||||||
|       "summary": { |       "summary": { | ||||||
|   | |||||||
| @@ -8,7 +8,8 @@ | |||||||
|     "create": "Δημιουργία", |     "create": "Δημιουργία", | ||||||
|     "delete": "Διαγραφή", |     "delete": "Διαγραφή", | ||||||
|     "done": "Ολοκλήρωση", |     "done": "Ολοκλήρωση", | ||||||
|     "confirm": "Επιβεβαίωση" |     "confirm": "Επιβεβαίωση", | ||||||
|  |     "add": "" | ||||||
|   }, |   }, | ||||||
|   "customEmoji": { |   "customEmoji": { | ||||||
|     "accessibilityLabel": "Προσαρμοσμένα emoji {{emoji}}" |     "accessibilityLabel": "Προσαρμοσμένα emoji {{emoji}}" | ||||||
|   | |||||||
| @@ -7,9 +7,7 @@ | |||||||
|     "button": "Σύνδεση", |     "button": "Σύνδεση", | ||||||
|     "information": { |     "information": { | ||||||
|       "name": "Όνομα", |       "name": "Όνομα", | ||||||
|       "accounts": "Χρήστες", |       "description": "Περιγραφή" | ||||||
|       "statuses": "Αναρτήσεις", |  | ||||||
|       "domains": "Σύμπαντα" |  | ||||||
|     }, |     }, | ||||||
|     "disclaimer": { |     "disclaimer": { | ||||||
|       "base": "Η διαδικασία της σύνδεσης χρησιμοποιεί το πρόγραμμα περιήγησης του συστήματος. Οι πληροφορίες του λογαριασμού σας δεν είναι ορατές στην εφαρμογή tooot." |       "base": "Η διαδικασία της σύνδεσης χρησιμοποιεί το πρόγραμμα περιήγησης του συστήματος. Οι πληροφορίες του λογαριασμού σας δεν είναι ορατές στην εφαρμογή tooot." | ||||||
|   | |||||||
| @@ -11,7 +11,17 @@ | |||||||
|       "segments": { |       "segments": { | ||||||
|         "federated": "Ομοσπονδιακή", |         "federated": "Ομοσπονδιακή", | ||||||
|         "local": "Τοπική", |         "local": "Τοπική", | ||||||
|         "trending": "Δημοφιλή" |         "explore": "" | ||||||
|  |       }, | ||||||
|  |       "exploring": { | ||||||
|  |         "heading": "", | ||||||
|  |         "trending": "", | ||||||
|  |         "followRemote": "", | ||||||
|  |         "noTitle": "", | ||||||
|  |         "errors": { | ||||||
|  |           "existed": "", | ||||||
|  |           "notAvailable": "" | ||||||
|  |         } | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "notifications": { |     "notifications": { | ||||||
| @@ -380,6 +390,7 @@ | |||||||
|         "accessibilityHint": "Μπορείτε να σιγάσετε, να αποκλείσετε, να αναφέρετε ή να κοινοποιήσετε αυτό το χρήστη" |         "accessibilityHint": "Μπορείτε να σιγάσετε, να αποκλείσετε, να αναφέρετε ή να κοινοποιήσετε αυτό το χρήστη" | ||||||
|       }, |       }, | ||||||
|       "followed_by": " σας ακολουθεί", |       "followed_by": " σας ακολουθεί", | ||||||
|  |       "privateNote": "", | ||||||
|       "moved": "Ο χρήστης μεταφέρθηκε", |       "moved": "Ο χρήστης μεταφέρθηκε", | ||||||
|       "created_at": "Δημιουργία λογαριασμού: {{date}}", |       "created_at": "Δημιουργία λογαριασμού: {{date}}", | ||||||
|       "summary": { |       "summary": { | ||||||
|   | |||||||
| @@ -8,7 +8,8 @@ | |||||||
|     "create": "Create", |     "create": "Create", | ||||||
|     "delete": "Delete", |     "delete": "Delete", | ||||||
|     "done": "Done", |     "done": "Done", | ||||||
|     "confirm": "Confirm" |     "confirm": "Confirm", | ||||||
|  |     "add": "Add" | ||||||
|   }, |   }, | ||||||
|   "customEmoji": { |   "customEmoji": { | ||||||
|     "accessibilityLabel": "Custom emoji {{emoji}}" |     "accessibilityLabel": "Custom emoji {{emoji}}" | ||||||
|   | |||||||
| @@ -7,9 +7,7 @@ | |||||||
|     "button": "Login", |     "button": "Login", | ||||||
|     "information": { |     "information": { | ||||||
|       "name": "Name", |       "name": "Name", | ||||||
|       "accounts": "Users", |       "description": "Description" | ||||||
|       "statuses": "Toots", |  | ||||||
|       "domains": "Universes" |  | ||||||
|     }, |     }, | ||||||
|     "disclaimer": { |     "disclaimer": { | ||||||
|       "base": "Logging in process uses system browser that, your account information won't be visible to tooot app." |       "base": "Logging in process uses system browser that, your account information won't be visible to tooot app." | ||||||
|   | |||||||
| @@ -11,7 +11,17 @@ | |||||||
|       "segments": { |       "segments": { | ||||||
|         "federated": "Federated", |         "federated": "Federated", | ||||||
|         "local": "Local", |         "local": "Local", | ||||||
|         "trending": "Trending" |         "explore": "Explore" | ||||||
|  |       }, | ||||||
|  |       "exploring": { | ||||||
|  |         "heading": "Exploring", | ||||||
|  |         "trending": "Trending", | ||||||
|  |         "followRemote": "Follow remote instance", | ||||||
|  |         "noTitle": "No Title", | ||||||
|  |         "errors": { | ||||||
|  |           "existed": "You are already following this remote instance.", | ||||||
|  |           "notAvailable": "This instance's timeline is not public accessible. Please try another instance." | ||||||
|  |         } | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "notifications": { |     "notifications": { | ||||||
| @@ -380,6 +390,7 @@ | |||||||
|         "accessibilityHint": "You can mute, block, report or share this user" |         "accessibilityHint": "You can mute, block, report or share this user" | ||||||
|       }, |       }, | ||||||
|       "followed_by": " is following you", |       "followed_by": " is following you", | ||||||
|  |       "privateNote": "Set private note", | ||||||
|       "moved": "User moved", |       "moved": "User moved", | ||||||
|       "created_at": "Joined: {{date}}", |       "created_at": "Joined: {{date}}", | ||||||
|       "summary": { |       "summary": { | ||||||
|   | |||||||
| @@ -8,7 +8,8 @@ | |||||||
|     "create": "Crear", |     "create": "Crear", | ||||||
|     "delete": "Borrar", |     "delete": "Borrar", | ||||||
|     "done": "Hecho", |     "done": "Hecho", | ||||||
|     "confirm": "Confirmar" |     "confirm": "Confirmar", | ||||||
|  |     "add": "Añadir" | ||||||
|   }, |   }, | ||||||
|   "customEmoji": { |   "customEmoji": { | ||||||
|     "accessibilityLabel": "Emoji personalizado {{emoji}}" |     "accessibilityLabel": "Emoji personalizado {{emoji}}" | ||||||
|   | |||||||
| @@ -7,9 +7,7 @@ | |||||||
|     "button": "Iniciar sesión", |     "button": "Iniciar sesión", | ||||||
|     "information": { |     "information": { | ||||||
|       "name": "Nombre", |       "name": "Nombre", | ||||||
|       "accounts": "Usuarios", |       "description": "Descripción" | ||||||
|       "statuses": "Toots", |  | ||||||
|       "domains": "Universos" |  | ||||||
|     }, |     }, | ||||||
|     "disclaimer": { |     "disclaimer": { | ||||||
|       "base": "El inicio de sesión usa el navegador del sistema, y la información de la cuenta no será visible para tooot." |       "base": "El inicio de sesión usa el navegador del sistema, y la información de la cuenta no será visible para tooot." | ||||||
|   | |||||||
| @@ -11,7 +11,17 @@ | |||||||
|       "segments": { |       "segments": { | ||||||
|         "federated": "Federado", |         "federated": "Federado", | ||||||
|         "local": "Local", |         "local": "Local", | ||||||
|         "trending": "Tendencia" |         "explore": "Explorar" | ||||||
|  |       }, | ||||||
|  |       "exploring": { | ||||||
|  |         "heading": "Explorando", | ||||||
|  |         "trending": "Tendencia", | ||||||
|  |         "followRemote": "Seguir instancia remota", | ||||||
|  |         "noTitle": "Sin título", | ||||||
|  |         "errors": { | ||||||
|  |           "existed": "Ya estás siguiendo esta instancia remota.", | ||||||
|  |           "notAvailable": "Esta cronología no es accesible públicamente. Por favor, prueba con otra instancia." | ||||||
|  |         } | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "notifications": { |     "notifications": { | ||||||
| @@ -380,6 +390,7 @@ | |||||||
|         "accessibilityHint": "Puedes silenciar, bloquear, denunciar o compartir este usuario" |         "accessibilityHint": "Puedes silenciar, bloquear, denunciar o compartir este usuario" | ||||||
|       }, |       }, | ||||||
|       "followed_by": " te sigue", |       "followed_by": " te sigue", | ||||||
|  |       "privateNote": "Establecer nota privada", | ||||||
|       "moved": "Se ha trasladado", |       "moved": "Se ha trasladado", | ||||||
|       "created_at": "Se unió el {{date}}", |       "created_at": "Se unió el {{date}}", | ||||||
|       "summary": { |       "summary": { | ||||||
|   | |||||||
| @@ -8,7 +8,8 @@ | |||||||
|     "create": "Sortu", |     "create": "Sortu", | ||||||
|     "delete": "Ezabatu", |     "delete": "Ezabatu", | ||||||
|     "done": "Eginda", |     "done": "Eginda", | ||||||
|     "confirm": "Berretsi" |     "confirm": "Berretsi", | ||||||
|  |     "add": "Gehitu" | ||||||
|   }, |   }, | ||||||
|   "customEmoji": { |   "customEmoji": { | ||||||
|     "accessibilityLabel": "Emoji pertsonalizatua {{emoji}}" |     "accessibilityLabel": "Emoji pertsonalizatua {{emoji}}" | ||||||
|   | |||||||
| @@ -7,9 +7,7 @@ | |||||||
|     "button": "Saioa hasi", |     "button": "Saioa hasi", | ||||||
|     "information": { |     "information": { | ||||||
|       "name": "Izena", |       "name": "Izena", | ||||||
|       "accounts": "Erabiltzaileak", |       "description": "Deskribapena" | ||||||
|       "statuses": "Tutak", |  | ||||||
|       "domains": "Domeinuak" |  | ||||||
|     }, |     }, | ||||||
|     "disclaimer": { |     "disclaimer": { | ||||||
|       "base": "Saioa hasteko prozesuak sistemako nabigatzailea erabiltzen du, beraz, zure kontuko informazioa ez da tooot aplikazioarentzat ikusgarri izango." |       "base": "Saioa hasteko prozesuak sistemako nabigatzailea erabiltzen du, beraz, zure kontuko informazioa ez da tooot aplikazioarentzat ikusgarri izango." | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|   "HTML": { |   "HTML": { | ||||||
|     "accessibilityHint": "", |     "accessibilityHint": "Sakatu edukia zabaldu edo ixteko", | ||||||
|     "expanded": "{{hint}}{{moreLines}}", |     "expanded": "{{hint}}{{moreLines}}", | ||||||
|     "moreLines": " ({{count}} lerro gehiago)", |     "moreLines": " ({{count}} lerro gehiago)", | ||||||
|     "defaultHint": "Tut luzea" |     "defaultHint": "Tut luzea" | ||||||
|   | |||||||
| @@ -48,119 +48,119 @@ | |||||||
|         "accessibilityLabel": "Tut hau bultzatu", |         "accessibilityLabel": "Tut hau bultzatu", | ||||||
|         "function": "Tuta bultzatu", |         "function": "Tuta bultzatu", | ||||||
|         "options": { |         "options": { | ||||||
|           "title": "", |           "title": "Aukeratu bultzadaren ikuspena", | ||||||
|           "public": "", |           "public": "Bultzada publikoa", | ||||||
|           "unlisted": "" |           "unlisted": "Zerrendatik kendu bultzada" | ||||||
|         } |         } | ||||||
|       }, |       }, | ||||||
|       "favourited": { |       "favourited": { | ||||||
|         "accessibilityLabel": "", |         "accessibilityLabel": "Gehitu tut hau gogokoenetara", | ||||||
|         "function": "" |         "function": "Gehitu tuta gogokoenetara" | ||||||
|       }, |       }, | ||||||
|       "bookmarked": { |       "bookmarked": { | ||||||
|         "accessibilityLabel": "", |         "accessibilityLabel": "Gehitu tut hau laster-marketara", | ||||||
|         "function": "" |         "function": "Gehitu tuta laster-marketara" | ||||||
|       }, |       }, | ||||||
|       "openReport": "" |       "openReport": "Ireki txostena" | ||||||
|     }, |     }, | ||||||
|     "actionsUsers": { |     "actionsUsers": { | ||||||
|       "reblogged_by": { |       "reblogged_by": { | ||||||
|         "accessibilityLabel": "", |         "accessibilityLabel": "{{count}} erabiltzailek bultzatu dute tut hau", | ||||||
|         "accessibilityHint": "", |         "accessibilityHint": "Sakatu erabiltzaileak ezagutzeko", | ||||||
|         "text": "" |         "text": "$t(screenTabs:shared.users.statuses.reblogged_by)" | ||||||
|       }, |       }, | ||||||
|       "favourited_by": { |       "favourited_by": { | ||||||
|         "accessibilityLabel": "", |         "accessibilityLabel": "{{count}} erabiltzailek gogokoenetara gehitu dute tut hau", | ||||||
|         "accessibilityHint": "", |         "accessibilityHint": "Sakatu erabiltzaileak ezagutzeko", | ||||||
|         "text": "" |         "text": "$t(screenTabs:shared.users.statuses.favourited_by)" | ||||||
|       }, |       }, | ||||||
|       "history": { |       "history": { | ||||||
|         "accessibilityLabel": "", |         "accessibilityLabel": "Tut hau {{count}} aldiz editatua izan da", | ||||||
|         "accessibilityHint": "", |         "accessibilityHint": "Sakatu editatzeen historia osoa ikusteko", | ||||||
|         "text_one": "", |         "text_one": "Editatze {{count}}", | ||||||
|         "text_other": "" |         "text_other": "{{count}} editatze" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "attachment": { |     "attachment": { | ||||||
|       "sensitive": { |       "sensitive": { | ||||||
|         "button": "" |         "button": "Erakutsi eduki hunkigarria" | ||||||
|       }, |       }, | ||||||
|       "unsupported": { |       "unsupported": { | ||||||
|         "text": "", |         "text": "Errorea kargatzean", | ||||||
|         "button": "" |         "button": "Saiatu urrutiko estekarekin" | ||||||
|       }, |       }, | ||||||
|       "altText": "" |       "altText": "Testu alternatiboa" | ||||||
|     }, |     }, | ||||||
|     "avatar": { |     "avatar": { | ||||||
|       "accessibilityLabel": "", |       "accessibilityLabel": "{{name}}-(r)en abatarra", | ||||||
|       "accessibilityHint": "" |       "accessibilityHint": "Sakatu {{name}}-(r)en orrira joateko" | ||||||
|     }, |     }, | ||||||
|     "content": { |     "content": { | ||||||
|       "expandHint": "" |       "expandHint": "Ezkutuko edukia" | ||||||
|     }, |     }, | ||||||
|     "filtered": { |     "filtered": { | ||||||
|       "reveal": "", |       "reveal": "Erakutsi hala ere", | ||||||
|       "match_v1": "", |       "match_v1": "Iragazia: {{phrase}}.", | ||||||
|       "match_v2_one": "", |       "match_v2_one": "{{filters}}-(e)k iragazia.", | ||||||
|       "match_v2_other": "" |       "match_v2_other": "{{count}} iragazkiek iragaziak, {{filters}}." | ||||||
|     }, |     }, | ||||||
|     "fullConversation": "", |     "fullConversation": "Irakurri elkarrizketak", | ||||||
|     "translate": { |     "translate": { | ||||||
|       "default": "", |       "default": "Itzuli", | ||||||
|       "succeed": "", |       "succeed": "{{provider}}-(e)k itzulia {{source}}-(e)tik", | ||||||
|       "failed": "", |       "failed": "Itzulpenak huts egin du", | ||||||
|       "source_not_supported": "", |       "source_not_supported": "Tutaren hizkuntza ez da bateragarria", | ||||||
|       "target_not_supported": "" |       "target_not_supported": "Helburuko hizkuntza ez da bateragarria" | ||||||
|     }, |     }, | ||||||
|     "header": { |     "header": { | ||||||
|       "shared": { |       "shared": { | ||||||
|         "account": { |         "account": { | ||||||
|           "name": { |           "name": { | ||||||
|             "accessibilityHint": "" |             "accessibilityHint": "Erabiltzailearen bistaratutako izena" | ||||||
|           }, |           }, | ||||||
|           "account": { |           "account": { | ||||||
|             "accessibilityHint": "" |             "accessibilityHint": "Erabiltzailearen kontua" | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         "application": "", |         "application": "{{application}}-(e)tik", | ||||||
|         "edited": { |         "edited": { | ||||||
|           "accessibilityLabel": "" |           "accessibilityLabel": "Tuta editatuta" | ||||||
|         }, |         }, | ||||||
|         "muted": { |         "muted": { | ||||||
|           "accessibilityLabel": "" |           "accessibilityLabel": "Tuta mutututa" | ||||||
|         }, |         }, | ||||||
|         "replies": "", |         "replies": "<0 />-(r)ekiko erantzuna", | ||||||
|         "visibility": { |         "visibility": { | ||||||
|           "direct": { |           "direct": { | ||||||
|             "accessibilityLabel": "" |             "accessibilityLabel": "Tuta mezu zuzen bat da" | ||||||
|           }, |           }, | ||||||
|           "private": { |           "private": { | ||||||
|             "accessibilityLabel": "" |             "accessibilityLabel": "Tuta jarraitzaileentzako soilik da ikusgarri" | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|       }, |       }, | ||||||
|       "conversation": { |       "conversation": { | ||||||
|         "withAccounts": "", |         "withAccounts": "Honekin/Hauekin", | ||||||
|         "delete": { |         "delete": { | ||||||
|           "function": "" |           "function": "Ezabatu mezu zuzena" | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "poll": { |     "poll": { | ||||||
|       "meta": { |       "meta": { | ||||||
|         "button": { |         "button": { | ||||||
|           "vote": "", |           "vote": "Bozkatu", | ||||||
|           "refresh": "" |           "refresh": "Eguneratu" | ||||||
|         }, |         }, | ||||||
|         "count": { |         "count": { | ||||||
|           "voters_one": "", |           "voters_one": "Erabiltzaile {{count}}ek bozkatu du", | ||||||
|           "voters_other": "", |           "voters_other": "{{count}} erabiltzailek bozkatu dute", | ||||||
|           "votes_one": "", |           "votes_one": "Boto {{count}}", | ||||||
|           "votes_other": "" |           "votes_other": "{{count}} boto" | ||||||
|         }, |         }, | ||||||
|         "expiration": { |         "expiration": { | ||||||
|           "expired": "", |           "expired": "Bozketa amaitua", | ||||||
|           "until": "" |           "until": "<0 /> amaitzeko" | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -1,10 +1,10 @@ | |||||||
| { | { | ||||||
|   "screenshot": { |   "screenshot": { | ||||||
|     "title": "", |     "title": "Pribatutasun-babesa", | ||||||
|     "message": "" |     "message": "Mesedez, ez ezagutarazi besteen identitatea, adibidez: erabiltzailea, abatarra, etab. Eskerrik asko!" | ||||||
|   }, |   }, | ||||||
|   "localCorrupt": { |   "localCorrupt": { | ||||||
|     "message": "" |     "message": "Saioa iraungita, mesedez, hasi saioa berriro" | ||||||
|   }, |   }, | ||||||
|   "pushError": { |   "pushError": { | ||||||
|     "message": "", |     "message": "", | ||||||
|   | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user