1
0
mirror of https://github.com/tooot-app/app synced 2025-06-05 22:19:13 +02:00

Merge branch 'main' into candidate

This commit is contained in:
xmflsct
2023-04-18 00:09:37 +02:00
42 changed files with 1320 additions and 1249 deletions

View File

@ -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()

View File

@ -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. 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 ## Special thanks
- [@a_mento](https://crowdin.com/profile/a_mento) for Basques translation - [@a_mento](https://crowdin.com/profile/a_mento) for Basques translation
- [@dzmitry.zubialevich](https://crowdin.com/profile/dzmitry.zubialevich) for Belarusian translation - [@dzmitry.zubialevich](https://crowdin.com/profile/dzmitry.zubialevich) for Belarusian translation
- [@amrtf](https://crowdin.com/profile/amrtf) for Catalan and Spanish 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 - [@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 - [@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 - [@Hikaru](https://github.com/Hikali-47041) and [@la_la](https://mstdn.jp/@la_la_la) for Japanese translation
- [@hellojaccc](https://github.com/hellojaccc) for Korean translation - [@hellojaccc](https://github.com/hellojaccc) for Korean translation

View File

@ -13,7 +13,7 @@
<!-- [Custom] Expo Notifications --> <!-- [Custom] Expo Notifications -->
<meta-data android:name="expo.modules.notifications.default_notification_icon" android:resource="@drawable/ic_stat_notifications" /> <meta-data android:name="expo.modules.notifications.default_notification_icon" android:resource="@drawable/ic_stat_notifications" />
<!-- [Custom] End Expo Notifications --> <!-- [Custom] End Expo Notifications -->
<activity android:name=".MainActivity" android:label="@string/app_name" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode" android:launchMode="singleTask" android:windowSoftInputMode="adjustResize" android:exported="true" android:theme="@style/Theme.App.SplashScreen" android:screenOrientation="portrait" android:documentLaunchMode="never"> <activity android:name=".MainActivity" android:label="@string/app_name" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode" android:launchMode="singleTask" android:windowSoftInputMode="adjustResize" android:exported="true" android:theme="@style/Theme.App.SplashScreen" android:documentLaunchMode="never">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN"/> <action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/> <category android:name="android.intent.category.LAUNCHER"/>

View File

@ -1,3 +1,2 @@
Enjoy toooting! This version includes following improvements and fixes: Enjoy toooting! This version includes following improvements and fixes:
- Added Basque language - Added Greek translation
- Added Polish language

View File

@ -1,4 +1,2 @@
toooting愉快此版本包括以下改进和修复 toooting愉快此版本包括以下改进和修复
- 添加neodb.social书影音展示卡片 - 新增希腊语
- 新增巴斯克语
- 新增波兰语

View File

@ -14,13 +14,13 @@ PODS:
- ExpoModulesCore - ExpoModulesCore
- EXNotifications (0.18.1): - EXNotifications (0.18.1):
- ExpoModulesCore - ExpoModulesCore
- Expo (48.0.7): - Expo (48.0.11):
- ExpoModulesCore - ExpoModulesCore
- ExpoCrypto (12.2.1): - ExpoCrypto (12.2.2):
- ExpoModulesCore - ExpoModulesCore
- ExpoHaptics (12.2.1): - ExpoHaptics (12.2.1):
- ExpoModulesCore - ExpoModulesCore
- ExpoImage (1.0.0): - ExpoImage (1.2.1):
- ExpoModulesCore - ExpoModulesCore
- SDWebImage (~> 5.15.0) - SDWebImage (~> 5.15.0)
- SDWebImageAVIFCoder (~> 0.9.4) - SDWebImageAVIFCoder (~> 0.9.4)
@ -30,7 +30,7 @@ PODS:
- ExpoModulesCore - ExpoModulesCore
- ExpoLocalization (14.1.1): - ExpoLocalization (14.1.1):
- ExpoModulesCore - ExpoModulesCore
- ExpoModulesCore (1.2.5): - ExpoModulesCore (1.2.6):
- React-Core - React-Core
- React-RCTAppDelegate - React-RCTAppDelegate
- ReactCommon/turbomodule/core - ReactCommon/turbomodule/core
@ -50,19 +50,19 @@ PODS:
- EXSplashScreen (0.18.1): - EXSplashScreen (0.18.1):
- ExpoModulesCore - ExpoModulesCore
- React-Core - React-Core
- FBLazyVector (0.71.4) - FBLazyVector (0.71.6)
- FBReactNativeSpec (0.71.4): - FBReactNativeSpec (0.71.6):
- RCT-Folly (= 2021.07.22.00) - RCT-Folly (= 2021.07.22.00)
- RCTRequired (= 0.71.4) - RCTRequired (= 0.71.6)
- RCTTypeSafety (= 0.71.4) - RCTTypeSafety (= 0.71.6)
- React-Core (= 0.71.4) - React-Core (= 0.71.6)
- React-jsi (= 0.71.4) - React-jsi (= 0.71.6)
- ReactCommon/turbomodule/core (= 0.71.4) - ReactCommon/turbomodule/core (= 0.71.6)
- fmt (6.2.1) - fmt (6.2.1)
- glog (0.3.5) - glog (0.3.5)
- hermes-engine (0.71.4): - hermes-engine (0.71.6):
- hermes-engine/Pre-built (= 0.71.4) - hermes-engine/Pre-built (= 0.71.6)
- hermes-engine/Pre-built (0.71.4) - hermes-engine/Pre-built (0.71.6)
- libaom (2.0.2): - libaom (2.0.2):
- libvmaf - libvmaf
- libavif (0.10.1): - libavif (0.10.1):
@ -102,26 +102,26 @@ PODS:
- fmt (~> 6.2.1) - fmt (~> 6.2.1)
- glog - glog
- libevent - libevent
- RCTRequired (0.71.4) - RCTRequired (0.71.6)
- RCTTypeSafety (0.71.4): - RCTTypeSafety (0.71.6):
- FBLazyVector (= 0.71.4) - FBLazyVector (= 0.71.6)
- RCTRequired (= 0.71.4) - RCTRequired (= 0.71.6)
- React-Core (= 0.71.4) - React-Core (= 0.71.6)
- React (0.71.4): - React (0.71.6):
- React-Core (= 0.71.4) - React-Core (= 0.71.6)
- React-Core/DevSupport (= 0.71.4) - React-Core/DevSupport (= 0.71.6)
- React-Core/RCTWebSocket (= 0.71.4) - React-Core/RCTWebSocket (= 0.71.6)
- React-RCTActionSheet (= 0.71.4) - React-RCTActionSheet (= 0.71.6)
- React-RCTAnimation (= 0.71.4) - React-RCTAnimation (= 0.71.6)
- React-RCTBlob (= 0.71.4) - React-RCTBlob (= 0.71.6)
- React-RCTImage (= 0.71.4) - React-RCTImage (= 0.71.6)
- React-RCTLinking (= 0.71.4) - React-RCTLinking (= 0.71.6)
- React-RCTNetwork (= 0.71.4) - React-RCTNetwork (= 0.71.6)
- React-RCTSettings (= 0.71.4) - React-RCTSettings (= 0.71.6)
- React-RCTText (= 0.71.4) - React-RCTText (= 0.71.6)
- React-RCTVibration (= 0.71.4) - React-RCTVibration (= 0.71.6)
- React-callinvoker (0.71.4) - React-callinvoker (0.71.6)
- React-Codegen (0.71.4): - React-Codegen (0.71.6):
- FBReactNativeSpec - FBReactNativeSpec
- hermes-engine - hermes-engine
- RCT-Folly - RCT-Folly
@ -132,209 +132,209 @@ PODS:
- React-jsiexecutor - React-jsiexecutor
- ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core - ReactCommon/turbomodule/core
- React-Core (0.71.4): - React-Core (0.71.6):
- glog - glog
- hermes-engine - hermes-engine
- RCT-Folly (= 2021.07.22.00) - RCT-Folly (= 2021.07.22.00)
- React-Core/Default (= 0.71.4) - React-Core/Default (= 0.71.6)
- React-cxxreact (= 0.71.4) - React-cxxreact (= 0.71.6)
- React-hermes - React-hermes
- React-jsi (= 0.71.4) - React-jsi (= 0.71.6)
- React-jsiexecutor (= 0.71.4) - React-jsiexecutor (= 0.71.6)
- React-perflogger (= 0.71.4) - React-perflogger (= 0.71.6)
- Yoga - Yoga
- React-Core/CoreModulesHeaders (0.71.4): - React-Core/CoreModulesHeaders (0.71.6):
- glog - glog
- hermes-engine - hermes-engine
- RCT-Folly (= 2021.07.22.00) - RCT-Folly (= 2021.07.22.00)
- React-Core/Default - React-Core/Default
- React-cxxreact (= 0.71.4) - React-cxxreact (= 0.71.6)
- React-hermes - React-hermes
- React-jsi (= 0.71.4) - React-jsi (= 0.71.6)
- React-jsiexecutor (= 0.71.4) - React-jsiexecutor (= 0.71.6)
- React-perflogger (= 0.71.4) - React-perflogger (= 0.71.6)
- Yoga - Yoga
- React-Core/Default (0.71.4): - React-Core/Default (0.71.6):
- glog - glog
- hermes-engine - hermes-engine
- RCT-Folly (= 2021.07.22.00) - RCT-Folly (= 2021.07.22.00)
- React-cxxreact (= 0.71.4) - React-cxxreact (= 0.71.6)
- React-hermes - React-hermes
- React-jsi (= 0.71.4) - React-jsi (= 0.71.6)
- React-jsiexecutor (= 0.71.4) - React-jsiexecutor (= 0.71.6)
- React-perflogger (= 0.71.4) - React-perflogger (= 0.71.6)
- Yoga - Yoga
- React-Core/DevSupport (0.71.4): - React-Core/DevSupport (0.71.6):
- glog - glog
- hermes-engine - hermes-engine
- RCT-Folly (= 2021.07.22.00) - RCT-Folly (= 2021.07.22.00)
- React-Core/Default (= 0.71.4) - React-Core/Default (= 0.71.6)
- React-Core/RCTWebSocket (= 0.71.4) - React-Core/RCTWebSocket (= 0.71.6)
- React-cxxreact (= 0.71.4) - React-cxxreact (= 0.71.6)
- React-hermes - React-hermes
- React-jsi (= 0.71.4) - React-jsi (= 0.71.6)
- React-jsiexecutor (= 0.71.4) - React-jsiexecutor (= 0.71.6)
- React-jsinspector (= 0.71.4) - React-jsinspector (= 0.71.6)
- React-perflogger (= 0.71.4) - React-perflogger (= 0.71.6)
- Yoga - Yoga
- React-Core/RCTActionSheetHeaders (0.71.4): - React-Core/RCTActionSheetHeaders (0.71.6):
- glog - glog
- hermes-engine - hermes-engine
- RCT-Folly (= 2021.07.22.00) - RCT-Folly (= 2021.07.22.00)
- React-Core/Default - React-Core/Default
- React-cxxreact (= 0.71.4) - React-cxxreact (= 0.71.6)
- React-hermes - React-hermes
- React-jsi (= 0.71.4) - React-jsi (= 0.71.6)
- React-jsiexecutor (= 0.71.4) - React-jsiexecutor (= 0.71.6)
- React-perflogger (= 0.71.4) - React-perflogger (= 0.71.6)
- Yoga - Yoga
- React-Core/RCTAnimationHeaders (0.71.4): - React-Core/RCTAnimationHeaders (0.71.6):
- glog - glog
- hermes-engine - hermes-engine
- RCT-Folly (= 2021.07.22.00) - RCT-Folly (= 2021.07.22.00)
- React-Core/Default - React-Core/Default
- React-cxxreact (= 0.71.4) - React-cxxreact (= 0.71.6)
- React-hermes - React-hermes
- React-jsi (= 0.71.4) - React-jsi (= 0.71.6)
- React-jsiexecutor (= 0.71.4) - React-jsiexecutor (= 0.71.6)
- React-perflogger (= 0.71.4) - React-perflogger (= 0.71.6)
- Yoga - Yoga
- React-Core/RCTBlobHeaders (0.71.4): - React-Core/RCTBlobHeaders (0.71.6):
- glog - glog
- hermes-engine - hermes-engine
- RCT-Folly (= 2021.07.22.00) - RCT-Folly (= 2021.07.22.00)
- React-Core/Default - React-Core/Default
- React-cxxreact (= 0.71.4) - React-cxxreact (= 0.71.6)
- React-hermes - React-hermes
- React-jsi (= 0.71.4) - React-jsi (= 0.71.6)
- React-jsiexecutor (= 0.71.4) - React-jsiexecutor (= 0.71.6)
- React-perflogger (= 0.71.4) - React-perflogger (= 0.71.6)
- Yoga - Yoga
- React-Core/RCTImageHeaders (0.71.4): - React-Core/RCTImageHeaders (0.71.6):
- glog - glog
- hermes-engine - hermes-engine
- RCT-Folly (= 2021.07.22.00) - RCT-Folly (= 2021.07.22.00)
- React-Core/Default - React-Core/Default
- React-cxxreact (= 0.71.4) - React-cxxreact (= 0.71.6)
- React-hermes - React-hermes
- React-jsi (= 0.71.4) - React-jsi (= 0.71.6)
- React-jsiexecutor (= 0.71.4) - React-jsiexecutor (= 0.71.6)
- React-perflogger (= 0.71.4) - React-perflogger (= 0.71.6)
- Yoga - Yoga
- React-Core/RCTLinkingHeaders (0.71.4): - React-Core/RCTLinkingHeaders (0.71.6):
- glog - glog
- hermes-engine - hermes-engine
- RCT-Folly (= 2021.07.22.00) - RCT-Folly (= 2021.07.22.00)
- React-Core/Default - React-Core/Default
- React-cxxreact (= 0.71.4) - React-cxxreact (= 0.71.6)
- React-hermes - React-hermes
- React-jsi (= 0.71.4) - React-jsi (= 0.71.6)
- React-jsiexecutor (= 0.71.4) - React-jsiexecutor (= 0.71.6)
- React-perflogger (= 0.71.4) - React-perflogger (= 0.71.6)
- Yoga - Yoga
- React-Core/RCTNetworkHeaders (0.71.4): - React-Core/RCTNetworkHeaders (0.71.6):
- glog - glog
- hermes-engine - hermes-engine
- RCT-Folly (= 2021.07.22.00) - RCT-Folly (= 2021.07.22.00)
- React-Core/Default - React-Core/Default
- React-cxxreact (= 0.71.4) - React-cxxreact (= 0.71.6)
- React-hermes - React-hermes
- React-jsi (= 0.71.4) - React-jsi (= 0.71.6)
- React-jsiexecutor (= 0.71.4) - React-jsiexecutor (= 0.71.6)
- React-perflogger (= 0.71.4) - React-perflogger (= 0.71.6)
- Yoga - Yoga
- React-Core/RCTSettingsHeaders (0.71.4): - React-Core/RCTSettingsHeaders (0.71.6):
- glog - glog
- hermes-engine - hermes-engine
- RCT-Folly (= 2021.07.22.00) - RCT-Folly (= 2021.07.22.00)
- React-Core/Default - React-Core/Default
- React-cxxreact (= 0.71.4) - React-cxxreact (= 0.71.6)
- React-hermes - React-hermes
- React-jsi (= 0.71.4) - React-jsi (= 0.71.6)
- React-jsiexecutor (= 0.71.4) - React-jsiexecutor (= 0.71.6)
- React-perflogger (= 0.71.4) - React-perflogger (= 0.71.6)
- Yoga - Yoga
- React-Core/RCTTextHeaders (0.71.4): - React-Core/RCTTextHeaders (0.71.6):
- glog - glog
- hermes-engine - hermes-engine
- RCT-Folly (= 2021.07.22.00) - RCT-Folly (= 2021.07.22.00)
- React-Core/Default - React-Core/Default
- React-cxxreact (= 0.71.4) - React-cxxreact (= 0.71.6)
- React-hermes - React-hermes
- React-jsi (= 0.71.4) - React-jsi (= 0.71.6)
- React-jsiexecutor (= 0.71.4) - React-jsiexecutor (= 0.71.6)
- React-perflogger (= 0.71.4) - React-perflogger (= 0.71.6)
- Yoga - Yoga
- React-Core/RCTVibrationHeaders (0.71.4): - React-Core/RCTVibrationHeaders (0.71.6):
- glog - glog
- hermes-engine - hermes-engine
- RCT-Folly (= 2021.07.22.00) - RCT-Folly (= 2021.07.22.00)
- React-Core/Default - React-Core/Default
- React-cxxreact (= 0.71.4) - React-cxxreact (= 0.71.6)
- React-hermes - React-hermes
- React-jsi (= 0.71.4) - React-jsi (= 0.71.6)
- React-jsiexecutor (= 0.71.4) - React-jsiexecutor (= 0.71.6)
- React-perflogger (= 0.71.4) - React-perflogger (= 0.71.6)
- Yoga - Yoga
- React-Core/RCTWebSocket (0.71.4): - React-Core/RCTWebSocket (0.71.6):
- glog - glog
- hermes-engine - hermes-engine
- RCT-Folly (= 2021.07.22.00) - RCT-Folly (= 2021.07.22.00)
- React-Core/Default (= 0.71.4) - React-Core/Default (= 0.71.6)
- React-cxxreact (= 0.71.4) - React-cxxreact (= 0.71.6)
- React-hermes - React-hermes
- React-jsi (= 0.71.4) - React-jsi (= 0.71.6)
- React-jsiexecutor (= 0.71.4) - React-jsiexecutor (= 0.71.6)
- React-perflogger (= 0.71.4) - React-perflogger (= 0.71.6)
- Yoga - Yoga
- React-CoreModules (0.71.4): - React-CoreModules (0.71.6):
- RCT-Folly (= 2021.07.22.00) - RCT-Folly (= 2021.07.22.00)
- RCTTypeSafety (= 0.71.4) - RCTTypeSafety (= 0.71.6)
- React-Codegen (= 0.71.4) - React-Codegen (= 0.71.6)
- React-Core/CoreModulesHeaders (= 0.71.4) - React-Core/CoreModulesHeaders (= 0.71.6)
- React-jsi (= 0.71.4) - React-jsi (= 0.71.6)
- React-RCTBlob - React-RCTBlob
- React-RCTImage (= 0.71.4) - React-RCTImage (= 0.71.6)
- ReactCommon/turbomodule/core (= 0.71.4) - ReactCommon/turbomodule/core (= 0.71.6)
- React-cxxreact (0.71.4): - React-cxxreact (0.71.6):
- boost (= 1.76.0) - boost (= 1.76.0)
- DoubleConversion - DoubleConversion
- glog - glog
- hermes-engine - hermes-engine
- RCT-Folly (= 2021.07.22.00) - RCT-Folly (= 2021.07.22.00)
- React-callinvoker (= 0.71.4) - React-callinvoker (= 0.71.6)
- React-jsi (= 0.71.4) - React-jsi (= 0.71.6)
- React-jsinspector (= 0.71.4) - React-jsinspector (= 0.71.6)
- React-logger (= 0.71.4) - React-logger (= 0.71.6)
- React-perflogger (= 0.71.4) - React-perflogger (= 0.71.6)
- React-runtimeexecutor (= 0.71.4) - React-runtimeexecutor (= 0.71.6)
- React-hermes (0.71.4): - React-hermes (0.71.6):
- DoubleConversion - DoubleConversion
- glog - glog
- hermes-engine - hermes-engine
- RCT-Folly (= 2021.07.22.00) - RCT-Folly (= 2021.07.22.00)
- RCT-Folly/Futures (= 2021.07.22.00) - RCT-Folly/Futures (= 2021.07.22.00)
- React-cxxreact (= 0.71.4) - React-cxxreact (= 0.71.6)
- React-jsi - React-jsi
- React-jsiexecutor (= 0.71.4) - React-jsiexecutor (= 0.71.6)
- React-jsinspector (= 0.71.4) - React-jsinspector (= 0.71.6)
- React-perflogger (= 0.71.4) - React-perflogger (= 0.71.6)
- React-jsi (0.71.4): - React-jsi (0.71.6):
- boost (= 1.76.0) - boost (= 1.76.0)
- DoubleConversion - DoubleConversion
- glog - glog
- hermes-engine - hermes-engine
- RCT-Folly (= 2021.07.22.00) - RCT-Folly (= 2021.07.22.00)
- React-jsiexecutor (0.71.4): - React-jsiexecutor (0.71.6):
- DoubleConversion - DoubleConversion
- glog - glog
- hermes-engine - hermes-engine
- RCT-Folly (= 2021.07.22.00) - RCT-Folly (= 2021.07.22.00)
- React-cxxreact (= 0.71.4) - React-cxxreact (= 0.71.6)
- React-jsi (= 0.71.4) - React-jsi (= 0.71.6)
- React-perflogger (= 0.71.4) - React-perflogger (= 0.71.6)
- React-jsinspector (0.71.4) - React-jsinspector (0.71.6)
- React-logger (0.71.4): - React-logger (0.71.6):
- glog - glog
- react-native-blur (4.3.0): - react-native-blur (4.3.0):
- React-Core - React-Core
@ -346,110 +346,110 @@ PODS:
- React-Core - React-Core
- react-native-language-detection (0.2.2): - react-native-language-detection (0.2.2):
- React - React
- react-native-mmkv (2.7.0): - react-native-mmkv (2.8.0):
- MMKV (>= 1.2.13) - MMKV (>= 1.2.13)
- React-Core - React-Core
- react-native-netinfo (9.3.7): - react-native-netinfo (9.3.9):
- React-Core - React-Core
- react-native-pager-view (6.1.4): - react-native-pager-view (6.2.0):
- React-Core - React-Core
- react-native-paste-input (0.6.2): - react-native-paste-input (0.6.2):
- React-Core - React-Core
- Swime (= 3.0.6) - Swime (= 3.0.6)
- react-native-quick-base64 (2.0.5): - react-native-quick-base64 (2.0.5):
- React-Core - React-Core
- react-native-safe-area-context (4.5.0): - react-native-safe-area-context (4.5.1):
- RCT-Folly - RCT-Folly
- RCTRequired - RCTRequired
- RCTTypeSafety - RCTTypeSafety
- React-Core - React-Core
- ReactCommon/turbomodule/core - ReactCommon/turbomodule/core
- react-native-segmented-control (2.4.0): - react-native-segmented-control (2.4.1):
- React-Core - React-Core
- React-perflogger (0.71.4) - React-perflogger (0.71.6)
- React-RCTActionSheet (0.71.4): - React-RCTActionSheet (0.71.6):
- React-Core/RCTActionSheetHeaders (= 0.71.4) - React-Core/RCTActionSheetHeaders (= 0.71.6)
- React-RCTAnimation (0.71.4): - React-RCTAnimation (0.71.6):
- RCT-Folly (= 2021.07.22.00) - RCT-Folly (= 2021.07.22.00)
- RCTTypeSafety (= 0.71.4) - RCTTypeSafety (= 0.71.6)
- React-Codegen (= 0.71.4) - React-Codegen (= 0.71.6)
- React-Core/RCTAnimationHeaders (= 0.71.4) - React-Core/RCTAnimationHeaders (= 0.71.6)
- React-jsi (= 0.71.4) - React-jsi (= 0.71.6)
- ReactCommon/turbomodule/core (= 0.71.4) - ReactCommon/turbomodule/core (= 0.71.6)
- React-RCTAppDelegate (0.71.4): - React-RCTAppDelegate (0.71.6):
- RCT-Folly - RCT-Folly
- RCTRequired - RCTRequired
- RCTTypeSafety - RCTTypeSafety
- React-Core - React-Core
- ReactCommon/turbomodule/core - ReactCommon/turbomodule/core
- React-RCTBlob (0.71.4): - React-RCTBlob (0.71.6):
- hermes-engine - hermes-engine
- RCT-Folly (= 2021.07.22.00) - RCT-Folly (= 2021.07.22.00)
- React-Codegen (= 0.71.4) - React-Codegen (= 0.71.6)
- React-Core/RCTBlobHeaders (= 0.71.4) - React-Core/RCTBlobHeaders (= 0.71.6)
- React-Core/RCTWebSocket (= 0.71.4) - React-Core/RCTWebSocket (= 0.71.6)
- React-jsi (= 0.71.4) - React-jsi (= 0.71.6)
- React-RCTNetwork (= 0.71.4) - React-RCTNetwork (= 0.71.6)
- ReactCommon/turbomodule/core (= 0.71.4) - ReactCommon/turbomodule/core (= 0.71.6)
- React-RCTImage (0.71.4): - React-RCTImage (0.71.6):
- RCT-Folly (= 2021.07.22.00) - RCT-Folly (= 2021.07.22.00)
- RCTTypeSafety (= 0.71.4) - RCTTypeSafety (= 0.71.6)
- React-Codegen (= 0.71.4) - React-Codegen (= 0.71.6)
- React-Core/RCTImageHeaders (= 0.71.4) - React-Core/RCTImageHeaders (= 0.71.6)
- React-jsi (= 0.71.4) - React-jsi (= 0.71.6)
- React-RCTNetwork (= 0.71.4) - React-RCTNetwork (= 0.71.6)
- ReactCommon/turbomodule/core (= 0.71.4) - ReactCommon/turbomodule/core (= 0.71.6)
- React-RCTLinking (0.71.4): - React-RCTLinking (0.71.6):
- React-Codegen (= 0.71.4) - React-Codegen (= 0.71.6)
- React-Core/RCTLinkingHeaders (= 0.71.4) - React-Core/RCTLinkingHeaders (= 0.71.6)
- React-jsi (= 0.71.4) - React-jsi (= 0.71.6)
- ReactCommon/turbomodule/core (= 0.71.4) - ReactCommon/turbomodule/core (= 0.71.6)
- React-RCTNetwork (0.71.4): - React-RCTNetwork (0.71.6):
- RCT-Folly (= 2021.07.22.00) - RCT-Folly (= 2021.07.22.00)
- RCTTypeSafety (= 0.71.4) - RCTTypeSafety (= 0.71.6)
- React-Codegen (= 0.71.4) - React-Codegen (= 0.71.6)
- React-Core/RCTNetworkHeaders (= 0.71.4) - React-Core/RCTNetworkHeaders (= 0.71.6)
- React-jsi (= 0.71.4) - React-jsi (= 0.71.6)
- ReactCommon/turbomodule/core (= 0.71.4) - ReactCommon/turbomodule/core (= 0.71.6)
- React-RCTSettings (0.71.4): - React-RCTSettings (0.71.6):
- RCT-Folly (= 2021.07.22.00) - RCT-Folly (= 2021.07.22.00)
- RCTTypeSafety (= 0.71.4) - RCTTypeSafety (= 0.71.6)
- React-Codegen (= 0.71.4) - React-Codegen (= 0.71.6)
- React-Core/RCTSettingsHeaders (= 0.71.4) - React-Core/RCTSettingsHeaders (= 0.71.6)
- React-jsi (= 0.71.4) - React-jsi (= 0.71.6)
- ReactCommon/turbomodule/core (= 0.71.4) - ReactCommon/turbomodule/core (= 0.71.6)
- React-RCTText (0.71.4): - React-RCTText (0.71.6):
- React-Core/RCTTextHeaders (= 0.71.4) - React-Core/RCTTextHeaders (= 0.71.6)
- React-RCTVibration (0.71.4): - React-RCTVibration (0.71.6):
- RCT-Folly (= 2021.07.22.00) - RCT-Folly (= 2021.07.22.00)
- React-Codegen (= 0.71.4) - React-Codegen (= 0.71.6)
- React-Core/RCTVibrationHeaders (= 0.71.4) - React-Core/RCTVibrationHeaders (= 0.71.6)
- React-jsi (= 0.71.4) - React-jsi (= 0.71.6)
- ReactCommon/turbomodule/core (= 0.71.4) - ReactCommon/turbomodule/core (= 0.71.6)
- React-runtimeexecutor (0.71.4): - React-runtimeexecutor (0.71.6):
- React-jsi (= 0.71.4) - React-jsi (= 0.71.6)
- ReactCommon/turbomodule/bridging (0.71.4): - ReactCommon/turbomodule/bridging (0.71.6):
- DoubleConversion - DoubleConversion
- glog - glog
- hermes-engine - hermes-engine
- RCT-Folly (= 2021.07.22.00) - RCT-Folly (= 2021.07.22.00)
- React-callinvoker (= 0.71.4) - React-callinvoker (= 0.71.6)
- React-Core (= 0.71.4) - React-Core (= 0.71.6)
- React-cxxreact (= 0.71.4) - React-cxxreact (= 0.71.6)
- React-jsi (= 0.71.4) - React-jsi (= 0.71.6)
- React-logger (= 0.71.4) - React-logger (= 0.71.6)
- React-perflogger (= 0.71.4) - React-perflogger (= 0.71.6)
- ReactCommon/turbomodule/core (0.71.4): - ReactCommon/turbomodule/core (0.71.6):
- DoubleConversion - DoubleConversion
- glog - glog
- hermes-engine - hermes-engine
- RCT-Folly (= 2021.07.22.00) - RCT-Folly (= 2021.07.22.00)
- React-callinvoker (= 0.71.4) - React-callinvoker (= 0.71.6)
- React-Core (= 0.71.4) - React-Core (= 0.71.6)
- React-cxxreact (= 0.71.4) - React-cxxreact (= 0.71.6)
- React-jsi (= 0.71.4) - React-jsi (= 0.71.6)
- React-logger (= 0.71.4) - React-logger (= 0.71.6)
- React-perflogger (= 0.71.4) - React-perflogger (= 0.71.6)
- RNCAsyncStorage (1.17.11): - RNCAsyncStorage (1.17.11):
- React-Core - React-Core
- RNCClipboard (1.11.2): - RNCClipboard (1.11.2):
@ -486,12 +486,12 @@ PODS:
- RNScreens (3.20.0): - RNScreens (3.20.0):
- React-Core - React-Core
- React-RCTImage - React-RCTImage
- RNSentry (5.1.1): - RNSentry (5.3.1):
- React-Core - React-Core
- Sentry/HybridSDK (= 8.3.0) - Sentry/HybridSDK (= 8.4.0)
- RNShareMenu (6.0.0): - RNShareMenu (6.0.0):
- React - React
- RNSVG (13.8.0): - RNSVG (13.9.0):
- React-Core - React-Core
- SDWebImage (5.15.5): - SDWebImage (5.15.5):
- SDWebImage/Core (= 5.15.5) - SDWebImage/Core (= 5.15.5)
@ -504,9 +504,9 @@ PODS:
- SDWebImageWebPCoder (0.9.1): - SDWebImageWebPCoder (0.9.1):
- libwebp (~> 1.0) - libwebp (~> 1.0)
- SDWebImage/Core (~> 5.13) - SDWebImage/Core (~> 5.13)
- Sentry/HybridSDK (8.3.0): - Sentry/HybridSDK (8.4.0):
- SentryPrivate (= 8.3.0) - SentryPrivate (= 8.4.0)
- SentryPrivate (8.3.0) - SentryPrivate (8.4.0)
- Swime (3.0.6) - Swime (3.0.6)
- Yoga (1.14.0) - Yoga (1.14.0)
@ -765,13 +765,13 @@ SPEC CHECKSUMS:
EXFileSystem: 844e86ca9b5375486ecc4ef06d3838d5597d895d EXFileSystem: 844e86ca9b5375486ecc4ef06d3838d5597d895d
EXFont: 6ea3800df746be7233208d80fe379b8ed74f4272 EXFont: 6ea3800df746be7233208d80fe379b8ed74f4272
EXNotifications: dd628737af60fc8cc62dccebacd326b0fbbc0dcb EXNotifications: dd628737af60fc8cc62dccebacd326b0fbbc0dcb
Expo: 707f9b0039eacc6a1dce90c08c9e37b9c417bba2 Expo: 81418098ffb16914b2e190f54e06db923248e4a1
ExpoCrypto: 477dfe89c81527b376f2c344ca1d2a01244b243c ExpoCrypto: 9105610a09cd6290b900bd82fc5d190e489125a3
ExpoHaptics: 5156bc5160d8e04c170dd6e645a71154951a2ad9 ExpoHaptics: 5156bc5160d8e04c170dd6e645a71154951a2ad9
ExpoImage: b6a65c4aa891cdf00bfba0da46df14b27ae09cc7 ExpoImage: 09d394e082cdd18d946f10a522d566dfca019fb8
ExpoKeepAwake: 69f5f627670d62318410392d03e0b5db0f85759a ExpoKeepAwake: 69f5f627670d62318410392d03e0b5db0f85759a
ExpoLocalization: f26cd431ad9ea3533c5b08c4fabd879176a794bb ExpoLocalization: f26cd431ad9ea3533c5b08c4fabd879176a794bb
ExpoModulesCore: 397fc99e9d6c9dcc010f36d5802097c17b90424c ExpoModulesCore: 6e0259511f4c4341b6b8357db393624df2280828
ExpoStoreReview: d057dcca4b9c95f3c9db11bd2e168dab9cba59f3 ExpoStoreReview: d057dcca4b9c95f3c9db11bd2e168dab9cba59f3
ExpoVideoThumbnails: 0021303b614a89fcc5df8b59d9d37ddf14a7d4cf ExpoVideoThumbnails: 0021303b614a89fcc5df8b59d9d37ddf14a7d4cf
ExpoWebBrowser: 033d34c478d9986da2f1679729041423837626e0 ExpoWebBrowser: 033d34c478d9986da2f1679729041423837626e0
@ -779,11 +779,11 @@ SPEC CHECKSUMS:
EXScreenOrientation: 52220f8f2477ed25a37e3b2cdbbaa8635d250256 EXScreenOrientation: 52220f8f2477ed25a37e3b2cdbbaa8635d250256
EXSecureStore: e8923258361cc406d0401af380f12bd05b2b720f EXSecureStore: e8923258361cc406d0401af380f12bd05b2b720f
EXSplashScreen: cd7fb052dff5ba8311d5c2455ecbebffe1b7a8ca EXSplashScreen: cd7fb052dff5ba8311d5c2455ecbebffe1b7a8ca
FBLazyVector: 446e84642979fff0ba57f3c804c2228a473aeac2 FBLazyVector: a83ceaa8a8581003a623facdb3c44f6d4f342ac5
FBReactNativeSpec: 241709e132e3bf1526c1c4f00bc5384dd39dfba9 FBReactNativeSpec: 85eee79837cb797ab6176f0243a2b40511c09158
fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9
glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b
hermes-engine: a1f157c49ea579c28b0296bda8530e980c45bdb3 hermes-engine: b434cea529ad0152c56c7cb6486b0c4c0b23b5de
libaom: 9bb51e0f8f9192245e3ca2a1c9e4375d9cbccc52 libaom: 9bb51e0f8f9192245e3ca2a1c9e4375d9cbccc52
libavif: e242998ccec1c83bcba0bbdc256f460ad5077348 libavif: e242998ccec1c83bcba0bbdc256f460ad5077348
libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913
@ -792,60 +792,60 @@ SPEC CHECKSUMS:
MMKV: 7f34558bbb5a33b0eaefae2de4b6a20a2ffdad6f MMKV: 7f34558bbb5a33b0eaefae2de4b6a20a2ffdad6f
MMKVCore: ddf41b9d9262f058419f9ba7598719af56c02cd3 MMKVCore: ddf41b9d9262f058419f9ba7598719af56c02cd3
RCT-Folly: 424b8c9a7a0b9ab2886ffe9c3b041ef628fd4fb1 RCT-Folly: 424b8c9a7a0b9ab2886ffe9c3b041ef628fd4fb1
RCTRequired: 5a024fdf458fa8c0d82fc262e76f982d4dcdecdd RCTRequired: 5c6fd63b03abb06947d348dadac51c93e3485bd8
RCTTypeSafety: b6c253064466411c6810b45f66bc1e43ce0c54ba RCTTypeSafety: 1c66daedd66f674e39ce9f40782f0d490c78b175
React: 715292db5bd46989419445a5547954b25d2090f0 React: e11ca7cdc7aa4ddd7e6a59278b808cfe17ebbd9f
React-callinvoker: 105392d1179058585b564d35b4592fe1c46d6fba React-callinvoker: 77a82869505c96945c074b80bbdc8df919646d51
React-Codegen: b75333b93d835afce84b73472927cccaef2c9f8c React-Codegen: 9ee33090c38ab3da3c4dc029924d50fb649f0dfc
React-Core: 88838ed1724c64905fc6c0811d752828a92e395b React-Core: 44903e47b428a491f48fd0eae54caddb2ea05ebf
React-CoreModules: cd238b4bb8dc8529ccc8b34ceae7267b04ce1882 React-CoreModules: 83d989defdfc82be1f7386f84a56b6509f54ac74
React-cxxreact: 291bfab79d8098dc5ebab98f62e6bdfe81b3955a React-cxxreact: 058e7e6349649eae9cfcdec5854e702b26298932
React-hermes: b1e67e9a81c71745704950516f40ee804349641c React-hermes: ba19a405804b833c9b832c1f2061ad5038bb97f2
React-jsi: c9d5b563a6af6bb57034a82c2b0d39d0a7483bdc React-jsi: 3fe6f589c9cafbef85ed5a4be7c6dc8edfb4ab54
React-jsiexecutor: d6b7fa9260aa3cb40afee0507e3bc1d17ecaa6f2 React-jsiexecutor: 7894956638ff3e00819dd3f9f6f4a84da38f2409
React-jsinspector: 1f51e775819199d3fe9410e69ee8d4c4161c7b06 React-jsinspector: d5ce2ef3eb8fd30c28389d0bc577918c70821bd6
React-logger: 0d58569ec51d30d1792c5e86a8e3b78d24b582c6 React-logger: 9332c3e7b4ef007a0211c0a9868253aac3e1da82
react-native-blur: 50c9feabacbc5f49b61337ebc32192c6be7ec3c3 react-native-blur: 50c9feabacbc5f49b61337ebc32192c6be7ec3c3
react-native-cameraroll: f3050460fe1708378698c16686bfaa5f34099be2 react-native-cameraroll: f3050460fe1708378698c16686bfaa5f34099be2
react-native-image-picker: ec9b713e248760bfa0f879f0715391de4651a7cb react-native-image-picker: ec9b713e248760bfa0f879f0715391de4651a7cb
react-native-ios-context-menu: e529171ba760a1af7f2ef0729f5a7f4d226171c5 react-native-ios-context-menu: e529171ba760a1af7f2ef0729f5a7f4d226171c5
react-native-language-detection: f414937fa715108ab50a6269a3de0bcb95e4ceb0 react-native-language-detection: f414937fa715108ab50a6269a3de0bcb95e4ceb0
react-native-mmkv: a2a40a0458bdbc9d43c4e7752ecfc5e3a87b66dd react-native-mmkv: 7da5e18e55c04a9af9a7e0ab9792a1e8d33765a1
react-native-netinfo: 2517ad504b3d303e90d7a431b0fcaef76d207983 react-native-netinfo: 22c082970cbd99071a4e5aa7a612ac20d66b08f0
react-native-pager-view: b58cb9e9f42f64e50cab3040815772c1d119a2e2 react-native-pager-view: 0ccb8bf60e2ebd38b1f3669fa3650ecce81db2df
react-native-paste-input: 3392800944a47c00dddbff23c31c281482209679 react-native-paste-input: 3392800944a47c00dddbff23c31c281482209679
react-native-quick-base64: e657e9197e61b60a9dec49807843052b830da254 react-native-quick-base64: e657e9197e61b60a9dec49807843052b830da254
react-native-safe-area-context: 39c2d8be3328df5d437ac1700f4f3a4f75716acc react-native-safe-area-context: f5549f36508b1b7497434baa0cd97d7e470920d4
react-native-segmented-control: 06607462630512ff8eef652ec560e6235a30cc3e react-native-segmented-control: 0e4b5d93911e2234f110057df2b41738b326ab3e
React-perflogger: 0bb0522a12e058f6eb69d888bc16f40c16c4b907 React-perflogger: 43392072a5b867a504e2b4857606f8fc5a403d7f
React-RCTActionSheet: bfd675a10f06a18728ea15d82082d48f228a213a React-RCTActionSheet: c7b67c125bebeda9fb19fc7b200d85cb9d6899c4
React-RCTAnimation: 2fa220b2052ec75b733112aca39143d34546a941 React-RCTAnimation: c2de79906f607986633a7114bee44854e4c7e2f5
React-RCTAppDelegate: 8564f93c1d9274e95e3b0c746d08a87ff5a621b2 React-RCTAppDelegate: 96bc933c3228a549718a6475c4d3f9dd4bbae98d
React-RCTBlob: d0336111f46301ae8aba2e161817e451aad72dd6 React-RCTBlob: cf72446957310e7da6627a4bdaadf970d3a8f232
React-RCTImage: fec592c46edb7c12a9cde08780bdb4a688416c62 React-RCTImage: c6093f1bf3d67c0428d779b00390617d5bd90699
React-RCTLinking: 14eccac5d2a3b34b89dbfa29e8ef6219a153fe2d React-RCTLinking: 5de47e37937889d22599af4b99d0552bad1b1c3c
React-RCTNetwork: 1fbce92e772e39ca3687a2ebb854501ff6226dd7 React-RCTNetwork: e7d7077e073b08e5dd486fba3fe87ccad90a9bc4
React-RCTSettings: 1abea36c9bb16d9979df6c4b42e2ea281b4bbcc5 React-RCTSettings: 72a04921b2e8fb832da7201a60ffffff2a7c62f7
React-RCTText: 15355c41561a9f43dfd23616d0a0dd40ba05ed61 React-RCTText: 7123c70fef5367e2121fea37e65b9ad6d3747e54
React-RCTVibration: ad17efcfb2fa8f6bfd8ac0cf48d96668b8b28e0b React-RCTVibration: 73d201599a64ea14b4e0b8f91b64970979fd92e6
React-runtimeexecutor: 8fa50b38df6b992c76537993a2b0553d3b088004 React-runtimeexecutor: 8692ac548bec648fa121980ccb4304afd136d584
ReactCommon: b49a4b00ca6d181ff74b17c12b2d59ac4add0bde ReactCommon: 0c43eaeaaee231d7d8dc24fc5a6e4cf2b75bf196
RNCAsyncStorage: 8616bd5a58af409453ea4e1b246521bb76578d60 RNCAsyncStorage: 8616bd5a58af409453ea4e1b246521bb76578d60
RNCClipboard: 3f0451a8100393908bea5c5c5b16f96d45f30bfc RNCClipboard: 3f0451a8100393908bea5c5c5b16f96d45f30bfc
RNGestureHandler: 071d7a9ad81e8b83fe7663b303d132406a7d8f39 RNGestureHandler: 071d7a9ad81e8b83fe7663b303d132406a7d8f39
RNReanimated: f0dd6b881808e635ef0673f89642937d6c141314 RNReanimated: f0dd6b881808e635ef0673f89642937d6c141314
RNScreens: 218801c16a2782546d30bd2026bb625c0302d70f RNScreens: 218801c16a2782546d30bd2026bb625c0302d70f
RNSentry: 43658c8c327376e0c06149ce981899f5f84e90d9 RNSentry: 68d5b2339fc7cd864e8076279345cc90174fa583
RNShareMenu: cb9dac548c8bf147d06f0bf07296ad51ea9f5fc3 RNShareMenu: cb9dac548c8bf147d06f0bf07296ad51ea9f5fc3
RNSVG: c1e76b81c76cdcd34b4e1188852892dc280eb902 RNSVG: 53c661b76829783cdaf9b7a57258f3d3b4c28315
SDWebImage: fd7e1a22f00303e058058278639bf6196ee431fe SDWebImage: fd7e1a22f00303e058058278639bf6196ee431fe
SDWebImageAVIFCoder: d759e21cf4efb640cc97250566aa556ad8bb877c SDWebImageAVIFCoder: d759e21cf4efb640cc97250566aa556ad8bb877c
SDWebImageSVGCoder: 6fc109f9c2a82ab44510fff410b88b1a6c271ee8 SDWebImageSVGCoder: 6fc109f9c2a82ab44510fff410b88b1a6c271ee8
SDWebImageWebPCoder: 18503de6621dd2c420d680e33d46bf8e1d5169b0 SDWebImageWebPCoder: 18503de6621dd2c420d680e33d46bf8e1d5169b0
Sentry: 757565eb01e2a6ef6b26e897e4e47e8213e12f06 Sentry: 16d46dd5ca10e7f4469a2611805a3de123188add
SentryPrivate: 668d6ce46835769b32e61dc8b5c78ef0b6cdcef8 SentryPrivate: 2bb4f8d9ff558b25ac70b66c1dedc58a7c43630b
Swime: d7b2c277503b6cea317774aedc2dce05613f8b0b Swime: d7b2c277503b6cea317774aedc2dce05613f8b0b
Yoga: 79dd7410de6f8ad73a77c868d3d368843f0c93e0 Yoga: ba09b6b11e6139e3df8229238aa794205ca6a02a
PODFILE CHECKSUM: 61a84f1ad8a466fbbbf09e0f8bb3ed30b2d5e301 PODFILE CHECKSUM: 61a84f1ad8a466fbbbf09e0f8bb3ed30b2d5e301

View File

@ -0,0 +1,2 @@
"NSPhotoLibraryAddUsageDescription" = "Επιτρέψτε στο tooot να αποθηκεύει εικόνες στο ρολό της κάμερας";
"NSPhotoLibraryUsageDescription" = "Επιτρέψτε στο tooot να αποθηκεύει εικόνες στο ρολό της κάμερας";

View File

@ -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 = "<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>"; }; E633A431281EB55C000E540F /* ShareExtension-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ShareExtension-Bridging-Header.h"; sourceTree = "<group>"; };
E63E7FF0292A828100C76FD4 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/InfoPlist.strings; sourceTree = "<group>"; }; E63E7FF0292A828100C76FD4 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/InfoPlist.strings; sourceTree = "<group>"; };
E65BA25629EDEF8C008E0BBC /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/InfoPlist.strings; sourceTree = "<group>"; };
E66C0842291F095800DFFF60 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InfoPlist.strings; 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>"; }; E671BDF8290EAFB800287BD0 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
E690907B29C1133000489554 /* eu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = eu; path = eu.lproj/InfoPlist.strings; sourceTree = "<group>"; }; E690907B29C1133000489554 /* eu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = eu; path = eu.lproj/InfoPlist.strings; sourceTree = "<group>"; };
@ -308,6 +309,7 @@
be, be,
eu, eu,
pl, pl,
el,
); );
mainGroup = 83CBB9F61A601CBA00E9B192; mainGroup = 83CBB9F61A601CBA00E9B192;
productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
@ -545,6 +547,7 @@
E6179D6E29B94551001930D5 /* be */, E6179D6E29B94551001930D5 /* be */,
E690907B29C1133000489554 /* eu */, E690907B29C1133000489554 /* eu */,
E6B76A1E29C1147B00187ABB /* pl */, E6B76A1E29C1147B00187ABB /* pl */,
E65BA25629EDEF8C008E0BBC /* el */,
); );
name = InfoPlist.strings; name = InfoPlist.strings;
sourceTree = "<group>"; sourceTree = "<group>";

View File

@ -35,6 +35,7 @@
<array> <array>
<string>tooot-share</string> <string>tooot-share</string>
<string>tooot</string> <string>tooot</string>
<string>https</string>
</array> </array>
</dict> </dict>
</array> </array>

View File

@ -1,6 +1,6 @@
{ {
"name": "tooot", "name": "tooot",
"version": "4.9.2", "version": "4.9.4",
"description": "tooot for Mastodon", "description": "tooot for Mastodon",
"author": "xmflsct <me@xmflsct.com>", "author": "xmflsct <me@xmflsct.com>",
"license": "GPL-3.0-or-later", "license": "GPL-3.0-or-later",
@ -19,39 +19,39 @@
}, },
"dependencies": { "dependencies": {
"@expo/react-native-action-sheet": "^4.0.1", "@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-getcanonicallocales": "^2.1.0",
"@formatjs/intl-locale": "^3.1.1", "@formatjs/intl-locale": "^3.2.0",
"@formatjs/intl-numberformat": "^8.3.5", "@formatjs/intl-numberformat": "^8.4.0",
"@formatjs/intl-pluralrules": "^5.1.10", "@formatjs/intl-pluralrules": "^5.2.0",
"@formatjs/intl-relativetimeformat": "^11.1.10", "@formatjs/intl-relativetimeformat": "^11.2.0",
"@mattermost/react-native-paste-input": "^0.6.2", "@mattermost/react-native-paste-input": "^0.6.2",
"@neverdull-agency/expo-unlimited-secure-store": "^1.0.10", "@neverdull-agency/expo-unlimited-secure-store": "^1.0.10",
"@react-native-async-storage/async-storage": "~1.17.11", "@react-native-async-storage/async-storage": "~1.17.11",
"@react-native-camera-roll/camera-roll": "^5.3.1", "@react-native-camera-roll/camera-roll": "^5.3.1",
"@react-native-clipboard/clipboard": "^1.11.2", "@react-native-clipboard/clipboard": "^1.11.2",
"@react-native-community/blur": "^4.3.0", "@react-native-community/blur": "^4.3.0",
"@react-native-community/netinfo": "9.3.7", "@react-native-community/netinfo": "9.3.9",
"@react-native-firebase/app": "^17.3.2", "@react-native-firebase/app": "^17.4.2",
"@react-native-menu/menu": "^0.7.3", "@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/bottom-tabs": "^6.5.7",
"@react-navigation/native": "^6.1.6", "@react-navigation/native": "^6.1.6",
"@react-navigation/native-stack": "^6.9.12", "@react-navigation/native-stack": "^6.9.12",
"@react-navigation/stack": "^6.3.16", "@react-navigation/stack": "^6.3.16",
"@sentry/react-native": "5.1.1", "@sentry/react-native": "5.3.1",
"@sharcoux/slider": "^6.1.1", "@sharcoux/slider": "^6.1.1",
"@tanstack/react-query": "^4.26.1", "@tanstack/react-query": "^4.29.3",
"axios": "^1.3.4", "axios": "^1.3.5",
"diff": "^5.1.0", "diff": "^5.1.0",
"expo": "48.0.7", "expo": "48.0.11",
"expo-auth-session": "^4.0.3", "expo-auth-session": "^4.0.3",
"expo-av": "^13.2.1", "expo-av": "^13.2.1",
"expo-constants": "^14.2.1", "expo-constants": "^14.2.1",
"expo-crypto": "^12.2.1", "expo-crypto": "^12.2.2",
"expo-file-system": "^15.2.2", "expo-file-system": "^15.2.2",
"expo-haptics": "^12.2.1", "expo-haptics": "^12.2.1",
"expo-image": "^1.0.0", "expo-image": "^1.2.1",
"expo-linking": "^4.0.1", "expo-linking": "^4.0.1",
"expo-localization": "^14.1.1", "expo-localization": "^14.1.1",
"expo-notifications": "^0.18.1", "expo-notifications": "^0.18.1",
@ -62,43 +62,43 @@
"expo-store-review": "^6.2.1", "expo-store-review": "^6.2.1",
"expo-video-thumbnails": "^7.2.1", "expo-video-thumbnails": "^7.2.1",
"expo-web-browser": "~12.1.1", "expo-web-browser": "~12.1.1",
"htmlparser2": "^8.0.1", "htmlparser2": "^8.0.2",
"i18next": "^22.4.11", "i18next": "^22.4.14",
"linkify-it": "^4.0.1", "linkify-it": "^4.0.1",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-i18next": "^12.2.0", "react-i18next": "^12.2.0",
"react-intl": "^6.2.10", "react-intl": "^6.4.0",
"react-native": "^0.71.4", "react-native": "^0.71.6",
"react-native-flash-message": "^0.4.0", "react-native-flash-message": "^0.4.1",
"react-native-gesture-handler": "~2.9.0", "react-native-gesture-handler": "~2.9.0",
"react-native-image-picker": "^5.3.1", "react-native-image-picker": "^5.3.1",
"react-native-ios-context-menu": "^1.15.3", "react-native-ios-context-menu": "^1.15.3",
"react-native-language-detection": "^0.2.2", "react-native-language-detection": "^0.2.2",
"react-native-mmkv": "~2.7.0", "react-native-mmkv": "~2.8.0",
"react-native-pager-view": "^6.1.4", "react-native-pager-view": "^6.2.0",
"react-native-quick-base64": "^2.0.5", "react-native-quick-base64": "^2.0.5",
"react-native-reanimated": "^3.0.2", "react-native-reanimated": "^3.0.2",
"react-native-reanimated-zoom": "^0.3.3", "react-native-reanimated-zoom": "^0.3.3",
"react-native-safe-area-context": "^4.5.0", "react-native-safe-area-context": "^4.5.1",
"react-native-screens": "^3.20.0", "react-native-screens": "^3.20.0",
"react-native-share-menu": "^6.0.0", "react-native-share-menu": "^6.0.0",
"react-native-svg": "^13.8.0", "react-native-svg": "^13.9.0",
"react-native-swipe-list-view": "^3.2.9", "react-native-swipe-list-view": "^3.2.9",
"react-native-tab-view": "^3.5.1", "react-native-tab-view": "^3.5.1",
"rn-placeholder": "^3.0.3", "rn-placeholder": "^3.0.3",
"zeego": "^1.4.1" "zeego": "^1.4.2"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.21.3", "@babel/core": "^7.21.4",
"@babel/plugin-proposal-optional-chaining": "^7.21.0", "@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", "@expo/config": "^8.0.2",
"@types/diff": "^5.0.2", "@types/diff": "^5.0.3",
"@types/linkify-it": "^3.0.2", "@types/linkify-it": "^3.0.2",
"@types/lodash": "^4.14.191", "@types/lodash": "^4.14.194",
"@types/react": "^18.0.28", "@types/react": "^18.0.37",
"@types/react-dom": "^18.0.11", "@types/react-dom": "^18.0.11",
"@types/react-native-share-menu": "^5.0.2", "@types/react-native-share-menu": "^5.0.2",
"babel-plugin-module-resolver": "^5.0.0", "babel-plugin-module-resolver": "^5.0.0",
@ -107,13 +107,14 @@
"deprecated-react-native-prop-types": "^4.0.0", "deprecated-react-native-prop-types": "^4.0.0",
"dotenv": "^16.0.3", "dotenv": "^16.0.3",
"react-native-clean-project": "^4.0.1", "react-native-clean-project": "^4.0.1",
"typescript": "^4.9.5" "typescript": "^5.0.4"
}, },
"packageManager": "yarn@3.3.1", "packageManager": "yarn@3.3.1",
"resolutions": { "resolutions": {
"expo-av@^13.0.2": "patch:expo-av@npm%3A13.0.2#./.yarn/patches/expo-av-npm-13.0.2-7a651776f1.patch", "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", "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", "@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"
} }
} }

View File

@ -4,9 +4,10 @@ import { TabLocalStackParamList } from '@utils/navigation/navigators'
import { StyleConstants } from '@utils/styles/constants' import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager' import { useTheme } from '@utils/styles/ThemeManager'
import React, { PropsWithChildren, useState } from 'react' 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 Sparkline from './Sparkline'
import CustomText from './Text' import CustomText from './Text'
import { sumBy } from 'lodash'
export interface Props { export interface Props {
hashtag: Mastodon.Tag hashtag: Mastodon.Tag
@ -29,6 +30,8 @@ const ComponentHashtag: React.FC<PropsWithChildren & Props> = ({
const width = Dimensions.get('window').width / 4 const width = Dimensions.get('window').width / 4
const [height, setHeight] = useState<number>(0) const [height, setHeight] = useState<number>(0)
const sum = sumBy(hashtag.history, h => parseInt(h.uses))
return ( return (
<Pressable <Pressable
accessibilityRole='button' accessibilityRole='button'
@ -41,17 +44,24 @@ const ComponentHashtag: React.FC<PropsWithChildren & Props> = ({
}} }}
onPress={customOnPress || onPress} onPress={customOnPress || onPress}
> >
<CustomText <View
fontStyle='M'
style={{ style={{
flexShrink: 1, flexShrink: 1,
color: colors.primaryDefault,
paddingRight: StyleConstants.Spacing.M paddingRight: StyleConstants.Spacing.M
}} }}
numberOfLines={1}
> >
#{hashtag.name} <CustomText fontStyle='M' style={{ color: colors.primaryDefault }} numberOfLines={1}>
</CustomText> #{hashtag.name}
{sum ? (
<>
{' '}
<CustomText fontStyle='S' style={{ color: colors.secondary }}>
({sumBy(hashtag.history, h => parseInt(h.uses))})
</CustomText>
</>
) : null}
</CustomText>
</View>
{hashtag.history?.length ? ( {hashtag.history?.length ? (
<View <View
style={{ flexDirection: 'row', alignItems: 'center', alignSelf: 'stretch' }} style={{ flexDirection: 'row', alignItems: 'center', alignSelf: 'stretch' }}
@ -66,6 +76,7 @@ const ComponentHashtag: React.FC<PropsWithChildren & Props> = ({
width={width} width={width}
height={height} height={height}
margin={children ? StyleConstants.Spacing.S : undefined} margin={children ? StyleConstants.Spacing.S : undefined}
color={!sum ? colors.disabled : undefined}
/> />
{children} {children}
</View> </View>

View File

@ -22,7 +22,6 @@ import * as AuthSession from 'expo-auth-session'
import * as Crypto from 'expo-crypto' import * as Crypto from 'expo-crypto'
import { Image } from 'expo-image' import { Image } from 'expo-image'
import * as Linking from 'expo-linking' import * as Linking from 'expo-linking'
import * as WebBrowser from 'expo-web-browser'
import { debounce } from 'lodash' import { debounce } from 'lodash'
import React, { RefObject, useCallback, useState } from 'react' import React, { RefObject, useCallback, useState } from 'react'
import { Trans, useTranslation } from 'react-i18next' 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 { ScrollView } from 'react-native-gesture-handler'
import { fromByteArray } from 'react-native-quick-base64' import { fromByteArray } from 'react-native-quick-base64'
import CustomText from '../Text' import CustomText from '../Text'
import openLink from '@components/openLink'
export interface Props { export interface Props {
scrollViewRef?: RefObject<ScrollView> scrollViewRef?: RefObject<ScrollView>
@ -80,7 +80,7 @@ const ComponentInstance: React.FC<Props> = ({
clientSecret, clientSecret,
scopes: variables.scopes, scopes: variables.scopes,
redirectUri, redirectUri,
usePKCE: !['pawoo.net'].includes(domain) usePKCE: !['pawoo.net', 'mao.mastodonhub.com'].includes(domain)
}) })
await request.makeAuthUrlAsync(discovery) await request.makeAuthUrlAsync(discovery)
@ -386,20 +386,12 @@ const ComponentInstance: React.FC<Props> = ({
<CustomText <CustomText
accessible accessible
style={{ color: colors.blue }} style={{ color: colors.blue }}
onPress={async () => onPress={async () => openLink('https://tooot.app/privacy-policy')}
WebBrowser.openBrowserAsync('https://tooot.app/privacy-policy', {
...(await browserPackage())
})
}
/>, />,
<CustomText <CustomText
accessible accessible
style={{ color: colors.blue }} style={{ color: colors.blue }}
onPress={async () => onPress={async () => openLink('https://tooot.app/terms-of-service')}
WebBrowser.openBrowserAsync('https://tooot.app/terms-of-service', {
...(await browserPackage())
})
}
/> />
]} ]}
/> />

View File

@ -223,7 +223,7 @@ const ParseHTML: React.FC<Props> = ({
key={index} key={index}
style={{ lineHeight: adaptedLineheight ? adaptedLineheight / 2 : undefined }} style={{ lineHeight: adaptedLineheight ? adaptedLineheight / 2 : undefined }}
> >
{'\n'} {'\n\n'}
</Text> </Text>
) )
case 'p': case 'p':

View File

@ -8,9 +8,10 @@ export interface Props {
width: number width: number
height: number height: number
margin?: number margin?: number
color?: string
} }
const Sparkline: React.FC<Props> = ({ data, width, height, margin = 0 }) => { const Sparkline: React.FC<Props> = ({ data, width, height, margin = 0, color }) => {
const { colors } = useTheme() const { colors } = useTheme()
const dataToPoints = ({ const dataToPoints = ({
@ -70,10 +71,10 @@ const Sparkline: React.FC<Props> = ({ data, width, height, margin = 0 }) => {
return ( return (
<Svg height={height} width={width} style={{ marginRight: margin }} fill='none'> <Svg height={height} width={width} style={{ marginRight: margin }} fill='none'>
<G> <G>
<Path d={'M' + fillPoints.join(' ')} fill={colors.blue} fillOpacity={0.1} /> <Path d={'M' + fillPoints.join(' ')} fill={color || colors.blue} fillOpacity={0.1} />
<Path <Path
d={'M' + linePoints.join(' ')} d={'M' + linePoints.join(' ')}
stroke={colors.blue} stroke={color || colors.blue}
strokeWidth={1} strokeWidth={1}
strokeLinejoin='round' strokeLinejoin='round'
strokeLinecap='round' strokeLinecap='round'

View File

@ -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 TimelineActioned from '@components/Timeline/Shared/Actioned'
import TimelineActions from '@components/Timeline/Shared/Actions' import TimelineActions from '@components/Timeline/Shared/Actions'
import TimelineAttachment from '@components/Timeline/Shared/Attachment' import TimelineAttachment from '@components/Timeline/Shared/Attachment'
@ -19,9 +16,8 @@ import { usePreferencesQuery } from '@utils/queryHooks/preferences'
import { QueryKeyTimeline } from '@utils/queryHooks/timeline' import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
import { StyleConstants } from '@utils/styles/constants' import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager' import { useTheme } from '@utils/styles/ThemeManager'
import React, { Fragment, useRef, useState } from 'react' import React, { useRef, useState } from 'react'
import { Pressable, StyleProp, View, ViewStyle } from 'react-native' import { Pressable, StyleProp, View, ViewStyle } from 'react-native'
import * as ContextMenu from 'zeego/context-menu'
import StatusContext from './Shared/Context' import StatusContext from './Shared/Context'
import TimelineFeedback from './Shared/Feedback' import TimelineFeedback from './Shared/Feedback'
import TimelineFiltered, { FilteredProps, shouldFilter } from './Shared/Filtered' import TimelineFiltered, { FilteredProps, shouldFilter } from './Shared/Filtered'
@ -126,15 +122,6 @@ const TimelineDefault: React.FC<Props> = ({
</> </>
) )
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) { if (!isMyAccount) {
let filterResults: FilteredProps['filterResults'] = [] let filterResults: FilteredProps['filterResults'] = []
const [filterRevealed, setFilterRevealed] = useState(false) const [filterRevealed, setFilterRevealed] = useState(false)
@ -183,67 +170,14 @@ const TimelineDefault: React.FC<Props> = ({
<View style={mainStyle}>{main()}</View> <View style={mainStyle}>{main()}</View>
) : ( ) : (
<> <>
<ContextMenu.Root> <Pressable
<ContextMenu.Trigger> accessible={highlighted ? false : true}
<Pressable style={mainStyle}
accessible={highlighted ? false : true} disabled={highlighted}
style={mainStyle} onPress={() => navigation.push('Tab-Shared-Toot', { toot: status })}
disabled={highlighted} onLongPress={() => {}}
onPress={() => navigation.push('Tab-Shared-Toot', { toot: status })} children={main()}
onLongPress={() => {}} />
children={main()}
/>
</ContextMenu.Trigger>
<ContextMenu.Content>
{[mShare, mStatus, mInstance].map((menu, i) => (
<Fragment key={i}>
{menu.map((group, index) => (
<ContextMenu.Group key={index}>
{group.map(item => {
switch (item.type) {
case 'item':
return (
<ContextMenu.Item key={item.key} {...item.props}>
<ContextMenu.ItemTitle children={item.title} />
{item.icon ? (
<ContextMenu.ItemIcon ios={{ name: item.icon }} />
) : null}
</ContextMenu.Item>
)
case 'sub':
return (
// @ts-ignore
<ContextMenu.Sub key={item.key}>
<ContextMenu.SubTrigger
key={item.trigger.key}
{...item.trigger.props}
>
<ContextMenu.ItemTitle children={item.trigger.title} />
{item.trigger.icon ? (
<ContextMenu.ItemIcon ios={{ name: item.trigger.icon }} />
) : null}
</ContextMenu.SubTrigger>
<ContextMenu.SubContent>
{item.items.map(sub => (
<ContextMenu.Item key={sub.key} {...sub.props}>
<ContextMenu.ItemTitle children={sub.title} />
{sub.icon ? (
<ContextMenu.ItemIcon ios={{ name: sub.icon }} />
) : null}
</ContextMenu.Item>
))}
</ContextMenu.SubContent>
</ContextMenu.Sub>
)
}
})}
</ContextMenu.Group>
))}
</Fragment>
))}
</ContextMenu.Content>
</ContextMenu.Root>
<TimelineHeaderAndroid /> <TimelineHeaderAndroid />
</> </>
)} )}

View File

@ -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 TimelineActioned from '@components/Timeline/Shared/Actioned'
import TimelineActions from '@components/Timeline/Shared/Actions' import TimelineActions from '@components/Timeline/Shared/Actions'
import TimelineAttachment from '@components/Timeline/Shared/Attachment' import TimelineAttachment from '@components/Timeline/Shared/Attachment'
@ -18,9 +15,8 @@ import { usePreferencesQuery } from '@utils/queryHooks/preferences'
import { QueryKeyTimeline } from '@utils/queryHooks/timeline' import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
import { StyleConstants } from '@utils/styles/constants' import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager' import { useTheme } from '@utils/styles/ThemeManager'
import React, { Fragment, useState } from 'react' import React, { useState } from 'react'
import { Pressable, View } from 'react-native' import { Pressable, View } from 'react-native'
import * as ContextMenu from 'zeego/context-menu'
import StatusContext from './Shared/Context' import StatusContext from './Shared/Context'
import TimelineFiltered, { FilteredProps, shouldFilter } from './Shared/Filtered' import TimelineFiltered, { FilteredProps, shouldFilter } from './Shared/Filtered'
import TimelineFullConversation from './Shared/FullConversation' import TimelineFullConversation from './Shared/FullConversation'
@ -100,14 +96,6 @@ const TimelineNotifications: React.FC<Props> = ({ 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) { if (!isMyAccount) {
let filterResults: FilteredProps['filterResults'] = [] let filterResults: FilteredProps['filterResults'] = []
const [filterRevealed, setFilterRevealed] = useState(false) const [filterRevealed, setFilterRevealed] = useState(false)
@ -143,67 +131,18 @@ const TimelineNotifications: React.FC<Props> = ({ notification, queryKey }) => {
spoilerHidden spoilerHidden
}} }}
> >
<ContextMenu.Root> <Pressable
<ContextMenu.Trigger> style={{
<Pressable padding: StyleConstants.Spacing.Global.PagePadding,
style={{ backgroundColor: colors.backgroundDefault,
padding: StyleConstants.Spacing.Global.PagePadding, paddingBottom: notification.status ? 0 : StyleConstants.Spacing.Global.PagePadding
backgroundColor: colors.backgroundDefault, }}
paddingBottom: notification.status ? 0 : StyleConstants.Spacing.Global.PagePadding onPress={() =>
}} notification.status && navigation.push('Tab-Shared-Toot', { toot: notification.status })
onPress={() => }
notification.status && onLongPress={() => {}}
navigation.push('Tab-Shared-Toot', { toot: notification.status }) children={main()}
} />
onLongPress={() => {}}
children={main()}
/>
</ContextMenu.Trigger>
<ContextMenu.Content>
{[mShare, mStatus, mInstance].map((menu, i) => (
<Fragment key={i}>
{menu.map((group, index) => (
<ContextMenu.Group key={index}>
{group.map(item => {
switch (item.type) {
case 'item':
return (
<ContextMenu.Item key={item.key} {...item.props}>
<ContextMenu.ItemTitle children={item.title} />
{item.icon ? <ContextMenu.ItemIcon ios={{ name: item.icon }} /> : null}
</ContextMenu.Item>
)
case 'sub':
return (
// @ts-ignore
<ContextMenu.Sub key={item.key}>
<ContextMenu.SubTrigger key={item.trigger.key} {...item.trigger.props}>
<ContextMenu.ItemTitle children={item.trigger.title} />
{item.trigger.icon ? (
<ContextMenu.ItemIcon ios={{ name: item.trigger.icon }} />
) : null}
</ContextMenu.SubTrigger>
<ContextMenu.SubContent>
{item.items.map(sub => (
<ContextMenu.Item key={sub.key} {...sub.props}>
<ContextMenu.ItemTitle children={sub.title} />
{sub.icon ? (
<ContextMenu.ItemIcon ios={{ name: sub.icon }} />
) : null}
</ContextMenu.Item>
))}
</ContextMenu.SubContent>
</ContextMenu.Sub>
)
}
})}
</ContextMenu.Group>
))}
</Fragment>
))}
</ContextMenu.Content>
</ContextMenu.Root>
<TimelineHeaderAndroid /> <TimelineHeaderAndroid />
</StatusContext.Provider> </StatusContext.Provider>
) )

View File

@ -218,6 +218,7 @@ const TimelineRefresh: React.FC<Props> = ({
} }
isFetchingPrev.value = false isFetchingPrev.value = false
}) })
.catch(() => (isFetchingPrev.value = false))
} }
const runFetchLatest = async () => { const runFetchLatest = async () => {

View File

@ -17,130 +17,121 @@ export const CardNeodb: React.FC<Props> = ({ card }) => {
const { colors } = useTheme() const { colors } = useTheme()
const segments = Linking.parse(card.url).path?.split('/') 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 return null
const [headingLines, setHeadingLines] = useState(3)
const { data } = useNeodbQuery({ path: `${segments[0]}/${segments[1]}` }) const { data } = useNeodbQuery({ path: `${segments[0]}/${segments[1]}` })
if (!data) return null if (!data) return null
const pressableProps = { const Content = ({ heading, details }: { heading: string[]; details: string[] }) => (
style: { <Pressable
marginTop: StyleConstants.Spacing.M, style={{
backgroundColor: colors.shimmerDefault, marginTop: StyleConstants.Spacing.M,
borderRadius: StyleConstants.BorderRadius, backgroundColor: colors.shimmerDefault,
padding: StyleConstants.Spacing.S, borderRadius: StyleConstants.BorderRadius,
flexDirection: 'row' as 'row' padding: StyleConstants.Spacing.S,
}, flexDirection: '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 ? (
<GracefullyImage
sources={{ default: { uri: data.cover_image_url } }}
dimension={{
width: StyleConstants.Font.LineHeight.M * 4,
height: StyleConstants.Font.LineHeight.M * 5
}} }}
style={{ marginRight: StyleConstants.Spacing.S }} onPress={() => openLink(card.url)}
imageStyle={{ borderRadius: StyleConstants.BorderRadius / 2 }} >
dim {data.cover_image_url ? (
/> <GracefullyImage
) : null sources={{ default: { uri: data.cover_image_url } }}
const itemHeading = (value: string) => ( dimension={{
<CustomText width: StyleConstants.Font.LineHeight.M * 4,
fontStyle='S' height: StyleConstants.Font.LineHeight.M * 5
fontWeight='Bold' }}
style={{ color: colors.primaryDefault }} style={{ marginRight: StyleConstants.Spacing.S }}
numberOfLines={3} imageStyle={{ borderRadius: StyleConstants.BorderRadius / 2 }}
children={value} dim
onTextLayout={({ nativeEvent }) => setHeadingLines(nativeEvent.lines.length)} />
/> ) : null}
) <View style={{ flex: 1, gap: StyleConstants.Spacing.S, justifyContent: 'space-between' }}>
const itemDetails = (value: string) => ( <View style={{ gap: StyleConstants.Spacing.S }}>
<CustomText <CustomText
fontStyle='S' fontStyle='S'
style={{ color: colors.secondary }} fontWeight='Bold'
numberOfLines={4 - headingLines} style={{ color: colors.primaryDefault }}
children={value} numberOfLines={3}
/> onTextLayout={({ nativeEvent }) => setHeadingLines(nativeEvent.lines.length)}
children={heading.filter(d => d).join(' ')}
/>
<Rating rating={data.rating / 2} />
</View>
<CustomText
fontStyle='S'
style={{ color: colors.secondary }}
numberOfLines={4 - headingLines}
children={details.filter(d => d).join(' / ')}
/>
</View>
</Pressable>
) )
switch (segments[0]) { switch (segments[0]) {
case 'movie': case 'movie':
return ( return (
<Pressable {...pressableProps}> <Content
{itemImage} heading={[data.title, data.orig_title, data.year ? `(${data.year})` : null]}
<View {...contentProps}> details={[
{itemHeading( data.duration
[data.title, data.orig_title, data.year ? `(${data.year})` : null] ? parseInt(data.duration).toString() === data.duration
.filter(d => d) ? `${data.duration}分钟`
.join(' ') : data.duration
)} : null,
<Rating rating={data.rating / 2} /> data.area?.join(' '),
{itemDetails( data.genre?.join(' '),
[ data.director?.join(' ')
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(' / ')
)}
</View>
</Pressable>
) )
case 'book': case 'book':
return ( return (
<Pressable {...pressableProps}> <Content
{itemImage} heading={[data.title]}
<View {...contentProps}> details={[
{itemHeading(data.title)} data.author?.join(' '),
<Rating rating={data.rating / 2} /> data.pages ? `${data.pages}` : null,
{itemDetails( data.language,
[ data.pub_house
data.author?.join(' '), ]}
data.pages ? `${data.pages}` : null, />
data.language,
data.pub_house
]
.filter(d => d)
.join(' / ')
)}
</View>
</Pressable>
) )
case 'tv': case 'tv':
return ( return (
<Pressable {...pressableProps}> <Content
{itemImage} heading={[data.title, data.orig_title, data.year ? `(${data.year})` : null]}
<View {...contentProps}> details={[
{itemHeading( data.season_count ? `${data.season_count}` : null,
[data.title, data.orig_title, data.year ? `(${data.year})` : null] data.area?.join(' '),
.filter(d => d) data.genre?.join(' '),
.join(' ') data.director?.join(' ')
)} ]}
<Rating rating={data.rating / 2} /> />
{itemDetails( )
[ case 'game':
data.season_count ? `${data.season_count}` : null, return (
data.area?.join(' '), <Content
data.genre?.join(' '), heading={[data.title]}
data.director?.join(' ') details={[
] data.genre?.join(' '),
.filter(d => d) data.developer?.join(' '),
.join(' / ') data.platform?.join(' '),
)} data.release_date
</View> ]}
</Pressable> />
) )
default: default:
return null return null

View File

@ -4,6 +4,7 @@ import openLink from '@components/openLink'
import CustomText from '@components/Text' import CustomText from '@components/Text'
import { useNavigation } from '@react-navigation/native' import { useNavigation } from '@react-navigation/native'
import { StackNavigationProp } from '@react-navigation/stack' import { StackNavigationProp } from '@react-navigation/stack'
import { isDevelopment } from '@utils/helpers/checkEnvironment'
import { urlMatcher } from '@utils/helpers/urlMatcher' import { urlMatcher } from '@utils/helpers/urlMatcher'
import { TabLocalStackParamList } from '@utils/navigation/navigators' import { TabLocalStackParamList } from '@utils/navigation/navigators'
import { useAccountQuery } from '@utils/queryHooks/account' import { useAccountQuery } from '@utils/queryHooks/account'
@ -17,14 +18,19 @@ import TimelineDefault from '../../Default'
import StatusContext from '../Context' import StatusContext from '../Context'
import { CardNeodb } from './Neodb' import { CardNeodb } from './Neodb'
const CARD_URL_BLACKLISTS = ['weibo.com', 'weibo.cn']
const TimelineCard: React.FC = () => { const TimelineCard: React.FC = () => {
const { status, spoilerHidden, disableDetails, inThread } = useContext(StatusContext) const { status, spoilerHidden, disableDetails, inThread } = useContext(StatusContext)
if (!status || !status.card) return null if (!status || !status.card) return null
if (CARD_URL_BLACKLISTS.find(domain => status.card?.url.includes(`${domain}/`))) return null
const { i18n } = useTranslation() const { i18n } = useTranslation()
if ( if (
status.card.url.includes('://neodb.social/') && (status.card.url.includes('://neodb.social/') &&
i18n.language.toLowerCase().startsWith('zh-hans') i18n.language.toLowerCase().startsWith('zh-hans')) ||
isDevelopment
) { ) {
return <CardNeodb card={status.card} /> return <CardNeodb card={status.card} />
} }

View File

@ -1,4 +1,5 @@
import menuAccount from '@components/contextMenu/account' import menuAccount from '@components/contextMenu/account'
import menuInstance from '@components/contextMenu/instance'
import menuShare from '@components/contextMenu/share' import menuShare from '@components/contextMenu/share'
import menuStatus from '@components/contextMenu/status' import menuStatus from '@components/contextMenu/status'
import Icon from '@components/Icon' import Icon from '@components/Icon'
@ -17,7 +18,8 @@ import HeaderSharedReplies from './HeaderShared/Replies'
import HeaderSharedVisibility from './HeaderShared/Visibility' import HeaderSharedVisibility from './HeaderShared/Visibility'
const TimelineHeaderDefault: React.FC = () => { 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 if (!status) return null
const { colors } = useTheme() const { colors } = useTheme()
@ -37,6 +39,7 @@ const TimelineHeaderDefault: React.FC = () => {
...(status && { status }) ...(status && { status })
}) })
const mStatus = menuStatus({ status, queryKey }) const mStatus = menuStatus({ status, queryKey })
const mInstance = highlighted ? menuInstance({ status, queryKey }) : []
return ( return (
<View style={{ flex: 1, flexDirection: 'row' }}> <View style={{ flex: 1, flexDirection: 'row' }}>
@ -87,7 +90,7 @@ const TimelineHeaderDefault: React.FC = () => {
</DropdownMenu.Trigger> </DropdownMenu.Trigger>
<DropdownMenu.Content> <DropdownMenu.Content>
{[mShare, mAccount, mStatus].map((menu, i) => ( {[mShare, mAccount, mStatus, mInstance].map((menu, i) => (
<Fragment key={i}> <Fragment key={i}>
{menu.map((group, index) => ( {menu.map((group, index) => (
<DropdownMenu.Group key={index}> <DropdownMenu.Group key={index}>

View File

@ -8,6 +8,7 @@ import { QueryKeyStatus } from '@utils/queryHooks/status'
import { getGlobalStorage } from '@utils/storage/actions' import { getGlobalStorage } from '@utils/storage/actions'
import * as Linking from 'expo-linking' import * as Linking from 'expo-linking'
import * as WebBrowser from 'expo-web-browser' import * as WebBrowser from 'expo-web-browser'
import { WebBrowserPresentationStyle } from 'expo-web-browser'
const openLink = async (url: string, navigation?: any) => { const openLink = async (url: string, navigation?: any) => {
const handleNavigation = (page: 'Tab-Shared-Toot' | 'Tab-Shared-Account', options: any) => { const handleNavigation = (page: 'Tab-Shared-Toot' | 'Tab-Shared-Account', options: any) => {
@ -74,6 +75,7 @@ const openLink = async (url: string, navigation?: any) => {
default: default:
await WebBrowser.openBrowserAsync(url.trim(), { await WebBrowser.openBrowserAsync(url.trim(), {
dismissButtonStyle: 'close', dismissButtonStyle: 'close',
presentationStyle: WebBrowserPresentationStyle.AUTOMATIC,
enableBarCollapsing: true, enableBarCollapsing: true,
...(await browserPackage()) ...(await browserPackage())
}).catch(() => Linking.openURL(url.trim())) }).catch(() => Linking.openURL(url.trim()))

View File

@ -387,12 +387,12 @@
"account": { "account": {
"actions": { "actions": {
"accessibilityLabel": "Дзеянні для карыстальніка {{user}}", "accessibilityLabel": "Дзеянні для карыстальніка {{user}}",
"accessibilityHint": "" "accessibilityHint": "Вы можаце ігнараваць, блакіраваць або абагуліць гэтага карыстальніка"
}, },
"followed_by": " падпісаны на вас", "followed_by": " падпісаны на вас",
"privateNote": "", "privateNote": "",
"moved": "", "moved": "",
"created_at": "", "created_at": "Далучыўся: {{date}}",
"summary": { "summary": {
"statuses_count": "{{count}} допісаў" "statuses_count": "{{count}} допісаў"
}, },
@ -467,7 +467,7 @@
"toot": { "toot": {
"name": "Абмеркаванні", "name": "Абмеркаванні",
"remoteFetch": { "remoteFetch": {
"title": "", "title": "Змяшчае аддаленае змесціва",
"message": "" "message": ""
} }
}, },

18
src/i18n/el/index.ts Normal file
View File

@ -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')
}

View File

@ -5,6 +5,7 @@ import { initReactI18next } from 'react-i18next'
import be from './be' import be from './be'
import ca from './ca' import ca from './ca'
import de from './de' import de from './de'
import el from './el'
import en from './en' import en from './en'
import es from './es' import es from './es'
import eu from './eu' 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/be'
import '@formatjs/intl-pluralrules/locale-data/ca' import '@formatjs/intl-pluralrules/locale-data/ca'
import '@formatjs/intl-pluralrules/locale-data/de' 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/en'
import '@formatjs/intl-pluralrules/locale-data/es' import '@formatjs/intl-pluralrules/locale-data/es'
import '@formatjs/intl-pluralrules/locale-data/eu' 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/be'
import '@formatjs/intl-numberformat/locale-data/ca' import '@formatjs/intl-numberformat/locale-data/ca'
import '@formatjs/intl-numberformat/locale-data/de' 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/en'
import '@formatjs/intl-numberformat/locale-data/es' import '@formatjs/intl-numberformat/locale-data/es'
import '@formatjs/intl-numberformat/locale-data/eu' 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/be'
import '@formatjs/intl-datetimeformat/locale-data/ca' import '@formatjs/intl-datetimeformat/locale-data/ca'
import '@formatjs/intl-datetimeformat/locale-data/de' 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/en'
import '@formatjs/intl-datetimeformat/locale-data/es' import '@formatjs/intl-datetimeformat/locale-data/es'
import '@formatjs/intl-datetimeformat/locale-data/eu' 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/be'
import '@formatjs/intl-relativetimeformat/locale-data/ca' import '@formatjs/intl-relativetimeformat/locale-data/ca'
import '@formatjs/intl-relativetimeformat/locale-data/de' 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/en'
import '@formatjs/intl-relativetimeformat/locale-data/es' import '@formatjs/intl-relativetimeformat/locale-data/es'
import '@formatjs/intl-relativetimeformat/locale-data/eu' import '@formatjs/intl-relativetimeformat/locale-data/eu'
@ -120,6 +125,7 @@ i18n.use(initReactI18next).init({
be, be,
ca, ca,
de, de,
el,
en, en,
es, es,
eu, eu,

View File

@ -2,6 +2,7 @@ const LOCALES = {
be: 'Беларуская', be: 'Беларуская',
ca: 'Català', ca: 'Català',
de: 'Deutsch', de: 'Deutsch',
el: 'Ελληνικά',
en: 'English', en: 'English',
es: 'Español', es: 'Español',
eu: 'Euskara', eu: 'Euskara',

View File

@ -129,7 +129,7 @@
"muted": { "muted": {
"accessibilityLabel": "Дмух приглушений" "accessibilityLabel": "Дмух приглушений"
}, },
"replies": "", "replies": "Відповіді <0 />",
"visibility": { "visibility": {
"direct": { "direct": {
"accessibilityLabel": "Дмухнути особистим повідомленням" "accessibilityLabel": "Дмухнути особистим повідомленням"

View File

@ -9,7 +9,7 @@
"delete": "Xóa", "delete": "Xóa",
"done": "Xong", "done": "Xong",
"confirm": "Xác nhận", "confirm": "Xác nhận",
"add": "" "add": "Thêm"
}, },
"customEmoji": { "customEmoji": {
"accessibilityLabel": "Tùy chỉnh emoji {{emoji}}" "accessibilityLabel": "Tùy chỉnh emoji {{emoji}}"

View File

@ -6,7 +6,7 @@
"action_false": "Theo dõi người này", "action_false": "Theo dõi người này",
"action_true": "Ngưng 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": { "showBoosts": {
"action_false": "Hiển lượt đăng lại", "action_false": "Hiển lượt đăng lại",
"action_true": "Ẩ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" "action_true": "Bỏ ẩn người dùng"
}, },
"followAs": { "followAs": {
"trigger": "", "trigger": "Theo dõi như...",
"succeed_default": "", "succeed_default": "Đang theo dõi @{{target}} bằng @{{source}}",
"succeed_locked": "", "succeed_locked": "Đã gửi yêu cầu theo dõi tới @{{target}} bằng {{source}}, đang chờ duyệt",
"failed": "" "failed": "Theo dõi như"
}, },
"blockReport": "", "blockReport": "Chặn & Báo cáo",
"block": { "block": {
"action_false": "Chặn người này", "action_false": "Chặn người này",
"action_true": "Bỏ chặn người dùng", "action_true": "Bỏ chặn người dùng",
@ -56,11 +56,11 @@
}, },
"hashtag": { "hashtag": {
"follow": { "follow": {
"action_false": "", "action_false": "Theo dõi",
"action_true": "" "action_true": "Ngưng theo dõi"
}, },
"filter": { "filter": {
"action": "" "action": "Lọc hashtag..."
} }
}, },
"share": { "share": {
@ -99,8 +99,8 @@
"action_true": "Bỏ ghim tút" "action_true": "Bỏ ghim tút"
}, },
"filter": { "filter": {
"action_false": "", "action_false": "Lọc tút...",
"action_true": "" "action_true": "Quản lý bộ lọc..."
} }
} }
} }

View File

@ -17,10 +17,10 @@
"refresh": { "refresh": {
"fetchPreviousPage": "Trước đó", "fetchPreviousPage": "Trước đó",
"refetch": "Trang cuối", "refetch": "Trang cuối",
"fetching": "", "fetching": "Đang tải những tút mới...",
"fetched": { "fetched": {
"none": "", "none": "Đã đọc hết",
"found": "" "found": "Đã tải {{count}} tút"
} }
}, },
"shared": { "shared": {
@ -33,7 +33,7 @@
"poll": "Cuộc bình chọn đã kết thúc", "poll": "Cuộc bình chọn đã kết thúc",
"reblog": { "reblog": {
"default": "{{name}} đăng lại", "default": "{{name}} đăng lại",
"myself": "", "myself": "Bạn đăng lại",
"notification": "{{name}} đăng lại tút của bạn" "notification": "{{name}} đăng lại tút của bạn"
}, },
"update": "Đăng lại đã được sửa", "update": "Đăng lại đã được sửa",

View File

@ -11,16 +11,16 @@
"segments": { "segments": {
"federated": "Liên hợp", "federated": "Liên hợp",
"local": "Máy chủ", "local": "Máy chủ",
"explore": "" "explore": "Khám phá"
}, },
"exploring": { "exploring": {
"heading": "", "heading": "Khám phá",
"trending": "", "trending": "Xu hướng",
"followRemote": "", "followRemote": "Theo dõi máy chủ từ xa",
"noTitle": "", "noTitle": "Không tiêu đề",
"errors": { "errors": {
"existed": "", "existed": "Bạn đang theo dõi máy chủ này.",
"notAvailable": "" "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" "name": "Thông báo đẩy"
}, },
"preferences": { "preferences": {
"name": "" "name": "Tùy chọn"
}, },
"preferencesFilters": { "preferencesFilters": {
"name": "" "name": "Tất cả bộ lọc nội dung"
}, },
"preferencesFilterAdd": { "preferencesFilterAdd": {
"name": "" "name": "Tạo bộ lọc"
}, },
"preferencesFilterEdit": { "preferencesFilterEdit": {
"name": "" "name": "Sửa bộ lọc"
}, },
"profile": { "profile": {
"name": "Sửa hồ sơ" "name": "Sửa hồ sơ"
@ -146,48 +146,48 @@
}, },
"preferences": { "preferences": {
"visibility": { "visibility": {
"title": "", "title": "Kiểu đăng mặc định",
"options": { "options": {
"public": "", "public": "Công khai",
"unlisted": "", "unlisted": "Hạn chế",
"private": "" "private": "Chỉ người theo dõi"
} }
}, },
"sensitive": { "sensitive": {
"title": "" "title": "Luôn đánh dấu ảnh/video là nội dung nhạy cảm"
}, },
"media": { "media": {
"title": "", "title": "Hiển thị media",
"options": { "options": {
"default": "", "default": "Làm mờ nội dung nhạy cảm",
"show_all": "", "show_all": "Luôn hiển thị",
"hide_all": "" "hide_all": "Ẩn"
} }
}, },
"spoilers": { "spoilers": {
"title": "" "title": "Luôn hiển thị đầy đủ nội dung tút"
}, },
"autoplay_gifs": { "autoplay_gifs": {
"title": "" "title": "Tự động phát GIF"
}, },
"filters": { "filters": {
"title": "", "title": "Lọc nội dung",
"content": "" "content": "{{count}} đang dùng"
}, },
"web_only": { "web_only": {
"title": "", "title": "Cài đặt cập nhật",
"description": "" "description": "Những cài đặt bên dưới chỉ cập nhật khi dùng web UI"
} }
}, },
"preferencesFilters": { "preferencesFilters": {
"expired": "", "expired": "Đã hết hạn",
"keywords_one": "{{count}} từ khóa", "keywords_one": "{{count}} từ khóa",
"keywords_other": "{{count}} từ khóa", "keywords_other": "{{count}} từ khóa",
"statuses_one": "{{count}} tút", "statuses_one": "{{count}} tút",
"statuses_other": "{{count}} tút", "statuses_other": "{{count}} tút",
"context": "", "context": "Áp dụng sau <0 />",
"contexts": { "contexts": {
"home": "", "home": "đang theo dõi và danh sách",
"notifications": "thông báo", "notifications": "thông báo",
"public": "liên hợp", "public": "liên hợp",
"thread": "thảo luận", "thread": "thảo luận",
@ -195,33 +195,33 @@
} }
}, },
"preferencesFilter": { "preferencesFilter": {
"name": "", "name": "Tên",
"expiration": "", "expiration": "Hết hiệu lực",
"expirationOptions": { "expirationOptions": {
"0": "", "0": "Không bao giờ",
"1800": "", "1800": "Sau 30 phút",
"3600": "", "3600": "Sau 1 giờ",
"43200": "", "43200": "Sau 12 giờ",
"86400": "", "86400": "Sau 1 ngày",
"604800": "", "604800": "Sau 1 tuần",
"18144000": "" "18144000": "Sau 1 tháng"
}, },
"context": "", "context": "Áp dụng trong",
"contexts": { "contexts": {
"home": "", "home": "Đang theo dõi và danh sách",
"notifications": "", "notifications": "Thông báo",
"public": "", "public": "Liên hợp",
"thread": "", "thread": "Hội thoại",
"account": "" "account": "Xem hồ sơ"
}, },
"action": "", "action": "Khi trùng khớp",
"actions": { "actions": {
"warn": "", "warn": "Thu gọn nhưng có thể mở rộng",
"hide": "" "hide": "Ẩn hoàn toàn"
}, },
"keywords": "", "keywords": "Khớp từ khóa",
"keyword": "", "keyword": "Từ khóa",
"statuses": "" "statuses": "Tút trùng khớp"
}, },
"profile": { "profile": {
"feedback": { "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" "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", "followed_by": " đang theo dõi bạn",
"privateNote": "", "privateNote": "Cài ghi chú riêng",
"moved": "Đã chuyển đi", "moved": "Đã chuyển đi",
"created_at": "Đã tham gia {{date}}", "created_at": "Đã tham gia {{date}}",
"summary": { "summary": {
@ -411,8 +411,8 @@
"name": "<0 /><1>'s media</1>" "name": "<0 /><1>'s media</1>"
}, },
"filter": { "filter": {
"name": "", "name": "Thêm vào bộ lọc",
"existed": "" "existed": "Đã tồn tại trong bộ lọc"
}, },
"history": { "history": {
"name": "Lịch sử chỉnh sửa" "name": "Lịch sử chỉnh sửa"
@ -462,7 +462,7 @@
"statuses": "Tút" "statuses": "Tút"
}, },
"notFound": "Không tìm thấy {{type}} <bold>{{searchTerm}}</bold>", "notFound": "Không tìm thấy {{type}} <bold>{{searchTerm}}</bold>",
"noResult": "" "noResult": "Không tìm thấy, vui lòng thử cái khác"
}, },
"toot": { "toot": {
"name": "Nội dung tút", "name": "Nội dung tút",

View File

@ -11,7 +11,6 @@ import { RootStackScreenProps } from '@utils/navigation/navigators'
import { useInstanceQuery } from '@utils/queryHooks/instance' import { useInstanceQuery } from '@utils/queryHooks/instance'
import { usePreferencesQuery } from '@utils/queryHooks/preferences' import { usePreferencesQuery } from '@utils/queryHooks/preferences'
import { searchLocalStatus } from '@utils/queryHooks/search' import { searchLocalStatus } from '@utils/queryHooks/search'
import { useTimelineMutation } from '@utils/queryHooks/timeline'
import { import {
getAccountStorage, getAccountStorage,
getGlobalStorage, getGlobalStorage,
@ -220,7 +219,6 @@ const ScreenCompose: React.FC<RootStackScreenProps<'Screen-Compose'>> = ({
} }
return false return false
} }
const mutateTimeline = useTimelineMutation({ onMutate: true })
const inputProps: EmojisState['inputProps'] = [ const inputProps: EmojisState['inputProps'] = [
{ {

View File

@ -176,18 +176,14 @@ const TabMePreferencesFilter: React.FC<
...(parseInt(expiration) && { ...(parseInt(expiration) && {
expires_in: parseInt(expiration) expires_in: parseInt(expiration)
}), }),
...(keywords.filter(keyword => keyword.length).length keywords_attributes: keywords.map((keyword, index) =>
? { !!params.filter.keywords[index]
keywords_attributes: keywords ? {
.filter(keyword => keyword.length) id: params.filter.keywords[index].id,
.map(keyword => ({ keyword, whole_word: true })) ...(keyword.length ? { keyword, whole_word: true } : { _destroy: true })
} }
: params.filter.keywords.length && { : { keyword, whole_word: true }
keywords_attributes: params.filter.keywords.map(keyword => ({ )
...keyword,
_destroy: true
}))
})
} }
}) })
.then(() => { .then(() => {

View File

@ -3,11 +3,11 @@ import Icon from '@components/Icon'
import { Loading } from '@components/Loading' import { Loading } from '@components/Loading'
import { MenuContainer, MenuRow } from '@components/Menu' import { MenuContainer, MenuRow } from '@components/Menu'
import { displayMessage } from '@components/Message' import { displayMessage } from '@components/Message'
import openLink from '@components/openLink'
import CustomText from '@components/Text' import CustomText from '@components/Text'
import * as Sentry from '@sentry/react-native' import * as Sentry from '@sentry/react-native'
import apiInstance from '@utils/api/instance' import apiInstance from '@utils/api/instance'
import apiTooot, { TOOOT_API_DOMAIN } from '@utils/api/tooot' 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 { PUSH_ADMIN, PUSH_DEFAULT, setChannels } from '@utils/push/constants'
import { updateExpoToken } from '@utils/push/updateExpoToken' import { updateExpoToken } from '@utils/push/updateExpoToken'
import { useAppsQuery } from '@utils/queryHooks/apps' import { useAppsQuery } from '@utils/queryHooks/apps'
@ -18,7 +18,6 @@ import layoutAnimation from '@utils/styles/layoutAnimation'
import { useTheme } from '@utils/styles/ThemeManager' import { useTheme } from '@utils/styles/ThemeManager'
import * as Crypto from 'expo-crypto' import * as Crypto from 'expo-crypto'
import * as Notifications from 'expo-notifications' import * as Notifications from 'expo-notifications'
import * as WebBrowser from 'expo-web-browser'
import React, { useEffect, useState } from 'react' import React, { useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { AppState, Linking, Platform, ScrollView, View } from 'react-native' import { AppState, Linking, Platform, ScrollView, View } from 'react-native'
@ -271,11 +270,7 @@ const TabMePush: React.FC = () => {
<MenuRow <MenuRow
title={t('me.push.howitworks')} title={t('me.push.howitworks')}
iconBack='external-link' iconBack='external-link'
onPress={async () => onPress={async () => openLink('https://tooot.app/how-push-works')}
WebBrowser.openBrowserAsync('https://tooot.app/how-push-works', {
...(await browserPackage())
})
}
/> />
</MenuContainer> </MenuContainer>
<MenuContainer children={alerts()} /> <MenuContainer children={alerts()} />

View File

@ -1,13 +1,12 @@
import Icon from '@components/Icon' import Icon from '@components/Icon'
import { MenuContainer, MenuRow } from '@components/Menu' import { MenuContainer, MenuRow } from '@components/Menu'
import openLink from '@components/openLink'
import { useNavigation } from '@react-navigation/native' import { useNavigation } from '@react-navigation/native'
import browserPackage from '@utils/helpers/browserPackage'
import { getAccountStorage, useGlobalStorage } from '@utils/storage/actions' import { getAccountStorage, useGlobalStorage } from '@utils/storage/actions'
import { StyleConstants } from '@utils/styles/constants' import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager' import { useTheme } from '@utils/styles/ThemeManager'
import Constants from 'expo-constants' import Constants from 'expo-constants'
import * as Linking from 'expo-linking' import * as Linking from 'expo-linking'
import * as WebBrowser from 'expo-web-browser'
import React from 'react' import React from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { Platform } from 'react-native' import { Platform } from 'react-native'
@ -60,9 +59,7 @@ const SettingsTooot: React.FC = () => {
']' ']'
}) })
} else { } else {
WebBrowser.openBrowserAsync('https://social.xmflsct.com/@tooot', { openLink('https://social.xmflsct.com/@tooot')
...(await browserPackage())
})
} }
}} }}
/> />

View File

@ -37,9 +37,10 @@ const AccountInformationActions: React.FC = () => {
return ( return (
<View style={styles.base}> <View style={styles.base}>
<Button <Button
type='text' round
type='icon'
disabled={account === undefined} disabled={account === undefined}
content={t('me.stacks.profile.name')} content='edit-3'
onPress={() => navigation.navigate('Tab-Me-Profile')} onPress={() => navigation.navigate('Tab-Me-Profile')}
/> />
<Button <Button
@ -47,7 +48,7 @@ const AccountInformationActions: React.FC = () => {
type='icon' type='icon'
disabled={account === undefined} disabled={account === undefined}
content='sliders' content='sliders'
style={{ marginLeft: StyleConstants.Spacing.S }} style={{ marginLeft: StyleConstants.Spacing.M }}
onPress={() => onPress={() =>
navigation.navigate('Tab-Me-Preferences', { screen: 'Tab-Me-Preferences-Root' }) navigation.navigate('Tab-Me-Preferences', { screen: 'Tab-Me-Preferences-Root' })
} }

View File

@ -55,6 +55,9 @@ const TabSharedAccount: React.FC<TabSharedStackScreenProps<'Tab-Shared-Account'>
...(account._remote && { remote_id: account.id, remote_domain: account._remote }) ...(account._remote && { remote_id: account.id, remote_domain: account._remote })
} }
] ]
useEffect(() => {
navigation.setParams({ queryKey: queryKeyDefault })
}, [dataUpdatedAt])
const mShare = menuShare({ type: 'account', url: data?.url }) const mShare = menuShare({ type: 'account', url: data?.url })
const mAccount = menuAccount({ type: 'account', openChange: true, account: data }) const mAccount = menuAccount({ type: 'account', openChange: true, account: data })

View File

@ -123,13 +123,19 @@ const TabSharedToot: React.FC<TabSharedStackScreenProps<'Tab-Shared-Toot'>> = ({
} }
} }
const updateCounts = (
remote: Mastodon.Status
): Pick<Mastodon.Status, 'reblogs_count' | 'replies_count' | 'favourites_count'> => ({
reblogs_count: remote.reblogs_count,
replies_count: remote.replies_count,
favourites_count: remote.favourites_count
})
const match = urlMatcher(toot.url || toot.uri) const match = urlMatcher(toot.url || toot.uri)
const remoteQueryEnabled = const remoteQueryEnabled =
['public', 'unlisted'].includes(toot.visibility) && ['public', 'unlisted'].includes(toot.visibility) &&
match?.domain !== getAccountStorage.string('auth.domain') match?.domain !== getAccountStorage.string('auth.domain')
const query = useQuery<{ const query = useQuery<Mastodon.Status[]>(
pages: { body: (Mastodon.Status & { _level?: number })[] }[]
}>(
queryKey.local, queryKey.local,
async () => { async () => {
const context = await apiInstance<{ const context = await apiInstance<{
@ -143,30 +149,24 @@ const TabSharedToot: React.FC<TabSharedStackScreenProps<'Tab-Shared-Toot'>> = ({
ancestorsCache.current = [...context.ancestors] ancestorsCache.current = [...context.ancestors]
const statuses = [{ ...toot }, ...context.descendants] const statuses = [{ ...toot }, ...context.descendants]
return { return statuses.map((status, index) => {
pages: [ if (index === 0) {
{ status._level = 0
body: statuses.map((status, index) => { return status
if (index === 0) { } else {
status._level = 0 const repliedLevel: number =
return status statuses.find(s => s.id === status.in_reply_to_id)?._level || 0
} else { status._level = repliedLevel + 1
const repliedLevel: number = return status
statuses.find(s => s.id === status.in_reply_to_id)?._level || 0 }
status._level = repliedLevel + 1 })
return status
}
})
}
]
}
}, },
{ {
enabled: !toot._remote, enabled: !toot._remote,
staleTime: 0, staleTime: 0,
refetchOnMount: true, refetchOnMount: true,
onSuccess: async data => { onSuccess: async data => {
if (data.pages[0].body.length < 1) { if (data.length < 1) {
navigation.goBack() navigation.goBack()
return return
} }
@ -189,17 +189,24 @@ const TabSharedToot: React.FC<TabSharedStackScreenProps<'Tab-Shared-Toot'>> = ({
return Promise.reject('Cannot parse remote toot id') return Promise.reject('Cannot parse remote toot id')
} }
const context = await apiGeneral<{ const [remote, context] = await Promise.all([
ancestors: Mastodon.Status[] apiGeneral<Mastodon.Status>({
descendants: Mastodon.Status[] method: 'get',
}>({ domain,
method: 'get', url: `api/v1/statuses/${id}`
domain, }).then(res => res.body),
url: `api/v1/statuses/${id}/context` apiGeneral<{
}).then(res => res.body) ancestors: Mastodon.Status[]
descendants: Mastodon.Status[]
}>({
method: 'get',
domain,
url: `api/v1/statuses/${id}/context`
}).then(res => res.body)
])
if (!context?.ancestors.length && !context?.descendants.length) { if (!context?.ancestors.length && !context?.descendants.length) {
return Promise.resolve([{ ...toot }]) return Promise.resolve([{ ...toot, ...updateCounts(remote) }])
} }
if ((ancestorsCache.current?.length || 0) < context.ancestors.length) { if ((ancestorsCache.current?.length || 0) < context.ancestors.length) {
@ -213,7 +220,7 @@ const TabSharedToot: React.FC<TabSharedStackScreenProps<'Tab-Shared-Toot'>> = ({
}) })
} }
const statuses = [{ ...toot }, ...context.descendants] const statuses = [{ ...toot, ...updateCounts(remote) }, ...context.descendants]
return statuses.map((status, index) => { return statuses.map((status, index) => {
if (index === 0) { if (index === 0) {
status._level = 0 status._level = 0
@ -232,34 +239,37 @@ const TabSharedToot: React.FC<TabSharedStackScreenProps<'Tab-Shared-Toot'>> = ({
refetchOnMount: true, refetchOnMount: true,
retry: false, retry: false,
onSuccess: async data => { onSuccess: async data => {
if ((query.data?.pages[0].body.length || 0) < 1 && data.length < 1) { if ((query.data?.length || 0) < 1 && data.length < 1) {
navigation.goBack() navigation.goBack()
return return
} }
if ((query.data?.pages[0].body.length || 0) < data.length) { if ((query.data?.length || 0) < data.length) {
setHasRemoteContent(true) setHasRemoteContent(true)
queryClient.cancelQueries(queryKey.local) queryClient.cancelQueries(queryKey.local)
queryClient.setQueryData<{ pages: { body: Mastodon.Status[] }[] }>( queryClient.setQueryData<Mastodon.Status[]>(queryKey.local, old => {
queryKey.local, return data.map(remote => {
old => { const localMatch = old?.find(local => local.uri === remote.uri)
return { if (localMatch) {
pages: [ return { ...localMatch, _level: remote._level, ...updateCounts(remote) }
{ } else {
body: data.map(remote => { return appendRemote.status(remote, match!.domain)
const localMatch = old?.pages[0].body.find(local => local.uri === remote.uri)
if (localMatch) {
return { ...localMatch, _level: remote._level }
} else {
return appendRemote.status(remote, match!.domain)
}
})
}
]
} }
} })
) })
} else {
queryClient.cancelQueries(queryKey.local)
queryClient.setQueryData<Mastodon.Status[]>(queryKey.local, old => {
return old?.map(local => {
const remoteMatch = data.find(remote => remote.uri === local.uri)
if (remoteMatch) {
return { ...local, ...updateCounts(remoteMatch) }
} else {
return local
}
})
})
} }
}, },
onSettled: async () => { onSettled: async () => {
@ -275,12 +285,12 @@ const TabSharedToot: React.FC<TabSharedStackScreenProps<'Tab-Shared-Toot'>> = ({
return ( return (
<FlatList <FlatList
ref={flRef} ref={flRef}
data={query.data?.pages?.[0].body} data={query.data}
keyExtractor={(item, index) => `${item.id}_${index}`} keyExtractor={(item, index) => `${item.id}_${index}`}
renderItem={({ item, index }) => { renderItem={({ item, index }) => {
const prev = query.data?.pages[0].body[index - 1]?._level || 0 const prev = query.data?.[index - 1]?._level || 0
const curr = item._level || 0 const curr = item._level || 0
const next = query.data?.pages[0].body[index + 1]?._level || 0 const next = query.data?.[index + 1]?._level || 0
const height = heights[index] || 300 const height = heights[index] || 300
let path = '' let path = ''

View File

@ -23,6 +23,20 @@ const pushUseNavigate = (id?: Mastodon.Notification['id']) => {
params: { toot: body.status } params: { toot: body.status }
} }
}) })
return
}
if (body.type === 'follow' || body.type === 'follow_request') {
if (body.account) {
navigationRef.navigate('Screen-Tabs', {
screen: 'Tab-Notifications',
params: {
screen: 'Tab-Shared-Account',
params: { account: body.account }
}
})
return
}
} }
}) })
} }

View File

@ -8,7 +8,7 @@ const queryFunction = async ({ queryKey }: QueryFunctionContext<QueryKeyNeodb>)
apiGeneral({ apiGeneral({
method: 'get', method: 'get',
domain: 'neodb.social', domain: 'neodb.social',
url: `/api/${queryKey[1].path}` url: `api/${queryKey[1].path}`
}).then(res => res.body) }).then(res => res.body)
export const useNeodbQuery = ( export const useNeodbQuery = (

View File

@ -60,7 +60,7 @@ export const searchLocalStatus = async (
staleTime: 3600, staleTime: 3600,
cacheTime: 3600, cacheTime: 3600,
retry: false, retry: false,
...(timeout && { meta: { timeout: 1000 } }) ...(timeout && { meta: { timeout: 1500 } })
}) })
.then(res => .then(res =>
res.statuses[0]?.uri === uri || res.statuses[0]?.url === uri res.statuses[0]?.uri === uri || res.statuses[0]?.url === uri
@ -79,7 +79,7 @@ export const searchLocalAccount = async (
staleTime: 3600, staleTime: 3600,
cacheTime: 3600, cacheTime: 3600,
retry: false, retry: false,
...(timeout && { meta: { timeout: 1000 } }) ...(timeout && { meta: { timeout: 1500 } })
}) })
.then(res => (res.accounts[0].url === url ? res.accounts[0] : Promise.reject())) .then(res => (res.accounts[0].url === url ? res.accounts[0] : Promise.reject()))
} }

View File

@ -60,6 +60,7 @@ const determineTheme = (
const determineDarkTheme = DarkTheme[darkTheme || 'lighter'] const determineDarkTheme = DarkTheme[darkTheme || 'lighter']
switch (userTheme) { switch (userTheme) {
case 'auto': case 'auto':
default:
switch (osTheme) { switch (osTheme) {
case 'dark': case 'dark':
return determineDarkTheme return determineDarkTheme
@ -70,8 +71,6 @@ const determineTheme = (
return 'light' return 'light'
case 'dark': case 'dark':
return determineDarkTheme return determineDarkTheme
default:
return determineDarkTheme
} }
} }

1135
yarn.lock

File diff suppressed because it is too large Load Diff