mirror of https://github.com/tooot-app/app
commit
a158fa93d8
|
@ -5,7 +5,7 @@
|
||||||
* A new app store version has to be submitted.
|
* A new app store version has to be submitted.
|
||||||
* Outdated versions in principle do not receive further OTA updates.
|
* Outdated versions in principle do not receive further OTA updates.
|
||||||
|
|
||||||
## Minor releases - App Store and OTA
|
## Minor releases - App Store
|
||||||
|
|
||||||
"Minor releases" are artifacts published as `?.y.?`:
|
"Minor releases" are artifacts published as `?.y.?`:
|
||||||
* An artifact can be released as `?.y.?` when there is no change nor update made to the native modules.
|
* An artifact can be released as `?.y.?` when there is no change nor update made to the native modules.
|
||||||
|
@ -21,11 +21,12 @@
|
||||||
|
|
||||||
## OTA release channels
|
## OTA release channels
|
||||||
|
|
||||||
* `MAJOR-environment`. Environments include `release`, `candidate` and `development`.
|
* `MAJOR.MINOR-environment`. Environments include `release`, `candidate` and `development`.
|
||||||
|
|
||||||
## Major versions mapping to native module versions
|
## Major versions mapping to native module versions
|
||||||
|
|
||||||
| Major version | Native module version | Expo version |
|
| Version | Native module version | Expo version |
|
||||||
| :-----------: | :-------------------: | :----------: |
|
| :------:| :-------------------: | :----------: |
|
||||||
| `0` | `210201` | `40.0.0` |
|
| `0-` | `210201` | `40.0.0` |
|
||||||
| `1` | `210317` | `40.0.0` |
|
| `1-` | `210317` | `40.0.0` |
|
||||||
|
| `2.2` | `210916` | `41.0.0` |
|
|
@ -8,7 +8,7 @@ ensure_env_vars(
|
||||||
VERSIONS = read_json( json_path: "./package.json" )[:versions]
|
VERSIONS = read_json( json_path: "./package.json" )[:versions]
|
||||||
ENVIRONMENT = ENV["ENVIRONMENT"]
|
ENVIRONMENT = ENV["ENVIRONMENT"]
|
||||||
VERSION = "#{VERSIONS[:major]}.#{VERSIONS[:minor]}"
|
VERSION = "#{VERSIONS[:major]}.#{VERSIONS[:minor]}"
|
||||||
RELEASE_CHANNEL = "#{VERSIONS[:major]}-#{ENVIRONMENT}"
|
RELEASE_CHANNEL = "#{VERSIONS[:major]}.#{VERSIONS[:minor]}-#{ENVIRONMENT}"
|
||||||
BUILD_NUMBER = "#{Time.now.strftime("%y%m%d")}#{ENV["GITHUB_RUN_NUMBER"]}"
|
BUILD_NUMBER = "#{Time.now.strftime("%y%m%d")}#{ENV["GITHUB_RUN_NUMBER"]}"
|
||||||
GITHUB_REPO = "tooot-app/app"
|
GITHUB_REPO = "tooot-app/app"
|
||||||
case ENVIRONMENT
|
case ENVIRONMENT
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
// File.swift
|
// File.swift
|
||||||
// tooot
|
// tooot
|
||||||
//
|
//
|
||||||
// Created by Zheng Zhiyuan (SEBD) on 2021-03-15.
|
// Created by Zhiyuan Zheng on 2021-08-22.
|
||||||
//
|
//
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
727
ios/Podfile.lock
727
ios/Podfile.lock
|
@ -1,85 +1,96 @@
|
||||||
PODS:
|
PODS:
|
||||||
- boost-for-react-native (1.63.0)
|
- boost-for-react-native (1.63.0)
|
||||||
- DoubleConversion (1.1.6)
|
- DoubleConversion (1.1.6)
|
||||||
- EXApplication (3.1.2):
|
- EXApplication (3.2.0):
|
||||||
- UMCore
|
- UMCore
|
||||||
- EXAV (9.1.2):
|
- EXAV (9.2.3):
|
||||||
|
- ExpoModulesCore
|
||||||
- UMCore
|
- UMCore
|
||||||
- UMFileSystemInterface
|
- EXConstants (11.0.2):
|
||||||
- UMPermissionsInterface
|
- ExpoModulesCore
|
||||||
- EXConstants (10.1.3):
|
|
||||||
- UMConstantsInterface
|
|
||||||
- UMCore
|
- UMCore
|
||||||
- EXCrypto (9.1.0):
|
- EXCrypto (9.2.0):
|
||||||
- UMCore
|
- UMCore
|
||||||
- EXDevice (2.4.0):
|
- EXDevice (3.3.0):
|
||||||
- UMCore
|
- UMCore
|
||||||
- EXErrorRecovery (2.1.0):
|
- EXErrorRecovery (2.2.0):
|
||||||
- UMCore
|
- UMCore
|
||||||
- EXFileSystem (11.0.2):
|
- EXFileSystem (11.1.3):
|
||||||
|
- ExpoModulesCore
|
||||||
- UMCore
|
- UMCore
|
||||||
- UMFileSystemInterface
|
- EXFirebaseAnalytics (4.1.0):
|
||||||
- EXFirebaseAnalytics (4.0.2):
|
|
||||||
- EXFirebaseCore
|
- EXFirebaseCore
|
||||||
- Firebase/Core (= 7.7.0)
|
- Firebase/Core (= 7.7.0)
|
||||||
- UMCore
|
- UMCore
|
||||||
- EXFirebaseCore (3.0.0):
|
- EXFirebaseCore (3.1.0):
|
||||||
- Firebase/Core (= 7.7.0)
|
- Firebase/Core (= 7.7.0)
|
||||||
- UMCore
|
- UMCore
|
||||||
- EXFont (9.1.0):
|
- EXFont (9.2.1):
|
||||||
|
- ExpoModulesCore
|
||||||
- UMCore
|
- UMCore
|
||||||
- UMFontInterface
|
- EXHaptics (10.1.0):
|
||||||
- EXHaptics (10.0.0):
|
|
||||||
- UMCore
|
- UMCore
|
||||||
- EXImageLoader (2.1.1):
|
- EXImageLoader (2.2.0):
|
||||||
|
- ExpoModulesCore
|
||||||
- React-Core
|
- React-Core
|
||||||
- UMCore
|
- UMCore
|
||||||
- UMImageLoaderInterface
|
- EXImageManipulator (9.2.2):
|
||||||
- EXImageManipulator (9.1.0):
|
- ExpoModulesCore
|
||||||
- UMCore
|
- UMCore
|
||||||
- UMFileSystemInterface
|
- EXImagePicker (10.2.3):
|
||||||
- UMImageLoaderInterface
|
- ExpoModulesCore
|
||||||
- EXImagePicker (10.1.4):
|
|
||||||
- UMCore
|
- UMCore
|
||||||
- UMFileSystemInterface
|
- EXKeepAwake (9.2.0):
|
||||||
- UMPermissionsInterface
|
|
||||||
- EXKeepAwake (9.1.2):
|
|
||||||
- UMCore
|
- UMCore
|
||||||
- EXLocalization (10.1.0):
|
- EXLocalization (10.2.0):
|
||||||
- UMCore
|
- UMCore
|
||||||
- EXNotifications (0.11.6):
|
- EXNotifications (0.12.3):
|
||||||
|
- ExpoModulesCore
|
||||||
- UMCore
|
- UMCore
|
||||||
- UMPermissionsInterface
|
- EXPermissions (12.1.1):
|
||||||
- EXPermissions (12.0.1):
|
- ExpoModulesCore
|
||||||
- UMCore
|
- UMCore
|
||||||
- UMPermissionsInterface
|
- ExpoModulesCore (0.2.0):
|
||||||
- EXRandom (11.1.2):
|
- ExpoModulesCore/Core (= 0.2.0)
|
||||||
|
- ExpoModulesCore/Interfaces (= 0.2.0)
|
||||||
|
- UMCore
|
||||||
|
- ExpoModulesCore/Core (0.2.0):
|
||||||
|
- UMCore
|
||||||
|
- ExpoModulesCore/Interfaces (0.2.0):
|
||||||
|
- ExpoModulesCore/Core
|
||||||
|
- UMCore
|
||||||
|
- EXRandom (11.2.0):
|
||||||
- React-Core
|
- React-Core
|
||||||
- EXScreenCapture (3.1.0):
|
- EXScreenCapture (3.2.0):
|
||||||
- UMCore
|
- UMCore
|
||||||
- EXSecureStore (10.1.0):
|
- EXSecureStore (10.2.0):
|
||||||
- UMCore
|
- UMCore
|
||||||
- EXSplashScreen (0.10.2):
|
- EXSplashScreen (0.11.4):
|
||||||
- React-Core
|
- React-Core
|
||||||
- UMCore
|
- UMCore
|
||||||
- EXStoreReview (4.0.2):
|
- EXStoreReview (4.1.0):
|
||||||
- UMCore
|
- UMCore
|
||||||
- EXUpdates (0.3.5):
|
- EXStructuredHeaders (1.1.1):
|
||||||
- React
|
|
||||||
- UMCore
|
- UMCore
|
||||||
- EXVideoThumbnails (5.1.0):
|
- EXUpdates (0.8.5):
|
||||||
|
- EXStructuredHeaders
|
||||||
|
- EXUpdatesInterface
|
||||||
|
- React-Core
|
||||||
- UMCore
|
- UMCore
|
||||||
- UMFileSystemInterface
|
- EXUpdatesInterface (0.2.2)
|
||||||
- EXWebBrowser (9.1.0):
|
- EXVideoThumbnails (5.2.1):
|
||||||
|
- ExpoModulesCore
|
||||||
- UMCore
|
- UMCore
|
||||||
- FBLazyVector (0.64.1)
|
- EXWebBrowser (9.2.0):
|
||||||
- FBReactNativeSpec (0.64.1):
|
- UMCore
|
||||||
|
- FBLazyVector (0.64.2)
|
||||||
|
- FBReactNativeSpec (0.64.2):
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2020.01.13.00)
|
||||||
- RCTRequired (= 0.64.1)
|
- RCTRequired (= 0.64.2)
|
||||||
- RCTTypeSafety (= 0.64.1)
|
- RCTTypeSafety (= 0.64.2)
|
||||||
- React-Core (= 0.64.1)
|
- React-Core (= 0.64.2)
|
||||||
- React-jsi (= 0.64.1)
|
- React-jsi (= 0.64.2)
|
||||||
- ReactCommon/turbomodule/core (= 0.64.1)
|
- ReactCommon/turbomodule/core (= 0.64.2)
|
||||||
- Firebase/Core (7.7.0):
|
- Firebase/Core (7.7.0):
|
||||||
- Firebase/CoreOnly
|
- Firebase/CoreOnly
|
||||||
- FirebaseAnalytics (= 7.7.0)
|
- FirebaseAnalytics (= 7.7.0)
|
||||||
|
@ -119,24 +130,24 @@ PODS:
|
||||||
- GoogleUtilities/Environment (~> 7.2)
|
- GoogleUtilities/Environment (~> 7.2)
|
||||||
- nanopb (~> 2.30907.0)
|
- nanopb (~> 2.30907.0)
|
||||||
- PromisesObjC (~> 1.2)
|
- PromisesObjC (~> 1.2)
|
||||||
- GoogleUtilities/AppDelegateSwizzler (7.4.1):
|
- GoogleUtilities/AppDelegateSwizzler (7.5.1):
|
||||||
- GoogleUtilities/Environment
|
- GoogleUtilities/Environment
|
||||||
- GoogleUtilities/Logger
|
- GoogleUtilities/Logger
|
||||||
- GoogleUtilities/Network
|
- GoogleUtilities/Network
|
||||||
- GoogleUtilities/Environment (7.4.1):
|
- GoogleUtilities/Environment (7.5.1):
|
||||||
- PromisesObjC (~> 1.2)
|
- PromisesObjC (< 3.0, >= 1.2)
|
||||||
- GoogleUtilities/Logger (7.4.1):
|
- GoogleUtilities/Logger (7.5.1):
|
||||||
- GoogleUtilities/Environment
|
- GoogleUtilities/Environment
|
||||||
- GoogleUtilities/MethodSwizzler (7.4.1):
|
- GoogleUtilities/MethodSwizzler (7.5.1):
|
||||||
- GoogleUtilities/Logger
|
- GoogleUtilities/Logger
|
||||||
- GoogleUtilities/Network (7.4.1):
|
- GoogleUtilities/Network (7.5.1):
|
||||||
- GoogleUtilities/Logger
|
- GoogleUtilities/Logger
|
||||||
- "GoogleUtilities/NSData+zlib"
|
- "GoogleUtilities/NSData+zlib"
|
||||||
- GoogleUtilities/Reachability
|
- GoogleUtilities/Reachability
|
||||||
- "GoogleUtilities/NSData+zlib (7.4.1)"
|
- "GoogleUtilities/NSData+zlib (7.5.1)"
|
||||||
- GoogleUtilities/Reachability (7.4.1):
|
- GoogleUtilities/Reachability (7.5.1):
|
||||||
- GoogleUtilities/Logger
|
- GoogleUtilities/Logger
|
||||||
- GoogleUtilities/UserDefaults (7.4.1):
|
- GoogleUtilities/UserDefaults (7.5.1):
|
||||||
- GoogleUtilities/Logger
|
- GoogleUtilities/Logger
|
||||||
- hermes-engine (0.7.2)
|
- hermes-engine (0.7.2)
|
||||||
- libevent (2.1.12)
|
- libevent (2.1.12)
|
||||||
|
@ -169,289 +180,287 @@ PODS:
|
||||||
- DoubleConversion
|
- DoubleConversion
|
||||||
- glog
|
- glog
|
||||||
- libevent
|
- libevent
|
||||||
- RCTRequired (0.64.1)
|
- RCTRequired (0.64.2)
|
||||||
- RCTTypeSafety (0.64.1):
|
- RCTTypeSafety (0.64.2):
|
||||||
- FBLazyVector (= 0.64.1)
|
- FBLazyVector (= 0.64.2)
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2020.01.13.00)
|
||||||
- RCTRequired (= 0.64.1)
|
- RCTRequired (= 0.64.2)
|
||||||
- React-Core (= 0.64.1)
|
- React-Core (= 0.64.2)
|
||||||
- React (0.64.1):
|
- React (0.64.2):
|
||||||
- React-Core (= 0.64.1)
|
- React-Core (= 0.64.2)
|
||||||
- React-Core/DevSupport (= 0.64.1)
|
- React-Core/DevSupport (= 0.64.2)
|
||||||
- React-Core/RCTWebSocket (= 0.64.1)
|
- React-Core/RCTWebSocket (= 0.64.2)
|
||||||
- React-RCTActionSheet (= 0.64.1)
|
- React-RCTActionSheet (= 0.64.2)
|
||||||
- React-RCTAnimation (= 0.64.1)
|
- React-RCTAnimation (= 0.64.2)
|
||||||
- React-RCTBlob (= 0.64.1)
|
- React-RCTBlob (= 0.64.2)
|
||||||
- React-RCTImage (= 0.64.1)
|
- React-RCTImage (= 0.64.2)
|
||||||
- React-RCTLinking (= 0.64.1)
|
- React-RCTLinking (= 0.64.2)
|
||||||
- React-RCTNetwork (= 0.64.1)
|
- React-RCTNetwork (= 0.64.2)
|
||||||
- React-RCTSettings (= 0.64.1)
|
- React-RCTSettings (= 0.64.2)
|
||||||
- React-RCTText (= 0.64.1)
|
- React-RCTText (= 0.64.2)
|
||||||
- React-RCTVibration (= 0.64.1)
|
- React-RCTVibration (= 0.64.2)
|
||||||
- React-callinvoker (0.64.1)
|
- React-callinvoker (0.64.2)
|
||||||
- React-Core (0.64.1):
|
- React-Core (0.64.2):
|
||||||
- glog
|
- glog
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2020.01.13.00)
|
||||||
- React-Core/Default (= 0.64.1)
|
- React-Core/Default (= 0.64.2)
|
||||||
- React-cxxreact (= 0.64.1)
|
- React-cxxreact (= 0.64.2)
|
||||||
- React-jsi (= 0.64.1)
|
- React-jsi (= 0.64.2)
|
||||||
- React-jsiexecutor (= 0.64.1)
|
- React-jsiexecutor (= 0.64.2)
|
||||||
- React-perflogger (= 0.64.1)
|
- React-perflogger (= 0.64.2)
|
||||||
- Yoga
|
- Yoga
|
||||||
- React-Core/CoreModulesHeaders (0.64.1):
|
- React-Core/CoreModulesHeaders (0.64.2):
|
||||||
- glog
|
- glog
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2020.01.13.00)
|
||||||
- React-Core/Default
|
- React-Core/Default
|
||||||
- React-cxxreact (= 0.64.1)
|
- React-cxxreact (= 0.64.2)
|
||||||
- React-jsi (= 0.64.1)
|
- React-jsi (= 0.64.2)
|
||||||
- React-jsiexecutor (= 0.64.1)
|
- React-jsiexecutor (= 0.64.2)
|
||||||
- React-perflogger (= 0.64.1)
|
- React-perflogger (= 0.64.2)
|
||||||
- Yoga
|
- Yoga
|
||||||
- React-Core/Default (0.64.1):
|
- React-Core/Default (0.64.2):
|
||||||
- glog
|
- glog
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2020.01.13.00)
|
||||||
- React-cxxreact (= 0.64.1)
|
- React-cxxreact (= 0.64.2)
|
||||||
- React-jsi (= 0.64.1)
|
- React-jsi (= 0.64.2)
|
||||||
- React-jsiexecutor (= 0.64.1)
|
- React-jsiexecutor (= 0.64.2)
|
||||||
- React-perflogger (= 0.64.1)
|
- React-perflogger (= 0.64.2)
|
||||||
- Yoga
|
- Yoga
|
||||||
- React-Core/DevSupport (0.64.1):
|
- React-Core/DevSupport (0.64.2):
|
||||||
- glog
|
- glog
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2020.01.13.00)
|
||||||
- React-Core/Default (= 0.64.1)
|
- React-Core/Default (= 0.64.2)
|
||||||
- React-Core/RCTWebSocket (= 0.64.1)
|
- React-Core/RCTWebSocket (= 0.64.2)
|
||||||
- React-cxxreact (= 0.64.1)
|
- React-cxxreact (= 0.64.2)
|
||||||
- React-jsi (= 0.64.1)
|
- React-jsi (= 0.64.2)
|
||||||
- React-jsiexecutor (= 0.64.1)
|
- React-jsiexecutor (= 0.64.2)
|
||||||
- React-jsinspector (= 0.64.1)
|
- React-jsinspector (= 0.64.2)
|
||||||
- React-perflogger (= 0.64.1)
|
- React-perflogger (= 0.64.2)
|
||||||
- Yoga
|
- Yoga
|
||||||
- React-Core/Hermes (0.64.1):
|
- React-Core/Hermes (0.64.2):
|
||||||
- glog
|
- glog
|
||||||
- hermes-engine
|
- hermes-engine
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2020.01.13.00)
|
||||||
- RCT-Folly/Futures
|
- RCT-Folly/Futures
|
||||||
- React-cxxreact (= 0.64.1)
|
- React-cxxreact (= 0.64.2)
|
||||||
- React-jsi (= 0.64.1)
|
- React-jsi (= 0.64.2)
|
||||||
- React-jsiexecutor (= 0.64.1)
|
- React-jsiexecutor (= 0.64.2)
|
||||||
- React-perflogger (= 0.64.1)
|
- React-perflogger (= 0.64.2)
|
||||||
- Yoga
|
- Yoga
|
||||||
- React-Core/RCTActionSheetHeaders (0.64.1):
|
- React-Core/RCTActionSheetHeaders (0.64.2):
|
||||||
- glog
|
- glog
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2020.01.13.00)
|
||||||
- React-Core/Default
|
- React-Core/Default
|
||||||
- React-cxxreact (= 0.64.1)
|
- React-cxxreact (= 0.64.2)
|
||||||
- React-jsi (= 0.64.1)
|
- React-jsi (= 0.64.2)
|
||||||
- React-jsiexecutor (= 0.64.1)
|
- React-jsiexecutor (= 0.64.2)
|
||||||
- React-perflogger (= 0.64.1)
|
- React-perflogger (= 0.64.2)
|
||||||
- Yoga
|
- Yoga
|
||||||
- React-Core/RCTAnimationHeaders (0.64.1):
|
- React-Core/RCTAnimationHeaders (0.64.2):
|
||||||
- glog
|
- glog
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2020.01.13.00)
|
||||||
- React-Core/Default
|
- React-Core/Default
|
||||||
- React-cxxreact (= 0.64.1)
|
- React-cxxreact (= 0.64.2)
|
||||||
- React-jsi (= 0.64.1)
|
- React-jsi (= 0.64.2)
|
||||||
- React-jsiexecutor (= 0.64.1)
|
- React-jsiexecutor (= 0.64.2)
|
||||||
- React-perflogger (= 0.64.1)
|
- React-perflogger (= 0.64.2)
|
||||||
- Yoga
|
- Yoga
|
||||||
- React-Core/RCTBlobHeaders (0.64.1):
|
- React-Core/RCTBlobHeaders (0.64.2):
|
||||||
- glog
|
- glog
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2020.01.13.00)
|
||||||
- React-Core/Default
|
- React-Core/Default
|
||||||
- React-cxxreact (= 0.64.1)
|
- React-cxxreact (= 0.64.2)
|
||||||
- React-jsi (= 0.64.1)
|
- React-jsi (= 0.64.2)
|
||||||
- React-jsiexecutor (= 0.64.1)
|
- React-jsiexecutor (= 0.64.2)
|
||||||
- React-perflogger (= 0.64.1)
|
- React-perflogger (= 0.64.2)
|
||||||
- Yoga
|
- Yoga
|
||||||
- React-Core/RCTImageHeaders (0.64.1):
|
- React-Core/RCTImageHeaders (0.64.2):
|
||||||
- glog
|
- glog
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2020.01.13.00)
|
||||||
- React-Core/Default
|
- React-Core/Default
|
||||||
- React-cxxreact (= 0.64.1)
|
- React-cxxreact (= 0.64.2)
|
||||||
- React-jsi (= 0.64.1)
|
- React-jsi (= 0.64.2)
|
||||||
- React-jsiexecutor (= 0.64.1)
|
- React-jsiexecutor (= 0.64.2)
|
||||||
- React-perflogger (= 0.64.1)
|
- React-perflogger (= 0.64.2)
|
||||||
- Yoga
|
- Yoga
|
||||||
- React-Core/RCTLinkingHeaders (0.64.1):
|
- React-Core/RCTLinkingHeaders (0.64.2):
|
||||||
- glog
|
- glog
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2020.01.13.00)
|
||||||
- React-Core/Default
|
- React-Core/Default
|
||||||
- React-cxxreact (= 0.64.1)
|
- React-cxxreact (= 0.64.2)
|
||||||
- React-jsi (= 0.64.1)
|
- React-jsi (= 0.64.2)
|
||||||
- React-jsiexecutor (= 0.64.1)
|
- React-jsiexecutor (= 0.64.2)
|
||||||
- React-perflogger (= 0.64.1)
|
- React-perflogger (= 0.64.2)
|
||||||
- Yoga
|
- Yoga
|
||||||
- React-Core/RCTNetworkHeaders (0.64.1):
|
- React-Core/RCTNetworkHeaders (0.64.2):
|
||||||
- glog
|
- glog
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2020.01.13.00)
|
||||||
- React-Core/Default
|
- React-Core/Default
|
||||||
- React-cxxreact (= 0.64.1)
|
- React-cxxreact (= 0.64.2)
|
||||||
- React-jsi (= 0.64.1)
|
- React-jsi (= 0.64.2)
|
||||||
- React-jsiexecutor (= 0.64.1)
|
- React-jsiexecutor (= 0.64.2)
|
||||||
- React-perflogger (= 0.64.1)
|
- React-perflogger (= 0.64.2)
|
||||||
- Yoga
|
- Yoga
|
||||||
- React-Core/RCTSettingsHeaders (0.64.1):
|
- React-Core/RCTSettingsHeaders (0.64.2):
|
||||||
- glog
|
- glog
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2020.01.13.00)
|
||||||
- React-Core/Default
|
- React-Core/Default
|
||||||
- React-cxxreact (= 0.64.1)
|
- React-cxxreact (= 0.64.2)
|
||||||
- React-jsi (= 0.64.1)
|
- React-jsi (= 0.64.2)
|
||||||
- React-jsiexecutor (= 0.64.1)
|
- React-jsiexecutor (= 0.64.2)
|
||||||
- React-perflogger (= 0.64.1)
|
- React-perflogger (= 0.64.2)
|
||||||
- Yoga
|
- Yoga
|
||||||
- React-Core/RCTTextHeaders (0.64.1):
|
- React-Core/RCTTextHeaders (0.64.2):
|
||||||
- glog
|
- glog
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2020.01.13.00)
|
||||||
- React-Core/Default
|
- React-Core/Default
|
||||||
- React-cxxreact (= 0.64.1)
|
- React-cxxreact (= 0.64.2)
|
||||||
- React-jsi (= 0.64.1)
|
- React-jsi (= 0.64.2)
|
||||||
- React-jsiexecutor (= 0.64.1)
|
- React-jsiexecutor (= 0.64.2)
|
||||||
- React-perflogger (= 0.64.1)
|
- React-perflogger (= 0.64.2)
|
||||||
- Yoga
|
- Yoga
|
||||||
- React-Core/RCTVibrationHeaders (0.64.1):
|
- React-Core/RCTVibrationHeaders (0.64.2):
|
||||||
- glog
|
- glog
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2020.01.13.00)
|
||||||
- React-Core/Default
|
- React-Core/Default
|
||||||
- React-cxxreact (= 0.64.1)
|
- React-cxxreact (= 0.64.2)
|
||||||
- React-jsi (= 0.64.1)
|
- React-jsi (= 0.64.2)
|
||||||
- React-jsiexecutor (= 0.64.1)
|
- React-jsiexecutor (= 0.64.2)
|
||||||
- React-perflogger (= 0.64.1)
|
- React-perflogger (= 0.64.2)
|
||||||
- Yoga
|
- Yoga
|
||||||
- React-Core/RCTWebSocket (0.64.1):
|
- React-Core/RCTWebSocket (0.64.2):
|
||||||
- glog
|
- glog
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2020.01.13.00)
|
||||||
- React-Core/Default (= 0.64.1)
|
- React-Core/Default (= 0.64.2)
|
||||||
- React-cxxreact (= 0.64.1)
|
- React-cxxreact (= 0.64.2)
|
||||||
- React-jsi (= 0.64.1)
|
- React-jsi (= 0.64.2)
|
||||||
- React-jsiexecutor (= 0.64.1)
|
- React-jsiexecutor (= 0.64.2)
|
||||||
- React-perflogger (= 0.64.1)
|
- React-perflogger (= 0.64.2)
|
||||||
- Yoga
|
- Yoga
|
||||||
- React-CoreModules (0.64.1):
|
- React-CoreModules (0.64.2):
|
||||||
- FBReactNativeSpec (= 0.64.1)
|
- FBReactNativeSpec (= 0.64.2)
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2020.01.13.00)
|
||||||
- RCTTypeSafety (= 0.64.1)
|
- RCTTypeSafety (= 0.64.2)
|
||||||
- React-Core/CoreModulesHeaders (= 0.64.1)
|
- React-Core/CoreModulesHeaders (= 0.64.2)
|
||||||
- React-jsi (= 0.64.1)
|
- React-jsi (= 0.64.2)
|
||||||
- React-RCTImage (= 0.64.1)
|
- React-RCTImage (= 0.64.2)
|
||||||
- ReactCommon/turbomodule/core (= 0.64.1)
|
- ReactCommon/turbomodule/core (= 0.64.2)
|
||||||
- React-cxxreact (0.64.1):
|
- React-cxxreact (0.64.2):
|
||||||
- boost-for-react-native (= 1.63.0)
|
- boost-for-react-native (= 1.63.0)
|
||||||
- DoubleConversion
|
- DoubleConversion
|
||||||
- glog
|
- glog
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2020.01.13.00)
|
||||||
- React-callinvoker (= 0.64.1)
|
- React-callinvoker (= 0.64.2)
|
||||||
- React-jsi (= 0.64.1)
|
- React-jsi (= 0.64.2)
|
||||||
- React-jsinspector (= 0.64.1)
|
- React-jsinspector (= 0.64.2)
|
||||||
- React-perflogger (= 0.64.1)
|
- React-perflogger (= 0.64.2)
|
||||||
- React-runtimeexecutor (= 0.64.1)
|
- React-runtimeexecutor (= 0.64.2)
|
||||||
- React-jsi (0.64.1):
|
- React-jsi (0.64.2):
|
||||||
- boost-for-react-native (= 1.63.0)
|
- boost-for-react-native (= 1.63.0)
|
||||||
- DoubleConversion
|
- DoubleConversion
|
||||||
- glog
|
- glog
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2020.01.13.00)
|
||||||
- React-jsi/Default (= 0.64.1)
|
- React-jsi/Default (= 0.64.2)
|
||||||
- React-jsi/Default (0.64.1):
|
- React-jsi/Default (0.64.2):
|
||||||
- boost-for-react-native (= 1.63.0)
|
- boost-for-react-native (= 1.63.0)
|
||||||
- DoubleConversion
|
- DoubleConversion
|
||||||
- glog
|
- glog
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2020.01.13.00)
|
||||||
- React-jsiexecutor (0.64.1):
|
- React-jsiexecutor (0.64.2):
|
||||||
- DoubleConversion
|
- DoubleConversion
|
||||||
- glog
|
- glog
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2020.01.13.00)
|
||||||
- React-cxxreact (= 0.64.1)
|
- React-cxxreact (= 0.64.2)
|
||||||
- React-jsi (= 0.64.1)
|
- React-jsi (= 0.64.2)
|
||||||
- React-perflogger (= 0.64.1)
|
- React-perflogger (= 0.64.2)
|
||||||
- React-jsinspector (0.64.1)
|
- React-jsinspector (0.64.2)
|
||||||
- react-native-blur (0.8.0):
|
- react-native-blur (0.8.0):
|
||||||
- React
|
- React
|
||||||
- react-native-blurhash (1.1.4):
|
- react-native-blurhash (1.1.5):
|
||||||
- React-Core
|
- React-Core
|
||||||
- react-native-cameraroll (4.0.4):
|
- react-native-cameraroll (4.0.4):
|
||||||
- React-Core
|
- React-Core
|
||||||
- react-native-netinfo (6.0.0):
|
- react-native-netinfo (6.0.2):
|
||||||
- React-Core
|
- React-Core
|
||||||
- react-native-pager-view (5.1.9):
|
- react-native-pager-view (5.4.4):
|
||||||
- React-Core
|
- React-Core
|
||||||
- react-native-safe-area-context (3.2.0):
|
- react-native-safe-area-context (3.2.0):
|
||||||
- React-Core
|
- React-Core
|
||||||
- react-native-segmented-control (2.2.2):
|
- react-native-segmented-control (2.2.2):
|
||||||
- React-Core
|
- React-Core
|
||||||
- React-perflogger (0.64.1)
|
- React-perflogger (0.64.2)
|
||||||
- React-RCTActionSheet (0.64.1):
|
- React-RCTActionSheet (0.64.2):
|
||||||
- React-Core/RCTActionSheetHeaders (= 0.64.1)
|
- React-Core/RCTActionSheetHeaders (= 0.64.2)
|
||||||
- React-RCTAnimation (0.64.1):
|
- React-RCTAnimation (0.64.2):
|
||||||
- FBReactNativeSpec (= 0.64.1)
|
- FBReactNativeSpec (= 0.64.2)
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2020.01.13.00)
|
||||||
- RCTTypeSafety (= 0.64.1)
|
- RCTTypeSafety (= 0.64.2)
|
||||||
- React-Core/RCTAnimationHeaders (= 0.64.1)
|
- React-Core/RCTAnimationHeaders (= 0.64.2)
|
||||||
- React-jsi (= 0.64.1)
|
- React-jsi (= 0.64.2)
|
||||||
- ReactCommon/turbomodule/core (= 0.64.1)
|
- ReactCommon/turbomodule/core (= 0.64.2)
|
||||||
- React-RCTBlob (0.64.1):
|
- React-RCTBlob (0.64.2):
|
||||||
- FBReactNativeSpec (= 0.64.1)
|
- FBReactNativeSpec (= 0.64.2)
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2020.01.13.00)
|
||||||
- React-Core/RCTBlobHeaders (= 0.64.1)
|
- React-Core/RCTBlobHeaders (= 0.64.2)
|
||||||
- React-Core/RCTWebSocket (= 0.64.1)
|
- React-Core/RCTWebSocket (= 0.64.2)
|
||||||
- React-jsi (= 0.64.1)
|
- React-jsi (= 0.64.2)
|
||||||
- React-RCTNetwork (= 0.64.1)
|
- React-RCTNetwork (= 0.64.2)
|
||||||
- ReactCommon/turbomodule/core (= 0.64.1)
|
- ReactCommon/turbomodule/core (= 0.64.2)
|
||||||
- React-RCTImage (0.64.1):
|
- React-RCTImage (0.64.2):
|
||||||
- FBReactNativeSpec (= 0.64.1)
|
- FBReactNativeSpec (= 0.64.2)
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2020.01.13.00)
|
||||||
- RCTTypeSafety (= 0.64.1)
|
- RCTTypeSafety (= 0.64.2)
|
||||||
- React-Core/RCTImageHeaders (= 0.64.1)
|
- React-Core/RCTImageHeaders (= 0.64.2)
|
||||||
- React-jsi (= 0.64.1)
|
- React-jsi (= 0.64.2)
|
||||||
- React-RCTNetwork (= 0.64.1)
|
- React-RCTNetwork (= 0.64.2)
|
||||||
- ReactCommon/turbomodule/core (= 0.64.1)
|
- ReactCommon/turbomodule/core (= 0.64.2)
|
||||||
- React-RCTLinking (0.64.1):
|
- React-RCTLinking (0.64.2):
|
||||||
- FBReactNativeSpec (= 0.64.1)
|
- FBReactNativeSpec (= 0.64.2)
|
||||||
- React-Core/RCTLinkingHeaders (= 0.64.1)
|
- React-Core/RCTLinkingHeaders (= 0.64.2)
|
||||||
- React-jsi (= 0.64.1)
|
- React-jsi (= 0.64.2)
|
||||||
- ReactCommon/turbomodule/core (= 0.64.1)
|
- ReactCommon/turbomodule/core (= 0.64.2)
|
||||||
- React-RCTNetwork (0.64.1):
|
- React-RCTNetwork (0.64.2):
|
||||||
- FBReactNativeSpec (= 0.64.1)
|
- FBReactNativeSpec (= 0.64.2)
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2020.01.13.00)
|
||||||
- RCTTypeSafety (= 0.64.1)
|
- RCTTypeSafety (= 0.64.2)
|
||||||
- React-Core/RCTNetworkHeaders (= 0.64.1)
|
- React-Core/RCTNetworkHeaders (= 0.64.2)
|
||||||
- React-jsi (= 0.64.1)
|
- React-jsi (= 0.64.2)
|
||||||
- ReactCommon/turbomodule/core (= 0.64.1)
|
- ReactCommon/turbomodule/core (= 0.64.2)
|
||||||
- React-RCTSettings (0.64.1):
|
- React-RCTSettings (0.64.2):
|
||||||
- FBReactNativeSpec (= 0.64.1)
|
- FBReactNativeSpec (= 0.64.2)
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2020.01.13.00)
|
||||||
- RCTTypeSafety (= 0.64.1)
|
- RCTTypeSafety (= 0.64.2)
|
||||||
- React-Core/RCTSettingsHeaders (= 0.64.1)
|
- React-Core/RCTSettingsHeaders (= 0.64.2)
|
||||||
- React-jsi (= 0.64.1)
|
- React-jsi (= 0.64.2)
|
||||||
- ReactCommon/turbomodule/core (= 0.64.1)
|
- ReactCommon/turbomodule/core (= 0.64.2)
|
||||||
- React-RCTText (0.64.1):
|
- React-RCTText (0.64.2):
|
||||||
- React-Core/RCTTextHeaders (= 0.64.1)
|
- React-Core/RCTTextHeaders (= 0.64.2)
|
||||||
- React-RCTVibration (0.64.1):
|
- React-RCTVibration (0.64.2):
|
||||||
- FBReactNativeSpec (= 0.64.1)
|
- FBReactNativeSpec (= 0.64.2)
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2020.01.13.00)
|
||||||
- React-Core/RCTVibrationHeaders (= 0.64.1)
|
- React-Core/RCTVibrationHeaders (= 0.64.2)
|
||||||
- React-jsi (= 0.64.1)
|
- React-jsi (= 0.64.2)
|
||||||
- ReactCommon/turbomodule/core (= 0.64.1)
|
- ReactCommon/turbomodule/core (= 0.64.2)
|
||||||
- React-runtimeexecutor (0.64.1):
|
- React-runtimeexecutor (0.64.2):
|
||||||
- React-jsi (= 0.64.1)
|
- React-jsi (= 0.64.2)
|
||||||
- ReactCommon/turbomodule/core (0.64.1):
|
- ReactCommon/turbomodule/core (0.64.2):
|
||||||
- DoubleConversion
|
- DoubleConversion
|
||||||
- glog
|
- glog
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2020.01.13.00)
|
||||||
- React-callinvoker (= 0.64.1)
|
- React-callinvoker (= 0.64.2)
|
||||||
- React-Core (= 0.64.1)
|
- React-Core (= 0.64.2)
|
||||||
- React-cxxreact (= 0.64.1)
|
- React-cxxreact (= 0.64.2)
|
||||||
- React-jsi (= 0.64.1)
|
- React-jsi (= 0.64.2)
|
||||||
- React-perflogger (= 0.64.1)
|
- React-perflogger (= 0.64.2)
|
||||||
- RNCAsyncStorage (1.15.4):
|
- RNCAsyncStorage (1.15.8):
|
||||||
- React-Core
|
- React-Core
|
||||||
- RNCMaskedView (0.1.11):
|
- RNFastImage (8.5.6):
|
||||||
- React
|
|
||||||
- RNFastImage (8.3.4):
|
|
||||||
- React-Core
|
- React-Core
|
||||||
- SDWebImage (~> 5.8)
|
- SDWebImage (~> 5.11.1)
|
||||||
- SDWebImageWebPCoder (~> 0.6.1)
|
- SDWebImageWebPCoder (~> 0.8.4)
|
||||||
- RNGestureHandler (1.10.3):
|
- RNGestureHandler (1.10.3):
|
||||||
- React-Core
|
- React-Core
|
||||||
- RNReanimated (2.1.0):
|
- RNReanimated (2.2.2):
|
||||||
- DoubleConversion
|
- DoubleConversion
|
||||||
- FBLazyVector
|
- FBLazyVector
|
||||||
- FBReactNativeSpec
|
- FBReactNativeSpec
|
||||||
|
@ -480,44 +489,30 @@ PODS:
|
||||||
- React-RCTVibration
|
- React-RCTVibration
|
||||||
- ReactCommon/turbomodule/core
|
- ReactCommon/turbomodule/core
|
||||||
- Yoga
|
- Yoga
|
||||||
- RNScreens (3.3.0):
|
- RNScreens (3.7.2):
|
||||||
- React-Core
|
- React-Core
|
||||||
- React-RCTImage
|
- React-RCTImage
|
||||||
- RNSentry (2.4.3):
|
- RNSentry (2.6.2):
|
||||||
- React-Core
|
- React-Core
|
||||||
- Sentry (= 6.1.4)
|
- Sentry (= 7.1.4)
|
||||||
- RNSVG (12.1.1):
|
- RNSVG (12.1.1):
|
||||||
- React
|
- React
|
||||||
- SDWebImage (5.11.1):
|
- SDWebImage (5.11.1):
|
||||||
- SDWebImage/Core (= 5.11.1)
|
- SDWebImage/Core (= 5.11.1)
|
||||||
- SDWebImage/Core (5.11.1)
|
- SDWebImage/Core (5.11.1)
|
||||||
- SDWebImageWebPCoder (0.6.1):
|
- SDWebImageWebPCoder (0.8.4):
|
||||||
- libwebp (~> 1.0)
|
- libwebp (~> 1.0)
|
||||||
- SDWebImage/Core (~> 5.7)
|
- SDWebImage/Core (~> 5.10)
|
||||||
- Sentry (6.1.4):
|
- Sentry (7.1.4):
|
||||||
- Sentry/Core (= 6.1.4)
|
- Sentry/Core (= 7.1.4)
|
||||||
- Sentry/Core (6.1.4)
|
- Sentry/Core (7.1.4)
|
||||||
- UMAppLoader (2.1.0)
|
- UMAppLoader (2.2.0)
|
||||||
- UMBarCodeScannerInterface (6.1.0):
|
- UMCore (7.1.2)
|
||||||
- UMCore
|
- UMReactNativeAdapter (6.3.7):
|
||||||
- UMCameraInterface (6.1.0):
|
- ExpoModulesCore
|
||||||
- UMCore
|
|
||||||
- UMConstantsInterface (6.1.0):
|
|
||||||
- UMCore
|
|
||||||
- UMCore (7.1.0)
|
|
||||||
- UMFaceDetectorInterface (6.1.0)
|
|
||||||
- UMFileSystemInterface (6.1.0)
|
|
||||||
- UMFontInterface (6.1.0)
|
|
||||||
- UMImageLoaderInterface (6.1.0)
|
|
||||||
- UMPermissionsInterface (6.1.0):
|
|
||||||
- UMCore
|
|
||||||
- UMReactNativeAdapter (6.2.2):
|
|
||||||
- React-Core
|
- React-Core
|
||||||
- UMCore
|
- UMCore
|
||||||
- UMFontInterface
|
- UMTaskManagerInterface (6.2.0):
|
||||||
- UMSensorsInterface (6.1.0):
|
|
||||||
- UMCore
|
|
||||||
- UMTaskManagerInterface (6.1.0):
|
|
||||||
- UMCore
|
- UMCore
|
||||||
- Yoga (1.14.0)
|
- Yoga (1.14.0)
|
||||||
|
|
||||||
|
@ -525,7 +520,7 @@ DEPENDENCIES:
|
||||||
- DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)
|
- DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)
|
||||||
- EXApplication (from `../node_modules/expo-application/ios`)
|
- EXApplication (from `../node_modules/expo-application/ios`)
|
||||||
- EXAV (from `../node_modules/expo-av/ios`)
|
- EXAV (from `../node_modules/expo-av/ios`)
|
||||||
- EXConstants (from `../node_modules/expo-constants/ios`)
|
- EXConstants (from `../node_modules/react-native-unimodules/node_modules/expo-constants/ios`)
|
||||||
- EXCrypto (from `../node_modules/expo-crypto/ios`)
|
- EXCrypto (from `../node_modules/expo-crypto/ios`)
|
||||||
- EXDevice (from `../node_modules/expo-device/ios`)
|
- EXDevice (from `../node_modules/expo-device/ios`)
|
||||||
- EXErrorRecovery (from `../node_modules/expo-error-recovery/ios`)
|
- EXErrorRecovery (from `../node_modules/expo-error-recovery/ios`)
|
||||||
|
@ -541,12 +536,15 @@ DEPENDENCIES:
|
||||||
- EXLocalization (from `../node_modules/expo-localization/ios`)
|
- EXLocalization (from `../node_modules/expo-localization/ios`)
|
||||||
- EXNotifications (from `../node_modules/expo-notifications/ios`)
|
- EXNotifications (from `../node_modules/expo-notifications/ios`)
|
||||||
- EXPermissions (from `../node_modules/expo-permissions/ios`)
|
- EXPermissions (from `../node_modules/expo-permissions/ios`)
|
||||||
|
- ExpoModulesCore (from `../node_modules/expo-modules-core/ios`)
|
||||||
- EXRandom (from `../node_modules/expo-random/ios`)
|
- EXRandom (from `../node_modules/expo-random/ios`)
|
||||||
- EXScreenCapture (from `../node_modules/expo-screen-capture/ios`)
|
- EXScreenCapture (from `../node_modules/expo-screen-capture/ios`)
|
||||||
- EXSecureStore (from `../node_modules/expo-secure-store/ios`)
|
- EXSecureStore (from `../node_modules/expo-secure-store/ios`)
|
||||||
- EXSplashScreen (from `../node_modules/expo-splash-screen/ios`)
|
- EXSplashScreen (from `../node_modules/expo-splash-screen/ios`)
|
||||||
- EXStoreReview (from `../node_modules/expo-store-review/ios`)
|
- EXStoreReview (from `../node_modules/expo-store-review/ios`)
|
||||||
|
- EXStructuredHeaders (from `../node_modules/expo-structured-headers/ios`)
|
||||||
- EXUpdates (from `../node_modules/expo-updates/ios`)
|
- EXUpdates (from `../node_modules/expo-updates/ios`)
|
||||||
|
- EXUpdatesInterface (from `../node_modules/expo-updates-interface/ios`)
|
||||||
- EXVideoThumbnails (from `../node_modules/expo-video-thumbnails/ios`)
|
- EXVideoThumbnails (from `../node_modules/expo-video-thumbnails/ios`)
|
||||||
- EXWebBrowser (from `../node_modules/expo-web-browser/ios`)
|
- EXWebBrowser (from `../node_modules/expo-web-browser/ios`)
|
||||||
- FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`)
|
- FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`)
|
||||||
|
@ -588,7 +586,6 @@ DEPENDENCIES:
|
||||||
- React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`)
|
- React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`)
|
||||||
- ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`)
|
- ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`)
|
||||||
- "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)"
|
- "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)"
|
||||||
- "RNCMaskedView (from `../node_modules/@react-native-community/masked-view`)"
|
|
||||||
- RNFastImage (from `../node_modules/react-native-fast-image`)
|
- RNFastImage (from `../node_modules/react-native-fast-image`)
|
||||||
- RNGestureHandler (from `../node_modules/react-native-gesture-handler`)
|
- RNGestureHandler (from `../node_modules/react-native-gesture-handler`)
|
||||||
- RNReanimated (from `../node_modules/react-native-reanimated`)
|
- RNReanimated (from `../node_modules/react-native-reanimated`)
|
||||||
|
@ -596,17 +593,8 @@ DEPENDENCIES:
|
||||||
- "RNSentry (from `../node_modules/@sentry/react-native`)"
|
- "RNSentry (from `../node_modules/@sentry/react-native`)"
|
||||||
- RNSVG (from `../node_modules/react-native-svg`)
|
- RNSVG (from `../node_modules/react-native-svg`)
|
||||||
- UMAppLoader (from `../node_modules/unimodules-app-loader/ios`)
|
- UMAppLoader (from `../node_modules/unimodules-app-loader/ios`)
|
||||||
- UMBarCodeScannerInterface (from `../node_modules/unimodules-barcode-scanner-interface/ios`)
|
- "UMCore (from `../node_modules/react-native-unimodules/node_modules/@unimodules/core/ios`)"
|
||||||
- UMCameraInterface (from `../node_modules/unimodules-camera-interface/ios`)
|
- "UMReactNativeAdapter (from `../node_modules/react-native-unimodules/node_modules/@unimodules/react-native-adapter/ios`)"
|
||||||
- UMConstantsInterface (from `../node_modules/unimodules-constants-interface/ios`)
|
|
||||||
- "UMCore (from `../node_modules/@unimodules/core/ios`)"
|
|
||||||
- UMFaceDetectorInterface (from `../node_modules/unimodules-face-detector-interface/ios`)
|
|
||||||
- UMFileSystemInterface (from `../node_modules/unimodules-file-system-interface/ios`)
|
|
||||||
- UMFontInterface (from `../node_modules/unimodules-font-interface/ios`)
|
|
||||||
- UMImageLoaderInterface (from `../node_modules/unimodules-image-loader-interface/ios`)
|
|
||||||
- UMPermissionsInterface (from `../node_modules/unimodules-permissions-interface/ios`)
|
|
||||||
- "UMReactNativeAdapter (from `../node_modules/@unimodules/react-native-adapter/ios`)"
|
|
||||||
- UMSensorsInterface (from `../node_modules/unimodules-sensors-interface/ios`)
|
|
||||||
- UMTaskManagerInterface (from `../node_modules/unimodules-task-manager-interface/ios`)
|
- UMTaskManagerInterface (from `../node_modules/unimodules-task-manager-interface/ios`)
|
||||||
- Yoga (from `../node_modules/react-native/ReactCommon/yoga`)
|
- Yoga (from `../node_modules/react-native/ReactCommon/yoga`)
|
||||||
|
|
||||||
|
@ -638,7 +626,7 @@ EXTERNAL SOURCES:
|
||||||
EXAV:
|
EXAV:
|
||||||
:path: "../node_modules/expo-av/ios"
|
:path: "../node_modules/expo-av/ios"
|
||||||
EXConstants:
|
EXConstants:
|
||||||
:path: "../node_modules/expo-constants/ios"
|
:path: "../node_modules/react-native-unimodules/node_modules/expo-constants/ios"
|
||||||
EXCrypto:
|
EXCrypto:
|
||||||
:path: "../node_modules/expo-crypto/ios"
|
:path: "../node_modules/expo-crypto/ios"
|
||||||
EXDevice:
|
EXDevice:
|
||||||
|
@ -669,6 +657,8 @@ EXTERNAL SOURCES:
|
||||||
:path: "../node_modules/expo-notifications/ios"
|
:path: "../node_modules/expo-notifications/ios"
|
||||||
EXPermissions:
|
EXPermissions:
|
||||||
:path: "../node_modules/expo-permissions/ios"
|
:path: "../node_modules/expo-permissions/ios"
|
||||||
|
ExpoModulesCore:
|
||||||
|
:path: "../node_modules/expo-modules-core/ios"
|
||||||
EXRandom:
|
EXRandom:
|
||||||
:path: "../node_modules/expo-random/ios"
|
:path: "../node_modules/expo-random/ios"
|
||||||
EXScreenCapture:
|
EXScreenCapture:
|
||||||
|
@ -679,8 +669,12 @@ EXTERNAL SOURCES:
|
||||||
:path: "../node_modules/expo-splash-screen/ios"
|
:path: "../node_modules/expo-splash-screen/ios"
|
||||||
EXStoreReview:
|
EXStoreReview:
|
||||||
:path: "../node_modules/expo-store-review/ios"
|
:path: "../node_modules/expo-store-review/ios"
|
||||||
|
EXStructuredHeaders:
|
||||||
|
:path: "../node_modules/expo-structured-headers/ios"
|
||||||
EXUpdates:
|
EXUpdates:
|
||||||
:path: "../node_modules/expo-updates/ios"
|
:path: "../node_modules/expo-updates/ios"
|
||||||
|
EXUpdatesInterface:
|
||||||
|
:path: "../node_modules/expo-updates-interface/ios"
|
||||||
EXVideoThumbnails:
|
EXVideoThumbnails:
|
||||||
:path: "../node_modules/expo-video-thumbnails/ios"
|
:path: "../node_modules/expo-video-thumbnails/ios"
|
||||||
EXWebBrowser:
|
EXWebBrowser:
|
||||||
|
@ -753,8 +747,6 @@ EXTERNAL SOURCES:
|
||||||
:path: "../node_modules/react-native/ReactCommon"
|
:path: "../node_modules/react-native/ReactCommon"
|
||||||
RNCAsyncStorage:
|
RNCAsyncStorage:
|
||||||
:path: "../node_modules/@react-native-async-storage/async-storage"
|
:path: "../node_modules/@react-native-async-storage/async-storage"
|
||||||
RNCMaskedView:
|
|
||||||
:path: "../node_modules/@react-native-community/masked-view"
|
|
||||||
RNFastImage:
|
RNFastImage:
|
||||||
:path: "../node_modules/react-native-fast-image"
|
:path: "../node_modules/react-native-fast-image"
|
||||||
RNGestureHandler:
|
RNGestureHandler:
|
||||||
|
@ -769,28 +761,10 @@ EXTERNAL SOURCES:
|
||||||
:path: "../node_modules/react-native-svg"
|
:path: "../node_modules/react-native-svg"
|
||||||
UMAppLoader:
|
UMAppLoader:
|
||||||
:path: "../node_modules/unimodules-app-loader/ios"
|
:path: "../node_modules/unimodules-app-loader/ios"
|
||||||
UMBarCodeScannerInterface:
|
|
||||||
:path: "../node_modules/unimodules-barcode-scanner-interface/ios"
|
|
||||||
UMCameraInterface:
|
|
||||||
:path: "../node_modules/unimodules-camera-interface/ios"
|
|
||||||
UMConstantsInterface:
|
|
||||||
:path: "../node_modules/unimodules-constants-interface/ios"
|
|
||||||
UMCore:
|
UMCore:
|
||||||
:path: "../node_modules/@unimodules/core/ios"
|
:path: "../node_modules/react-native-unimodules/node_modules/@unimodules/core/ios"
|
||||||
UMFaceDetectorInterface:
|
|
||||||
:path: "../node_modules/unimodules-face-detector-interface/ios"
|
|
||||||
UMFileSystemInterface:
|
|
||||||
:path: "../node_modules/unimodules-file-system-interface/ios"
|
|
||||||
UMFontInterface:
|
|
||||||
:path: "../node_modules/unimodules-font-interface/ios"
|
|
||||||
UMImageLoaderInterface:
|
|
||||||
:path: "../node_modules/unimodules-image-loader-interface/ios"
|
|
||||||
UMPermissionsInterface:
|
|
||||||
:path: "../node_modules/unimodules-permissions-interface/ios"
|
|
||||||
UMReactNativeAdapter:
|
UMReactNativeAdapter:
|
||||||
:path: "../node_modules/@unimodules/react-native-adapter/ios"
|
:path: "../node_modules/react-native-unimodules/node_modules/@unimodules/react-native-adapter/ios"
|
||||||
UMSensorsInterface:
|
|
||||||
:path: "../node_modules/unimodules-sensors-interface/ios"
|
|
||||||
UMTaskManagerInterface:
|
UMTaskManagerInterface:
|
||||||
:path: "../node_modules/unimodules-task-manager-interface/ios"
|
:path: "../node_modules/unimodules-task-manager-interface/ios"
|
||||||
Yoga:
|
Yoga:
|
||||||
|
@ -799,34 +773,37 @@ EXTERNAL SOURCES:
|
||||||
SPEC CHECKSUMS:
|
SPEC CHECKSUMS:
|
||||||
boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c
|
boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c
|
||||||
DoubleConversion: cf9b38bf0b2d048436d9a82ad2abe1404f11e7de
|
DoubleConversion: cf9b38bf0b2d048436d9a82ad2abe1404f11e7de
|
||||||
EXApplication: 4797b8b37f0b0470f587fdccf6407f44b50d18b5
|
EXApplication: 9ff2a206009d6e55bca6c20b3f33d07986b51ef3
|
||||||
EXAV: f7c1b9af3aff7834cbdbe3e002d1f70e21c38320
|
EXAV: 67bcc1d0afeb1fab854b206c84b9f2afbd61d0cd
|
||||||
EXConstants: c4dd28acc12039c999612507a5f935556f2c86ce
|
EXConstants: 4cb52b6d8f636c767104a44bf7db3873e9c01a6f
|
||||||
EXCrypto: 9cbeb90f6c60a8ae9f26242fd2db916b21c55700
|
EXCrypto: 46e28f1eb7ec3e2ae5aab652fe1dc4d46bafb386
|
||||||
EXDevice: 01f54314f618aa4098893f66cd8f2a8a411f33ee
|
EXDevice: 6f1eed02c099f5b382a12a40406c58868892aba6
|
||||||
EXErrorRecovery: 720641265b8cf95e6cdeb1884ac38e794a352488
|
EXErrorRecovery: 404d827bc7d42f306c062d58a60b06afc4d082b3
|
||||||
EXFileSystem: dcf2273f49431e5037347c733a2dc5d08e0d0a9e
|
EXFileSystem: 0a04aba8da751b9ac954065911bcf166503f8267
|
||||||
EXFirebaseAnalytics: aa820eafe8527a32f65a285047ce475e622c7e8f
|
EXFirebaseAnalytics: ca01838167729b67f838a673e4b3e0637faec118
|
||||||
EXFirebaseCore: 7865e37021ddcff5c575a4598686a2939d6c4183
|
EXFirebaseCore: 9b5380fd62fce3c790fa1d6727a8d7cbbef4f0fb
|
||||||
EXFont: d6fb79f9863120f0d0b26b0c2d1453bc9511e9df
|
EXFont: 9846ba1bb6f5f5aed44e20eea3ac70693323832d
|
||||||
EXHaptics: 2de40c5f50a9e78da92c209db06db5134d8cac0b
|
EXHaptics: 6dc4307ab0794fe7a87ec8d7d1c299cf103d6cb3
|
||||||
EXImageLoader: da941c9399e01ec28f2d5b270bdd21f2c8ca596c
|
EXImageLoader: d3531a3fe530b22925c19977cb53bb43e3821fe6
|
||||||
EXImageManipulator: a099e4694070c7cb86aa0b0b1afa3ea184153a7d
|
EXImageManipulator: c9af8e8dc6543fdca23693eae280e388b2f93fb0
|
||||||
EXImagePicker: dd05b8a5cb782c79d07d1d72e5850c6acc2b9a37
|
EXImagePicker: 414a3663910fd6604248e84c9c77a0501ae0d18b
|
||||||
EXKeepAwake: d4e4a3ed8c1c4fd940dd62fc5a8be2a190371fd4
|
EXKeepAwake: f4105ef469be7b283f66ce2d7234bb71ac80cd26
|
||||||
EXLocalization: f139efe4a06be1041815879959346e3d437a6e93
|
EXLocalization: 356f4e16a606cec21a77d6250528fde526152b45
|
||||||
EXNotifications: c13e078d83ce01c7aeb8e3f44a48c13f50099291
|
EXNotifications: 171ccaf17643811673c78f4c4830560d6e5a92aa
|
||||||
EXPermissions: 8f8c1c05580c4e02d4ee2c8dd74bfe173ff6a723
|
EXPermissions: 916efb5b817cb0a40160c0cd2f369af3c23a78be
|
||||||
EXRandom: cbd66cd45434a494f5ef98650eec1f8d78b90270
|
ExpoModulesCore: 2734852616127a6c1fc23012197890a6f3763dc7
|
||||||
EXScreenCapture: 2903dace06f2d06cc161017637cc4cbfcaa98986
|
EXRandom: ecb71f5d01991f29bb0277f8a2c35d168f85d637
|
||||||
EXSecureStore: da5a255445bb6ee8b8ac54f65412bc803272bd87
|
EXScreenCapture: c51844407fbac8bbca4415467bc43f2b7764d225
|
||||||
EXSplashScreen: a9baaf4fa866003884c90ba049f18760d6a8ce39
|
EXSecureStore: 1aa80d49a3a101418bbd2675e2a0d32dceea10c2
|
||||||
EXStoreReview: b1f68ed0369b0f1c443214ac8d6881ef3b64de9a
|
EXSplashScreen: 847e0d8026731c1090bf269ede3e15ac87d88958
|
||||||
EXUpdates: 74b39409f68eca207075d87b0077bdf37865a8bf
|
EXStoreReview: 40674cc897a6d7fd249969b86d1833f67b99170a
|
||||||
EXVideoThumbnails: cd257fc6e07884a704a5674d362a6410933acb68
|
EXStructuredHeaders: e52b880264d15b8ad07d36670226c29476af6334
|
||||||
EXWebBrowser: 0b466c50e5ff61c9758095d49d5081e3229d77ac
|
EXUpdates: 013d26649cb6ab4f8d8d80c35d3d4be150b47e7c
|
||||||
FBLazyVector: 7b423f9e248eae65987838148c36eec1dbfe0b53
|
EXUpdatesInterface: b68e78b912a03fff7901a5f46ec200c45e3506a5
|
||||||
FBReactNativeSpec: 5058d1917c80dca4b9ed89bdf94385315939ab80
|
EXVideoThumbnails: 442c3abadb51a81551a3b53705b7560de390e6f7
|
||||||
|
EXWebBrowser: 76783ba5dcb8699237746ecf41a9643d428a4cc5
|
||||||
|
FBLazyVector: e686045572151edef46010a6f819ade377dfeb4b
|
||||||
|
FBReactNativeSpec: 23c392d9bbc0bef14737ae5109976815b182edcf
|
||||||
Firebase: cd2ab85eec8170dc260186159f21072ecb679ad5
|
Firebase: cd2ab85eec8170dc260186159f21072ecb679ad5
|
||||||
FirebaseAnalytics: f3f8f75de34fe04141a69bb1c4bd7e24a80178e1
|
FirebaseAnalytics: f3f8f75de34fe04141a69bb1c4bd7e24a80178e1
|
||||||
FirebaseCore: ac35d680a0bf32319a59966a1478e0741536b97b
|
FirebaseCore: ac35d680a0bf32319a59966a1478e0741536b97b
|
||||||
|
@ -835,67 +812,57 @@ SPEC CHECKSUMS:
|
||||||
glog: 73c2498ac6884b13ede40eda8228cb1eee9d9d62
|
glog: 73c2498ac6884b13ede40eda8228cb1eee9d9d62
|
||||||
GoogleAppMeasurement: 0c3b134b2c0a90c4c24833873894bfe0e42a0384
|
GoogleAppMeasurement: 0c3b134b2c0a90c4c24833873894bfe0e42a0384
|
||||||
GoogleDataTransport: 8b0e733ea77c9218778e5a9e34ba9508b8328939
|
GoogleDataTransport: 8b0e733ea77c9218778e5a9e34ba9508b8328939
|
||||||
GoogleUtilities: f8a43108b38a68eebe8b3540e1f4f2d28843ce20
|
GoogleUtilities: 3df19e3c24f7bbc291d8b5809aa6b0d41e642437
|
||||||
hermes-engine: 7d97ba46a1e29bacf3e3c61ecb2804a5ddd02d4f
|
hermes-engine: 7d97ba46a1e29bacf3e3c61ecb2804a5ddd02d4f
|
||||||
libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913
|
libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913
|
||||||
libwebp: e90b9c01d99205d03b6bb8f2c8c415e5a4ef66f0
|
libwebp: e90b9c01d99205d03b6bb8f2c8c415e5a4ef66f0
|
||||||
nanopb: 59221d7f958fb711001e6a449489542d92ae113e
|
nanopb: 59221d7f958fb711001e6a449489542d92ae113e
|
||||||
PromisesObjC: 3113f7f76903778cf4a0586bd1ab89329a0b7b97
|
PromisesObjC: 3113f7f76903778cf4a0586bd1ab89329a0b7b97
|
||||||
RCT-Folly: ec7a233ccc97cc556cf7237f0db1ff65b986f27c
|
RCT-Folly: ec7a233ccc97cc556cf7237f0db1ff65b986f27c
|
||||||
RCTRequired: ec2ebc96b7bfba3ca5c32740f5a0c6a014a274d2
|
RCTRequired: 6d3e854f0e7260a648badd0d44fc364bc9da9728
|
||||||
RCTTypeSafety: 22567f31e67c3e088c7ac23ea46ab6d4779c0ea5
|
RCTTypeSafety: c1f31d19349c6b53085766359caac425926fafaa
|
||||||
React: a241e3dbb1e91d06332f1dbd2b3ab26e1a4c4b9d
|
React: bda6b6d7ae912de97d7a61aa5c160db24aa2ad69
|
||||||
React-callinvoker: da4d1c6141696a00163960906bc8a55b985e4ce4
|
React-callinvoker: 9840ea7e8e88ed73d438edb725574820b29b5baa
|
||||||
React-Core: 46ba164c437d7dac607b470c83c8308b05799748
|
React-Core: b5e385da7ce5f16a220fc60fd0749eae2c6120f0
|
||||||
React-CoreModules: 217bd14904491c7b9940ff8b34a3fe08013c2f14
|
React-CoreModules: 17071a4e2c5239b01585f4aa8070141168ab298f
|
||||||
React-cxxreact: 0090588ae6660c4615d3629fdd5c768d0983add4
|
React-cxxreact: 9be7b6340ed9f7c53e53deca7779f07cd66525ba
|
||||||
React-jsi: 5de8204706bd872b78ea646aee5d2561ca1214b6
|
React-jsi: 67747b9722f6dab2ffe15b011bcf6b3f2c3f1427
|
||||||
React-jsiexecutor: 124e8f99992490d0d13e0649d950d3e1aae06fe9
|
React-jsiexecutor: 80c46bd381fd06e418e0d4f53672dc1d1945c4c3
|
||||||
React-jsinspector: 500a59626037be5b3b3d89c5151bc3baa9abf1a9
|
React-jsinspector: cc614ec18a9ca96fd275100c16d74d62ee11f0ae
|
||||||
react-native-blur: cad4d93b364f91e7b7931b3fa935455487e5c33c
|
react-native-blur: cad4d93b364f91e7b7931b3fa935455487e5c33c
|
||||||
react-native-blurhash: ec98d751a9cb9075cef0b9e3188244c517d6ab22
|
react-native-blurhash: d978f8017ed091d9e1179775fe7bac14297e6e1e
|
||||||
react-native-cameraroll: 88f4e62d9ecd0e1f253abe4f685474f2ea14bfa2
|
react-native-cameraroll: 88f4e62d9ecd0e1f253abe4f685474f2ea14bfa2
|
||||||
react-native-netinfo: e849fc21ca2f4128a5726c801a82fc6f4a6db50d
|
react-native-netinfo: 92e6e4476eb8bf6fc2d7c0a6ca0a1406f663d73a
|
||||||
react-native-pager-view: 14653de580178af7e65aa7e3fa08b4f243c86d4d
|
react-native-pager-view: 5ab4d0b4b44d89f77310cb3eb8129745f274ce55
|
||||||
react-native-safe-area-context: f0906bf8bc9835ac9a9d3f97e8bde2a997d8da79
|
react-native-safe-area-context: f0906bf8bc9835ac9a9d3f97e8bde2a997d8da79
|
||||||
react-native-segmented-control: 65df6cd0619b780b3843d574a72d4c7cec396097
|
react-native-segmented-control: 65df6cd0619b780b3843d574a72d4c7cec396097
|
||||||
React-perflogger: aad6d4b4a267936b3667260d1f649b6f6069a675
|
React-perflogger: 25373e382fed75ce768a443822f07098a15ab737
|
||||||
React-RCTActionSheet: fc376be462c9c8d6ad82c0905442fd77f82a9d2a
|
React-RCTActionSheet: af7796ba49ffe4ca92e7277a5d992d37203f7da5
|
||||||
React-RCTAnimation: ba0a1c3a2738be224a08092fa7f1b444ab77d309
|
React-RCTAnimation: 6a2e76ab50c6f25b428d81b76a5a45351c4d77aa
|
||||||
React-RCTBlob: f758d4403fc5828a326dc69e27b41e1a92f34947
|
React-RCTBlob: 02a2887023e0eed99391b6445b2e23a2a6f9226d
|
||||||
React-RCTImage: ce57088705f4a8d03f6594b066a59c29143ba73e
|
React-RCTImage: ce5bf8e7438f2286d9b646a05d6ab11f38b0323d
|
||||||
React-RCTLinking: 852a3a95c65fa63f657a4b4e2d3d83a815e00a7c
|
React-RCTLinking: ccd20742de14e020cb5f99d5c7e0bf0383aefbd9
|
||||||
React-RCTNetwork: 9d7ccb8a08d522d71700b4fb677d9fa28cccd118
|
React-RCTNetwork: dfb9d089ab0753e5e5f55fc4b1210858f7245647
|
||||||
React-RCTSettings: d8aaf4389ff06114dee8c42ef5f0f2915946011e
|
React-RCTSettings: b14aef2d83699e48b410fb7c3ba5b66cd3291ae2
|
||||||
React-RCTText: 809c12ed6b261796ba056c04fcd20d8b90bcc81d
|
React-RCTText: 41a2e952dd9adc5caf6fb68ed46b275194d5da5f
|
||||||
React-RCTVibration: 4b99a7f5c6c0abbc5256410cc5425fb8531986e1
|
React-RCTVibration: 24600e3b1aaa77126989bc58b6747509a1ba14f3
|
||||||
React-runtimeexecutor: ff951a0c241bfaefc4940a3f1f1a229e7cb32fa6
|
React-runtimeexecutor: a9904c6d0218fb9f8b19d6dd88607225927668f9
|
||||||
ReactCommon: bedc99ed4dae329c4fcf128d0c31b9115e5365ca
|
ReactCommon: 149906e01aa51142707a10665185db879898e966
|
||||||
RNCAsyncStorage: f47a7e8f927f7c9da947491fc55752eb9ce17f2d
|
RNCAsyncStorage: e8b8d6320a0dd90eb610fb0d0b1ef90596697c69
|
||||||
RNCMaskedView: 0e1bc4bfa8365eba5fbbb71e07fbdc0555249489
|
RNFastImage: 047bd977c73870c39cce48032cc6a7913cb4fc47
|
||||||
RNFastImage: d4870d58f5936111c56218dbd7fcfc18e65b58ff
|
|
||||||
RNGestureHandler: a479ebd5ed4221a810967000735517df0d2db211
|
RNGestureHandler: a479ebd5ed4221a810967000735517df0d2db211
|
||||||
RNReanimated: b8c8004b43446e3c2709fe64b2b41072f87428ad
|
RNReanimated: 241c586663f44f19a53883c63375fdd041253960
|
||||||
RNScreens: bf59f17fbf001f1025243eeed5f19419d3c11ef2
|
RNScreens: 0591543e343c7444ea1756b6265d81a4295922c9
|
||||||
RNSentry: 6f8f9ee7e4c939dcd35e5633b94d0e3782888e46
|
RNSentry: 68644ef607b780551cc555f084869764f2566652
|
||||||
RNSVG: 551acb6562324b1d52a4e0758f7ca0ec234e278f
|
RNSVG: 551acb6562324b1d52a4e0758f7ca0ec234e278f
|
||||||
SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d
|
SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d
|
||||||
SDWebImageWebPCoder: d0dac55073088d24b2ac1b191a71a8f8d0adac21
|
SDWebImageWebPCoder: f93010f3f6c031e2f8fb3081ca4ee6966c539815
|
||||||
Sentry: 9d055e2de30a77685e86b219acf02e59b82091fc
|
Sentry: 1d3eb1a25f8c5333c88dd5603904a6d461cd9fcf
|
||||||
UMAppLoader: fe2708bb0ac5cd70052bc207d06aa3b7e72b9e97
|
UMAppLoader: 21af63390e55c82e037fb9752d93114a80ecf16e
|
||||||
UMBarCodeScannerInterface: 79f92bea5f7af39b381a4c82298105ceb537408a
|
UMCore: ce3a4faa010239063b8343895b29a6d97b01069d
|
||||||
UMCameraInterface: 81ff46700da88435f17afedfc88915eaede7e6a6
|
UMReactNativeAdapter: bb7922210cf6fdb5768f78685f3c3a2060299119
|
||||||
UMConstantsInterface: bb94dd46039dcde276ed50225b29e22785e604bf
|
UMTaskManagerInterface: 2be431101b73604e64fbfffcf759336f9d8fccbb
|
||||||
UMCore: 60b35f4d217461f7b54934b0c5be67442871f01f
|
Yoga: 575c581c63e0d35c9a83f4b46d01d63abc1100ac
|
||||||
UMFaceDetectorInterface: 791eec55ffca1171992976b7eceb73e69e391c58
|
|
||||||
UMFileSystemInterface: f72245e90ce78fa6427180ff0b0904ead13d8161
|
|
||||||
UMFontInterface: 5843cff7db85a42ba629aaac53d33091c35524d3
|
|
||||||
UMImageLoaderInterface: 9ddffeb644b3f45d4eb0c2f51a2fd95fd5c8d1a4
|
|
||||||
UMPermissionsInterface: 40b72935a7d12a3f60dc6b7bb99ce47908380cb1
|
|
||||||
UMReactNativeAdapter: 65ada852a648fcb6674acfbfe72ccb095f2f5b75
|
|
||||||
UMSensorsInterface: a5e9db661e5d9ae214762033d725989880ae6993
|
|
||||||
UMTaskManagerInterface: 203c11259d2699b5b3a4eda4adbc466f5cb5c561
|
|
||||||
Yoga: a7de31c64fe738607e7a3803e3f591a4b1df7393
|
|
||||||
|
|
||||||
PODFILE CHECKSUM: 34cad1fa3f14caa5b138177b6379ac2cba0e1087
|
PODFILE CHECKSUM: 34cad1fa3f14caa5b138177b6379ac2cba0e1087
|
||||||
|
|
||||||
|
|
|
@ -50,8 +50,6 @@
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
<key>NSMicrophoneUsageDescription</key>
|
|
||||||
<string>$(PRODUCT_NAME) DOES NOT need microphone permission. Please reject this request.</string>
|
|
||||||
<key>NSCameraUsageDescription</key>
|
<key>NSCameraUsageDescription</key>
|
||||||
<string>Allow $(PRODUCT_NAME) to capture photo or video and attach it to your toot</string>
|
<string>Allow $(PRODUCT_NAME) to capture photo or video and attach it to your toot</string>
|
||||||
<key>NSLocationWhenInUseUsageDescription</key>
|
<key>NSLocationWhenInUseUsageDescription</key>
|
||||||
|
|
191
package.json
191
package.json
|
@ -1,10 +1,10 @@
|
||||||
{
|
{
|
||||||
"name": "tooot",
|
"name": "tooot",
|
||||||
"versions": {
|
"versions": {
|
||||||
"native": "210511",
|
"native": "210916",
|
||||||
"major": 2,
|
"major": 2,
|
||||||
"minor": 1,
|
"minor": 2,
|
||||||
"patch": 3,
|
"patch": 0,
|
||||||
"expo": "41.0.0"
|
"expo": "41.0.0"
|
||||||
},
|
},
|
||||||
"description": "tooot app for Mastodon",
|
"description": "tooot app for Mastodon",
|
||||||
|
@ -24,103 +24,106 @@
|
||||||
"clean": "react-native-clean-project"
|
"clean": "react-native-clean-project"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@expo/react-native-action-sheet": "^3.9.0",
|
"@expo/react-native-action-sheet": "3.11.0",
|
||||||
"@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.15.4",
|
"@react-native-async-storage/async-storage": "1.15.8",
|
||||||
"@react-native-community/blur": "^3.6.0",
|
"@react-native-community/blur": "3.6.0",
|
||||||
"@react-native-community/cameraroll": "^4.0.4",
|
"@react-native-community/cameraroll": "4.0.4",
|
||||||
"@react-native-community/masked-view": "0.1.11",
|
"@react-native-community/netinfo": "6.0.2",
|
||||||
"@react-native-community/netinfo": "6.0.0",
|
|
||||||
"@react-native-community/segmented-control": "2.2.2",
|
"@react-native-community/segmented-control": "2.2.2",
|
||||||
"@react-navigation/bottom-tabs": "^5.11.11",
|
"@react-navigation/bottom-tabs": "6.0.5",
|
||||||
"@react-navigation/native": "^5.9.4",
|
"@react-navigation/native": "6.0.2",
|
||||||
"@react-navigation/stack": "^5.14.5",
|
"@react-navigation/native-stack": "6.1.0",
|
||||||
"@reduxjs/toolkit": "^1.5.1",
|
"@react-navigation/stack": "6.0.7",
|
||||||
"@sentry/react-native": "^2.4.3",
|
"@reduxjs/toolkit": "1.6.1",
|
||||||
"@sharcoux/slider": "^5.3.0",
|
"@sentry/react-native": "2.6.2",
|
||||||
"axios": "^0.21.1",
|
"@sharcoux/slider": "5.4.3",
|
||||||
"expo": "^41.0.1",
|
"axios": "0.21.4",
|
||||||
"expo-auth-session": "~3.2.3",
|
"expo": "42.0.3",
|
||||||
"expo-av": "~9.1.2",
|
"expo-auth-session": "3.3.1",
|
||||||
"expo-crypto": "~9.1.0",
|
"expo-av": "9.2.3",
|
||||||
"expo-firebase-analytics": "~4.0.2",
|
"expo-crypto": "9.2.0",
|
||||||
"expo-haptics": "~10.0.0",
|
"expo-device": "^3.3.0",
|
||||||
"expo-image-manipulator": "~9.1.0",
|
"expo-firebase-analytics": "4.1.0",
|
||||||
"expo-image-picker": "~10.1.4",
|
"expo-haptics": "10.1.0",
|
||||||
"expo-linking": "~2.2.3",
|
"expo-image-manipulator": "9.2.2",
|
||||||
"expo-localization": "~10.1.0",
|
"expo-image-picker": "10.2.3",
|
||||||
"expo-notifications": "~0.11.6",
|
"expo-linking": "2.3.1",
|
||||||
"expo-random": "~11.1.2",
|
"expo-localization": "10.2.0",
|
||||||
"expo-screen-capture": "^3.1.0",
|
"expo-notifications": "0.12.3",
|
||||||
"expo-secure-store": "~10.1.0",
|
"expo-permissions": "^12.1.1",
|
||||||
"expo-splash-screen": "~0.10.2",
|
"expo-random": "11.2.0",
|
||||||
"expo-status-bar": "~1.0.4",
|
"expo-screen-capture": "3.2.0",
|
||||||
"expo-store-review": "~4.0.2",
|
"expo-secure-store": "10.2.0",
|
||||||
"expo-video-thumbnails": "~5.1.0",
|
"expo-splash-screen": "0.11.4",
|
||||||
"expo-web-browser": "~9.1.0",
|
"expo-status-bar": "1.0.4",
|
||||||
"i18next": "^20.3.0",
|
"expo-store-review": "4.1.0",
|
||||||
"li": "^1.3.0",
|
"expo-updates": "^0.8.5",
|
||||||
"lodash": "^4.17.21",
|
"expo-video-thumbnails": "^5.2.1",
|
||||||
|
"expo-web-browser": "9.2.0",
|
||||||
|
"i18next": "20.6.1",
|
||||||
|
"li": "1.3.0",
|
||||||
|
"lodash": "4.17.21",
|
||||||
"react": "17.0.2",
|
"react": "17.0.2",
|
||||||
"react-dom": "17.0.2",
|
"react-dom": "17.0.2",
|
||||||
"react-i18next": "^11.9.0",
|
"react-i18next": "11.12.0",
|
||||||
"react-native": "~0.64.1",
|
"react-native": "0.64.2",
|
||||||
"react-native-animated-spinkit": "^1.5.2",
|
"react-native-animated-spinkit": "1.5.2",
|
||||||
"react-native-blurhash": "^1.1.4",
|
"react-native-blurhash": "1.1.5",
|
||||||
"react-native-fast-image": "^8.3.4",
|
"react-native-fast-image": "8.5.6",
|
||||||
"react-native-feather": "^1.0.2",
|
"react-native-feather": "1.1.2",
|
||||||
"react-native-flash-message": "^0.1.23",
|
"react-native-flash-message": "0.1.24",
|
||||||
"react-native-gesture-handler": "~1.10.3",
|
"react-native-gesture-handler": "1.10.3",
|
||||||
"react-native-htmlview": "^0.16.0",
|
"react-native-htmlview": "0.16.0",
|
||||||
"react-native-pager-view": "5.1.9",
|
"react-native-pager-view": "5.4.4",
|
||||||
"react-native-reanimated": "~2.1.0",
|
"react-native-reanimated": "2.2.2",
|
||||||
"react-native-safe-area-context": "3.2.0",
|
"react-native-safe-area-context": "3.2.0",
|
||||||
"react-native-screens": "~3.3.0",
|
"react-native-screens": "3.7.2",
|
||||||
"react-native-svg": "12.1.1",
|
"react-native-svg": "12.1.1",
|
||||||
"react-native-swipe-list-view": "^3.2.7",
|
"react-native-swipe-list-view": "3.2.9",
|
||||||
"react-native-tab-view": "^3.0.1",
|
"react-native-tab-view": "3.1.1",
|
||||||
"react-native-unimodules": "~0.13.3",
|
"react-native-unimodules": "0.14.8",
|
||||||
"react-query": "^3.16.0",
|
"react-query": "3.23.2",
|
||||||
"react-redux": "^7.2.4",
|
"react-redux": "7.2.5",
|
||||||
"react-timeago": "^5.2.0",
|
"react-timeago": "6.2.1",
|
||||||
"redux-persist": "^6.0.0",
|
"redux-persist": "6.0.0",
|
||||||
"rn-placeholder": "^3.0.3",
|
"rn-placeholder": "3.0.3",
|
||||||
"sentry-expo": "^3.1.3",
|
"sentry-expo": "4.0.1",
|
||||||
"tslib": "^2.2.0",
|
"tslib": "2.3.1",
|
||||||
"valid-url": "^1.0.9"
|
"valid-url": "1.0.9"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "~7.14.3",
|
"@babel/core": "7.15.5",
|
||||||
"@babel/plugin-proposal-optional-chaining": "^7.14.2",
|
"@babel/plugin-proposal-optional-chaining": "7.14.5",
|
||||||
"@babel/preset-typescript": "^7.13.0",
|
"@babel/preset-typescript": "7.15.0",
|
||||||
"@expo/config": "^3.3.43",
|
"@expo/config": "5.0.9",
|
||||||
"@jest/types": "^26.6.2",
|
"@jest/types": "27.1.0",
|
||||||
"@testing-library/jest-native": "^4.0.1",
|
"@testing-library/jest-native": "4.0.2",
|
||||||
"@testing-library/react-hooks": "^5.1.2",
|
"@testing-library/react-hooks": "7.0.1",
|
||||||
"@testing-library/react-native": "^7.2.0",
|
"@testing-library/react-native": "7.2.0",
|
||||||
"@types/jest": "^26.0.23",
|
"@types/jest": "27.0.1",
|
||||||
"@types/lodash": "^4.14.170",
|
"@types/lodash": "4.14.172",
|
||||||
"@types/react": "~17.0.8",
|
"@types/react": "17.0.19",
|
||||||
"@types/react-dom": "~17.0.5",
|
"@types/react-dom": "17.0.9",
|
||||||
"@types/react-native": "~0.64.6",
|
"@types/react-native": "0.64.13",
|
||||||
"@types/react-navigation": "^3.4.0",
|
"@types/react-navigation": "3.4.0",
|
||||||
"@types/react-redux": "^7.1.16",
|
"@types/react-redux": "7.1.18",
|
||||||
"@types/react-test-renderer": "^17.0.1",
|
"@types/react-test-renderer": "17.0.1",
|
||||||
"@types/react-timeago": "^4.1.2",
|
"@types/react-timeago": "4.1.3",
|
||||||
"@types/valid-url": "^1.0.3",
|
"@types/valid-url": "1.0.3",
|
||||||
"@welldone-software/why-did-you-render": "^6.1.4",
|
"@welldone-software/why-did-you-render": "6.2.1",
|
||||||
"babel-jest": "~26.6.3",
|
"babel-jest": "27.1.0",
|
||||||
"babel-plugin-module-resolver": "^4.1.0",
|
"babel-plugin-module-resolver": "4.1.0",
|
||||||
"babel-plugin-transform-remove-console": "^6.9.4",
|
"babel-plugin-transform-remove-console": "6.9.4",
|
||||||
"chalk": "^4.1.1",
|
"chalk": "4.1.2",
|
||||||
"dotenv": "^10.0.0",
|
"dotenv": "10.0.0",
|
||||||
"jest": "^26.6.3",
|
"jest": "27.1.0",
|
||||||
"jest-expo": "^41.0.0",
|
"jest-expo": "42.1.0",
|
||||||
"nock": "^13.0.11",
|
"nock": "13.1.3",
|
||||||
"react-native-clean-project": "^3.6.4",
|
"react-native-clean-project": "3.6.7",
|
||||||
"react-navigation": "^4.4.4",
|
"react-navigation": "4.4.4",
|
||||||
"react-navigation-stack": "^2.10.4",
|
"react-navigation-stack": "2.10.4",
|
||||||
"react-test-renderer": "^17.0.2",
|
"react-test-renderer": "17.0.2",
|
||||||
"typescript": "~4.2.4"
|
"typescript": "4.4.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,152 +0,0 @@
|
||||||
declare namespace Nav {
|
|
||||||
type RootStackParamList = {
|
|
||||||
'Screen-Tabs': undefined
|
|
||||||
'Screen-Actions':
|
|
||||||
| {
|
|
||||||
type: 'status'
|
|
||||||
queryKey: QueryKeyTimeline
|
|
||||||
rootQueryKey?: QueryKeyTimeline
|
|
||||||
status: Mastodon.Status
|
|
||||||
}
|
|
||||||
| {
|
|
||||||
type: 'account'
|
|
||||||
account: Mastodon.Account
|
|
||||||
}
|
|
||||||
| {
|
|
||||||
type: 'notifications_filter'
|
|
||||||
}
|
|
||||||
'Screen-Announcements': { showAll: boolean }
|
|
||||||
'Screen-Compose':
|
|
||||||
| {
|
|
||||||
type: 'edit'
|
|
||||||
incomingStatus: Mastodon.Status
|
|
||||||
replyToStatus?: Mastodon.Status
|
|
||||||
queryKey?: [
|
|
||||||
'Timeline',
|
|
||||||
{
|
|
||||||
page: App.Pages
|
|
||||||
hashtag?: Mastodon.Tag['name']
|
|
||||||
list?: Mastodon.List['id']
|
|
||||||
toot?: Mastodon.Status['id']
|
|
||||||
account?: Mastodon.Account['id']
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
| {
|
|
||||||
type: 'reply'
|
|
||||||
incomingStatus: Mastodon.Status
|
|
||||||
accts: Mastodon.Account['acct'][]
|
|
||||||
queryKey?: [
|
|
||||||
'Timeline',
|
|
||||||
{
|
|
||||||
page: App.Pages
|
|
||||||
hashtag?: Mastodon.Tag['name']
|
|
||||||
list?: Mastodon.List['id']
|
|
||||||
toot?: Mastodon.Status['id']
|
|
||||||
account?: Mastodon.Account['id']
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
| {
|
|
||||||
type: 'conversation'
|
|
||||||
accts: Mastodon.Account['acct'][]
|
|
||||||
}
|
|
||||||
| undefined
|
|
||||||
'Screen-ImagesViewer': {
|
|
||||||
imageUrls: {
|
|
||||||
id: Mastodon.Attachment['id']
|
|
||||||
preview_url: Mastodon.AttachmentImage['preview_url']
|
|
||||||
url: Mastodon.AttachmentImage['url']
|
|
||||||
remote_url?: Mastodon.AttachmentImage['remote_url']
|
|
||||||
blurhash: Mastodon.AttachmentImage['blurhash']
|
|
||||||
width?: number
|
|
||||||
height?: number
|
|
||||||
}[]
|
|
||||||
id: Mastodon.Attachment['id']
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type ScreenComposeStackParamList = {
|
|
||||||
'Screen-Compose-Root': undefined
|
|
||||||
'Screen-Compose-EditAttachment': { index: number }
|
|
||||||
'Screen-Compose-DraftsList': { timestamp: number }
|
|
||||||
}
|
|
||||||
|
|
||||||
type ScreenTabsStackParamList = {
|
|
||||||
'Tab-Local': undefined
|
|
||||||
'Tab-Public': undefined
|
|
||||||
'Tab-Compose': undefined
|
|
||||||
'Tab-Notifications': undefined
|
|
||||||
'Tab-Me': undefined
|
|
||||||
}
|
|
||||||
|
|
||||||
type TabSharedStackParamList = {
|
|
||||||
'Tab-Shared-Account': {
|
|
||||||
account: Mastodon.Account | Mastodon.Mention
|
|
||||||
}
|
|
||||||
'Tab-Shared-Attachments': { account: Mastodon.Account }
|
|
||||||
'Tab-Shared-Hashtag': {
|
|
||||||
hashtag: Mastodon.Tag['name']
|
|
||||||
}
|
|
||||||
'Tab-Shared-Search': { text: string | undefined }
|
|
||||||
'Tab-Shared-Toot': {
|
|
||||||
toot: Mastodon.Status
|
|
||||||
rootQueryKey?: QueryKeyTimeline
|
|
||||||
}
|
|
||||||
'Tab-Shared-Users':
|
|
||||||
| {
|
|
||||||
reference: 'accounts'
|
|
||||||
id: Mastodon.Account['id']
|
|
||||||
type: 'following' | 'followers'
|
|
||||||
count: number
|
|
||||||
}
|
|
||||||
| {
|
|
||||||
reference: 'statuses'
|
|
||||||
id: Mastodon.Status['id']
|
|
||||||
type: 'reblogged_by' | 'favourited_by'
|
|
||||||
count: number
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type TabLocalStackParamList = {
|
|
||||||
'Tab-Local-Root': undefined
|
|
||||||
} & TabSharedStackParamList
|
|
||||||
|
|
||||||
type TabPublicStackParamList = {
|
|
||||||
'Tab-Public-Root': undefined
|
|
||||||
} & TabSharedStackParamList
|
|
||||||
|
|
||||||
type TabNotificationsStackParamList = {
|
|
||||||
'Tab-Notifications-Root': undefined
|
|
||||||
} & TabSharedStackParamList
|
|
||||||
|
|
||||||
type TabMeStackParamList = {
|
|
||||||
'Tab-Me-Root': undefined
|
|
||||||
'Tab-Me-Bookmarks': undefined
|
|
||||||
'Tab-Me-Conversations': undefined
|
|
||||||
'Tab-Me-Favourites': undefined
|
|
||||||
'Tab-Me-Lists': undefined
|
|
||||||
'Tab-Me-Lists-List': {
|
|
||||||
list: Mastodon.List['id']
|
|
||||||
title: Mastodon.List['title']
|
|
||||||
}
|
|
||||||
'Tab-Me-Profile': undefined
|
|
||||||
'Tab-Me-Push': undefined
|
|
||||||
'Tab-Me-Settings': undefined
|
|
||||||
'Tab-Me-Settings-Fontsize': undefined
|
|
||||||
'Tab-Me-Switch': undefined
|
|
||||||
} & TabSharedStackParamList
|
|
||||||
|
|
||||||
type TabMeProfileStackParamList = {
|
|
||||||
'Tab-Me-Profile-Root': undefined
|
|
||||||
'Tab-Me-Profile-Name': {
|
|
||||||
display_name: Mastodon.Account['display_name']
|
|
||||||
}
|
|
||||||
'Tab-Me-Profile-Note': {
|
|
||||||
note: Mastodon.Source['note']
|
|
||||||
}
|
|
||||||
'Tab-Me-Profile-Fields': {
|
|
||||||
fields?: Mastodon.Source['fields']
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,13 +1,15 @@
|
||||||
import { HeaderCenter, HeaderLeft } from '@components/Header'
|
import { HeaderLeft } from '@components/Header'
|
||||||
import { displayMessage, Message, removeMessage } from '@components/Message'
|
import { displayMessage, Message, removeMessage } from '@components/Message'
|
||||||
import navigationRef from '@helpers/navigationRef'
|
import navigationRef from '@helpers/navigationRef'
|
||||||
import { useNetInfo } from '@react-native-community/netinfo'
|
import { useNetInfo } from '@react-native-community/netinfo'
|
||||||
import { NavigationContainer } from '@react-navigation/native'
|
import { NavigationContainer } from '@react-navigation/native'
|
||||||
|
import { createNativeStackNavigator } from '@react-navigation/native-stack'
|
||||||
import ScreenActions from '@screens/Actions'
|
import ScreenActions from '@screens/Actions'
|
||||||
import ScreenAnnouncements from '@screens/Announcements'
|
import ScreenAnnouncements from '@screens/Announcements'
|
||||||
import ScreenCompose from '@screens/Compose'
|
import ScreenCompose from '@screens/Compose'
|
||||||
import ScreenImagesViewer from '@screens/ImagesViewer'
|
import ScreenImagesViewer from '@screens/ImagesViewer'
|
||||||
import ScreenTabs from '@screens/Tabs'
|
import ScreenTabs from '@screens/Tabs'
|
||||||
|
import { RootStackParamList } from '@utils/navigation/navigators'
|
||||||
import pushUseConnect from '@utils/push/useConnect'
|
import pushUseConnect from '@utils/push/useConnect'
|
||||||
import pushUseReceive from '@utils/push/useReceive'
|
import pushUseReceive from '@utils/push/useReceive'
|
||||||
import pushUseRespond from '@utils/push/useRespond'
|
import pushUseRespond from '@utils/push/useRespond'
|
||||||
|
@ -22,12 +24,11 @@ import { addScreenshotListener } from 'expo-screen-capture'
|
||||||
import React, { useCallback, useEffect, useRef } from 'react'
|
import React, { useCallback, useEffect, useRef } from 'react'
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
import { Alert, Platform, StatusBar } from 'react-native'
|
import { Alert, Platform, StatusBar } from 'react-native'
|
||||||
import { createNativeStackNavigator } from 'react-native-screens/native-stack'
|
|
||||||
import { onlineManager, useQueryClient } from 'react-query'
|
import { onlineManager, useQueryClient } from 'react-query'
|
||||||
import { useDispatch, useSelector } from 'react-redux'
|
import { useDispatch, useSelector } from 'react-redux'
|
||||||
import * as Sentry from 'sentry-expo'
|
import * as Sentry from 'sentry-expo'
|
||||||
|
|
||||||
const Stack = createNativeStackNavigator<Nav.RootStackParamList>()
|
const Stack = createNativeStackNavigator<RootStackParamList>()
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
localCorrupt?: string
|
localCorrupt?: string
|
||||||
|
@ -71,9 +72,9 @@ const Screens: React.FC<Props> = ({ localCorrupt }) => {
|
||||||
(prev, next) => prev.length === next.length
|
(prev, next) => prev.length === next.length
|
||||||
)
|
)
|
||||||
const queryClient = useQueryClient()
|
const queryClient = useQueryClient()
|
||||||
pushUseConnect({ navigationRef, mode, t, instances, dispatch })
|
pushUseConnect({ mode, t, instances, dispatch })
|
||||||
pushUseReceive({ navigationRef, queryClient, instances })
|
pushUseReceive({ queryClient, instances })
|
||||||
pushUseRespond({ navigationRef, queryClient, instances, dispatch })
|
pushUseRespond({ queryClient, instances, dispatch })
|
||||||
|
|
||||||
// Prevent screenshot alert
|
// Prevent screenshot alert
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
@ -96,7 +97,7 @@ const Screens: React.FC<Props> = ({ localCorrupt }) => {
|
||||||
type: 'error',
|
type: 'error',
|
||||||
mode
|
mode
|
||||||
})
|
})
|
||||||
navigationRef.current?.navigate('Screen-Tabs', {
|
navigationRef.navigate('Screen-Tabs', {
|
||||||
screen: 'Tab-Me'
|
screen: 'Tab-Me'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -114,7 +115,7 @@ const Screens: React.FC<Props> = ({ localCorrupt }) => {
|
||||||
|
|
||||||
// Callbacks
|
// Callbacks
|
||||||
const navigationContainerOnReady = useCallback(() => {
|
const navigationContainerOnReady = useCallback(() => {
|
||||||
const currentRoute = navigationRef.current?.getCurrentRoute()
|
const currentRoute = navigationRef.getCurrentRoute()
|
||||||
routeRef.current = {
|
routeRef.current = {
|
||||||
name: currentRoute?.name,
|
name: currentRoute?.name,
|
||||||
params: currentRoute?.params
|
params: currentRoute?.params
|
||||||
|
@ -124,7 +125,7 @@ const Screens: React.FC<Props> = ({ localCorrupt }) => {
|
||||||
}, [])
|
}, [])
|
||||||
const navigationContainerOnStateChange = useCallback(() => {
|
const navigationContainerOnStateChange = useCallback(() => {
|
||||||
const previousRoute = routeRef.current
|
const previousRoute = routeRef.current
|
||||||
const currentRoute = navigationRef.current?.getCurrentRoute()
|
const currentRoute = navigationRef.getCurrentRoute()
|
||||||
|
|
||||||
const matchTabName = currentRoute?.name?.match(/(Tab-.*)-Root/)
|
const matchTabName = currentRoute?.name?.match(/(Tab-.*)-Root/)
|
||||||
if (matchTabName) {
|
if (matchTabName) {
|
||||||
|
@ -166,8 +167,8 @@ const Screens: React.FC<Props> = ({ localCorrupt }) => {
|
||||||
name='Screen-Actions'
|
name='Screen-Actions'
|
||||||
component={ScreenActions}
|
component={ScreenActions}
|
||||||
options={{
|
options={{
|
||||||
stackPresentation: 'transparentModal',
|
presentation: 'transparentModal',
|
||||||
stackAnimation: 'fade',
|
animation: 'fade',
|
||||||
headerShown: false
|
headerShown: false
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
@ -175,38 +176,33 @@ const Screens: React.FC<Props> = ({ localCorrupt }) => {
|
||||||
name='Screen-Announcements'
|
name='Screen-Announcements'
|
||||||
component={ScreenAnnouncements}
|
component={ScreenAnnouncements}
|
||||||
options={({ navigation }) => ({
|
options={({ navigation }) => ({
|
||||||
stackPresentation: 'transparentModal',
|
presentation: 'transparentModal',
|
||||||
stackAnimation: 'fade',
|
animation: 'fade',
|
||||||
headerShown: true,
|
headerShown: true,
|
||||||
headerHideShadow: true,
|
headerShadowVisible: false,
|
||||||
headerTopInsetEnabled: false,
|
headerTransparent: true,
|
||||||
headerStyle: { backgroundColor: 'transparent' },
|
headerStyle: { backgroundColor: 'transparent' },
|
||||||
headerLeft: () => (
|
headerLeft: () => (
|
||||||
<HeaderLeft content='X' onPress={() => navigation.goBack()} />
|
<HeaderLeft content='X' onPress={() => navigation.goBack()} />
|
||||||
),
|
),
|
||||||
headerTitle: t('screenAnnouncements:heading'),
|
headerTitle: t('screenAnnouncements:heading')
|
||||||
...(Platform.OS === 'android' && {
|
|
||||||
headerCenter: () => (
|
|
||||||
<HeaderCenter content={t('screenAnnouncements:heading')} />
|
|
||||||
)
|
|
||||||
})
|
|
||||||
})}
|
})}
|
||||||
/>
|
/>
|
||||||
<Stack.Screen
|
<Stack.Screen
|
||||||
name='Screen-Compose'
|
name='Screen-Compose'
|
||||||
component={ScreenCompose}
|
component={ScreenCompose}
|
||||||
options={{
|
options={{
|
||||||
stackPresentation: 'fullScreenModal',
|
headerShown: false,
|
||||||
...(Platform.OS === 'android' && { headerShown: false })
|
presentation: 'fullScreenModal'
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<Stack.Screen
|
<Stack.Screen
|
||||||
name='Screen-ImagesViewer'
|
name='Screen-ImagesViewer'
|
||||||
component={ScreenImagesViewer}
|
component={ScreenImagesViewer}
|
||||||
options={{
|
options={{
|
||||||
stackPresentation: 'fullScreenModal',
|
headerShown: false,
|
||||||
stackAnimation: 'fade',
|
presentation: 'fullScreenModal',
|
||||||
...(Platform.OS === 'android' && { headerShown: false })
|
animation: 'fade'
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Stack.Navigator>
|
</Stack.Navigator>
|
||||||
|
|
|
@ -46,7 +46,7 @@ const apiGeneral = async <T = unknown>({
|
||||||
params,
|
params,
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
'User-Agent': `tooot/${Constants.manifest.version}`,
|
'User-Agent': `tooot/${Constants.manifest?.version}`,
|
||||||
Accept: '*/*',
|
Accept: '*/*',
|
||||||
...headers
|
...headers
|
||||||
},
|
},
|
||||||
|
|
|
@ -68,7 +68,7 @@ const apiInstance = async <T = unknown>({
|
||||||
params,
|
params,
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
'User-Agent': `tooot/${Constants.manifest.version}`,
|
'User-Agent': `tooot/${Constants.manifest?.version}`,
|
||||||
Accept: '*/*',
|
Accept: '*/*',
|
||||||
...headers,
|
...headers,
|
||||||
...(token && {
|
...(token && {
|
||||||
|
|
|
@ -28,7 +28,7 @@ const apiTooot = async <T = unknown>({
|
||||||
body,
|
body,
|
||||||
sentry = false
|
sentry = false
|
||||||
}: Params): Promise<{ body: T }> => {
|
}: Params): Promise<{ body: T }> => {
|
||||||
const key = Constants.manifest.extra?.toootApiKey
|
const key = Constants.manifest?.extra?.toootApiKey
|
||||||
|
|
||||||
console.log(
|
console.log(
|
||||||
ctx.bgGreen.bold(' API tooot ') +
|
ctx.bgGreen.bold(' API tooot ') +
|
||||||
|
@ -49,7 +49,7 @@ const apiTooot = async <T = unknown>({
|
||||||
headers: {
|
headers: {
|
||||||
...(key && { 'x-tooot-key': key }),
|
...(key && { 'x-tooot-key': key }),
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
'User-Agent': `tooot/${Constants.manifest.version}`,
|
'User-Agent': `tooot/${Constants.manifest?.version}`,
|
||||||
Accept: '*/*',
|
Accept: '*/*',
|
||||||
...headers
|
...headers
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import { ParseEmojis } from '@components/Parse'
|
import { ParseEmojis } from '@components/Parse'
|
||||||
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 { 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, { useCallback } from 'react'
|
import React, { useCallback } from 'react'
|
||||||
|
@ -21,7 +22,7 @@ const ComponentAccount: React.FC<Props> = ({
|
||||||
}) => {
|
}) => {
|
||||||
const { theme } = useTheme()
|
const { theme } = useTheme()
|
||||||
const navigation = useNavigation<
|
const navigation = useNavigation<
|
||||||
StackNavigationProp<Nav.TabLocalStackParamList>
|
StackNavigationProp<TabLocalStackParamList>
|
||||||
>()
|
>()
|
||||||
|
|
||||||
const onPress = useCallback(() => {
|
const onPress = useCallback(() => {
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { useNavigation } from '@react-navigation/native'
|
import { useNavigation } from '@react-navigation/native'
|
||||||
|
import { TabMeStackNavigationProp } from '@utils/navigation/navigators'
|
||||||
import addInstance from '@utils/slices/instances/add'
|
import addInstance from '@utils/slices/instances/add'
|
||||||
import { Instance } from '@utils/slices/instancesSlice'
|
import { Instance } from '@utils/slices/instancesSlice'
|
||||||
import * as AuthSession from 'expo-auth-session'
|
import * as AuthSession from 'expo-auth-session'
|
||||||
|
@ -21,7 +22,9 @@ const InstanceAuth = React.memo(
|
||||||
useProxy: false
|
useProxy: false
|
||||||
})
|
})
|
||||||
|
|
||||||
const navigation = useNavigation()
|
const navigation = useNavigation<
|
||||||
|
TabMeStackNavigationProp<'Tab-Me-Root' | 'Tab-Me-Switch'>
|
||||||
|
>()
|
||||||
const queryClient = useQueryClient()
|
const queryClient = useQueryClient()
|
||||||
const dispatch = useDispatch()
|
const dispatch = useDispatch()
|
||||||
|
|
||||||
|
|
|
@ -10,10 +10,9 @@ import TimelinePoll from '@components/Timeline/Shared/Poll'
|
||||||
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 { QueryKeyTimeline } from '@utils/queryHooks/timeline'
|
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
|
||||||
import { getInstance, getInstanceAccount } from '@utils/slices/instancesSlice'
|
import { getInstanceAccount } from '@utils/slices/instancesSlice'
|
||||||
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 htmlparser2 from 'htmlparser2-without-node-native'
|
|
||||||
import { uniqBy } from 'lodash'
|
import { uniqBy } from 'lodash'
|
||||||
import React, { useCallback } from 'react'
|
import React, { useCallback } from 'react'
|
||||||
import { Pressable, StyleSheet, View } from 'react-native'
|
import { Pressable, StyleSheet, View } from 'react-native'
|
||||||
|
|
|
@ -6,6 +6,7 @@ import AttachmentImage from '@components/Timeline/Shared/Attachment/Image'
|
||||||
import AttachmentUnsupported from '@components/Timeline/Shared/Attachment/Unsupported'
|
import AttachmentUnsupported from '@components/Timeline/Shared/Attachment/Unsupported'
|
||||||
import AttachmentVideo from '@components/Timeline/Shared/Attachment/Video'
|
import AttachmentVideo from '@components/Timeline/Shared/Attachment/Video'
|
||||||
import { useNavigation } from '@react-navigation/native'
|
import { useNavigation } from '@react-navigation/native'
|
||||||
|
import { RootStackParamList } from '@utils/navigation/navigators'
|
||||||
import { StyleConstants } from '@utils/styles/constants'
|
import { StyleConstants } from '@utils/styles/constants'
|
||||||
import layoutAnimation from '@utils/styles/layoutAnimation'
|
import layoutAnimation from '@utils/styles/layoutAnimation'
|
||||||
import React, { useCallback, useMemo, useRef, useState } from 'react'
|
import React, { useCallback, useMemo, useRef, useState } from 'react'
|
||||||
|
@ -35,7 +36,7 @@ const TimelineAttachment = React.memo(
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
const imageUrls = useRef<
|
const imageUrls = useRef<
|
||||||
Nav.RootStackParamList['Screen-ImagesViewer']['imageUrls']
|
RootStackParamList['Screen-ImagesViewer']['imageUrls']
|
||||||
>([])
|
>([])
|
||||||
const navigation = useNavigation()
|
const navigation = useNavigation()
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|
|
@ -1,8 +1,14 @@
|
||||||
import Button from '@components/Button'
|
import Button from '@components/Button'
|
||||||
import { StyleConstants } from '@utils/styles/constants'
|
import { StyleConstants } from '@utils/styles/constants'
|
||||||
import { Video } from 'expo-av'
|
import { Video } from 'expo-av'
|
||||||
import React, { useCallback, useRef, useState } from 'react'
|
import React, { useCallback, useEffect, useRef, useState } from 'react'
|
||||||
import { Pressable, StyleSheet, View } from 'react-native'
|
import {
|
||||||
|
AppState,
|
||||||
|
AppStateStatus,
|
||||||
|
Pressable,
|
||||||
|
StyleSheet,
|
||||||
|
View
|
||||||
|
} from 'react-native'
|
||||||
import { Blurhash } from 'react-native-blurhash'
|
import { Blurhash } from 'react-native-blurhash'
|
||||||
import attachmentAspectRatio from './aspectRatio'
|
import attachmentAspectRatio from './aspectRatio'
|
||||||
import analytics from '@components/analytics'
|
import analytics from '@components/analytics'
|
||||||
|
@ -45,15 +51,43 @@ const AttachmentVideo: React.FC<Props> = ({
|
||||||
videoPlayer.current?.setOnPlaybackStatusUpdate(props => {
|
videoPlayer.current?.setOnPlaybackStatusUpdate(props => {
|
||||||
if (props.isLoaded) {
|
if (props.isLoaded) {
|
||||||
setVideoLoaded(true)
|
setVideoLoaded(true)
|
||||||
}
|
if (props.positionMillis) {
|
||||||
// @ts-ignore
|
setVideoPosition(props.positionMillis)
|
||||||
if (props.positionMillis) {
|
}
|
||||||
// @ts-ignore
|
|
||||||
setVideoPosition(props.positionMillis)
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}, [videoLoaded, videoPosition])
|
}, [videoLoaded, videoPosition])
|
||||||
|
|
||||||
|
const appState = useRef(AppState.currentState)
|
||||||
|
useEffect(() => {
|
||||||
|
AppState.addEventListener('change', _handleAppStateChange)
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
AppState.removeEventListener('change', _handleAppStateChange)
|
||||||
|
}
|
||||||
|
}, [])
|
||||||
|
const _handleAppStateChange = async (nextAppState: AppStateStatus) => {
|
||||||
|
if (appState.current.match(/active/) && nextAppState.match(/inactive/)) {
|
||||||
|
await videoPlayer.current?.pauseAsync()
|
||||||
|
} else if (
|
||||||
|
gifv &&
|
||||||
|
appState.current.match(/background/) &&
|
||||||
|
nextAppState.match(/active/)
|
||||||
|
) {
|
||||||
|
await videoPlayer.current?.setIsMutedAsync(true)
|
||||||
|
await videoPlayer.current?.playAsync()
|
||||||
|
}
|
||||||
|
|
||||||
|
appState.current = nextAppState
|
||||||
|
}
|
||||||
|
|
||||||
|
const playerStatus = useRef<any>(null)
|
||||||
|
useEffect(() => {
|
||||||
|
videoPlayer.current?.setOnPlaybackStatusUpdate(playbackStatus => {
|
||||||
|
playerStatus.current = playbackStatus
|
||||||
|
})
|
||||||
|
}, [])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<View
|
<View
|
||||||
style={[
|
style={[
|
||||||
|
@ -83,16 +117,15 @@ const AttachmentVideo: React.FC<Props> = ({
|
||||||
posterStyle: { resizeMode: 'cover' }
|
posterStyle: { resizeMode: 'cover' }
|
||||||
})}
|
})}
|
||||||
useNativeControls={false}
|
useNativeControls={false}
|
||||||
onFullscreenUpdate={event => {
|
onFullscreenUpdate={async event => {
|
||||||
if (
|
if (
|
||||||
event.fullscreenUpdate ===
|
event.fullscreenUpdate ===
|
||||||
Video.FULLSCREEN_UPDATE_PLAYER_DID_DISMISS
|
Video.FULLSCREEN_UPDATE_PLAYER_DID_DISMISS
|
||||||
) {
|
) {
|
||||||
if (gifv) {
|
if (gifv) {
|
||||||
videoPlayer.current?.setIsLoopingAsync(true)
|
await videoPlayer.current?.pauseAsync()
|
||||||
videoPlayer.current?.playAsync()
|
|
||||||
} else {
|
} else {
|
||||||
videoPlayer.current?.pauseAsync()
|
await videoPlayer.current?.pauseAsync()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
|
@ -108,7 +141,7 @@ const AttachmentVideo: React.FC<Props> = ({
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
) : null
|
) : null
|
||||||
) : !gifv ? (
|
) : !gifv || (gifv && playerStatus.current === false) ? (
|
||||||
<Button
|
<Button
|
||||||
round
|
round
|
||||||
overlay
|
overlay
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import apiInstance from '@api/instance'
|
import apiInstance from '@api/instance'
|
||||||
import navigationRef from '@helpers/navigationRef'
|
import navigationRef from '@helpers/navigationRef'
|
||||||
import { NavigationProp, ParamListBase } from '@react-navigation/native'
|
|
||||||
import { store } from '@root/store'
|
import { store } from '@root/store'
|
||||||
import { SearchResult } from '@utils/queryHooks/search'
|
import { SearchResult } from '@utils/queryHooks/search'
|
||||||
import { getInstanceUrl } from '@utils/slices/instancesSlice'
|
import { getInstanceUrl } from '@utils/slices/instancesSlice'
|
||||||
|
@ -22,24 +21,7 @@ const matcherAccount = new RegExp(
|
||||||
|
|
||||||
export let loadingLink = false
|
export let loadingLink = false
|
||||||
|
|
||||||
const openLink = async (
|
const openLink = async (url: string, navigation?: any) => {
|
||||||
url: string,
|
|
||||||
navigation?: NavigationProp<
|
|
||||||
ParamListBase,
|
|
||||||
string,
|
|
||||||
Readonly<{
|
|
||||||
key: string
|
|
||||||
index: number
|
|
||||||
routeNames: string[]
|
|
||||||
history?: unknown[] | undefined
|
|
||||||
routes: any[]
|
|
||||||
type: string
|
|
||||||
stale: false
|
|
||||||
}>,
|
|
||||||
{},
|
|
||||||
{}
|
|
||||||
>
|
|
||||||
) => {
|
|
||||||
if (loadingLink) {
|
if (loadingLink) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -52,7 +34,7 @@ const openLink = async (
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
navigation.push(page, options)
|
navigation.push(page, options)
|
||||||
} else {
|
} else {
|
||||||
navigationRef.current?.navigate(page, options)
|
navigationRef.navigate(page, options)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { NavigationContainerRef } from '@react-navigation/native'
|
import { createNavigationContainerRef } from '@react-navigation/native'
|
||||||
import { createRef } from 'react'
|
import { RootStackParamList } from '@utils/navigation/navigators'
|
||||||
|
|
||||||
const navigationRef = createRef<NavigationContainerRef>()
|
const navigationRef = createNavigationContainerRef<RootStackParamList>()
|
||||||
|
|
||||||
export default navigationRef
|
export default navigationRef
|
||||||
|
|
|
@ -1,22 +1,244 @@
|
||||||
import { StackScreenProps } from '@react-navigation/stack'
|
import analytics from '@components/analytics'
|
||||||
import React from 'react'
|
import Button from '@components/Button'
|
||||||
import { SafeAreaProvider } from 'react-native-safe-area-context'
|
import { RootStackScreenProps } from '@utils/navigation/navigators'
|
||||||
import ScreenActionsRoot from './Actions/Root'
|
import {
|
||||||
|
getInstanceAccount,
|
||||||
export type ScreenAccountProp = StackScreenProps<
|
getInstanceUrl
|
||||||
Nav.RootStackParamList,
|
} from '@utils/slices/instancesSlice'
|
||||||
'Screen-Actions'
|
import { StyleConstants } from '@utils/styles/constants'
|
||||||
>
|
import { useTheme } from '@utils/styles/ThemeManager'
|
||||||
|
import React, { useCallback, useEffect, useMemo } from 'react'
|
||||||
|
import { useTranslation } from 'react-i18next'
|
||||||
|
import { Dimensions, StyleSheet, View } from 'react-native'
|
||||||
|
import {
|
||||||
|
PanGestureHandler,
|
||||||
|
State,
|
||||||
|
TapGestureHandler
|
||||||
|
} from 'react-native-gesture-handler'
|
||||||
|
import Animated, {
|
||||||
|
Extrapolate,
|
||||||
|
interpolate,
|
||||||
|
runOnJS,
|
||||||
|
useAnimatedGestureHandler,
|
||||||
|
useAnimatedStyle,
|
||||||
|
useSharedValue,
|
||||||
|
withTiming
|
||||||
|
} from 'react-native-reanimated'
|
||||||
|
import {
|
||||||
|
SafeAreaProvider,
|
||||||
|
useSafeAreaInsets
|
||||||
|
} from 'react-native-safe-area-context'
|
||||||
|
import { useSelector } from 'react-redux'
|
||||||
|
import ActionsAccount from './Actions/Account'
|
||||||
|
import ActionsDomain from './Actions/Domain'
|
||||||
|
import ActionsNotificationsFilter from './Actions/NotificationsFilter'
|
||||||
|
import ActionsShare from './Actions/Share'
|
||||||
|
import ActionsStatus from './Actions/Status'
|
||||||
|
|
||||||
const ScreenActions = React.memo(
|
const ScreenActions = React.memo(
|
||||||
(props: ScreenAccountProp) => {
|
({
|
||||||
|
route: { params },
|
||||||
|
navigation
|
||||||
|
}: RootStackScreenProps<'Screen-Actions'>) => {
|
||||||
|
const { t } = useTranslation()
|
||||||
|
|
||||||
|
const instanceAccount = useSelector(
|
||||||
|
getInstanceAccount,
|
||||||
|
(prev, next) => prev?.id === next?.id
|
||||||
|
)
|
||||||
|
let sameAccount = false
|
||||||
|
switch (params.type) {
|
||||||
|
case 'status':
|
||||||
|
sameAccount = instanceAccount?.id === params.status.account.id
|
||||||
|
break
|
||||||
|
case 'account':
|
||||||
|
sameAccount = instanceAccount?.id === params.account.id
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
const instanceDomain = useSelector(getInstanceUrl)
|
||||||
|
let sameDomain = true
|
||||||
|
let statusDomain: string
|
||||||
|
switch (params.type) {
|
||||||
|
case 'status':
|
||||||
|
statusDomain = params.status.uri
|
||||||
|
? params.status.uri.split(new RegExp(/\/\/(.*?)\//))[1]
|
||||||
|
: ''
|
||||||
|
sameDomain = instanceDomain === statusDomain
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
const { theme } = useTheme()
|
||||||
|
const insets = useSafeAreaInsets()
|
||||||
|
|
||||||
|
const DEFAULT_VALUE = 350
|
||||||
|
const screenHeight = Dimensions.get('screen').height
|
||||||
|
const panY = useSharedValue(DEFAULT_VALUE)
|
||||||
|
useEffect(() => {
|
||||||
|
panY.value = withTiming(0)
|
||||||
|
}, [])
|
||||||
|
const styleTop = useAnimatedStyle(() => {
|
||||||
|
return {
|
||||||
|
bottom: interpolate(
|
||||||
|
panY.value,
|
||||||
|
[0, screenHeight],
|
||||||
|
[0, -screenHeight],
|
||||||
|
Extrapolate.CLAMP
|
||||||
|
)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
const dismiss = useCallback(() => {
|
||||||
|
navigation.goBack()
|
||||||
|
}, [])
|
||||||
|
const onGestureEvent = useAnimatedGestureHandler({
|
||||||
|
onActive: ({ translationY }) => {
|
||||||
|
panY.value = translationY
|
||||||
|
},
|
||||||
|
onEnd: ({ velocityY }) => {
|
||||||
|
if (velocityY > 500) {
|
||||||
|
runOnJS(dismiss)()
|
||||||
|
} else {
|
||||||
|
panY.value = withTiming(0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const actions = useMemo(() => {
|
||||||
|
switch (params.type) {
|
||||||
|
case 'status':
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{!sameAccount ? (
|
||||||
|
<ActionsAccount
|
||||||
|
queryKey={params.queryKey}
|
||||||
|
rootQueryKey={params.rootQueryKey}
|
||||||
|
account={params.status.account}
|
||||||
|
dismiss={dismiss}
|
||||||
|
/>
|
||||||
|
) : null}
|
||||||
|
{sameAccount && params.status ? (
|
||||||
|
<ActionsStatus
|
||||||
|
navigation={navigation}
|
||||||
|
queryKey={params.queryKey}
|
||||||
|
rootQueryKey={params.rootQueryKey}
|
||||||
|
status={params.status}
|
||||||
|
dismiss={dismiss}
|
||||||
|
/>
|
||||||
|
) : null}
|
||||||
|
{!sameDomain && statusDomain ? (
|
||||||
|
<ActionsDomain
|
||||||
|
queryKey={params.queryKey}
|
||||||
|
rootQueryKey={params.rootQueryKey}
|
||||||
|
domain={statusDomain}
|
||||||
|
dismiss={dismiss}
|
||||||
|
/>
|
||||||
|
) : null}
|
||||||
|
{params.status.visibility !== 'direct' ? (
|
||||||
|
<ActionsShare
|
||||||
|
url={params.status.url || params.status.uri}
|
||||||
|
type={params.type}
|
||||||
|
dismiss={dismiss}
|
||||||
|
/>
|
||||||
|
) : null}
|
||||||
|
<Button
|
||||||
|
type='text'
|
||||||
|
content={t('common:buttons.cancel')}
|
||||||
|
onPress={() => {
|
||||||
|
analytics('bottomsheet_acknowledge')
|
||||||
|
}}
|
||||||
|
style={styles.button}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
case 'account':
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{!sameAccount ? (
|
||||||
|
<ActionsAccount account={params.account} dismiss={dismiss} />
|
||||||
|
) : null}
|
||||||
|
<ActionsShare
|
||||||
|
url={params.account.url}
|
||||||
|
type={params.type}
|
||||||
|
dismiss={dismiss}
|
||||||
|
/>
|
||||||
|
<Button
|
||||||
|
type='text'
|
||||||
|
content={t('common:buttons.cancel')}
|
||||||
|
onPress={() => {
|
||||||
|
analytics('bottomsheet_acknowledge')
|
||||||
|
}}
|
||||||
|
style={styles.button}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
case 'notifications_filter':
|
||||||
|
return <ActionsNotificationsFilter />
|
||||||
|
}
|
||||||
|
}, [])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<SafeAreaProvider>
|
<SafeAreaProvider>
|
||||||
<ScreenActionsRoot {...props} />
|
<Animated.View style={{ flex: 1 }}>
|
||||||
|
<TapGestureHandler
|
||||||
|
onHandlerStateChange={({ nativeEvent }) => {
|
||||||
|
if (nativeEvent.state === State.ACTIVE) {
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Animated.View
|
||||||
|
style={[
|
||||||
|
styles.overlay,
|
||||||
|
{ backgroundColor: theme.backgroundOverlayInvert }
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<PanGestureHandler onGestureEvent={onGestureEvent}>
|
||||||
|
<Animated.View
|
||||||
|
style={[
|
||||||
|
styles.container,
|
||||||
|
styleTop,
|
||||||
|
{
|
||||||
|
backgroundColor: theme.backgroundDefault,
|
||||||
|
paddingBottom: insets.bottom || StyleConstants.Spacing.L
|
||||||
|
}
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<View
|
||||||
|
style={[
|
||||||
|
styles.handle,
|
||||||
|
{ backgroundColor: theme.primaryOverlay }
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
{actions}
|
||||||
|
</Animated.View>
|
||||||
|
</PanGestureHandler>
|
||||||
|
</Animated.View>
|
||||||
|
</TapGestureHandler>
|
||||||
|
</Animated.View>
|
||||||
</SafeAreaProvider>
|
</SafeAreaProvider>
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
() => true
|
() => true
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
overlay: {
|
||||||
|
flex: 1,
|
||||||
|
justifyContent: 'flex-end'
|
||||||
|
},
|
||||||
|
container: {
|
||||||
|
paddingTop: StyleConstants.Spacing.M
|
||||||
|
},
|
||||||
|
handle: {
|
||||||
|
alignSelf: 'center',
|
||||||
|
width: StyleConstants.Spacing.S * 8,
|
||||||
|
height: StyleConstants.Spacing.S / 2,
|
||||||
|
borderRadius: 100,
|
||||||
|
top: -StyleConstants.Spacing.M * 2
|
||||||
|
},
|
||||||
|
button: {
|
||||||
|
marginHorizontal: StyleConstants.Spacing.Global.PagePadding * 2
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
export default ScreenActions
|
export default ScreenActions
|
||||||
|
|
|
@ -1,241 +0,0 @@
|
||||||
import analytics from '@components/analytics'
|
|
||||||
import Button from '@components/Button'
|
|
||||||
import { StackScreenProps } from '@react-navigation/stack'
|
|
||||||
import {
|
|
||||||
getInstanceAccount,
|
|
||||||
getInstanceUrl
|
|
||||||
} from '@utils/slices/instancesSlice'
|
|
||||||
import { StyleConstants } from '@utils/styles/constants'
|
|
||||||
import { useTheme } from '@utils/styles/ThemeManager'
|
|
||||||
import React, { useCallback, useEffect, useMemo } from 'react'
|
|
||||||
import { useTranslation } from 'react-i18next'
|
|
||||||
import { Dimensions, StyleSheet, View } from 'react-native'
|
|
||||||
import {
|
|
||||||
PanGestureHandler,
|
|
||||||
State,
|
|
||||||
TapGestureHandler
|
|
||||||
} from 'react-native-gesture-handler'
|
|
||||||
import Animated, {
|
|
||||||
Extrapolate,
|
|
||||||
interpolate,
|
|
||||||
runOnJS,
|
|
||||||
useAnimatedGestureHandler,
|
|
||||||
useAnimatedStyle,
|
|
||||||
useSharedValue,
|
|
||||||
withTiming
|
|
||||||
} from 'react-native-reanimated'
|
|
||||||
import { useSafeAreaInsets } from 'react-native-safe-area-context'
|
|
||||||
import { useSelector } from 'react-redux'
|
|
||||||
import ActionsAccount from './Account'
|
|
||||||
import ActionsDomain from './Domain'
|
|
||||||
import ActionsNotificationsFilter from './NotificationsFilter'
|
|
||||||
import ActionsShare from './Share'
|
|
||||||
import ActionsStatus from './Status'
|
|
||||||
|
|
||||||
export type ScreenAccountProp = StackScreenProps<
|
|
||||||
Nav.RootStackParamList,
|
|
||||||
'Screen-Actions'
|
|
||||||
>
|
|
||||||
|
|
||||||
const ScreenActionsRoot = React.memo(
|
|
||||||
({ route: { params }, navigation }: ScreenAccountProp) => {
|
|
||||||
const { t } = useTranslation()
|
|
||||||
|
|
||||||
const instanceAccount = useSelector(
|
|
||||||
getInstanceAccount,
|
|
||||||
(prev, next) => prev?.id === next?.id
|
|
||||||
)
|
|
||||||
let sameAccount = false
|
|
||||||
switch (params.type) {
|
|
||||||
case 'status':
|
|
||||||
sameAccount = instanceAccount?.id === params.status.account.id
|
|
||||||
break
|
|
||||||
case 'account':
|
|
||||||
sameAccount = instanceAccount?.id === params.account.id
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
const instanceDomain = useSelector(getInstanceUrl)
|
|
||||||
let sameDomain = true
|
|
||||||
let statusDomain: string
|
|
||||||
switch (params.type) {
|
|
||||||
case 'status':
|
|
||||||
statusDomain = params.status.uri
|
|
||||||
? params.status.uri.split(new RegExp(/\/\/(.*?)\//))[1]
|
|
||||||
: ''
|
|
||||||
sameDomain = instanceDomain === statusDomain
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
const { theme } = useTheme()
|
|
||||||
const insets = useSafeAreaInsets()
|
|
||||||
|
|
||||||
const DEFAULT_VALUE = 350
|
|
||||||
const screenHeight = Dimensions.get('screen').height
|
|
||||||
const panY = useSharedValue(DEFAULT_VALUE)
|
|
||||||
useEffect(() => {
|
|
||||||
panY.value = withTiming(0)
|
|
||||||
}, [])
|
|
||||||
const styleTop = useAnimatedStyle(() => {
|
|
||||||
return {
|
|
||||||
bottom: interpolate(
|
|
||||||
panY.value,
|
|
||||||
[0, screenHeight],
|
|
||||||
[0, -screenHeight],
|
|
||||||
Extrapolate.CLAMP
|
|
||||||
)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
const dismiss = useCallback(() => {
|
|
||||||
navigation.goBack()
|
|
||||||
}, [])
|
|
||||||
const onGestureEvent = useAnimatedGestureHandler({
|
|
||||||
onActive: ({ translationY }) => {
|
|
||||||
panY.value = translationY
|
|
||||||
},
|
|
||||||
onEnd: ({ velocityY }) => {
|
|
||||||
if (velocityY > 500) {
|
|
||||||
runOnJS(dismiss)()
|
|
||||||
} else {
|
|
||||||
panY.value = withTiming(0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
const actions = useMemo(() => {
|
|
||||||
switch (params.type) {
|
|
||||||
case 'status':
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
{!sameAccount ? (
|
|
||||||
<ActionsAccount
|
|
||||||
queryKey={params.queryKey}
|
|
||||||
rootQueryKey={params.rootQueryKey}
|
|
||||||
account={params.status.account}
|
|
||||||
dismiss={dismiss}
|
|
||||||
/>
|
|
||||||
) : null}
|
|
||||||
{sameAccount && params.status ? (
|
|
||||||
<ActionsStatus
|
|
||||||
navigation={navigation}
|
|
||||||
queryKey={params.queryKey}
|
|
||||||
rootQueryKey={params.rootQueryKey}
|
|
||||||
status={params.status}
|
|
||||||
dismiss={dismiss}
|
|
||||||
/>
|
|
||||||
) : null}
|
|
||||||
{!sameDomain && statusDomain ? (
|
|
||||||
<ActionsDomain
|
|
||||||
queryKey={params.queryKey}
|
|
||||||
rootQueryKey={params.rootQueryKey}
|
|
||||||
domain={statusDomain}
|
|
||||||
dismiss={dismiss}
|
|
||||||
/>
|
|
||||||
) : null}
|
|
||||||
{params.status.visibility !== 'direct' ? (
|
|
||||||
<ActionsShare
|
|
||||||
url={params.status.url || params.status.uri}
|
|
||||||
type={params.type}
|
|
||||||
dismiss={dismiss}
|
|
||||||
/>
|
|
||||||
) : null}
|
|
||||||
<Button
|
|
||||||
type='text'
|
|
||||||
content={t('common:buttons.cancel')}
|
|
||||||
onPress={() => {
|
|
||||||
analytics('bottomsheet_acknowledge')
|
|
||||||
}}
|
|
||||||
style={styles.button}
|
|
||||||
/>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
case 'account':
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
{!sameAccount ? (
|
|
||||||
<ActionsAccount account={params.account} dismiss={dismiss} />
|
|
||||||
) : null}
|
|
||||||
<ActionsShare
|
|
||||||
url={params.account.url}
|
|
||||||
type={params.type}
|
|
||||||
dismiss={dismiss}
|
|
||||||
/>
|
|
||||||
<Button
|
|
||||||
type='text'
|
|
||||||
content={t('common:buttons.cancel')}
|
|
||||||
onPress={() => {
|
|
||||||
analytics('bottomsheet_acknowledge')
|
|
||||||
}}
|
|
||||||
style={styles.button}
|
|
||||||
/>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
case 'notifications_filter':
|
|
||||||
return <ActionsNotificationsFilter />
|
|
||||||
}
|
|
||||||
}, [])
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Animated.View style={{ flex: 1 }}>
|
|
||||||
<TapGestureHandler
|
|
||||||
onHandlerStateChange={({ nativeEvent }) => {
|
|
||||||
if (nativeEvent.state === State.ACTIVE) {
|
|
||||||
dismiss()
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Animated.View
|
|
||||||
style={[
|
|
||||||
styles.overlay,
|
|
||||||
{ backgroundColor: theme.backgroundOverlayInvert }
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
<PanGestureHandler onGestureEvent={onGestureEvent}>
|
|
||||||
<Animated.View
|
|
||||||
style={[
|
|
||||||
styles.container,
|
|
||||||
styleTop,
|
|
||||||
{
|
|
||||||
backgroundColor: theme.backgroundDefault,
|
|
||||||
paddingBottom: insets.bottom || StyleConstants.Spacing.L
|
|
||||||
}
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
<View
|
|
||||||
style={[
|
|
||||||
styles.handle,
|
|
||||||
{ backgroundColor: theme.primaryOverlay }
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
{actions}
|
|
||||||
</Animated.View>
|
|
||||||
</PanGestureHandler>
|
|
||||||
</Animated.View>
|
|
||||||
</TapGestureHandler>
|
|
||||||
</Animated.View>
|
|
||||||
)
|
|
||||||
},
|
|
||||||
() => true
|
|
||||||
)
|
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
|
||||||
overlay: {
|
|
||||||
flex: 1,
|
|
||||||
justifyContent: 'flex-end'
|
|
||||||
},
|
|
||||||
container: {
|
|
||||||
paddingTop: StyleConstants.Spacing.M
|
|
||||||
},
|
|
||||||
handle: {
|
|
||||||
alignSelf: 'center',
|
|
||||||
width: StyleConstants.Spacing.S * 8,
|
|
||||||
height: StyleConstants.Spacing.S / 2,
|
|
||||||
borderRadius: 100,
|
|
||||||
top: -StyleConstants.Spacing.M * 2
|
|
||||||
},
|
|
||||||
button: {
|
|
||||||
marginHorizontal: StyleConstants.Spacing.Global.PagePadding * 2
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
export default ScreenActionsRoot
|
|
|
@ -9,13 +9,14 @@ import {
|
||||||
useTimelineMutation
|
useTimelineMutation
|
||||||
} from '@utils/queryHooks/timeline'
|
} from '@utils/queryHooks/timeline'
|
||||||
import analytics from '@components/analytics'
|
import analytics from '@components/analytics'
|
||||||
import { StackNavigationProp } from '@react-navigation/stack'
|
|
||||||
import { displayMessage } from '@components/Message'
|
import { displayMessage } from '@components/Message'
|
||||||
import { useTheme } from '@utils/styles/ThemeManager'
|
import { useTheme } from '@utils/styles/ThemeManager'
|
||||||
import apiInstance from '@api/instance'
|
import apiInstance from '@api/instance'
|
||||||
|
import { NativeStackNavigationProp } from '@react-navigation/native-stack'
|
||||||
|
import { RootStackParamList } from '@utils/navigation/navigators'
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
navigation: StackNavigationProp<Nav.RootStackParamList, 'Screen-Actions'>
|
navigation: NativeStackNavigationProp<RootStackParamList, 'Screen-Actions'>
|
||||||
queryKey: QueryKeyTimeline
|
queryKey: QueryKeyTimeline
|
||||||
rootQueryKey?: QueryKeyTimeline
|
rootQueryKey?: QueryKeyTimeline
|
||||||
status: Mastodon.Status
|
status: Mastodon.Status
|
||||||
|
|
|
@ -4,8 +4,8 @@ import haptics from '@components/haptics'
|
||||||
import { ParseHTML } from '@components/Parse'
|
import { ParseHTML } from '@components/Parse'
|
||||||
import RelativeTime from '@components/RelativeTime'
|
import RelativeTime from '@components/RelativeTime'
|
||||||
import { BlurView } from '@react-native-community/blur'
|
import { BlurView } from '@react-native-community/blur'
|
||||||
import { StackScreenProps } from '@react-navigation/stack'
|
|
||||||
import { useAccessibility } from '@utils/accessibility/AccessibilityManager'
|
import { useAccessibility } from '@utils/accessibility/AccessibilityManager'
|
||||||
|
import { RootStackScreenProps } from '@utils/navigation/navigators'
|
||||||
import {
|
import {
|
||||||
useAnnouncementMutation,
|
useAnnouncementMutation,
|
||||||
useAnnouncementQuery
|
useAnnouncementQuery
|
||||||
|
@ -20,12 +20,9 @@ import FastImage from 'react-native-fast-image'
|
||||||
import { FlatList, ScrollView } from 'react-native-gesture-handler'
|
import { FlatList, ScrollView } from 'react-native-gesture-handler'
|
||||||
import { SafeAreaView } from 'react-native-safe-area-context'
|
import { SafeAreaView } from 'react-native-safe-area-context'
|
||||||
|
|
||||||
export type ScreenAnnouncementsProp = StackScreenProps<
|
const ScreenAnnouncements: React.FC<RootStackScreenProps<
|
||||||
Nav.RootStackParamList,
|
|
||||||
'Screen-Announcements'
|
'Screen-Announcements'
|
||||||
>
|
>> = ({
|
||||||
|
|
||||||
const ScreenAnnouncements: React.FC<ScreenAnnouncementsProp> = ({
|
|
||||||
route: {
|
route: {
|
||||||
params: { showAll = false }
|
params: { showAll = false }
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
import analytics from '@components/analytics'
|
import analytics from '@components/analytics'
|
||||||
import { HeaderCenter, HeaderLeft, HeaderRight } from '@components/Header'
|
import { HeaderCenter, HeaderLeft, HeaderRight } from '@components/Header'
|
||||||
import { StackScreenProps } from '@react-navigation/stack'
|
import { createNativeStackNavigator } from '@react-navigation/native-stack'
|
||||||
import haptics from '@root/components/haptics'
|
import haptics from '@root/components/haptics'
|
||||||
import formatText from '@screens/Compose/formatText'
|
import formatText from '@screens/Compose/formatText'
|
||||||
import ComposeRoot from '@screens/Compose/Root'
|
import ComposeRoot from '@screens/Compose/Root'
|
||||||
|
import { RootStackScreenProps } from '@utils/navigation/navigators'
|
||||||
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
|
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
|
||||||
import { updateStoreReview } from '@utils/slices/contextsSlice'
|
import { updateStoreReview } from '@utils/slices/contextsSlice'
|
||||||
import {
|
import {
|
||||||
|
@ -31,7 +32,6 @@ import {
|
||||||
StyleSheet
|
StyleSheet
|
||||||
} from 'react-native'
|
} from 'react-native'
|
||||||
import { SafeAreaView } from 'react-native-safe-area-context'
|
import { SafeAreaView } from 'react-native-safe-area-context'
|
||||||
import { createNativeStackNavigator } from 'react-native-screens/native-stack'
|
|
||||||
import { useQueryClient } from 'react-query'
|
import { useQueryClient } from 'react-query'
|
||||||
import { useDispatch, useSelector } from 'react-redux'
|
import { useDispatch, useSelector } from 'react-redux'
|
||||||
import * as Sentry from 'sentry-expo'
|
import * as Sentry from 'sentry-expo'
|
||||||
|
@ -43,14 +43,9 @@ import composeParseState from './Compose/utils/parseState'
|
||||||
import composePost from './Compose/utils/post'
|
import composePost from './Compose/utils/post'
|
||||||
import composeReducer from './Compose/utils/reducer'
|
import composeReducer from './Compose/utils/reducer'
|
||||||
|
|
||||||
export type ScreenComposeProp = StackScreenProps<
|
|
||||||
Nav.RootStackParamList,
|
|
||||||
'Screen-Compose'
|
|
||||||
>
|
|
||||||
|
|
||||||
const Stack = createNativeStackNavigator()
|
const Stack = createNativeStackNavigator()
|
||||||
|
|
||||||
const ScreenCompose: React.FC<ScreenComposeProp> = ({
|
const ScreenCompose: React.FC<RootStackScreenProps<'Screen-Compose'>> = ({
|
||||||
route: { params },
|
route: { params },
|
||||||
navigation
|
navigation
|
||||||
}) => {
|
}) => {
|
||||||
|
@ -371,10 +366,7 @@ const ScreenCompose: React.FC<ScreenComposeProp> = ({
|
||||||
edges={hasKeyboard ? ['top'] : ['top', 'bottom']}
|
edges={hasKeyboard ? ['top'] : ['top', 'bottom']}
|
||||||
>
|
>
|
||||||
<ComposeContext.Provider value={{ composeState, composeDispatch }}>
|
<ComposeContext.Provider value={{ composeState, composeDispatch }}>
|
||||||
<Stack.Navigator
|
<Stack.Navigator initialRouteName='Screen-Compose-Root'>
|
||||||
screenOptions={{ headerTopInsetEnabled: false }}
|
|
||||||
initialRouteName='Screen-Compose-Root'
|
|
||||||
>
|
|
||||||
<Stack.Screen
|
<Stack.Screen
|
||||||
name='Screen-Compose-Root'
|
name='Screen-Compose-Root'
|
||||||
component={ComposeRoot}
|
component={ComposeRoot}
|
||||||
|
@ -405,18 +397,12 @@ const ScreenCompose: React.FC<ScreenComposeProp> = ({
|
||||||
<Stack.Screen
|
<Stack.Screen
|
||||||
name='Screen-Compose-DraftsList'
|
name='Screen-Compose-DraftsList'
|
||||||
component={ComposeDraftsList}
|
component={ComposeDraftsList}
|
||||||
options={{
|
options={{ headerShown: false, presentation: 'modal' }}
|
||||||
stackPresentation: 'modal',
|
|
||||||
...(Platform.OS === 'android' && { headerShown: false })
|
|
||||||
}}
|
|
||||||
/>
|
/>
|
||||||
<Stack.Screen
|
<Stack.Screen
|
||||||
name='Screen-Compose-EditAttachment'
|
name='Screen-Compose-EditAttachment'
|
||||||
component={ComposeEditAttachment}
|
component={ComposeEditAttachment}
|
||||||
options={{
|
options={{ headerShown: false, presentation: 'modal' }}
|
||||||
stackPresentation: 'modal',
|
|
||||||
...(Platform.OS === 'android' && { headerShown: false })
|
|
||||||
}}
|
|
||||||
/>
|
/>
|
||||||
</Stack.Navigator>
|
</Stack.Navigator>
|
||||||
</ComposeContext.Provider>
|
</ComposeContext.Provider>
|
||||||
|
|
|
@ -1,19 +1,16 @@
|
||||||
import { HeaderCenter, HeaderLeft } from '@components/Header'
|
import { HeaderCenter, HeaderLeft } from '@components/Header'
|
||||||
import { StackScreenProps } from '@react-navigation/stack'
|
import { createNativeStackNavigator } from '@react-navigation/native-stack'
|
||||||
|
import { ScreenComposeStackScreenProps } from '@utils/navigation/navigators'
|
||||||
import React, { useCallback } from 'react'
|
import React, { useCallback } from 'react'
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
import { Platform } from 'react-native'
|
import { Platform } from 'react-native'
|
||||||
import { createNativeStackNavigator } from 'react-native-screens/native-stack'
|
|
||||||
import ComposeDraftsListRoot from './DraftsList/Root'
|
import ComposeDraftsListRoot from './DraftsList/Root'
|
||||||
|
|
||||||
const Stack = createNativeStackNavigator()
|
const Stack = createNativeStackNavigator()
|
||||||
|
|
||||||
export type ScreenComposeEditAttachmentProp = StackScreenProps<
|
const ComposeDraftsList: React.FC<ScreenComposeStackScreenProps<
|
||||||
Nav.ScreenComposeStackParamList,
|
|
||||||
'Screen-Compose-DraftsList'
|
'Screen-Compose-DraftsList'
|
||||||
>
|
>> = ({
|
||||||
|
|
||||||
const ComposeDraftsList: React.FC<ScreenComposeEditAttachmentProp> = ({
|
|
||||||
route: {
|
route: {
|
||||||
params: { timestamp }
|
params: { timestamp }
|
||||||
},
|
},
|
||||||
|
@ -37,7 +34,7 @@ const ComposeDraftsList: React.FC<ScreenComposeEditAttachmentProp> = ({
|
||||||
)
|
)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Stack.Navigator screenOptions={{ headerTopInsetEnabled: false }}>
|
<Stack.Navigator>
|
||||||
<Stack.Screen
|
<Stack.Screen
|
||||||
name='Screen-Compose-EditAttachment-Root'
|
name='Screen-Compose-EditAttachment-Root'
|
||||||
children={children}
|
children={children}
|
||||||
|
@ -49,7 +46,7 @@ const ComposeDraftsList: React.FC<ScreenComposeEditAttachmentProp> = ({
|
||||||
<HeaderCenter content={t('content.draftsList.header.title')} />
|
<HeaderCenter content={t('content.draftsList.header.title')} />
|
||||||
)
|
)
|
||||||
}),
|
}),
|
||||||
headerHideShadow: true
|
headerShadowVisible: false
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Stack.Navigator>
|
</Stack.Navigator>
|
||||||
|
|
|
@ -1,21 +1,18 @@
|
||||||
import { HeaderCenter, HeaderLeft } from '@components/Header'
|
import { HeaderLeft } from '@components/Header'
|
||||||
import { StackScreenProps } from '@react-navigation/stack'
|
import { createNativeStackNavigator } from '@react-navigation/native-stack'
|
||||||
|
import { ScreenComposeStackScreenProps } from '@utils/navigation/navigators'
|
||||||
import React, { useCallback } from 'react'
|
import React, { useCallback } from 'react'
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
import { KeyboardAvoidingView, Platform } from 'react-native'
|
import { KeyboardAvoidingView, Platform } from 'react-native'
|
||||||
import { SafeAreaView } from 'react-native-safe-area-context'
|
import { SafeAreaView } from 'react-native-safe-area-context'
|
||||||
import { createNativeStackNavigator } from 'react-native-screens/native-stack'
|
|
||||||
import ComposeEditAttachmentRoot from './EditAttachment/Root'
|
import ComposeEditAttachmentRoot from './EditAttachment/Root'
|
||||||
import ComposeEditAttachmentSubmit from './EditAttachment/Submit'
|
import ComposeEditAttachmentSubmit from './EditAttachment/Submit'
|
||||||
|
|
||||||
const Stack = createNativeStackNavigator()
|
const Stack = createNativeStackNavigator()
|
||||||
|
|
||||||
export type ScreenComposeEditAttachmentProp = StackScreenProps<
|
const ComposeEditAttachment: React.FC<ScreenComposeStackScreenProps<
|
||||||
Nav.ScreenComposeStackParamList,
|
|
||||||
'Screen-Compose-EditAttachment'
|
'Screen-Compose-EditAttachment'
|
||||||
>
|
>> = ({
|
||||||
|
|
||||||
const ComposeEditAttachment: React.FC<ScreenComposeEditAttachmentProp> = ({
|
|
||||||
route: {
|
route: {
|
||||||
params: { index }
|
params: { index }
|
||||||
},
|
},
|
||||||
|
@ -45,21 +42,14 @@ const ComposeEditAttachment: React.FC<ScreenComposeEditAttachmentProp> = ({
|
||||||
style={{ flex: 1 }}
|
style={{ flex: 1 }}
|
||||||
>
|
>
|
||||||
<SafeAreaView style={{ flex: 1 }} edges={['left', 'right', 'bottom']}>
|
<SafeAreaView style={{ flex: 1 }} edges={['left', 'right', 'bottom']}>
|
||||||
<Stack.Navigator screenOptions={{ headerTopInsetEnabled: false }}>
|
<Stack.Navigator>
|
||||||
<Stack.Screen
|
<Stack.Screen
|
||||||
name='Screen-Compose-EditAttachment-Root'
|
name='Screen-Compose-EditAttachment-Root'
|
||||||
children={children}
|
children={children}
|
||||||
options={{
|
options={{
|
||||||
headerLeft,
|
headerLeft,
|
||||||
headerRight: () => <ComposeEditAttachmentSubmit index={index} />,
|
headerRight: () => <ComposeEditAttachmentSubmit index={index} />,
|
||||||
headerTitle: t('content.editAttachment.header.title'),
|
headerTitle: t('content.editAttachment.header.title')
|
||||||
...(Platform.OS === 'android' && {
|
|
||||||
headerCenter: () => (
|
|
||||||
<HeaderCenter
|
|
||||||
content={t('content.editAttachment.header.title')}
|
|
||||||
/>
|
|
||||||
)
|
|
||||||
})
|
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Stack.Navigator>
|
</Stack.Navigator>
|
||||||
|
|
|
@ -15,7 +15,7 @@ export interface Props {
|
||||||
|
|
||||||
const ComposeDrafts: React.FC<Props> = ({ accessibleRefDrafts }) => {
|
const ComposeDrafts: React.FC<Props> = ({ accessibleRefDrafts }) => {
|
||||||
const { t } = useTranslation('screenCompose')
|
const { t } = useTranslation('screenCompose')
|
||||||
const navigation = useNavigation()
|
const navigation = useNavigation<any>()
|
||||||
const { composeState } = useContext(ComposeContext)
|
const { composeState } = useContext(ComposeContext)
|
||||||
const instanceDrafts = useSelector(getInstanceDrafts)?.filter(
|
const instanceDrafts = useSelector(getInstanceDrafts)?.filter(
|
||||||
draft => draft.timestamp !== composeState.timestamp
|
draft => draft.timestamp !== composeState.timestamp
|
||||||
|
|
|
@ -40,7 +40,7 @@ const ComposeAttachments: React.FC<Props> = ({ accessibleRefAttachments }) => {
|
||||||
const { composeState, composeDispatch } = useContext(ComposeContext)
|
const { composeState, composeDispatch } = useContext(ComposeContext)
|
||||||
const { t } = useTranslation('screenCompose')
|
const { t } = useTranslation('screenCompose')
|
||||||
const { theme } = useTheme()
|
const { theme } = useTheme()
|
||||||
const navigation = useNavigation()
|
const navigation = useNavigation<any>()
|
||||||
|
|
||||||
const flatListRef = useRef<FlatList>(null)
|
const flatListRef = useRef<FlatList>(null)
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { store } from '@root/store'
|
import { store } from '@root/store'
|
||||||
|
import { RootStackParamList } from '@utils/navigation/navigators'
|
||||||
import { getInstanceAccount } from '@utils/slices/instancesSlice'
|
import { getInstanceAccount } from '@utils/slices/instancesSlice'
|
||||||
import composeInitialState from './initialState'
|
import composeInitialState from './initialState'
|
||||||
import { ComposeState } from './types'
|
import { ComposeState } from './types'
|
||||||
|
@ -34,7 +35,7 @@ const assignVisibility = (
|
||||||
}
|
}
|
||||||
|
|
||||||
const composeParseState = (
|
const composeParseState = (
|
||||||
params: NonNullable<Nav.RootStackParamList['Screen-Compose']>
|
params: NonNullable<RootStackParamList['Screen-Compose']>
|
||||||
): ComposeState => {
|
): ComposeState => {
|
||||||
switch (params.type) {
|
switch (params.type) {
|
||||||
case 'edit':
|
case 'edit':
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
import apiInstance from '@api/instance'
|
import apiInstance from '@api/instance'
|
||||||
import { ComposeState } from '@screens/Compose/utils/types'
|
import { ComposeState } from '@screens/Compose/utils/types'
|
||||||
|
import { RootStackParamList } from '@utils/navigation/navigators'
|
||||||
import * as Crypto from 'expo-crypto'
|
import * as Crypto from 'expo-crypto'
|
||||||
|
|
||||||
const composePost = async (
|
const composePost = async (
|
||||||
params: Nav.RootStackParamList['Screen-Compose'],
|
params: RootStackParamList['Screen-Compose'],
|
||||||
composeState: ComposeState
|
composeState: ComposeState
|
||||||
) => {
|
) => {
|
||||||
const formData = new FormData()
|
const formData = new FormData()
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import { RootStackParamList } from '@utils/navigation/navigators'
|
||||||
import React, { ComponentType, useCallback, useEffect } from 'react'
|
import React, { ComponentType, useCallback, useEffect } from 'react'
|
||||||
import {
|
import {
|
||||||
Animated,
|
Animated,
|
||||||
|
@ -20,11 +21,11 @@ import useImageIndexChange from './hooks/useImageIndexChange'
|
||||||
import useRequestClose from './hooks/useRequestClose'
|
import useRequestClose from './hooks/useRequestClose'
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
images: Nav.RootStackParamList['Screen-ImagesViewer']['imageUrls']
|
images: RootStackParamList['Screen-ImagesViewer']['imageUrls']
|
||||||
imageIndex: number
|
imageIndex: number
|
||||||
onRequestClose: () => void
|
onRequestClose: () => void
|
||||||
onLongPress?: (
|
onLongPress?: (
|
||||||
image: Nav.RootStackParamList['Screen-ImagesViewer']['imageUrls'][0]
|
image: RootStackParamList['Screen-ImagesViewer']['imageUrls'][0]
|
||||||
) => void
|
) => void
|
||||||
onImageIndexChange?: (imageIndex: number) => void
|
onImageIndexChange?: (imageIndex: number) => void
|
||||||
backgroundColor?: string
|
backgroundColor?: string
|
||||||
|
@ -50,9 +51,7 @@ function ImageViewer ({
|
||||||
HeaderComponent
|
HeaderComponent
|
||||||
}: Props) {
|
}: Props) {
|
||||||
const imageList = React.createRef<
|
const imageList = React.createRef<
|
||||||
VirtualizedList<
|
VirtualizedList<RootStackParamList['Screen-ImagesViewer']['imageUrls'][0]>
|
||||||
Nav.RootStackParamList['Screen-ImagesViewer']['imageUrls'][0]
|
|
||||||
>
|
|
||||||
>()
|
>()
|
||||||
const [opacity, onRequestCloseEnhanced] = useRequestClose(onRequestClose)
|
const [opacity, onRequestCloseEnhanced] = useRequestClose(onRequestClose)
|
||||||
const [currentImageIndex, onScroll] = useImageIndexChange(imageIndex, SCREEN)
|
const [currentImageIndex, onScroll] = useImageIndexChange(imageIndex, SCREEN)
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import haptics from '@components/haptics'
|
import haptics from '@components/haptics'
|
||||||
import { displayMessage } from '@components/Message'
|
import { displayMessage } from '@components/Message'
|
||||||
import CameraRoll from '@react-native-community/cameraroll'
|
import CameraRoll from '@react-native-community/cameraroll'
|
||||||
|
import { RootStackParamList } from '@utils/navigation/navigators'
|
||||||
import i18next from 'i18next'
|
import i18next from 'i18next'
|
||||||
import { RefObject } from 'react'
|
import { RefObject } from 'react'
|
||||||
import { Platform } from 'react-native'
|
import { Platform } from 'react-native'
|
||||||
|
@ -10,7 +11,7 @@ import { FileSystem, Permissions } from 'react-native-unimodules'
|
||||||
type CommonProps = {
|
type CommonProps = {
|
||||||
messageRef: RefObject<FlashMessage>
|
messageRef: RefObject<FlashMessage>
|
||||||
mode: 'light' | 'dark'
|
mode: 'light' | 'dark'
|
||||||
image: Nav.RootStackParamList['Screen-ImagesViewer']['imageUrls'][0]
|
image: RootStackParamList['Screen-ImagesViewer']['imageUrls'][0]
|
||||||
}
|
}
|
||||||
|
|
||||||
const saveIos = async ({ messageRef, mode, image }: CommonProps) => {
|
const saveIos = async ({ messageRef, mode, image }: CommonProps) => {
|
||||||
|
|
|
@ -2,7 +2,11 @@ import analytics from '@components/analytics'
|
||||||
import { HeaderCenter, HeaderLeft, HeaderRight } from '@components/Header'
|
import { HeaderCenter, HeaderLeft, HeaderRight } from '@components/Header'
|
||||||
import { Message } from '@components/Message'
|
import { Message } from '@components/Message'
|
||||||
import { useActionSheet } from '@expo/react-native-action-sheet'
|
import { useActionSheet } from '@expo/react-native-action-sheet'
|
||||||
import { StackScreenProps } from '@react-navigation/stack'
|
import { NativeStackNavigationProp } from '@react-navigation/native-stack'
|
||||||
|
import {
|
||||||
|
RootStackParamList,
|
||||||
|
RootStackScreenProps
|
||||||
|
} from '@utils/navigation/navigators'
|
||||||
import { useTheme } from '@utils/styles/ThemeManager'
|
import { useTheme } from '@utils/styles/ThemeManager'
|
||||||
import { findIndex } from 'lodash'
|
import { findIndex } from 'lodash'
|
||||||
import React, { RefObject, useCallback, useRef, useState } from 'react'
|
import React, { RefObject, useCallback, useRef, useState } from 'react'
|
||||||
|
@ -24,9 +28,12 @@ const HeaderComponent = React.memo(
|
||||||
imageUrls
|
imageUrls
|
||||||
}: {
|
}: {
|
||||||
messageRef: RefObject<FlashMessage>
|
messageRef: RefObject<FlashMessage>
|
||||||
navigation: ScreenImagesViewerProp['navigation']
|
navigation: NativeStackNavigationProp<
|
||||||
|
RootStackParamList,
|
||||||
|
'Screen-ImagesViewer'
|
||||||
|
>
|
||||||
currentIndex: number
|
currentIndex: number
|
||||||
imageUrls: Nav.RootStackParamList['Screen-ImagesViewer']['imageUrls']
|
imageUrls: RootStackParamList['Screen-ImagesViewer']['imageUrls']
|
||||||
}) => {
|
}) => {
|
||||||
const insets = useSafeAreaInsets()
|
const insets = useSafeAreaInsets()
|
||||||
const { mode } = useTheme()
|
const { mode } = useTheme()
|
||||||
|
@ -98,17 +105,12 @@ const HeaderComponent = React.memo(
|
||||||
(prev, next) => prev.currentIndex === next.currentIndex
|
(prev, next) => prev.currentIndex === next.currentIndex
|
||||||
)
|
)
|
||||||
|
|
||||||
export type ScreenImagesViewerProp = StackScreenProps<
|
|
||||||
Nav.RootStackParamList,
|
|
||||||
'Screen-ImagesViewer'
|
|
||||||
>
|
|
||||||
|
|
||||||
const ScreenImagesViewer = ({
|
const ScreenImagesViewer = ({
|
||||||
route: {
|
route: {
|
||||||
params: { imageUrls, id }
|
params: { imageUrls, id }
|
||||||
},
|
},
|
||||||
navigation
|
navigation
|
||||||
}: ScreenImagesViewerProp) => {
|
}: RootStackScreenProps<'Screen-ImagesViewer'>) => {
|
||||||
if (imageUrls.length === 0) {
|
if (imageUrls.length === 0) {
|
||||||
navigation.goBack()
|
navigation.goBack()
|
||||||
return null
|
return null
|
||||||
|
|
|
@ -5,8 +5,10 @@ import {
|
||||||
BottomTabNavigationOptions,
|
BottomTabNavigationOptions,
|
||||||
createBottomTabNavigator
|
createBottomTabNavigator
|
||||||
} from '@react-navigation/bottom-tabs'
|
} from '@react-navigation/bottom-tabs'
|
||||||
import { NavigatorScreenParams } from '@react-navigation/native'
|
import {
|
||||||
import { StackScreenProps } from '@react-navigation/stack'
|
RootStackScreenProps,
|
||||||
|
ScreenTabsStackParamList
|
||||||
|
} from '@utils/navigation/navigators'
|
||||||
import { getPreviousTab } from '@utils/slices/contextsSlice'
|
import { getPreviousTab } from '@utils/slices/contextsSlice'
|
||||||
import {
|
import {
|
||||||
getInstanceAccount,
|
getInstanceAccount,
|
||||||
|
@ -25,23 +27,10 @@ import TabMe from './Tabs/Me'
|
||||||
import TabNotifications from './Tabs/Notifications'
|
import TabNotifications from './Tabs/Notifications'
|
||||||
import TabPublic from './Tabs/Public'
|
import TabPublic from './Tabs/Public'
|
||||||
|
|
||||||
export type ScreenTabsParamList = {
|
const Tab = createBottomTabNavigator<ScreenTabsStackParamList>()
|
||||||
'Tab-Local': NavigatorScreenParams<Nav.TabLocalStackParamList>
|
|
||||||
'Tab-Public': NavigatorScreenParams<Nav.TabPublicStackParamList>
|
|
||||||
'Tab-Compose': NavigatorScreenParams<Nav.ScreenComposeStackParamList>
|
|
||||||
'Tab-Notifications': NavigatorScreenParams<Nav.TabNotificationsStackParamList>
|
|
||||||
'Tab-Me': NavigatorScreenParams<Nav.TabMeStackParamList>
|
|
||||||
}
|
|
||||||
|
|
||||||
export type ScreenTabsProp = StackScreenProps<
|
|
||||||
Nav.RootStackParamList,
|
|
||||||
'Screen-Tabs'
|
|
||||||
>
|
|
||||||
|
|
||||||
const Tab = createBottomTabNavigator<Nav.ScreenTabsStackParamList>()
|
|
||||||
|
|
||||||
const ScreenTabs = React.memo(
|
const ScreenTabs = React.memo(
|
||||||
({ navigation }: ScreenTabsProp) => {
|
({ navigation }: RootStackScreenProps<'Screen-Tabs'>) => {
|
||||||
const { mode, theme } = useTheme()
|
const { mode, theme } = useTheme()
|
||||||
|
|
||||||
const instanceActive = useSelector(getInstanceActive)
|
const instanceActive = useSelector(getInstanceActive)
|
||||||
|
@ -52,7 +41,12 @@ const ScreenTabs = React.memo(
|
||||||
|
|
||||||
const screenOptions = useCallback(
|
const screenOptions = useCallback(
|
||||||
({ route }): BottomTabNavigationOptions => ({
|
({ route }): BottomTabNavigationOptions => ({
|
||||||
tabBarVisible: instanceActive !== -1,
|
headerShown: false,
|
||||||
|
tabBarActiveTintColor: theme.primaryDefault,
|
||||||
|
tabBarInactiveTintColor: theme.secondary,
|
||||||
|
tabBarShowLabel: false,
|
||||||
|
...(Platform.OS === 'android' && { tabBarHideOnKeyboard: true }),
|
||||||
|
tabBarStyle: { display: instanceActive !== -1 ? 'flex' : 'none' },
|
||||||
tabBarIcon: ({
|
tabBarIcon: ({
|
||||||
focused,
|
focused,
|
||||||
color,
|
color,
|
||||||
|
@ -95,15 +89,7 @@ const ScreenTabs = React.memo(
|
||||||
}),
|
}),
|
||||||
[instanceAccount?.avatarStatic, instanceActive]
|
[instanceAccount?.avatarStatic, instanceActive]
|
||||||
)
|
)
|
||||||
const tabBarOptions = useMemo(
|
|
||||||
() => ({
|
|
||||||
activeTintColor: theme.primaryDefault,
|
|
||||||
inactiveTintColor: theme.secondary,
|
|
||||||
showLabel: false,
|
|
||||||
...(Platform.OS === 'android' && { keyboardHidesTabBar: true })
|
|
||||||
}),
|
|
||||||
[mode]
|
|
||||||
)
|
|
||||||
const composeListeners = useMemo(
|
const composeListeners = useMemo(
|
||||||
() => ({
|
() => ({
|
||||||
tabPress: (e: any) => {
|
tabPress: (e: any) => {
|
||||||
|
@ -133,7 +119,6 @@ const ScreenTabs = React.memo(
|
||||||
<Tab.Navigator
|
<Tab.Navigator
|
||||||
initialRouteName={instanceActive !== -1 ? previousTab : 'Tab-Me'}
|
initialRouteName={instanceActive !== -1 ? previousTab : 'Tab-Me'}
|
||||||
screenOptions={screenOptions}
|
screenOptions={screenOptions}
|
||||||
tabBarOptions={tabBarOptions}
|
|
||||||
>
|
>
|
||||||
<Tab.Screen name='Tab-Local' component={TabLocal} />
|
<Tab.Screen name='Tab-Local' component={TabLocal} />
|
||||||
<Tab.Screen name='Tab-Public' component={TabPublic} />
|
<Tab.Screen name='Tab-Public' component={TabPublic} />
|
||||||
|
|
|
@ -2,33 +2,23 @@ import analytics from '@components/analytics'
|
||||||
import { HeaderCenter, HeaderRight } from '@components/Header'
|
import { HeaderCenter, HeaderRight } from '@components/Header'
|
||||||
import Timeline from '@components/Timeline'
|
import Timeline from '@components/Timeline'
|
||||||
import TimelineDefault from '@components/Timeline/Default'
|
import TimelineDefault from '@components/Timeline/Default'
|
||||||
import { BottomTabScreenProps } from '@react-navigation/bottom-tabs'
|
import { createNativeStackNavigator } from '@react-navigation/native-stack'
|
||||||
import { ScreenTabsParamList } from '@screens/Tabs'
|
import {
|
||||||
|
ScreenTabsScreenProps,
|
||||||
|
TabLocalStackParamList
|
||||||
|
} from '@utils/navigation/navigators'
|
||||||
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
|
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
|
||||||
import React, { useCallback, useMemo } from 'react'
|
import React, { useCallback, useMemo } from 'react'
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
import { Platform } from 'react-native'
|
import { Platform } from 'react-native'
|
||||||
import { createNativeStackNavigator } from 'react-native-screens/native-stack'
|
import TabSharedRoot from './Shared/Root'
|
||||||
import sharedScreens from './Shared/sharedScreens'
|
|
||||||
|
|
||||||
export type TabLocalProp = BottomTabScreenProps<
|
const Stack = createNativeStackNavigator<TabLocalStackParamList>()
|
||||||
ScreenTabsParamList,
|
|
||||||
'Tab-Local'
|
|
||||||
>
|
|
||||||
|
|
||||||
const Stack = createNativeStackNavigator<Nav.TabLocalStackParamList>()
|
|
||||||
|
|
||||||
const TabLocal = React.memo(
|
const TabLocal = React.memo(
|
||||||
({ navigation }: TabLocalProp) => {
|
({ navigation }: ScreenTabsScreenProps<'Tab-Local'>) => {
|
||||||
const { t, i18n } = useTranslation('screenTabs')
|
const { t, i18n } = useTranslation('screenTabs')
|
||||||
|
|
||||||
const screenOptions = useMemo(
|
|
||||||
() => ({
|
|
||||||
headerHideShadow: true,
|
|
||||||
headerTopInsetEnabled: false
|
|
||||||
}),
|
|
||||||
[]
|
|
||||||
)
|
|
||||||
const screenOptionsRoot = useMemo(
|
const screenOptionsRoot = useMemo(
|
||||||
() => ({
|
() => ({
|
||||||
headerTitle: t('tabs.local.name'),
|
headerTitle: t('tabs.local.name'),
|
||||||
|
@ -64,13 +54,13 @@ const TabLocal = React.memo(
|
||||||
)
|
)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Stack.Navigator screenOptions={screenOptions}>
|
<Stack.Navigator screenOptions={{ headerShadowVisible: false }}>
|
||||||
<Stack.Screen
|
<Stack.Screen
|
||||||
name='Tab-Local-Root'
|
name='Tab-Local-Root'
|
||||||
options={screenOptionsRoot}
|
options={screenOptionsRoot}
|
||||||
children={children}
|
children={children}
|
||||||
/>
|
/>
|
||||||
{sharedScreens(Stack as any)}
|
{TabSharedRoot({ Stack })}
|
||||||
</Stack.Navigator>
|
</Stack.Navigator>
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
import { HeaderCenter, HeaderLeft } from '@components/Header'
|
import { HeaderCenter, HeaderLeft } from '@components/Header'
|
||||||
|
import { createNativeStackNavigator } from '@react-navigation/native-stack'
|
||||||
|
import { TabMeStackParamList } from '@utils/navigation/navigators'
|
||||||
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'
|
||||||
import { createNativeStackNavigator } from 'react-native-screens/native-stack'
|
|
||||||
import TabMeBookmarks from './Me/Bookmarks'
|
import TabMeBookmarks from './Me/Bookmarks'
|
||||||
import TabMeConversations from './Me/Cconversations'
|
import TabMeConversations from './Me/Cconversations'
|
||||||
import TabMeFavourites from './Me/Favourites'
|
import TabMeFavourites from './Me/Favourites'
|
||||||
|
@ -14,25 +15,23 @@ import TabMeRoot from './Me/Root'
|
||||||
import TabMeSettings from './Me/Settings'
|
import TabMeSettings from './Me/Settings'
|
||||||
import TabMeSettingsFontsize from './Me/SettingsFontsize'
|
import TabMeSettingsFontsize from './Me/SettingsFontsize'
|
||||||
import TabMeSwitch from './Me/Switch'
|
import TabMeSwitch from './Me/Switch'
|
||||||
import sharedScreens from './Shared/sharedScreens'
|
import TabSharedRoot from './Shared/Root'
|
||||||
|
|
||||||
const Stack = createNativeStackNavigator<Nav.TabMeStackParamList>()
|
const Stack = createNativeStackNavigator<TabMeStackParamList>()
|
||||||
|
|
||||||
const TabMe = React.memo(
|
const TabMe = React.memo(
|
||||||
() => {
|
() => {
|
||||||
const { t } = useTranslation('screenTabs')
|
const { t } = useTranslation('screenTabs')
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Stack.Navigator
|
<Stack.Navigator screenOptions={{ headerShadowVisible: false }}>
|
||||||
screenOptions={{ headerHideShadow: true, headerTopInsetEnabled: false }}
|
|
||||||
>
|
|
||||||
<Stack.Screen
|
<Stack.Screen
|
||||||
name='Tab-Me-Root'
|
name='Tab-Me-Root'
|
||||||
component={TabMeRoot}
|
component={TabMeRoot}
|
||||||
options={{
|
options={{
|
||||||
headerTranslucent: true,
|
headerShadowVisible: false,
|
||||||
headerStyle: { backgroundColor: 'rgba(255, 255, 255, 0)' },
|
headerStyle: { backgroundColor: 'rgba(255, 255, 255, 0)' },
|
||||||
headerCenter: () => null
|
headerShown: false
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<Stack.Screen
|
<Stack.Screen
|
||||||
|
@ -108,15 +107,15 @@ const TabMe = React.memo(
|
||||||
name='Tab-Me-Profile'
|
name='Tab-Me-Profile'
|
||||||
component={TabMeProfile}
|
component={TabMeProfile}
|
||||||
options={{
|
options={{
|
||||||
stackPresentation: 'modal',
|
headerShown: false,
|
||||||
...(Platform.OS === 'android' && { headerShown: false })
|
presentation: 'modal'
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<Stack.Screen
|
<Stack.Screen
|
||||||
name='Tab-Me-Push'
|
name='Tab-Me-Push'
|
||||||
component={TabMePush}
|
component={TabMePush}
|
||||||
options={({ navigation }) => ({
|
options={({ navigation }) => ({
|
||||||
stackPresentation: 'modal',
|
presentation: 'modal',
|
||||||
headerShown: true,
|
headerShown: true,
|
||||||
headerTitle: t('me.stacks.push.name'),
|
headerTitle: t('me.stacks.push.name'),
|
||||||
...(Platform.OS === 'android' && {
|
...(Platform.OS === 'android' && {
|
||||||
|
@ -162,7 +161,7 @@ const TabMe = React.memo(
|
||||||
name='Tab-Me-Switch'
|
name='Tab-Me-Switch'
|
||||||
component={TabMeSwitch}
|
component={TabMeSwitch}
|
||||||
options={({ navigation }) => ({
|
options={({ navigation }) => ({
|
||||||
stackPresentation: 'modal',
|
presentation: 'modal',
|
||||||
headerShown: true,
|
headerShown: true,
|
||||||
headerTitle: t('me.stacks.switch.name'),
|
headerTitle: t('me.stacks.switch.name'),
|
||||||
...(Platform.OS === 'android' && {
|
...(Platform.OS === 'android' && {
|
||||||
|
@ -179,7 +178,7 @@ const TabMe = React.memo(
|
||||||
})}
|
})}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
{sharedScreens(Stack as any)}
|
{TabSharedRoot({ Stack })}
|
||||||
</Stack.Navigator>
|
</Stack.Navigator>
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,12 +1,11 @@
|
||||||
import { MenuContainer, MenuRow } from '@components/Menu'
|
import { MenuContainer, MenuRow } from '@components/Menu'
|
||||||
import { StackScreenProps } from '@react-navigation/stack'
|
import { TabMeStackScreenProps } from '@utils/navigation/navigators'
|
||||||
import { useListsQuery } from '@utils/queryHooks/lists'
|
import { useListsQuery } from '@utils/queryHooks/lists'
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
|
|
||||||
const TabMeLists: React.FC<StackScreenProps<
|
const TabMeLists: React.FC<TabMeStackScreenProps<'Tab-Me-Lists'>> = ({
|
||||||
Nav.TabMeStackParamList,
|
navigation
|
||||||
'Tab-Me-Lists'
|
}) => {
|
||||||
>> = ({ navigation }) => {
|
|
||||||
const { data } = useListsQuery({})
|
const { data } = useListsQuery({})
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -1,13 +1,10 @@
|
||||||
import Timeline from '@components/Timeline'
|
import Timeline from '@components/Timeline'
|
||||||
import TimelineDefault from '@components/Timeline/Default'
|
import TimelineDefault from '@components/Timeline/Default'
|
||||||
import { StackScreenProps } from '@react-navigation/stack'
|
import { TabMeStackScreenProps } from '@utils/navigation/navigators'
|
||||||
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
|
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
|
||||||
import React, { useCallback } from 'react'
|
import React, { useCallback } from 'react'
|
||||||
|
|
||||||
const TabMeListsList: React.FC<StackScreenProps<
|
const TabMeListsList: React.FC<TabMeStackScreenProps<'Tab-Me-Lists-List'>> = ({
|
||||||
Nav.TabMeStackParamList,
|
|
||||||
'Tab-Me-Lists-List'
|
|
||||||
>> = ({
|
|
||||||
route: {
|
route: {
|
||||||
params: { list }
|
params: { list }
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,22 +1,24 @@
|
||||||
import { HeaderCenter, HeaderLeft } from '@components/Header'
|
import { HeaderCenter, HeaderLeft } from '@components/Header'
|
||||||
import { Message } from '@components/Message'
|
import { Message } from '@components/Message'
|
||||||
import { StackScreenProps } from '@react-navigation/stack'
|
import { createNativeStackNavigator } from '@react-navigation/native-stack'
|
||||||
|
import {
|
||||||
|
TabMeProfileStackParamList,
|
||||||
|
TabMeStackScreenProps
|
||||||
|
} from '@utils/navigation/navigators'
|
||||||
import React, { useRef } from 'react'
|
import React, { useRef } from 'react'
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
import { KeyboardAvoidingView, Platform } from 'react-native'
|
import { KeyboardAvoidingView, Platform } from 'react-native'
|
||||||
import FlashMessage from 'react-native-flash-message'
|
import FlashMessage from 'react-native-flash-message'
|
||||||
import { createNativeStackNavigator } from 'react-native-screens/native-stack'
|
|
||||||
import TabMeProfileFields from './Profile/Fields'
|
import TabMeProfileFields from './Profile/Fields'
|
||||||
import TabMeProfileName from './Profile/Name'
|
import TabMeProfileName from './Profile/Name'
|
||||||
import TabMeProfileNote from './Profile/Note'
|
import TabMeProfileNote from './Profile/Note'
|
||||||
import TabMeProfileRoot from './Profile/Root'
|
import TabMeProfileRoot from './Profile/Root'
|
||||||
|
|
||||||
const Stack = createNativeStackNavigator<Nav.TabMeProfileStackParamList>()
|
const Stack = createNativeStackNavigator<TabMeProfileStackParamList>()
|
||||||
|
|
||||||
const TabMeProfile: React.FC<StackScreenProps<
|
const TabMeProfile: React.FC<TabMeStackScreenProps<'Tab-Me-Switch'>> = ({
|
||||||
Nav.TabMeStackParamList,
|
navigation
|
||||||
'Tab-Me-Switch'
|
}) => {
|
||||||
>> = ({ navigation }) => {
|
|
||||||
const { t } = useTranslation('screenTabs')
|
const { t } = useTranslation('screenTabs')
|
||||||
const messageRef = useRef<FlashMessage>(null)
|
const messageRef = useRef<FlashMessage>(null)
|
||||||
|
|
||||||
|
@ -25,9 +27,7 @@ const TabMeProfile: React.FC<StackScreenProps<
|
||||||
style={{ flex: 1 }}
|
style={{ flex: 1 }}
|
||||||
behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
|
behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
|
||||||
>
|
>
|
||||||
<Stack.Navigator
|
<Stack.Navigator screenOptions={{ headerShadowVisible: false }}>
|
||||||
screenOptions={{ headerHideShadow: true, headerTopInsetEnabled: false }}
|
|
||||||
>
|
|
||||||
<Stack.Screen
|
<Stack.Screen
|
||||||
name='Tab-Me-Profile-Root'
|
name='Tab-Me-Profile-Root'
|
||||||
options={{
|
options={{
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { HeaderLeft, HeaderRight } from '@components/Header'
|
import { HeaderLeft, HeaderRight } from '@components/Header'
|
||||||
import Input from '@components/Input'
|
import Input from '@components/Input'
|
||||||
import { StackScreenProps } from '@react-navigation/stack'
|
import { TabMeProfileStackScreenProps } from '@utils/navigation/navigators'
|
||||||
import { useProfileMutation } from '@utils/queryHooks/profile'
|
import { useProfileMutation } from '@utils/queryHooks/profile'
|
||||||
import { StyleConstants } from '@utils/styles/constants'
|
import { StyleConstants } from '@utils/styles/constants'
|
||||||
import { useTheme } from '@utils/styles/ThemeManager'
|
import { useTheme } from '@utils/styles/ThemeManager'
|
||||||
|
@ -23,8 +23,7 @@ const prepareFields = (
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const TabMeProfileFields: React.FC<StackScreenProps<
|
const TabMeProfileFields: React.FC<TabMeProfileStackScreenProps<
|
||||||
Nav.TabMeProfileStackParamList,
|
|
||||||
'Tab-Me-Profile-Fields'
|
'Tab-Me-Profile-Fields'
|
||||||
> & { messageRef: RefObject<FlashMessage> }> = ({
|
> & { messageRef: RefObject<FlashMessage> }> = ({
|
||||||
messageRef,
|
messageRef,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { HeaderLeft, HeaderRight } from '@components/Header'
|
import { HeaderLeft, HeaderRight } from '@components/Header'
|
||||||
import Input from '@components/Input'
|
import Input from '@components/Input'
|
||||||
import { StackScreenProps } from '@react-navigation/stack'
|
import { TabMeProfileStackScreenProps } from '@utils/navigation/navigators'
|
||||||
import { useProfileMutation } from '@utils/queryHooks/profile'
|
import { useProfileMutation } from '@utils/queryHooks/profile'
|
||||||
import { StyleConstants } from '@utils/styles/constants'
|
import { StyleConstants } from '@utils/styles/constants'
|
||||||
import { useTheme } from '@utils/styles/ThemeManager'
|
import { useTheme } from '@utils/styles/ThemeManager'
|
||||||
|
@ -10,8 +10,7 @@ import { Alert, StyleSheet } from 'react-native'
|
||||||
import FlashMessage from 'react-native-flash-message'
|
import FlashMessage from 'react-native-flash-message'
|
||||||
import { ScrollView } from 'react-native-gesture-handler'
|
import { ScrollView } from 'react-native-gesture-handler'
|
||||||
|
|
||||||
const TabMeProfileName: React.FC<StackScreenProps<
|
const TabMeProfileName: React.FC<TabMeProfileStackScreenProps<
|
||||||
Nav.TabMeProfileStackParamList,
|
|
||||||
'Tab-Me-Profile-Name'
|
'Tab-Me-Profile-Name'
|
||||||
> & { messageRef: RefObject<FlashMessage> }> = ({
|
> & { messageRef: RefObject<FlashMessage> }> = ({
|
||||||
messageRef,
|
messageRef,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { HeaderLeft, HeaderRight } from '@components/Header'
|
import { HeaderLeft, HeaderRight } from '@components/Header'
|
||||||
import Input from '@components/Input'
|
import Input from '@components/Input'
|
||||||
import { StackScreenProps } from '@react-navigation/stack'
|
import { TabMeProfileStackScreenProps } from '@utils/navigation/navigators'
|
||||||
import { useProfileMutation } from '@utils/queryHooks/profile'
|
import { useProfileMutation } from '@utils/queryHooks/profile'
|
||||||
import { StyleConstants } from '@utils/styles/constants'
|
import { StyleConstants } from '@utils/styles/constants'
|
||||||
import { useTheme } from '@utils/styles/ThemeManager'
|
import { useTheme } from '@utils/styles/ThemeManager'
|
||||||
|
@ -10,8 +10,7 @@ import { Alert, StyleSheet, View } from 'react-native'
|
||||||
import FlashMessage from 'react-native-flash-message'
|
import FlashMessage from 'react-native-flash-message'
|
||||||
import { ScrollView } from 'react-native-gesture-handler'
|
import { ScrollView } from 'react-native-gesture-handler'
|
||||||
|
|
||||||
const TabMeProfileNote: React.FC<StackScreenProps<
|
const TabMeProfileNote: React.FC<TabMeProfileStackScreenProps<
|
||||||
Nav.TabMeProfileStackParamList,
|
|
||||||
'Tab-Me-Profile-Note'
|
'Tab-Me-Profile-Note'
|
||||||
> & { messageRef: RefObject<FlashMessage> }> = ({
|
> & { messageRef: RefObject<FlashMessage> }> = ({
|
||||||
messageRef,
|
messageRef,
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import analytics from '@components/analytics'
|
import analytics from '@components/analytics'
|
||||||
import { MenuContainer, MenuRow } from '@components/Menu'
|
import { MenuContainer, MenuRow } from '@components/Menu'
|
||||||
import { useActionSheet } from '@expo/react-native-action-sheet'
|
import { useActionSheet } from '@expo/react-native-action-sheet'
|
||||||
import { StackScreenProps } from '@react-navigation/stack'
|
import { TabMeProfileStackScreenProps } from '@utils/navigation/navigators'
|
||||||
import { useProfileMutation, useProfileQuery } from '@utils/queryHooks/profile'
|
import { useProfileMutation, useProfileQuery } from '@utils/queryHooks/profile'
|
||||||
import { updateAccountPreferences } from '@utils/slices/instances/updateAccountPreferences'
|
import { updateAccountPreferences } from '@utils/slices/instances/updateAccountPreferences'
|
||||||
import { useTheme } from '@utils/styles/ThemeManager'
|
import { useTheme } from '@utils/styles/ThemeManager'
|
||||||
|
@ -12,8 +12,7 @@ import { ScrollView } from 'react-native-gesture-handler'
|
||||||
import { useDispatch } from 'react-redux'
|
import { useDispatch } from 'react-redux'
|
||||||
import ProfileAvatarHeader from './Root/AvatarHeader'
|
import ProfileAvatarHeader from './Root/AvatarHeader'
|
||||||
|
|
||||||
const TabMeProfileRoot: React.FC<StackScreenProps<
|
const TabMeProfileRoot: React.FC<TabMeProfileStackScreenProps<
|
||||||
Nav.TabMeProfileStackParamList,
|
|
||||||
'Tab-Me-Profile-Root'
|
'Tab-Me-Profile-Root'
|
||||||
> & { messageRef: RefObject<FlashMessage> }> = ({ messageRef, navigation }) => {
|
> & { messageRef: RefObject<FlashMessage> }> = ({ messageRef, navigation }) => {
|
||||||
const { mode } = useTheme()
|
const { mode } = useTheme()
|
||||||
|
|
|
@ -7,7 +7,7 @@ import { useTranslation } from 'react-i18next'
|
||||||
|
|
||||||
const Collections: React.FC = () => {
|
const Collections: React.FC = () => {
|
||||||
const { t } = useTranslation('screenTabs')
|
const { t } = useTranslation('screenTabs')
|
||||||
const navigation = useNavigation()
|
const navigation = useNavigation<any>()
|
||||||
|
|
||||||
const listsQuery = useListsQuery({
|
const listsQuery = useListsQuery({
|
||||||
options: {
|
options: {
|
||||||
|
|
|
@ -5,7 +5,7 @@ import { useTranslation } from 'react-i18next'
|
||||||
|
|
||||||
const Settings: React.FC = () => {
|
const Settings: React.FC = () => {
|
||||||
const { t } = useTranslation('screenTabs')
|
const { t } = useTranslation('screenTabs')
|
||||||
const navigation = useNavigation()
|
const navigation = useNavigation<any>()
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<MenuContainer>
|
<MenuContainer>
|
||||||
|
|
|
@ -5,7 +5,7 @@ import React from 'react'
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
|
|
||||||
const AccountInformationSwitch: React.FC = () => {
|
const AccountInformationSwitch: React.FC = () => {
|
||||||
const navigation = useNavigation()
|
const navigation = useNavigation<any>()
|
||||||
const { t } = useTranslation('screenTabs')
|
const { t } = useTranslation('screenTabs')
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -29,7 +29,7 @@ const SettingsAnalytics: React.FC = () => {
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
<Text style={[styles.version, { color: theme.secondary }]}>
|
<Text style={[styles.version, { color: theme.secondary }]}>
|
||||||
{t('me.settings.version', { version: Constants.manifest.version })}
|
{t('me.settings.version', { version: Constants.manifest?.version })}
|
||||||
</Text>
|
</Text>
|
||||||
</MenuContainer>
|
</MenuContainer>
|
||||||
)
|
)
|
||||||
|
|
|
@ -23,7 +23,7 @@ import { useDispatch, useSelector } from 'react-redux'
|
||||||
import { mapFontsizeToName } from '../SettingsFontsize'
|
import { mapFontsizeToName } from '../SettingsFontsize'
|
||||||
|
|
||||||
const SettingsApp: React.FC = () => {
|
const SettingsApp: React.FC = () => {
|
||||||
const navigation = useNavigation()
|
const navigation = useNavigation<any>()
|
||||||
const dispatch = useDispatch()
|
const dispatch = useDispatch()
|
||||||
const { showActionSheetWithOptions } = useActionSheet()
|
const { showActionSheetWithOptions } = useActionSheet()
|
||||||
const { setTheme } = useTheme()
|
const { setTheme } = useTheme()
|
||||||
|
|
|
@ -15,7 +15,7 @@ import { getInstanceActive } from '@utils/slices/instancesSlice'
|
||||||
|
|
||||||
const SettingsTooot: React.FC = () => {
|
const SettingsTooot: React.FC = () => {
|
||||||
const instanceActive = useSelector(getInstanceActive)
|
const instanceActive = useSelector(getInstanceActive)
|
||||||
const navigation = useNavigation()
|
const navigation = useNavigation<any>()
|
||||||
const { theme } = useTheme()
|
const { theme } = useTheme()
|
||||||
const { t } = useTranslation('screenTabs')
|
const { t } = useTranslation('screenTabs')
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ import Button from '@components/Button'
|
||||||
import haptics from '@components/haptics'
|
import haptics from '@components/haptics'
|
||||||
import ComponentSeparator from '@components/Separator'
|
import ComponentSeparator from '@components/Separator'
|
||||||
import TimelineDefault from '@components/Timeline/Default'
|
import TimelineDefault from '@components/Timeline/Default'
|
||||||
import { StackScreenProps } from '@react-navigation/stack'
|
import { TabMeStackScreenProps } from '@utils/navigation/navigators'
|
||||||
import {
|
import {
|
||||||
changeFontsize,
|
changeFontsize,
|
||||||
getSettingsFontsize,
|
getSettingsFontsize,
|
||||||
|
@ -32,8 +32,7 @@ export const mapFontsizeToName = (size: SettingsState['fontsize']) => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const TabMeSettingsFontsize: React.FC<StackScreenProps<
|
const TabMeSettingsFontsize: React.FC<TabMeStackScreenProps<
|
||||||
Nav.TabMeStackParamList,
|
|
||||||
'Tab-Me-Settings-Fontsize'
|
'Tab-Me-Settings-Fontsize'
|
||||||
>> = () => {
|
>> = () => {
|
||||||
const { mode, theme } = useTheme()
|
const { mode, theme } = useTheme()
|
||||||
|
@ -129,6 +128,7 @@ const TabMeSettingsFontsize: React.FC<StackScreenProps<
|
||||||
onPress={() => {
|
onPress={() => {
|
||||||
if (initialSize > -1) {
|
if (initialSize > -1) {
|
||||||
haptics('Light')
|
haptics('Light')
|
||||||
|
// @ts-ignore
|
||||||
dispatch(changeFontsize(initialSize - 1))
|
dispatch(changeFontsize(initialSize - 1))
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
|
@ -142,6 +142,7 @@ const TabMeSettingsFontsize: React.FC<StackScreenProps<
|
||||||
onPress={() => {
|
onPress={() => {
|
||||||
if (initialSize < 3) {
|
if (initialSize < 3) {
|
||||||
haptics('Light')
|
haptics('Light')
|
||||||
|
// @ts-ignore
|
||||||
dispatch(changeFontsize(initialSize + 1))
|
dispatch(changeFontsize(initialSize + 1))
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
|
|
|
@ -2,28 +2,21 @@ import analytics from '@components/analytics'
|
||||||
import { HeaderCenter, HeaderRight } from '@components/Header'
|
import { HeaderCenter, HeaderRight } from '@components/Header'
|
||||||
import Timeline from '@components/Timeline'
|
import Timeline from '@components/Timeline'
|
||||||
import TimelineNotifications from '@components/Timeline/Notifications'
|
import TimelineNotifications from '@components/Timeline/Notifications'
|
||||||
import { useNavigation } from '@react-navigation/native'
|
import navigationRef from '@helpers/navigationRef'
|
||||||
import sharedScreens from '@screens/Tabs/Shared/sharedScreens'
|
import { createNativeStackNavigator } from '@react-navigation/native-stack'
|
||||||
|
import { TabNotificationsStackParamList } from '@utils/navigation/navigators'
|
||||||
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
|
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
|
||||||
import React, { useCallback, useMemo } from 'react'
|
import React, { useCallback, useMemo } from 'react'
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
import { Platform } from 'react-native'
|
import { Platform } from 'react-native'
|
||||||
import { createNativeStackNavigator } from 'react-native-screens/native-stack'
|
import TabSharedRoot from './Shared/Root'
|
||||||
|
|
||||||
const Stack = createNativeStackNavigator<Nav.TabNotificationsStackParamList>()
|
const Stack = createNativeStackNavigator<TabNotificationsStackParamList>()
|
||||||
|
|
||||||
const TabNotifications = React.memo(
|
const TabNotifications = React.memo(
|
||||||
() => {
|
() => {
|
||||||
const navigation = useNavigation()
|
|
||||||
const { t, i18n } = useTranslation('screenTabs')
|
const { t, i18n } = useTranslation('screenTabs')
|
||||||
|
|
||||||
const screenOptions = useMemo(
|
|
||||||
() => ({
|
|
||||||
headerHideShadow: true,
|
|
||||||
headerTopInsetEnabled: false
|
|
||||||
}),
|
|
||||||
[]
|
|
||||||
)
|
|
||||||
const screenOptionsRoot = useMemo(
|
const screenOptionsRoot = useMemo(
|
||||||
() => ({
|
() => ({
|
||||||
headerTitle: t('tabs.notifications.name'),
|
headerTitle: t('tabs.notifications.name'),
|
||||||
|
@ -39,7 +32,7 @@ const TabNotifications = React.memo(
|
||||||
content='Filter'
|
content='Filter'
|
||||||
onPress={() => {
|
onPress={() => {
|
||||||
analytics('notificationsfilter_tap')
|
analytics('notificationsfilter_tap')
|
||||||
navigation.navigate('Screen-Actions', {
|
navigationRef.navigate('Screen-Actions', {
|
||||||
type: 'notifications_filter'
|
type: 'notifications_filter'
|
||||||
})
|
})
|
||||||
}}
|
}}
|
||||||
|
@ -62,13 +55,13 @@ const TabNotifications = React.memo(
|
||||||
)
|
)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Stack.Navigator screenOptions={screenOptions}>
|
<Stack.Navigator screenOptions={{ headerShadowVisible: false }}>
|
||||||
<Stack.Screen
|
<Stack.Screen
|
||||||
name='Tab-Notifications-Root'
|
name='Tab-Notifications-Root'
|
||||||
children={children}
|
children={children}
|
||||||
options={screenOptionsRoot}
|
options={screenOptionsRoot}
|
||||||
/>
|
/>
|
||||||
{sharedScreens(Stack as any)}
|
{TabSharedRoot({ Stack })}
|
||||||
</Stack.Navigator>
|
</Stack.Navigator>
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
|
|
|
@ -3,26 +3,23 @@ import { HeaderRight } from '@components/Header'
|
||||||
import Timeline from '@components/Timeline'
|
import Timeline from '@components/Timeline'
|
||||||
import TimelineDefault from '@components/Timeline/Default'
|
import TimelineDefault from '@components/Timeline/Default'
|
||||||
import SegmentedControl from '@react-native-community/segmented-control'
|
import SegmentedControl from '@react-native-community/segmented-control'
|
||||||
import { BottomTabScreenProps } from '@react-navigation/bottom-tabs'
|
import { createNativeStackNavigator } from '@react-navigation/native-stack'
|
||||||
import { ScreenTabsParamList } from '@screens/Tabs'
|
import {
|
||||||
import sharedScreens from '@screens/Tabs/Shared/sharedScreens'
|
ScreenTabsScreenProps,
|
||||||
|
TabPublicStackParamList
|
||||||
|
} from '@utils/navigation/navigators'
|
||||||
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
|
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
|
||||||
import { useTheme } from '@utils/styles/ThemeManager'
|
import { useTheme } from '@utils/styles/ThemeManager'
|
||||||
import React, { useCallback, useMemo, useState } from 'react'
|
import React, { useCallback, useMemo, useState } from 'react'
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
import { Dimensions, StyleSheet } from 'react-native'
|
import { Dimensions, StyleSheet } from 'react-native'
|
||||||
import { createNativeStackNavigator } from 'react-native-screens/native-stack'
|
|
||||||
import { TabView } from 'react-native-tab-view'
|
import { TabView } from 'react-native-tab-view'
|
||||||
|
import TabSharedRoot from './Shared/Root'
|
||||||
|
|
||||||
export type TabPublicProps = BottomTabScreenProps<
|
const Stack = createNativeStackNavigator<TabPublicStackParamList>()
|
||||||
ScreenTabsParamList,
|
|
||||||
'Tab-Public'
|
|
||||||
>
|
|
||||||
|
|
||||||
const Stack = createNativeStackNavigator<Nav.TabPublicStackParamList>()
|
|
||||||
|
|
||||||
const TabPublic = React.memo(
|
const TabPublic = React.memo(
|
||||||
({ navigation }: TabPublicProps) => {
|
({ navigation }: ScreenTabsScreenProps<'Tab-Public'>) => {
|
||||||
const { t, i18n } = useTranslation('screenTabs')
|
const { t, i18n } = useTranslation('screenTabs')
|
||||||
const { mode } = useTheme()
|
const { mode } = useTheme()
|
||||||
|
|
||||||
|
@ -40,16 +37,9 @@ const TabPublic = React.memo(
|
||||||
key: 'Local'
|
key: 'Local'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
const screenOptions = useMemo(
|
|
||||||
() => ({
|
|
||||||
headerHideShadow: true,
|
|
||||||
headerTopInsetEnabled: false
|
|
||||||
}),
|
|
||||||
[]
|
|
||||||
)
|
|
||||||
const screenOptionsRoot = useMemo(
|
const screenOptionsRoot = useMemo(
|
||||||
() => ({
|
() => ({
|
||||||
headerCenter: () => (
|
headerTitle: () => (
|
||||||
<SegmentedControl
|
<SegmentedControl
|
||||||
appearance={mode}
|
appearance={mode}
|
||||||
values={pages.map(p => p.title)}
|
values={pages.map(p => p.title)}
|
||||||
|
@ -113,13 +103,13 @@ const TabPublic = React.memo(
|
||||||
)
|
)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Stack.Navigator screenOptions={screenOptions}>
|
<Stack.Navigator screenOptions={{ headerShadowVisible: false }}>
|
||||||
<Stack.Screen
|
<Stack.Screen
|
||||||
name='Tab-Public-Root'
|
name='Tab-Public-Root'
|
||||||
options={screenOptionsRoot}
|
options={screenOptionsRoot}
|
||||||
children={children}
|
children={children}
|
||||||
/>
|
/>
|
||||||
{sharedScreens(Stack as any)}
|
{TabSharedRoot({ Stack })}
|
||||||
</Stack.Navigator>
|
</Stack.Navigator>
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { HeaderRight } from '@components/Header'
|
||||||
import Timeline from '@components/Timeline'
|
import Timeline from '@components/Timeline'
|
||||||
import TimelineDefault from '@components/Timeline/Default'
|
import TimelineDefault from '@components/Timeline/Default'
|
||||||
import SegmentedControl from '@react-native-community/segmented-control'
|
import SegmentedControl from '@react-native-community/segmented-control'
|
||||||
|
import { TabSharedStackScreenProps } from '@utils/navigation/navigators'
|
||||||
import { useAccountQuery } from '@utils/queryHooks/account'
|
import { useAccountQuery } from '@utils/queryHooks/account'
|
||||||
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
|
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
|
||||||
import { StyleConstants } from '@utils/styles/constants'
|
import { StyleConstants } from '@utils/styles/constants'
|
||||||
|
@ -16,9 +17,10 @@ import AccountAttachments from './Account/Attachments'
|
||||||
import AccountHeader from './Account/Header'
|
import AccountHeader from './Account/Header'
|
||||||
import AccountInformation from './Account/Information'
|
import AccountInformation from './Account/Information'
|
||||||
import AccountNav from './Account/Nav'
|
import AccountNav from './Account/Nav'
|
||||||
import { SharedAccountProp } from './sharedScreens'
|
|
||||||
|
|
||||||
const TabSharedAccount: React.FC<SharedAccountProp> = ({
|
const TabSharedAccount: React.FC<TabSharedStackScreenProps<
|
||||||
|
'Tab-Shared-Account'
|
||||||
|
>> = ({
|
||||||
route: {
|
route: {
|
||||||
params: { account }
|
params: { account }
|
||||||
},
|
},
|
||||||
|
|
|
@ -3,6 +3,7 @@ import GracefullyImage from '@components/GracefullyImage'
|
||||||
import Icon from '@components/Icon'
|
import Icon from '@components/Icon'
|
||||||
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 { TabLocalStackParamList } from '@utils/navigation/navigators'
|
||||||
import { useTimelineQuery } from '@utils/queryHooks/timeline'
|
import { useTimelineQuery } 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'
|
||||||
|
@ -24,7 +25,7 @@ export interface Props {
|
||||||
const AccountAttachments = React.memo(
|
const AccountAttachments = React.memo(
|
||||||
({ account }: Props) => {
|
({ account }: Props) => {
|
||||||
const navigation = useNavigation<
|
const navigation = useNavigation<
|
||||||
StackNavigationProp<Nav.TabLocalStackParamList>
|
StackNavigationProp<TabLocalStackParamList>
|
||||||
>()
|
>()
|
||||||
const { theme } = useTheme()
|
const { theme } = useTheme()
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@ export interface Props {
|
||||||
}
|
}
|
||||||
|
|
||||||
const Conversation = ({ account }: { account: Mastodon.Account }) => {
|
const Conversation = ({ account }: { account: Mastodon.Account }) => {
|
||||||
const navigation = useNavigation()
|
const navigation = useNavigation<any>()
|
||||||
const query = useRelationshipQuery({ id: account.id })
|
const query = useRelationshipQuery({ id: account.id })
|
||||||
|
|
||||||
return query.data && !query.data.blocked_by ? (
|
return query.data && !query.data.blocked_by ? (
|
||||||
|
@ -45,7 +45,7 @@ const AccountInformationActions: React.FC<Props> = ({ account, myInfo }) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
const { t } = useTranslation('screenTabs')
|
const { t } = useTranslation('screenTabs')
|
||||||
const navigation = useNavigation()
|
const navigation = useNavigation<any>()
|
||||||
|
|
||||||
if (account?.moved) {
|
if (account?.moved) {
|
||||||
const accountMoved = account.moved
|
const accountMoved = account.moved
|
||||||
|
|
|
@ -4,6 +4,7 @@ import GracefullyImage from '@components/GracefullyImage'
|
||||||
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 { useAccessibility } from '@utils/accessibility/AccessibilityManager'
|
import { useAccessibility } from '@utils/accessibility/AccessibilityManager'
|
||||||
|
import { TabLocalStackParamList } from '@utils/navigation/navigators'
|
||||||
import { StyleConstants } from '@utils/styles/constants'
|
import { StyleConstants } from '@utils/styles/constants'
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
import { Pressable, StyleSheet, View } from 'react-native'
|
import { Pressable, StyleSheet, View } from 'react-native'
|
||||||
|
@ -20,7 +21,7 @@ const AccountInformationAvatar: React.FC<Props> = ({
|
||||||
edit
|
edit
|
||||||
}) => {
|
}) => {
|
||||||
const navigation = useNavigation<
|
const navigation = useNavigation<
|
||||||
StackNavigationProp<Nav.TabLocalStackParamList>
|
StackNavigationProp<TabLocalStackParamList>
|
||||||
>()
|
>()
|
||||||
const { reduceMotionEnabled } = useAccessibility()
|
const { reduceMotionEnabled } = useAccessibility()
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { useNavigation } from '@react-navigation/native'
|
||||||
import { StackNavigationProp } from '@react-navigation/stack'
|
import { StackNavigationProp } from '@react-navigation/stack'
|
||||||
import { StyleConstants } from '@root/utils/styles/constants'
|
import { StyleConstants } from '@root/utils/styles/constants'
|
||||||
import { useTheme } from '@root/utils/styles/ThemeManager'
|
import { useTheme } from '@root/utils/styles/ThemeManager'
|
||||||
|
import { TabLocalStackParamList } from '@utils/navigation/navigators'
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
import { StyleSheet, Text, View } from 'react-native'
|
import { StyleSheet, Text, View } from 'react-native'
|
||||||
|
@ -15,7 +16,7 @@ export interface Props {
|
||||||
|
|
||||||
const AccountInformationStats: React.FC<Props> = ({ account, myInfo }) => {
|
const AccountInformationStats: React.FC<Props> = ({ account, myInfo }) => {
|
||||||
const navigation = useNavigation<
|
const navigation = useNavigation<
|
||||||
StackNavigationProp<Nav.TabLocalStackParamList>
|
StackNavigationProp<TabLocalStackParamList>
|
||||||
>()
|
>()
|
||||||
const { theme } = useTheme()
|
const { theme } = useTheme()
|
||||||
const { t } = useTranslation('screenTabs')
|
const { t } = useTranslation('screenTabs')
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
import Timeline from '@components/Timeline'
|
import Timeline from '@components/Timeline'
|
||||||
import TimelineDefault from '@components/Timeline/Default'
|
import TimelineDefault from '@components/Timeline/Default'
|
||||||
|
import { TabSharedStackScreenProps } from '@utils/navigation/navigators'
|
||||||
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
|
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
|
||||||
import React, { useCallback } from 'react'
|
import React, { useCallback } from 'react'
|
||||||
import { SharedAttachmentsProp } from './sharedScreens'
|
|
||||||
|
|
||||||
const TabSharedAttachments: React.FC<SharedAttachmentsProp> = ({
|
const TabSharedAttachments: React.FC<TabSharedStackScreenProps<
|
||||||
|
'Tab-Shared-Attachments'
|
||||||
|
>> = ({
|
||||||
route: {
|
route: {
|
||||||
params: { account }
|
params: { account }
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
import Timeline from '@components/Timeline'
|
import Timeline from '@components/Timeline'
|
||||||
import TimelineDefault from '@components/Timeline/Default'
|
import TimelineDefault from '@components/Timeline/Default'
|
||||||
|
import { TabSharedStackScreenProps } from '@utils/navigation/navigators'
|
||||||
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
|
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
|
||||||
import React, { useCallback } from 'react'
|
import React, { useCallback } from 'react'
|
||||||
import { SharedHashtagProp } from './sharedScreens'
|
|
||||||
|
|
||||||
const TabSharedHashtag: React.FC<SharedHashtagProp> = ({
|
const TabSharedHashtag: React.FC<TabSharedStackScreenProps<
|
||||||
|
'Tab-Shared-Hashtag'
|
||||||
|
>> = ({
|
||||||
route: {
|
route: {
|
||||||
params: { hashtag }
|
params: { hashtag }
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,208 @@
|
||||||
|
import { HeaderCenter, HeaderLeft } from '@components/Header'
|
||||||
|
import { ParseEmojis } from '@components/Parse'
|
||||||
|
import { createNativeStackNavigator } from '@react-navigation/native-stack'
|
||||||
|
import TabSharedAccount from '@screens/Tabs/Shared/Account'
|
||||||
|
import TabSharedAttachments from '@screens/Tabs/Shared/Attachments'
|
||||||
|
import TabSharedHashtag from '@screens/Tabs/Shared/Hashtag'
|
||||||
|
import TabSharedSearch from '@screens/Tabs/Shared/Search'
|
||||||
|
import TabSharedToot from '@screens/Tabs/Shared/Toot'
|
||||||
|
import TabSharedUsers from '@screens/Tabs/Shared/Users'
|
||||||
|
import { TabSharedStackScreenProps } from '@utils/navigation/navigators'
|
||||||
|
import { StyleConstants } from '@utils/styles/constants'
|
||||||
|
import { useTheme } from '@utils/styles/ThemeManager'
|
||||||
|
import { debounce } from 'lodash'
|
||||||
|
import React from 'react'
|
||||||
|
import { Trans, useTranslation } from 'react-i18next'
|
||||||
|
import { Platform, StyleSheet, Text, TextInput, View } from 'react-native'
|
||||||
|
|
||||||
|
const TabSharedRoot = ({
|
||||||
|
Stack
|
||||||
|
}: {
|
||||||
|
Stack: ReturnType<typeof createNativeStackNavigator>
|
||||||
|
}) => {
|
||||||
|
const { mode, theme } = useTheme()
|
||||||
|
const { t } = useTranslation('screenTabs')
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Stack.Group
|
||||||
|
screenOptions={({ navigation }) => ({
|
||||||
|
headerLeft: () => <HeaderLeft onPress={() => navigation.goBack()} />
|
||||||
|
})}
|
||||||
|
>
|
||||||
|
<Stack.Screen
|
||||||
|
key='Tab-Shared-Account'
|
||||||
|
name='Tab-Shared-Account'
|
||||||
|
component={TabSharedAccount}
|
||||||
|
options={({
|
||||||
|
navigation
|
||||||
|
}: TabSharedStackScreenProps<'Tab-Shared-Account'>) => {
|
||||||
|
return {
|
||||||
|
headerTransparent: true,
|
||||||
|
headerStyle: {
|
||||||
|
backgroundColor: `rgba(255, 255, 255, 0)`
|
||||||
|
},
|
||||||
|
headerTitle: '',
|
||||||
|
headerLeft: () => (
|
||||||
|
<HeaderLeft onPress={() => navigation.goBack()} background />
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Stack.Screen
|
||||||
|
key='Tab-Shared-Attachments'
|
||||||
|
name='Tab-Shared-Attachments'
|
||||||
|
component={TabSharedAttachments}
|
||||||
|
options={({
|
||||||
|
route: {
|
||||||
|
params: { account }
|
||||||
|
}
|
||||||
|
}: TabSharedStackScreenProps<'Tab-Shared-Attachments'>) => {
|
||||||
|
return {
|
||||||
|
headerTitle: () => (
|
||||||
|
<Text numberOfLines={1}>
|
||||||
|
<Trans
|
||||||
|
i18nKey='screenTabs:shared.attachments.name'
|
||||||
|
components={[
|
||||||
|
<ParseEmojis
|
||||||
|
content={account.display_name || account.username}
|
||||||
|
emojis={account.emojis}
|
||||||
|
fontBold
|
||||||
|
/>,
|
||||||
|
<Text
|
||||||
|
style={{
|
||||||
|
...StyleConstants.FontStyle.M,
|
||||||
|
color: theme.primaryDefault,
|
||||||
|
fontWeight: StyleConstants.Font.Weight.Bold
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
</Text>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Stack.Screen
|
||||||
|
key='Tab-Shared-Hashtag'
|
||||||
|
name='Tab-Shared-Hashtag'
|
||||||
|
component={TabSharedHashtag}
|
||||||
|
options={({
|
||||||
|
route
|
||||||
|
}: TabSharedStackScreenProps<'Tab-Shared-Hashtag'>) => ({
|
||||||
|
headerTitle: `#${decodeURIComponent(route.params.hashtag)}`,
|
||||||
|
...(Platform.OS === 'android' && {
|
||||||
|
headerCenter: () => (
|
||||||
|
<HeaderCenter
|
||||||
|
content={`#${decodeURIComponent(route.params.hashtag)}`}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Stack.Screen
|
||||||
|
key='Tab-Shared-Search'
|
||||||
|
name='Tab-Shared-Search'
|
||||||
|
component={TabSharedSearch}
|
||||||
|
options={({
|
||||||
|
navigation
|
||||||
|
}: TabSharedStackScreenProps<'Tab-Shared-Search'>) => ({
|
||||||
|
headerTitle: () => {
|
||||||
|
const onChangeText = debounce(
|
||||||
|
(text: string) => navigation.setParams({ text }),
|
||||||
|
1000,
|
||||||
|
{
|
||||||
|
trailing: true
|
||||||
|
}
|
||||||
|
)
|
||||||
|
return (
|
||||||
|
<View style={styles.searchBar}>
|
||||||
|
<TextInput
|
||||||
|
editable={false}
|
||||||
|
style={[
|
||||||
|
styles.textInput,
|
||||||
|
{
|
||||||
|
color: theme.primaryDefault
|
||||||
|
}
|
||||||
|
]}
|
||||||
|
defaultValue={t('shared.search.header.prefix')}
|
||||||
|
/>
|
||||||
|
<TextInput
|
||||||
|
accessibilityRole='search'
|
||||||
|
keyboardAppearance={mode}
|
||||||
|
style={[
|
||||||
|
styles.textInput,
|
||||||
|
{
|
||||||
|
flex: 1,
|
||||||
|
color: theme.primaryDefault,
|
||||||
|
paddingLeft: StyleConstants.Spacing.XS
|
||||||
|
}
|
||||||
|
]}
|
||||||
|
autoFocus
|
||||||
|
onChangeText={onChangeText}
|
||||||
|
autoCapitalize='none'
|
||||||
|
autoCorrect={false}
|
||||||
|
clearButtonMode='never'
|
||||||
|
keyboardType='web-search'
|
||||||
|
onSubmitEditing={({ nativeEvent: { text } }) =>
|
||||||
|
navigation.setParams({ text })
|
||||||
|
}
|
||||||
|
placeholder={t('shared.search.header.placeholder')}
|
||||||
|
placeholderTextColor={theme.secondary}
|
||||||
|
returnKeyType='go'
|
||||||
|
/>
|
||||||
|
</View>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Stack.Screen
|
||||||
|
key='Tab-Shared-Toot'
|
||||||
|
name='Tab-Shared-Toot'
|
||||||
|
component={TabSharedToot}
|
||||||
|
options={{
|
||||||
|
headerTitle: t('shared.toot.name'),
|
||||||
|
...(Platform.OS === 'android' && {
|
||||||
|
headerCenter: () => <HeaderCenter content={t('shared.toot.name')} />
|
||||||
|
})
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Stack.Screen
|
||||||
|
key='Tab-Shared-Users'
|
||||||
|
name='Tab-Shared-Users'
|
||||||
|
component={TabSharedUsers}
|
||||||
|
options={({
|
||||||
|
route: {
|
||||||
|
params: { reference, type, count }
|
||||||
|
}
|
||||||
|
}: TabSharedStackScreenProps<'Tab-Shared-Users'>) => ({
|
||||||
|
headerTitle: t(`shared.users.${reference}.${type}`, { count }),
|
||||||
|
...(Platform.OS === 'android' && {
|
||||||
|
headerCenter: () => (
|
||||||
|
<HeaderCenter
|
||||||
|
content={t(`shared.users.${reference}.${type}`, { count })}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
</Stack.Group>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
searchBar: {
|
||||||
|
flexBasis: '80%',
|
||||||
|
flexDirection: 'row',
|
||||||
|
alignItems: 'center'
|
||||||
|
},
|
||||||
|
textInput: {
|
||||||
|
fontSize: StyleConstants.Font.Size.M
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
export default TabSharedRoot
|
|
@ -2,6 +2,7 @@ import ComponentAccount from '@components/Account'
|
||||||
import ComponentHashtag from '@components/Hashtag'
|
import ComponentHashtag from '@components/Hashtag'
|
||||||
import ComponentSeparator from '@components/Separator'
|
import ComponentSeparator from '@components/Separator'
|
||||||
import TimelineDefault from '@components/Timeline/Default'
|
import TimelineDefault from '@components/Timeline/Default'
|
||||||
|
import { TabSharedStackScreenProps } from '@utils/navigation/navigators'
|
||||||
import { useSearchQuery } from '@utils/queryHooks/search'
|
import { useSearchQuery } from '@utils/queryHooks/search'
|
||||||
import { StyleConstants } from '@utils/styles/constants'
|
import { StyleConstants } from '@utils/styles/constants'
|
||||||
import { useTheme } from '@utils/styles/ThemeManager'
|
import { useTheme } from '@utils/styles/ThemeManager'
|
||||||
|
@ -16,9 +17,10 @@ import {
|
||||||
View
|
View
|
||||||
} from 'react-native'
|
} from 'react-native'
|
||||||
import { Circle } from 'react-native-animated-spinkit'
|
import { Circle } from 'react-native-animated-spinkit'
|
||||||
import { SharedSearchProp } from './sharedScreens'
|
|
||||||
|
|
||||||
const TabSharedSearch: React.FC<SharedSearchProp> = ({
|
const TabSharedSearch: React.FC<TabSharedStackScreenProps<
|
||||||
|
'Tab-Shared-Search'
|
||||||
|
>> = ({
|
||||||
route: {
|
route: {
|
||||||
params: { text }
|
params: { text }
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
import Timeline from '@components/Timeline'
|
import Timeline from '@components/Timeline'
|
||||||
import TimelineDefault from '@components/Timeline/Default'
|
import TimelineDefault from '@components/Timeline/Default'
|
||||||
import { useNavigation } from '@react-navigation/native'
|
import { useNavigation } from '@react-navigation/native'
|
||||||
|
import { TabSharedStackScreenProps } from '@utils/navigation/navigators'
|
||||||
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
|
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
|
||||||
import { findIndex } from 'lodash'
|
import { findIndex } from 'lodash'
|
||||||
import React, { useCallback, useEffect, useRef } from 'react'
|
import React, { useCallback, useEffect, useRef } from 'react'
|
||||||
import { FlatList } from 'react-native'
|
import { FlatList } from 'react-native'
|
||||||
import { InfiniteQueryObserver, useQueryClient } from 'react-query'
|
import { InfiniteQueryObserver, useQueryClient } from 'react-query'
|
||||||
import { SharedTootProp } from './sharedScreens'
|
|
||||||
|
|
||||||
const TabSharedToot: React.FC<SharedTootProp> = ({
|
const TabSharedToot: React.FC<TabSharedStackScreenProps<'Tab-Shared-Toot'>> = ({
|
||||||
route: {
|
route: {
|
||||||
params: { toot, rootQueryKey }
|
params: { toot, rootQueryKey }
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
import ComponentAccount from '@components/Account'
|
import ComponentAccount from '@components/Account'
|
||||||
import ComponentSeparator from '@components/Separator'
|
import ComponentSeparator from '@components/Separator'
|
||||||
|
import { TabSharedStackScreenProps } from '@utils/navigation/navigators'
|
||||||
import { QueryKeyUsers, useUsersQuery } from '@utils/queryHooks/users'
|
import { QueryKeyUsers, useUsersQuery } from '@utils/queryHooks/users'
|
||||||
import React, { useCallback } from 'react'
|
import React, { useCallback } from 'react'
|
||||||
import { StyleSheet } from 'react-native'
|
import { StyleSheet } from 'react-native'
|
||||||
import { FlatList } from 'react-native-gesture-handler'
|
import { FlatList } from 'react-native-gesture-handler'
|
||||||
import { SharedUsersProp } from './sharedScreens'
|
|
||||||
|
|
||||||
const TabSharedUsers = React.memo(
|
const TabSharedUsers = React.memo(
|
||||||
({ route: { params } }: SharedUsersProp) => {
|
({ route: { params } }: TabSharedStackScreenProps<'Tab-Shared-Users'>) => {
|
||||||
const queryKey: QueryKeyUsers = ['Users', params]
|
const queryKey: QueryKeyUsers = ['Users', params]
|
||||||
const {
|
const {
|
||||||
data,
|
data,
|
||||||
|
|
|
@ -1,237 +0,0 @@
|
||||||
import { HeaderCenter, HeaderLeft } from '@components/Header'
|
|
||||||
import { ParseEmojis } from '@components/Parse'
|
|
||||||
import { StackNavigationState, TypedNavigator } from '@react-navigation/native'
|
|
||||||
import { StackScreenProps } from '@react-navigation/stack'
|
|
||||||
import TabSharedAccount from '@screens/Tabs/Shared/Account'
|
|
||||||
import TabSharedAttachments from '@screens/Tabs/Shared/Attachments'
|
|
||||||
import TabSharedHashtag from '@screens/Tabs/Shared/Hashtag'
|
|
||||||
import TabSharedSearch from '@screens/Tabs/Shared/Search'
|
|
||||||
import TabSharedToot from '@screens/Tabs/Shared/Toot'
|
|
||||||
import TabSharedUsers from '@screens/Tabs/Shared/Users'
|
|
||||||
import { StyleConstants } from '@utils/styles/constants'
|
|
||||||
import { useTheme } from '@utils/styles/ThemeManager'
|
|
||||||
import { debounce } from 'lodash'
|
|
||||||
import React from 'react'
|
|
||||||
import { Trans, useTranslation } from 'react-i18next'
|
|
||||||
import { Platform, StyleSheet, Text, TextInput, View } from 'react-native'
|
|
||||||
import { NativeStackNavigationOptions } from 'react-native-screens/lib/typescript/native-stack'
|
|
||||||
import {
|
|
||||||
NativeStackNavigationEventMap,
|
|
||||||
NativeStackNavigatorProps
|
|
||||||
} from 'react-native-screens/lib/typescript/native-stack/types'
|
|
||||||
|
|
||||||
export type BaseScreens =
|
|
||||||
| Nav.TabLocalStackParamList
|
|
||||||
| Nav.TabPublicStackParamList
|
|
||||||
| Nav.TabNotificationsStackParamList
|
|
||||||
| Nav.TabMeStackParamList
|
|
||||||
|
|
||||||
export type SharedAccountProp = StackScreenProps<
|
|
||||||
BaseScreens,
|
|
||||||
'Tab-Shared-Account'
|
|
||||||
>
|
|
||||||
|
|
||||||
export type SharedAttachmentsProp = StackScreenProps<
|
|
||||||
BaseScreens,
|
|
||||||
'Tab-Shared-Attachments'
|
|
||||||
>
|
|
||||||
|
|
||||||
export type SharedHashtagProp = StackScreenProps<
|
|
||||||
BaseScreens,
|
|
||||||
'Tab-Shared-Hashtag'
|
|
||||||
>
|
|
||||||
|
|
||||||
export type SharedSearchProp = StackScreenProps<
|
|
||||||
BaseScreens,
|
|
||||||
'Tab-Shared-Search'
|
|
||||||
>
|
|
||||||
|
|
||||||
export type SharedTootProp = StackScreenProps<BaseScreens, 'Tab-Shared-Toot'>
|
|
||||||
|
|
||||||
export type SharedUsersProp = StackScreenProps<BaseScreens, 'Tab-Shared-Users'>
|
|
||||||
|
|
||||||
const sharedScreens = (
|
|
||||||
Stack: TypedNavigator<
|
|
||||||
BaseScreens,
|
|
||||||
StackNavigationState<Record<string, object | undefined>>,
|
|
||||||
NativeStackNavigationOptions,
|
|
||||||
NativeStackNavigationEventMap,
|
|
||||||
({ ...rest }: NativeStackNavigatorProps) => JSX.Element
|
|
||||||
>
|
|
||||||
) => {
|
|
||||||
const { mode, theme } = useTheme()
|
|
||||||
const { t } = useTranslation('screenTabs')
|
|
||||||
|
|
||||||
return [
|
|
||||||
<Stack.Screen
|
|
||||||
key='Tab-Shared-Account'
|
|
||||||
name='Tab-Shared-Account'
|
|
||||||
component={TabSharedAccount}
|
|
||||||
options={({ navigation }: SharedAccountProp) => {
|
|
||||||
return {
|
|
||||||
headerTranslucent: true,
|
|
||||||
headerStyle: {
|
|
||||||
backgroundColor: `rgba(255, 255, 255, 0)`
|
|
||||||
},
|
|
||||||
headerCenter: () => null,
|
|
||||||
headerLeft: () => (
|
|
||||||
<HeaderLeft onPress={() => navigation.goBack()} background />
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
/>,
|
|
||||||
<Stack.Screen
|
|
||||||
key='Tab-Shared-Attachments'
|
|
||||||
name='Tab-Shared-Attachments'
|
|
||||||
component={TabSharedAttachments}
|
|
||||||
options={({
|
|
||||||
route: {
|
|
||||||
params: { account }
|
|
||||||
},
|
|
||||||
navigation
|
|
||||||
}: SharedAttachmentsProp) => {
|
|
||||||
return {
|
|
||||||
headerLeft: () => <HeaderLeft onPress={() => navigation.goBack()} />,
|
|
||||||
headerCenter: () => (
|
|
||||||
<Text numberOfLines={1}>
|
|
||||||
<Trans
|
|
||||||
i18nKey='screenTabs:shared.attachments.name'
|
|
||||||
components={[
|
|
||||||
<ParseEmojis
|
|
||||||
content={account.display_name || account.username}
|
|
||||||
emojis={account.emojis}
|
|
||||||
fontBold
|
|
||||||
/>,
|
|
||||||
<Text
|
|
||||||
style={{
|
|
||||||
...StyleConstants.FontStyle.M,
|
|
||||||
color: theme.primaryDefault,
|
|
||||||
fontWeight: StyleConstants.Font.Weight.Bold
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
</Text>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
/>,
|
|
||||||
<Stack.Screen
|
|
||||||
key='Tab-Shared-Hashtag'
|
|
||||||
name='Tab-Shared-Hashtag'
|
|
||||||
component={TabSharedHashtag}
|
|
||||||
options={({ route, navigation }: SharedHashtagProp) => ({
|
|
||||||
headerTitle: `#${decodeURIComponent(route.params.hashtag)}`,
|
|
||||||
...(Platform.OS === 'android' && {
|
|
||||||
headerCenter: () => (
|
|
||||||
<HeaderCenter
|
|
||||||
content={`#${decodeURIComponent(route.params.hashtag)}`}
|
|
||||||
/>
|
|
||||||
)
|
|
||||||
}),
|
|
||||||
headerLeft: () => <HeaderLeft onPress={() => navigation.goBack()} />
|
|
||||||
})}
|
|
||||||
/>,
|
|
||||||
<Stack.Screen
|
|
||||||
key='Tab-Shared-Search'
|
|
||||||
name='Tab-Shared-Search'
|
|
||||||
component={TabSharedSearch}
|
|
||||||
options={({ navigation }: SharedSearchProp) => ({
|
|
||||||
headerLeft: () => <HeaderLeft onPress={() => navigation.goBack()} />,
|
|
||||||
headerCenter: () => {
|
|
||||||
const onChangeText = debounce(
|
|
||||||
(text: string) => navigation.setParams({ text }),
|
|
||||||
1000,
|
|
||||||
{
|
|
||||||
trailing: true
|
|
||||||
}
|
|
||||||
)
|
|
||||||
return (
|
|
||||||
<View style={styles.searchBar}>
|
|
||||||
<TextInput
|
|
||||||
editable={false}
|
|
||||||
style={[
|
|
||||||
styles.textInput,
|
|
||||||
{
|
|
||||||
color: theme.primaryDefault
|
|
||||||
}
|
|
||||||
]}
|
|
||||||
defaultValue={t('shared.search.header.prefix')}
|
|
||||||
/>
|
|
||||||
<TextInput
|
|
||||||
accessibilityRole='search'
|
|
||||||
keyboardAppearance={mode}
|
|
||||||
style={[
|
|
||||||
styles.textInput,
|
|
||||||
{
|
|
||||||
flex: 1,
|
|
||||||
color: theme.primaryDefault,
|
|
||||||
paddingLeft: StyleConstants.Spacing.XS
|
|
||||||
}
|
|
||||||
]}
|
|
||||||
autoFocus
|
|
||||||
onChangeText={onChangeText}
|
|
||||||
autoCapitalize='none'
|
|
||||||
autoCorrect={false}
|
|
||||||
clearButtonMode='never'
|
|
||||||
keyboardType='web-search'
|
|
||||||
onSubmitEditing={({ nativeEvent: { text } }) =>
|
|
||||||
navigation.setParams({ text })
|
|
||||||
}
|
|
||||||
placeholder={t('shared.search.header.placeholder')}
|
|
||||||
placeholderTextColor={theme.secondary}
|
|
||||||
returnKeyType='go'
|
|
||||||
/>
|
|
||||||
</View>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
})}
|
|
||||||
/>,
|
|
||||||
<Stack.Screen
|
|
||||||
key='Tab-Shared-Toot'
|
|
||||||
name='Tab-Shared-Toot'
|
|
||||||
component={TabSharedToot}
|
|
||||||
options={({ navigation }: SharedTootProp) => ({
|
|
||||||
headerTitle: t('shared.toot.name'),
|
|
||||||
...(Platform.OS === 'android' && {
|
|
||||||
headerCenter: () => <HeaderCenter content={t('shared.toot.name')} />
|
|
||||||
}),
|
|
||||||
headerLeft: () => <HeaderLeft onPress={() => navigation.goBack()} />
|
|
||||||
})}
|
|
||||||
/>,
|
|
||||||
<Stack.Screen
|
|
||||||
key='Tab-Shared-Users'
|
|
||||||
name='Tab-Shared-Users'
|
|
||||||
component={TabSharedUsers}
|
|
||||||
options={({
|
|
||||||
navigation,
|
|
||||||
route: {
|
|
||||||
params: { reference, type, count }
|
|
||||||
}
|
|
||||||
}: SharedUsersProp) => ({
|
|
||||||
headerLeft: () => <HeaderLeft onPress={() => navigation.goBack()} />,
|
|
||||||
headerTitle: t(`shared.users.${reference}.${type}`, { count }),
|
|
||||||
...(Platform.OS === 'android' && {
|
|
||||||
headerCenter: () => (
|
|
||||||
<HeaderCenter
|
|
||||||
content={t(`shared.users.${reference}.${type}`, { count })}
|
|
||||||
/>
|
|
||||||
)
|
|
||||||
})
|
|
||||||
})}
|
|
||||||
/>
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
|
||||||
searchBar: {
|
|
||||||
flexBasis: '80%',
|
|
||||||
flexDirection: 'row',
|
|
||||||
alignItems: 'center'
|
|
||||||
},
|
|
||||||
textInput: {
|
|
||||||
fontSize: StyleConstants.Font.Size.M
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
export default sharedScreens
|
|
|
@ -5,9 +5,8 @@ const audio = () => {
|
||||||
log('log', 'audio', 'setting audio playback default options')
|
log('log', 'audio', 'setting audio playback default options')
|
||||||
Audio.setAudioModeAsync({
|
Audio.setAudioModeAsync({
|
||||||
playsInSilentModeIOS: true,
|
playsInSilentModeIOS: true,
|
||||||
interruptionModeIOS: Audio.INTERRUPTION_MODE_IOS_DO_NOT_MIX,
|
interruptionModeIOS: Audio.INTERRUPTION_MODE_IOS_DUCK_OTHERS,
|
||||||
interruptionModeAndroid: Audio.INTERRUPTION_MODE_ANDROID_DO_NOT_MIX,
|
interruptionModeAndroid: Audio.INTERRUPTION_MODE_ANDROID_DUCK_OTHERS
|
||||||
shouldDuckAndroid: true
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
34
src/store.ts
34
src/store.ts
|
@ -1,10 +1,10 @@
|
||||||
import createSecureStore from '@neverdull-agency/expo-unlimited-secure-store'
|
import createSecureStore from '@neverdull-agency/expo-unlimited-secure-store'
|
||||||
import AsyncStorage from '@react-native-async-storage/async-storage'
|
import AsyncStorage from '@react-native-async-storage/async-storage'
|
||||||
import { configureStore, getDefaultMiddleware } from '@reduxjs/toolkit'
|
import { AnyAction, configureStore, Reducer } from '@reduxjs/toolkit'
|
||||||
import instancesMigration from '@utils/migrations/instances/migration'
|
import instancesMigration from '@utils/migrations/instances/migration'
|
||||||
import contextsSlice from '@utils/slices/contextsSlice'
|
import contextsSlice, { ContextsState } from '@utils/slices/contextsSlice'
|
||||||
import instancesSlice from '@utils/slices/instancesSlice'
|
import instancesSlice, { InstancesState } from '@utils/slices/instancesSlice'
|
||||||
import settingsSlice from '@utils/slices/settingsSlice'
|
import settingsSlice, { SettingsState } from '@utils/slices/settingsSlice'
|
||||||
import versionSlice from '@utils/slices/versionSlice'
|
import versionSlice from '@utils/slices/versionSlice'
|
||||||
import { createMigrate, persistReducer, persistStore } from 'redux-persist'
|
import { createMigrate, persistReducer, persistStore } from 'redux-persist'
|
||||||
|
|
||||||
|
@ -35,16 +35,26 @@ const settingsPersistConfig = {
|
||||||
|
|
||||||
const store = configureStore({
|
const store = configureStore({
|
||||||
reducer: {
|
reducer: {
|
||||||
contexts: persistReducer(contextsPersistConfig, contextsSlice),
|
contexts: persistReducer(contextsPersistConfig, contextsSlice) as Reducer<
|
||||||
instances: persistReducer(instancesPersistConfig, instancesSlice),
|
ContextsState,
|
||||||
settings: persistReducer(settingsPersistConfig, settingsSlice),
|
AnyAction
|
||||||
|
>,
|
||||||
|
instances: persistReducer(
|
||||||
|
instancesPersistConfig,
|
||||||
|
instancesSlice
|
||||||
|
) as Reducer<InstancesState, AnyAction>,
|
||||||
|
settings: persistReducer(settingsPersistConfig, settingsSlice) as Reducer<
|
||||||
|
SettingsState,
|
||||||
|
AnyAction
|
||||||
|
>,
|
||||||
version: versionSlice
|
version: versionSlice
|
||||||
},
|
},
|
||||||
middleware: getDefaultMiddleware({
|
middleware: getDefaultMiddleware =>
|
||||||
serializableCheck: {
|
getDefaultMiddleware({
|
||||||
ignoredActions: ['persist/PERSIST']
|
serializableCheck: {
|
||||||
}
|
ignoredActions: ['persist/PERSIST']
|
||||||
})
|
}
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
let persistor = persistStore(store)
|
let persistor = persistStore(store)
|
||||||
|
|
|
@ -0,0 +1,177 @@
|
||||||
|
import { BottomTabScreenProps } from '@react-navigation/bottom-tabs'
|
||||||
|
import { NavigatorScreenParams } from '@react-navigation/native'
|
||||||
|
import { NativeStackScreenProps } from '@react-navigation/native-stack'
|
||||||
|
import { StackNavigationProp } from '@react-navigation/stack'
|
||||||
|
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
|
||||||
|
|
||||||
|
export type RootStackParamList = {
|
||||||
|
'Screen-Tabs': NavigatorScreenParams<ScreenTabsStackParamList>
|
||||||
|
'Screen-Actions':
|
||||||
|
| {
|
||||||
|
type: 'status'
|
||||||
|
queryKey: QueryKeyTimeline
|
||||||
|
rootQueryKey?: QueryKeyTimeline
|
||||||
|
status: Mastodon.Status
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
type: 'account'
|
||||||
|
account: Mastodon.Account
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
type: 'notifications_filter'
|
||||||
|
}
|
||||||
|
'Screen-Announcements': { showAll: boolean }
|
||||||
|
'Screen-Compose':
|
||||||
|
| {
|
||||||
|
type: 'edit'
|
||||||
|
incomingStatus: Mastodon.Status
|
||||||
|
replyToStatus?: Mastodon.Status
|
||||||
|
queryKey?: [
|
||||||
|
'Timeline',
|
||||||
|
{
|
||||||
|
page: App.Pages
|
||||||
|
hashtag?: Mastodon.Tag['name']
|
||||||
|
list?: Mastodon.List['id']
|
||||||
|
toot?: Mastodon.Status['id']
|
||||||
|
account?: Mastodon.Account['id']
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
type: 'reply'
|
||||||
|
incomingStatus: Mastodon.Status
|
||||||
|
accts: Mastodon.Account['acct'][]
|
||||||
|
queryKey?: [
|
||||||
|
'Timeline',
|
||||||
|
{
|
||||||
|
page: App.Pages
|
||||||
|
hashtag?: Mastodon.Tag['name']
|
||||||
|
list?: Mastodon.List['id']
|
||||||
|
toot?: Mastodon.Status['id']
|
||||||
|
account?: Mastodon.Account['id']
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
type: 'conversation'
|
||||||
|
accts: Mastodon.Account['acct'][]
|
||||||
|
}
|
||||||
|
| undefined
|
||||||
|
'Screen-ImagesViewer': {
|
||||||
|
imageUrls: {
|
||||||
|
id: Mastodon.Attachment['id']
|
||||||
|
preview_url: Mastodon.AttachmentImage['preview_url']
|
||||||
|
url: Mastodon.AttachmentImage['url']
|
||||||
|
remote_url?: Mastodon.AttachmentImage['remote_url']
|
||||||
|
blurhash: Mastodon.AttachmentImage['blurhash']
|
||||||
|
width?: number
|
||||||
|
height?: number
|
||||||
|
}[]
|
||||||
|
id: Mastodon.Attachment['id']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export type RootStackScreenProps<
|
||||||
|
T extends keyof RootStackParamList
|
||||||
|
> = NativeStackScreenProps<RootStackParamList, T>
|
||||||
|
|
||||||
|
export type ScreenComposeStackParamList = {
|
||||||
|
'Screen-Compose-Root': undefined
|
||||||
|
'Screen-Compose-EditAttachment': { index: number }
|
||||||
|
'Screen-Compose-DraftsList': { timestamp: number }
|
||||||
|
}
|
||||||
|
export type ScreenComposeStackScreenProps<
|
||||||
|
T extends keyof ScreenComposeStackParamList
|
||||||
|
> = NativeStackScreenProps<ScreenComposeStackParamList, T>
|
||||||
|
|
||||||
|
export type ScreenTabsStackParamList = {
|
||||||
|
'Tab-Local': NavigatorScreenParams<TabLocalStackParamList>
|
||||||
|
'Tab-Public': NavigatorScreenParams<TabPublicStackParamList>
|
||||||
|
'Tab-Compose': undefined
|
||||||
|
'Tab-Notifications': NavigatorScreenParams<TabNotificationsStackParamList>
|
||||||
|
'Tab-Me': NavigatorScreenParams<TabMeStackParamList>
|
||||||
|
}
|
||||||
|
export type ScreenTabsScreenProps<
|
||||||
|
T extends keyof ScreenTabsStackParamList
|
||||||
|
> = BottomTabScreenProps<ScreenTabsStackParamList, T>
|
||||||
|
|
||||||
|
export type TabSharedStackParamList = {
|
||||||
|
'Tab-Shared-Account': {
|
||||||
|
account: Mastodon.Account | Mastodon.Mention
|
||||||
|
}
|
||||||
|
'Tab-Shared-Attachments': { account: Mastodon.Account }
|
||||||
|
'Tab-Shared-Hashtag': {
|
||||||
|
hashtag: Mastodon.Tag['name']
|
||||||
|
}
|
||||||
|
'Tab-Shared-Search': { text: string | undefined }
|
||||||
|
'Tab-Shared-Toot': {
|
||||||
|
toot: Mastodon.Status
|
||||||
|
rootQueryKey?: QueryKeyTimeline
|
||||||
|
}
|
||||||
|
'Tab-Shared-Users':
|
||||||
|
| {
|
||||||
|
reference: 'accounts'
|
||||||
|
id: Mastodon.Account['id']
|
||||||
|
type: 'following' | 'followers'
|
||||||
|
count: number
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
reference: 'statuses'
|
||||||
|
id: Mastodon.Status['id']
|
||||||
|
type: 'reblogged_by' | 'favourited_by'
|
||||||
|
count: number
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export type TabSharedStackScreenProps<
|
||||||
|
T extends keyof TabSharedStackParamList
|
||||||
|
> = NativeStackScreenProps<TabSharedStackParamList, T>
|
||||||
|
|
||||||
|
export type TabLocalStackParamList = {
|
||||||
|
'Tab-Local-Root': undefined
|
||||||
|
} & TabSharedStackParamList
|
||||||
|
|
||||||
|
export type TabPublicStackParamList = {
|
||||||
|
'Tab-Public-Root': undefined
|
||||||
|
} & TabSharedStackParamList
|
||||||
|
|
||||||
|
export type TabNotificationsStackParamList = {
|
||||||
|
'Tab-Notifications-Root': undefined
|
||||||
|
} & TabSharedStackParamList
|
||||||
|
|
||||||
|
export type TabMeStackParamList = {
|
||||||
|
'Tab-Me-Root': undefined
|
||||||
|
'Tab-Me-Bookmarks': undefined
|
||||||
|
'Tab-Me-Conversations': undefined
|
||||||
|
'Tab-Me-Favourites': undefined
|
||||||
|
'Tab-Me-Lists': undefined
|
||||||
|
'Tab-Me-Lists-List': {
|
||||||
|
list: Mastodon.List['id']
|
||||||
|
title: Mastodon.List['title']
|
||||||
|
}
|
||||||
|
'Tab-Me-Profile': undefined
|
||||||
|
'Tab-Me-Push': undefined
|
||||||
|
'Tab-Me-Settings': undefined
|
||||||
|
'Tab-Me-Settings-Fontsize': undefined
|
||||||
|
'Tab-Me-Switch': undefined
|
||||||
|
} & TabSharedStackParamList
|
||||||
|
export type TabMeStackScreenProps<
|
||||||
|
T extends keyof TabMeStackParamList
|
||||||
|
> = NativeStackScreenProps<TabMeStackParamList, T>
|
||||||
|
export type TabMeStackNavigationProp<
|
||||||
|
RouteName extends keyof TabMeStackParamList
|
||||||
|
> = StackNavigationProp<TabMeStackParamList, RouteName>
|
||||||
|
|
||||||
|
export type TabMeProfileStackParamList = {
|
||||||
|
'Tab-Me-Profile-Root': undefined
|
||||||
|
'Tab-Me-Profile-Name': {
|
||||||
|
display_name: Mastodon.Account['display_name']
|
||||||
|
}
|
||||||
|
'Tab-Me-Profile-Note': {
|
||||||
|
note: Mastodon.Source['note']
|
||||||
|
}
|
||||||
|
'Tab-Me-Profile-Fields': {
|
||||||
|
fields?: Mastodon.Source['fields']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export type TabMeProfileStackScreenProps<
|
||||||
|
T extends keyof TabMeProfileStackParamList
|
||||||
|
> = NativeStackScreenProps<TabMeProfileStackParamList, T>
|
|
@ -1,7 +1,7 @@
|
||||||
import apiGeneral from '@api/general'
|
import apiGeneral from '@api/general'
|
||||||
import apiTooot from '@api/tooot'
|
import apiTooot from '@api/tooot'
|
||||||
import { displayMessage } from '@components/Message'
|
import { displayMessage } from '@components/Message'
|
||||||
import { NavigationContainerRef } from '@react-navigation/native'
|
import navigationRef from '@helpers/navigationRef'
|
||||||
import { Dispatch } from '@reduxjs/toolkit'
|
import { Dispatch } from '@reduxjs/toolkit'
|
||||||
import { disableAllPushes, Instance } from '@utils/slices/instancesSlice'
|
import { disableAllPushes, Instance } from '@utils/slices/instancesSlice'
|
||||||
import * as Notifications from 'expo-notifications'
|
import * as Notifications from 'expo-notifications'
|
||||||
|
@ -9,20 +9,13 @@ import { useEffect } from 'react'
|
||||||
import { TFunction } from 'react-i18next'
|
import { TFunction } from 'react-i18next'
|
||||||
|
|
||||||
export interface Params {
|
export interface Params {
|
||||||
navigationRef: React.RefObject<NavigationContainerRef>
|
|
||||||
mode: 'light' | 'dark'
|
mode: 'light' | 'dark'
|
||||||
t: TFunction<'screens'>
|
t: TFunction<'screens'>
|
||||||
instances: Instance[]
|
instances: Instance[]
|
||||||
dispatch: Dispatch<any>
|
dispatch: Dispatch<any>
|
||||||
}
|
}
|
||||||
|
|
||||||
const pushUseConnect = ({
|
const pushUseConnect = ({ mode, t, instances, dispatch }: Params) => {
|
||||||
navigationRef,
|
|
||||||
mode,
|
|
||||||
t,
|
|
||||||
instances,
|
|
||||||
dispatch
|
|
||||||
}: Params) => {
|
|
||||||
return useEffect(() => {
|
return useEffect(() => {
|
||||||
const connect = async () => {
|
const connect = async () => {
|
||||||
const expoToken = (
|
const expoToken = (
|
||||||
|
@ -48,13 +41,13 @@ const pushUseConnect = ({
|
||||||
message: t('pushError.message'),
|
message: t('pushError.message'),
|
||||||
description: t('pushError.description'),
|
description: t('pushError.description'),
|
||||||
onPress: () => {
|
onPress: () => {
|
||||||
navigationRef.current?.navigate('Screen-Tabs', {
|
navigationRef.navigate('Screen-Tabs', {
|
||||||
screen: 'Tab-Me',
|
screen: 'Tab-Me',
|
||||||
params: {
|
params: {
|
||||||
screen: 'Tab-Me-Root'
|
screen: 'Tab-Me-Root'
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
navigationRef.current?.navigate('Screen-Tabs', {
|
navigationRef.navigate('Screen-Tabs', {
|
||||||
screen: 'Tab-Me',
|
screen: 'Tab-Me',
|
||||||
params: {
|
params: {
|
||||||
screen: 'Tab-Me-Settings'
|
screen: 'Tab-Me-Settings'
|
||||||
|
|
|
@ -1,11 +1,8 @@
|
||||||
import apiInstance from '@api/instance'
|
import apiInstance from '@api/instance'
|
||||||
import { NavigationContainerRef } from '@react-navigation/native'
|
import navigationRef from '@helpers/navigationRef'
|
||||||
|
|
||||||
const pushUseNavigate = (
|
const pushUseNavigate = (id?: Mastodon.Notification['id']) => {
|
||||||
navigationRef: React.RefObject<NavigationContainerRef>,
|
navigationRef.navigate('Screen-Tabs', {
|
||||||
id?: Mastodon.Notification['id']
|
|
||||||
) => {
|
|
||||||
navigationRef.current?.navigate('Screen-Tabs', {
|
|
||||||
screen: 'Tab-Notifications',
|
screen: 'Tab-Notifications',
|
||||||
params: {
|
params: {
|
||||||
screen: 'Tab-Notifications-Root'
|
screen: 'Tab-Notifications-Root'
|
||||||
|
@ -21,7 +18,7 @@ const pushUseNavigate = (
|
||||||
url: `notifications/${id}`
|
url: `notifications/${id}`
|
||||||
}).then(({ body }) => {
|
}).then(({ body }) => {
|
||||||
if (body.status) {
|
if (body.status) {
|
||||||
navigationRef.current?.navigate('Screen-Tabs', {
|
navigationRef.navigate('Screen-Tabs', {
|
||||||
screen: 'Tab-Notifications',
|
screen: 'Tab-Notifications',
|
||||||
params: {
|
params: {
|
||||||
screen: 'Tab-Shared-Toot',
|
screen: 'Tab-Shared-Toot',
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
import { displayMessage } from '@components/Message'
|
import { displayMessage } from '@components/Message'
|
||||||
import { NavigationContainerRef } from '@react-navigation/native'
|
|
||||||
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
|
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
|
||||||
import { Instance, updateInstanceActive } from '@utils/slices/instancesSlice'
|
import { Instance, updateInstanceActive } from '@utils/slices/instancesSlice'
|
||||||
import * as Notifications from 'expo-notifications'
|
import * as Notifications from 'expo-notifications'
|
||||||
|
@ -10,12 +9,11 @@ import { useDispatch } from 'react-redux'
|
||||||
import pushUseNavigate from './useNavigate'
|
import pushUseNavigate from './useNavigate'
|
||||||
|
|
||||||
export interface Params {
|
export interface Params {
|
||||||
navigationRef: React.RefObject<NavigationContainerRef>
|
|
||||||
queryClient: QueryClient
|
queryClient: QueryClient
|
||||||
instances: Instance[]
|
instances: Instance[]
|
||||||
}
|
}
|
||||||
|
|
||||||
const pushUseReceive = ({ navigationRef, queryClient, instances }: Params) => {
|
const pushUseReceive = ({ queryClient, instances }: Params) => {
|
||||||
const dispatch = useDispatch()
|
const dispatch = useDispatch()
|
||||||
|
|
||||||
return useEffect(() => {
|
return useEffect(() => {
|
||||||
|
@ -46,7 +44,7 @@ const pushUseReceive = ({ navigationRef, queryClient, instances }: Params) => {
|
||||||
if (notificationIndex !== -1) {
|
if (notificationIndex !== -1) {
|
||||||
dispatch(updateInstanceActive(instances[notificationIndex]))
|
dispatch(updateInstanceActive(instances[notificationIndex]))
|
||||||
}
|
}
|
||||||
pushUseNavigate(navigationRef, payloadData.notification_id)
|
pushUseNavigate(payloadData.notification_id)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
import { NavigationContainerRef } from '@react-navigation/native'
|
|
||||||
import { Dispatch } from '@reduxjs/toolkit'
|
import { Dispatch } from '@reduxjs/toolkit'
|
||||||
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
|
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
|
||||||
import { Instance, updateInstanceActive } from '@utils/slices/instancesSlice'
|
import { Instance, updateInstanceActive } from '@utils/slices/instancesSlice'
|
||||||
|
@ -9,18 +8,12 @@ import { QueryClient } from 'react-query'
|
||||||
import pushUseNavigate from './useNavigate'
|
import pushUseNavigate from './useNavigate'
|
||||||
|
|
||||||
export interface Params {
|
export interface Params {
|
||||||
navigationRef: React.RefObject<NavigationContainerRef>
|
|
||||||
queryClient: QueryClient
|
queryClient: QueryClient
|
||||||
instances: Instance[]
|
instances: Instance[]
|
||||||
dispatch: Dispatch<any>
|
dispatch: Dispatch<any>
|
||||||
}
|
}
|
||||||
|
|
||||||
const pushUseRespond = ({
|
const pushUseRespond = ({ queryClient, instances, dispatch }: Params) => {
|
||||||
navigationRef,
|
|
||||||
queryClient,
|
|
||||||
instances,
|
|
||||||
dispatch
|
|
||||||
}: Params) => {
|
|
||||||
return useEffect(() => {
|
return useEffect(() => {
|
||||||
const subscription = Notifications.addNotificationResponseReceivedListener(
|
const subscription = Notifications.addNotificationResponseReceivedListener(
|
||||||
({ notification }) => {
|
({ notification }) => {
|
||||||
|
@ -44,7 +37,7 @@ const pushUseRespond = ({
|
||||||
if (notificationIndex !== -1) {
|
if (notificationIndex !== -1) {
|
||||||
dispatch(updateInstanceActive(instances[notificationIndex]))
|
dispatch(updateInstanceActive(instances[notificationIndex]))
|
||||||
}
|
}
|
||||||
pushUseNavigate(navigationRef, payloadData.notification_id)
|
pushUseNavigate(payloadData.notification_id)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
return () => subscription.remove()
|
return () => subscription.remove()
|
||||||
|
|
|
@ -87,7 +87,9 @@ const queryFunction = async ({
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
const res1 = await apiInstance<(Mastodon.Status & { _pinned: boolean} )[]>({
|
const res1 = await apiInstance<
|
||||||
|
(Mastodon.Status & { _pinned: boolean })[]
|
||||||
|
>({
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: `accounts/${account}/statuses`,
|
url: `accounts/${account}/statuses`,
|
||||||
params: {
|
params: {
|
||||||
|
@ -105,7 +107,7 @@ const queryFunction = async ({
|
||||||
exclude_replies: 'true'
|
exclude_replies: 'true'
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
return await {
|
return {
|
||||||
body: uniqBy([...res1.body, ...res2.body], 'id'),
|
body: uniqBy([...res1.body, ...res2.body], 'id'),
|
||||||
...(res2.links.next && { links: { next: res2.links.next } })
|
...(res2.links.next && { links: { next: res2.links.next } })
|
||||||
}
|
}
|
||||||
|
@ -175,8 +177,12 @@ const queryFunction = async ({
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: `statuses/${toot}/context`
|
url: `statuses/${toot}/context`
|
||||||
})
|
})
|
||||||
return await {
|
return {
|
||||||
body: [...res2_1.body.ancestors, res1_1.body, ...res2_1.body.descendants]
|
body: [
|
||||||
|
...res2_1.body.ancestors,
|
||||||
|
res1_1.body,
|
||||||
|
...res2_1.body.descendants
|
||||||
|
]
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return Promise.reject()
|
return Promise.reject()
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
import apiTooot from '@api/tooot'
|
import apiTooot from '@api/tooot'
|
||||||
import haptics from '@components/haptics'
|
import haptics from '@components/haptics'
|
||||||
import { AxiosError } from 'axios'
|
import { AxiosError } from 'axios'
|
||||||
import { Buffer } from 'buffer'
|
import * as Crypto from 'expo-crypto'
|
||||||
import Constants from 'expo-constants'
|
|
||||||
import { useQuery, UseQueryOptions } from 'react-query'
|
import { useQuery, UseQueryOptions } from 'react-query'
|
||||||
|
|
||||||
type Translations = {
|
type Translations = {
|
||||||
|
@ -24,13 +23,15 @@ export type QueryKeyTranslate = [
|
||||||
const queryFunction = async ({ queryKey }: { queryKey: QueryKeyTranslate }) => {
|
const queryFunction = async ({ queryKey }: { queryKey: QueryKeyTranslate }) => {
|
||||||
const { uri, source, target, text } = queryKey[1]
|
const { uri, source, target, text } = queryKey[1]
|
||||||
|
|
||||||
const uriEncoded = Buffer.from(uri.replace(/https?:\/\//, ''))
|
const uriEncoded = await Crypto.digestStringAsync(
|
||||||
.toString('base64')
|
Crypto.CryptoDigestAlgorithm.SHA256,
|
||||||
.replace('+', '-')
|
uri.replace(/https?:\/\//, ''),
|
||||||
.replace('/', '_')
|
{ encoding: Crypto.CryptoEncoding.HEX }
|
||||||
.replace(/=+$/, '')
|
)
|
||||||
const original = Buffer.from(JSON.stringify({ source, text })).toString(
|
const original = await Crypto.digestStringAsync(
|
||||||
'base64'
|
Crypto.CryptoDigestAlgorithm.SHA256,
|
||||||
|
JSON.stringify({ source, text }),
|
||||||
|
{ encoding: Crypto.CryptoEncoding.HEX }
|
||||||
)
|
)
|
||||||
|
|
||||||
const res = await apiTooot<Translations>({
|
const res = await apiTooot<Translations>({
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
import apiInstance from '@api/instance'
|
import apiInstance from '@api/instance'
|
||||||
|
import { TabSharedStackParamList } from '@utils/navigation/navigators'
|
||||||
import { AxiosError } from 'axios'
|
import { AxiosError } from 'axios'
|
||||||
import { useInfiniteQuery, UseInfiniteQueryOptions } from 'react-query'
|
import { useInfiniteQuery, UseInfiniteQueryOptions } from 'react-query'
|
||||||
|
|
||||||
export type QueryKeyUsers = [
|
export type QueryKeyUsers = [
|
||||||
'Users',
|
'Users',
|
||||||
Nav.TabSharedStackParamList['Tab-Shared-Users']
|
TabSharedStackParamList['Tab-Shared-Users']
|
||||||
]
|
]
|
||||||
|
|
||||||
const queryFunction = ({
|
const queryFunction = ({
|
||||||
|
|
|
@ -54,6 +54,13 @@ const addInstance = createAsyncThunk(
|
||||||
headers: { Authorization: `Bearer ${token}` }
|
headers: { Authorization: `Bearer ${token}` }
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const { body: filters } = await apiGeneral<Mastodon.Filter[]>({
|
||||||
|
method: 'get',
|
||||||
|
domain,
|
||||||
|
url: `api/v1/filters`,
|
||||||
|
headers: { Authorization: `Bearer ${token}` }
|
||||||
|
})
|
||||||
|
|
||||||
return Promise.resolve({
|
return Promise.resolve({
|
||||||
type,
|
type,
|
||||||
data: {
|
data: {
|
||||||
|
@ -70,6 +77,7 @@ const addInstance = createAsyncThunk(
|
||||||
avatarStatic: avatar_static,
|
avatarStatic: avatar_static,
|
||||||
preferences
|
preferences
|
||||||
},
|
},
|
||||||
|
filters,
|
||||||
notifications_filter: {
|
notifications_filter: {
|
||||||
follow: true,
|
follow: true,
|
||||||
favourite: true,
|
favourite: true,
|
||||||
|
|
|
@ -12,7 +12,7 @@ export const updateInstancePushDecode = createAsyncThunk(
|
||||||
async (
|
async (
|
||||||
disable: boolean,
|
disable: boolean,
|
||||||
{ getState }
|
{ getState }
|
||||||
): Promise<Instance['push']['decode']['value']> => {
|
): Promise<{ disable: Instance['push']['decode']['value'] }> => {
|
||||||
const state = getState() as RootState
|
const state = getState() as RootState
|
||||||
const instance = getInstance(state)
|
const instance = getInstance(state)
|
||||||
if (!instance?.url || !instance.account.id || !instance.push.keys) {
|
if (!instance?.url || !instance.account.id || !instance.push.keys) {
|
||||||
|
@ -89,6 +89,6 @@ export const updateInstancePushDecode = createAsyncThunk(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Promise.resolve(disable)
|
return Promise.resolve({ disable })
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
|
@ -274,7 +274,7 @@ const instancesSlice = createSlice({
|
||||||
.addCase(updateInstancePushDecode.fulfilled, (state, action) => {
|
.addCase(updateInstancePushDecode.fulfilled, (state, action) => {
|
||||||
const activeIndex = findInstanceActive(state.instances)
|
const activeIndex = findInstanceActive(state.instances)
|
||||||
state.instances[activeIndex].push.decode.loading = false
|
state.instances[activeIndex].push.decode.loading = false
|
||||||
state.instances[activeIndex].push.decode.value = action.payload
|
state.instances[activeIndex].push.decode.value = action.payload.disable
|
||||||
})
|
})
|
||||||
.addCase(updateInstancePushDecode.rejected, state => {
|
.addCase(updateInstancePushDecode.rejected, state => {
|
||||||
const activeIndex = findInstanceActive(state.instances)
|
const activeIndex = findInstanceActive(state.instances)
|
||||||
|
|
|
@ -13,7 +13,7 @@ export const changeAnalytics = createAsyncThunk(
|
||||||
'settings/changeAnalytics',
|
'settings/changeAnalytics',
|
||||||
async (newValue: SettingsState['analytics']) => {
|
async (newValue: SettingsState['analytics']) => {
|
||||||
await Analytics.setAnalyticsCollectionEnabled(newValue)
|
await Analytics.setAnalyticsCollectionEnabled(newValue)
|
||||||
return newValue
|
return { newValue }
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -75,7 +75,7 @@ const settingsSlice = createSlice({
|
||||||
},
|
},
|
||||||
extraReducers: builder => {
|
extraReducers: builder => {
|
||||||
builder.addCase(changeAnalytics.fulfilled, (state, action) => {
|
builder.addCase(changeAnalytics.fulfilled, (state, action) => {
|
||||||
state.analytics = action.payload
|
state.analytics = action.payload.newValue
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
|
@ -29,7 +29,7 @@ const versionSlice = createSlice({
|
||||||
reducers: {},
|
reducers: {},
|
||||||
extraReducers: builder => {
|
extraReducers: builder => {
|
||||||
builder.addCase(retriveVersionLatest.fulfilled, (state, action) => {
|
builder.addCase(retriveVersionLatest.fulfilled, (state, action) => {
|
||||||
if (action.payload && Constants.manifest.version) {
|
if (action.payload && Constants.manifest?.version) {
|
||||||
if (parseInt(action.payload) > parseInt(Constants.manifest.version)) {
|
if (parseInt(action.payload) > parseInt(Constants.manifest.version)) {
|
||||||
state.update = true
|
state.update = true
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue