diff --git a/.yarn/patches/react-native-reanimated-zoom-npm-0.3.3-bbb8d84109.patch b/.yarn/patches/react-native-reanimated-zoom-npm-0.3.3-bbb8d84109.patch new file mode 100644 index 00000000..ced94530 --- /dev/null +++ b/.yarn/patches/react-native-reanimated-zoom-npm-0.3.3-bbb8d84109.patch @@ -0,0 +1,38 @@ +diff --git a/src/zoom.tsx b/src/zoom.tsx +index 70ce1c8d6a43e711f06b93d1eda3b44a3ad9a659..cdc2713470f2d332b8bf3e9c97e38fd9b78281df 100644 +--- a/src/zoom.tsx ++++ b/src/zoom.tsx +@@ -4,6 +4,7 @@ import Animated, { + useSharedValue, + useAnimatedStyle, + useDerivedValue, ++ withDecay, + withTiming, + cancelAnimation, + runOnJS, +@@ -120,11 +121,22 @@ export function Zoom(props: Props) { + } + } + }) +- .onEnd(() => { ++ .onEnd((event) => { + if (isPinching.value || !isZoomed.value) return; + +- panTranslateX.value = 0; +- panTranslateY.value = 0; ++ const maxTranslateX = (viewWidth.value / 2) * scale.value - viewWidth.value / 2; ++ const minTranslateX = -maxTranslateX; ++ translationX.value = withDecay({ ++ velocity: event.velocityX, ++ clamp: [minTranslateX, maxTranslateX] ++ }); ++ ++ const maxTranslateY = (viewHeight.value / 2) * scale.value - viewHeight.value / 2; ++ const minTranslateY = -maxTranslateY; ++ translationY.value = withDecay({ ++ velocity: event.velocityY, ++ clamp: [minTranslateY, maxTranslateY] ++ }); + }); + + const pinch = Gesture.Pinch() diff --git a/README.md b/README.md index fb8dc4df..89d1a492 100644 --- a/README.md +++ b/README.md @@ -8,14 +8,14 @@ Please **do not** create a pull request to update translation. tooot's translation is managed through [https://crowdin.tooot.app/](https://crowdin.tooot.app/) and Crowdin struggles to properly sync two ways. If there is a minor update and you do not want to register an account on Crowdin, please open an issue. - ## Special thanks - [@a_mento](https://crowdin.com/profile/a_mento) for Basques translation - [@dzmitry.zubialevich](https://crowdin.com/profile/dzmitry.zubialevich) for Belarusian translation - [@amrtf](https://crowdin.com/profile/amrtf) for Catalan and Spanish translation -- [@forenta](https://github.com/forenta) for German translation - [@pat](https://piaille.fr/@pat) for French translation +- [@forenta](https://github.com/forenta) for German translation +- [@heracl.es](https://heracl.es/) for Greek translation - [@andrigamerita](https://github.com/andrigamerita) for Italian translation - [@Hikaru](https://github.com/Hikali-47041) and [@la_la](https://mstdn.jp/@la_la_la) for Japanese translation - [@hellojaccc](https://github.com/hellojaccc) for Korean translation diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index b59f9ac8..973ebcfd 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -13,7 +13,7 @@ - + diff --git a/fastlane/metadata/en-US/release_notes.txt b/fastlane/metadata/en-US/release_notes.txt index bf034b53..4cacb69f 100644 --- a/fastlane/metadata/en-US/release_notes.txt +++ b/fastlane/metadata/en-US/release_notes.txt @@ -1,3 +1,2 @@ Enjoy toooting! This version includes following improvements and fixes: -- Added Basque language -- Added Polish language \ No newline at end of file +- Added Greek translation \ No newline at end of file diff --git a/fastlane/metadata/zh-Hans/release_notes.txt b/fastlane/metadata/zh-Hans/release_notes.txt index 40cc3d46..2fa814ec 100644 --- a/fastlane/metadata/zh-Hans/release_notes.txt +++ b/fastlane/metadata/zh-Hans/release_notes.txt @@ -1,4 +1,2 @@ toooting愉快!此版本包括以下改进和修复: -- 添加neodb.social书影音展示卡片 -- 新增巴斯克语 -- 新增波兰语 \ No newline at end of file +- 新增希腊语 \ No newline at end of file diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 72afa9af..41145781 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -14,13 +14,13 @@ PODS: - ExpoModulesCore - EXNotifications (0.18.1): - ExpoModulesCore - - Expo (48.0.7): + - Expo (48.0.11): - ExpoModulesCore - - ExpoCrypto (12.2.1): + - ExpoCrypto (12.2.2): - ExpoModulesCore - ExpoHaptics (12.2.1): - ExpoModulesCore - - ExpoImage (1.0.0): + - ExpoImage (1.2.1): - ExpoModulesCore - SDWebImage (~> 5.15.0) - SDWebImageAVIFCoder (~> 0.9.4) @@ -30,7 +30,7 @@ PODS: - ExpoModulesCore - ExpoLocalization (14.1.1): - ExpoModulesCore - - ExpoModulesCore (1.2.5): + - ExpoModulesCore (1.2.6): - React-Core - React-RCTAppDelegate - ReactCommon/turbomodule/core @@ -50,19 +50,19 @@ PODS: - EXSplashScreen (0.18.1): - ExpoModulesCore - React-Core - - FBLazyVector (0.71.4) - - FBReactNativeSpec (0.71.4): + - FBLazyVector (0.71.6) + - FBReactNativeSpec (0.71.6): - RCT-Folly (= 2021.07.22.00) - - RCTRequired (= 0.71.4) - - RCTTypeSafety (= 0.71.4) - - React-Core (= 0.71.4) - - React-jsi (= 0.71.4) - - ReactCommon/turbomodule/core (= 0.71.4) + - RCTRequired (= 0.71.6) + - RCTTypeSafety (= 0.71.6) + - React-Core (= 0.71.6) + - React-jsi (= 0.71.6) + - ReactCommon/turbomodule/core (= 0.71.6) - fmt (6.2.1) - glog (0.3.5) - - hermes-engine (0.71.4): - - hermes-engine/Pre-built (= 0.71.4) - - hermes-engine/Pre-built (0.71.4) + - hermes-engine (0.71.6): + - hermes-engine/Pre-built (= 0.71.6) + - hermes-engine/Pre-built (0.71.6) - libaom (2.0.2): - libvmaf - libavif (0.10.1): @@ -102,26 +102,26 @@ PODS: - fmt (~> 6.2.1) - glog - libevent - - RCTRequired (0.71.4) - - RCTTypeSafety (0.71.4): - - FBLazyVector (= 0.71.4) - - RCTRequired (= 0.71.4) - - React-Core (= 0.71.4) - - React (0.71.4): - - React-Core (= 0.71.4) - - React-Core/DevSupport (= 0.71.4) - - React-Core/RCTWebSocket (= 0.71.4) - - React-RCTActionSheet (= 0.71.4) - - React-RCTAnimation (= 0.71.4) - - React-RCTBlob (= 0.71.4) - - React-RCTImage (= 0.71.4) - - React-RCTLinking (= 0.71.4) - - React-RCTNetwork (= 0.71.4) - - React-RCTSettings (= 0.71.4) - - React-RCTText (= 0.71.4) - - React-RCTVibration (= 0.71.4) - - React-callinvoker (0.71.4) - - React-Codegen (0.71.4): + - RCTRequired (0.71.6) + - RCTTypeSafety (0.71.6): + - FBLazyVector (= 0.71.6) + - RCTRequired (= 0.71.6) + - React-Core (= 0.71.6) + - React (0.71.6): + - React-Core (= 0.71.6) + - React-Core/DevSupport (= 0.71.6) + - React-Core/RCTWebSocket (= 0.71.6) + - React-RCTActionSheet (= 0.71.6) + - React-RCTAnimation (= 0.71.6) + - React-RCTBlob (= 0.71.6) + - React-RCTImage (= 0.71.6) + - React-RCTLinking (= 0.71.6) + - React-RCTNetwork (= 0.71.6) + - React-RCTSettings (= 0.71.6) + - React-RCTText (= 0.71.6) + - React-RCTVibration (= 0.71.6) + - React-callinvoker (0.71.6) + - React-Codegen (0.71.6): - FBReactNativeSpec - hermes-engine - RCT-Folly @@ -132,209 +132,209 @@ PODS: - React-jsiexecutor - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - React-Core (0.71.4): + - React-Core (0.71.6): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-Core/Default (= 0.71.4) - - React-cxxreact (= 0.71.4) + - React-Core/Default (= 0.71.6) + - React-cxxreact (= 0.71.6) - React-hermes - - React-jsi (= 0.71.4) - - React-jsiexecutor (= 0.71.4) - - React-perflogger (= 0.71.4) + - React-jsi (= 0.71.6) + - React-jsiexecutor (= 0.71.6) + - React-perflogger (= 0.71.6) - Yoga - - React-Core/CoreModulesHeaders (0.71.4): + - React-Core/CoreModulesHeaders (0.71.6): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.4) + - React-cxxreact (= 0.71.6) - React-hermes - - React-jsi (= 0.71.4) - - React-jsiexecutor (= 0.71.4) - - React-perflogger (= 0.71.4) + - React-jsi (= 0.71.6) + - React-jsiexecutor (= 0.71.6) + - React-perflogger (= 0.71.6) - Yoga - - React-Core/Default (0.71.4): + - React-Core/Default (0.71.6): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-cxxreact (= 0.71.4) + - React-cxxreact (= 0.71.6) - React-hermes - - React-jsi (= 0.71.4) - - React-jsiexecutor (= 0.71.4) - - React-perflogger (= 0.71.4) + - React-jsi (= 0.71.6) + - React-jsiexecutor (= 0.71.6) + - React-perflogger (= 0.71.6) - Yoga - - React-Core/DevSupport (0.71.4): + - React-Core/DevSupport (0.71.6): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-Core/Default (= 0.71.4) - - React-Core/RCTWebSocket (= 0.71.4) - - React-cxxreact (= 0.71.4) + - React-Core/Default (= 0.71.6) + - React-Core/RCTWebSocket (= 0.71.6) + - React-cxxreact (= 0.71.6) - React-hermes - - React-jsi (= 0.71.4) - - React-jsiexecutor (= 0.71.4) - - React-jsinspector (= 0.71.4) - - React-perflogger (= 0.71.4) + - React-jsi (= 0.71.6) + - React-jsiexecutor (= 0.71.6) + - React-jsinspector (= 0.71.6) + - React-perflogger (= 0.71.6) - Yoga - - React-Core/RCTActionSheetHeaders (0.71.4): + - React-Core/RCTActionSheetHeaders (0.71.6): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.4) + - React-cxxreact (= 0.71.6) - React-hermes - - React-jsi (= 0.71.4) - - React-jsiexecutor (= 0.71.4) - - React-perflogger (= 0.71.4) + - React-jsi (= 0.71.6) + - React-jsiexecutor (= 0.71.6) + - React-perflogger (= 0.71.6) - Yoga - - React-Core/RCTAnimationHeaders (0.71.4): + - React-Core/RCTAnimationHeaders (0.71.6): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.4) + - React-cxxreact (= 0.71.6) - React-hermes - - React-jsi (= 0.71.4) - - React-jsiexecutor (= 0.71.4) - - React-perflogger (= 0.71.4) + - React-jsi (= 0.71.6) + - React-jsiexecutor (= 0.71.6) + - React-perflogger (= 0.71.6) - Yoga - - React-Core/RCTBlobHeaders (0.71.4): + - React-Core/RCTBlobHeaders (0.71.6): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.4) + - React-cxxreact (= 0.71.6) - React-hermes - - React-jsi (= 0.71.4) - - React-jsiexecutor (= 0.71.4) - - React-perflogger (= 0.71.4) + - React-jsi (= 0.71.6) + - React-jsiexecutor (= 0.71.6) + - React-perflogger (= 0.71.6) - Yoga - - React-Core/RCTImageHeaders (0.71.4): + - React-Core/RCTImageHeaders (0.71.6): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.4) + - React-cxxreact (= 0.71.6) - React-hermes - - React-jsi (= 0.71.4) - - React-jsiexecutor (= 0.71.4) - - React-perflogger (= 0.71.4) + - React-jsi (= 0.71.6) + - React-jsiexecutor (= 0.71.6) + - React-perflogger (= 0.71.6) - Yoga - - React-Core/RCTLinkingHeaders (0.71.4): + - React-Core/RCTLinkingHeaders (0.71.6): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.4) + - React-cxxreact (= 0.71.6) - React-hermes - - React-jsi (= 0.71.4) - - React-jsiexecutor (= 0.71.4) - - React-perflogger (= 0.71.4) + - React-jsi (= 0.71.6) + - React-jsiexecutor (= 0.71.6) + - React-perflogger (= 0.71.6) - Yoga - - React-Core/RCTNetworkHeaders (0.71.4): + - React-Core/RCTNetworkHeaders (0.71.6): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.4) + - React-cxxreact (= 0.71.6) - React-hermes - - React-jsi (= 0.71.4) - - React-jsiexecutor (= 0.71.4) - - React-perflogger (= 0.71.4) + - React-jsi (= 0.71.6) + - React-jsiexecutor (= 0.71.6) + - React-perflogger (= 0.71.6) - Yoga - - React-Core/RCTSettingsHeaders (0.71.4): + - React-Core/RCTSettingsHeaders (0.71.6): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.4) + - React-cxxreact (= 0.71.6) - React-hermes - - React-jsi (= 0.71.4) - - React-jsiexecutor (= 0.71.4) - - React-perflogger (= 0.71.4) + - React-jsi (= 0.71.6) + - React-jsiexecutor (= 0.71.6) + - React-perflogger (= 0.71.6) - Yoga - - React-Core/RCTTextHeaders (0.71.4): + - React-Core/RCTTextHeaders (0.71.6): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.4) + - React-cxxreact (= 0.71.6) - React-hermes - - React-jsi (= 0.71.4) - - React-jsiexecutor (= 0.71.4) - - React-perflogger (= 0.71.4) + - React-jsi (= 0.71.6) + - React-jsiexecutor (= 0.71.6) + - React-perflogger (= 0.71.6) - Yoga - - React-Core/RCTVibrationHeaders (0.71.4): + - React-Core/RCTVibrationHeaders (0.71.6): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.4) + - React-cxxreact (= 0.71.6) - React-hermes - - React-jsi (= 0.71.4) - - React-jsiexecutor (= 0.71.4) - - React-perflogger (= 0.71.4) + - React-jsi (= 0.71.6) + - React-jsiexecutor (= 0.71.6) + - React-perflogger (= 0.71.6) - Yoga - - React-Core/RCTWebSocket (0.71.4): + - React-Core/RCTWebSocket (0.71.6): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-Core/Default (= 0.71.4) - - React-cxxreact (= 0.71.4) + - React-Core/Default (= 0.71.6) + - React-cxxreact (= 0.71.6) - React-hermes - - React-jsi (= 0.71.4) - - React-jsiexecutor (= 0.71.4) - - React-perflogger (= 0.71.4) + - React-jsi (= 0.71.6) + - React-jsiexecutor (= 0.71.6) + - React-perflogger (= 0.71.6) - Yoga - - React-CoreModules (0.71.4): + - React-CoreModules (0.71.6): - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.4) - - React-Codegen (= 0.71.4) - - React-Core/CoreModulesHeaders (= 0.71.4) - - React-jsi (= 0.71.4) + - RCTTypeSafety (= 0.71.6) + - React-Codegen (= 0.71.6) + - React-Core/CoreModulesHeaders (= 0.71.6) + - React-jsi (= 0.71.6) - React-RCTBlob - - React-RCTImage (= 0.71.4) - - ReactCommon/turbomodule/core (= 0.71.4) - - React-cxxreact (0.71.4): + - React-RCTImage (= 0.71.6) + - ReactCommon/turbomodule/core (= 0.71.6) + - React-cxxreact (0.71.6): - boost (= 1.76.0) - DoubleConversion - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-callinvoker (= 0.71.4) - - React-jsi (= 0.71.4) - - React-jsinspector (= 0.71.4) - - React-logger (= 0.71.4) - - React-perflogger (= 0.71.4) - - React-runtimeexecutor (= 0.71.4) - - React-hermes (0.71.4): + - React-callinvoker (= 0.71.6) + - React-jsi (= 0.71.6) + - React-jsinspector (= 0.71.6) + - React-logger (= 0.71.6) + - React-perflogger (= 0.71.6) + - React-runtimeexecutor (= 0.71.6) + - React-hermes (0.71.6): - DoubleConversion - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - RCT-Folly/Futures (= 2021.07.22.00) - - React-cxxreact (= 0.71.4) + - React-cxxreact (= 0.71.6) - React-jsi - - React-jsiexecutor (= 0.71.4) - - React-jsinspector (= 0.71.4) - - React-perflogger (= 0.71.4) - - React-jsi (0.71.4): + - React-jsiexecutor (= 0.71.6) + - React-jsinspector (= 0.71.6) + - React-perflogger (= 0.71.6) + - React-jsi (0.71.6): - boost (= 1.76.0) - DoubleConversion - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-jsiexecutor (0.71.4): + - React-jsiexecutor (0.71.6): - DoubleConversion - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-cxxreact (= 0.71.4) - - React-jsi (= 0.71.4) - - React-perflogger (= 0.71.4) - - React-jsinspector (0.71.4) - - React-logger (0.71.4): + - React-cxxreact (= 0.71.6) + - React-jsi (= 0.71.6) + - React-perflogger (= 0.71.6) + - React-jsinspector (0.71.6) + - React-logger (0.71.6): - glog - react-native-blur (4.3.0): - React-Core @@ -346,110 +346,110 @@ PODS: - React-Core - react-native-language-detection (0.2.2): - React - - react-native-mmkv (2.7.0): + - react-native-mmkv (2.8.0): - MMKV (>= 1.2.13) - React-Core - - react-native-netinfo (9.3.7): + - react-native-netinfo (9.3.9): - React-Core - - react-native-pager-view (6.1.4): + - react-native-pager-view (6.2.0): - React-Core - react-native-paste-input (0.6.2): - React-Core - Swime (= 3.0.6) - react-native-quick-base64 (2.0.5): - React-Core - - react-native-safe-area-context (4.5.0): + - react-native-safe-area-context (4.5.1): - RCT-Folly - RCTRequired - RCTTypeSafety - React-Core - ReactCommon/turbomodule/core - - react-native-segmented-control (2.4.0): + - react-native-segmented-control (2.4.1): - React-Core - - React-perflogger (0.71.4) - - React-RCTActionSheet (0.71.4): - - React-Core/RCTActionSheetHeaders (= 0.71.4) - - React-RCTAnimation (0.71.4): + - React-perflogger (0.71.6) + - React-RCTActionSheet (0.71.6): + - React-Core/RCTActionSheetHeaders (= 0.71.6) + - React-RCTAnimation (0.71.6): - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.4) - - React-Codegen (= 0.71.4) - - React-Core/RCTAnimationHeaders (= 0.71.4) - - React-jsi (= 0.71.4) - - ReactCommon/turbomodule/core (= 0.71.4) - - React-RCTAppDelegate (0.71.4): + - RCTTypeSafety (= 0.71.6) + - React-Codegen (= 0.71.6) + - React-Core/RCTAnimationHeaders (= 0.71.6) + - React-jsi (= 0.71.6) + - ReactCommon/turbomodule/core (= 0.71.6) + - React-RCTAppDelegate (0.71.6): - RCT-Folly - RCTRequired - RCTTypeSafety - React-Core - ReactCommon/turbomodule/core - - React-RCTBlob (0.71.4): + - React-RCTBlob (0.71.6): - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-Codegen (= 0.71.4) - - React-Core/RCTBlobHeaders (= 0.71.4) - - React-Core/RCTWebSocket (= 0.71.4) - - React-jsi (= 0.71.4) - - React-RCTNetwork (= 0.71.4) - - ReactCommon/turbomodule/core (= 0.71.4) - - React-RCTImage (0.71.4): + - React-Codegen (= 0.71.6) + - React-Core/RCTBlobHeaders (= 0.71.6) + - React-Core/RCTWebSocket (= 0.71.6) + - React-jsi (= 0.71.6) + - React-RCTNetwork (= 0.71.6) + - ReactCommon/turbomodule/core (= 0.71.6) + - React-RCTImage (0.71.6): - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.4) - - React-Codegen (= 0.71.4) - - React-Core/RCTImageHeaders (= 0.71.4) - - React-jsi (= 0.71.4) - - React-RCTNetwork (= 0.71.4) - - ReactCommon/turbomodule/core (= 0.71.4) - - React-RCTLinking (0.71.4): - - React-Codegen (= 0.71.4) - - React-Core/RCTLinkingHeaders (= 0.71.4) - - React-jsi (= 0.71.4) - - ReactCommon/turbomodule/core (= 0.71.4) - - React-RCTNetwork (0.71.4): + - RCTTypeSafety (= 0.71.6) + - React-Codegen (= 0.71.6) + - React-Core/RCTImageHeaders (= 0.71.6) + - React-jsi (= 0.71.6) + - React-RCTNetwork (= 0.71.6) + - ReactCommon/turbomodule/core (= 0.71.6) + - React-RCTLinking (0.71.6): + - React-Codegen (= 0.71.6) + - React-Core/RCTLinkingHeaders (= 0.71.6) + - React-jsi (= 0.71.6) + - ReactCommon/turbomodule/core (= 0.71.6) + - React-RCTNetwork (0.71.6): - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.4) - - React-Codegen (= 0.71.4) - - React-Core/RCTNetworkHeaders (= 0.71.4) - - React-jsi (= 0.71.4) - - ReactCommon/turbomodule/core (= 0.71.4) - - React-RCTSettings (0.71.4): + - RCTTypeSafety (= 0.71.6) + - React-Codegen (= 0.71.6) + - React-Core/RCTNetworkHeaders (= 0.71.6) + - React-jsi (= 0.71.6) + - ReactCommon/turbomodule/core (= 0.71.6) + - React-RCTSettings (0.71.6): - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.4) - - React-Codegen (= 0.71.4) - - React-Core/RCTSettingsHeaders (= 0.71.4) - - React-jsi (= 0.71.4) - - ReactCommon/turbomodule/core (= 0.71.4) - - React-RCTText (0.71.4): - - React-Core/RCTTextHeaders (= 0.71.4) - - React-RCTVibration (0.71.4): + - RCTTypeSafety (= 0.71.6) + - React-Codegen (= 0.71.6) + - React-Core/RCTSettingsHeaders (= 0.71.6) + - React-jsi (= 0.71.6) + - ReactCommon/turbomodule/core (= 0.71.6) + - React-RCTText (0.71.6): + - React-Core/RCTTextHeaders (= 0.71.6) + - React-RCTVibration (0.71.6): - RCT-Folly (= 2021.07.22.00) - - React-Codegen (= 0.71.4) - - React-Core/RCTVibrationHeaders (= 0.71.4) - - React-jsi (= 0.71.4) - - ReactCommon/turbomodule/core (= 0.71.4) - - React-runtimeexecutor (0.71.4): - - React-jsi (= 0.71.4) - - ReactCommon/turbomodule/bridging (0.71.4): + - React-Codegen (= 0.71.6) + - React-Core/RCTVibrationHeaders (= 0.71.6) + - React-jsi (= 0.71.6) + - ReactCommon/turbomodule/core (= 0.71.6) + - React-runtimeexecutor (0.71.6): + - React-jsi (= 0.71.6) + - ReactCommon/turbomodule/bridging (0.71.6): - DoubleConversion - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-callinvoker (= 0.71.4) - - React-Core (= 0.71.4) - - React-cxxreact (= 0.71.4) - - React-jsi (= 0.71.4) - - React-logger (= 0.71.4) - - React-perflogger (= 0.71.4) - - ReactCommon/turbomodule/core (0.71.4): + - React-callinvoker (= 0.71.6) + - React-Core (= 0.71.6) + - React-cxxreact (= 0.71.6) + - React-jsi (= 0.71.6) + - React-logger (= 0.71.6) + - React-perflogger (= 0.71.6) + - ReactCommon/turbomodule/core (0.71.6): - DoubleConversion - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-callinvoker (= 0.71.4) - - React-Core (= 0.71.4) - - React-cxxreact (= 0.71.4) - - React-jsi (= 0.71.4) - - React-logger (= 0.71.4) - - React-perflogger (= 0.71.4) + - React-callinvoker (= 0.71.6) + - React-Core (= 0.71.6) + - React-cxxreact (= 0.71.6) + - React-jsi (= 0.71.6) + - React-logger (= 0.71.6) + - React-perflogger (= 0.71.6) - RNCAsyncStorage (1.17.11): - React-Core - RNCClipboard (1.11.2): @@ -486,12 +486,12 @@ PODS: - RNScreens (3.20.0): - React-Core - React-RCTImage - - RNSentry (5.1.1): + - RNSentry (5.3.1): - React-Core - - Sentry/HybridSDK (= 8.3.0) + - Sentry/HybridSDK (= 8.4.0) - RNShareMenu (6.0.0): - React - - RNSVG (13.8.0): + - RNSVG (13.9.0): - React-Core - SDWebImage (5.15.5): - SDWebImage/Core (= 5.15.5) @@ -504,9 +504,9 @@ PODS: - SDWebImageWebPCoder (0.9.1): - libwebp (~> 1.0) - SDWebImage/Core (~> 5.13) - - Sentry/HybridSDK (8.3.0): - - SentryPrivate (= 8.3.0) - - SentryPrivate (8.3.0) + - Sentry/HybridSDK (8.4.0): + - SentryPrivate (= 8.4.0) + - SentryPrivate (8.4.0) - Swime (3.0.6) - Yoga (1.14.0) @@ -765,13 +765,13 @@ SPEC CHECKSUMS: EXFileSystem: 844e86ca9b5375486ecc4ef06d3838d5597d895d EXFont: 6ea3800df746be7233208d80fe379b8ed74f4272 EXNotifications: dd628737af60fc8cc62dccebacd326b0fbbc0dcb - Expo: 707f9b0039eacc6a1dce90c08c9e37b9c417bba2 - ExpoCrypto: 477dfe89c81527b376f2c344ca1d2a01244b243c + Expo: 81418098ffb16914b2e190f54e06db923248e4a1 + ExpoCrypto: 9105610a09cd6290b900bd82fc5d190e489125a3 ExpoHaptics: 5156bc5160d8e04c170dd6e645a71154951a2ad9 - ExpoImage: b6a65c4aa891cdf00bfba0da46df14b27ae09cc7 + ExpoImage: 09d394e082cdd18d946f10a522d566dfca019fb8 ExpoKeepAwake: 69f5f627670d62318410392d03e0b5db0f85759a ExpoLocalization: f26cd431ad9ea3533c5b08c4fabd879176a794bb - ExpoModulesCore: 397fc99e9d6c9dcc010f36d5802097c17b90424c + ExpoModulesCore: 6e0259511f4c4341b6b8357db393624df2280828 ExpoStoreReview: d057dcca4b9c95f3c9db11bd2e168dab9cba59f3 ExpoVideoThumbnails: 0021303b614a89fcc5df8b59d9d37ddf14a7d4cf ExpoWebBrowser: 033d34c478d9986da2f1679729041423837626e0 @@ -779,11 +779,11 @@ SPEC CHECKSUMS: EXScreenOrientation: 52220f8f2477ed25a37e3b2cdbbaa8635d250256 EXSecureStore: e8923258361cc406d0401af380f12bd05b2b720f EXSplashScreen: cd7fb052dff5ba8311d5c2455ecbebffe1b7a8ca - FBLazyVector: 446e84642979fff0ba57f3c804c2228a473aeac2 - FBReactNativeSpec: 241709e132e3bf1526c1c4f00bc5384dd39dfba9 + FBLazyVector: a83ceaa8a8581003a623facdb3c44f6d4f342ac5 + FBReactNativeSpec: 85eee79837cb797ab6176f0243a2b40511c09158 fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b - hermes-engine: a1f157c49ea579c28b0296bda8530e980c45bdb3 + hermes-engine: b434cea529ad0152c56c7cb6486b0c4c0b23b5de libaom: 9bb51e0f8f9192245e3ca2a1c9e4375d9cbccc52 libavif: e242998ccec1c83bcba0bbdc256f460ad5077348 libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 @@ -792,60 +792,60 @@ SPEC CHECKSUMS: MMKV: 7f34558bbb5a33b0eaefae2de4b6a20a2ffdad6f MMKVCore: ddf41b9d9262f058419f9ba7598719af56c02cd3 RCT-Folly: 424b8c9a7a0b9ab2886ffe9c3b041ef628fd4fb1 - RCTRequired: 5a024fdf458fa8c0d82fc262e76f982d4dcdecdd - RCTTypeSafety: b6c253064466411c6810b45f66bc1e43ce0c54ba - React: 715292db5bd46989419445a5547954b25d2090f0 - React-callinvoker: 105392d1179058585b564d35b4592fe1c46d6fba - React-Codegen: b75333b93d835afce84b73472927cccaef2c9f8c - React-Core: 88838ed1724c64905fc6c0811d752828a92e395b - React-CoreModules: cd238b4bb8dc8529ccc8b34ceae7267b04ce1882 - React-cxxreact: 291bfab79d8098dc5ebab98f62e6bdfe81b3955a - React-hermes: b1e67e9a81c71745704950516f40ee804349641c - React-jsi: c9d5b563a6af6bb57034a82c2b0d39d0a7483bdc - React-jsiexecutor: d6b7fa9260aa3cb40afee0507e3bc1d17ecaa6f2 - React-jsinspector: 1f51e775819199d3fe9410e69ee8d4c4161c7b06 - React-logger: 0d58569ec51d30d1792c5e86a8e3b78d24b582c6 + RCTRequired: 5c6fd63b03abb06947d348dadac51c93e3485bd8 + RCTTypeSafety: 1c66daedd66f674e39ce9f40782f0d490c78b175 + React: e11ca7cdc7aa4ddd7e6a59278b808cfe17ebbd9f + React-callinvoker: 77a82869505c96945c074b80bbdc8df919646d51 + React-Codegen: 9ee33090c38ab3da3c4dc029924d50fb649f0dfc + React-Core: 44903e47b428a491f48fd0eae54caddb2ea05ebf + React-CoreModules: 83d989defdfc82be1f7386f84a56b6509f54ac74 + React-cxxreact: 058e7e6349649eae9cfcdec5854e702b26298932 + React-hermes: ba19a405804b833c9b832c1f2061ad5038bb97f2 + React-jsi: 3fe6f589c9cafbef85ed5a4be7c6dc8edfb4ab54 + React-jsiexecutor: 7894956638ff3e00819dd3f9f6f4a84da38f2409 + React-jsinspector: d5ce2ef3eb8fd30c28389d0bc577918c70821bd6 + React-logger: 9332c3e7b4ef007a0211c0a9868253aac3e1da82 react-native-blur: 50c9feabacbc5f49b61337ebc32192c6be7ec3c3 react-native-cameraroll: f3050460fe1708378698c16686bfaa5f34099be2 react-native-image-picker: ec9b713e248760bfa0f879f0715391de4651a7cb react-native-ios-context-menu: e529171ba760a1af7f2ef0729f5a7f4d226171c5 react-native-language-detection: f414937fa715108ab50a6269a3de0bcb95e4ceb0 - react-native-mmkv: a2a40a0458bdbc9d43c4e7752ecfc5e3a87b66dd - react-native-netinfo: 2517ad504b3d303e90d7a431b0fcaef76d207983 - react-native-pager-view: b58cb9e9f42f64e50cab3040815772c1d119a2e2 + react-native-mmkv: 7da5e18e55c04a9af9a7e0ab9792a1e8d33765a1 + react-native-netinfo: 22c082970cbd99071a4e5aa7a612ac20d66b08f0 + react-native-pager-view: 0ccb8bf60e2ebd38b1f3669fa3650ecce81db2df react-native-paste-input: 3392800944a47c00dddbff23c31c281482209679 react-native-quick-base64: e657e9197e61b60a9dec49807843052b830da254 - react-native-safe-area-context: 39c2d8be3328df5d437ac1700f4f3a4f75716acc - react-native-segmented-control: 06607462630512ff8eef652ec560e6235a30cc3e - React-perflogger: 0bb0522a12e058f6eb69d888bc16f40c16c4b907 - React-RCTActionSheet: bfd675a10f06a18728ea15d82082d48f228a213a - React-RCTAnimation: 2fa220b2052ec75b733112aca39143d34546a941 - React-RCTAppDelegate: 8564f93c1d9274e95e3b0c746d08a87ff5a621b2 - React-RCTBlob: d0336111f46301ae8aba2e161817e451aad72dd6 - React-RCTImage: fec592c46edb7c12a9cde08780bdb4a688416c62 - React-RCTLinking: 14eccac5d2a3b34b89dbfa29e8ef6219a153fe2d - React-RCTNetwork: 1fbce92e772e39ca3687a2ebb854501ff6226dd7 - React-RCTSettings: 1abea36c9bb16d9979df6c4b42e2ea281b4bbcc5 - React-RCTText: 15355c41561a9f43dfd23616d0a0dd40ba05ed61 - React-RCTVibration: ad17efcfb2fa8f6bfd8ac0cf48d96668b8b28e0b - React-runtimeexecutor: 8fa50b38df6b992c76537993a2b0553d3b088004 - ReactCommon: b49a4b00ca6d181ff74b17c12b2d59ac4add0bde + react-native-safe-area-context: f5549f36508b1b7497434baa0cd97d7e470920d4 + react-native-segmented-control: 0e4b5d93911e2234f110057df2b41738b326ab3e + React-perflogger: 43392072a5b867a504e2b4857606f8fc5a403d7f + React-RCTActionSheet: c7b67c125bebeda9fb19fc7b200d85cb9d6899c4 + React-RCTAnimation: c2de79906f607986633a7114bee44854e4c7e2f5 + React-RCTAppDelegate: 96bc933c3228a549718a6475c4d3f9dd4bbae98d + React-RCTBlob: cf72446957310e7da6627a4bdaadf970d3a8f232 + React-RCTImage: c6093f1bf3d67c0428d779b00390617d5bd90699 + React-RCTLinking: 5de47e37937889d22599af4b99d0552bad1b1c3c + React-RCTNetwork: e7d7077e073b08e5dd486fba3fe87ccad90a9bc4 + React-RCTSettings: 72a04921b2e8fb832da7201a60ffffff2a7c62f7 + React-RCTText: 7123c70fef5367e2121fea37e65b9ad6d3747e54 + React-RCTVibration: 73d201599a64ea14b4e0b8f91b64970979fd92e6 + React-runtimeexecutor: 8692ac548bec648fa121980ccb4304afd136d584 + ReactCommon: 0c43eaeaaee231d7d8dc24fc5a6e4cf2b75bf196 RNCAsyncStorage: 8616bd5a58af409453ea4e1b246521bb76578d60 RNCClipboard: 3f0451a8100393908bea5c5c5b16f96d45f30bfc RNGestureHandler: 071d7a9ad81e8b83fe7663b303d132406a7d8f39 RNReanimated: f0dd6b881808e635ef0673f89642937d6c141314 RNScreens: 218801c16a2782546d30bd2026bb625c0302d70f - RNSentry: 43658c8c327376e0c06149ce981899f5f84e90d9 + RNSentry: 68d5b2339fc7cd864e8076279345cc90174fa583 RNShareMenu: cb9dac548c8bf147d06f0bf07296ad51ea9f5fc3 - RNSVG: c1e76b81c76cdcd34b4e1188852892dc280eb902 + RNSVG: 53c661b76829783cdaf9b7a57258f3d3b4c28315 SDWebImage: fd7e1a22f00303e058058278639bf6196ee431fe SDWebImageAVIFCoder: d759e21cf4efb640cc97250566aa556ad8bb877c SDWebImageSVGCoder: 6fc109f9c2a82ab44510fff410b88b1a6c271ee8 SDWebImageWebPCoder: 18503de6621dd2c420d680e33d46bf8e1d5169b0 - Sentry: 757565eb01e2a6ef6b26e897e4e47e8213e12f06 - SentryPrivate: 668d6ce46835769b32e61dc8b5c78ef0b6cdcef8 + Sentry: 16d46dd5ca10e7f4469a2611805a3de123188add + SentryPrivate: 2bb4f8d9ff558b25ac70b66c1dedc58a7c43630b Swime: d7b2c277503b6cea317774aedc2dce05613f8b0b - Yoga: 79dd7410de6f8ad73a77c868d3d368843f0c93e0 + Yoga: ba09b6b11e6139e3df8229238aa794205ca6a02a PODFILE CHECKSUM: 61a84f1ad8a466fbbbf09e0f8bb3ed30b2d5e301 diff --git a/ios/el.lproj/InfoPlist.strings b/ios/el.lproj/InfoPlist.strings new file mode 100644 index 00000000..9324bf1e --- /dev/null +++ b/ios/el.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +"NSPhotoLibraryAddUsageDescription" = "Επιτρέψτε στο tooot να αποθηκεύει εικόνες στο ρολό της κάμερας"; +"NSPhotoLibraryUsageDescription" = "Επιτρέψτε στο tooot να αποθηκεύει εικόνες στο ρολό της κάμερας"; diff --git a/ios/tooot.xcodeproj/project.pbxproj b/ios/tooot.xcodeproj/project.pbxproj index ee7c7442..43a26986 100644 --- a/ios/tooot.xcodeproj/project.pbxproj +++ b/ios/tooot.xcodeproj/project.pbxproj @@ -77,6 +77,7 @@ E633A42F281EAF38000E540F /* ShareViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ShareViewController.swift; path = "../../node_modules/react-native-share-menu/ios/ShareViewController.swift"; sourceTree = ""; }; E633A431281EB55C000E540F /* ShareExtension-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ShareExtension-Bridging-Header.h"; sourceTree = ""; }; E63E7FF0292A828100C76FD4 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/InfoPlist.strings; sourceTree = ""; }; + E65BA25629EDEF8C008E0BBC /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/InfoPlist.strings; sourceTree = ""; }; E66C0842291F095800DFFF60 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InfoPlist.strings; sourceTree = ""; }; E671BDF8290EAFB800287BD0 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/InfoPlist.strings"; sourceTree = ""; }; E690907B29C1133000489554 /* eu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = eu; path = eu.lproj/InfoPlist.strings; sourceTree = ""; }; @@ -308,6 +309,7 @@ be, eu, pl, + el, ); mainGroup = 83CBB9F61A601CBA00E9B192; productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; @@ -545,6 +547,7 @@ E6179D6E29B94551001930D5 /* be */, E690907B29C1133000489554 /* eu */, E6B76A1E29C1147B00187ABB /* pl */, + E65BA25629EDEF8C008E0BBC /* el */, ); name = InfoPlist.strings; sourceTree = ""; diff --git a/ios/tooot/Info.plist b/ios/tooot/Info.plist index a70dccd6..a7f281e3 100644 --- a/ios/tooot/Info.plist +++ b/ios/tooot/Info.plist @@ -35,6 +35,7 @@ tooot-share tooot + https diff --git a/package.json b/package.json index 1a919d89..68d5f8ef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tooot", - "version": "4.9.2", + "version": "4.9.4", "description": "tooot for Mastodon", "author": "xmflsct ", "license": "GPL-3.0-or-later", @@ -19,39 +19,39 @@ }, "dependencies": { "@expo/react-native-action-sheet": "^4.0.1", - "@formatjs/intl-datetimeformat": "^6.5.1", + "@formatjs/intl-datetimeformat": "^6.6.0", "@formatjs/intl-getcanonicallocales": "^2.1.0", - "@formatjs/intl-locale": "^3.1.1", - "@formatjs/intl-numberformat": "^8.3.5", - "@formatjs/intl-pluralrules": "^5.1.10", - "@formatjs/intl-relativetimeformat": "^11.1.10", + "@formatjs/intl-locale": "^3.2.0", + "@formatjs/intl-numberformat": "^8.4.0", + "@formatjs/intl-pluralrules": "^5.2.0", + "@formatjs/intl-relativetimeformat": "^11.2.0", "@mattermost/react-native-paste-input": "^0.6.2", "@neverdull-agency/expo-unlimited-secure-store": "^1.0.10", "@react-native-async-storage/async-storage": "~1.17.11", "@react-native-camera-roll/camera-roll": "^5.3.1", "@react-native-clipboard/clipboard": "^1.11.2", "@react-native-community/blur": "^4.3.0", - "@react-native-community/netinfo": "9.3.7", - "@react-native-firebase/app": "^17.3.2", + "@react-native-community/netinfo": "9.3.9", + "@react-native-firebase/app": "^17.4.2", "@react-native-menu/menu": "^0.7.3", - "@react-native-segmented-control/segmented-control": "^2.4.0", + "@react-native-segmented-control/segmented-control": "^2.4.1", "@react-navigation/bottom-tabs": "^6.5.7", "@react-navigation/native": "^6.1.6", "@react-navigation/native-stack": "^6.9.12", "@react-navigation/stack": "^6.3.16", - "@sentry/react-native": "5.1.1", + "@sentry/react-native": "5.3.1", "@sharcoux/slider": "^6.1.1", - "@tanstack/react-query": "^4.26.1", - "axios": "^1.3.4", + "@tanstack/react-query": "^4.29.3", + "axios": "^1.3.5", "diff": "^5.1.0", - "expo": "48.0.7", + "expo": "48.0.11", "expo-auth-session": "^4.0.3", "expo-av": "^13.2.1", "expo-constants": "^14.2.1", - "expo-crypto": "^12.2.1", + "expo-crypto": "^12.2.2", "expo-file-system": "^15.2.2", "expo-haptics": "^12.2.1", - "expo-image": "^1.0.0", + "expo-image": "^1.2.1", "expo-linking": "^4.0.1", "expo-localization": "^14.1.1", "expo-notifications": "^0.18.1", @@ -62,43 +62,43 @@ "expo-store-review": "^6.2.1", "expo-video-thumbnails": "^7.2.1", "expo-web-browser": "~12.1.1", - "htmlparser2": "^8.0.1", - "i18next": "^22.4.11", + "htmlparser2": "^8.0.2", + "i18next": "^22.4.14", "linkify-it": "^4.0.1", "lodash": "^4.17.21", "react": "^18.2.0", "react-dom": "^18.2.0", "react-i18next": "^12.2.0", - "react-intl": "^6.2.10", - "react-native": "^0.71.4", - "react-native-flash-message": "^0.4.0", + "react-intl": "^6.4.0", + "react-native": "^0.71.6", + "react-native-flash-message": "^0.4.1", "react-native-gesture-handler": "~2.9.0", "react-native-image-picker": "^5.3.1", "react-native-ios-context-menu": "^1.15.3", "react-native-language-detection": "^0.2.2", - "react-native-mmkv": "~2.7.0", - "react-native-pager-view": "^6.1.4", + "react-native-mmkv": "~2.8.0", + "react-native-pager-view": "^6.2.0", "react-native-quick-base64": "^2.0.5", "react-native-reanimated": "^3.0.2", "react-native-reanimated-zoom": "^0.3.3", - "react-native-safe-area-context": "^4.5.0", + "react-native-safe-area-context": "^4.5.1", "react-native-screens": "^3.20.0", "react-native-share-menu": "^6.0.0", - "react-native-svg": "^13.8.0", + "react-native-svg": "^13.9.0", "react-native-swipe-list-view": "^3.2.9", "react-native-tab-view": "^3.5.1", "rn-placeholder": "^3.0.3", - "zeego": "^1.4.1" + "zeego": "^1.4.2" }, "devDependencies": { - "@babel/core": "^7.21.3", + "@babel/core": "^7.21.4", "@babel/plugin-proposal-optional-chaining": "^7.21.0", - "@babel/preset-typescript": "^7.21.0", + "@babel/preset-typescript": "^7.21.4", "@expo/config": "^8.0.2", - "@types/diff": "^5.0.2", + "@types/diff": "^5.0.3", "@types/linkify-it": "^3.0.2", - "@types/lodash": "^4.14.191", - "@types/react": "^18.0.28", + "@types/lodash": "^4.14.194", + "@types/react": "^18.0.37", "@types/react-dom": "^18.0.11", "@types/react-native-share-menu": "^5.0.2", "babel-plugin-module-resolver": "^5.0.0", @@ -107,13 +107,14 @@ "deprecated-react-native-prop-types": "^4.0.0", "dotenv": "^16.0.3", "react-native-clean-project": "^4.0.1", - "typescript": "^4.9.5" + "typescript": "^5.0.4" }, "packageManager": "yarn@3.3.1", "resolutions": { "expo-av@^13.0.2": "patch:expo-av@npm%3A13.0.2#./.yarn/patches/expo-av-npm-13.0.2-7a651776f1.patch", "react-native-share-menu@^6.0.0": "patch:react-native-share-menu@npm%3A6.0.0#./.yarn/patches/react-native-share-menu-npm-6.0.0-f1094c3204.patch", "@types/react-native-share-menu@^5.0.2": "patch:@types/react-native-share-menu@npm%3A5.0.2#./.yarn/patches/@types-react-native-share-menu-npm-5.0.2-373df17ecc.patch", - "react-native-ios-context-menu@^1.15.1": "patch:react-native-ios-context-menu@npm%3A1.15.1#./.yarn/patches/react-native-ios-context-menu-npm-1.15.1-0034bfa5ba.patch" + "react-native-ios-context-menu@^1.15.1": "patch:react-native-ios-context-menu@npm%3A1.15.1#./.yarn/patches/react-native-ios-context-menu-npm-1.15.1-0034bfa5ba.patch", + "react-native-reanimated-zoom@^0.3.3": "patch:react-native-reanimated-zoom@npm%3A0.3.3#./.yarn/patches/react-native-reanimated-zoom-npm-0.3.3-bbb8d84109.patch" } } diff --git a/src/components/Hashtag.tsx b/src/components/Hashtag.tsx index 355e39d2..6b094ccd 100644 --- a/src/components/Hashtag.tsx +++ b/src/components/Hashtag.tsx @@ -4,9 +4,10 @@ import { TabLocalStackParamList } from '@utils/navigation/navigators' import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' import React, { PropsWithChildren, useState } from 'react' -import { Dimensions, Pressable, View } from 'react-native' +import { Dimensions, Pressable, Text, View } from 'react-native' import Sparkline from './Sparkline' import CustomText from './Text' +import { sumBy } from 'lodash' export interface Props { hashtag: Mastodon.Tag @@ -29,6 +30,8 @@ const ComponentHashtag: React.FC = ({ const width = Dimensions.get('window').width / 4 const [height, setHeight] = useState(0) + const sum = sumBy(hashtag.history, h => parseInt(h.uses)) + return ( = ({ }} onPress={customOnPress || onPress} > - - #{hashtag.name} - + + #{hashtag.name} + {sum ? ( + <> + {' '} + + ({sumBy(hashtag.history, h => parseInt(h.uses))}) + + + ) : null} + + {hashtag.history?.length ? ( = ({ width={width} height={height} margin={children ? StyleConstants.Spacing.S : undefined} + color={!sum ? colors.disabled : undefined} /> {children} diff --git a/src/components/Instance/index.tsx b/src/components/Instance/index.tsx index 5ea043cd..80906e4a 100644 --- a/src/components/Instance/index.tsx +++ b/src/components/Instance/index.tsx @@ -22,7 +22,6 @@ import * as AuthSession from 'expo-auth-session' import * as Crypto from 'expo-crypto' import { Image } from 'expo-image' import * as Linking from 'expo-linking' -import * as WebBrowser from 'expo-web-browser' import { debounce } from 'lodash' import React, { RefObject, useCallback, useState } from 'react' import { Trans, useTranslation } from 'react-i18next' @@ -30,6 +29,7 @@ import { Alert, KeyboardAvoidingView, Platform, TextInput, View } from 'react-na import { ScrollView } from 'react-native-gesture-handler' import { fromByteArray } from 'react-native-quick-base64' import CustomText from '../Text' +import openLink from '@components/openLink' export interface Props { scrollViewRef?: RefObject @@ -80,7 +80,7 @@ const ComponentInstance: React.FC = ({ clientSecret, scopes: variables.scopes, redirectUri, - usePKCE: !['pawoo.net'].includes(domain) + usePKCE: !['pawoo.net', 'mao.mastodonhub.com'].includes(domain) }) await request.makeAuthUrlAsync(discovery) @@ -386,20 +386,12 @@ const ComponentInstance: React.FC = ({ - WebBrowser.openBrowserAsync('https://tooot.app/privacy-policy', { - ...(await browserPackage()) - }) - } + onPress={async () => openLink('https://tooot.app/privacy-policy')} />, - WebBrowser.openBrowserAsync('https://tooot.app/terms-of-service', { - ...(await browserPackage()) - }) - } + onPress={async () => openLink('https://tooot.app/terms-of-service')} /> ]} /> diff --git a/src/components/Parse/HTML.tsx b/src/components/Parse/HTML.tsx index 8057cc6e..ba94896b 100644 --- a/src/components/Parse/HTML.tsx +++ b/src/components/Parse/HTML.tsx @@ -223,7 +223,7 @@ const ParseHTML: React.FC = ({ key={index} style={{ lineHeight: adaptedLineheight ? adaptedLineheight / 2 : undefined }} > - {'\n'} + {'\n\n'} ) case 'p': diff --git a/src/components/Sparkline.tsx b/src/components/Sparkline.tsx index 8ef25c37..72f3371d 100644 --- a/src/components/Sparkline.tsx +++ b/src/components/Sparkline.tsx @@ -8,9 +8,10 @@ export interface Props { width: number height: number margin?: number + color?: string } -const Sparkline: React.FC = ({ data, width, height, margin = 0 }) => { +const Sparkline: React.FC = ({ data, width, height, margin = 0, color }) => { const { colors } = useTheme() const dataToPoints = ({ @@ -70,10 +71,10 @@ const Sparkline: React.FC = ({ data, width, height, margin = 0 }) => { return ( - + = ({ ) - const mShare = menuShare({ - visibility: status.visibility, - type: 'status', - url: status.url || status.uri, - rawContent - }) - const mStatus = menuStatus({ status, queryKey }) - const mInstance = menuInstance({ status, queryKey }) - if (!isMyAccount) { let filterResults: FilteredProps['filterResults'] = [] const [filterRevealed, setFilterRevealed] = useState(false) @@ -183,67 +170,14 @@ const TimelineDefault: React.FC = ({ {main()} ) : ( <> - - - navigation.push('Tab-Shared-Toot', { toot: status })} - onLongPress={() => {}} - children={main()} - /> - - - - {[mShare, mStatus, mInstance].map((menu, i) => ( - - {menu.map((group, index) => ( - - {group.map(item => { - switch (item.type) { - case 'item': - return ( - - - {item.icon ? ( - - ) : null} - - ) - case 'sub': - return ( - // @ts-ignore - - - - {item.trigger.icon ? ( - - ) : null} - - - {item.items.map(sub => ( - - - {sub.icon ? ( - - ) : null} - - ))} - - - ) - } - })} - - ))} - - ))} - - + navigation.push('Tab-Shared-Toot', { toot: status })} + onLongPress={() => {}} + children={main()} + /> )} diff --git a/src/components/Timeline/Notifications.tsx b/src/components/Timeline/Notifications.tsx index c1030c56..ee1ddfe3 100644 --- a/src/components/Timeline/Notifications.tsx +++ b/src/components/Timeline/Notifications.tsx @@ -1,6 +1,3 @@ -import menuInstance from '@components/contextMenu/instance' -import menuShare from '@components/contextMenu/share' -import menuStatus from '@components/contextMenu/status' import TimelineActioned from '@components/Timeline/Shared/Actioned' import TimelineActions from '@components/Timeline/Shared/Actions' import TimelineAttachment from '@components/Timeline/Shared/Attachment' @@ -18,9 +15,8 @@ import { usePreferencesQuery } from '@utils/queryHooks/preferences' import { QueryKeyTimeline } from '@utils/queryHooks/timeline' import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' -import React, { Fragment, useState } from 'react' +import React, { useState } from 'react' import { Pressable, View } from 'react-native' -import * as ContextMenu from 'zeego/context-menu' import StatusContext from './Shared/Context' import TimelineFiltered, { FilteredProps, shouldFilter } from './Shared/Filtered' import TimelineFullConversation from './Shared/FullConversation' @@ -100,14 +96,6 @@ const TimelineNotifications: React.FC = ({ notification, queryKey }) => { ) } - const mShare = menuShare({ - visibility: notification.status?.visibility, - type: 'status', - url: notification.status?.url || notification.status?.uri - }) - const mStatus = menuStatus({ status: notification.status, queryKey }) - const mInstance = menuInstance({ status: notification.status, queryKey }) - if (!isMyAccount) { let filterResults: FilteredProps['filterResults'] = [] const [filterRevealed, setFilterRevealed] = useState(false) @@ -143,67 +131,18 @@ const TimelineNotifications: React.FC = ({ notification, queryKey }) => { spoilerHidden }} > - - - - notification.status && - navigation.push('Tab-Shared-Toot', { toot: notification.status }) - } - onLongPress={() => {}} - children={main()} - /> - - - - {[mShare, mStatus, mInstance].map((menu, i) => ( - - {menu.map((group, index) => ( - - {group.map(item => { - switch (item.type) { - case 'item': - return ( - - - {item.icon ? : null} - - ) - case 'sub': - return ( - // @ts-ignore - - - - {item.trigger.icon ? ( - - ) : null} - - - {item.items.map(sub => ( - - - {sub.icon ? ( - - ) : null} - - ))} - - - ) - } - })} - - ))} - - ))} - - + + notification.status && navigation.push('Tab-Shared-Toot', { toot: notification.status }) + } + onLongPress={() => {}} + children={main()} + /> ) diff --git a/src/components/Timeline/Refresh.tsx b/src/components/Timeline/Refresh.tsx index fd399d9c..4e5142b4 100644 --- a/src/components/Timeline/Refresh.tsx +++ b/src/components/Timeline/Refresh.tsx @@ -218,6 +218,7 @@ const TimelineRefresh: React.FC = ({ } isFetchingPrev.value = false }) + .catch(() => (isFetchingPrev.value = false)) } const runFetchLatest = async () => { diff --git a/src/components/Timeline/Shared/Card/Neodb.tsx b/src/components/Timeline/Shared/Card/Neodb.tsx index f412746b..0e8c453e 100644 --- a/src/components/Timeline/Shared/Card/Neodb.tsx +++ b/src/components/Timeline/Shared/Card/Neodb.tsx @@ -17,130 +17,121 @@ export const CardNeodb: React.FC = ({ card }) => { const { colors } = useTheme() const segments = Linking.parse(card.url).path?.split('/') - if (!segments || !(segments[0] === 'movie' || segments[0] === 'book' || segments[0] === 'tv')) + if ( + !segments || + !( + segments[0] === 'movie' || + segments[0] === 'book' || + (segments[0] === 'tv' && segments[1] !== 'season') || + segments[0] === 'game' + ) + ) return null + const [headingLines, setHeadingLines] = useState(3) + const { data } = useNeodbQuery({ path: `${segments[0]}/${segments[1]}` }) if (!data) return null - const pressableProps = { - style: { - marginTop: StyleConstants.Spacing.M, - backgroundColor: colors.shimmerDefault, - borderRadius: StyleConstants.BorderRadius, - padding: StyleConstants.Spacing.S, - flexDirection: 'row' as 'row' - }, - onPress: () => openLink(card.url) - } - const contentProps = { style: { flex: 1, gap: StyleConstants.Spacing.S } } - - const [headingLines, setHeadingLines] = useState(3) - - const itemImage = data.cover_image_url ? ( - ( + - ) : null - const itemHeading = (value: string) => ( - setHeadingLines(nativeEvent.lines.length)} - /> - ) - const itemDetails = (value: string) => ( - + onPress={() => openLink(card.url)} + > + {data.cover_image_url ? ( + + ) : null} + + + setHeadingLines(nativeEvent.lines.length)} + children={heading.filter(d => d).join(' ')} + /> + + + + d).join(' / ')} + /> + + ) switch (segments[0]) { case 'movie': return ( - - {itemImage} - - {itemHeading( - [data.title, data.orig_title, data.year ? `(${data.year})` : null] - .filter(d => d) - .join(' ') - )} - - {itemDetails( - [ - data.duration - ? parseInt(data.duration).toString() === data.duration - ? `${data.duration}分钟` - : data.duration - : null, - data.area?.join(' '), - data.genre?.join(' '), - data.director?.join(' ') - ] - .filter(d => d) - .join(' / ') - )} - - + ) case 'book': return ( - - {itemImage} - - {itemHeading(data.title)} - - {itemDetails( - [ - data.author?.join(' '), - data.pages ? `${data.pages}页` : null, - data.language, - data.pub_house - ] - .filter(d => d) - .join(' / ') - )} - - + ) case 'tv': return ( - - {itemImage} - - {itemHeading( - [data.title, data.orig_title, data.year ? `(${data.year})` : null] - .filter(d => d) - .join(' ') - )} - - {itemDetails( - [ - data.season_count ? `共${data.season_count}季` : null, - data.area?.join(' '), - data.genre?.join(' '), - data.director?.join(' ') - ] - .filter(d => d) - .join(' / ') - )} - - + + ) + case 'game': + return ( + ) default: return null diff --git a/src/components/Timeline/Shared/Card/index.tsx b/src/components/Timeline/Shared/Card/index.tsx index 6d6ac8e5..5dc3012a 100644 --- a/src/components/Timeline/Shared/Card/index.tsx +++ b/src/components/Timeline/Shared/Card/index.tsx @@ -4,6 +4,7 @@ import openLink from '@components/openLink' import CustomText from '@components/Text' import { useNavigation } from '@react-navigation/native' import { StackNavigationProp } from '@react-navigation/stack' +import { isDevelopment } from '@utils/helpers/checkEnvironment' import { urlMatcher } from '@utils/helpers/urlMatcher' import { TabLocalStackParamList } from '@utils/navigation/navigators' import { useAccountQuery } from '@utils/queryHooks/account' @@ -17,14 +18,19 @@ import TimelineDefault from '../../Default' import StatusContext from '../Context' import { CardNeodb } from './Neodb' +const CARD_URL_BLACKLISTS = ['weibo.com', 'weibo.cn'] + const TimelineCard: React.FC = () => { const { status, spoilerHidden, disableDetails, inThread } = useContext(StatusContext) if (!status || !status.card) return null + if (CARD_URL_BLACKLISTS.find(domain => status.card?.url.includes(`${domain}/`))) return null + const { i18n } = useTranslation() if ( - status.card.url.includes('://neodb.social/') && - i18n.language.toLowerCase().startsWith('zh-hans') + (status.card.url.includes('://neodb.social/') && + i18n.language.toLowerCase().startsWith('zh-hans')) || + isDevelopment ) { return } diff --git a/src/components/Timeline/Shared/HeaderDefault.tsx b/src/components/Timeline/Shared/HeaderDefault.tsx index 33b9235c..a4b58d56 100644 --- a/src/components/Timeline/Shared/HeaderDefault.tsx +++ b/src/components/Timeline/Shared/HeaderDefault.tsx @@ -1,4 +1,5 @@ import menuAccount from '@components/contextMenu/account' +import menuInstance from '@components/contextMenu/instance' import menuShare from '@components/contextMenu/share' import menuStatus from '@components/contextMenu/status' import Icon from '@components/Icon' @@ -17,7 +18,8 @@ import HeaderSharedReplies from './HeaderShared/Replies' import HeaderSharedVisibility from './HeaderShared/Visibility' const TimelineHeaderDefault: React.FC = () => { - const { queryKey, status, disableDetails, rawContent, isRemote } = useContext(StatusContext) + const { queryKey, status, disableDetails, rawContent, isRemote, highlighted } = + useContext(StatusContext) if (!status) return null const { colors } = useTheme() @@ -37,6 +39,7 @@ const TimelineHeaderDefault: React.FC = () => { ...(status && { status }) }) const mStatus = menuStatus({ status, queryKey }) + const mInstance = highlighted ? menuInstance({ status, queryKey }) : [] return ( @@ -87,7 +90,7 @@ const TimelineHeaderDefault: React.FC = () => { - {[mShare, mAccount, mStatus].map((menu, i) => ( + {[mShare, mAccount, mStatus, mInstance].map((menu, i) => ( {menu.map((group, index) => ( diff --git a/src/components/openLink.ts b/src/components/openLink.ts index cf4e5f2f..00004477 100644 --- a/src/components/openLink.ts +++ b/src/components/openLink.ts @@ -8,6 +8,7 @@ import { QueryKeyStatus } from '@utils/queryHooks/status' import { getGlobalStorage } from '@utils/storage/actions' import * as Linking from 'expo-linking' import * as WebBrowser from 'expo-web-browser' +import { WebBrowserPresentationStyle } from 'expo-web-browser' const openLink = async (url: string, navigation?: any) => { const handleNavigation = (page: 'Tab-Shared-Toot' | 'Tab-Shared-Account', options: any) => { @@ -74,6 +75,7 @@ const openLink = async (url: string, navigation?: any) => { default: await WebBrowser.openBrowserAsync(url.trim(), { dismissButtonStyle: 'close', + presentationStyle: WebBrowserPresentationStyle.AUTOMATIC, enableBarCollapsing: true, ...(await browserPackage()) }).catch(() => Linking.openURL(url.trim())) diff --git a/src/i18n/be/screens/tabs.json b/src/i18n/be/screens/tabs.json index 7df2598c..7aa5286a 100644 --- a/src/i18n/be/screens/tabs.json +++ b/src/i18n/be/screens/tabs.json @@ -387,12 +387,12 @@ "account": { "actions": { "accessibilityLabel": "Дзеянні для карыстальніка {{user}}", - "accessibilityHint": "" + "accessibilityHint": "Вы можаце ігнараваць, блакіраваць або абагуліць гэтага карыстальніка" }, "followed_by": " падпісаны на вас", "privateNote": "", "moved": "", - "created_at": "", + "created_at": "Далучыўся: {{date}}", "summary": { "statuses_count": "{{count}} допісаў" }, @@ -467,7 +467,7 @@ "toot": { "name": "Абмеркаванні", "remoteFetch": { - "title": "", + "title": "Змяшчае аддаленае змесціва", "message": "" } }, diff --git a/src/i18n/el/index.ts b/src/i18n/el/index.ts new file mode 100644 index 00000000..cfbbb0e7 --- /dev/null +++ b/src/i18n/el/index.ts @@ -0,0 +1,18 @@ +export default { + common: require('./common'), + + screens: require('./screens'), + screenAccountSelection: require('./screens/accountSelection.json'), + 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') +} diff --git a/src/i18n/index.ts b/src/i18n/index.ts index 33efecba..72b1f640 100644 --- a/src/i18n/index.ts +++ b/src/i18n/index.ts @@ -5,6 +5,7 @@ import { initReactI18next } from 'react-i18next' import be from './be' import ca from './ca' import de from './de' +import el from './el' import en from './en' import es from './es' import eu from './eu' @@ -29,6 +30,7 @@ import '@formatjs/intl-pluralrules/polyfill' import '@formatjs/intl-pluralrules/locale-data/be' import '@formatjs/intl-pluralrules/locale-data/ca' import '@formatjs/intl-pluralrules/locale-data/de' +import '@formatjs/intl-pluralrules/locale-data/el' import '@formatjs/intl-pluralrules/locale-data/en' import '@formatjs/intl-pluralrules/locale-data/es' import '@formatjs/intl-pluralrules/locale-data/eu' @@ -49,6 +51,7 @@ import '@formatjs/intl-numberformat/polyfill' import '@formatjs/intl-numberformat/locale-data/be' import '@formatjs/intl-numberformat/locale-data/ca' import '@formatjs/intl-numberformat/locale-data/de' +import '@formatjs/intl-numberformat/locale-data/el' import '@formatjs/intl-numberformat/locale-data/en' import '@formatjs/intl-numberformat/locale-data/es' import '@formatjs/intl-numberformat/locale-data/eu' @@ -71,6 +74,7 @@ import '@formatjs/intl-datetimeformat/add-all-tz' import '@formatjs/intl-datetimeformat/locale-data/be' import '@formatjs/intl-datetimeformat/locale-data/ca' import '@formatjs/intl-datetimeformat/locale-data/de' +import '@formatjs/intl-datetimeformat/locale-data/el' import '@formatjs/intl-datetimeformat/locale-data/en' import '@formatjs/intl-datetimeformat/locale-data/es' import '@formatjs/intl-datetimeformat/locale-data/eu' @@ -92,6 +96,7 @@ import '@formatjs/intl-relativetimeformat/polyfill' import '@formatjs/intl-relativetimeformat/locale-data/be' import '@formatjs/intl-relativetimeformat/locale-data/ca' import '@formatjs/intl-relativetimeformat/locale-data/de' +import '@formatjs/intl-relativetimeformat/locale-data/el' import '@formatjs/intl-relativetimeformat/locale-data/en' import '@formatjs/intl-relativetimeformat/locale-data/es' import '@formatjs/intl-relativetimeformat/locale-data/eu' @@ -120,6 +125,7 @@ i18n.use(initReactI18next).init({ be, ca, de, + el, en, es, eu, diff --git a/src/i18n/locales.ts b/src/i18n/locales.ts index 29b1cfc3..c814ae38 100644 --- a/src/i18n/locales.ts +++ b/src/i18n/locales.ts @@ -2,6 +2,7 @@ const LOCALES = { be: 'Беларуская', ca: 'Català', de: 'Deutsch', + el: 'Ελληνικά', en: 'English', es: 'Español', eu: 'Euskara', diff --git a/src/i18n/uk/components/timeline.json b/src/i18n/uk/components/timeline.json index f611d424..7d49da61 100644 --- a/src/i18n/uk/components/timeline.json +++ b/src/i18n/uk/components/timeline.json @@ -129,7 +129,7 @@ "muted": { "accessibilityLabel": "Дмух приглушений" }, - "replies": "", + "replies": "Відповіді <0 />", "visibility": { "direct": { "accessibilityLabel": "Дмухнути особистим повідомленням" diff --git a/src/i18n/vi/common.json b/src/i18n/vi/common.json index 0f4fb496..e9b1736e 100644 --- a/src/i18n/vi/common.json +++ b/src/i18n/vi/common.json @@ -9,7 +9,7 @@ "delete": "Xóa", "done": "Xong", "confirm": "Xác nhận", - "add": "" + "add": "Thêm" }, "customEmoji": { "accessibilityLabel": "Tùy chỉnh emoji {{emoji}}" diff --git a/src/i18n/vi/components/contextMenu.json b/src/i18n/vi/components/contextMenu.json index e50ec09d..6ba73e96 100644 --- a/src/i18n/vi/components/contextMenu.json +++ b/src/i18n/vi/components/contextMenu.json @@ -6,7 +6,7 @@ "action_false": "Theo dõi người này", "action_true": "Ngưng theo dõi người này" }, - "inLists": "", + "inLists": "Danh sách người ...", "showBoosts": { "action_false": "Hiển lượt đăng lại", "action_true": "Ẩn lượt đăng lại" @@ -16,12 +16,12 @@ "action_true": "Bỏ ẩn người dùng" }, "followAs": { - "trigger": "", - "succeed_default": "", - "succeed_locked": "", - "failed": "" + "trigger": "Theo dõi như...", + "succeed_default": "Đang theo dõi @{{target}} bằng @{{source}}", + "succeed_locked": "Đã gửi yêu cầu theo dõi tới @{{target}} bằng {{source}}, đang chờ duyệt", + "failed": "Theo dõi như" }, - "blockReport": "", + "blockReport": "Chặn & Báo cáo", "block": { "action_false": "Chặn người này", "action_true": "Bỏ chặn người dùng", @@ -56,11 +56,11 @@ }, "hashtag": { "follow": { - "action_false": "", - "action_true": "" + "action_false": "Theo dõi", + "action_true": "Ngưng theo dõi" }, "filter": { - "action": "" + "action": "Lọc hashtag..." } }, "share": { @@ -99,8 +99,8 @@ "action_true": "Bỏ ghim tút" }, "filter": { - "action_false": "", - "action_true": "" + "action_false": "Lọc tút...", + "action_true": "Quản lý bộ lọc..." } } } \ No newline at end of file diff --git a/src/i18n/vi/components/timeline.json b/src/i18n/vi/components/timeline.json index 833fe3ef..2aa79b55 100644 --- a/src/i18n/vi/components/timeline.json +++ b/src/i18n/vi/components/timeline.json @@ -17,10 +17,10 @@ "refresh": { "fetchPreviousPage": "Trước đó", "refetch": "Trang cuối", - "fetching": "", + "fetching": "Đang tải những tút mới...", "fetched": { - "none": "", - "found": "" + "none": "Đã đọc hết", + "found": "Đã tải {{count}} tút" } }, "shared": { @@ -33,7 +33,7 @@ "poll": "Cuộc bình chọn đã kết thúc", "reblog": { "default": "{{name}} đăng lại", - "myself": "", + "myself": "Bạn đăng lại", "notification": "{{name}} đăng lại tút của bạn" }, "update": "Đăng lại đã được sửa", diff --git a/src/i18n/vi/screens/tabs.json b/src/i18n/vi/screens/tabs.json index 57a54405..6ecb1bdf 100644 --- a/src/i18n/vi/screens/tabs.json +++ b/src/i18n/vi/screens/tabs.json @@ -11,16 +11,16 @@ "segments": { "federated": "Liên hợp", "local": "Máy chủ", - "explore": "" + "explore": "Khám phá" }, "exploring": { - "heading": "", - "trending": "", - "followRemote": "", - "noTitle": "", + "heading": "Khám phá", + "trending": "Xu hướng", + "followRemote": "Theo dõi máy chủ từ xa", + "noTitle": "Không tiêu đề", "errors": { - "existed": "", - "notAvailable": "" + "existed": "Bạn đang theo dõi máy chủ này.", + "notAvailable": "Bảng tin máy chủ này không công khai. Thử máy chủ khác." } } }, @@ -80,16 +80,16 @@ "name": "Thông báo đẩy" }, "preferences": { - "name": "" + "name": "Tùy chọn" }, "preferencesFilters": { - "name": "" + "name": "Tất cả bộ lọc nội dung" }, "preferencesFilterAdd": { - "name": "" + "name": "Tạo bộ lọc" }, "preferencesFilterEdit": { - "name": "" + "name": "Sửa bộ lọc" }, "profile": { "name": "Sửa hồ sơ" @@ -146,48 +146,48 @@ }, "preferences": { "visibility": { - "title": "", + "title": "Kiểu đăng mặc định", "options": { - "public": "", - "unlisted": "", - "private": "" + "public": "Công khai", + "unlisted": "Hạn chế", + "private": "Chỉ người theo dõi" } }, "sensitive": { - "title": "" + "title": "Luôn đánh dấu ảnh/video là nội dung nhạy cảm" }, "media": { - "title": "", + "title": "Hiển thị media", "options": { - "default": "", - "show_all": "", - "hide_all": "" + "default": "Làm mờ nội dung nhạy cảm", + "show_all": "Luôn hiển thị", + "hide_all": "Ẩn" } }, "spoilers": { - "title": "" + "title": "Luôn hiển thị đầy đủ nội dung tút" }, "autoplay_gifs": { - "title": "" + "title": "Tự động phát GIF" }, "filters": { - "title": "", - "content": "" + "title": "Lọc nội dung", + "content": "{{count}} đang dùng" }, "web_only": { - "title": "", - "description": "" + "title": "Cài đặt cập nhật", + "description": "Những cài đặt bên dưới chỉ cập nhật khi dùng web UI" } }, "preferencesFilters": { - "expired": "", + "expired": "Đã hết hạn", "keywords_one": "{{count}} từ khóa", "keywords_other": "{{count}} từ khóa", "statuses_one": "{{count}} tút", "statuses_other": "{{count}} tút", - "context": "", + "context": "Áp dụng sau <0 />", "contexts": { - "home": "", + "home": "đang theo dõi và danh sách", "notifications": "thông báo", "public": "liên hợp", "thread": "thảo luận", @@ -195,33 +195,33 @@ } }, "preferencesFilter": { - "name": "", - "expiration": "", + "name": "Tên", + "expiration": "Hết hiệu lực", "expirationOptions": { - "0": "", - "1800": "", - "3600": "", - "43200": "", - "86400": "", - "604800": "", - "18144000": "" + "0": "Không bao giờ", + "1800": "Sau 30 phút", + "3600": "Sau 1 giờ", + "43200": "Sau 12 giờ", + "86400": "Sau 1 ngày", + "604800": "Sau 1 tuần", + "18144000": "Sau 1 tháng" }, - "context": "", + "context": "Áp dụng trong", "contexts": { - "home": "", - "notifications": "", - "public": "", - "thread": "", - "account": "" + "home": "Đang theo dõi và danh sách", + "notifications": "Thông báo", + "public": "Liên hợp", + "thread": "Hội thoại", + "account": "Xem hồ sơ" }, - "action": "", + "action": "Khi trùng khớp", "actions": { - "warn": "", - "hide": "" + "warn": "Thu gọn nhưng có thể mở rộng", + "hide": "Ẩn hoàn toàn" }, - "keywords": "", - "keyword": "", - "statuses": "" + "keywords": "Khớp từ khóa", + "keyword": "Từ khóa", + "statuses": "Tút trùng khớp" }, "profile": { "feedback": { @@ -390,7 +390,7 @@ "accessibilityHint": "Bạn có thể ẩn, chặn, báo cáo hoặc chia sẻ người này" }, "followed_by": " đang theo dõi bạn", - "privateNote": "", + "privateNote": "Cài ghi chú riêng", "moved": "Đã chuyển đi", "created_at": "Đã tham gia {{date}}", "summary": { @@ -411,8 +411,8 @@ "name": "<0 /><1>'s media" }, "filter": { - "name": "", - "existed": "" + "name": "Thêm vào bộ lọc", + "existed": "Đã tồn tại trong bộ lọc" }, "history": { "name": "Lịch sử chỉnh sửa" @@ -462,7 +462,7 @@ "statuses": "Tút" }, "notFound": "Không tìm thấy {{type}} {{searchTerm}}", - "noResult": "" + "noResult": "Không tìm thấy, vui lòng thử cái khác" }, "toot": { "name": "Nội dung tút", diff --git a/src/screens/Compose/index.tsx b/src/screens/Compose/index.tsx index d5453df1..d6bd605b 100644 --- a/src/screens/Compose/index.tsx +++ b/src/screens/Compose/index.tsx @@ -11,7 +11,6 @@ import { RootStackScreenProps } from '@utils/navigation/navigators' import { useInstanceQuery } from '@utils/queryHooks/instance' import { usePreferencesQuery } from '@utils/queryHooks/preferences' import { searchLocalStatus } from '@utils/queryHooks/search' -import { useTimelineMutation } from '@utils/queryHooks/timeline' import { getAccountStorage, getGlobalStorage, @@ -220,7 +219,6 @@ const ScreenCompose: React.FC> = ({ } return false } - const mutateTimeline = useTimelineMutation({ onMutate: true }) const inputProps: EmojisState['inputProps'] = [ { diff --git a/src/screens/Tabs/Me/Preferences/Filter.tsx b/src/screens/Tabs/Me/Preferences/Filter.tsx index cf98bee7..d01d6ca5 100644 --- a/src/screens/Tabs/Me/Preferences/Filter.tsx +++ b/src/screens/Tabs/Me/Preferences/Filter.tsx @@ -176,18 +176,14 @@ const TabMePreferencesFilter: React.FC< ...(parseInt(expiration) && { expires_in: parseInt(expiration) }), - ...(keywords.filter(keyword => keyword.length).length - ? { - keywords_attributes: keywords - .filter(keyword => keyword.length) - .map(keyword => ({ keyword, whole_word: true })) - } - : params.filter.keywords.length && { - keywords_attributes: params.filter.keywords.map(keyword => ({ - ...keyword, - _destroy: true - })) - }) + keywords_attributes: keywords.map((keyword, index) => + !!params.filter.keywords[index] + ? { + id: params.filter.keywords[index].id, + ...(keyword.length ? { keyword, whole_word: true } : { _destroy: true }) + } + : { keyword, whole_word: true } + ) } }) .then(() => { diff --git a/src/screens/Tabs/Me/Push.tsx b/src/screens/Tabs/Me/Push.tsx index 728229a8..5cb54529 100644 --- a/src/screens/Tabs/Me/Push.tsx +++ b/src/screens/Tabs/Me/Push.tsx @@ -3,11 +3,11 @@ import Icon from '@components/Icon' import { Loading } from '@components/Loading' import { MenuContainer, MenuRow } from '@components/Menu' import { displayMessage } from '@components/Message' +import openLink from '@components/openLink' import CustomText from '@components/Text' import * as Sentry from '@sentry/react-native' import apiInstance from '@utils/api/instance' import apiTooot, { TOOOT_API_DOMAIN } from '@utils/api/tooot' -import browserPackage from '@utils/helpers/browserPackage' import { PUSH_ADMIN, PUSH_DEFAULT, setChannels } from '@utils/push/constants' import { updateExpoToken } from '@utils/push/updateExpoToken' import { useAppsQuery } from '@utils/queryHooks/apps' @@ -18,7 +18,6 @@ import layoutAnimation from '@utils/styles/layoutAnimation' import { useTheme } from '@utils/styles/ThemeManager' import * as Crypto from 'expo-crypto' import * as Notifications from 'expo-notifications' -import * as WebBrowser from 'expo-web-browser' import React, { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { AppState, Linking, Platform, ScrollView, View } from 'react-native' @@ -271,11 +270,7 @@ const TabMePush: React.FC = () => { - WebBrowser.openBrowserAsync('https://tooot.app/how-push-works', { - ...(await browserPackage()) - }) - } + onPress={async () => openLink('https://tooot.app/how-push-works')} /> diff --git a/src/screens/Tabs/Me/Settings/Tooot.tsx b/src/screens/Tabs/Me/Settings/Tooot.tsx index a1d071e3..e97bf2bd 100644 --- a/src/screens/Tabs/Me/Settings/Tooot.tsx +++ b/src/screens/Tabs/Me/Settings/Tooot.tsx @@ -1,13 +1,12 @@ import Icon from '@components/Icon' import { MenuContainer, MenuRow } from '@components/Menu' +import openLink from '@components/openLink' import { useNavigation } from '@react-navigation/native' -import browserPackage from '@utils/helpers/browserPackage' import { getAccountStorage, useGlobalStorage } from '@utils/storage/actions' import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' import Constants from 'expo-constants' import * as Linking from 'expo-linking' -import * as WebBrowser from 'expo-web-browser' import React from 'react' import { useTranslation } from 'react-i18next' import { Platform } from 'react-native' @@ -60,9 +59,7 @@ const SettingsTooot: React.FC = () => { ']' }) } else { - WebBrowser.openBrowserAsync('https://social.xmflsct.com/@tooot', { - ...(await browserPackage()) - }) + openLink('https://social.xmflsct.com/@tooot') } }} /> diff --git a/src/screens/Tabs/Shared/Account/Information/Actions.tsx b/src/screens/Tabs/Shared/Account/Information/Actions.tsx index a9948d9d..c312059b 100644 --- a/src/screens/Tabs/Shared/Account/Information/Actions.tsx +++ b/src/screens/Tabs/Shared/Account/Information/Actions.tsx @@ -37,9 +37,10 @@ const AccountInformationActions: React.FC = () => { return (