mirror of
https://github.com/tooot-app/app
synced 2025-06-01 19:59:13 +02:00
Merge branch 'main' into release
This commit is contained in:
commit
2a376b3d92
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,129 +1,86 @@
|
|||||||
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:+'`
|
||||||
*
|
*
|
||||||
* The international variant includes ICU i18n library and necessary data
|
* The international variant includes ICU i18n library and necessary data
|
||||||
* allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
|
* allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
|
||||||
* give correct results when using with locales other than en-US. Note that
|
* give correct results when using with locales other than en-US. Note that
|
||||||
* this variant is about 6MiB larger per architecture than default.
|
* this variant is about 6MiB larger per architecture than default.
|
||||||
*/
|
*/
|
||||||
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) {
|
// If you opted-in for the New Architecture, we enable the Fabric Renderer.
|
||||||
super(activity, mainComponentName);
|
DefaultNewArchitectureEntryPoint.getFabricEnabled(), // fabricEnabled
|
||||||
}
|
// If you opted-in for the New Architecture, we enable Concurrent React (i.e. React 18).
|
||||||
@Override
|
DefaultNewArchitectureEntryPoint.getConcurrentReactEnabled() // concurrentRootEnabled
|
||||||
protected ReactRootView createRootView() {
|
);
|
||||||
ReactRootView reactRootView = new ReactRootView(getContext());
|
|
||||||
// If you opted-in for the New Architecture, we enable the Fabric Renderer.
|
|
||||||
reactRootView.setIsFabric(BuildConfig.IS_NEW_ARCHITECTURE_ENABLED);
|
|
||||||
return reactRootView;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean isConcurrentRootEnabled() {
|
|
||||||
// If you opted-in for the New Architecture, we enable Concurrent Root (i.e. React 18).
|
|
||||||
// More on this on https://reactjs.org/blog/2022/03/29/react-v18.html
|
|
||||||
return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -1,92 +1,92 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-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>CFBundleAllowMixedLocalizations</key>
|
<key>CADisableMinimumFrameDurationOnPhone</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>CFBundleDevelopmentRegion</key>
|
<key>CFBundleAllowMixedLocalizations</key>
|
||||||
<string>en</string>
|
<true/>
|
||||||
<key>CFBundleDisplayName</key>
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
<string>tooot</string>
|
<string>en</string>
|
||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleDisplayName</key>
|
||||||
<string>$(EXECUTABLE_NAME)</string>
|
<string>tooot</string>
|
||||||
<key>CFBundleIdentifier</key>
|
<key>CFBundleExecutable</key>
|
||||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
<string>$(EXECUTABLE_NAME)</string>
|
||||||
<key>CFBundleInfoDictionaryVersion</key>
|
<key>CFBundleIdentifier</key>
|
||||||
<string>6.0</string>
|
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||||
<key>CFBundleName</key>
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
<string>$(PRODUCT_NAME)</string>
|
<string>6.0</string>
|
||||||
<key>CFBundlePackageType</key>
|
<key>CFBundleName</key>
|
||||||
<string>APPL</string>
|
<string>$(PRODUCT_NAME)</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>0.2</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>????</string>
|
<string>0.2</string>
|
||||||
<key>CFBundleURLTypes</key>
|
<key>CFBundleSignature</key>
|
||||||
<array>
|
<string>????</string>
|
||||||
<dict>
|
<key>CFBundleURLTypes</key>
|
||||||
<key>CFBundleTypeRole</key>
|
<array>
|
||||||
<string>Editor</string>
|
<dict>
|
||||||
<key>CFBundleURLName</key>
|
<key>CFBundleTypeRole</key>
|
||||||
<string>com.xmflsct.app.tooot</string>
|
<string>Editor</string>
|
||||||
<key>CFBundleURLSchemes</key>
|
<key>CFBundleURLName</key>
|
||||||
<array>
|
<string>com.xmflsct.app.tooot</string>
|
||||||
<string>tooot-share</string>
|
<key>CFBundleURLSchemes</key>
|
||||||
<string>tooot</string>
|
<array>
|
||||||
</array>
|
<string>tooot-share</string>
|
||||||
</dict>
|
<string>tooot</string>
|
||||||
</array>
|
</array>
|
||||||
<key>CFBundleVersion</key>
|
</dict>
|
||||||
<string>2102022230</string>
|
</array>
|
||||||
<key>ITSAppUsesNonExemptEncryption</key>
|
<key>CFBundleVersion</key>
|
||||||
<false/>
|
<string>2102022230</string>
|
||||||
<key>LSApplicationCategoryType</key>
|
<key>ITSAppUsesNonExemptEncryption</key>
|
||||||
<string>public.app-category.social-networking</string>
|
<false/>
|
||||||
<key>LSRequiresIPhoneOS</key>
|
<key>LSApplicationCategoryType</key>
|
||||||
<true/>
|
<string>public.app-category.social-networking</string>
|
||||||
<key>NSAppTransportSecurity</key>
|
<key>LSRequiresIPhoneOS</key>
|
||||||
<dict>
|
<true/>
|
||||||
<key>NSExceptionDomains</key>
|
<key>NSAppTransportSecurity</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>localhost</key>
|
<key>NSExceptionDomains</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>NSExceptionAllowsInsecureHTTPLoads</key>
|
<key>localhost</key>
|
||||||
<true/>
|
<dict>
|
||||||
</dict>
|
<key>NSExceptionAllowsInsecureHTTPLoads</key>
|
||||||
</dict>
|
<true/>
|
||||||
</dict>
|
</dict>
|
||||||
<key>NSLocationWhenInUseUsageDescription</key>
|
</dict>
|
||||||
<string></string>
|
</dict>
|
||||||
<key>NSMainNibFile</key>
|
<key>NSLocationWhenInUseUsageDescription</key>
|
||||||
<string>LaunchScreen</string>
|
<string></string>
|
||||||
<key>NSMicrophoneUsageDescription</key>
|
<key>NSMainNibFile</key>
|
||||||
<string>$(PRODUCT_NAME) DOES NOT need microphone permission. Please reject this request.</string>
|
<string>LaunchScreen</string>
|
||||||
<key>NSPhotoLibraryAddUsageDescription</key>
|
<key>NSMicrophoneUsageDescription</key>
|
||||||
<string>Allow $(PRODUCT_NAME) to save an image to your camera roll</string>
|
<string>$(PRODUCT_NAME) DOES NOT need microphone permission. Please reject this request.</string>
|
||||||
<key>NSPhotoLibraryUsageDescription</key>
|
<key>NSPhotoLibraryAddUsageDescription</key>
|
||||||
<string>Allow $(PRODUCT_NAME) to access your camera roll to attach photos or videos to your toot</string>
|
<string>Allow $(PRODUCT_NAME) to save an image to your camera roll</string>
|
||||||
<key>UILaunchStoryboardName</key>
|
<key>NSPhotoLibraryUsageDescription</key>
|
||||||
<string>SplashScreen</string>
|
<string>Allow $(PRODUCT_NAME) to access your camera roll to attach photos or videos to your toot</string>
|
||||||
<key>UIRequiredDeviceCapabilities</key>
|
<key>UILaunchStoryboardName</key>
|
||||||
<array>
|
<string>SplashScreen</string>
|
||||||
<string>armv7</string>
|
<key>UIRequiredDeviceCapabilities</key>
|
||||||
</array>
|
<array>
|
||||||
<key>UIRequiresFullScreen</key>
|
<string>armv7</string>
|
||||||
<false/>
|
</array>
|
||||||
<key>UIStatusBarHidden</key>
|
<key>UIRequiresFullScreen</key>
|
||||||
<true/>
|
<false/>
|
||||||
<key>UISupportedInterfaceOrientations</key>
|
<key>UIStatusBarHidden</key>
|
||||||
<array>
|
<true/>
|
||||||
<string>UIInterfaceOrientationPortrait</string>
|
<key>UISupportedInterfaceOrientations</key>
|
||||||
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
<array>
|
||||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
<string>UIInterfaceOrientationPortrait</string>
|
||||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
||||||
</array>
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
<key>UIUserInterfaceStyle</key>
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
<string>Automatic</string>
|
</array>
|
||||||
<key>UIViewControllerBasedStatusBarAppearance</key>
|
<key>UIUserInterfaceStyle</key>
|
||||||
<false/>
|
<string>Automatic</string>
|
||||||
<key>CADisableMinimumFrameDurationOnPhone</key>
|
<key>UIViewControllerBasedStatusBarAppearance</key>
|
||||||
<true/>
|
<false/>
|
||||||
</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={styles.overlay}>
|
<View
|
||||||
|
style={{
|
||||||
|
position: 'absolute',
|
||||||
|
width: '100%',
|
||||||
|
height: '100%',
|
||||||
|
flex: 1,
|
||||||
|
justifyContent: 'center',
|
||||||
|
alignItems: 'center'
|
||||||
|
}}
|
||||||
|
>
|
||||||
{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,30 +22,33 @@ 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}
|
sources={{
|
||||||
sources={{
|
default: { uri: image.preview_url },
|
||||||
default: { uri: image.preview_url },
|
remote: { uri: image.remote_url },
|
||||||
remote: { uri: image.remote_url },
|
blurhash: image.blurhash
|
||||||
blurhash: image.blurhash
|
}}
|
||||||
}}
|
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
|
||||||
? 2 / 3
|
? height / width > 3 / 2
|
||||||
: (width || 1) / (height || 1) > 4
|
? 2 / 3
|
||||||
? 4
|
: width / height > 4
|
||||||
: (width || 1) / (height || 1)
|
? 4
|
||||||
|
: 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,97 +88,105 @@ const TimelineAttachment = () => {
|
|||||||
navigation.navigate('Screen-ImagesViewer', { imageUrls, id })
|
navigation.navigate('Screen-ImagesViewer', { imageUrls, id })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const mapAttachmentType = (attachment: Mastodon.Attachment, index: number) => {
|
||||||
|
switch (attachment.type) {
|
||||||
|
case 'image':
|
||||||
|
return (
|
||||||
|
<AttachmentImage
|
||||||
|
total={status.media_attachments.length}
|
||||||
|
index={index}
|
||||||
|
sensitiveShown={sensitiveShown}
|
||||||
|
image={attachment}
|
||||||
|
navigateToImagesViewer={navigateToImagesViewer}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
case 'video':
|
||||||
|
return (
|
||||||
|
<AttachmentVideo
|
||||||
|
total={status.media_attachments.length}
|
||||||
|
index={index}
|
||||||
|
sensitiveShown={sensitiveShown}
|
||||||
|
video={attachment}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
case 'gifv':
|
||||||
|
return (
|
||||||
|
<AttachmentVideo
|
||||||
|
total={status.media_attachments.length}
|
||||||
|
index={index}
|
||||||
|
sensitiveShown={sensitiveShown}
|
||||||
|
video={attachment}
|
||||||
|
gifv
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
case 'audio':
|
||||||
|
return (
|
||||||
|
<AttachmentAudio
|
||||||
|
total={status.media_attachments.length}
|
||||||
|
index={index}
|
||||||
|
sensitiveShown={sensitiveShown}
|
||||||
|
audio={attachment}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
default:
|
||||||
|
if (
|
||||||
|
// https://docs.expo.dev/versions/unversioned/sdk/image/#supported-image-formats
|
||||||
|
attachment.preview_url?.match(/.(?:a?png|jpe?g|webp|avif|heic|gif|svg|ico|icns)$/i) ||
|
||||||
|
attachment.remote_url?.match(/.(?:a?png|jpe?g|webp|avif|heic|gif|svg|ico|icns)$/i)
|
||||||
|
) {
|
||||||
|
return (
|
||||||
|
<AttachmentImage
|
||||||
|
total={status.media_attachments.length}
|
||||||
|
index={index}
|
||||||
|
sensitiveShown={sensitiveShown}
|
||||||
|
image={attachment as unknown as Mastodon.AttachmentImage}
|
||||||
|
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 {
|
||||||
|
return (
|
||||||
|
<AttachmentUnsupported
|
||||||
|
total={status.media_attachments.length}
|
||||||
|
index={index}
|
||||||
|
sensitiveShown={sensitiveShown}
|
||||||
|
attachment={attachment}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (spoilerHidden || disableDetails) return null
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<View>
|
<View style={{ marginTop: StyleConstants.Spacing.M, ...(isLargeDevice && { maxWidth: 375 }) }}>
|
||||||
<View
|
<View style={{ gap: StyleConstants.Spacing.XS }}>
|
||||||
style={{
|
{chunk(status.media_attachments, 2).map((chunk, chunkIndex) => (
|
||||||
marginTop: StyleConstants.Spacing.S,
|
<View
|
||||||
flex: 1,
|
key={chunkIndex}
|
||||||
flexDirection: 'row',
|
style={{
|
||||||
flexWrap: 'wrap',
|
flex: 1,
|
||||||
justifyContent: 'center',
|
flexDirection: 'row',
|
||||||
alignContent: 'stretch'
|
flexWrap: 'wrap',
|
||||||
}}
|
justifyContent: 'center',
|
||||||
>
|
alignContent: 'stretch',
|
||||||
{status.media_attachments.map((attachment, index) => {
|
gap: StyleConstants.Spacing.XS
|
||||||
switch (attachment.type) {
|
}}
|
||||||
case 'image':
|
>
|
||||||
return (
|
{chunk.map((a, aIndex) => (
|
||||||
<AttachmentImage
|
<Fragment key={aIndex}>{mapAttachmentType(a, chunkIndex * 2 + aIndex)}</Fragment>
|
||||||
key={index}
|
))}
|
||||||
total={status.media_attachments.length}
|
</View>
|
||||||
index={index}
|
))}
|
||||||
sensitiveShown={sensitiveShown}
|
|
||||||
image={attachment}
|
|
||||||
navigateToImagesViewer={navigateToImagesViewer}
|
|
||||||
/>
|
|
||||||
)
|
|
||||||
case 'video':
|
|
||||||
return (
|
|
||||||
<AttachmentVideo
|
|
||||||
key={index}
|
|
||||||
total={status.media_attachments.length}
|
|
||||||
index={index}
|
|
||||||
sensitiveShown={sensitiveShown}
|
|
||||||
video={attachment}
|
|
||||||
/>
|
|
||||||
)
|
|
||||||
case 'gifv':
|
|
||||||
return (
|
|
||||||
<AttachmentVideo
|
|
||||||
key={index}
|
|
||||||
total={status.media_attachments.length}
|
|
||||||
index={index}
|
|
||||||
sensitiveShown={sensitiveShown}
|
|
||||||
video={attachment}
|
|
||||||
gifv
|
|
||||||
/>
|
|
||||||
)
|
|
||||||
case 'audio':
|
|
||||||
return (
|
|
||||||
<AttachmentAudio
|
|
||||||
key={index}
|
|
||||||
total={status.media_attachments.length}
|
|
||||||
index={index}
|
|
||||||
sensitiveShown={sensitiveShown}
|
|
||||||
audio={attachment}
|
|
||||||
/>
|
|
||||||
)
|
|
||||||
default:
|
|
||||||
if (
|
|
||||||
attachment.preview_url?.endsWith('.jpg') ||
|
|
||||||
attachment.preview_url?.endsWith('.jpeg') ||
|
|
||||||
attachment.preview_url?.endsWith('.png') ||
|
|
||||||
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 (
|
|
||||||
<AttachmentImage
|
|
||||||
key={index}
|
|
||||||
total={status.media_attachments.length}
|
|
||||||
index={index}
|
|
||||||
sensitiveShown={sensitiveShown}
|
|
||||||
// @ts-ignore
|
|
||||||
image={attachment}
|
|
||||||
navigateToImagesViewer={navigateToImagesViewer}
|
|
||||||
/>
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
return (
|
|
||||||
<AttachmentUnsupported
|
|
||||||
key={index}
|
|
||||||
total={status.media_attachments.length}
|
|
||||||
index={index}
|
|
||||||
sensitiveShown={sensitiveShown}
|
|
||||||
attachment={attachment}
|
|
||||||
/>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})}
|
|
||||||
</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', () => {
|
||||||
setAccountStorage([{ key: readMarker, value: latestMarker.current }])
|
const currentMarker = getAccountStorage.string(readMarker) || '0'
|
||||||
)
|
if (latestMarker.current > currentMarker) {
|
||||||
|
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
Loading…
x
Reference in New Issue
Block a user