mirror of
https://github.com/tooot-app/app
synced 2025-02-09 00:18:38 +01:00
Test updates (#456)
* Build succeeded * Fix RN update caused Android build error Spent whole fucking 2 days to figure this out https://github.com/facebook/react-native/issues/35210 * Fixed #408 Potentially because of too small pressable area * Fixed #439 * Bump up RN and Expo * Fixed #450 * Spelling (#449) * spelling: announcement Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: corrupted Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: dimensions Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: favourites Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: mutation Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: retrieve Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * spelling: transitive Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> * Fixed #451 More properly adjusted flexbox layout * Partial fix of #444 It is possible to implement what the web does but that adds additional resources which I believe is not justified. Filtering is meant to be precise. Even hiding the entire block that you still would like to take a look at the content, then why would you set up a certain filter then. Though showing the matched filter is still useful. * New Crowdin updates (#440) * New translations tabs.json (German) * New translations tabs.json (Italian) * New translations tabs.json (Japanese) * New translations tabs.json (Korean) * New translations tabs.json (Chinese Simplified) * New translations tabs.json (Chinese Traditional) * New translations tabs.json (Vietnamese) * New translations tabs.json (Portuguese, Brazilian) * New translations tabs.json (Chinese Simplified) * New translations instance.json (German) * New translations parse.json (German) * New translations timeline.json (German) * New translations mediaSelector.json (German) * New translations emojis.json (German) * New translations contextMenu.json (German) * New translations actions.json (German) * New translations compose.json (German) * New translations accountSelection.json (German) * New translations timeline.json (German) * New translations contextMenu.json (German) * New translations actions.json (German) * New translations compose.json (German) * New translations tabs.json (German) * New translations screens.json (German) * New translations common.json (French) * New translations instance.json (French) * New translations parse.json (French) * New translations relationship.json (French) * New translations timeline.json (French) * New translations actions.json (French) * New translations imageViewer.json (French) * New translations announcements.json (French) * New translations compose.json (French) * New translations screens.json (French) * New translations tabs.json (French) * New translations mediaSelector.json (French) * New translations emojis.json (French) * New translations contextMenu.json (French) * New translations accountSelection.json (French) * New translations actions.json (French) * New translations announcements.json (French) * New translations compose.json (French) * New translations accountSelection.json (French) * New translations instance.json (French) * New translations parse.json (French) * New translations relationship.json (French) * New translations timeline.json (French) * New translations imageViewer.json (French) * New translations compose.json (French) * New translations tabs.json (French) * New translations mediaSelector.json (French) * New translations emojis.json (French) * New translations contextMenu.json (French) * New translations common.json (French) * New translations compose.json (French) * New translations screens.json (French) * New translations tabs.json (French) * New translations contextMenu.json (French) * New translations common.json (French) * New translations instance.json (French) * Added French translation 🇫🇷 * Fixed #454 * Fixed #443 Basically matching all none whitespace characters * Fixed #446 Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> Co-authored-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
This commit is contained in:
parent
abff63eef0
commit
641e1f0cdc
1
.gitignore
vendored
1
.gitignore
vendored
@ -41,6 +41,7 @@ build/
|
||||
local.properties
|
||||
*.iml
|
||||
*.hprof
|
||||
.cxx/
|
||||
|
||||
# node.js
|
||||
#
|
||||
|
@ -11,6 +11,8 @@ Please **do not** create a pull request to update translation. tooot's translati
|
||||
|
||||
## Special thanks
|
||||
|
||||
[@pat](https://piaille.fr/@pat) for French translation
|
||||
|
||||
[@forenta](https://github.com/forenta) for German translation
|
||||
|
||||
[@andrigamerita](https://github.com/andrigamerita) for Italian translation
|
||||
|
@ -1,6 +1,7 @@
|
||||
apply plugin: "com.android.application"
|
||||
|
||||
import com.android.build.OutputFile
|
||||
import org.apache.tools.ant.taskdefs.condition.Os
|
||||
|
||||
/**
|
||||
* The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
|
||||
@ -78,7 +79,7 @@ import com.android.build.OutputFile
|
||||
*/
|
||||
|
||||
project.ext.react = [
|
||||
enableHermes: (findProperty('expo.jsEngine') ?: "jsc") == "hermes",
|
||||
enableHermes: true,
|
||||
]
|
||||
|
||||
apply from: new File(["node", "--print", "require.resolve('react-native/package.json')"].execute().text.trim(), "../react.gradle")
|
||||
@ -146,22 +147,14 @@ android {
|
||||
versionName "0.2"
|
||||
buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
|
||||
if (isNewArchitectureEnabled()) {
|
||||
// We configure the NDK build only if you decide to opt-in for the New Architecture.
|
||||
// We configure the CMake build only if you decide to opt-in for the New Architecture.
|
||||
externalNativeBuild {
|
||||
ndkBuild {
|
||||
arguments "APP_PLATFORM=android-21",
|
||||
"APP_STL=c++_shared",
|
||||
"NDK_TOOLCHAIN_VERSION=clang",
|
||||
"GENERATED_SRC_DIR=$buildDir/generated/source",
|
||||
"PROJECT_BUILD_DIR=$buildDir",
|
||||
"REACT_ANDROID_DIR=$rootDir/../node_modules/react-native/ReactAndroid",
|
||||
"REACT_ANDROID_BUILD_DIR=$rootDir/../node_modules/react-native/ReactAndroid/build"
|
||||
"NODE_MODULES_DIR=$rootDir/../node_modules"
|
||||
cFlags "-Wall", "-Werror", "-fexceptions", "-frtti", "-DWITH_INSPECTOR=1"
|
||||
cppFlags "-std=c++17"
|
||||
// Make sure this target name is the same you specify inside the
|
||||
// src/main/jni/Android.mk file for the `LOCAL_MODULE` variable.
|
||||
targets "tooot_appmodules"
|
||||
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) {
|
||||
@ -172,10 +165,10 @@ android {
|
||||
}
|
||||
}
|
||||
if (isNewArchitectureEnabled()) {
|
||||
// We configure the NDK build only if you decide to opt-in for the New Architecture.
|
||||
// We configure the CMake build only if you decide to opt-in for the New Architecture.
|
||||
externalNativeBuild {
|
||||
ndkBuild {
|
||||
path "$projectDir/src/main/jni/Android.mk"
|
||||
cmake {
|
||||
path "$projectDir/src/main/jni/CMakeLists.txt"
|
||||
}
|
||||
}
|
||||
def reactAndroidProjectDir = project(':ReactAndroid').projectDir
|
||||
@ -196,15 +189,15 @@ android {
|
||||
preDebugBuild.dependsOn(packageReactNdkDebugLibs)
|
||||
preReleaseBuild.dependsOn(packageReactNdkReleaseLibs)
|
||||
// Due to a bug inside AGP, we have to explicitly set a dependency
|
||||
// between configureNdkBuild* tasks and the preBuild tasks.
|
||||
// between configureCMakeDebug* tasks and the preBuild tasks.
|
||||
// This can be removed once this is solved: https://issuetracker.google.com/issues/207403732
|
||||
configureNdkBuildRelease.dependsOn(preReleaseBuild)
|
||||
configureNdkBuildDebug.dependsOn(preDebugBuild)
|
||||
configureCMakeRelWithDebInfo.dependsOn(preReleaseBuild)
|
||||
configureCMakeDebug.dependsOn(preDebugBuild)
|
||||
reactNativeArchitectures().each { architecture ->
|
||||
tasks.findByName("configureNdkBuildDebug[${architecture}]")?.configure {
|
||||
tasks.findByName("configureCMakeDebug[${architecture}]")?.configure {
|
||||
dependsOn("preDebugBuild")
|
||||
}
|
||||
tasks.findByName("configureNdkBuildRelease[${architecture}]")?.configure {
|
||||
tasks.findByName("configureCMakeRelWithDebInfo[${architecture}]")?.configure {
|
||||
dependsOn("preReleaseBuild")
|
||||
}
|
||||
}
|
||||
@ -314,7 +307,7 @@ dependencies {
|
||||
if (isNewArchitectureEnabled()) {
|
||||
// If new architecture is enabled, we let you build RN from source
|
||||
// Otherwise we fallback to a prebuilt .aar bundled in the NPM package.
|
||||
// This will be applied to all the imported transtitive dependency.
|
||||
// This will be applied to all the imported transitive dependency.
|
||||
configurations.all {
|
||||
resolutionStrategy.dependencySubstitution {
|
||||
substitute(module("com.facebook.react:react-native"))
|
||||
|
@ -1,5 +1,3 @@
|
||||
import org.apache.tools.ant.taskdefs.condition.Os
|
||||
|
||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||
|
||||
buildscript {
|
||||
@ -24,10 +22,11 @@ buildscript {
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
jcenter()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.google.gms:google-services:4.3.3'
|
||||
classpath("com.android.tools.build:gradle:7.1.1")
|
||||
classpath("com.android.tools.build:gradle:7.2.1")
|
||||
classpath("com.facebook.react:react-native-gradle-plugin")
|
||||
classpath("de.undercouch:gradle-download-task:5.0.1")
|
||||
|
||||
@ -50,6 +49,7 @@ allprojects {
|
||||
|
||||
google()
|
||||
mavenCentral()
|
||||
jcenter()
|
||||
maven { url 'https://www.jitpack.io' }
|
||||
}
|
||||
}
|
||||
|
BIN
android/gradle/wrapper/gradle-wrapper.jar
vendored
BIN
android/gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
@ -1,5 +1,5 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-all.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
@ -10,7 +10,6 @@ export default (): ExpoConfig => ({
|
||||
version,
|
||||
extra: { environment: process.env.ENVIRONMENT },
|
||||
privacy: 'hidden',
|
||||
jsEngine: 'hermes',
|
||||
ios: {
|
||||
bundleIdentifier: 'com.xmflsct.app.tooot'
|
||||
},
|
||||
|
17
ios/Podfile
17
ios/Podfile
@ -2,11 +2,9 @@ require File.join(File.dirname(`node --print "require.resolve('expo/package.json
|
||||
require File.join(File.dirname(`node --print "require.resolve('react-native/package.json')"`), "scripts/react_native_pods")
|
||||
require File.join(File.dirname(`node --print "require.resolve('@react-native-community/cli-platform-ios/package.json')"`), "native_modules")
|
||||
|
||||
platform :ios, '12.4'
|
||||
platform :ios, '13.0'
|
||||
install! 'cocoapods', :deterministic_uuids => false
|
||||
|
||||
production = ENV["PRODUCTION"] == "1"
|
||||
|
||||
require 'json'
|
||||
podfile_properties = JSON.parse(File.read('./Podfile.properties.json')) rescue {}
|
||||
|
||||
@ -25,8 +23,7 @@ target 'tooot' do
|
||||
|
||||
use_react_native!(
|
||||
:path => config[:reactNativePath],
|
||||
:production => production,
|
||||
:hermes_enabled => podfile_properties['expo.jsEngine'] == 'hermes',
|
||||
:hermes_enabled => true,
|
||||
:fabric_enabled => flags[:fabric_enabled],
|
||||
:flipper_configuration => FlipperConfiguration.disabled,
|
||||
# An absolute path to your application root.
|
||||
@ -34,7 +31,12 @@ target 'tooot' do
|
||||
)
|
||||
|
||||
post_install do |installer|
|
||||
react_native_post_install(installer)
|
||||
react_native_post_install(
|
||||
installer,
|
||||
# Set `mac_catalyst_enabled` to `true` in order to apply patches
|
||||
# necessary for Mac Catalyst builds
|
||||
:mac_catalyst_enabled => false
|
||||
)
|
||||
__apply_Xcode_12_5_M1_post_install_workaround(installer)
|
||||
|
||||
# For share extension
|
||||
@ -65,8 +67,7 @@ end
|
||||
|
||||
target 'ShareExtension' do
|
||||
use_react_native!(
|
||||
:production => production,
|
||||
:hermes_enabled => podfile_properties['expo.jsEngine'] == 'hermes',
|
||||
:hermes_enabled => true,
|
||||
:flipper_configuration => FlipperConfiguration.disabled
|
||||
)
|
||||
|
||||
|
730
ios/Podfile.lock
730
ios/Podfile.lock
@ -1,65 +1,64 @@
|
||||
PODS:
|
||||
- boost (1.76.0)
|
||||
- DoubleConversion (1.1.6)
|
||||
- EXApplication (4.2.2):
|
||||
- EXApplication (5.0.1):
|
||||
- ExpoModulesCore
|
||||
- EXAV (12.0.4):
|
||||
- EXAV (13.0.1):
|
||||
- ExpoModulesCore
|
||||
- React-runtimeexecutor
|
||||
- ReactCommon
|
||||
- EXConstants (13.2.4):
|
||||
- ReactCommon/turbomodule/core
|
||||
- EXConstants (14.0.2):
|
||||
- ExpoModulesCore
|
||||
- EXErrorRecovery (3.2.0):
|
||||
- EXErrorRecovery (4.0.1):
|
||||
- ExpoModulesCore
|
||||
- EXFileSystem (14.1.0):
|
||||
- EXFileSystem (15.1.1):
|
||||
- ExpoModulesCore
|
||||
- EXFirebaseAnalytics (7.2.0):
|
||||
- EXFirebaseAnalytics (8.0.0):
|
||||
- EXFirebaseCore
|
||||
- ExpoModulesCore
|
||||
- Firebase/Core (= 9.5.0)
|
||||
- EXFirebaseCore (5.2.0):
|
||||
- EXFirebaseCore (6.0.0):
|
||||
- ExpoModulesCore
|
||||
- Firebase/Core (= 9.5.0)
|
||||
- EXFont (10.2.1):
|
||||
- EXFont (11.0.1):
|
||||
- ExpoModulesCore
|
||||
- EXNotifications (0.16.1):
|
||||
- EXNotifications (0.17.0):
|
||||
- ExpoModulesCore
|
||||
- Expo (46.0.16):
|
||||
- Expo (47.0.3):
|
||||
- ExpoModulesCore
|
||||
- ExpoCrypto (11.0.0):
|
||||
- ExpoCrypto (12.0.0):
|
||||
- ExpoModulesCore
|
||||
- ExpoHaptics (11.3.0):
|
||||
- ExpoHaptics (12.0.1):
|
||||
- ExpoModulesCore
|
||||
- ExpoKeepAwake (10.2.0):
|
||||
- ExpoKeepAwake (11.0.1):
|
||||
- ExpoModulesCore
|
||||
- ExpoLocalization (13.1.0):
|
||||
- ExpoLocalization (14.0.0):
|
||||
- ExpoModulesCore
|
||||
- ExpoModulesCore (0.11.8):
|
||||
- ExpoModulesCore (1.0.2):
|
||||
- React-Core
|
||||
- ReactCommon/turbomodule/core
|
||||
- ExpoRandom (12.3.0):
|
||||
- ExpoRandom (13.0.0):
|
||||
- ExpoModulesCore
|
||||
- ExpoWebBrowser (11.0.0):
|
||||
- ExpoStoreReview (6.0.0):
|
||||
- ExpoModulesCore
|
||||
- EXScreenCapture (4.3.0):
|
||||
- ExpoWebBrowser (12.0.0):
|
||||
- ExpoModulesCore
|
||||
- EXSecureStore (11.3.0):
|
||||
- EXScreenCapture (5.0.0):
|
||||
- ExpoModulesCore
|
||||
- EXSplashScreen (0.16.2):
|
||||
- EXSecureStore (12.0.0):
|
||||
- ExpoModulesCore
|
||||
- EXSplashScreen (0.17.4):
|
||||
- ExpoModulesCore
|
||||
- React-Core
|
||||
- EXStoreReview (5.3.0):
|
||||
- EXVideoThumbnails (7.0.0):
|
||||
- ExpoModulesCore
|
||||
- EXVideoThumbnails (6.4.0):
|
||||
- ExpoModulesCore
|
||||
- FBLazyVector (0.69.6)
|
||||
- FBReactNativeSpec (0.69.6):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTRequired (= 0.69.6)
|
||||
- RCTTypeSafety (= 0.69.6)
|
||||
- React-Core (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- ReactCommon/turbomodule/core (= 0.69.6)
|
||||
- FBLazyVector (0.70.5)
|
||||
- FBReactNativeSpec (0.70.5):
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- RCTRequired (= 0.70.5)
|
||||
- RCTTypeSafety (= 0.70.5)
|
||||
- React-Core (= 0.70.5)
|
||||
- React-jsi (= 0.70.5)
|
||||
- ReactCommon/turbomodule/core (= 0.70.5)
|
||||
- Firebase (9.5.0):
|
||||
- Firebase/Core (= 9.5.0)
|
||||
- Firebase/Core (9.5.0):
|
||||
@ -161,254 +160,254 @@ PODS:
|
||||
- GoogleUtilities/MethodSwizzler
|
||||
- GoogleUtilities/UserDefaults (7.8.0):
|
||||
- GoogleUtilities/Logger
|
||||
- hermes-engine (0.69.6)
|
||||
- hermes-engine (0.70.5)
|
||||
- libevent (2.1.12)
|
||||
- libwebp (1.2.3):
|
||||
- libwebp/demux (= 1.2.3)
|
||||
- libwebp/mux (= 1.2.3)
|
||||
- libwebp/webp (= 1.2.3)
|
||||
- libwebp/demux (1.2.3):
|
||||
- libwebp (1.2.4):
|
||||
- libwebp/demux (= 1.2.4)
|
||||
- libwebp/mux (= 1.2.4)
|
||||
- libwebp/webp (= 1.2.4)
|
||||
- libwebp/demux (1.2.4):
|
||||
- libwebp/webp
|
||||
- libwebp/mux (1.2.3):
|
||||
- libwebp/mux (1.2.4):
|
||||
- libwebp/demux
|
||||
- libwebp/webp (1.2.3)
|
||||
- libwebp/webp (1.2.4)
|
||||
- nanopb (2.30909.0):
|
||||
- nanopb/decode (= 2.30909.0)
|
||||
- nanopb/encode (= 2.30909.0)
|
||||
- nanopb/decode (2.30909.0)
|
||||
- nanopb/encode (2.30909.0)
|
||||
- PromisesObjC (2.1.1)
|
||||
- RCT-Folly (2021.06.28.00-v2):
|
||||
- RCT-Folly (2021.07.22.00):
|
||||
- boost
|
||||
- DoubleConversion
|
||||
- fmt (~> 6.2.1)
|
||||
- glog
|
||||
- RCT-Folly/Default (= 2021.06.28.00-v2)
|
||||
- RCT-Folly/Default (2021.06.28.00-v2):
|
||||
- RCT-Folly/Default (= 2021.07.22.00)
|
||||
- RCT-Folly/Default (2021.07.22.00):
|
||||
- boost
|
||||
- DoubleConversion
|
||||
- fmt (~> 6.2.1)
|
||||
- glog
|
||||
- RCT-Folly/Futures (2021.06.28.00-v2):
|
||||
- RCT-Folly/Futures (2021.07.22.00):
|
||||
- boost
|
||||
- DoubleConversion
|
||||
- fmt (~> 6.2.1)
|
||||
- glog
|
||||
- libevent
|
||||
- RCTRequired (0.69.6)
|
||||
- RCTTypeSafety (0.69.6):
|
||||
- FBLazyVector (= 0.69.6)
|
||||
- RCTRequired (= 0.69.6)
|
||||
- React-Core (= 0.69.6)
|
||||
- React (0.69.6):
|
||||
- React-Core (= 0.69.6)
|
||||
- React-Core/DevSupport (= 0.69.6)
|
||||
- React-Core/RCTWebSocket (= 0.69.6)
|
||||
- React-RCTActionSheet (= 0.69.6)
|
||||
- React-RCTAnimation (= 0.69.6)
|
||||
- React-RCTBlob (= 0.69.6)
|
||||
- React-RCTImage (= 0.69.6)
|
||||
- React-RCTLinking (= 0.69.6)
|
||||
- React-RCTNetwork (= 0.69.6)
|
||||
- React-RCTSettings (= 0.69.6)
|
||||
- React-RCTText (= 0.69.6)
|
||||
- React-RCTVibration (= 0.69.6)
|
||||
- React-bridging (0.69.6):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-jsi (= 0.69.6)
|
||||
- React-callinvoker (0.69.6)
|
||||
- React-Codegen (0.69.6):
|
||||
- FBReactNativeSpec (= 0.69.6)
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTRequired (= 0.69.6)
|
||||
- RCTTypeSafety (= 0.69.6)
|
||||
- React-Core (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- React-jsiexecutor (= 0.69.6)
|
||||
- ReactCommon/turbomodule/core (= 0.69.6)
|
||||
- React-Core (0.69.6):
|
||||
- RCTRequired (0.70.5)
|
||||
- RCTTypeSafety (0.70.5):
|
||||
- FBLazyVector (= 0.70.5)
|
||||
- RCTRequired (= 0.70.5)
|
||||
- React-Core (= 0.70.5)
|
||||
- React (0.70.5):
|
||||
- React-Core (= 0.70.5)
|
||||
- React-Core/DevSupport (= 0.70.5)
|
||||
- React-Core/RCTWebSocket (= 0.70.5)
|
||||
- React-RCTActionSheet (= 0.70.5)
|
||||
- React-RCTAnimation (= 0.70.5)
|
||||
- React-RCTBlob (= 0.70.5)
|
||||
- React-RCTImage (= 0.70.5)
|
||||
- React-RCTLinking (= 0.70.5)
|
||||
- React-RCTNetwork (= 0.70.5)
|
||||
- React-RCTSettings (= 0.70.5)
|
||||
- React-RCTText (= 0.70.5)
|
||||
- React-RCTVibration (= 0.70.5)
|
||||
- React-bridging (0.70.5):
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- React-jsi (= 0.70.5)
|
||||
- React-callinvoker (0.70.5)
|
||||
- React-Codegen (0.70.5):
|
||||
- FBReactNativeSpec (= 0.70.5)
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- RCTRequired (= 0.70.5)
|
||||
- RCTTypeSafety (= 0.70.5)
|
||||
- React-Core (= 0.70.5)
|
||||
- React-jsi (= 0.70.5)
|
||||
- React-jsiexecutor (= 0.70.5)
|
||||
- ReactCommon/turbomodule/core (= 0.70.5)
|
||||
- React-Core (0.70.5):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default (= 0.69.6)
|
||||
- React-cxxreact (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- React-jsiexecutor (= 0.69.6)
|
||||
- React-perflogger (= 0.69.6)
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- React-Core/Default (= 0.70.5)
|
||||
- React-cxxreact (= 0.70.5)
|
||||
- React-jsi (= 0.70.5)
|
||||
- React-jsiexecutor (= 0.70.5)
|
||||
- React-perflogger (= 0.70.5)
|
||||
- Yoga
|
||||
- React-Core/CoreModulesHeaders (0.69.6):
|
||||
- React-Core/CoreModulesHeaders (0.70.5):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- React-jsiexecutor (= 0.69.6)
|
||||
- React-perflogger (= 0.69.6)
|
||||
- React-cxxreact (= 0.70.5)
|
||||
- React-jsi (= 0.70.5)
|
||||
- React-jsiexecutor (= 0.70.5)
|
||||
- React-perflogger (= 0.70.5)
|
||||
- Yoga
|
||||
- React-Core/Default (0.69.6):
|
||||
- React-Core/Default (0.70.5):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-cxxreact (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- React-jsiexecutor (= 0.69.6)
|
||||
- React-perflogger (= 0.69.6)
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- React-cxxreact (= 0.70.5)
|
||||
- React-jsi (= 0.70.5)
|
||||
- React-jsiexecutor (= 0.70.5)
|
||||
- React-perflogger (= 0.70.5)
|
||||
- Yoga
|
||||
- React-Core/DevSupport (0.69.6):
|
||||
- React-Core/DevSupport (0.70.5):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default (= 0.69.6)
|
||||
- React-Core/RCTWebSocket (= 0.69.6)
|
||||
- React-cxxreact (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- React-jsiexecutor (= 0.69.6)
|
||||
- React-jsinspector (= 0.69.6)
|
||||
- React-perflogger (= 0.69.6)
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- React-Core/Default (= 0.70.5)
|
||||
- React-Core/RCTWebSocket (= 0.70.5)
|
||||
- React-cxxreact (= 0.70.5)
|
||||
- React-jsi (= 0.70.5)
|
||||
- React-jsiexecutor (= 0.70.5)
|
||||
- React-jsinspector (= 0.70.5)
|
||||
- React-perflogger (= 0.70.5)
|
||||
- Yoga
|
||||
- React-Core/RCTActionSheetHeaders (0.69.6):
|
||||
- React-Core/RCTActionSheetHeaders (0.70.5):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- React-jsiexecutor (= 0.69.6)
|
||||
- React-perflogger (= 0.69.6)
|
||||
- React-cxxreact (= 0.70.5)
|
||||
- React-jsi (= 0.70.5)
|
||||
- React-jsiexecutor (= 0.70.5)
|
||||
- React-perflogger (= 0.70.5)
|
||||
- Yoga
|
||||
- React-Core/RCTAnimationHeaders (0.69.6):
|
||||
- React-Core/RCTAnimationHeaders (0.70.5):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- React-jsiexecutor (= 0.69.6)
|
||||
- React-perflogger (= 0.69.6)
|
||||
- React-cxxreact (= 0.70.5)
|
||||
- React-jsi (= 0.70.5)
|
||||
- React-jsiexecutor (= 0.70.5)
|
||||
- React-perflogger (= 0.70.5)
|
||||
- Yoga
|
||||
- React-Core/RCTBlobHeaders (0.69.6):
|
||||
- React-Core/RCTBlobHeaders (0.70.5):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- React-jsiexecutor (= 0.69.6)
|
||||
- React-perflogger (= 0.69.6)
|
||||
- React-cxxreact (= 0.70.5)
|
||||
- React-jsi (= 0.70.5)
|
||||
- React-jsiexecutor (= 0.70.5)
|
||||
- React-perflogger (= 0.70.5)
|
||||
- Yoga
|
||||
- React-Core/RCTImageHeaders (0.69.6):
|
||||
- React-Core/RCTImageHeaders (0.70.5):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- React-jsiexecutor (= 0.69.6)
|
||||
- React-perflogger (= 0.69.6)
|
||||
- React-cxxreact (= 0.70.5)
|
||||
- React-jsi (= 0.70.5)
|
||||
- React-jsiexecutor (= 0.70.5)
|
||||
- React-perflogger (= 0.70.5)
|
||||
- Yoga
|
||||
- React-Core/RCTLinkingHeaders (0.69.6):
|
||||
- React-Core/RCTLinkingHeaders (0.70.5):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- React-jsiexecutor (= 0.69.6)
|
||||
- React-perflogger (= 0.69.6)
|
||||
- React-cxxreact (= 0.70.5)
|
||||
- React-jsi (= 0.70.5)
|
||||
- React-jsiexecutor (= 0.70.5)
|
||||
- React-perflogger (= 0.70.5)
|
||||
- Yoga
|
||||
- React-Core/RCTNetworkHeaders (0.69.6):
|
||||
- React-Core/RCTNetworkHeaders (0.70.5):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- React-jsiexecutor (= 0.69.6)
|
||||
- React-perflogger (= 0.69.6)
|
||||
- React-cxxreact (= 0.70.5)
|
||||
- React-jsi (= 0.70.5)
|
||||
- React-jsiexecutor (= 0.70.5)
|
||||
- React-perflogger (= 0.70.5)
|
||||
- Yoga
|
||||
- React-Core/RCTSettingsHeaders (0.69.6):
|
||||
- React-Core/RCTSettingsHeaders (0.70.5):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- React-jsiexecutor (= 0.69.6)
|
||||
- React-perflogger (= 0.69.6)
|
||||
- React-cxxreact (= 0.70.5)
|
||||
- React-jsi (= 0.70.5)
|
||||
- React-jsiexecutor (= 0.70.5)
|
||||
- React-perflogger (= 0.70.5)
|
||||
- Yoga
|
||||
- React-Core/RCTTextHeaders (0.69.6):
|
||||
- React-Core/RCTTextHeaders (0.70.5):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- React-jsiexecutor (= 0.69.6)
|
||||
- React-perflogger (= 0.69.6)
|
||||
- React-cxxreact (= 0.70.5)
|
||||
- React-jsi (= 0.70.5)
|
||||
- React-jsiexecutor (= 0.70.5)
|
||||
- React-perflogger (= 0.70.5)
|
||||
- Yoga
|
||||
- React-Core/RCTVibrationHeaders (0.69.6):
|
||||
- React-Core/RCTVibrationHeaders (0.70.5):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- React-jsiexecutor (= 0.69.6)
|
||||
- React-perflogger (= 0.69.6)
|
||||
- React-cxxreact (= 0.70.5)
|
||||
- React-jsi (= 0.70.5)
|
||||
- React-jsiexecutor (= 0.70.5)
|
||||
- React-perflogger (= 0.70.5)
|
||||
- Yoga
|
||||
- React-Core/RCTWebSocket (0.69.6):
|
||||
- React-Core/RCTWebSocket (0.70.5):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default (= 0.69.6)
|
||||
- React-cxxreact (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- React-jsiexecutor (= 0.69.6)
|
||||
- React-perflogger (= 0.69.6)
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- React-Core/Default (= 0.70.5)
|
||||
- React-cxxreact (= 0.70.5)
|
||||
- React-jsi (= 0.70.5)
|
||||
- React-jsiexecutor (= 0.70.5)
|
||||
- React-perflogger (= 0.70.5)
|
||||
- Yoga
|
||||
- React-CoreModules (0.69.6):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTTypeSafety (= 0.69.6)
|
||||
- React-Codegen (= 0.69.6)
|
||||
- React-Core/CoreModulesHeaders (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- React-RCTImage (= 0.69.6)
|
||||
- ReactCommon/turbomodule/core (= 0.69.6)
|
||||
- React-cxxreact (0.69.6):
|
||||
- React-CoreModules (0.70.5):
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- RCTTypeSafety (= 0.70.5)
|
||||
- React-Codegen (= 0.70.5)
|
||||
- React-Core/CoreModulesHeaders (= 0.70.5)
|
||||
- React-jsi (= 0.70.5)
|
||||
- React-RCTImage (= 0.70.5)
|
||||
- ReactCommon/turbomodule/core (= 0.70.5)
|
||||
- React-cxxreact (0.70.5):
|
||||
- boost (= 1.76.0)
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-callinvoker (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- React-jsinspector (= 0.69.6)
|
||||
- React-logger (= 0.69.6)
|
||||
- React-perflogger (= 0.69.6)
|
||||
- React-runtimeexecutor (= 0.69.6)
|
||||
- React-hermes (0.69.6):
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- React-callinvoker (= 0.70.5)
|
||||
- React-jsi (= 0.70.5)
|
||||
- React-jsinspector (= 0.70.5)
|
||||
- React-logger (= 0.70.5)
|
||||
- React-perflogger (= 0.70.5)
|
||||
- React-runtimeexecutor (= 0.70.5)
|
||||
- React-hermes (0.70.5):
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- hermes-engine
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCT-Folly/Futures (= 2021.06.28.00-v2)
|
||||
- React-cxxreact (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- React-jsiexecutor (= 0.69.6)
|
||||
- React-jsinspector (= 0.69.6)
|
||||
- React-perflogger (= 0.69.6)
|
||||
- React-jsi (0.69.6):
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- RCT-Folly/Futures (= 2021.07.22.00)
|
||||
- React-cxxreact (= 0.70.5)
|
||||
- React-jsi (= 0.70.5)
|
||||
- React-jsiexecutor (= 0.70.5)
|
||||
- React-jsinspector (= 0.70.5)
|
||||
- React-perflogger (= 0.70.5)
|
||||
- React-jsi (0.70.5):
|
||||
- boost (= 1.76.0)
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-jsi/Default (= 0.69.6)
|
||||
- React-jsi/Default (0.69.6):
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- React-jsi/Default (= 0.70.5)
|
||||
- React-jsi/Default (0.70.5):
|
||||
- boost (= 1.76.0)
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-jsiexecutor (0.69.6):
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- React-jsiexecutor (0.70.5):
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-cxxreact (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- React-perflogger (= 0.69.6)
|
||||
- React-jsinspector (0.69.6)
|
||||
- React-logger (0.69.6):
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- React-cxxreact (= 0.70.5)
|
||||
- React-jsi (= 0.70.5)
|
||||
- React-perflogger (= 0.70.5)
|
||||
- React-jsinspector (0.70.5)
|
||||
- React-logger (0.70.5):
|
||||
- glog
|
||||
- react-native-blur (4.2.0):
|
||||
- react-native-blur (4.3.0):
|
||||
- React-Core
|
||||
- react-native-blurhash (1.1.10):
|
||||
- React-Core
|
||||
- react-native-cameraroll (5.0.4):
|
||||
- react-native-cameraroll (5.1.0):
|
||||
- React-Core
|
||||
- react-native-context-menu-view (1.5.4):
|
||||
- React
|
||||
@ -420,7 +419,7 @@ PODS:
|
||||
- React-Core
|
||||
- react-native-netinfo (9.3.6):
|
||||
- React-Core
|
||||
- react-native-pager-view (6.0.2):
|
||||
- react-native-pager-view (6.1.0):
|
||||
- React-Core
|
||||
- react-native-paste-input (0.5.1):
|
||||
- React-Core
|
||||
@ -433,110 +432,79 @@ PODS:
|
||||
- ReactCommon/turbomodule/core
|
||||
- react-native-segmented-control (2.2.2):
|
||||
- React-Core
|
||||
- React-perflogger (0.69.6)
|
||||
- React-RCTActionSheet (0.69.6):
|
||||
- React-Core/RCTActionSheetHeaders (= 0.69.6)
|
||||
- React-RCTAnimation (0.69.6):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTTypeSafety (= 0.69.6)
|
||||
- React-Codegen (= 0.69.6)
|
||||
- React-Core/RCTAnimationHeaders (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- ReactCommon/turbomodule/core (= 0.69.6)
|
||||
- React-RCTBlob (0.69.6):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Codegen (= 0.69.6)
|
||||
- React-Core/RCTBlobHeaders (= 0.69.6)
|
||||
- React-Core/RCTWebSocket (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- React-RCTNetwork (= 0.69.6)
|
||||
- ReactCommon/turbomodule/core (= 0.69.6)
|
||||
- React-RCTImage (0.69.6):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTTypeSafety (= 0.69.6)
|
||||
- React-Codegen (= 0.69.6)
|
||||
- React-Core/RCTImageHeaders (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- React-RCTNetwork (= 0.69.6)
|
||||
- ReactCommon/turbomodule/core (= 0.69.6)
|
||||
- React-RCTLinking (0.69.6):
|
||||
- React-Codegen (= 0.69.6)
|
||||
- React-Core/RCTLinkingHeaders (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- ReactCommon/turbomodule/core (= 0.69.6)
|
||||
- React-RCTNetwork (0.69.6):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTTypeSafety (= 0.69.6)
|
||||
- React-Codegen (= 0.69.6)
|
||||
- React-Core/RCTNetworkHeaders (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- ReactCommon/turbomodule/core (= 0.69.6)
|
||||
- React-RCTSettings (0.69.6):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTTypeSafety (= 0.69.6)
|
||||
- React-Codegen (= 0.69.6)
|
||||
- React-Core/RCTSettingsHeaders (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- ReactCommon/turbomodule/core (= 0.69.6)
|
||||
- React-RCTText (0.69.6):
|
||||
- React-Core/RCTTextHeaders (= 0.69.6)
|
||||
- React-RCTVibration (0.69.6):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Codegen (= 0.69.6)
|
||||
- React-Core/RCTVibrationHeaders (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- ReactCommon/turbomodule/core (= 0.69.6)
|
||||
- React-runtimeexecutor (0.69.6):
|
||||
- React-jsi (= 0.69.6)
|
||||
- ReactCommon (0.69.6):
|
||||
- React-logger (= 0.69.6)
|
||||
- ReactCommon/react_debug_core (= 0.69.6)
|
||||
- ReactCommon/turbomodule (= 0.69.6)
|
||||
- ReactCommon/react_debug_core (0.69.6):
|
||||
- React-logger (= 0.69.6)
|
||||
- ReactCommon/turbomodule (0.69.6):
|
||||
- React-perflogger (0.70.5)
|
||||
- React-RCTActionSheet (0.70.5):
|
||||
- React-Core/RCTActionSheetHeaders (= 0.70.5)
|
||||
- React-RCTAnimation (0.70.5):
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- RCTTypeSafety (= 0.70.5)
|
||||
- React-Codegen (= 0.70.5)
|
||||
- React-Core/RCTAnimationHeaders (= 0.70.5)
|
||||
- React-jsi (= 0.70.5)
|
||||
- ReactCommon/turbomodule/core (= 0.70.5)
|
||||
- React-RCTBlob (0.70.5):
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- React-Codegen (= 0.70.5)
|
||||
- React-Core/RCTBlobHeaders (= 0.70.5)
|
||||
- React-Core/RCTWebSocket (= 0.70.5)
|
||||
- React-jsi (= 0.70.5)
|
||||
- React-RCTNetwork (= 0.70.5)
|
||||
- ReactCommon/turbomodule/core (= 0.70.5)
|
||||
- React-RCTImage (0.70.5):
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- RCTTypeSafety (= 0.70.5)
|
||||
- React-Codegen (= 0.70.5)
|
||||
- React-Core/RCTImageHeaders (= 0.70.5)
|
||||
- React-jsi (= 0.70.5)
|
||||
- React-RCTNetwork (= 0.70.5)
|
||||
- ReactCommon/turbomodule/core (= 0.70.5)
|
||||
- React-RCTLinking (0.70.5):
|
||||
- React-Codegen (= 0.70.5)
|
||||
- React-Core/RCTLinkingHeaders (= 0.70.5)
|
||||
- React-jsi (= 0.70.5)
|
||||
- ReactCommon/turbomodule/core (= 0.70.5)
|
||||
- React-RCTNetwork (0.70.5):
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- RCTTypeSafety (= 0.70.5)
|
||||
- React-Codegen (= 0.70.5)
|
||||
- React-Core/RCTNetworkHeaders (= 0.70.5)
|
||||
- React-jsi (= 0.70.5)
|
||||
- ReactCommon/turbomodule/core (= 0.70.5)
|
||||
- React-RCTSettings (0.70.5):
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- RCTTypeSafety (= 0.70.5)
|
||||
- React-Codegen (= 0.70.5)
|
||||
- React-Core/RCTSettingsHeaders (= 0.70.5)
|
||||
- React-jsi (= 0.70.5)
|
||||
- ReactCommon/turbomodule/core (= 0.70.5)
|
||||
- React-RCTText (0.70.5):
|
||||
- React-Core/RCTTextHeaders (= 0.70.5)
|
||||
- React-RCTVibration (0.70.5):
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- React-Codegen (= 0.70.5)
|
||||
- React-Core/RCTVibrationHeaders (= 0.70.5)
|
||||
- React-jsi (= 0.70.5)
|
||||
- ReactCommon/turbomodule/core (= 0.70.5)
|
||||
- React-runtimeexecutor (0.70.5):
|
||||
- React-jsi (= 0.70.5)
|
||||
- ReactCommon/turbomodule/core (0.70.5):
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-bridging (= 0.69.6)
|
||||
- React-callinvoker (= 0.69.6)
|
||||
- React-Core (= 0.69.6)
|
||||
- React-cxxreact (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- React-logger (= 0.69.6)
|
||||
- React-perflogger (= 0.69.6)
|
||||
- ReactCommon/turbomodule/core (= 0.69.6)
|
||||
- ReactCommon/turbomodule/samples (= 0.69.6)
|
||||
- ReactCommon/turbomodule/core (0.69.6):
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-bridging (= 0.69.6)
|
||||
- React-callinvoker (= 0.69.6)
|
||||
- React-Core (= 0.69.6)
|
||||
- React-cxxreact (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- React-logger (= 0.69.6)
|
||||
- React-perflogger (= 0.69.6)
|
||||
- ReactCommon/turbomodule/samples (0.69.6):
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-bridging (= 0.69.6)
|
||||
- React-callinvoker (= 0.69.6)
|
||||
- React-Core (= 0.69.6)
|
||||
- React-cxxreact (= 0.69.6)
|
||||
- React-jsi (= 0.69.6)
|
||||
- React-logger (= 0.69.6)
|
||||
- React-perflogger (= 0.69.6)
|
||||
- ReactCommon/turbomodule/core (= 0.69.6)
|
||||
- RNCAsyncStorage (1.17.10):
|
||||
- RCT-Folly (= 2021.07.22.00)
|
||||
- React-bridging (= 0.70.5)
|
||||
- React-callinvoker (= 0.70.5)
|
||||
- React-Core (= 0.70.5)
|
||||
- React-cxxreact (= 0.70.5)
|
||||
- React-jsi (= 0.70.5)
|
||||
- React-logger (= 0.70.5)
|
||||
- React-perflogger (= 0.70.5)
|
||||
- RNCAsyncStorage (1.17.11):
|
||||
- React-Core
|
||||
- RNCClipboard (1.11.1):
|
||||
- React-Core
|
||||
- RNFastImage (8.6.3):
|
||||
- React-Core
|
||||
- SDWebImage (~> 5.13.5)
|
||||
- SDWebImage (~> 5.14.1)
|
||||
- SDWebImageWebPCoder (~> 0.9.1)
|
||||
- RNGestureHandler (2.8.0):
|
||||
- React-Core
|
||||
@ -570,22 +538,22 @@ PODS:
|
||||
- RNScreens (3.18.2):
|
||||
- React-Core
|
||||
- React-RCTImage
|
||||
- RNSentry (4.7.1):
|
||||
- RNSentry (4.8.0):
|
||||
- React-Core
|
||||
- Sentry (= 7.28.0)
|
||||
- Sentry (= 7.29.0)
|
||||
- RNShareMenu (6.0.0):
|
||||
- React
|
||||
- RNSVG (13.0.0):
|
||||
- RNSVG (13.5.0):
|
||||
- React-Core
|
||||
- SDWebImage (5.13.5):
|
||||
- SDWebImage/Core (= 5.13.5)
|
||||
- SDWebImage/Core (5.13.5)
|
||||
- SDWebImage (5.14.1):
|
||||
- SDWebImage/Core (= 5.14.1)
|
||||
- SDWebImage/Core (5.14.1)
|
||||
- SDWebImageWebPCoder (0.9.1):
|
||||
- libwebp (~> 1.0)
|
||||
- SDWebImage/Core (~> 5.13)
|
||||
- Sentry (7.28.0):
|
||||
- Sentry/Core (= 7.28.0)
|
||||
- Sentry/Core (7.28.0)
|
||||
- Sentry (7.29.0):
|
||||
- Sentry/Core (= 7.29.0)
|
||||
- Sentry/Core (7.29.0)
|
||||
- Swime (3.0.6)
|
||||
- Yoga (1.14.0)
|
||||
|
||||
@ -606,13 +574,13 @@ DEPENDENCIES:
|
||||
- ExpoHaptics (from `../node_modules/expo-haptics/ios`)
|
||||
- ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`)
|
||||
- ExpoLocalization (from `../node_modules/expo-localization/ios`)
|
||||
- ExpoModulesCore (from `../node_modules/expo-modules-core/ios`)
|
||||
- ExpoModulesCore (from `../node_modules/expo-modules-core`)
|
||||
- ExpoRandom (from `../node_modules/expo-random/ios`)
|
||||
- ExpoStoreReview (from `../node_modules/expo-store-review/ios`)
|
||||
- ExpoWebBrowser (from `../node_modules/expo-web-browser/ios`)
|
||||
- EXScreenCapture (from `../node_modules/expo-screen-capture/ios`)
|
||||
- EXSecureStore (from `../node_modules/expo-secure-store/ios`)
|
||||
- EXSplashScreen (from `../node_modules/expo-splash-screen/ios`)
|
||||
- EXStoreReview (from `../node_modules/expo-store-review/ios`)
|
||||
- EXVideoThumbnails (from `../node_modules/expo-video-thumbnails/ios`)
|
||||
- FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`)
|
||||
- FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`)
|
||||
@ -728,9 +696,11 @@ EXTERNAL SOURCES:
|
||||
ExpoLocalization:
|
||||
:path: "../node_modules/expo-localization/ios"
|
||||
ExpoModulesCore:
|
||||
:path: "../node_modules/expo-modules-core/ios"
|
||||
:path: "../node_modules/expo-modules-core"
|
||||
ExpoRandom:
|
||||
:path: "../node_modules/expo-random/ios"
|
||||
ExpoStoreReview:
|
||||
:path: "../node_modules/expo-store-review/ios"
|
||||
ExpoWebBrowser:
|
||||
:path: "../node_modules/expo-web-browser/ios"
|
||||
EXScreenCapture:
|
||||
@ -739,8 +709,6 @@ EXTERNAL SOURCES:
|
||||
:path: "../node_modules/expo-secure-store/ios"
|
||||
EXSplashScreen:
|
||||
:path: "../node_modules/expo-splash-screen/ios"
|
||||
EXStoreReview:
|
||||
:path: "../node_modules/expo-store-review/ios"
|
||||
EXVideoThumbnails:
|
||||
:path: "../node_modules/expo-video-thumbnails/ios"
|
||||
FBLazyVector:
|
||||
@ -853,30 +821,30 @@ EXTERNAL SOURCES:
|
||||
SPEC CHECKSUMS:
|
||||
boost: a7c83b31436843459a1961bfd74b96033dc77234
|
||||
DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54
|
||||
EXApplication: e418d737a036e788510f2c4ad6c10a7d54d18586
|
||||
EXAV: 596506c9bee54ad52f2f3b625cdaeb9d9f2dd6b7
|
||||
EXConstants: 7c44785d41d8e959d527d23d29444277a4d1ee73
|
||||
EXErrorRecovery: 74d71ee59f6814315457b09d68e86aa95cc7d05d
|
||||
EXFileSystem: 927e0a8885aa9c49e50fc38eaba2c2389f2f1019
|
||||
EXFirebaseAnalytics: 2e478758e153b908b67477dff7adf99ffbf37a1b
|
||||
EXFirebaseCore: cb1e6afad20c4c32a4966432c78ebfff29d8db6b
|
||||
EXFont: 06df627203afcb8a3b3152ec06eb2f11f46f0cff
|
||||
EXNotifications: 9a2aa201deb19dfe1dbe0e370eeb2922de0d2422
|
||||
Expo: 7ac824960a6059d6c68e73f432c8e6bf6d92a0ef
|
||||
ExpoCrypto: e534314db0e1a17ae12b5140d529bd0c5efcbc6a
|
||||
ExpoHaptics: efe9e68e9dfe0d15c183c0c70a25f3874124ab9e
|
||||
ExpoKeepAwake: 0e8f18142e71bbf2c7f6aa66ebed249ba1420320
|
||||
ExpoLocalization: 63204f4b9d4f653469d266332ceaa6c6ac8a305d
|
||||
ExpoModulesCore: 39ec590ce622289c060183aba57f77b1e73b4e11
|
||||
ExpoRandom: f9f1faa299a40733867f344d6b7bfa2d1f4ab04d
|
||||
ExpoWebBrowser: 5804ac42a8269d0e534bc4461993005f72535649
|
||||
EXScreenCapture: 23de056fdb02edd1fb8f147b0fd198c6d5cada3d
|
||||
EXSecureStore: ac4b3c89dd5810528074d9422d5fed5a9e684467
|
||||
EXSplashScreen: 799bece80089219b2c989c1082d70f3b00995cda
|
||||
EXStoreReview: cbb6b2202bb6f831cd3234d9d8b995cec0eb32f2
|
||||
EXVideoThumbnails: 486533e1a66c9859f9b9e3b2e1f9f0b275515b48
|
||||
FBLazyVector: 739d2f9719faecb463c7aa191591af31c8c94182
|
||||
FBReactNativeSpec: 957de82f66e31f2f14bbec34e37242282fdd26de
|
||||
EXApplication: 034b1c40a8e9fe1bff76a1e511ee90dff64ad834
|
||||
EXAV: 766516466675fc5fdd7c500acced5934e8b00de2
|
||||
EXConstants: 3c86653c422dd77e40d10cbbabb3025003977415
|
||||
EXErrorRecovery: ae43433feb0608a64dc5b1c8363b3e7769a9ea24
|
||||
EXFileSystem: 60602b6eefa6873f97172c684b7537c9760b50d6
|
||||
EXFirebaseAnalytics: 58d70e698859b070b2450ad8664d7b5bc6c6e3e1
|
||||
EXFirebaseCore: d0d88cb904e893af07f809ab08c0892489bc6956
|
||||
EXFont: 319606bfe48c33b5b5063fb0994afdc496befe80
|
||||
EXNotifications: babce2a87b7922051354fcfe7a74dd279b7e272a
|
||||
Expo: 8e4f1d149b58d5df10d302e0b5c489f9fc6623fc
|
||||
ExpoCrypto: 51e7662c7f5bfeab25b7909b8a5d545ec15d4877
|
||||
ExpoHaptics: 5a56d30a87ea213dd00b09566dc4b441a4dff97f
|
||||
ExpoKeepAwake: 69b59d0a8d2b24de9f82759c39b3821fec030318
|
||||
ExpoLocalization: e202d1e2a4950df17ac8d0889d65a1ffd7532d7e
|
||||
ExpoModulesCore: 20decc110ca3987e1728dee2ce4b3f79e147edda
|
||||
ExpoRandom: 58b7e0a5fe1adf1cb6dc1cbe503a6fe9524f36ce
|
||||
ExpoStoreReview: ff6d631f2949eb7e4b2d14146ef6af25a16d770d
|
||||
ExpoWebBrowser: 073e50f16669d498fb49063b9b7fe780b24f7fda
|
||||
EXScreenCapture: d9f1ec31042dfef109290d06c2b4789b7444d16d
|
||||
EXSecureStore: daec0117c922a67c658cb229152a9e252e5c1750
|
||||
EXSplashScreen: 4b57f8416a057411cb3c97db9fc9a615f8c1d5d9
|
||||
EXVideoThumbnails: 8b3e48f3716679dd0cbf949217a31eab5c555799
|
||||
FBLazyVector: affa4ba1bfdaac110a789192f4d452b053a86624
|
||||
FBReactNativeSpec: fe8b5f1429cfe83a8d72dc8ed61dc7704cac8745
|
||||
Firebase: 800f16f07af493d98d017446a315c27af0552f41
|
||||
FirebaseAnalytics: 1b60984a408320dda637306f3f733699ef8473d7
|
||||
FirebaseCore: 25c0400b670fd1e2f2104349cd3b5dcce8d9418f
|
||||
@ -884,69 +852,69 @@ SPEC CHECKSUMS:
|
||||
FirebaseCoreInternal: bca76517fe1ed381e989f5e7d8abb0da8d85bed3
|
||||
FirebaseInstallations: 0a115432c4e223c5ab20b0dbbe4cbefa793a0e8e
|
||||
fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9
|
||||
glog: 3d02b25ca00c2d456734d0bcff864cbc62f6ae1a
|
||||
glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b
|
||||
GoogleAppMeasurement: 6ee231473fbd75c11221dfce489894334024eead
|
||||
GoogleDataTransport: 1c8145da7117bd68bbbed00cf304edb6a24de00f
|
||||
GoogleUtilities: 1d20a6ad97ef46f67bbdec158ce00563a671ebb7
|
||||
hermes-engine: c2c873a670bc435451449f918c2b3ab3c39255fc
|
||||
hermes-engine: 7fe5fc6ef707b7fdcb161b63898ec500e285653d
|
||||
libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913
|
||||
libwebp: 60305b2e989864154bd9be3d772730f08fc6a59c
|
||||
libwebp: f62cb61d0a484ba548448a4bd52aabf150ff6eef
|
||||
nanopb: b552cce312b6c8484180ef47159bc0f65a1f0431
|
||||
PromisesObjC: ab77feca74fa2823e7af4249b8326368e61014cb
|
||||
RCT-Folly: b9d9fe1fc70114b751c076104e52f3b1b5e5a95a
|
||||
RCTRequired: c8c080849a3670601d5c7056023a2176067a69d8
|
||||
RCTTypeSafety: 710aef40f5ae246bc5fff7e873855b17ed11c180
|
||||
React: b6bb382534be4de9d367ef3d04f92108c1768160
|
||||
React-bridging: 0fca0337cef9305026814907dd29254a833a2db7
|
||||
React-callinvoker: 700e6eb96b5f7f2fdd96d7263cd4627d2fa080ed
|
||||
React-Codegen: fd21633c4b9f47d0681bbb54b173a203963a5e4d
|
||||
React-Core: 8ec15c9727c8c01b1e4f14cad5bd21f7c1d56d49
|
||||
React-CoreModules: 79486447bf901292a83df52d4f7acbecda296723
|
||||
React-cxxreact: 9022135650dd9960a60a1361e9add424c6c37ab9
|
||||
React-hermes: b5ce7fb460ff6d39e7bb9bbe1f523272c4b85c0b
|
||||
React-jsi: 4ccb3599c422ad071e3895c5feab9b0afc40505d
|
||||
React-jsiexecutor: c61b60de03b3474e5749b8a8fd8e6507630d62c4
|
||||
React-jsinspector: eaacb698c5af7a99131bc1933806372c20222dfd
|
||||
React-logger: ebb4d31bbbe4f1a8a1a9b658d7429210b8f68160
|
||||
react-native-blur: 3e9c8e8e9f7d17fa1b94e1a0ae9fd816675f5382
|
||||
RCT-Folly: 0080d0a6ebf2577475bda044aa59e2ca1f909cda
|
||||
RCTRequired: 21229f84411088e5d8538f21212de49e46cc83e2
|
||||
RCTTypeSafety: 62eed57a32924b09edaaf170a548d1fc96223086
|
||||
React: f0254ccddeeef1defe66c6b1bb9133a4f040792b
|
||||
React-bridging: e46911666b7ec19538a620a221d6396cd293d687
|
||||
React-callinvoker: 66b62e2c34546546b2f21ab0b7670346410a2b53
|
||||
React-Codegen: b6999435966df3bdf82afa3f319ba0d6f9a8532a
|
||||
React-Core: dabbc9d1fe0a11d884e6ee1599789cf8eb1058a5
|
||||
React-CoreModules: 5b6b7668f156f73a56420df9ec68ca2ec8f2e818
|
||||
React-cxxreact: c7ca2baee46db22a30fce9e639277add3c3f6ad1
|
||||
React-hermes: c93e1d759ad5560dfea54d233013d7d2c725c286
|
||||
React-jsi: a565dcb49130ed20877a9bb1105ffeecbb93d02d
|
||||
React-jsiexecutor: 31564fa6912459921568e8b0e49024285a4d584b
|
||||
React-jsinspector: badd81696361249893a80477983e697aab3c1a34
|
||||
React-logger: fdda34dd285bdb0232e059b19d9606fa0ec3bb9c
|
||||
react-native-blur: 50c9feabacbc5f49b61337ebc32192c6be7ec3c3
|
||||
react-native-blurhash: add4df9a937b4e021a24bc67a0714f13e0bd40b7
|
||||
react-native-cameraroll: 38b40d9033e4077b6c603f92f95c6d05fa7907df
|
||||
react-native-cameraroll: a40b082318eb1ecd0336a2f29d9f74b7f2c8cae8
|
||||
react-native-context-menu-view: b0beca02aad4bd9f9d7d932bf437e0a03baa69ef
|
||||
react-native-image-picker: 4bc9ed38c8be255b515d8c88babbaf74973f91a8
|
||||
react-native-language-detection: 0e43195ad014974f1b7a31b64820eff34a243f2d
|
||||
react-native-live-text-image-view: 483bacfdba464162b8cf176bba555364f18b584c
|
||||
react-native-netinfo: f80db8cac2151405633324cb645c60af098ee461
|
||||
react-native-pager-view: 592421df0259bf7a7a4fe85b74c24f3f39905605
|
||||
react-native-pager-view: 7abf89f9834d9a4021b2fb6a5ef2abff570b46fb
|
||||
react-native-paste-input: 183ad7dc224e192719616f4258dde5b548627d08
|
||||
react-native-safe-area-context: 99b24a0c5acd0d5dcac2b1a7f18c49ea317be99a
|
||||
react-native-segmented-control: 65df6cd0619b780b3843d574a72d4c7cec396097
|
||||
React-perflogger: 1fb1ad5333b43a5137afd7608695f7a42c5efd27
|
||||
React-RCTActionSheet: a435bd67689433575a1e5d7614b021d2c17f0726
|
||||
React-RCTAnimation: d097c5ed2d00735958508617555abd85183b94e2
|
||||
React-RCTBlob: f43a0fceb328e1a40aa52701a4eba955635444ab
|
||||
React-RCTImage: 08f4428e931efe0eefb94443c8ca08cfb250a556
|
||||
React-RCTLinking: 3a8851e818652582f87e5a7577302e6ad7e1de3e
|
||||
React-RCTNetwork: 19f7c66b612e2336eefdfbc7ab3a9bd8ca4e21cf
|
||||
React-RCTSettings: 9324e718a865ff01e4a96be4c65923581b2d5170
|
||||
React-RCTText: 9cadcd5d982c1d25f7439f47354b1c1b75e60105
|
||||
React-RCTVibration: 285f8538386c660e6b9497e204636acd93bf7fcc
|
||||
React-runtimeexecutor: 0af71c94f968fa10015bf0119951bccd2e4d8865
|
||||
ReactCommon: fe7580b9d10f00249facf25659e0ec051320cc8a
|
||||
RNCAsyncStorage: 0c357f3156fcb16c8589ede67cc036330b6698ca
|
||||
React-perflogger: e68d3795cf5d247a0379735cbac7309adf2fb931
|
||||
React-RCTActionSheet: 05452c3b281edb27850253db13ecd4c5a65bc247
|
||||
React-RCTAnimation: 578eebac706428e68466118e84aeacf3a282b4da
|
||||
React-RCTBlob: f47a0aa61e7d1fb1a0e13da832b0da934939d71a
|
||||
React-RCTImage: 60f54b66eed65d86b6dffaf4733d09161d44929d
|
||||
React-RCTLinking: 91073205aeec4b29450ca79b709277319368ac9e
|
||||
React-RCTNetwork: ca91f2c9465a7e335c8a5fae731fd7f10572213b
|
||||
React-RCTSettings: 1a9a5d01337d55c18168c1abe0f4a589167d134a
|
||||
React-RCTText: c591e8bd9347a294d8416357ca12d779afec01d5
|
||||
React-RCTVibration: 8e5c8c5d17af641f306d7380d8d0fe9b3c142c48
|
||||
React-runtimeexecutor: 7401c4a40f8728fd89df4a56104541b760876117
|
||||
ReactCommon: c9246996e73bf75a2c6c3ff15f1e16707cdc2da9
|
||||
RNCAsyncStorage: 8616bd5a58af409453ea4e1b246521bb76578d60
|
||||
RNCClipboard: 2834e1c4af68697089cdd455ee4a4cdd198fa7dd
|
||||
RNFastImage: c74e098cb862b4870c3de0b1096b65c63e492938
|
||||
RNFastImage: 0211f5ebb561956cbb14d822606a6dce9d88e9c7
|
||||
RNGestureHandler: 62232ba8f562f7dea5ba1b3383494eb5bf97a4d3
|
||||
RNReanimated: c3e58924b9418883b0bde9e78c4c957302f02435
|
||||
RNReanimated: 2a91e85fcd343f8af3c58d3425b99fdd285590a5
|
||||
RNScreens: 34cc502acf1b916c582c60003dc3089fa01dc66d
|
||||
RNSentry: 694aecc3d8240e4935374974a6636e360ae06394
|
||||
RNSentry: db7fd7b66efda28885e4e904a8b5e7349aec61c1
|
||||
RNShareMenu: cb9dac548c8bf147d06f0bf07296ad51ea9f5fc3
|
||||
RNSVG: 42a0c731b11179ebbd27a3eeeafa7201ebb476ff
|
||||
SDWebImage: 23d714cd599354ee7906dbae26dff89b421c4370
|
||||
RNSVG: 38ca962c970dbce1ca38991a5aebf26d163f9efb
|
||||
SDWebImage: e1b3c38f170c6100130fce6856e423ed9e5f4fce
|
||||
SDWebImageWebPCoder: 18503de6621dd2c420d680e33d46bf8e1d5169b0
|
||||
Sentry: 2c6053e4cfe6dea6608135dea1928ffbb4ecfba5
|
||||
Sentry: 4272663eb0eda312024d795ca3f5a562a8ce5e18
|
||||
Swime: d7b2c277503b6cea317774aedc2dce05613f8b0b
|
||||
Yoga: 75bf4b0131cfb46a659cd0c13309b79a6fcff66d
|
||||
Yoga: eca980a5771bf114c41a754098cd85e6e0d90ed7
|
||||
|
||||
PODFILE CHECKSUM: 244b6793e4be83f0909a91b2fe15c8f89a5e8151
|
||||
PODFILE CHECKSUM: e4191b63c8f15031b2365226730770e7978dca41
|
||||
|
||||
COCOAPODS: 1.11.3
|
||||
|
2
ios/fr.lproj/InfoPlist.strings
Normal file
2
ios/fr.lproj/InfoPlist.strings
Normal file
@ -0,0 +1,2 @@
|
||||
"NSPhotoLibraryAddUsageDescription" = "Autoriser tooot à enregistrer des images sur votre pellicule";
|
||||
"NSPhotoLibraryUsageDescription" = "Autoriser tooot à enregistrer des images sur votre pellicule";
|
@ -76,6 +76,7 @@
|
||||
E633A427281EAEAB000E540F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
E633A42F281EAF38000E540F /* ShareViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ShareViewController.swift; path = "../../node_modules/react-native-share-menu/ios/ShareViewController.swift"; sourceTree = "<group>"; };
|
||||
E633A431281EB55C000E540F /* ShareExtension-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ShareExtension-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||
E66C0842291F095800DFFF60 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
E671BDF8290EAFB800287BD0 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
|
||||
E69EBACA28DF282D0057EDEC /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
E69EBACB28DF283A0057EDEC /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
@ -291,6 +292,7 @@
|
||||
vi,
|
||||
ja,
|
||||
"zh-Hant",
|
||||
fr,
|
||||
);
|
||||
mainGroup = 83CBB9F61A601CBA00E9B192;
|
||||
productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
|
||||
@ -519,6 +521,7 @@
|
||||
E69EBACE28DF28560057EDEC /* vi */,
|
||||
E6C8B26628F5F9FC0062CF2E /* ja */,
|
||||
E671BDF8290EAFB800287BD0 /* zh-Hant */,
|
||||
E66C0842291F095800DFFF60 /* fr */,
|
||||
);
|
||||
name = InfoPlist.strings;
|
||||
sourceTree = "<group>";
|
||||
@ -544,7 +547,8 @@
|
||||
"FB_SONARKIT_ENABLED=1",
|
||||
);
|
||||
INFOPLIST_FILE = tooot/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@ -581,7 +585,8 @@
|
||||
DEVELOPMENT_TEAM = 8EGBLQ2MA6;
|
||||
"ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES;
|
||||
INFOPLIST_FILE = tooot/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@ -609,7 +614,7 @@
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "c++0x";
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "c++17";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
@ -654,12 +659,12 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
/usr/lib/swift,
|
||||
"$(inherited)",
|
||||
);
|
||||
LIBRARY_SEARCH_PATHS = "\"\"";
|
||||
LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"\"";
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
|
||||
@ -672,7 +677,7 @@
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "c++0x";
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "c++17";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
@ -710,12 +715,12 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
/usr/lib/swift,
|
||||
"$(inherited)",
|
||||
);
|
||||
LIBRARY_SEARCH_PATHS = "\"\"";
|
||||
LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"\"";
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
ONLY_ACTIVE_ARCH = NO;
|
||||
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
|
||||
@ -747,7 +752,7 @@
|
||||
INFOPLIST_FILE = ShareExtension/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = ShareExtension;
|
||||
INFOPLIST_KEY_NSHumanReadableCopyright = "";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
"IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.2;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
@ -796,7 +801,7 @@
|
||||
INFOPLIST_FILE = ShareExtension/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = ShareExtension;
|
||||
INFOPLIST_KEY_NSHumanReadableCopyright = "";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
"IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.2;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
|
89
package.json
89
package.json
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "tooot",
|
||||
"version": "4.5.1",
|
||||
"version": "4.6.0",
|
||||
"description": "tooot for Mastodon",
|
||||
"author": "xmflsct <me@xmflsct.com>",
|
||||
"license": "GPL-3.0-or-later",
|
||||
@ -18,7 +18,7 @@
|
||||
"postinstall": "patch-package"
|
||||
},
|
||||
"dependencies": {
|
||||
"@expo/react-native-action-sheet": "^4.0.0",
|
||||
"@expo/react-native-action-sheet": "^4.0.1",
|
||||
"@formatjs/intl-datetimeformat": "^6.3.1",
|
||||
"@formatjs/intl-getcanonicallocales": "^2.0.4",
|
||||
"@formatjs/intl-locale": "^3.0.7",
|
||||
@ -27,47 +27,47 @@
|
||||
"@formatjs/intl-relativetimeformat": "^11.1.4",
|
||||
"@mattermost/react-native-paste-input": "^0.5.1",
|
||||
"@neverdull-agency/expo-unlimited-secure-store": "^1.0.10",
|
||||
"@react-native-async-storage/async-storage": "^1.17.10",
|
||||
"@react-native-camera-roll/camera-roll": "^5.0.4",
|
||||
"@react-native-async-storage/async-storage": "~1.17.11",
|
||||
"@react-native-camera-roll/camera-roll": "^5.1.0",
|
||||
"@react-native-clipboard/clipboard": "^1.11.1",
|
||||
"@react-native-community/blur": "^4.2.0",
|
||||
"@react-native-community/netinfo": "^9.3.6",
|
||||
"@react-native-community/blur": "^4.3.0",
|
||||
"@react-native-community/netinfo": "9.3.6",
|
||||
"@react-native-community/segmented-control": "^2.2.2",
|
||||
"@react-navigation/bottom-tabs": "^6.4.0",
|
||||
"@react-navigation/native": "^6.0.13",
|
||||
"@react-navigation/native-stack": "^6.9.1",
|
||||
"@react-navigation/stack": "^6.3.3",
|
||||
"@reduxjs/toolkit": "^1.8.6",
|
||||
"@sentry/react-native": "^4.7.1",
|
||||
"@react-navigation/stack": "^6.3.4",
|
||||
"@reduxjs/toolkit": "^1.9.0",
|
||||
"@sentry/react-native": "4.8.0",
|
||||
"@sharcoux/slider": "^6.0.3",
|
||||
"axios": "^0.27.2",
|
||||
"expo": "^46.0.16",
|
||||
"expo-auth-session": "^3.7.1",
|
||||
"expo-av": "^12.0.4",
|
||||
"expo-constants": "^13.2.4",
|
||||
"expo-crypto": "^11.0.0",
|
||||
"expo-file-system": "^14.1.0",
|
||||
"expo-firebase-analytics": "^7.2.0",
|
||||
"expo-haptics": "^11.3.0",
|
||||
"expo-linking": "^3.2.2",
|
||||
"expo-localization": "^13.1.0",
|
||||
"expo-notifications": "^0.16.1",
|
||||
"expo-random": "^12.3.0",
|
||||
"expo-screen-capture": "^4.3.0",
|
||||
"expo-secure-store": "^11.3.0",
|
||||
"expo-splash-screen": "^0.16.2",
|
||||
"expo-store-review": "^5.3.0",
|
||||
"expo-video-thumbnails": "^6.4.0",
|
||||
"expo-web-browser": "^11.0.0",
|
||||
"expo": "^47.0.3",
|
||||
"expo-auth-session": "~3.7.2",
|
||||
"expo-av": "~13.0.1",
|
||||
"expo-constants": "~14.0.2",
|
||||
"expo-crypto": "~12.0.0",
|
||||
"expo-file-system": "~15.1.1",
|
||||
"expo-firebase-analytics": "~8.0.0",
|
||||
"expo-haptics": "~12.0.1",
|
||||
"expo-linking": "~3.2.3",
|
||||
"expo-localization": "~14.0.0",
|
||||
"expo-notifications": "~0.17.0",
|
||||
"expo-random": "~13.0.0",
|
||||
"expo-screen-capture": "~5.0.0",
|
||||
"expo-secure-store": "~12.0.0",
|
||||
"expo-splash-screen": "~0.17.4",
|
||||
"expo-store-review": "~6.0.0",
|
||||
"expo-video-thumbnails": "~7.0.0",
|
||||
"expo-web-browser": "~12.0.0",
|
||||
"i18next": "^22.0.4",
|
||||
"li": "^1.3.0",
|
||||
"linkify-it": "^4.0.1",
|
||||
"lodash": "^4.17.21",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"react": "18.2.0",
|
||||
"react-dom": "18.2.0",
|
||||
"react-i18next": "^12.0.0",
|
||||
"react-intl": "^6.2.1",
|
||||
"react-native": "^0.69.6",
|
||||
"react-native": "0.70.5",
|
||||
"react-native-animated-spinkit": "^1.5.2",
|
||||
"react-native-base64": "^0.2.1",
|
||||
"react-native-blurhash": "^1.1.10",
|
||||
@ -75,37 +75,37 @@
|
||||
"react-native-fast-image": "^8.6.3",
|
||||
"react-native-feather": "^1.1.2",
|
||||
"react-native-flash-message": "^0.3.1",
|
||||
"react-native-gesture-handler": "^2.8.0",
|
||||
"react-native-gesture-handler": "~2.8.0",
|
||||
"react-native-htmlview": "^0.16.0",
|
||||
"react-native-image-picker": "^4.10.0",
|
||||
"react-native-language-detection": "^0.1.0",
|
||||
"react-native-live-text-image-view": "^0.4.0",
|
||||
"react-native-pager-view": "^6.0.2",
|
||||
"react-native-reanimated": "^2.12.0",
|
||||
"react-native-reanimated-zoom": "^0.3.2",
|
||||
"react-native-safe-area-context": "^4.4.1",
|
||||
"react-native-screens": "^3.18.2",
|
||||
"react-native-pager-view": "6.1.0",
|
||||
"react-native-reanimated": "~2.12.0",
|
||||
"react-native-reanimated-zoom": "^0.3.3",
|
||||
"react-native-safe-area-context": "4.4.1",
|
||||
"react-native-screens": "~3.18.2",
|
||||
"react-native-share-menu": "^6.0.0",
|
||||
"react-native-svg": "13.0.0",
|
||||
"react-native-svg": "13.5.0",
|
||||
"react-native-swipe-list-view": "^3.2.9",
|
||||
"react-native-tab-view": "^3.3.0",
|
||||
"react-query": "^3.39.2",
|
||||
"react-redux": "^8.0.4",
|
||||
"react-redux": "^8.0.5",
|
||||
"redux-persist": "^6.0.0",
|
||||
"rn-placeholder": "^3.0.3",
|
||||
"valid-url": "^1.0.9"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.19.6",
|
||||
"@babel/core": "^7.20.2",
|
||||
"@babel/plugin-proposal-optional-chaining": "^7.18.9",
|
||||
"@babel/preset-react": "^7.18.6",
|
||||
"@babel/preset-typescript": "^7.18.6",
|
||||
"@expo/config": "^7.0.1",
|
||||
"@expo/config": "^7.0.3",
|
||||
"@types/linkify-it": "^3.0.2",
|
||||
"@types/lodash": "^4.14.186",
|
||||
"@types/react": "^18.0.24",
|
||||
"@types/react-dom": "^18.0.8",
|
||||
"@types/react-native": "^0.69.5",
|
||||
"@types/lodash": "^4.14.188",
|
||||
"@types/react": "~18.0.25",
|
||||
"@types/react-dom": "~18.0.8",
|
||||
"@types/react-native": "~0.70.6",
|
||||
"@types/react-native-base64": "^0.2.0",
|
||||
"@types/react-native-share-menu": "^5.0.2",
|
||||
"@types/react-timeago": "^4.1.3",
|
||||
@ -115,6 +115,7 @@
|
||||
"babel-plugin-transform-remove-console": "^6.9.4",
|
||||
"chalk": "^4.1.2",
|
||||
"dotenv": "^16.0.3",
|
||||
"expo-cli": "^6.0.8",
|
||||
"patch-package": "^6.5.0",
|
||||
"postinstall-postinstall": "^2.1.0",
|
||||
"react-native-clean-project": "^4.0.1",
|
||||
|
@ -1,5 +1,5 @@
|
||||
diff --git a/node_modules/react-native-fast-image/RNFastImage.podspec b/node_modules/react-native-fast-image/RNFastImage.podspec
|
||||
index db0fada..23770b6 100644
|
||||
index db0fada..a752393 100644
|
||||
--- a/node_modules/react-native-fast-image/RNFastImage.podspec
|
||||
+++ b/node_modules/react-native-fast-image/RNFastImage.podspec
|
||||
@@ -16,6 +16,6 @@ Pod::Spec.new do |s|
|
||||
@ -8,7 +8,7 @@ index db0fada..23770b6 100644
|
||||
s.dependency 'React-Core'
|
||||
- s.dependency 'SDWebImage', '~> 5.11.1'
|
||||
- s.dependency 'SDWebImageWebPCoder', '~> 0.8.4'
|
||||
+ s.dependency 'SDWebImage', '~> 5.13.5'
|
||||
+ s.dependency 'SDWebImage', '~> 5.14.1'
|
||||
+ s.dependency 'SDWebImageWebPCoder', '~> 0.9.1'
|
||||
end
|
||||
diff --git a/node_modules/react-native-fast-image/android/build.gradle b/node_modules/react-native-fast-image/android/build.gradle
|
||||
|
@ -1,41 +0,0 @@
|
||||
diff --git a/node_modules/react-native-reanimated-zoom/lib/typescript/zoom.d.ts b/node_modules/react-native-reanimated-zoom/lib/typescript/zoom.d.ts
|
||||
index 38fb6f1..e93c288 100644
|
||||
--- a/node_modules/react-native-reanimated-zoom/lib/typescript/zoom.d.ts
|
||||
+++ b/node_modules/react-native-reanimated-zoom/lib/typescript/zoom.d.ts
|
||||
@@ -6,6 +6,7 @@ declare type Props = {
|
||||
minimumZoomScale?: number;
|
||||
maximumZoomScale?: number;
|
||||
simultaneousGesture?: GestureType;
|
||||
+ isZoomed?: SharedValue<boolean>;
|
||||
} & ViewProps;
|
||||
export declare function Zoom(props: Props): JSX.Element;
|
||||
export {};
|
||||
diff --git a/node_modules/react-native-reanimated-zoom/src/zoom.tsx b/node_modules/react-native-reanimated-zoom/src/zoom.tsx
|
||||
index e07b415..d57a1eb 100644
|
||||
--- a/node_modules/react-native-reanimated-zoom/src/zoom.tsx
|
||||
+++ b/node_modules/react-native-reanimated-zoom/src/zoom.tsx
|
||||
@@ -7,6 +7,7 @@ import Animated, {
|
||||
withTiming,
|
||||
cancelAnimation,
|
||||
runOnJS,
|
||||
+ SharedValue,
|
||||
} from 'react-native-reanimated';
|
||||
import {
|
||||
Gesture,
|
||||
@@ -20,6 +21,7 @@ type Props = {
|
||||
minimumZoomScale?: number;
|
||||
maximumZoomScale?: number;
|
||||
simultaneousGesture?: GestureType;
|
||||
+ isZoomed?: SharedValue<boolean>;
|
||||
} & ViewProps;
|
||||
|
||||
export function Zoom(props: Props) {
|
||||
@@ -39,7 +41,7 @@ export function Zoom(props: Props) {
|
||||
const originY = useSharedValue(0);
|
||||
const scale = useSharedValue(1);
|
||||
const isPinching = useSharedValue(false);
|
||||
- const isZoomed = useSharedValue(false);
|
||||
+ const isZoomed = props.isZoomed || useSharedValue(false);
|
||||
const viewHeight = useSharedValue(0);
|
||||
const viewWidth = useSharedValue(0);
|
||||
|
1
src/@types/mastodon.d.ts
vendored
1
src/@types/mastodon.d.ts
vendored
@ -29,6 +29,7 @@ declare namespace Mastodon {
|
||||
fields: Field[]
|
||||
bot: boolean
|
||||
source?: Source
|
||||
suspended?: boolean
|
||||
}
|
||||
|
||||
type Announcement = {
|
||||
|
@ -34,9 +34,11 @@ const ComponentAccount: React.FC<Props> = ({
|
||||
<Pressable
|
||||
accessibilityRole='button'
|
||||
style={{
|
||||
flex: 1,
|
||||
paddingHorizontal: StyleConstants.Spacing.Global.PagePadding,
|
||||
paddingVertical: StyleConstants.Spacing.M,
|
||||
flexDirection: 'row',
|
||||
alignSelf: 'flex-start',
|
||||
alignItems: 'center'
|
||||
}}
|
||||
onPress={customOnPress || onPress}
|
||||
|
@ -207,6 +207,10 @@ const ParseHTML = React.memo(
|
||||
expandHint = t('HTML.defaultHint')
|
||||
}
|
||||
|
||||
if (disableDetails) {
|
||||
numberOfLines = 4
|
||||
}
|
||||
|
||||
const renderNodeCallback = useCallback(
|
||||
(node: any, index: any) =>
|
||||
renderNode({
|
||||
@ -247,7 +251,7 @@ const ParseHTML = React.memo(
|
||||
|
||||
return (
|
||||
<View style={{ overflow: 'hidden' }}>
|
||||
{typeof totalLines === 'number' || numberOfLines === 1 ? (
|
||||
{(!disableDetails && typeof totalLines === 'number') || numberOfLines === 1 ? (
|
||||
<Pressable
|
||||
accessibilityLabel={t('HTML.accessibilityHint')}
|
||||
onPress={() => {
|
||||
|
@ -16,8 +16,8 @@ import { getInstanceAccount } from '@utils/slices/instancesSlice'
|
||||
import { StyleConstants } from '@utils/styles/constants'
|
||||
import { useTheme } from '@utils/styles/ThemeManager'
|
||||
import { uniqBy } from 'lodash'
|
||||
import React, { useCallback, useRef } from 'react'
|
||||
import { Pressable, View } from 'react-native'
|
||||
import React, { useRef } from 'react'
|
||||
import { Pressable, StyleProp, View, ViewStyle } from 'react-native'
|
||||
import { useSelector } from 'react-redux'
|
||||
import TimelineContextMenu from './Shared/ContextMenu'
|
||||
import TimelineFeedback from './Shared/Feedback'
|
||||
@ -45,6 +45,10 @@ const TimelineDefault: React.FC<Props> = ({
|
||||
disableDetails = false,
|
||||
disableOnPress = false
|
||||
}) => {
|
||||
if (highlighted) {
|
||||
disableOnPress = true
|
||||
}
|
||||
|
||||
const { colors } = useTheme()
|
||||
const instanceAccount = useSelector(getInstanceAccount, () => true)
|
||||
const navigation = useNavigation<StackNavigationProp<TabLocalStackParamList>>()
|
||||
@ -58,27 +62,105 @@ const TimelineDefault: React.FC<Props> = ({
|
||||
complete: false
|
||||
})
|
||||
|
||||
if (
|
||||
queryKey &&
|
||||
shouldFilter({ copiableContent, status: actualStatus, queryKey }) &&
|
||||
!highlighted
|
||||
) {
|
||||
return <TimelineFiltered />
|
||||
const filtered = queryKey && shouldFilter({ copiableContent, status: actualStatus, queryKey })
|
||||
if (queryKey && filtered && !highlighted) {
|
||||
return <TimelineFiltered phrase={filtered} />
|
||||
}
|
||||
|
||||
const onPress = useCallback(() => {
|
||||
const onPress = () => {
|
||||
analytics('timeline_default_press', {
|
||||
page: queryKey ? queryKey[1].page : origin
|
||||
})
|
||||
!disableOnPress &&
|
||||
!highlighted &&
|
||||
navigation.push('Tab-Shared-Toot', {
|
||||
toot: actualStatus,
|
||||
rootQueryKey: queryKey
|
||||
})
|
||||
}, [])
|
||||
navigation.push('Tab-Shared-Toot', {
|
||||
toot: actualStatus,
|
||||
rootQueryKey: queryKey
|
||||
})
|
||||
}
|
||||
|
||||
return (
|
||||
const mainStyle: StyleProp<ViewStyle> = {
|
||||
padding: StyleConstants.Spacing.Global.PagePadding,
|
||||
backgroundColor: colors.backgroundDefault,
|
||||
paddingBottom: disableDetails ? StyleConstants.Spacing.Global.PagePadding : 0
|
||||
}
|
||||
const main = () => (
|
||||
<>
|
||||
{item.reblog ? (
|
||||
<TimelineActioned action='reblog' account={item.account} />
|
||||
) : item._pinned ? (
|
||||
<TimelineActioned action='pinned' account={item.account} />
|
||||
) : null}
|
||||
|
||||
<View style={{ flex: 1, width: '100%', flexDirection: 'row' }}>
|
||||
<TimelineAvatar
|
||||
queryKey={disableOnPress ? undefined : queryKey}
|
||||
account={actualStatus.account}
|
||||
highlighted={highlighted}
|
||||
/>
|
||||
<TimelineHeaderDefault
|
||||
queryKey={disableOnPress ? undefined : queryKey}
|
||||
status={actualStatus}
|
||||
highlighted={highlighted}
|
||||
/>
|
||||
</View>
|
||||
|
||||
<View
|
||||
style={{
|
||||
paddingTop: highlighted ? StyleConstants.Spacing.S : 0,
|
||||
paddingLeft: highlighted ? 0 : StyleConstants.Avatar.M + StyleConstants.Spacing.S
|
||||
}}
|
||||
>
|
||||
{typeof actualStatus.content === 'string' && actualStatus.content.length > 0 ? (
|
||||
<TimelineContent
|
||||
status={actualStatus}
|
||||
highlighted={highlighted}
|
||||
disableDetails={disableDetails}
|
||||
/>
|
||||
) : null}
|
||||
{queryKey && actualStatus.poll ? (
|
||||
<TimelinePoll
|
||||
queryKey={queryKey}
|
||||
rootQueryKey={rootQueryKey}
|
||||
statusId={actualStatus.id}
|
||||
poll={actualStatus.poll}
|
||||
reblog={item.reblog ? true : false}
|
||||
sameAccount={ownAccount}
|
||||
/>
|
||||
) : null}
|
||||
{!disableDetails &&
|
||||
Array.isArray(actualStatus.media_attachments) &&
|
||||
actualStatus.media_attachments.length ? (
|
||||
<TimelineAttachment status={actualStatus} />
|
||||
) : null}
|
||||
{!disableDetails && actualStatus.card ? <TimelineCard card={actualStatus.card} /> : null}
|
||||
{!disableDetails ? (
|
||||
<TimelineFullConversation queryKey={queryKey} status={actualStatus} />
|
||||
) : null}
|
||||
<TimelineTranslate status={actualStatus} highlighted={highlighted} />
|
||||
<TimelineFeedback status={actualStatus} highlighted={highlighted} />
|
||||
</View>
|
||||
|
||||
{queryKey && !disableDetails ? (
|
||||
<TimelineActions
|
||||
queryKey={queryKey}
|
||||
rootQueryKey={rootQueryKey}
|
||||
highlighted={highlighted}
|
||||
status={actualStatus}
|
||||
ownAccount={ownAccount}
|
||||
accts={uniqBy(
|
||||
([actualStatus.account] as Mastodon.Account[] & Mastodon.Mention[])
|
||||
.concat(actualStatus.mentions)
|
||||
.filter(d => d?.id !== instanceAccount?.id),
|
||||
d => d?.id
|
||||
).map(d => d?.acct)}
|
||||
reblog={item.reblog ? true : false}
|
||||
/>
|
||||
) : null}
|
||||
</>
|
||||
)
|
||||
|
||||
return disableOnPress ? (
|
||||
<View style={mainStyle}>{main()}</View>
|
||||
) : (
|
||||
<TimelineContextMenu
|
||||
copiableContent={copiableContent}
|
||||
status={actualStatus}
|
||||
@ -87,86 +169,11 @@ const TimelineDefault: React.FC<Props> = ({
|
||||
>
|
||||
<Pressable
|
||||
accessible={highlighted ? false : true}
|
||||
style={{
|
||||
padding: StyleConstants.Spacing.Global.PagePadding,
|
||||
backgroundColor: colors.backgroundDefault,
|
||||
paddingBottom:
|
||||
disableDetails && disableOnPress ? StyleConstants.Spacing.Global.PagePadding : 0
|
||||
}}
|
||||
style={mainStyle}
|
||||
onPress={onPress}
|
||||
onLongPress={() => {}}
|
||||
>
|
||||
{item.reblog ? (
|
||||
<TimelineActioned action='reblog' account={item.account} />
|
||||
) : item._pinned ? (
|
||||
<TimelineActioned action='pinned' account={item.account} />
|
||||
) : null}
|
||||
|
||||
<View style={{ flex: 1, width: '100%', flexDirection: 'row' }}>
|
||||
<TimelineAvatar
|
||||
queryKey={disableOnPress ? undefined : queryKey}
|
||||
account={actualStatus.account}
|
||||
highlighted={highlighted}
|
||||
/>
|
||||
<TimelineHeaderDefault
|
||||
queryKey={disableOnPress ? undefined : queryKey}
|
||||
status={actualStatus}
|
||||
highlighted={highlighted}
|
||||
/>
|
||||
</View>
|
||||
|
||||
<View
|
||||
style={{
|
||||
paddingTop: highlighted ? StyleConstants.Spacing.S : 0,
|
||||
paddingLeft: highlighted ? 0 : StyleConstants.Avatar.M + StyleConstants.Spacing.S
|
||||
}}
|
||||
>
|
||||
{typeof actualStatus.content === 'string' && actualStatus.content.length > 0 ? (
|
||||
<TimelineContent
|
||||
status={actualStatus}
|
||||
highlighted={highlighted}
|
||||
disableDetails={disableDetails}
|
||||
/>
|
||||
) : null}
|
||||
{queryKey && actualStatus.poll ? (
|
||||
<TimelinePoll
|
||||
queryKey={queryKey}
|
||||
rootQueryKey={rootQueryKey}
|
||||
statusId={actualStatus.id}
|
||||
poll={actualStatus.poll}
|
||||
reblog={item.reblog ? true : false}
|
||||
sameAccount={ownAccount}
|
||||
/>
|
||||
) : null}
|
||||
{!disableDetails &&
|
||||
Array.isArray(actualStatus.media_attachments) &&
|
||||
actualStatus.media_attachments.length ? (
|
||||
<TimelineAttachment status={actualStatus} />
|
||||
) : null}
|
||||
{!disableDetails && actualStatus.card ? <TimelineCard card={actualStatus.card} /> : null}
|
||||
{!disableDetails ? (
|
||||
<TimelineFullConversation queryKey={queryKey} status={actualStatus} />
|
||||
) : null}
|
||||
<TimelineTranslate status={actualStatus} highlighted={highlighted} />
|
||||
<TimelineFeedback status={actualStatus} highlighted={highlighted} />
|
||||
</View>
|
||||
|
||||
{queryKey && !disableDetails ? (
|
||||
<TimelineActions
|
||||
queryKey={queryKey}
|
||||
rootQueryKey={rootQueryKey}
|
||||
highlighted={highlighted}
|
||||
status={actualStatus}
|
||||
ownAccount={ownAccount}
|
||||
accts={uniqBy(
|
||||
([actualStatus.account] as Mastodon.Account[] & Mastodon.Mention[])
|
||||
.concat(actualStatus.mentions)
|
||||
.filter(d => d?.id !== instanceAccount?.id),
|
||||
d => d?.id
|
||||
).map(d => d?.acct)}
|
||||
reblog={item.reblog ? true : false}
|
||||
/>
|
||||
) : null}
|
||||
{main()}
|
||||
</Pressable>
|
||||
</TimelineContextMenu>
|
||||
)
|
||||
|
@ -36,24 +36,22 @@ const TimelineNotifications = React.memo(
|
||||
complete: false
|
||||
})
|
||||
|
||||
if (
|
||||
const filtered =
|
||||
notification.status &&
|
||||
shouldFilter({ copiableContent, status: notification.status, queryKey })
|
||||
) {
|
||||
return <TimelineFiltered />
|
||||
shouldFilter({
|
||||
copiableContent,
|
||||
status: notification.status,
|
||||
queryKey
|
||||
})
|
||||
if (notification.status && filtered) {
|
||||
return <TimelineFiltered phrase={filtered} />
|
||||
}
|
||||
|
||||
const { colors } = useTheme()
|
||||
const instanceAccount = useSelector(
|
||||
getInstanceAccount,
|
||||
(prev, next) => prev?.id === next?.id
|
||||
)
|
||||
const navigation =
|
||||
useNavigation<StackNavigationProp<TabLocalStackParamList>>()
|
||||
const instanceAccount = useSelector(getInstanceAccount, (prev, next) => prev?.id === next?.id)
|
||||
const navigation = useNavigation<StackNavigationProp<TabLocalStackParamList>>()
|
||||
|
||||
const actualAccount = notification.status
|
||||
? notification.status.account
|
||||
: notification.account
|
||||
const actualAccount = notification.status ? notification.status.account : notification.account
|
||||
|
||||
const onPress = useCallback(() => {
|
||||
analytics('timeline_notification_press')
|
||||
@ -74,9 +72,7 @@ const TimelineNotifications = React.memo(
|
||||
style={{
|
||||
padding: StyleConstants.Spacing.Global.PagePadding,
|
||||
backgroundColor: colors.backgroundDefault,
|
||||
paddingBottom: notification.status
|
||||
? 0
|
||||
: StyleConstants.Spacing.Global.PagePadding
|
||||
paddingBottom: notification.status ? 0 : StyleConstants.Spacing.Global.PagePadding
|
||||
}}
|
||||
onPress={onPress}
|
||||
onLongPress={() => {}}
|
||||
@ -106,26 +102,18 @@ const TimelineNotifications = React.memo(
|
||||
account={actualAccount}
|
||||
highlighted={highlighted}
|
||||
/>
|
||||
<TimelineHeaderNotification
|
||||
queryKey={queryKey}
|
||||
notification={notification}
|
||||
/>
|
||||
<TimelineHeaderNotification queryKey={queryKey} notification={notification} />
|
||||
</View>
|
||||
|
||||
{notification.status ? (
|
||||
<View
|
||||
style={{
|
||||
paddingTop: highlighted ? StyleConstants.Spacing.S : 0,
|
||||
paddingLeft: highlighted
|
||||
? 0
|
||||
: StyleConstants.Avatar.M + StyleConstants.Spacing.S
|
||||
paddingLeft: highlighted ? 0 : StyleConstants.Avatar.M + StyleConstants.Spacing.S
|
||||
}}
|
||||
>
|
||||
{notification.status.content.length > 0 ? (
|
||||
<TimelineContent
|
||||
status={notification.status}
|
||||
highlighted={highlighted}
|
||||
/>
|
||||
<TimelineContent status={notification.status} highlighted={highlighted} />
|
||||
) : null}
|
||||
{notification.status.poll ? (
|
||||
<TimelinePoll
|
||||
@ -133,21 +121,14 @@ const TimelineNotifications = React.memo(
|
||||
statusId={notification.status.id}
|
||||
poll={notification.status.poll}
|
||||
reblog={false}
|
||||
sameAccount={
|
||||
notification.account.id === instanceAccount?.id
|
||||
}
|
||||
sameAccount={notification.account.id === instanceAccount?.id}
|
||||
/>
|
||||
) : null}
|
||||
{notification.status.media_attachments.length > 0 ? (
|
||||
<TimelineAttachment status={notification.status} />
|
||||
) : null}
|
||||
{notification.status.card ? (
|
||||
<TimelineCard card={notification.status.card} />
|
||||
) : null}
|
||||
<TimelineFullConversation
|
||||
queryKey={queryKey}
|
||||
status={notification.status}
|
||||
/>
|
||||
{notification.status.card ? <TimelineCard card={notification.status.card} /> : null}
|
||||
<TimelineFullConversation queryKey={queryKey} status={notification.status} />
|
||||
</View>
|
||||
) : null}
|
||||
</View>
|
||||
@ -158,10 +139,7 @@ const TimelineNotifications = React.memo(
|
||||
status={notification.status}
|
||||
highlighted={highlighted}
|
||||
accts={uniqBy(
|
||||
(
|
||||
[notification.status.account] as Mastodon.Account[] &
|
||||
Mastodon.Mention[]
|
||||
)
|
||||
([notification.status.account] as Mastodon.Account[] & Mastodon.Mention[])
|
||||
.concat(notification.status.mentions)
|
||||
.filter(d => d?.id !== instanceAccount?.id),
|
||||
d => d?.id
|
||||
|
@ -1,24 +1,184 @@
|
||||
import ComponentAccount from '@components/Account'
|
||||
import analytics from '@components/analytics'
|
||||
import GracefullyImage from '@components/GracefullyImage'
|
||||
import openLink from '@components/openLink'
|
||||
import CustomText from '@components/Text'
|
||||
import { matchAccount, matchStatus } from '@helpers/urlMatcher'
|
||||
import { useNavigation } from '@react-navigation/native'
|
||||
import { useAccountQuery } from '@utils/queryHooks/account'
|
||||
import { useSearchQuery } from '@utils/queryHooks/search'
|
||||
import { useStatusQuery } from '@utils/queryHooks/status'
|
||||
import { StyleConstants } from '@utils/styles/constants'
|
||||
import { useTheme } from '@utils/styles/ThemeManager'
|
||||
import React from 'react'
|
||||
import React, { useEffect, useState } from 'react'
|
||||
import { Pressable, StyleSheet, View } from 'react-native'
|
||||
import { Circle } from 'react-native-animated-spinkit'
|
||||
import TimelineDefault from '../Default'
|
||||
|
||||
export interface Props {
|
||||
card: Pick<
|
||||
Mastodon.Card,
|
||||
'url' | 'image' | 'blurhash' | 'title' | 'description'
|
||||
>
|
||||
card: Pick<Mastodon.Card, 'url' | 'image' | 'blurhash' | 'title' | 'description'>
|
||||
}
|
||||
|
||||
const TimelineCard = React.memo(({ card }: Props) => {
|
||||
const { colors } = useTheme()
|
||||
const navigation = useNavigation()
|
||||
|
||||
const [loading, setLoading] = useState(false)
|
||||
const isStatus = matchStatus(card.url)
|
||||
const [foundStatus, setFoundStatus] = useState<Mastodon.Status>()
|
||||
const isAccount = matchAccount(card.url)
|
||||
const [foundAccount, setFoundAccount] = useState<Mastodon.Account>()
|
||||
|
||||
const searchQuery = useSearchQuery({
|
||||
type: (() => {
|
||||
if (isStatus) return 'statuses'
|
||||
if (isAccount) return 'accounts'
|
||||
})(),
|
||||
term: (() => {
|
||||
if (isStatus) {
|
||||
if (isStatus.sameInstance) {
|
||||
return
|
||||
} else {
|
||||
return card.url
|
||||
}
|
||||
}
|
||||
if (isAccount) {
|
||||
if (isAccount.sameInstance) {
|
||||
if (isAccount.style === 'default') {
|
||||
return
|
||||
} else {
|
||||
return isAccount.username
|
||||
}
|
||||
} else {
|
||||
return card.url
|
||||
}
|
||||
}
|
||||
})(),
|
||||
limit: 1,
|
||||
options: { enabled: false }
|
||||
})
|
||||
|
||||
const statusQuery = useStatusQuery({
|
||||
id: isStatus?.id || '',
|
||||
options: { enabled: false }
|
||||
})
|
||||
useEffect(() => {
|
||||
if (isStatus) {
|
||||
setLoading(true)
|
||||
if (isStatus.sameInstance) {
|
||||
statusQuery
|
||||
.refetch()
|
||||
.then(res => {
|
||||
res.data && setFoundStatus(res.data)
|
||||
setLoading(false)
|
||||
})
|
||||
.catch(() => setLoading(false))
|
||||
} else {
|
||||
searchQuery
|
||||
.refetch()
|
||||
.then(res => {
|
||||
const status = (res.data as any)?.statuses?.[0]
|
||||
status && setFoundStatus(status)
|
||||
setLoading(false)
|
||||
})
|
||||
.catch(() => setLoading(false))
|
||||
}
|
||||
}
|
||||
}, [])
|
||||
|
||||
const accountQuery = useAccountQuery({
|
||||
id: isAccount?.style === 'default' ? isAccount.id : '',
|
||||
options: { enabled: false }
|
||||
})
|
||||
useEffect(() => {
|
||||
if (isAccount) {
|
||||
setLoading(true)
|
||||
if (isAccount.sameInstance && isAccount.style === 'default') {
|
||||
accountQuery
|
||||
.refetch()
|
||||
.then(res => {
|
||||
res.data && setFoundAccount(res.data)
|
||||
setLoading(false)
|
||||
})
|
||||
.catch(() => setLoading(false))
|
||||
} else {
|
||||
searchQuery
|
||||
.refetch()
|
||||
.then(res => {
|
||||
const account = (res.data as any)?.accounts?.[0]
|
||||
account && setFoundAccount(account)
|
||||
setLoading(false)
|
||||
})
|
||||
.catch(() => setLoading(false))
|
||||
}
|
||||
}
|
||||
}, [])
|
||||
|
||||
const cardContent = () => {
|
||||
if (loading) {
|
||||
return (
|
||||
<View
|
||||
style={{
|
||||
flex: 1,
|
||||
justifyContent: 'center',
|
||||
alignItems: 'center',
|
||||
paddingVertical: StyleConstants.Spacing.M
|
||||
}}
|
||||
>
|
||||
<Circle size={StyleConstants.Font.Size.L} color={colors.secondary} />
|
||||
</View>
|
||||
)
|
||||
}
|
||||
if (isStatus && foundStatus) {
|
||||
return <TimelineDefault item={foundStatus} disableDetails disableOnPress origin='card' />
|
||||
}
|
||||
if (isAccount && foundAccount) {
|
||||
return <ComponentAccount account={foundAccount} origin='card' />
|
||||
}
|
||||
return (
|
||||
<>
|
||||
{card.image ? (
|
||||
<GracefullyImage
|
||||
uri={{ original: card.image }}
|
||||
blurhash={card.blurhash}
|
||||
style={{ flexBasis: StyleConstants.Font.LineHeight.M * 5 }}
|
||||
imageStyle={{ borderTopLeftRadius: 6, borderBottomLeftRadius: 6 }}
|
||||
/>
|
||||
) : null}
|
||||
<View style={{ flex: 1, padding: StyleConstants.Spacing.S }}>
|
||||
<CustomText
|
||||
fontStyle='S'
|
||||
numberOfLines={2}
|
||||
style={{
|
||||
marginBottom: StyleConstants.Spacing.XS,
|
||||
color: colors.primaryDefault
|
||||
}}
|
||||
fontWeight='Bold'
|
||||
testID='title'
|
||||
>
|
||||
{card.title}
|
||||
</CustomText>
|
||||
{card.description ? (
|
||||
<CustomText
|
||||
fontStyle='S'
|
||||
numberOfLines={1}
|
||||
style={{
|
||||
marginBottom: StyleConstants.Spacing.XS,
|
||||
color: colors.primaryDefault
|
||||
}}
|
||||
testID='description'
|
||||
>
|
||||
{card.description}
|
||||
</CustomText>
|
||||
) : null}
|
||||
<CustomText fontStyle='S' numberOfLines={1} style={{ color: colors.secondary }}>
|
||||
{card.url}
|
||||
</CustomText>
|
||||
</View>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
return (
|
||||
<Pressable
|
||||
accessible
|
||||
@ -26,10 +186,10 @@ const TimelineCard = React.memo(({ card }: Props) => {
|
||||
style={{
|
||||
flex: 1,
|
||||
flexDirection: 'row',
|
||||
height: StyleConstants.Font.LineHeight.M * 5,
|
||||
minHeight: isAccount && foundAccount ? undefined : StyleConstants.Font.LineHeight.M * 5,
|
||||
marginTop: StyleConstants.Spacing.M,
|
||||
borderWidth: StyleSheet.hairlineWidth,
|
||||
borderRadius: 6,
|
||||
borderRadius: StyleConstants.Spacing.S,
|
||||
overflow: 'hidden',
|
||||
borderColor: colors.border
|
||||
}}
|
||||
@ -37,51 +197,8 @@ const TimelineCard = React.memo(({ card }: Props) => {
|
||||
analytics('timeline_shared_card_press')
|
||||
await openLink(card.url, navigation)
|
||||
}}
|
||||
testID='base'
|
||||
>
|
||||
{card.image ? (
|
||||
<GracefullyImage
|
||||
uri={{ original: card.image }}
|
||||
blurhash={card.blurhash}
|
||||
style={{ flexBasis: StyleConstants.Font.LineHeight.M * 5 }}
|
||||
imageStyle={{ borderTopLeftRadius: 6, borderBottomLeftRadius: 6 }}
|
||||
/>
|
||||
) : null}
|
||||
<View style={{ flex: 1, padding: StyleConstants.Spacing.S }}>
|
||||
<CustomText
|
||||
fontStyle='S'
|
||||
numberOfLines={2}
|
||||
style={{
|
||||
marginBottom: StyleConstants.Spacing.XS,
|
||||
color: colors.primaryDefault
|
||||
}}
|
||||
fontWeight='Bold'
|
||||
testID='title'
|
||||
>
|
||||
{card.title}
|
||||
</CustomText>
|
||||
{card.description ? (
|
||||
<CustomText
|
||||
fontStyle='S'
|
||||
numberOfLines={1}
|
||||
style={{
|
||||
marginBottom: StyleConstants.Spacing.XS,
|
||||
color: colors.primaryDefault
|
||||
}}
|
||||
testID='description'
|
||||
>
|
||||
{card.description}
|
||||
</CustomText>
|
||||
) : null}
|
||||
<CustomText
|
||||
fontStyle='S'
|
||||
numberOfLines={1}
|
||||
style={{ color: colors.secondary }}
|
||||
>
|
||||
{card.url}
|
||||
</CustomText>
|
||||
</View>
|
||||
</Pressable>
|
||||
children={cardContent}
|
||||
/>
|
||||
)
|
||||
})
|
||||
|
||||
|
@ -10,7 +10,7 @@ import { useTranslation } from 'react-i18next'
|
||||
import { View } from 'react-native'
|
||||
|
||||
const TimelineFiltered = React.memo(
|
||||
() => {
|
||||
({ phrase }: { phrase: string }) => {
|
||||
const { colors } = useTheme()
|
||||
const { t } = useTranslation('componentTimeline')
|
||||
|
||||
@ -25,7 +25,7 @@ const TimelineFiltered = React.memo(
|
||||
paddingLeft: StyleConstants.Avatar.M + StyleConstants.Spacing.S
|
||||
}}
|
||||
>
|
||||
{t('shared.filtered')}
|
||||
{t('shared.filtered', { phrase })}
|
||||
</CustomText>
|
||||
</View>
|
||||
)
|
||||
@ -44,34 +44,29 @@ export const shouldFilter = ({
|
||||
}>
|
||||
status: Mastodon.Status
|
||||
queryKey: QueryKeyTimeline
|
||||
}) => {
|
||||
}): string | null => {
|
||||
const instance = getInstance(store.getState())
|
||||
const ownAccount =
|
||||
getInstanceAccount(store.getState())?.id === status.account?.id
|
||||
const ownAccount = getInstanceAccount(store.getState())?.id === status.account?.id
|
||||
|
||||
let shouldFilter = false
|
||||
let shouldFilter: string | null = null
|
||||
if (!ownAccount) {
|
||||
const parser = new htmlparser2.Parser({
|
||||
ontext: (text: string) => {
|
||||
if (!copiableContent.current.complete) {
|
||||
copiableContent.current.content =
|
||||
copiableContent.current.content + text
|
||||
copiableContent.current.content = copiableContent.current.content + text
|
||||
}
|
||||
|
||||
const checkFilter = (filter: Mastodon.Filter) => {
|
||||
const escapedPhrase = filter.phrase.replace(
|
||||
/[.*+?^${}()|[\]\\]/g,
|
||||
'\\$&'
|
||||
) // $& means the whole matched string
|
||||
const escapedPhrase = filter.phrase.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') // $& means the whole matched string
|
||||
switch (filter.whole_word) {
|
||||
case true:
|
||||
if (new RegExp('\\b' + escapedPhrase + '\\b').test(text)) {
|
||||
shouldFilter = true
|
||||
shouldFilter = filter.phrase
|
||||
}
|
||||
break
|
||||
case false:
|
||||
if (new RegExp(escapedPhrase).test(text)) {
|
||||
shouldFilter = true
|
||||
shouldFilter = filter.phrase
|
||||
}
|
||||
break
|
||||
}
|
||||
|
@ -81,23 +81,14 @@ const TimelineHeaderDefault = ({ queryKey, status, highlighted }: Props) => {
|
||||
{queryKey ? (
|
||||
<Pressable
|
||||
accessibilityHint={t('accessibilityHint')}
|
||||
style={{
|
||||
flex: 1,
|
||||
flexDirection: 'row',
|
||||
justifyContent: 'center',
|
||||
marginBottom: StyleConstants.Spacing.L
|
||||
}}
|
||||
style={{ flex: 1, flexBasis: StyleConstants.Font.Size.L }}
|
||||
>
|
||||
<ContextMenu
|
||||
style={{ flex: 1, alignItems: 'center' }}
|
||||
dropdownMenuMode
|
||||
actions={actions}
|
||||
onPress={({ nativeEvent: { index } }) => {
|
||||
for (const on of [
|
||||
shareOnPress,
|
||||
statusOnPress,
|
||||
accountOnPress,
|
||||
instanceOnPress
|
||||
]) {
|
||||
for (const on of [shareOnPress, statusOnPress, accountOnPress, instanceOnPress]) {
|
||||
on && on(index)
|
||||
}
|
||||
}}
|
||||
@ -108,7 +99,6 @@ const TimelineHeaderDefault = ({ queryKey, status, highlighted }: Props) => {
|
||||
size={StyleConstants.Font.Size.L}
|
||||
/>
|
||||
}
|
||||
style={{ width: '100%', height: '100%' }}
|
||||
/>
|
||||
</Pressable>
|
||||
) : null}
|
||||
|
@ -51,14 +51,10 @@ const TimelineHeaderDefault = ({ queryKey, status, highlighted }: Props) => {
|
||||
{queryKey ? (
|
||||
<Pressable
|
||||
accessibilityHint={t('accessibilityHint')}
|
||||
style={{
|
||||
flex: 1,
|
||||
flexDirection: 'row',
|
||||
justifyContent: 'center',
|
||||
marginBottom: StyleConstants.Spacing.L
|
||||
}}
|
||||
style={{ flex: 1, flexBasis: StyleConstants.Font.Size.L }}
|
||||
>
|
||||
<ContextMenu
|
||||
style={{ flex: 1, alignItems: 'center' }}
|
||||
dropdownMenuMode
|
||||
actions={contextMenuContext}
|
||||
onPress={() => {}}
|
||||
|
@ -3,10 +3,7 @@ import contextMenuInstance from '@components/ContextMenu/instance'
|
||||
import contextMenuShare from '@components/ContextMenu/share'
|
||||
import contextMenuStatus from '@components/ContextMenu/status'
|
||||
import Icon from '@components/Icon'
|
||||
import {
|
||||
RelationshipIncoming,
|
||||
RelationshipOutgoing
|
||||
} from '@components/Relationship'
|
||||
import { RelationshipIncoming, RelationshipOutgoing } from '@components/Relationship'
|
||||
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
|
||||
import { StyleConstants } from '@utils/styles/constants'
|
||||
import { useTheme } from '@utils/styles/ThemeManager'
|
||||
@ -32,27 +29,33 @@ const TimelineHeaderNotification = ({ queryKey, notification }: Props) => {
|
||||
const shareOnPress =
|
||||
status && status?.visibility !== 'direct'
|
||||
? contextMenuShare({
|
||||
actions: contextMenuActions,
|
||||
type: 'status',
|
||||
url: status.url || status.uri
|
||||
})
|
||||
actions: contextMenuActions,
|
||||
type: 'status',
|
||||
url: status.url || status.uri
|
||||
})
|
||||
: null
|
||||
const statusOnPress = status && contextMenuStatus({
|
||||
actions: contextMenuActions,
|
||||
status: status,
|
||||
queryKey
|
||||
})
|
||||
const accountOnPress = status && contextMenuAccount({
|
||||
actions: contextMenuActions,
|
||||
type: 'status',
|
||||
queryKey,
|
||||
id: status.account.id
|
||||
})
|
||||
const instanceOnPress = status && contextMenuInstance({
|
||||
actions: contextMenuActions,
|
||||
status: status,
|
||||
queryKey
|
||||
})
|
||||
const statusOnPress =
|
||||
status &&
|
||||
contextMenuStatus({
|
||||
actions: contextMenuActions,
|
||||
status: status,
|
||||
queryKey
|
||||
})
|
||||
const accountOnPress =
|
||||
status &&
|
||||
contextMenuAccount({
|
||||
actions: contextMenuActions,
|
||||
type: 'status',
|
||||
queryKey,
|
||||
id: status.account.id
|
||||
})
|
||||
const instanceOnPress =
|
||||
status &&
|
||||
contextMenuInstance({
|
||||
actions: contextMenuActions,
|
||||
status: status,
|
||||
queryKey
|
||||
})
|
||||
|
||||
const actions = useMemo(() => {
|
||||
switch (notification.type) {
|
||||
@ -64,14 +67,10 @@ const TimelineHeaderNotification = ({ queryKey, notification }: Props) => {
|
||||
if (notification.status) {
|
||||
return (
|
||||
<Pressable
|
||||
style={{
|
||||
flex: 1,
|
||||
flexDirection: 'row',
|
||||
justifyContent: 'center',
|
||||
paddingBottom: StyleConstants.Spacing.S
|
||||
}}
|
||||
style={{ flex: 1, flexBasis: StyleConstants.Font.Size.L }}
|
||||
children={
|
||||
<ContextMenu
|
||||
style={{ flex: 1, alignItems: 'center' }}
|
||||
dropdownMenuMode
|
||||
actions={contextMenuActions}
|
||||
onPress={({ nativeEvent: { index } }) => {
|
||||
@ -91,7 +90,6 @@ const TimelineHeaderNotification = ({ queryKey, notification }: Props) => {
|
||||
size={StyleConstants.Font.Size.L}
|
||||
/>
|
||||
}
|
||||
style={{ width: '100%', height: '100%' }}
|
||||
/>
|
||||
}
|
||||
/>
|
||||
@ -104,21 +102,14 @@ const TimelineHeaderNotification = ({ queryKey, notification }: Props) => {
|
||||
<View style={{ flex: 1, flexDirection: 'row' }}>
|
||||
<View
|
||||
style={{
|
||||
flex:
|
||||
notification.type === 'follow' ||
|
||||
notification.type === 'follow_request'
|
||||
? 1
|
||||
: 4
|
||||
flex: notification.type === 'follow' || notification.type === 'follow_request' ? 1 : 4
|
||||
}}
|
||||
>
|
||||
<HeaderSharedAccount
|
||||
account={
|
||||
notification.status
|
||||
? notification.status.account
|
||||
: notification.account
|
||||
}
|
||||
{...((notification.type === 'follow' ||
|
||||
notification.type === 'follow_request') && { withoutName: true })}
|
||||
account={notification.status ? notification.status.account : notification.account}
|
||||
{...((notification.type === 'follow' || notification.type === 'follow_request') && {
|
||||
withoutName: true
|
||||
})}
|
||||
/>
|
||||
<View
|
||||
style={{
|
||||
@ -129,28 +120,21 @@ const TimelineHeaderNotification = ({ queryKey, notification }: Props) => {
|
||||
}}
|
||||
>
|
||||
<HeaderSharedCreated
|
||||
created_at={
|
||||
notification.status?.created_at || notification.created_at
|
||||
}
|
||||
created_at={notification.status?.created_at || notification.created_at}
|
||||
edited_at={notification.status?.edited_at}
|
||||
/>
|
||||
{notification.status?.visibility ? (
|
||||
<HeaderSharedVisibility
|
||||
visibility={notification.status.visibility}
|
||||
/>
|
||||
<HeaderSharedVisibility visibility={notification.status.visibility} />
|
||||
) : null}
|
||||
<HeaderSharedMuted muted={notification.status?.muted} />
|
||||
<HeaderSharedApplication
|
||||
application={notification.status?.application}
|
||||
/>
|
||||
<HeaderSharedApplication application={notification.status?.application} />
|
||||
</View>
|
||||
</View>
|
||||
|
||||
<View
|
||||
style={[
|
||||
{ marginLeft: StyleConstants.Spacing.M },
|
||||
notification.type === 'follow' ||
|
||||
notification.type === 'follow_request'
|
||||
notification.type === 'follow' || notification.type === 'follow_request'
|
||||
? { flexShrink: 1 }
|
||||
: { flex: 1 }
|
||||
]}
|
||||
|
@ -1,8 +1,5 @@
|
||||
import Icon from '@components/Icon'
|
||||
import {
|
||||
RelationshipIncoming,
|
||||
RelationshipOutgoing
|
||||
} from '@components/Relationship'
|
||||
import { RelationshipIncoming, RelationshipOutgoing } from '@components/Relationship'
|
||||
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
|
||||
import { StyleConstants } from '@utils/styles/constants'
|
||||
import { useTheme } from '@utils/styles/ThemeManager'
|
||||
@ -36,14 +33,10 @@ const TimelineHeaderNotification = ({ notification }: Props) => {
|
||||
if (notification.status) {
|
||||
return (
|
||||
<Pressable
|
||||
style={{
|
||||
flex: 1,
|
||||
flexDirection: 'row',
|
||||
justifyContent: 'center',
|
||||
paddingBottom: StyleConstants.Spacing.S
|
||||
}}
|
||||
style={{ flex: 1, flexBasis: StyleConstants.Font.Size.L }}
|
||||
children={
|
||||
<ContextMenu
|
||||
style={{ flex: 1, alignItems: 'center' }}
|
||||
dropdownMenuMode
|
||||
actions={contextMenuContext}
|
||||
onPress={() => {}}
|
||||
@ -66,21 +59,14 @@ const TimelineHeaderNotification = ({ notification }: Props) => {
|
||||
<View style={{ flex: 1, flexDirection: 'row' }}>
|
||||
<View
|
||||
style={{
|
||||
flex:
|
||||
notification.type === 'follow' ||
|
||||
notification.type === 'follow_request'
|
||||
? 1
|
||||
: 4
|
||||
flex: notification.type === 'follow' || notification.type === 'follow_request' ? 1 : 4
|
||||
}}
|
||||
>
|
||||
<HeaderSharedAccount
|
||||
account={
|
||||
notification.status
|
||||
? notification.status.account
|
||||
: notification.account
|
||||
}
|
||||
{...((notification.type === 'follow' ||
|
||||
notification.type === 'follow_request') && { withoutName: true })}
|
||||
account={notification.status ? notification.status.account : notification.account}
|
||||
{...((notification.type === 'follow' || notification.type === 'follow_request') && {
|
||||
withoutName: true
|
||||
})}
|
||||
/>
|
||||
<View
|
||||
style={{
|
||||
@ -91,28 +77,21 @@ const TimelineHeaderNotification = ({ notification }: Props) => {
|
||||
}}
|
||||
>
|
||||
<HeaderSharedCreated
|
||||
created_at={
|
||||
notification.status?.created_at || notification.created_at
|
||||
}
|
||||
created_at={notification.status?.created_at || notification.created_at}
|
||||
edited_at={notification.status?.edited_at}
|
||||
/>
|
||||
{notification.status?.visibility ? (
|
||||
<HeaderSharedVisibility
|
||||
visibility={notification.status.visibility}
|
||||
/>
|
||||
<HeaderSharedVisibility visibility={notification.status.visibility} />
|
||||
) : null}
|
||||
<HeaderSharedMuted muted={notification.status?.muted} />
|
||||
<HeaderSharedApplication
|
||||
application={notification.status?.application}
|
||||
/>
|
||||
<HeaderSharedApplication application={notification.status?.application} />
|
||||
</View>
|
||||
</View>
|
||||
|
||||
<View
|
||||
style={[
|
||||
{ marginLeft: StyleConstants.Spacing.M },
|
||||
notification.type === 'follow' ||
|
||||
notification.type === 'follow_request'
|
||||
notification.type === 'follow' || notification.type === 'follow_request'
|
||||
? { flexShrink: 1 }
|
||||
: { flex: 1 }
|
||||
]}
|
||||
|
@ -1,24 +1,12 @@
|
||||
import apiInstance from '@api/instance'
|
||||
import navigationRef from '@helpers/navigationRef'
|
||||
import { matchAccount, matchStatus } from '@helpers/urlMatcher'
|
||||
import { store } from '@root/store'
|
||||
import { SearchResult } from '@utils/queryHooks/search'
|
||||
import { getInstanceUrl } from '@utils/slices/instancesSlice'
|
||||
import { getSettingsBrowser } from '@utils/slices/settingsSlice'
|
||||
import * as Linking from 'expo-linking'
|
||||
import * as WebBrowser from 'expo-web-browser'
|
||||
|
||||
// https://social.xmflsct.com/web/statuses/105590085754428765 <- default
|
||||
// https://social.xmflsct.com/@tooot/105590085754428765 <- pretty
|
||||
const matcherStatus = new RegExp(
|
||||
/http[s]?:\/\/(.*)\/(web\/statuses|@.*)\/([0-9]*)/
|
||||
)
|
||||
|
||||
// https://social.xmflsct.com/web/accounts/14195 <- default
|
||||
// https://social.xmflsct.com/@tooot <- pretty
|
||||
const matcherAccount = new RegExp(
|
||||
/http[s]?:\/\/(.*)\/(web\/accounts\/([0-9]*)|@.*)/
|
||||
)
|
||||
|
||||
export let loadingLink = false
|
||||
|
||||
const openLink = async (url: string, navigation?: any) => {
|
||||
@ -26,10 +14,7 @@ const openLink = async (url: string, navigation?: any) => {
|
||||
return
|
||||
}
|
||||
|
||||
const handleNavigation = (
|
||||
page: 'Tab-Shared-Toot' | 'Tab-Shared-Account',
|
||||
options: {}
|
||||
) => {
|
||||
const handleNavigation = (page: 'Tab-Shared-Toot' | 'Tab-Shared-Account', options: {}) => {
|
||||
if (navigation) {
|
||||
// @ts-ignore
|
||||
navigation.push(page, options)
|
||||
@ -40,14 +25,10 @@ const openLink = async (url: string, navigation?: any) => {
|
||||
}
|
||||
|
||||
// If a tooot can be found
|
||||
const matchedStatus = url.match(matcherStatus)
|
||||
if (matchedStatus) {
|
||||
// If the link in current instance
|
||||
const instanceUrl = getInstanceUrl(store.getState())
|
||||
if (matchedStatus[1] === instanceUrl) {
|
||||
handleNavigation('Tab-Shared-Toot', {
|
||||
toot: { id: matchedStatus[3] }
|
||||
})
|
||||
const isStatus = matchStatus(url)
|
||||
if (isStatus) {
|
||||
if (isStatus.sameInstance) {
|
||||
handleNavigation('Tab-Shared-Toot', { toot: { id: isStatus.id } })
|
||||
return
|
||||
}
|
||||
|
||||
@ -71,15 +52,11 @@ const openLink = async (url: string, navigation?: any) => {
|
||||
}
|
||||
|
||||
// If an account can be found
|
||||
const matchedAccount = url.match(matcherAccount)
|
||||
if (matchedAccount) {
|
||||
// If the link in current instance
|
||||
const instanceUrl = getInstanceUrl(store.getState())
|
||||
if (matchedAccount[1] === instanceUrl) {
|
||||
if (matchedAccount[3] && matchedAccount[3].match(/[0-9]*/)) {
|
||||
handleNavigation('Tab-Shared-Account', {
|
||||
account: { id: matchedAccount[3] }
|
||||
})
|
||||
const isAccount = matchAccount(url)
|
||||
if (isAccount) {
|
||||
if (isAccount.sameInstance) {
|
||||
if (isAccount.style === 'default' && isAccount.id) {
|
||||
handleNavigation('Tab-Shared-Account', { account: isAccount })
|
||||
return
|
||||
}
|
||||
}
|
||||
@ -91,7 +68,12 @@ const openLink = async (url: string, navigation?: any) => {
|
||||
version: 'v2',
|
||||
method: 'get',
|
||||
url: 'search',
|
||||
params: { type: 'accounts', q: url, limit: 1, resolve: true }
|
||||
params: {
|
||||
type: 'accounts',
|
||||
q: isAccount.sameInstance && isAccount.style === 'pretty' ? isAccount.username : url,
|
||||
limit: 1,
|
||||
resolve: true
|
||||
}
|
||||
})
|
||||
} catch {}
|
||||
if (response && response.body && response.body.accounts.length) {
|
||||
|
@ -1,4 +1,9 @@
|
||||
[
|
||||
{
|
||||
"feature": "account_return_suspended",
|
||||
"version": 3.3,
|
||||
"reference": "https://github.com/mastodon/mastodon/releases/tag/v3.3.0"
|
||||
},
|
||||
{
|
||||
"feature": "edit_post",
|
||||
"version": 3.5,
|
||||
@ -9,11 +14,6 @@
|
||||
"version": 3.5,
|
||||
"reference": "https://github.com/mastodon/mastodon/releases/tag/v3.5.0"
|
||||
},
|
||||
{
|
||||
"feature": "notification_type_status",
|
||||
"version": 3.3,
|
||||
"reference": "https://docs.joinmastodon.org/entities/notification/#required-attributes"
|
||||
},
|
||||
{
|
||||
"feature": "notification_type_update",
|
||||
"version": 3.5,
|
||||
|
50
src/helpers/urlMatcher.ts
Normal file
50
src/helpers/urlMatcher.ts
Normal file
@ -0,0 +1,50 @@
|
||||
import { store } from '@root/store'
|
||||
import { getInstanceUrl } from '@utils/slices/instancesSlice'
|
||||
|
||||
const matchStatus = (
|
||||
url: string
|
||||
): { id: string; style: 'default' | 'pretty'; sameInstance: boolean } | null => {
|
||||
// https://social.xmflsct.com/web/statuses/105590085754428765 <- default
|
||||
// https://social.xmflsct.com/@tooot/105590085754428765 <- pretty
|
||||
const matcherStatus = new RegExp(/(https?:\/\/)?([^\/]+)\/(web\/statuses|@.+)\/([0-9]+)/)
|
||||
|
||||
const matched = url.match(matcherStatus)
|
||||
if (matched) {
|
||||
const hostname = matched[2]
|
||||
const style = matched[3] === 'web/statuses' ? 'default' : 'pretty'
|
||||
const id = matched[4]
|
||||
|
||||
const instanceUrl = getInstanceUrl(store.getState())
|
||||
return { id, style, sameInstance: hostname === instanceUrl }
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
|
||||
const matchAccount = (
|
||||
url: string
|
||||
):
|
||||
| { id: string; style: 'default'; sameInstance: boolean }
|
||||
| { username: string; style: 'pretty'; sameInstance: boolean }
|
||||
| null => {
|
||||
// https://social.xmflsct.com/web/accounts/14195 <- default
|
||||
// https://social.xmflsct.com/web/@tooot <- pretty ! cannot be searched on the same instance
|
||||
// https://social.xmflsct.com/@tooot <- pretty
|
||||
const matcherAccount = new RegExp(/(https?:\/\/)?([^\/]+)(\/web|\/web\/accounts)?\/([0-9]+|@.+)/)
|
||||
|
||||
const matched = url.match(matcherAccount)
|
||||
if (matched) {
|
||||
const hostname = matched[2]
|
||||
const style = matched[4].startsWith('@') ? 'pretty' : 'default'
|
||||
const account = matched[4]
|
||||
|
||||
const instanceUrl = getInstanceUrl(store.getState())
|
||||
return style === 'default'
|
||||
? { id: account, style, sameInstance: hostname === instanceUrl }
|
||||
: { username: account, style, sameInstance: hostname === instanceUrl }
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
|
||||
export { matchStatus, matchAccount }
|
@ -8,22 +8,22 @@
|
||||
},
|
||||
"block": {
|
||||
"action_false": "Nutzer blockieren",
|
||||
"action_true": ""
|
||||
"action_true": "User entblocken"
|
||||
},
|
||||
"reports": {
|
||||
"action": "Melden und blockieren"
|
||||
}
|
||||
},
|
||||
"copy": {
|
||||
"action": "",
|
||||
"action": "Tröt kopieren",
|
||||
"succeed": "Kopiert"
|
||||
},
|
||||
"instance": {
|
||||
"title": "",
|
||||
"title": "Instanz-Aktionen",
|
||||
"block": {
|
||||
"action": "Instanz {{instance}} blockieren",
|
||||
"alert": {
|
||||
"title": "",
|
||||
"title": "{{instance}} wirklich blockieren?",
|
||||
"message": "Üblicherweise kannst du einen User stummschalten oder blockieren.\nBlockierst du hingegegen eine Instanz, wird deren gesamter Inhalt samt Usern, die dir von dieser Instanz folgen, entfernt!",
|
||||
"buttons": {
|
||||
"confirm": "Bestätigen"
|
||||
@ -40,7 +40,7 @@
|
||||
}
|
||||
},
|
||||
"status": {
|
||||
"title": "",
|
||||
"title": "Tröt-Befehle",
|
||||
"edit": {
|
||||
"action": "Tröt bearbeiten"
|
||||
},
|
||||
@ -48,17 +48,17 @@
|
||||
"action": "Tröt löschen",
|
||||
"alert": {
|
||||
"title": "Löschen bestätigen?",
|
||||
"message": "",
|
||||
"message": "Alle Boosts, Sterne und Antworten werden entfernt.",
|
||||
"buttons": {
|
||||
"confirm": "Bestätigen"
|
||||
}
|
||||
}
|
||||
},
|
||||
"deleteEdit": {
|
||||
"action": "",
|
||||
"action": "Tröt und Boost entfernen",
|
||||
"alert": {
|
||||
"title": "",
|
||||
"message": "",
|
||||
"title": "Löschen und Boost bestätigen?",
|
||||
"message": "Alle Boosts und Favoriten inklusive der Antworten werden gelöscht.",
|
||||
"buttons": {
|
||||
"confirm": "Bestätigen"
|
||||
}
|
||||
@ -66,11 +66,11 @@
|
||||
},
|
||||
"mute": {
|
||||
"action_false": "Diesen Tröt sowie die Antworten stummschalten",
|
||||
"action_true": ""
|
||||
"action_true": "Tröt und Antworten nicht mehr stummschalten"
|
||||
},
|
||||
"pin": {
|
||||
"action_false": "",
|
||||
"action_true": ""
|
||||
"action_false": "Tröt anheften",
|
||||
"action_true": "Tröt nicht mehr anheften"
|
||||
}
|
||||
}
|
||||
}
|
@ -1 +1,3 @@
|
||||
{}
|
||||
{
|
||||
"frequentUsed": "Häufig genutzt"
|
||||
}
|
@ -14,7 +14,7 @@
|
||||
"base": "Der Login erfolgt über den Browser, so dass Ihre Kontoinformationen für die Toot-App nicht sichtbar sind."
|
||||
},
|
||||
"terms": {
|
||||
"base": ""
|
||||
"base": "Mit dem Login stimmst du der <0>Datenschutzrichtlinie</0> und den <1>Nutzungsbedingungen</1> zu."
|
||||
}
|
||||
},
|
||||
"update": {
|
||||
|
@ -1,10 +1,10 @@
|
||||
{
|
||||
"title": "Datenquelle auswählen",
|
||||
"message": "",
|
||||
"title": "Medienquelle wählen",
|
||||
"message": "EXIF-Metadaten werden nicht hochgeladen",
|
||||
"options": {
|
||||
"image": "",
|
||||
"image_max": "",
|
||||
"video": "",
|
||||
"video_max": ""
|
||||
"image": "Fotos hochladen",
|
||||
"image_max": "Fotos hochladen (max {{max}})",
|
||||
"video": "Video hochladen",
|
||||
"video_max": "Video hochladen (max {{max}})"
|
||||
}
|
||||
}
|
@ -1,8 +1,8 @@
|
||||
{
|
||||
"HTML": {
|
||||
"accessibilityHint": "",
|
||||
"accessibilityHint": "Tippen, um Inhalt aus- oder einzuklappen",
|
||||
"expanded": "{{hint}}{{moreLines}}",
|
||||
"moreLines": "",
|
||||
"defaultHint": ""
|
||||
"moreLines": " ({{count}} weitere Zeilen)",
|
||||
"defaultHint": "Langer Tröt"
|
||||
}
|
||||
}
|
@ -30,7 +30,7 @@
|
||||
"default": "{{name}} hat geboostet",
|
||||
"notification": "{{name}} hat deinen Tröt geboostet"
|
||||
},
|
||||
"update": ""
|
||||
"update": "Boost wurde bearbeitet"
|
||||
},
|
||||
"actions": {
|
||||
"reply": {
|
||||
@ -40,8 +40,8 @@
|
||||
"accessibilityLabel": "Tröt boosten",
|
||||
"function": "Boost",
|
||||
"options": {
|
||||
"title": "",
|
||||
"public": "",
|
||||
"title": "Boost-Sichtbarkeit ändern",
|
||||
"public": "Öffentlicher Boost",
|
||||
"unlisted": ""
|
||||
}
|
||||
},
|
||||
@ -68,7 +68,7 @@
|
||||
"history": {
|
||||
"accessibilityLabel": "Dieser Tröt wurde {{count}} mal bearbeitet",
|
||||
"accessibilityHint": "Für den vollständigen Verlauf auswählen",
|
||||
"text_one": "{{count}} bearbeitet",
|
||||
"text_one": "{{count}} Bearbeitung",
|
||||
"text_other": "{{count}} mal bearbeitet"
|
||||
}
|
||||
},
|
||||
|
@ -12,7 +12,7 @@
|
||||
"description": "Bitte Benachrichtigungsdienst in den Einstellungen erneut aktivieren"
|
||||
},
|
||||
"shareError": {
|
||||
"imageNotSupported": "",
|
||||
"videoNotSupported": ""
|
||||
"imageNotSupported": "Bildformat {{type}} wird nicht unterstützt",
|
||||
"videoNotSupported": "Videoformat {{type}} wird nicht unterstützt"
|
||||
}
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"heading": "",
|
||||
"heading": "Teilen mit...",
|
||||
"content": {
|
||||
"select_account": ""
|
||||
"select_account": "Konto auswählen"
|
||||
}
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"content": {
|
||||
"altText": {
|
||||
"heading": ""
|
||||
"heading": "Alternativtext"
|
||||
},
|
||||
"notificationsFilter": {
|
||||
"heading": "Benachrichtigungsart anzeigen",
|
||||
@ -13,7 +13,7 @@
|
||||
"mention": "$t(screenTabs:me.push.mention.heading)",
|
||||
"poll": "$t(screenTabs:me.push.poll.heading)",
|
||||
"status": "",
|
||||
"update": ""
|
||||
"update": "Boost wurde bearbeitet"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -45,7 +45,7 @@
|
||||
"placeholder": "Was geht in dir vor",
|
||||
"keyboardImage": {
|
||||
"exceedMaximum": {
|
||||
"title": "",
|
||||
"title": "Maximale Anzahl von Anhängen erreicht",
|
||||
"OK": "$t(common:buttons.OK)"
|
||||
}
|
||||
}
|
||||
@ -82,7 +82,7 @@
|
||||
},
|
||||
"increase": {
|
||||
"accessibilityLabel": "Erhöhe Anzahl der Antwortmöglichkeiten auf {{amount}}",
|
||||
"accessibilityHint": ""
|
||||
"accessibilityHint": "Maximale Anzahl der Auswahlmöglichkeiten erreicht, aktuell {{amount}}"
|
||||
}
|
||||
},
|
||||
"multiple": {
|
||||
@ -114,42 +114,42 @@
|
||||
"accessibilityHint": "Umfrage wird entfernt, wenn ein Anhang vorhanden ist",
|
||||
"failed": {
|
||||
"alert": {
|
||||
"title": "",
|
||||
"title": "Upload fehlgeschlagen",
|
||||
"button": "Noch einmal versuchen"
|
||||
}
|
||||
}
|
||||
},
|
||||
"poll": {
|
||||
"accessibilityLabel": "",
|
||||
"accessibilityHint": ""
|
||||
"accessibilityLabel": "Umfrage hinzufügen",
|
||||
"accessibilityHint": "Anhang ist bei Umfragen nicht möglich"
|
||||
},
|
||||
"visibility": {
|
||||
"accessibilityLabel": "",
|
||||
"title": "",
|
||||
"accessibilityLabel": "Sichtbarkeit des Tröts ist {{visibility}}",
|
||||
"title": "Sichtbarkeit des Tröts",
|
||||
"options": {
|
||||
"public": "Öffentlich",
|
||||
"unlisted": "Ungelistet",
|
||||
"private": "Nur für Folgende",
|
||||
"direct": "",
|
||||
"direct": "Direktnachricht",
|
||||
"cancel": "$t(common:buttons.cancel)"
|
||||
}
|
||||
},
|
||||
"spoiler": {
|
||||
"accessibilityLabel": ""
|
||||
"accessibilityLabel": "Spoiler"
|
||||
},
|
||||
"emoji": {
|
||||
"accessibilityLabel": "",
|
||||
"accessibilityLabel": "Emoji hinzufügen",
|
||||
"accessibilityHint": ""
|
||||
}
|
||||
},
|
||||
"drafts_one": "",
|
||||
"drafts_other": ""
|
||||
"drafts_one": "Entwurf ({{count}})",
|
||||
"drafts_other": "Entwürfe ({{count}})"
|
||||
},
|
||||
"editAttachment": {
|
||||
"header": {
|
||||
"title": "Anhang bearbeiten",
|
||||
"right": {
|
||||
"accessibilityLabel": "",
|
||||
"accessibilityLabel": "Anhang speichern",
|
||||
"failed": {
|
||||
"title": "Bearbeitung fehlgeschlagen",
|
||||
"button": "Noch einmal versuchen"
|
||||
@ -168,12 +168,12 @@
|
||||
"header": {
|
||||
"title": "Entwurf"
|
||||
},
|
||||
"warning": "",
|
||||
"warning": "Entwürfe werden nur lokal gespeichert und können bei Abstürzen verloren gehen. Diese Funktion bitte nicht für dauerhafte Entwürfe nutzen.",
|
||||
"content": {
|
||||
"accessibilityHint": "Gespeicherter Entwurf, tippe, um diesen zu bearbeiten",
|
||||
"textEmpty": "Kein Inhalt"
|
||||
},
|
||||
"checkAttachment": ""
|
||||
"checkAttachment": "Prüfe Anhänge auf dem Server..."
|
||||
}
|
||||
}
|
||||
}
|
@ -146,7 +146,7 @@
|
||||
"label": "Kennzeichnung",
|
||||
"content": "Inhalt"
|
||||
},
|
||||
"mediaSelectionFailed": ""
|
||||
"mediaSelectionFailed": "Verarbeitung des Bildes fehlgeschlagen. Bitte erneut versuchen."
|
||||
},
|
||||
"push": {
|
||||
"notAvailable": "Dein Gerät unterstützt keine Push-Benachrichtigung",
|
||||
@ -169,7 +169,7 @@
|
||||
"heading": "Neue Follower"
|
||||
},
|
||||
"follow_request": {
|
||||
"heading": ""
|
||||
"heading": "Followeranfrage"
|
||||
},
|
||||
"favourite": {
|
||||
"heading": "Favoriten"
|
||||
@ -260,8 +260,8 @@
|
||||
}
|
||||
},
|
||||
"staticEmoji": {
|
||||
"heading": "",
|
||||
"description": ""
|
||||
"heading": "System-Emojis verwenden",
|
||||
"description": "Wenn du beim Betrachten der Emoji-Liste häufige App-Abstürze feststellst, kannst du stattdessen versuchen, statische Emoji zu verwenden."
|
||||
},
|
||||
"feedback": {
|
||||
"heading": "Neue Funktion vorschlagen"
|
||||
@ -280,7 +280,7 @@
|
||||
"description": "Es werden ausschließlich Daten gesammelt, welche nicht nutzerbezogen sind"
|
||||
},
|
||||
"version": "Version v{{version}}",
|
||||
"instanceVersion": ""
|
||||
"instanceVersion": "Mastodon Version {{version}}"
|
||||
},
|
||||
"switch": {
|
||||
"existing": "Wähle ein Konto aus",
|
||||
@ -293,7 +293,7 @@
|
||||
"accessibilityLabel": "Aktionen für Benutzer {{user}}",
|
||||
"accessibilityHint": "Du kannst diesen Benutzer stummschalten, blockieren, melden oder teilen"
|
||||
},
|
||||
"followed_by": "",
|
||||
"followed_by": " folgt dir",
|
||||
"moved": "Benutzer umgezogen",
|
||||
"created_at": "Registriert am: {{date}}",
|
||||
"summary": {
|
||||
@ -304,7 +304,8 @@
|
||||
"toots": {
|
||||
"default": "Tröts",
|
||||
"all": "Tröts und DruTröts"
|
||||
}
|
||||
},
|
||||
"suspended": "Konto wurde von den Instanzmoderation gesperrt"
|
||||
},
|
||||
"attachments": {
|
||||
"name": "<0 /><1>\"s Medien</1>"
|
||||
@ -347,7 +348,7 @@
|
||||
}
|
||||
},
|
||||
"history": {
|
||||
"name": ""
|
||||
"name": "Bearbeitungsverlauf"
|
||||
}
|
||||
}
|
||||
}
|
@ -88,7 +88,7 @@
|
||||
"content": {
|
||||
"expandHint": "Hidden content"
|
||||
},
|
||||
"filtered": "Filtered",
|
||||
"filtered": "Filtered: {{phrase}}.",
|
||||
"fullConversation": "Read conversations",
|
||||
"translate": {
|
||||
"default": "Translate",
|
||||
|
@ -304,7 +304,8 @@
|
||||
"toots": {
|
||||
"default": "Toots",
|
||||
"all": "Toots and replies"
|
||||
}
|
||||
},
|
||||
"suspended": "Account suspended by the moderators of your server"
|
||||
},
|
||||
"attachments": {
|
||||
"name": "<0 /><1>\"s media</1>"
|
||||
|
22
src/i18n/fr/common.json
Normal file
22
src/i18n/fr/common.json
Normal file
@ -0,0 +1,22 @@
|
||||
{
|
||||
"buttons": {
|
||||
"OK": "Ok",
|
||||
"apply": "Confirmer",
|
||||
"cancel": "Annuler"
|
||||
},
|
||||
"customEmoji": {
|
||||
"accessibilityLabel": "Émoji personnalisé {{emoji}}"
|
||||
},
|
||||
"message": {
|
||||
"success": {
|
||||
"message": "{{function}} succès"
|
||||
},
|
||||
"warning": {
|
||||
"message": ""
|
||||
},
|
||||
"error": {
|
||||
"message": "Échec de la connexion, veuillez réessayer"
|
||||
}
|
||||
},
|
||||
"separator": ", "
|
||||
}
|
76
src/i18n/fr/components/contextMenu.json
Normal file
76
src/i18n/fr/components/contextMenu.json
Normal file
@ -0,0 +1,76 @@
|
||||
{
|
||||
"accessibilityHint": "Actions pour ce toot, telles que son utilisateur affiché, le toot lui-même",
|
||||
"account": {
|
||||
"title": "Actions de l'utilisateur",
|
||||
"mute": {
|
||||
"action_false": "Rendre muet l'utilisateur",
|
||||
"action_true": "Rendre la parole"
|
||||
},
|
||||
"block": {
|
||||
"action_false": "Bloquer l'utilisateur",
|
||||
"action_true": "Débloquer l'utilisateur"
|
||||
},
|
||||
"reports": {
|
||||
"action": "Signaler et bloquer"
|
||||
}
|
||||
},
|
||||
"copy": {
|
||||
"action": "Copier le pouet",
|
||||
"succeed": "Copié"
|
||||
},
|
||||
"instance": {
|
||||
"title": "Action de l'instance",
|
||||
"block": {
|
||||
"action": "Bloquer l'instance {{instance}}",
|
||||
"alert": {
|
||||
"title": "Confirmer le blocage de l'instance {{instance}}?",
|
||||
"message": "Vous pouvez masquer ou bloquer certains utilisateurs.\n\nAprès avoir bloqué l'instance, tout son contenu, y compris les followers de cette instance, sera supprimé !",
|
||||
"buttons": {
|
||||
"confirm": "Confirmer"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"share": {
|
||||
"status": {
|
||||
"action": "Partager le pouet"
|
||||
},
|
||||
"account": {
|
||||
"action": "Partage l'utilisateur"
|
||||
}
|
||||
},
|
||||
"status": {
|
||||
"title": "Actions du pouet",
|
||||
"edit": {
|
||||
"action": "Editer le pouet"
|
||||
},
|
||||
"delete": {
|
||||
"action": "Supprimer le pouet",
|
||||
"alert": {
|
||||
"title": "Confirmer la suppression ?",
|
||||
"message": "Tous les boosts et favoris seront effacés, y compris toutes les réponses.",
|
||||
"buttons": {
|
||||
"confirm": "Confirmer"
|
||||
}
|
||||
}
|
||||
},
|
||||
"deleteEdit": {
|
||||
"action": "Supprimer le pouet et le repost",
|
||||
"alert": {
|
||||
"title": "Confirmer la suppression et le repost ?",
|
||||
"message": "Tous les boosts et favoris seront effacés, y compris toutes les réponses.",
|
||||
"buttons": {
|
||||
"confirm": "Confirmer"
|
||||
}
|
||||
}
|
||||
},
|
||||
"mute": {
|
||||
"action_false": "Couper le pouet et les réponses",
|
||||
"action_true": "Couper le pouet et les réponses"
|
||||
},
|
||||
"pin": {
|
||||
"action_false": "Pouet épinglé",
|
||||
"action_true": "Détacher le pouet"
|
||||
}
|
||||
}
|
||||
}
|
3
src/i18n/fr/components/emojis.json
Normal file
3
src/i18n/fr/components/emojis.json
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"frequentUsed": "Fréquemment utilisés"
|
||||
}
|
30
src/i18n/fr/components/instance.json
Normal file
30
src/i18n/fr/components/instance.json
Normal file
@ -0,0 +1,30 @@
|
||||
{
|
||||
"server": {
|
||||
"textInput": {
|
||||
"placeholder": "Domaine d'instance"
|
||||
},
|
||||
"button": "Connexion",
|
||||
"information": {
|
||||
"name": "Nom",
|
||||
"accounts": "Utilisateurs",
|
||||
"statuses": "Pouets",
|
||||
"domains": "Univers"
|
||||
},
|
||||
"disclaimer": {
|
||||
"base": "Le processus de connexion utilise le navigateur du système. Les informations de votre compte ne seront pas visibles par l'application tooot."
|
||||
},
|
||||
"terms": {
|
||||
"base": "En vous connectant, vous acceptez la <0>politique de confidentialité</0> et les <1>conditions de service</1>."
|
||||
}
|
||||
},
|
||||
"update": {
|
||||
"alert": {
|
||||
"title": "Connecté à cette instance",
|
||||
"message": "Vous pouvez vous connecter à un autre compte, en maintenant un compte connecté existant",
|
||||
"buttons": {
|
||||
"cancel": "$t(common:buttons.cancel)",
|
||||
"continue": "Continuer"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
10
src/i18n/fr/components/mediaSelector.json
Normal file
10
src/i18n/fr/components/mediaSelector.json
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"title": "Sélectionnez la source du média",
|
||||
"message": "Les données Media EXIF ne sont pas téléchargées",
|
||||
"options": {
|
||||
"image": "Télécharger des photos",
|
||||
"image_max": "Télécharger des photos (max {{max}})",
|
||||
"video": "Télécharger une vidéo",
|
||||
"video_max": "Télécharger une vidéo (max {{max}})"
|
||||
}
|
||||
}
|
8
src/i18n/fr/components/parse.json
Normal file
8
src/i18n/fr/components/parse.json
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"HTML": {
|
||||
"accessibilityHint": "Appuyez pour agrandir ou réduire le contenu",
|
||||
"expanded": "{{hint}}{{moreLines}}",
|
||||
"moreLines": " ({{count}} lignes en plus)",
|
||||
"defaultHint": "Pouet long"
|
||||
}
|
||||
}
|
16
src/i18n/fr/components/relationship.json
Normal file
16
src/i18n/fr/components/relationship.json
Normal file
@ -0,0 +1,16 @@
|
||||
{
|
||||
"follow": {
|
||||
"function": "Suivre l'utilisateur"
|
||||
},
|
||||
"block": {
|
||||
"function": "Bloquer l'utilisateur"
|
||||
},
|
||||
"button": {
|
||||
"error": "Erreur de chargement",
|
||||
"blocked_by": "Bloqué par l'utilisateur",
|
||||
"blocking": "Débloquer",
|
||||
"following": "Ne plus suivre",
|
||||
"requested": "Retirer la demande",
|
||||
"default": "Suivre"
|
||||
}
|
||||
}
|
152
src/i18n/fr/components/timeline.json
Normal file
152
src/i18n/fr/components/timeline.json
Normal file
@ -0,0 +1,152 @@
|
||||
{
|
||||
"empty": {
|
||||
"error": {
|
||||
"message": "Erreur de chargement",
|
||||
"button": "Réessayer"
|
||||
},
|
||||
"success": {
|
||||
"message": "La chronologie est vide"
|
||||
}
|
||||
},
|
||||
"end": {
|
||||
"message": "Fin, qu'en est-il d'une tasse de <0 />"
|
||||
},
|
||||
"lookback": {
|
||||
"message": "Dernière lecture à"
|
||||
},
|
||||
"refresh": {
|
||||
"fetchPreviousPage": "Plus récent à partir d'ici",
|
||||
"refetch": "À la dernière"
|
||||
},
|
||||
"shared": {
|
||||
"actioned": {
|
||||
"pinned": "Épinglé",
|
||||
"favourite": "{{name}} a mis votre pouet en favoris",
|
||||
"status": "{{name}} vient d'être posté",
|
||||
"follow": "{{name}} vous suit",
|
||||
"follow_request": "{{name}} a demandé à vous suivre",
|
||||
"poll": "Un sondage auquel vous avez participé est maintenant terminé",
|
||||
"reblog": {
|
||||
"default": "{{name}} a partagé",
|
||||
"notification": "{{name}} a partagé votre message"
|
||||
},
|
||||
"update": "Le reblog a été modifié"
|
||||
},
|
||||
"actions": {
|
||||
"reply": {
|
||||
"accessibilityLabel": "Répondre à ce pouet"
|
||||
},
|
||||
"reblogged": {
|
||||
"accessibilityLabel": "Partager ce pouet",
|
||||
"function": "Pouet de Boost",
|
||||
"options": {
|
||||
"title": "Choisir la visibilité du boost",
|
||||
"public": "Boost public",
|
||||
"unlisted": "Retirer le boost"
|
||||
}
|
||||
},
|
||||
"favourited": {
|
||||
"accessibilityLabel": "Ajouter ce pouet aux favoris",
|
||||
"function": "Mettre le pouet en favori"
|
||||
},
|
||||
"bookmarked": {
|
||||
"accessibilityLabel": "Ajouter ce pouet aux signets",
|
||||
"function": "Pouet de signet"
|
||||
}
|
||||
},
|
||||
"actionsUsers": {
|
||||
"reblogged_by": {
|
||||
"accessibilityLabel": "{{count}} utilisateurs ont boosté ce pouet",
|
||||
"accessibilityHint": "Touchez pour connaître les utilisateurs",
|
||||
"text": "$t(screenTabs:shared.users.statuses.reblogged_by)"
|
||||
},
|
||||
"favourited_by": {
|
||||
"accessibilityLabel": "{{count}} utilisateurs ont boosté ce pouet",
|
||||
"accessibilityHint": "Touchez pour connaître les utilisateurs",
|
||||
"text": "$t(screenTabs:shared.users.statuses.favourited_by)"
|
||||
},
|
||||
"history": {
|
||||
"accessibilityLabel": "Ce pouet a été modifié {{count}} fois",
|
||||
"accessibilityHint": "Appuyer pour afficher l'historique d'édition complet",
|
||||
"text_one": "{{count}} modification",
|
||||
"text_other": "{{count}} modifications"
|
||||
}
|
||||
},
|
||||
"attachment": {
|
||||
"sensitive": {
|
||||
"button": "Afficher les médias sensibles"
|
||||
},
|
||||
"unsupported": {
|
||||
"text": "Erreur de chargement",
|
||||
"button": "Essayer le lien distant"
|
||||
}
|
||||
},
|
||||
"avatar": {
|
||||
"accessibilityLabel": "Avatar de {{name}}",
|
||||
"accessibilityHint": "Appuyez pour accéder à la page de {{name}}"
|
||||
},
|
||||
"content": {
|
||||
"expandHint": "Contenu masqué"
|
||||
},
|
||||
"filtered": "Filtré",
|
||||
"fullConversation": "Conversations lues",
|
||||
"translate": {
|
||||
"default": "Traduire",
|
||||
"succeed": "Traduit par {{provider}} de {{source}}",
|
||||
"failed": "La traduction a échoué",
|
||||
"source_not_supported": "cette langue n'est pas prise en charge",
|
||||
"target_not_supported": "Cette langue n'est pas prise en charge"
|
||||
},
|
||||
"header": {
|
||||
"shared": {
|
||||
"account": {
|
||||
"name": {
|
||||
"accessibilityHint": "Nom de l'utilisateur"
|
||||
},
|
||||
"account": {
|
||||
"accessibilityHint": "Compte de l'utilisateur"
|
||||
}
|
||||
},
|
||||
"application": "Poussée avec {{application}}",
|
||||
"edited": {
|
||||
"accessibilityLabel": "Pouet édité"
|
||||
},
|
||||
"muted": {
|
||||
"accessibilityLabel": "Pouet rendu muet"
|
||||
},
|
||||
"visibility": {
|
||||
"direct": {
|
||||
"accessibilityLabel": "Envoyer un message direct"
|
||||
},
|
||||
"private": {
|
||||
"accessibilityLabel": "Visible uniquement pour les abonné·e·s"
|
||||
}
|
||||
}
|
||||
},
|
||||
"conversation": {
|
||||
"withAccounts": "Avec",
|
||||
"delete": {
|
||||
"function": "Supprimer le message direct"
|
||||
}
|
||||
}
|
||||
},
|
||||
"poll": {
|
||||
"meta": {
|
||||
"button": {
|
||||
"vote": "Voter",
|
||||
"refresh": "Actualiser"
|
||||
},
|
||||
"count": {
|
||||
"voters_one": "{{count}} utilisateur a voté",
|
||||
"voters_other": "{{count}} utilisateurs ont voté",
|
||||
"votes_one": "{{count}} votes",
|
||||
"votes_other": "{{count}} votes"
|
||||
},
|
||||
"expiration": {
|
||||
"expired": "Le vote a expiré",
|
||||
"until": "Expire <0 />"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
18
src/i18n/fr/screens.json
Normal file
18
src/i18n/fr/screens.json
Normal file
@ -0,0 +1,18 @@
|
||||
{
|
||||
"screenshot": {
|
||||
"title": "Protection de la confidentialité",
|
||||
"message": "Veuillez ne pas divulguer l'identité d'un autre utilisateur, tel que le nom d'utilisateur, l'avatar, etc. Merci!",
|
||||
"button": "Confirmer"
|
||||
},
|
||||
"localCorrupt": {
|
||||
"message": "Session expirée, veuillez ré-essayer"
|
||||
},
|
||||
"pushError": {
|
||||
"message": "Erreur des services push",
|
||||
"description": "Veuillez réactiver la notification push dans les paramètres"
|
||||
},
|
||||
"shareError": {
|
||||
"imageNotSupported": "Type d'image {{type}} non pris en charge",
|
||||
"videoNotSupported": "Type de vidéo {{type}} non supporté"
|
||||
}
|
||||
}
|
6
src/i18n/fr/screens/accountSelection.json
Normal file
6
src/i18n/fr/screens/accountSelection.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"heading": "Partager avec...",
|
||||
"content": {
|
||||
"select_account": "Sélectionnez un compte"
|
||||
}
|
||||
}
|
20
src/i18n/fr/screens/actions.json
Normal file
20
src/i18n/fr/screens/actions.json
Normal file
@ -0,0 +1,20 @@
|
||||
{
|
||||
"content": {
|
||||
"altText": {
|
||||
"heading": "Texte de remplacement"
|
||||
},
|
||||
"notificationsFilter": {
|
||||
"heading": "Afficher les notifications",
|
||||
"content": {
|
||||
"follow": "$t(screenTabs:me.push.follow.heading)",
|
||||
"follow_request": "Demande d'abonnement",
|
||||
"favourite": "$t(screenTabs:me.push.favourite.heading)",
|
||||
"reblog": "$t(screenTabs:me.push.reblog.heading)",
|
||||
"mention": "$t(screenTabs:me.push.mention.heading)",
|
||||
"poll": "$t(screenTabs:me.push.poll.heading)",
|
||||
"status": "Pouet des utilisateurs abonnés",
|
||||
"update": "Le reblog a été modifié"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
10
src/i18n/fr/screens/announcements.json
Normal file
10
src/i18n/fr/screens/announcements.json
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"heading": "Annonces",
|
||||
"content": {
|
||||
"published": "Publié <0 />",
|
||||
"button": {
|
||||
"read": "Lire",
|
||||
"unread": "Marqué comme lu"
|
||||
}
|
||||
}
|
||||
}
|
179
src/i18n/fr/screens/compose.json
Normal file
179
src/i18n/fr/screens/compose.json
Normal file
@ -0,0 +1,179 @@
|
||||
{
|
||||
"heading": {
|
||||
"left": {
|
||||
"button": "Abandonner",
|
||||
"alert": {
|
||||
"title": "Annuler l’édition?",
|
||||
"buttons": {
|
||||
"save": "Enregistrer comme brouillon",
|
||||
"delete": "Supprimer le brouillon",
|
||||
"cancel": "Abandonner"
|
||||
}
|
||||
}
|
||||
},
|
||||
"right": {
|
||||
"button": {
|
||||
"default": "Pouet",
|
||||
"conversation": "Pouet DM",
|
||||
"reply": "Réponse de pouet",
|
||||
"deleteEdit": "Pouet",
|
||||
"edit": "Pouet",
|
||||
"share": "Pouet"
|
||||
},
|
||||
"alert": {
|
||||
"default": {
|
||||
"title": "Échec du pouet",
|
||||
"button": "Réessayer"
|
||||
},
|
||||
"removeReply": {
|
||||
"title": "Le pouet répondu est introuvable",
|
||||
"description": "Le pouet répondu a peut-être été supprimé. Voulez-vous le supprimer de votre référence ?",
|
||||
"cancel": "$t(common:buttons.cancel)",
|
||||
"confirm": "Supprimer la référence"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"content": {
|
||||
"root": {
|
||||
"header": {
|
||||
"postingAs": "Pouet en tant que @{{acct}}@{{domain}}",
|
||||
"spoilerInput": {
|
||||
"placeholder": "Voir tous les messages d'avertissement"
|
||||
},
|
||||
"textInput": {
|
||||
"placeholder": "Qu’avez-vous en tête",
|
||||
"keyboardImage": {
|
||||
"exceedMaximum": {
|
||||
"title": "Nombre maximum de pièces jointes atteint",
|
||||
"OK": "$t(common:buttons.OK)"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"attachments": {
|
||||
"sensitive": "Marquer les pièces jointes comme étant sensibles",
|
||||
"remove": {
|
||||
"accessibilityLabel": "Retirer la pièce jointe téléchargée, numéro {{attachment}}"
|
||||
},
|
||||
"edit": {
|
||||
"accessibilityLabel": "Editer la pièce jointe téléchargée, numéro {{attachment}}"
|
||||
},
|
||||
"upload": {
|
||||
"accessibilityLabel": "Télécharger plus de pièces jointes"
|
||||
}
|
||||
},
|
||||
"emojis": {
|
||||
"accessibilityHint": "Tapotez pour ajouter des émojis au pouet"
|
||||
},
|
||||
"poll": {
|
||||
"option": {
|
||||
"placeholder": {
|
||||
"accessibilityLabel": "Option du sondage {{index}}",
|
||||
"single": "Choix unique",
|
||||
"multiple": "Choix multiple"
|
||||
}
|
||||
},
|
||||
"quantity": {
|
||||
"reduce": {
|
||||
"accessibilityLabel": "Réduire les options du sondage à {{amount}}",
|
||||
"accessibilityHint": "Quantité minimale d'options de sondage atteinte, actuellement {{amount}}"
|
||||
},
|
||||
"increase": {
|
||||
"accessibilityLabel": "Augmentez les options du sondage à {{amount}}",
|
||||
"accessibilityHint": "Quantité maximum d'options de sondage atteinte, actuellement {{amount}}"
|
||||
}
|
||||
},
|
||||
"multiple": {
|
||||
"heading": "Type de choix",
|
||||
"options": {
|
||||
"single": "Choix unique",
|
||||
"multiple": "Choix multiple",
|
||||
"cancel": "$t(common:buttons.cancel)"
|
||||
}
|
||||
},
|
||||
"expiration": {
|
||||
"heading": "Validité",
|
||||
"options": {
|
||||
"300": "5 minutes",
|
||||
"1800": "30 minutes",
|
||||
"3600": "1 heure",
|
||||
"21600": "6 heures",
|
||||
"86400": "1 jour",
|
||||
"259200": "3 jours",
|
||||
"604800": "7 jours",
|
||||
"cancel": "$t(common:buttons.cancel)"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
"attachment": {
|
||||
"accessibilityLabel": "Téléchargez une pièce-jointe",
|
||||
"accessibilityHint": "La fonction de sondage sera désactivée lorsqu'il y a une pièce jointe",
|
||||
"failed": {
|
||||
"alert": {
|
||||
"title": "Le téléchargement a échoué",
|
||||
"button": "Réessayer"
|
||||
}
|
||||
}
|
||||
},
|
||||
"poll": {
|
||||
"accessibilityLabel": "Ajouter un sondage",
|
||||
"accessibilityHint": "La fonction d'attachement sera désactivée lorsque le sondage est actif"
|
||||
},
|
||||
"visibility": {
|
||||
"accessibilityLabel": "La visibilité de pouet est {{visibility}}",
|
||||
"title": "Visibilité de pouet",
|
||||
"options": {
|
||||
"public": "Public",
|
||||
"unlisted": "Non listé",
|
||||
"private": "Abonné·e·s uniquement",
|
||||
"direct": "Message direct",
|
||||
"cancel": "$t(common:buttons.cancel)"
|
||||
}
|
||||
},
|
||||
"spoiler": {
|
||||
"accessibilityLabel": "Divulgâchage"
|
||||
},
|
||||
"emoji": {
|
||||
"accessibilityLabel": "Ajouter un émoji",
|
||||
"accessibilityHint": "Ouvrir le panneau de sélection des émojis, glisser horizontalement pour changer de page"
|
||||
}
|
||||
},
|
||||
"drafts_one": "Brouillon ({{count}})",
|
||||
"drafts_other": "Brouillons ({{count}})"
|
||||
},
|
||||
"editAttachment": {
|
||||
"header": {
|
||||
"title": "Modifier la pièce jointe",
|
||||
"right": {
|
||||
"accessibilityLabel": "Enregistrement de la pièce jointe",
|
||||
"failed": {
|
||||
"title": "Impossible d'éditer",
|
||||
"button": "Réessayer"
|
||||
}
|
||||
}
|
||||
},
|
||||
"content": {
|
||||
"altText": {
|
||||
"heading": "Décrire cette photo pour les personnes malvoyantes",
|
||||
"placeholder": "Vous pouvez ajouter une description, parfois appelée alt-text, à vos médias afin qu'ils soient accessibles à un plus grand nombre de personnes, y compris celles qui sont aveugles ou malvoyantes.\n\nLes bonnes descriptions sont concises, ou présentent ce qui est dans vos médias avec suffisamment de précision pour comprendre leur contexte."
|
||||
},
|
||||
"imageFocus": "Faites glisser le cercle de focus pour mettre à jour le point de focus"
|
||||
}
|
||||
},
|
||||
"draftsList": {
|
||||
"header": {
|
||||
"title": "Brouillon"
|
||||
},
|
||||
"warning": "Les brouillons ne sont stockés que localement, et peuvent être perdus dans des événements malheureux. Veuillez ne pas utiliser de brouillons pour un stockage à long terme.",
|
||||
"content": {
|
||||
"accessibilityHint": "Brouillon enregistré, appuyez pour modifier ce brouillon",
|
||||
"textEmpty": "Le contenu est vide"
|
||||
},
|
||||
"checkAttachment": "Vérification des pièces jointes sur le serveur..."
|
||||
}
|
||||
}
|
||||
}
|
17
src/i18n/fr/screens/imageViewer.json
Normal file
17
src/i18n/fr/screens/imageViewer.json
Normal file
@ -0,0 +1,17 @@
|
||||
{
|
||||
"content": {
|
||||
"actions": {
|
||||
"accessibilityLabel": "Plus d'actions pour cette image",
|
||||
"accessibilityHint": "Vous pouvez enregistrer ou partager cette image"
|
||||
},
|
||||
"options": {
|
||||
"save": "Enregistrer l'image",
|
||||
"share": "Partager l'image",
|
||||
"cancel": "$t(common:buttons.cancel)"
|
||||
},
|
||||
"save": {
|
||||
"succeed": "Image enregistrée",
|
||||
"failed": "L'enregistrement de l'image a échoué"
|
||||
}
|
||||
}
|
||||
}
|
354
src/i18n/fr/screens/tabs.json
Normal file
354
src/i18n/fr/screens/tabs.json
Normal file
@ -0,0 +1,354 @@
|
||||
{
|
||||
"tabs": {
|
||||
"local": {
|
||||
"name": "Suit"
|
||||
},
|
||||
"public": {
|
||||
"name": "",
|
||||
"segments": {
|
||||
"left": "Fédéré",
|
||||
"right": "Local"
|
||||
}
|
||||
},
|
||||
"notifications": {
|
||||
"name": "Notifications"
|
||||
},
|
||||
"me": {
|
||||
"name": "À propos de moi"
|
||||
}
|
||||
},
|
||||
"common": {
|
||||
"search": {
|
||||
"accessibilityLabel": "Rechercher",
|
||||
"accessibilityHint": "Rechercher des hashtags, des utilisateurs ou des pouets"
|
||||
}
|
||||
},
|
||||
"notifications": {
|
||||
"filter": {
|
||||
"accessibilityLabel": "Filtrer",
|
||||
"accessibilityHint": "Filtrer les types de notifications affichés"
|
||||
}
|
||||
},
|
||||
"me": {
|
||||
"stacks": {
|
||||
"bookmarks": {
|
||||
"name": "Signets"
|
||||
},
|
||||
"conversations": {
|
||||
"name": "Messages directs"
|
||||
},
|
||||
"favourites": {
|
||||
"name": "Favoris"
|
||||
},
|
||||
"fontSize": {
|
||||
"name": "Taille de la police de Pouet"
|
||||
},
|
||||
"language": {
|
||||
"name": "Langue"
|
||||
},
|
||||
"lists": {
|
||||
"name": "Listes"
|
||||
},
|
||||
"list": {
|
||||
"name": "Liste : {{list}}"
|
||||
},
|
||||
"push": {
|
||||
"name": "Push de Notification"
|
||||
},
|
||||
"profile": {
|
||||
"name": "Modifier le profil"
|
||||
},
|
||||
"profileName": {
|
||||
"name": "Editer le nom d'affichage"
|
||||
},
|
||||
"profileNote": {
|
||||
"name": "Éditer la description"
|
||||
},
|
||||
"profileFields": {
|
||||
"name": "Éditer les métadonnées"
|
||||
},
|
||||
"settings": {
|
||||
"name": "Paramètres de l'application"
|
||||
},
|
||||
"webSettings": {
|
||||
"name": "Plus de paramètres de compte"
|
||||
},
|
||||
"switch": {
|
||||
"name": "Passer sur un autre compte"
|
||||
}
|
||||
},
|
||||
"fontSize": {
|
||||
"demo": "<p>Ceci est un pouet de démo😊. Vous pouvez choisir parmi plusieurs options ci-dessous.<br /><br />Ce paramètre n'affecte que le contenu principal des pouets, mais pas les autres tailles de police.</p>",
|
||||
"sizes": {
|
||||
"S": "S",
|
||||
"M": "M - Par Défaut",
|
||||
"L": "L",
|
||||
"XL": "XL",
|
||||
"XXL": "XXL"
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"cancellation": {
|
||||
"title": "Modifications non sauvegardées",
|
||||
"message": "Votre modification n'a pas été enregistrée. Voulez-vous annuler l'enregistrement des modifications ?",
|
||||
"buttons": {
|
||||
"cancel": "$t(common:buttons.cancel)",
|
||||
"discard": "Ne pas tenir compte"
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"succeed": "{{type}} mis à jour",
|
||||
"failed": "{{type}} Échec de la mise à jour, veuillez ré-essayer"
|
||||
},
|
||||
"root": {
|
||||
"name": {
|
||||
"title": "Nom Affiché"
|
||||
},
|
||||
"avatar": {
|
||||
"title": "Avatar",
|
||||
"description": "Sera réduit à 400x400px"
|
||||
},
|
||||
"header": {
|
||||
"title": "Bandeau",
|
||||
"description": "Sera réduit à 1500x500px"
|
||||
},
|
||||
"note": {
|
||||
"title": "Description"
|
||||
},
|
||||
"fields": {
|
||||
"title": "Metadonnés",
|
||||
"total_one": "Champ {{count}}",
|
||||
"total_other": "Champ {{count}}"
|
||||
},
|
||||
"visibility": {
|
||||
"title": "Visibilité de la publication",
|
||||
"options": {
|
||||
"public": "Public",
|
||||
"unlisted": "Non listé",
|
||||
"private": "Abonné·e·s uniquement",
|
||||
"cancel": "$t(common:buttons.cancel)"
|
||||
}
|
||||
},
|
||||
"sensitive": {
|
||||
"title": "Publication de médias sensibles"
|
||||
},
|
||||
"lock": {
|
||||
"title": "Verrouiller le compte",
|
||||
"description": "Nécessite que vous approuviez manuellement chaque abonné·e"
|
||||
},
|
||||
"bot": {
|
||||
"title": "Compte Bot",
|
||||
"description": "Ce compte effectue principalement des actions automatisées et peut ne pas être surveillé"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"group": "Groupe {{index}}",
|
||||
"label": "Étiquette",
|
||||
"content": "Contenu"
|
||||
},
|
||||
"mediaSelectionFailed": "Le traitement de l'image a échoué. Veuillez réessayer."
|
||||
},
|
||||
"push": {
|
||||
"notAvailable": "Votre téléphone ne prend pas en charge la notification push de tooot",
|
||||
"enable": {
|
||||
"direct": "Activer les notifications push",
|
||||
"settings": "Activer dans les paramètres"
|
||||
},
|
||||
"global": {
|
||||
"heading": "Activer pour {{acct}}",
|
||||
"description": "Les messages sont acheminés via le serveur de tooot"
|
||||
},
|
||||
"decode": {
|
||||
"heading": "Détails du message",
|
||||
"description": "Les messages acheminés par le serveur de tooot sont chiffrés, mais vous pouvez choisir de décoder le message sur le serveur. Le code source de notre serveur est open source et aucune politique de log."
|
||||
},
|
||||
"default": {
|
||||
"heading": "Par défaut"
|
||||
},
|
||||
"follow": {
|
||||
"heading": "Nouvel abonné"
|
||||
},
|
||||
"follow_request": {
|
||||
"heading": "Demande d'abonnement"
|
||||
},
|
||||
"favourite": {
|
||||
"heading": "Dans les favoris"
|
||||
},
|
||||
"reblog": {
|
||||
"heading": "Boosté"
|
||||
},
|
||||
"mention": {
|
||||
"heading": "Vous a mentionné(e)"
|
||||
},
|
||||
"poll": {
|
||||
"heading": "Mise à jour du sondage"
|
||||
},
|
||||
"status": {
|
||||
"heading": "Pouet des utilisateurs inscrits"
|
||||
},
|
||||
"howitworks": "Apprenez comment cela fonctionne"
|
||||
},
|
||||
"root": {
|
||||
"announcements": {
|
||||
"content": {
|
||||
"unread": "{{amount}} non lus",
|
||||
"read": "Tout lu",
|
||||
"empty": "Aucun"
|
||||
}
|
||||
},
|
||||
"push": {
|
||||
"content": {
|
||||
"enabled": "Activé",
|
||||
"disabled": "Désactivé"
|
||||
}
|
||||
},
|
||||
"update": {
|
||||
"title": "Mettre à jour vers la dernière version"
|
||||
},
|
||||
"logout": {
|
||||
"button": "Se déconnecter",
|
||||
"alert": {
|
||||
"title": "Déconnexion?",
|
||||
"message": "Après vous être déconnecté, vous devez vous reconnecter",
|
||||
"buttons": {
|
||||
"logout": "Déconnexion",
|
||||
"cancel": "$t(common:buttons.cancel)"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"fontsize": {
|
||||
"heading": "$t(me.stacks.fontSize.name)",
|
||||
"content": {
|
||||
"S": "$t(me.fontSize.sizes.S)",
|
||||
"M": "$t(me.fontSize.sizes.M)",
|
||||
"L": "$t(me.fontSize.sizes.L)",
|
||||
"XL": "$t(me.fontSize.sizes.XL)",
|
||||
"XXL": "$t(me.fontSize.sizes.XXL)"
|
||||
}
|
||||
},
|
||||
"language": {
|
||||
"heading": "$t(me.stacks.language.name)",
|
||||
"options": {
|
||||
"cancel": "$t(common:buttons.cancel)"
|
||||
}
|
||||
},
|
||||
"theme": {
|
||||
"heading": "Apparence",
|
||||
"options": {
|
||||
"auto": "Comme le système",
|
||||
"light": "Mode Clair",
|
||||
"dark": "Mode sombre",
|
||||
"cancel": "$t(common:buttons.cancel)"
|
||||
}
|
||||
},
|
||||
"darkTheme": {
|
||||
"heading": "Thème sombre",
|
||||
"options": {
|
||||
"lighter": "Plus claire",
|
||||
"darker": "Plus sombre",
|
||||
"cancel": "$t(common:buttons.cancel)"
|
||||
}
|
||||
},
|
||||
"browser": {
|
||||
"heading": "Ouverture du lien",
|
||||
"options": {
|
||||
"internal": "Dans l'application",
|
||||
"external": "Ouvrir dans le navigateur système",
|
||||
"cancel": "$t(common:buttons.cancel)"
|
||||
}
|
||||
},
|
||||
"staticEmoji": {
|
||||
"heading": "Utiliser des émojis statiques",
|
||||
"description": "Si vous rencontrez des plantages fréquents de l'application lors de l'affichage de la liste d'émojis, vous pouvez essayer d'utiliser des émojis statiques."
|
||||
},
|
||||
"feedback": {
|
||||
"heading": "Demande de fonctionnalités"
|
||||
},
|
||||
"support": {
|
||||
"heading": "Support de tooot"
|
||||
},
|
||||
"review": {
|
||||
"heading": "Examiner le tooot"
|
||||
},
|
||||
"contact": {
|
||||
"heading": "Contacter tooot"
|
||||
},
|
||||
"analytics": {
|
||||
"heading": "Aidez-nous à nous améliorer",
|
||||
"description": "Collecte uniquement de l'usage relatif des non-utilisateurs"
|
||||
},
|
||||
"version": "Version {{version}}",
|
||||
"instanceVersion": "Version de Mastodon v{{version}}"
|
||||
},
|
||||
"switch": {
|
||||
"existing": "Choisir parmi les utilisateurs connectés",
|
||||
"new": "Connectez-vous à une instance"
|
||||
}
|
||||
},
|
||||
"shared": {
|
||||
"account": {
|
||||
"actions": {
|
||||
"accessibilityLabel": "Actions pour l'utilisateur {{user}}",
|
||||
"accessibilityHint": "Vous pouvez masquer, bloquer, signaler ou partager cet utilisateur"
|
||||
},
|
||||
"followed_by": " vous suit",
|
||||
"moved": "Utilisateur déplacé",
|
||||
"created_at": "Inscrit le : {{date}}",
|
||||
"summary": {
|
||||
"statuses_count": "{{count}} pouets",
|
||||
"following_count": "$t(shared.users.accounts.following)",
|
||||
"followers_count": "$t(shared.users.accounts.followers)"
|
||||
},
|
||||
"toots": {
|
||||
"default": "Pouets",
|
||||
"all": "Pouets et réponses"
|
||||
},
|
||||
"suspended": "Compte suspendu par les modérateurs de votre serveur"
|
||||
},
|
||||
"attachments": {
|
||||
"name": "<0 /><1>\"s media</1>"
|
||||
},
|
||||
"search": {
|
||||
"header": {
|
||||
"prefix": "Recherche en cours",
|
||||
"placeholder": "pour..."
|
||||
},
|
||||
"empty": {
|
||||
"general": "Entrez le mot clé pour rechercher <bold>$t(screenTabs:shared.search.sections.accounts)</bold><unk><bold>$t(screenTabs:shared.search.sections.hashtags)</bold> ou <bold>$t(screenTabs:shared.search.sections.statuses)</bold>",
|
||||
"advanced": {
|
||||
"header": "Recherche avancée",
|
||||
"example": {
|
||||
"account": "$t(shared.search.header.prefix) $t(shared.search.sections.accounts)",
|
||||
"hashtag": "$t(shared.search.header.prefix) $t(shared.search.sections.hashtags)",
|
||||
"statusLink": "$t(shared.search.header.prefix) $t(shared.search.sections.statuses)",
|
||||
"accountLink": "$t(shared.search.header.prefix) $t(shared.search.sections.accounts)"
|
||||
}
|
||||
}
|
||||
},
|
||||
"sections": {
|
||||
"accounts": "Utilisateur",
|
||||
"hashtags": "Hashtag",
|
||||
"statuses": "Pouet"
|
||||
},
|
||||
"notFound": "Impossible de trouver <bold>{{searchTerm}}</bold> lié à {{type}}"
|
||||
},
|
||||
"toot": {
|
||||
"name": "Discussions"
|
||||
},
|
||||
"users": {
|
||||
"accounts": {
|
||||
"following": "Abonnements {{count}}",
|
||||
"followers": "{{count}} abonnés"
|
||||
},
|
||||
"statuses": {
|
||||
"reblogged_by": "{{count}} boosté",
|
||||
"favourited_by": "{{count}} mis en favori"
|
||||
}
|
||||
},
|
||||
"history": {
|
||||
"name": "Modifier l'historique"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,15 +1,16 @@
|
||||
import i18n from 'i18next'
|
||||
import { initReactI18next } from 'react-i18next'
|
||||
|
||||
import de from '@root/i18n/de/_all'
|
||||
import en from '@root/i18n/en/_all'
|
||||
import it from '@root/i18n/it/_all'
|
||||
import ja from '@root/i18n/ja/_all'
|
||||
import ko from '@root/i18n/ko/_all'
|
||||
import pt_BR from '@root/i18n/pt_BR/_all'
|
||||
import vi from '@root/i18n/vi/_all'
|
||||
import zh_Hans from '@root/i18n/zh-Hans/_all'
|
||||
import zh_Hant from '@root/i18n/zh-Hant/_all'
|
||||
import de from '@root/i18n/de'
|
||||
import en from '@root/i18n/en'
|
||||
import fr from '@root/i18n/fr'
|
||||
import it from '@root/i18n/it'
|
||||
import ja from '@root/i18n/ja'
|
||||
import ko from '@root/i18n/ko'
|
||||
import pt_BR from '@root/i18n/pt_BR'
|
||||
import vi from '@root/i18n/vi'
|
||||
import zh_Hans from '@root/i18n/zh-Hans'
|
||||
import zh_Hant from '@root/i18n/zh-Hant'
|
||||
|
||||
import '@formatjs/intl-getcanonicallocales/polyfill'
|
||||
import '@formatjs/intl-locale/polyfill'
|
||||
@ -17,6 +18,7 @@ import '@formatjs/intl-locale/polyfill'
|
||||
import '@formatjs/intl-pluralrules/polyfill'
|
||||
import '@formatjs/intl-pluralrules/locale-data/de'
|
||||
import '@formatjs/intl-pluralrules/locale-data/en'
|
||||
import '@formatjs/intl-pluralrules/locale-data/fr'
|
||||
import '@formatjs/intl-pluralrules/locale-data/it'
|
||||
import '@formatjs/intl-pluralrules/locale-data/ja'
|
||||
import '@formatjs/intl-pluralrules/locale-data/ko'
|
||||
@ -27,6 +29,7 @@ import '@formatjs/intl-pluralrules/locale-data/zh'
|
||||
import '@formatjs/intl-numberformat/polyfill'
|
||||
import '@formatjs/intl-numberformat/locale-data/de'
|
||||
import '@formatjs/intl-numberformat/locale-data/en'
|
||||
import '@formatjs/intl-numberformat/locale-data/fr'
|
||||
import '@formatjs/intl-numberformat/locale-data/it'
|
||||
import '@formatjs/intl-numberformat/locale-data/ja'
|
||||
import '@formatjs/intl-numberformat/locale-data/ko'
|
||||
@ -38,6 +41,7 @@ import '@formatjs/intl-numberformat/locale-data/zh-Hant'
|
||||
import '@formatjs/intl-datetimeformat/polyfill'
|
||||
import '@formatjs/intl-datetimeformat/locale-data/de'
|
||||
import '@formatjs/intl-datetimeformat/locale-data/en'
|
||||
import '@formatjs/intl-datetimeformat/locale-data/fr'
|
||||
import '@formatjs/intl-datetimeformat/locale-data/it'
|
||||
import '@formatjs/intl-datetimeformat/locale-data/ja'
|
||||
import '@formatjs/intl-datetimeformat/locale-data/ko'
|
||||
@ -50,6 +54,7 @@ import '@formatjs/intl-datetimeformat/add-all-tz'
|
||||
import '@formatjs/intl-relativetimeformat/polyfill'
|
||||
import '@formatjs/intl-relativetimeformat/locale-data/de'
|
||||
import '@formatjs/intl-relativetimeformat/locale-data/en'
|
||||
import '@formatjs/intl-relativetimeformat/locale-data/fr'
|
||||
import '@formatjs/intl-relativetimeformat/locale-data/it'
|
||||
import '@formatjs/intl-relativetimeformat/locale-data/ja'
|
||||
import '@formatjs/intl-relativetimeformat/locale-data/ko'
|
||||
@ -65,7 +70,7 @@ i18n.use(initReactI18next).init({
|
||||
ns: ['common'],
|
||||
defaultNS: 'common',
|
||||
|
||||
resources: { de, en, it, ja, ko, 'pt-BR': pt_BR, vi, 'zh-Hans': zh_Hans, 'zh-Hant': zh_Hant },
|
||||
resources: { de, en, fr, it, ja, ko, 'pt-BR': pt_BR, vi, 'zh-Hans': zh_Hans, 'zh-Hant': zh_Hant },
|
||||
returnEmptyString: false,
|
||||
|
||||
saveMissing: true,
|
||||
|
@ -304,7 +304,8 @@
|
||||
"toots": {
|
||||
"default": "Toot",
|
||||
"all": "Toot e risposte"
|
||||
}
|
||||
},
|
||||
"suspended": ""
|
||||
},
|
||||
"attachments": {
|
||||
"name": "Media di <0 /><1>\"</1>"
|
||||
|
@ -304,7 +304,8 @@
|
||||
"toots": {
|
||||
"default": "投稿",
|
||||
"all": "投稿と返信"
|
||||
}
|
||||
},
|
||||
"suspended": ""
|
||||
},
|
||||
"attachments": {
|
||||
"name": "<0 /><1>\" のメディア</1>"
|
||||
|
@ -304,7 +304,8 @@
|
||||
"toots": {
|
||||
"default": "툿",
|
||||
"all": "툿과 답장"
|
||||
}
|
||||
},
|
||||
"suspended": ""
|
||||
},
|
||||
"attachments": {
|
||||
"name": "<0 /><1>\"의 미디어</1>"
|
||||
|
@ -1,6 +1,7 @@
|
||||
const LOCALES = {
|
||||
de: 'Deutsch',
|
||||
en: 'English',
|
||||
fr: 'Français',
|
||||
it: 'Italiano',
|
||||
ja: '日本語',
|
||||
ko: '한국어',
|
||||
|
@ -304,7 +304,8 @@
|
||||
"toots": {
|
||||
"default": "Toots",
|
||||
"all": "Toots e respostas"
|
||||
}
|
||||
},
|
||||
"suspended": ""
|
||||
},
|
||||
"attachments": {
|
||||
"name": "<0 /><1>\"s mídia</1>"
|
||||
|
@ -304,7 +304,8 @@
|
||||
"toots": {
|
||||
"default": "Tút",
|
||||
"all": "Lượt trả lời"
|
||||
}
|
||||
},
|
||||
"suspended": ""
|
||||
},
|
||||
"attachments": {
|
||||
"name": "<0 /><1>'s media</1>"
|
||||
|
@ -304,7 +304,8 @@
|
||||
"toots": {
|
||||
"default": "嘟文",
|
||||
"all": "嘟文和回复"
|
||||
}
|
||||
},
|
||||
"suspended": "此账户已被服务器管理员停用"
|
||||
},
|
||||
"attachments": {
|
||||
"name": "<0 /><1>的媒体</1>"
|
||||
|
18
src/i18n/zh-Hant/index.ts
Normal file
18
src/i18n/zh-Hant/index.ts
Normal file
@ -0,0 +1,18 @@
|
||||
export default {
|
||||
common: require('./common'),
|
||||
|
||||
screens: require('./screens'),
|
||||
screenActions: require('./screens/actions'),
|
||||
screenAnnouncements: require('./screens/announcements'),
|
||||
screenCompose: require('./screens/compose'),
|
||||
screenImageViewer: require('./screens/imageViewer'),
|
||||
screenTabs: require('./screens/tabs'),
|
||||
|
||||
componentContextMenu: require('./components/contextMenu'),
|
||||
componentEmojis: require('./components/emojis'),
|
||||
componentInstance: require('./components/instance'),
|
||||
componentMediaSelector: require('./components/mediaSelector'),
|
||||
componentParse: require('./components/parse'),
|
||||
componentRelationship: require('./components/relationship'),
|
||||
componentTimeline: require('./components/timeline')
|
||||
}
|
@ -304,7 +304,8 @@
|
||||
"toots": {
|
||||
"default": "嘟文",
|
||||
"all": "嘟文與回覆"
|
||||
}
|
||||
},
|
||||
"suspended": ""
|
||||
},
|
||||
"attachments": {
|
||||
"name": "<0 /><1>的媒體</1>"
|
||||
|
@ -28,7 +28,7 @@ const ActionsAccount: React.FC<Props> = ({
|
||||
const { t } = useTranslation('componentTimeline')
|
||||
|
||||
const queryClient = useQueryClient()
|
||||
const mutateion = useTimelineMutation({
|
||||
const mutation = useTimelineMutation({
|
||||
onSuccess: (_, params) => {
|
||||
const theParams = params as MutationVarsTimelineUpdateAccountProperty
|
||||
displayMessage({
|
||||
@ -78,7 +78,7 @@ const ActionsAccount: React.FC<Props> = ({
|
||||
page: queryKey && queryKey[1].page
|
||||
})
|
||||
dismiss()
|
||||
mutateion.mutate({
|
||||
mutation.mutate({
|
||||
type: 'updateAccountProperty',
|
||||
queryKey,
|
||||
id: account.id,
|
||||
@ -96,7 +96,7 @@ const ActionsAccount: React.FC<Props> = ({
|
||||
page: queryKey && queryKey[1].page
|
||||
})
|
||||
dismiss()
|
||||
mutateion.mutate({
|
||||
mutation.mutate({
|
||||
type: 'updateAccountProperty',
|
||||
queryKey,
|
||||
id: account.id,
|
||||
@ -114,7 +114,7 @@ const ActionsAccount: React.FC<Props> = ({
|
||||
page: queryKey && queryKey[1].page
|
||||
})
|
||||
dismiss()
|
||||
mutateion.mutate({
|
||||
mutation.mutate({
|
||||
type: 'updateAccountProperty',
|
||||
queryKey,
|
||||
id: account.id,
|
||||
|
@ -144,7 +144,7 @@ const ScreenAnnouncements: React.FC<
|
||||
: colors.backgroundDefault
|
||||
}}
|
||||
onPress={() => {
|
||||
analytics('accnouncement_reaction_press', {
|
||||
analytics('announcement_reaction_press', {
|
||||
current: reaction.me
|
||||
})
|
||||
mutation.mutate({
|
||||
@ -203,7 +203,7 @@ const ScreenAnnouncements: React.FC<
|
||||
loading={mutation.isLoading}
|
||||
disabled={item.read}
|
||||
onPress={() => {
|
||||
analytics('accnouncement_read_press')
|
||||
analytics('announcement_read_press')
|
||||
!item.read &&
|
||||
mutation.mutate({
|
||||
id: item.id,
|
||||
|
@ -5,8 +5,8 @@ import { HeaderLeft, HeaderRight } from '@components/Header'
|
||||
import { createNativeStackNavigator } from '@react-navigation/native-stack'
|
||||
import haptics from '@root/components/haptics'
|
||||
import { useAppDispatch } from '@root/store'
|
||||
import formatText from '@screens/Compose/formatText'
|
||||
import ComposeRoot from '@screens/Compose/Root'
|
||||
import formatText from '@screens/Compose/utils/formatText'
|
||||
import * as Sentry from '@sentry/react-native'
|
||||
import { RootStackScreenProps } from '@utils/navigation/navigators'
|
||||
import { useTimelineMutation } from '@utils/queryHooks/timeline'
|
||||
|
@ -14,8 +14,8 @@ import { Dimensions, Image, Modal, Platform, Pressable, View } from 'react-nativ
|
||||
import { PanGestureHandler } from 'react-native-gesture-handler'
|
||||
import { SwipeListView } from 'react-native-swipe-list-view'
|
||||
import { useSelector } from 'react-redux'
|
||||
import formatText from '../formatText'
|
||||
import ComposeContext from '../utils/createContext'
|
||||
import formatText from '../utils/formatText'
|
||||
import { ComposeStateDraft, ExtendedAttachment } from '../utils/types'
|
||||
|
||||
export interface Props {
|
||||
|
@ -34,7 +34,7 @@ const ComposeEditAttachmentImage: React.FC<Props> = ({ index }) => {
|
||||
theAttachmentRemote?.meta?.original?.aspect < 1
|
||||
? windowWidth * theAttachmentRemote?.meta?.original?.aspect
|
||||
: windowWidth
|
||||
const imageDimensionis = {
|
||||
const imageDimensions = {
|
||||
width: imageWidthBase,
|
||||
height:
|
||||
imageWidthBase /
|
||||
@ -60,11 +60,11 @@ const ComposeEditAttachmentImage: React.FC<Props> = ({ index }) => {
|
||||
const pan = useSharedValue({
|
||||
x:
|
||||
(((theAttachmentRemote as Mastodon.AttachmentImage)?.meta?.focus?.x || 0) *
|
||||
imageDimensionis.width) /
|
||||
imageDimensions.width) /
|
||||
2,
|
||||
y:
|
||||
(((theAttachmentRemote as Mastodon.AttachmentImage)?.meta?.focus?.y || 0) *
|
||||
imageDimensionis.height) /
|
||||
imageDimensions.height) /
|
||||
2
|
||||
})
|
||||
const start = useSharedValue({ x: 0, y: 0 })
|
||||
@ -80,8 +80,8 @@ const ComposeEditAttachmentImage: React.FC<Props> = ({ index }) => {
|
||||
})
|
||||
.onEnd(() => {
|
||||
runOnJS(updateFocus)({
|
||||
x: pan.value.x / (imageDimensionis.width / 2),
|
||||
y: pan.value.y / (imageDimensionis.height / 2)
|
||||
x: pan.value.x / (imageDimensions.width / 2),
|
||||
y: pan.value.y / (imageDimensions.height / 2)
|
||||
})
|
||||
})
|
||||
.onFinalize(() => {
|
||||
@ -93,16 +93,16 @@ const ComposeEditAttachmentImage: React.FC<Props> = ({ index }) => {
|
||||
{
|
||||
translateX: interpolate(
|
||||
pan.value.x,
|
||||
[-imageDimensionis.width / 2, imageDimensionis.width / 2],
|
||||
[-imageDimensionis.width / 2, imageDimensionis.width / 2],
|
||||
[-imageDimensions.width / 2, imageDimensions.width / 2],
|
||||
[-imageDimensions.width / 2, imageDimensions.width / 2],
|
||||
Extrapolate.CLAMP
|
||||
)
|
||||
},
|
||||
{
|
||||
translateY: interpolate(
|
||||
pan.value.y,
|
||||
[-imageDimensionis.height / 2, imageDimensionis.height / 2],
|
||||
[-imageDimensionis.height / 2, imageDimensionis.height / 2],
|
||||
[-imageDimensions.height / 2, imageDimensions.height / 2],
|
||||
[-imageDimensions.height / 2, imageDimensions.height / 2],
|
||||
Extrapolate.CLAMP
|
||||
)
|
||||
}
|
||||
@ -115,8 +115,8 @@ const ComposeEditAttachmentImage: React.FC<Props> = ({ index }) => {
|
||||
<View style={{ overflow: 'hidden', flex: 1, alignItems: 'center' }}>
|
||||
<Image
|
||||
style={{
|
||||
width: imageDimensionis.width,
|
||||
height: imageDimensionis.height
|
||||
width: imageDimensions.width,
|
||||
height: imageDimensions.height
|
||||
}}
|
||||
source={{
|
||||
uri: theAttachmentLocal?.uri ? theAttachmentLocal.uri : theAttachmentRemote?.preview_url
|
||||
@ -128,10 +128,10 @@ const ComposeEditAttachmentImage: React.FC<Props> = ({ index }) => {
|
||||
styleTransform,
|
||||
{
|
||||
width: windowWidth * 2,
|
||||
height: imageDimensionis.height * 2,
|
||||
height: imageDimensions.height * 2,
|
||||
position: 'absolute',
|
||||
left: -windowWidth / 2,
|
||||
top: -imageDimensionis.height / 2,
|
||||
top: -imageDimensions.height / 2,
|
||||
backgroundColor: colors.backgroundOverlayInvert,
|
||||
flexDirection: 'row',
|
||||
alignItems: 'center',
|
||||
|
@ -7,8 +7,8 @@ import React, { useContext } from 'react'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
import { TextInput } from 'react-native'
|
||||
import { useSelector } from 'react-redux'
|
||||
import formatText from '../../formatText'
|
||||
import ComposeContext from '../../utils/createContext'
|
||||
import formatText from '../../utils/formatText'
|
||||
|
||||
const ComposeSpoilerInput: React.FC = () => {
|
||||
const { composeState, composeDispatch } = useContext(ComposeContext)
|
||||
|
@ -9,8 +9,8 @@ import React, { useContext } from 'react'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
import { Alert } from 'react-native'
|
||||
import { useSelector } from 'react-redux'
|
||||
import formatText from '../../formatText'
|
||||
import ComposeContext from '../../utils/createContext'
|
||||
import formatText from '../../utils/formatText'
|
||||
import { uploadAttachment } from '../Footer/addAttachment'
|
||||
|
||||
const ComposeTextInput: React.FC = () => {
|
||||
|
@ -3,8 +3,8 @@ import analytics from '@components/analytics'
|
||||
import haptics from '@components/haptics'
|
||||
import ComponentHashtag from '@components/Hashtag'
|
||||
import React, { useContext, useEffect } from 'react'
|
||||
import formatText from '../formatText'
|
||||
import ComposeContext from '../utils/createContext'
|
||||
import formatText from '../utils/formatText'
|
||||
|
||||
type Props = { item: Mastodon.Account & Mastodon.Tag }
|
||||
|
||||
|
@ -3,8 +3,8 @@ import { debounce, differenceWith, isEqual } from 'lodash'
|
||||
import React, { Dispatch } from 'react'
|
||||
import { FetchOptions } from 'react-query/types/core/query'
|
||||
import { useTheme } from '@utils/styles/ThemeManager'
|
||||
import { ComposeAction, ComposeState } from './utils/types'
|
||||
import { instanceConfigurationStatusCharsURL } from './Root'
|
||||
import { ComposeAction, ComposeState } from './types'
|
||||
import { instanceConfigurationStatusCharsURL } from '../Root'
|
||||
import CustomText from '@components/Text'
|
||||
import { emojis } from '@components/Emojis'
|
||||
|
||||
@ -43,7 +43,7 @@ linkify
|
||||
var tail = text.slice(pos)
|
||||
|
||||
if (!self.re.hashtag) {
|
||||
self.re.hashtag = new RegExp('^[A-Za-z0-9_]+')
|
||||
self.re.hashtag = new RegExp('^[\\S]+')
|
||||
}
|
||||
if (self.re.hashtag.test(tail)) {
|
||||
return tail.match(self.re.hashtag)![0].length
|
@ -9,7 +9,6 @@ import { useTranslation } from 'react-i18next'
|
||||
import {
|
||||
Dimensions,
|
||||
FlatList,
|
||||
Image,
|
||||
PixelRatio,
|
||||
Platform,
|
||||
Share,
|
||||
@ -102,7 +101,8 @@ const ScreenImagesViewer = ({
|
||||
|
||||
return (
|
||||
<Zoom
|
||||
isZoomed={isZoomed}
|
||||
onZoomBegin={() => (isZoomed.value = true)}
|
||||
onZoomEnd={() => (isZoomed.value = false)}
|
||||
maximumZoomScale={max > 8 ? 8 : max}
|
||||
simultaneousGesture={Gesture.Fling()
|
||||
.direction(Directions.DOWN)
|
||||
|
@ -12,7 +12,7 @@ import {
|
||||
getInstanceAccount,
|
||||
getInstanceActive
|
||||
} from '@utils/slices/instancesSlice'
|
||||
import { getVersionUpdate, retriveVersionLatest } from '@utils/slices/appSlice'
|
||||
import { getVersionUpdate, retrieveVersionLatest } from '@utils/slices/appSlice'
|
||||
import { useTheme } from '@utils/styles/ThemeManager'
|
||||
import React, { useCallback, useEffect, useMemo } from 'react'
|
||||
import { Platform } from 'react-native'
|
||||
@ -64,7 +64,7 @@ const ScreenTabs = React.memo(
|
||||
const versionUpdate = useSelector(getVersionUpdate)
|
||||
const dispatch = useAppDispatch()
|
||||
useEffect(() => {
|
||||
dispatch(retriveVersionLatest())
|
||||
dispatch(retrieveVersionLatest())
|
||||
}, [])
|
||||
const tabMeOptions = useMemo(() => {
|
||||
if (versionUpdate) {
|
||||
|
@ -51,9 +51,9 @@ const TabLocal = React.memo(
|
||||
]
|
||||
: undefined
|
||||
}
|
||||
onPress={({ nativeEvent: { id } }) => {
|
||||
id.length
|
||||
? setQueryKey(['Timeline', { page: 'List', list: id }])
|
||||
onPress={({ nativeEvent: { index } }) => {
|
||||
lists && index
|
||||
? setQueryKey(['Timeline', { page: 'List', list: lists[index - 1].id }])
|
||||
: setQueryKey(['Timeline', { page: 'Following' }])
|
||||
}}
|
||||
children={
|
||||
|
@ -6,9 +6,9 @@ import { useAccountQuery } from '@utils/queryHooks/account'
|
||||
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
|
||||
import { StyleConstants } from '@utils/styles/constants'
|
||||
import { useTheme } from '@utils/styles/ThemeManager'
|
||||
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
|
||||
import React, { useEffect, useMemo, useRef, useState } from 'react'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
import { StyleSheet, View } from 'react-native'
|
||||
import { StyleSheet, Text, View } from 'react-native'
|
||||
import { useSharedValue } from 'react-native-reanimated'
|
||||
import { useIsFetching } from 'react-query'
|
||||
import AccountAttachments from './Account/Attachments'
|
||||
@ -16,9 +16,7 @@ import AccountHeader from './Account/Header'
|
||||
import AccountInformation from './Account/Information'
|
||||
import AccountNav from './Account/Nav'
|
||||
|
||||
const TabSharedAccount: React.FC<
|
||||
TabSharedStackScreenProps<'Tab-Shared-Account'>
|
||||
> = ({
|
||||
const TabSharedAccount: React.FC<TabSharedStackScreenProps<'Tab-Shared-Account'>> = ({
|
||||
route: {
|
||||
params: { account }
|
||||
}
|
||||
@ -48,35 +46,42 @@ const TabSharedAccount: React.FC<
|
||||
<View style={[styles.header, { borderBottomColor: colors.border }]}>
|
||||
<AccountHeader account={data} />
|
||||
<AccountInformation account={data} />
|
||||
{fetchedTimeline.current ? (
|
||||
{!data?.suspended && fetchedTimeline.current ? (
|
||||
<AccountAttachments account={data} />
|
||||
) : null}
|
||||
</View>
|
||||
<SegmentedControl
|
||||
appearance={mode}
|
||||
values={[
|
||||
t('shared.account.toots.default'),
|
||||
t('shared.account.toots.all')
|
||||
]}
|
||||
selectedIndex={queryKey[1].page === 'Account_Default' ? 0 : 1}
|
||||
onChange={({ nativeEvent }) => {
|
||||
switch (nativeEvent.selectedSegmentIndex) {
|
||||
case 0:
|
||||
setQueryKey([
|
||||
queryKey[0],
|
||||
{ ...queryKey[1], page: 'Account_Default' }
|
||||
])
|
||||
break
|
||||
case 1:
|
||||
setQueryKey([
|
||||
queryKey[0],
|
||||
{ ...queryKey[1], page: 'Account_All' }
|
||||
])
|
||||
break
|
||||
}
|
||||
}}
|
||||
style={styles.segmentsContainer}
|
||||
/>
|
||||
{!data?.suspended ? (
|
||||
<SegmentedControl
|
||||
appearance={mode}
|
||||
values={[t('shared.account.toots.default'), t('shared.account.toots.all')]}
|
||||
selectedIndex={queryKey[1].page === 'Account_Default' ? 0 : 1}
|
||||
onChange={({ nativeEvent }) => {
|
||||
switch (nativeEvent.selectedSegmentIndex) {
|
||||
case 0:
|
||||
setQueryKey([queryKey[0], { ...queryKey[1], page: 'Account_Default' }])
|
||||
break
|
||||
case 1:
|
||||
setQueryKey([queryKey[0], { ...queryKey[1], page: 'Account_All' }])
|
||||
break
|
||||
}
|
||||
}}
|
||||
style={styles.segmentsContainer}
|
||||
/>
|
||||
) : null}
|
||||
{data?.suspended ? (
|
||||
<View
|
||||
style={{
|
||||
flex: 1,
|
||||
justifyContent: 'center',
|
||||
alignItems: 'center',
|
||||
paddingHorizontal: StyleConstants.Spacing.Global.PagePadding
|
||||
}}
|
||||
>
|
||||
<Text style={{ ...StyleConstants.FontStyle.M, color: colors.secondary, textAlign: 'center' }}>
|
||||
{t('shared.account.suspended')}
|
||||
</Text>
|
||||
</View>
|
||||
) : null}
|
||||
</>
|
||||
)
|
||||
}, [data, fetchedTimeline.current, queryKey[1].page, i18n.language, mode])
|
||||
@ -85,19 +90,20 @@ const TabSharedAccount: React.FC<
|
||||
<>
|
||||
<AccountNav scrollY={scrollY} account={data} />
|
||||
|
||||
<Timeline
|
||||
queryKey={queryKey}
|
||||
disableRefresh
|
||||
customProps={{
|
||||
renderItem: ({ item }) => (
|
||||
<TimelineDefault item={item} queryKey={queryKey} />
|
||||
),
|
||||
onScroll: ({ nativeEvent }) =>
|
||||
(scrollY.value = nativeEvent.contentOffset.y),
|
||||
ListHeaderComponent,
|
||||
maintainVisibleContentPosition: undefined
|
||||
}}
|
||||
/>
|
||||
{data?.suspended ? (
|
||||
ListHeaderComponent
|
||||
) : (
|
||||
<Timeline
|
||||
queryKey={queryKey}
|
||||
disableRefresh
|
||||
customProps={{
|
||||
renderItem: ({ item }) => <TimelineDefault item={item} queryKey={queryKey} />,
|
||||
onScroll: ({ nativeEvent }) => (scrollY.value = nativeEvent.contentOffset.y),
|
||||
ListHeaderComponent,
|
||||
maintainVisibleContentPosition: undefined
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
@ -54,7 +54,7 @@ const AccountInformationAccount: React.FC<Props> = ({
|
||||
) : null}
|
||||
<CustomText
|
||||
style={{
|
||||
textDecorationLine: account?.moved ? 'line-through' : undefined
|
||||
textDecorationLine: (account?.moved || account?.suspended) ? 'line-through' : undefined
|
||||
}}
|
||||
selectable
|
||||
>
|
||||
|
@ -37,7 +37,7 @@ const Conversation = ({ account }: { account: Mastodon.Account }) => {
|
||||
}
|
||||
|
||||
const AccountInformationActions: React.FC<Props> = ({ account, myInfo }) => {
|
||||
if (!account) {
|
||||
if (!account || account.suspended) {
|
||||
return null
|
||||
}
|
||||
|
||||
|
@ -12,7 +12,7 @@ export interface Props {
|
||||
|
||||
const AccountInformationFields = React.memo(
|
||||
({ account, myInfo }: Props) => {
|
||||
if (myInfo || !account?.fields || account.fields.length === 0) {
|
||||
if (account?.suspended || myInfo || !account?.fields || account.fields.length === 0) {
|
||||
return null
|
||||
}
|
||||
|
||||
@ -21,13 +21,8 @@ const AccountInformationFields = React.memo(
|
||||
return (
|
||||
<View style={[styles.fields, { borderTopColor: colors.border }]}>
|
||||
{account.fields.map((field, index) => (
|
||||
<View
|
||||
key={index}
|
||||
style={[styles.field, { borderBottomColor: colors.border }]}
|
||||
>
|
||||
<View
|
||||
style={[styles.fieldLeft, { borderRightColor: colors.border }]}
|
||||
>
|
||||
<View key={index} style={[styles.field, { borderBottomColor: colors.border }]}>
|
||||
<View style={[styles.fieldLeft, { borderRightColor: colors.border }]}>
|
||||
<ParseHTML
|
||||
content={field.name}
|
||||
size={'S'}
|
||||
|
@ -41,7 +41,7 @@ const AccountInformationName: React.FC<Props> = ({ account }) => {
|
||||
<>
|
||||
<CustomText
|
||||
style={{
|
||||
textDecorationLine: account?.moved ? 'line-through' : undefined
|
||||
textDecorationLine: account?.moved || account.suspended ? 'line-through' : undefined
|
||||
}}
|
||||
>
|
||||
<ParseEmojis
|
||||
|
@ -12,6 +12,7 @@ const AccountInformationNote = React.memo(
|
||||
({ account, myInfo }: Props) => {
|
||||
const [note, setNote] = useState(account?.source?.note)
|
||||
if (
|
||||
account?.suspended ||
|
||||
myInfo ||
|
||||
!account?.note ||
|
||||
account.note.length === 0 ||
|
||||
|
@ -16,8 +16,11 @@ export interface Props {
|
||||
}
|
||||
|
||||
const AccountInformationStats: React.FC<Props> = ({ account, myInfo }) => {
|
||||
const navigation =
|
||||
useNavigation<StackNavigationProp<TabLocalStackParamList>>()
|
||||
if (account?.suspended) {
|
||||
return null
|
||||
}
|
||||
|
||||
const navigation = useNavigation<StackNavigationProp<TabLocalStackParamList>>()
|
||||
const { colors } = useTheme()
|
||||
const { t } = useTranslation('screenTabs')
|
||||
|
||||
@ -31,9 +34,7 @@ const AccountInformationStats: React.FC<Props> = ({ account, myInfo }) => {
|
||||
})}
|
||||
onPress={() => {
|
||||
analytics('account_stats_toots_press')
|
||||
myInfo &&
|
||||
account &&
|
||||
navigation.push('Tab-Shared-Account', { account })
|
||||
myInfo && account && navigation.push('Tab-Shared-Account', { account })
|
||||
}}
|
||||
/>
|
||||
) : (
|
||||
@ -47,10 +48,7 @@ const AccountInformationStats: React.FC<Props> = ({ account, myInfo }) => {
|
||||
)}
|
||||
{account ? (
|
||||
<CustomText
|
||||
style={[
|
||||
styles.stat,
|
||||
{ color: colors.primaryDefault, textAlign: 'right' }
|
||||
]}
|
||||
style={[styles.stat, { color: colors.primaryDefault, textAlign: 'right' }]}
|
||||
children={t('shared.account.summary.following_count', {
|
||||
count: account.following_count
|
||||
})}
|
||||
@ -77,10 +75,7 @@ const AccountInformationStats: React.FC<Props> = ({ account, myInfo }) => {
|
||||
)}
|
||||
{account ? (
|
||||
<CustomText
|
||||
style={[
|
||||
styles.stat,
|
||||
{ color: colors.primaryDefault, textAlign: 'center' }
|
||||
]}
|
||||
style={[styles.stat, { color: colors.primaryDefault, textAlign: 'center' }]}
|
||||
children={t('shared.account.summary.followers_count', {
|
||||
count: account.followers_count
|
||||
})}
|
||||
|
@ -51,7 +51,7 @@ const netInfo = async (): Promise<{
|
||||
if (resVerify.id !== instance.account.id) {
|
||||
log('error', 'netInfo', 'local id does not match remote id')
|
||||
store.dispatch(removeInstance(instance))
|
||||
return Promise.resolve({ connected: true, corruputed: '' })
|
||||
return Promise.resolve({ connected: true, corrupted: '' })
|
||||
} else {
|
||||
store.dispatch(
|
||||
updateInstanceAccount({
|
||||
|
@ -4,7 +4,7 @@ import { displayMessage } from '@components/Message'
|
||||
import navigationRef from '@helpers/navigationRef'
|
||||
import { useAppDispatch } from '@root/store'
|
||||
import { InstanceLatest } from '@utils/migrations/instances/migration'
|
||||
import { getExpoToken, retriveExpoToken } from '@utils/slices/appSlice'
|
||||
import { getExpoToken, retrieveExpoToken } from '@utils/slices/appSlice'
|
||||
import { disableAllPushes } from '@utils/slices/instancesSlice'
|
||||
import { useTheme } from '@utils/styles/ThemeManager'
|
||||
import * as Notifications from 'expo-notifications'
|
||||
@ -22,7 +22,7 @@ const pushUseConnect = ({ t, instances }: Params) => {
|
||||
const dispatch = useAppDispatch()
|
||||
const { theme } = useTheme()
|
||||
useEffect(() => {
|
||||
dispatch(retriveExpoToken())
|
||||
dispatch(retrieveExpoToken())
|
||||
}, [])
|
||||
|
||||
const expoToken = useSelector(getExpoToken)
|
||||
|
26
src/utils/queryHooks/status.ts
Normal file
26
src/utils/queryHooks/status.ts
Normal file
@ -0,0 +1,26 @@
|
||||
import apiInstance from '@api/instance'
|
||||
import { AxiosError } from 'axios'
|
||||
import { QueryFunctionContext, useQuery, UseQueryOptions } from 'react-query'
|
||||
|
||||
export type QueryKeyStatus = ['Status', { id: Mastodon.Status['id'] }]
|
||||
|
||||
const queryFunction = ({ queryKey }: QueryFunctionContext<QueryKeyStatus>) => {
|
||||
const { id } = queryKey[1]
|
||||
|
||||
return apiInstance<Mastodon.Status>({
|
||||
method: 'get',
|
||||
url: `statuses/${id}`
|
||||
}).then(res => res.body)
|
||||
}
|
||||
|
||||
const useStatusQuery = ({
|
||||
options,
|
||||
...queryKeyParams
|
||||
}: QueryKeyStatus[1] & {
|
||||
options?: UseQueryOptions<Mastodon.Status, AxiosError>
|
||||
}) => {
|
||||
const queryKey: QueryKeyStatus = ['Status', { ...queryKeyParams }]
|
||||
return useQuery(queryKey, queryFunction, options)
|
||||
}
|
||||
|
||||
export { useStatusQuery }
|
@ -54,7 +54,7 @@ const updateStatusProperty = ({
|
||||
const tootIndex = reblog
|
||||
? items.findIndex(({ reblog }) => reblog?.id === id)
|
||||
: items.findIndex(toot => toot.id === id)
|
||||
// if favouriets page and notifications page, remove the item instead
|
||||
// if favourites page and notifications page, remove the item instead
|
||||
if (tootIndex >= 0) {
|
||||
foundToot = true
|
||||
updateStatus({ item: items[tootIndex], reblog, payload })
|
||||
@ -111,7 +111,7 @@ const updateStatusProperty = ({
|
||||
const tootIndex = reblog
|
||||
? items.findIndex(({ reblog }) => reblog?.id === id)
|
||||
: items.findIndex(toot => toot.id === id)
|
||||
// if favouriets page and notifications page, remove the item instead
|
||||
// if favourites page and notifications page, remove the item instead
|
||||
if (tootIndex >= 0) {
|
||||
foundToot = true
|
||||
updateStatus({ item: items[tootIndex], reblog, payload })
|
||||
|
@ -5,7 +5,7 @@ import { isDevelopment } from '@utils/checkEnvironment'
|
||||
import Constants from 'expo-constants'
|
||||
import * as Notifications from 'expo-notifications'
|
||||
|
||||
export const retriveExpoToken = createAsyncThunk(
|
||||
export const retrieveExpoToken = createAsyncThunk(
|
||||
'app/expoToken',
|
||||
async (): Promise<string> => {
|
||||
if (isDevelopment) {
|
||||
@ -20,7 +20,7 @@ export const retriveExpoToken = createAsyncThunk(
|
||||
}
|
||||
)
|
||||
|
||||
export const retriveVersionLatest = createAsyncThunk(
|
||||
export const retrieveVersionLatest = createAsyncThunk(
|
||||
'app/versionUpdate',
|
||||
async (): Promise<string> => {
|
||||
const res = await apiGeneral<{ latest: string }>({
|
||||
@ -48,12 +48,12 @@ const appSlice = createSlice({
|
||||
reducers: {},
|
||||
extraReducers: builder => {
|
||||
builder
|
||||
.addCase(retriveExpoToken.fulfilled, (state, action) => {
|
||||
.addCase(retrieveExpoToken.fulfilled, (state, action) => {
|
||||
if (action.payload) {
|
||||
state.expoToken = action.payload
|
||||
}
|
||||
})
|
||||
.addCase(retriveVersionLatest.fulfilled, (state, action) => {
|
||||
.addCase(retrieveVersionLatest.fulfilled, (state, action) => {
|
||||
if (action.payload && Constants.expoConfig?.version) {
|
||||
if (
|
||||
parseFloat(action.payload) > parseFloat(Constants.expoConfig?.version)
|
||||
|
Loading…
x
Reference in New Issue
Block a user