Merge pull request #430 from tooot-app/main

Release v4.5.0
This commit is contained in:
xmflsct 2022-11-01 00:41:07 +01:00 committed by GitHub
commit 7837bde155
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
67 changed files with 1194 additions and 1010 deletions

View File

@ -25,7 +25,7 @@ jobs:
run: bundle install
- name: -- Step 5 -- Run fastlane
env:
DEVELOPER_DIR: /Applications/Xcode_13.4.1.app/Contents/Developer
DEVELOPER_DIR: /Applications/Xcode_14.0.1.app/Contents/Developer
ENVIRONMENT: ${{ steps.branch.outputs.branch }}
SENTRY_ENVIRONMENT: ${{ steps.branch.outputs.branch }}
LC_ALL: en_US.UTF-8

View File

@ -17,20 +17,20 @@ GEM
artifactory (3.0.15)
atomos (0.1.3)
aws-eventstream (1.2.0)
aws-partitions (1.636.0)
aws-sdk-core (3.154.0)
aws-partitions (1.653.0)
aws-sdk-core (3.166.0)
aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.525.0)
aws-sigv4 (~> 1.1)
aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.5)
jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.58.0)
aws-sdk-core (~> 3, >= 3.127.0)
aws-sdk-kms (1.59.0)
aws-sdk-core (~> 3, >= 3.165.0)
aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.114.0)
aws-sdk-core (~> 3, >= 3.127.0)
aws-sdk-s3 (1.117.1)
aws-sdk-core (~> 3, >= 3.165.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.4)
aws-sigv4 (1.5.1)
aws-sigv4 (1.5.2)
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
claide (1.1.0)
@ -86,7 +86,7 @@ GEM
escape (0.0.4)
ethon (0.15.0)
ffi (>= 1.15.0)
excon (0.92.5)
excon (0.93.1)
faraday (1.10.2)
faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0)
@ -156,7 +156,7 @@ GEM
xcpretty (~> 0.3.0)
xcpretty-travis-formatter (>= 0.0.3)
fastlane-plugin-json (1.1.0)
fastlane-plugin-sentry (1.13.1)
fastlane-plugin-sentry (1.14.0)
os (~> 1.1, >= 1.1.4)
fastlane-plugin-versioning_android (0.1.0)
fastlane-plugin-yarn (1.2)
@ -164,9 +164,9 @@ GEM
fourflusher (2.3.1)
fuzzy_match (2.0.4)
gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.27.0)
google-apis-core (>= 0.7.2, < 2.a)
google-apis-core (0.9.0)
google-apis-androidpublisher_v3 (0.29.0)
google-apis-core (>= 0.9.0, < 2.a)
google-apis-core (0.9.1)
addressable (~> 2.5, >= 2.5.1)
googleauth (>= 0.16.2, < 2.a)
httpclient (>= 2.8.1, < 3.a)
@ -175,27 +175,27 @@ GEM
retriable (>= 2.0, < 4.a)
rexml
webrick
google-apis-iamcredentials_v1 (0.14.0)
google-apis-core (>= 0.7.2, < 2.a)
google-apis-playcustomapp_v1 (0.10.0)
google-apis-core (>= 0.7, < 2.a)
google-apis-storage_v1 (0.17.0)
google-apis-core (>= 0.7, < 2.a)
google-apis-iamcredentials_v1 (0.15.0)
google-apis-core (>= 0.9.0, < 2.a)
google-apis-playcustomapp_v1 (0.12.0)
google-apis-core (>= 0.9.1, < 2.a)
google-apis-storage_v1 (0.19.0)
google-apis-core (>= 0.9.0, < 2.a)
google-cloud-core (1.6.0)
google-cloud-env (~> 1.0)
google-cloud-errors (~> 1.0)
google-cloud-env (1.6.0)
faraday (>= 0.17.3, < 3.0)
google-cloud-errors (1.3.0)
google-cloud-storage (1.42.0)
google-cloud-storage (1.43.0)
addressable (~> 2.8)
digest-crc (~> 0.4)
google-apis-iamcredentials_v1 (~> 0.1)
google-apis-storage_v1 (~> 0.17.0)
google-apis-storage_v1 (~> 0.19.0)
google-cloud-core (~> 1.6)
googleauth (>= 0.16.2, < 2.a)
mini_mime (~> 1.0)
googleauth (1.2.0)
googleauth (1.3.0)
faraday (>= 0.17.3, < 3.a)
jwt (>= 1.4, < 3.0)
memoist (~> 0.16)
@ -276,11 +276,10 @@ GEM
rouge (~> 2.0.7)
xcpretty-travis-formatter (1.0.1)
xcpretty (~> 0.2, >= 0.0.7)
zeitwerk (2.6.0)
zeitwerk (2.6.1)
PLATFORMS
universal-darwin-20
universal-darwin-21
arm64-darwin-22
DEPENDENCIES
cocoapods
@ -291,4 +290,4 @@ DEPENDENCIES
fastlane-plugin-yarn
BUNDLED WITH
2.3.20
2.3.24

View File

@ -24,7 +24,6 @@ buildscript {
repositories {
google()
mavenCentral()
jcenter()
}
dependencies {
classpath 'com.google.gms:google-services:4.3.3'
@ -51,7 +50,6 @@ allprojects {
google()
mavenCentral()
jcenter()
maven { url 'https://www.jitpack.io' }
}
}

View File

@ -43,6 +43,15 @@ target 'tooot' do
config.build_settings['APPLICATION_EXTENSION_API_ONLY'] = 'No'
end
end
# For Xcode 14
installer.generated_projects.each do |project|
project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
end
end
end
end
post_integrate do |installer|

View File

@ -24,7 +24,7 @@ PODS:
- ExpoModulesCore
- EXNotifications (0.16.1):
- ExpoModulesCore
- Expo (46.0.15):
- Expo (46.0.16):
- ExpoModulesCore
- ExpoCrypto (11.0.0):
- ExpoModulesCore
@ -34,7 +34,7 @@ PODS:
- ExpoModulesCore
- ExpoLocalization (13.1.0):
- ExpoModulesCore
- ExpoModulesCore (0.11.7):
- ExpoModulesCore (0.11.8):
- React-Core
- ReactCommon/turbomodule/core
- ExpoRandom (12.3.0):
@ -416,9 +416,11 @@ PODS:
- React-Core
- react-native-language-detection (0.1.0):
- React
- react-native-netinfo (9.3.4):
- react-native-live-text-image-view (0.4.0):
- React-Core
- react-native-pager-view (6.0.1):
- react-native-netinfo (9.3.6):
- React-Core
- react-native-pager-view (6.0.2):
- React-Core
- react-native-paste-input (0.5.1):
- React-Core
@ -532,13 +534,13 @@ PODS:
- React-Core
- RNCClipboard (1.11.1):
- React-Core
- RNFastImage (8.6.1):
- RNFastImage (8.6.3):
- React-Core
- SDWebImage (~> 5.13.4)
- SDWebImageWebPCoder (~> 0.9.0)
- RNGestureHandler (2.7.1):
- SDWebImage (~> 5.13.5)
- SDWebImageWebPCoder (~> 0.9.1)
- RNGestureHandler (2.8.0):
- React-Core
- RNReanimated (2.10.0):
- RNReanimated (2.12.0):
- DoubleConversion
- FBLazyVector
- FBReactNativeSpec
@ -565,25 +567,25 @@ PODS:
- React-RCTText
- ReactCommon/turbomodule/core
- Yoga
- RNScreens (3.18.1):
- RNScreens (3.18.2):
- React-Core
- React-RCTImage
- RNSentry (4.6.1):
- RNSentry (4.7.1):
- React-Core
- Sentry (= 7.27.1)
- Sentry (= 7.28.0)
- RNShareMenu (6.0.0):
- React
- RNSVG (13.0.0):
- React-Core
- SDWebImage (5.13.4):
- SDWebImage/Core (= 5.13.4)
- SDWebImage/Core (5.13.4)
- SDWebImage (5.13.5):
- SDWebImage/Core (= 5.13.5)
- SDWebImage/Core (5.13.5)
- SDWebImageWebPCoder (0.9.1):
- libwebp (~> 1.0)
- SDWebImage/Core (~> 5.13)
- Sentry (7.27.1):
- Sentry/Core (= 7.27.1)
- Sentry/Core (7.27.1)
- Sentry (7.28.0):
- Sentry/Core (= 7.28.0)
- Sentry/Core (7.28.0)
- Swime (3.0.6)
- Yoga (1.14.0)
@ -642,6 +644,7 @@ DEPENDENCIES:
- react-native-context-menu-view (from `../node_modules/react-native-context-menu-view`)
- react-native-image-picker (from `../node_modules/react-native-image-picker`)
- react-native-language-detection (from `../node_modules/react-native-language-detection`)
- react-native-live-text-image-view (from `../node_modules/react-native-live-text-image-view`)
- "react-native-netinfo (from `../node_modules/@react-native-community/netinfo`)"
- react-native-pager-view (from `../node_modules/react-native-pager-view`)
- "react-native-paste-input (from `../node_modules/@mattermost/react-native-paste-input`)"
@ -790,6 +793,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native-image-picker"
react-native-language-detection:
:path: "../node_modules/react-native-language-detection"
react-native-live-text-image-view:
:path: "../node_modules/react-native-live-text-image-view"
react-native-netinfo:
:path: "../node_modules/@react-native-community/netinfo"
react-native-pager-view:
@ -857,12 +862,12 @@ SPEC CHECKSUMS:
EXFirebaseCore: cb1e6afad20c4c32a4966432c78ebfff29d8db6b
EXFont: 06df627203afcb8a3b3152ec06eb2f11f46f0cff
EXNotifications: 9a2aa201deb19dfe1dbe0e370eeb2922de0d2422
Expo: 7e821e708a35d2720ef6baa658e224dd91c4821e
Expo: 7ac824960a6059d6c68e73f432c8e6bf6d92a0ef
ExpoCrypto: e534314db0e1a17ae12b5140d529bd0c5efcbc6a
ExpoHaptics: efe9e68e9dfe0d15c183c0c70a25f3874124ab9e
ExpoKeepAwake: 0e8f18142e71bbf2c7f6aa66ebed249ba1420320
ExpoLocalization: 63204f4b9d4f653469d266332ceaa6c6ac8a305d
ExpoModulesCore: 2d60ec04c49641afb55fee3faac86fb108c68fe0
ExpoModulesCore: 39ec590ce622289c060183aba57f77b1e73b4e11
ExpoRandom: f9f1faa299a40733867f344d6b7bfa2d1f4ab04d
ExpoWebBrowser: 5804ac42a8269d0e534bc4461993005f72535649
EXScreenCapture: 23de056fdb02edd1fb8f147b0fd198c6d5cada3d
@ -909,8 +914,9 @@ SPEC CHECKSUMS:
react-native-context-menu-view: b0beca02aad4bd9f9d7d932bf437e0a03baa69ef
react-native-image-picker: 4bc9ed38c8be255b515d8c88babbaf74973f91a8
react-native-language-detection: 0e43195ad014974f1b7a31b64820eff34a243f2d
react-native-netinfo: 6ac9bcc7c88dc51717bda3484eb99093acb755e0
react-native-pager-view: 3051346698a0ba0c4e13e40097cc11b00ee03cca
react-native-live-text-image-view: 483bacfdba464162b8cf176bba555364f18b584c
react-native-netinfo: f80db8cac2151405633324cb645c60af098ee461
react-native-pager-view: 592421df0259bf7a7a4fe85b74c24f3f39905605
react-native-paste-input: 183ad7dc224e192719616f4258dde5b548627d08
react-native-safe-area-context: 99b24a0c5acd0d5dcac2b1a7f18c49ea317be99a
react-native-segmented-control: 65df6cd0619b780b3843d574a72d4c7cec396097
@ -928,19 +934,19 @@ SPEC CHECKSUMS:
ReactCommon: fe7580b9d10f00249facf25659e0ec051320cc8a
RNCAsyncStorage: 0c357f3156fcb16c8589ede67cc036330b6698ca
RNCClipboard: 2834e1c4af68697089cdd455ee4a4cdd198fa7dd
RNFastImage: e6267e27581b81918ebef6432c94c20718ec3b91
RNGestureHandler: b7a872907ee289ada902127f2554fa1d2c076122
RNReanimated: 7faa787e8d4493fbc95fab2ad331fa7625828cfa
RNScreens: 1b7bb502dac62cc4cf01b94bea591c8da275132f
RNSentry: f8591057d48d4f6d64196a76cbca67895667b033
RNFastImage: c74e098cb862b4870c3de0b1096b65c63e492938
RNGestureHandler: 62232ba8f562f7dea5ba1b3383494eb5bf97a4d3
RNReanimated: c3e58924b9418883b0bde9e78c4c957302f02435
RNScreens: 34cc502acf1b916c582c60003dc3089fa01dc66d
RNSentry: 694aecc3d8240e4935374974a6636e360ae06394
RNShareMenu: cb9dac548c8bf147d06f0bf07296ad51ea9f5fc3
RNSVG: 42a0c731b11179ebbd27a3eeeafa7201ebb476ff
SDWebImage: e5cc87bf736e60f49592f307bdf9e157189298a3
SDWebImage: 23d714cd599354ee7906dbae26dff89b421c4370
SDWebImageWebPCoder: 18503de6621dd2c420d680e33d46bf8e1d5169b0
Sentry: bc644307e2eb6a4c9c55cf117a80b895bb2a25a7
Sentry: 2c6053e4cfe6dea6608135dea1928ffbb4ecfba5
Swime: d7b2c277503b6cea317774aedc2dce05613f8b0b
Yoga: 75bf4b0131cfb46a659cd0c13309b79a6fcff66d
PODFILE CHECKSUM: 7f078a0355bc9bdbcbbe7257e7e62e1d45f77f75
PODFILE CHECKSUM: 244b6793e4be83f0909a91b2fe15c8f89a5e8151
COCOAPODS: 1.11.3

View File

@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */
@ -76,6 +76,7 @@
E633A427281EAEAB000E540F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
E633A42F281EAF38000E540F /* ShareViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ShareViewController.swift; path = "../../node_modules/react-native-share-menu/ios/ShareViewController.swift"; sourceTree = "<group>"; };
E633A431281EB55C000E540F /* ShareExtension-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ShareExtension-Bridging-Header.h"; sourceTree = "<group>"; };
E671BDF8290EAFB800287BD0 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
E69EBACA28DF282D0057EDEC /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = "<group>"; };
E69EBACB28DF283A0057EDEC /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/InfoPlist.strings; sourceTree = "<group>"; };
E69EBACC28DF28420057EDEC /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/InfoPlist.strings; sourceTree = "<group>"; };
@ -289,6 +290,7 @@
"pt-BR",
vi,
ja,
"zh-Hant",
);
mainGroup = 83CBB9F61A601CBA00E9B192;
productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
@ -328,6 +330,7 @@
/* Begin PBXShellScriptBuildPhase section */
00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
@ -444,6 +447,7 @@
};
FD10A7F022414F080027D42C /* Start Packager */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
@ -514,6 +518,7 @@
E69EBACD28DF284D0057EDEC /* pt-BR */,
E69EBACE28DF28560057EDEC /* vi */,
E6C8B26628F5F9FC0062CF2E /* ja */,
E671BDF8290EAFB800287BD0 /* zh-Hant */,
);
name = InfoPlist.strings;
sourceTree = "<group>";
@ -533,13 +538,17 @@
CURRENT_PROJECT_VERSION = 2102022230;
DEVELOPMENT_TEAM = 8EGBLQ2MA6;
ENABLE_BITCODE = NO;
"ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES;
GCC_PREPROCESSOR_DEFINITIONS = (
"$(inherited)",
"FB_SONARKIT_ENABLED=1",
);
INFOPLIST_FILE = tooot/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
@ -570,9 +579,13 @@
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 2102022230;
DEVELOPMENT_TEAM = 8EGBLQ2MA6;
"ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES;
INFOPLIST_FILE = tooot/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
@ -642,7 +655,10 @@
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)";
LD_RUNPATH_SEARCH_PATHS = (
/usr/lib/swift,
"$(inherited)",
);
LIBRARY_SEARCH_PATHS = "\"\"";
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
@ -695,7 +711,10 @@
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)";
LD_RUNPATH_SEARCH_PATHS = (
/usr/lib/swift,
"$(inherited)",
);
LIBRARY_SEARCH_PATHS = "\"\"";
MTL_ENABLE_DEBUG_INFO = NO;
ONLY_ACTIVE_ARCH = NO;
@ -730,7 +749,11 @@
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
"IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.2;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
@ -775,7 +798,11 @@
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
"IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.2;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.0;
MTL_FAST_MATH = YES;
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE";

View File

@ -1,24 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>aps-environment</key>
<string>development</string>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.xmflsct.app.tooot</string>
</array>
<key>com.apple.security.device.audio-input</key>
<true/>
<key>com.apple.security.device.camera</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
<key>com.apple.security.personal-information.location</key>
<true/>
<key>com.apple.security.personal-information.photos-library</key>
<true/>
</dict>
</plist>
<dict>
<key>aps-environment</key>
<string>development</string>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.xmflsct.app.tooot</string>
</array>
<key>com.apple.security.device.camera</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
<key>com.apple.security.personal-information.photos-library</key>
<true/>
</dict>
</plist>

View File

@ -0,0 +1,2 @@
"NSPhotoLibraryAddUsageDescription" = "允許tooot保存圖片至相冊";
"NSPhotoLibraryUsageDescription" = "允許tooot保存圖片至相冊";

View File

@ -1,6 +1,6 @@
{
"name": "tooot",
"version": "4.3.4",
"version": "4.5.0",
"description": "tooot for Mastodon",
"author": "xmflsct <me@xmflsct.com>",
"license": "GPL-3.0-or-later",
@ -18,30 +18,30 @@
"postinstall": "patch-package"
},
"dependencies": {
"@expo/react-native-action-sheet": "^3.14.0",
"@formatjs/intl-datetimeformat": "^6.2.0",
"@expo/react-native-action-sheet": "^4.0.0",
"@formatjs/intl-datetimeformat": "^6.3.1",
"@formatjs/intl-getcanonicallocales": "^2.0.4",
"@formatjs/intl-locale": "^3.0.6",
"@formatjs/intl-numberformat": "^8.1.3",
"@formatjs/intl-pluralrules": "^5.1.3",
"@formatjs/intl-relativetimeformat": "^11.1.3",
"@formatjs/intl-locale": "^3.0.7",
"@formatjs/intl-numberformat": "^8.2.0",
"@formatjs/intl-pluralrules": "^5.1.4",
"@formatjs/intl-relativetimeformat": "^11.1.4",
"@mattermost/react-native-paste-input": "^0.5.1",
"@neverdull-agency/expo-unlimited-secure-store": "^1.0.10",
"@react-native-async-storage/async-storage": "^1.17.10",
"@react-native-camera-roll/camera-roll": "^5.0.4",
"@react-native-clipboard/clipboard": "^1.11.1",
"@react-native-community/blur": "^4.2.0",
"@react-native-community/netinfo": "^9.3.4",
"@react-native-community/netinfo": "^9.3.6",
"@react-native-community/segmented-control": "^2.2.2",
"@react-navigation/bottom-tabs": "^6.4.0",
"@react-navigation/native": "^6.0.13",
"@react-navigation/native-stack": "^6.9.1",
"@react-navigation/stack": "^6.3.2",
"@react-navigation/stack": "^6.3.3",
"@reduxjs/toolkit": "^1.8.6",
"@sentry/react-native": "^4.6.1",
"@sentry/react-native": "^4.7.1",
"@sharcoux/slider": "^6.0.3",
"axios": "^0.27.2",
"expo": "^46.0.15",
"expo": "^46.0.16",
"expo-auth-session": "^3.7.1",
"expo-av": "^12.0.4",
"expo-constants": "^13.2.4",
@ -59,31 +59,32 @@
"expo-store-review": "^5.3.0",
"expo-video-thumbnails": "^6.4.0",
"expo-web-browser": "^11.0.0",
"i18next": "^21.10.0",
"i18next": "^22.0.4",
"li": "^1.3.0",
"linkify-it": "^4.0.1",
"lodash": "^4.17.21",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-i18next": "^11.18.6",
"react-intl": "^6.1.2",
"react-i18next": "^12.0.0",
"react-intl": "^6.2.1",
"react-native": "^0.69.6",
"react-native-animated-spinkit": "^1.5.2",
"react-native-base64": "^0.2.1",
"react-native-blurhash": "^1.1.10",
"react-native-context-menu-view": "xmflsct/react-native-context-menu-view",
"react-native-fast-image": "^8.6.1",
"react-native-fast-image": "^8.6.3",
"react-native-feather": "^1.1.2",
"react-native-flash-message": "^0.3.1",
"react-native-gesture-handler": "^2.7.1",
"react-native-gesture-handler": "^2.8.0",
"react-native-htmlview": "^0.16.0",
"react-native-image-picker": "^4.10.0",
"react-native-language-detection": "^0.1.0",
"react-native-pager-view": "^6.0.1",
"react-native-reanimated": "^2.10.0",
"react-native-reanimated-zoom": "^0.3.1",
"react-native-live-text-image-view": "^0.4.0",
"react-native-pager-view": "^6.0.2",
"react-native-reanimated": "^2.12.0",
"react-native-reanimated-zoom": "^0.3.2",
"react-native-safe-area-context": "^4.4.1",
"react-native-screens": "^3.18.1",
"react-native-screens": "^3.18.2",
"react-native-share-menu": "^6.0.0",
"react-native-svg": "13.0.0",
"react-native-swipe-list-view": "^3.2.9",
@ -95,15 +96,15 @@
"valid-url": "^1.0.9"
},
"devDependencies": {
"@babel/core": "^7.19.3",
"@babel/core": "^7.19.6",
"@babel/plugin-proposal-optional-chaining": "^7.18.9",
"@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.18.6",
"@expo/config": "^7.0.1",
"@types/linkify-it": "^3.0.2",
"@types/lodash": "^4.14.186",
"@types/react": "^18.0.21",
"@types/react-dom": "^18.0.6",
"@types/react": "^18.0.24",
"@types/react-dom": "^18.0.8",
"@types/react-native": "^0.69.5",
"@types/react-native-base64": "^0.2.0",
"@types/react-native-share-menu": "^5.0.2",
@ -114,7 +115,7 @@
"babel-plugin-transform-remove-console": "^6.9.4",
"chalk": "^4.1.2",
"dotenv": "^16.0.3",
"patch-package": "^6.4.7",
"patch-package": "^6.5.0",
"postinstall-postinstall": "^2.1.0",
"react-native-clean-project": "^4.0.1",
"typescript": "^4.8.4"

View File

@ -1,5 +1,5 @@
diff --git a/node_modules/react-native-fast-image/RNFastImage.podspec b/node_modules/react-native-fast-image/RNFastImage.podspec
index db0fada..c68771e 100644
index db0fada..23770b6 100644
--- a/node_modules/react-native-fast-image/RNFastImage.podspec
+++ b/node_modules/react-native-fast-image/RNFastImage.podspec
@@ -16,6 +16,6 @@ Pod::Spec.new do |s|
@ -8,8 +8,8 @@ index db0fada..c68771e 100644
s.dependency 'React-Core'
- s.dependency 'SDWebImage', '~> 5.11.1'
- s.dependency 'SDWebImageWebPCoder', '~> 0.8.4'
+ s.dependency 'SDWebImage', '~> 5.13.4'
+ s.dependency 'SDWebImageWebPCoder', '~> 0.9.0'
+ s.dependency 'SDWebImage', '~> 5.13.5'
+ s.dependency 'SDWebImageWebPCoder', '~> 0.9.1'
end
diff --git a/node_modules/react-native-fast-image/android/build.gradle b/node_modules/react-native-fast-image/android/build.gradle
index 5b21cd5..19d82f8 100644

View File

@ -0,0 +1,41 @@
diff --git a/node_modules/react-native-reanimated-zoom/lib/typescript/zoom.d.ts b/node_modules/react-native-reanimated-zoom/lib/typescript/zoom.d.ts
index 38fb6f1..e93c288 100644
--- a/node_modules/react-native-reanimated-zoom/lib/typescript/zoom.d.ts
+++ b/node_modules/react-native-reanimated-zoom/lib/typescript/zoom.d.ts
@@ -6,6 +6,7 @@ declare type Props = {
minimumZoomScale?: number;
maximumZoomScale?: number;
simultaneousGesture?: GestureType;
+ isZoomed?: SharedValue<boolean>;
} & ViewProps;
export declare function Zoom(props: Props): JSX.Element;
export {};
diff --git a/node_modules/react-native-reanimated-zoom/src/zoom.tsx b/node_modules/react-native-reanimated-zoom/src/zoom.tsx
index e07b415..d57a1eb 100644
--- a/node_modules/react-native-reanimated-zoom/src/zoom.tsx
+++ b/node_modules/react-native-reanimated-zoom/src/zoom.tsx
@@ -7,6 +7,7 @@ import Animated, {
withTiming,
cancelAnimation,
runOnJS,
+ SharedValue,
} from 'react-native-reanimated';
import {
Gesture,
@@ -20,6 +21,7 @@ type Props = {
minimumZoomScale?: number;
maximumZoomScale?: number;
simultaneousGesture?: GestureType;
+ isZoomed?: SharedValue<boolean>;
} & ViewProps;
export function Zoom(props: Props) {
@@ -39,7 +41,7 @@ export function Zoom(props: Props) {
const originY = useSharedValue(0);
const scale = useSharedValue(1);
const isPinching = useSharedValue(false);
- const isZoomed = useSharedValue(false);
+ const isZoomed = props.isZoomed || useSharedValue(false);
const viewHeight = useSharedValue(0);
const viewWidth = useSharedValue(0);

View File

@ -326,11 +326,7 @@ const Screens: React.FC<Props> = ({ localCorrupt }) => {
<Stack.Screen
name='Screen-ImagesViewer'
component={ScreenImagesViewer}
options={{
headerShown: false,
presentation: 'fullScreenModal',
animation: 'fade'
}}
options={{ headerShown: false, animation: 'fade' }}
/>
<Stack.Screen
name='Screen-AccountSelection'

View File

@ -9,6 +9,7 @@ import {
import { getInstanceAccount } from '@utils/slices/instancesSlice'
import { useTheme } from '@utils/styles/ThemeManager'
import { useTranslation } from 'react-i18next'
import { Platform } from 'react-native'
import { ContextMenuAction } from 'react-native-context-menu-view'
import { useQueryClient } from 'react-query'
import { useSelector } from 'react-redux'
@ -94,22 +95,50 @@ const contextMenuAccount = ({
context: (relationship?.muting || false).toString()
}),
systemIcon: 'eye.slash'
},
{
id: 'account-block',
title: t('account.block.action', {
context: (relationship?.blocking || false).toString()
}),
systemIcon: 'xmark.circle',
destructive: true
},
{
id: 'account-reports',
title: t('account.reports.action'),
systemIcon: 'flag',
destructive: true
}
)
switch (Platform.OS) {
case 'ios':
actions.push({
id: 'account',
title: t('account.title'),
actions: [
{
id: 'account-block',
title: t('account.block.action', {
context: (relationship?.blocking || false).toString()
}),
systemIcon: 'xmark.circle',
destructive: true
},
{
id: 'account-reports',
title: t('account.reports.action'),
systemIcon: 'flag',
destructive: true
}
]
})
break
default:
actions.push(
{
id: 'account-block',
title: t('account.block.action', {
context: (relationship?.blocking || false).toString()
}),
systemIcon: 'xmark.circle',
destructive: true
},
{
id: 'account-reports',
title: t('account.reports.action'),
systemIcon: 'flag',
destructive: true
}
)
break
}
}
return (index: number) => {

View File

@ -25,7 +25,7 @@ const contextMenuShare = ({ copiableContent, actions, type, url }: Props) => {
title: t(`share.${type}.action`),
systemIcon: 'square.and.arrow.up'
})
Platform.OS !== 'android' &&
Platform.OS !== 'android' && type === 'status' &&
actions.push({
id: 'copy',
title: t(`copy.action`),

View File

@ -89,7 +89,7 @@ const contextMenuStatus = ({
{
id: 'status-mute',
title: t('status.mute.action', {
context: status.muted.toString()
context: (status.muted || false).toString()
}),
systemIcon: status.muted ? 'speaker' : 'speaker.slash'
}
@ -108,7 +108,7 @@ const contextMenuStatus = ({
accountMenuItems.push({
id: 'status-pin',
title: t('status.pin.action', {
context: status.pinned.toString()
context: (status.pinned || false).toString()
}),
systemIcon: status.pinned ? 'pin.slash' : 'pin'
})

View File

@ -12,33 +12,6 @@ import { Edge, SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-co
import { useSelector } from 'react-redux'
import EmojisContext, { Emojis, emojisReducer, EmojisState } from './Emojis/helpers/EmojisContext'
const prefetchEmojis = (
sortedEmojis: {
title: string
data: Pick<Mastodon.Emoji, 'shortcode' | 'url' | 'static_url'>[][]
}[],
reduceMotionEnabled: boolean
) => {
const prefetches: { uri: string }[] = []
let requestedIndex = 0
sortedEmojis.forEach(sorted => {
sorted.data.forEach(emojis =>
emojis.forEach(emoji => {
if (requestedIndex > 40) {
return
}
prefetches.push({
uri: reduceMotionEnabled ? emoji.static_url : emoji.url
})
requestedIndex++
})
)
})
try {
FastImage.preload(prefetches)
} catch {}
}
export type Props = {
inputProps: EmojisState['inputProps']
customButton?: boolean
@ -82,7 +55,6 @@ const ComponentEmojis: React.FC<Props & PropsWithChildren> = ({
})
}
emojis.current = sortedEmojis
prefetchEmojis(sortedEmojis, reduceMotionEnabled)
}
}, [data, reduceMotionEnabled])

View File

@ -54,9 +54,6 @@ const EmojisList = () => {
const addedLength = spaceFront.length + shortcode.length + spaceRear.length
setSelection({ start: selection.start + addedLength })
ref?.current?.setNativeProps({
selection: { start: selection.start + addedLength }
})
}
const listItem = ({ index, item }: { item: Mastodon.Emoji[]; index: number }) => {

View File

@ -272,9 +272,9 @@ const ParseHTML = React.memo(
}}
children={t('HTML.expanded', {
hint: expandHint,
totalLines:
moreLines:
numberOfLines > 1 && typeof totalLines === 'number'
? t('HTML.totalLines', { count: totalLines })
? t('HTML.moreLines', { count: totalLines - numberOfLines })
: ''
})}
/>

View File

@ -33,7 +33,7 @@ const RelationshipOutgoing = React.memo(
queryKeyRelationship,
[res]
)
if (action === 'follow' || action === 'block') {
if (action === 'block') {
const queryKey: QueryKeyTimeline = ['Timeline', { page: 'Following' }]
queryClient.invalidateQueries(queryKey)
}

View File

@ -16,7 +16,7 @@ import { getInstanceAccount } from '@utils/slices/instancesSlice'
import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager'
import { uniqBy } from 'lodash'
import React, { useCallback, useEffect, useRef } from 'react'
import React, { useCallback, useRef } from 'react'
import { Pressable, View } from 'react-native'
import { useSelector } from 'react-redux'
import TimelineContextMenu from './Shared/ContextMenu'
@ -47,8 +47,7 @@ const TimelineDefault: React.FC<Props> = ({
}) => {
const { colors } = useTheme()
const instanceAccount = useSelector(getInstanceAccount, () => true)
const navigation =
useNavigation<StackNavigationProp<TabLocalStackParamList>>()
const navigation = useNavigation<StackNavigationProp<TabLocalStackParamList>>()
const actualStatus = item.reblog ? item.reblog : item
@ -60,9 +59,9 @@ const TimelineDefault: React.FC<Props> = ({
})
if (
!highlighted &&
queryKey &&
shouldFilter({ copiableContent, status: actualStatus, queryKey })
shouldFilter({ copiableContent, status: actualStatus, queryKey }) &&
!highlighted
) {
return <TimelineFiltered />
}
@ -92,9 +91,7 @@ const TimelineDefault: React.FC<Props> = ({
padding: StyleConstants.Spacing.Global.PagePadding,
backgroundColor: colors.backgroundDefault,
paddingBottom:
disableDetails && disableOnPress
? StyleConstants.Spacing.Global.PagePadding
: 0
disableDetails && disableOnPress ? StyleConstants.Spacing.Global.PagePadding : 0
}}
onPress={onPress}
onLongPress={() => {}}
@ -121,13 +118,10 @@ const TimelineDefault: React.FC<Props> = ({
<View
style={{
paddingTop: highlighted ? StyleConstants.Spacing.S : 0,
paddingLeft: highlighted
? 0
: StyleConstants.Avatar.M + StyleConstants.Spacing.S
paddingLeft: highlighted ? 0 : StyleConstants.Avatar.M + StyleConstants.Spacing.S
}}
>
{typeof actualStatus.content === 'string' &&
actualStatus.content.length > 0 ? (
{typeof actualStatus.content === 'string' && actualStatus.content.length > 0 ? (
<TimelineContent
status={actualStatus}
highlighted={highlighted}
@ -149,14 +143,9 @@ const TimelineDefault: React.FC<Props> = ({
actualStatus.media_attachments.length ? (
<TimelineAttachment status={actualStatus} />
) : null}
{!disableDetails && actualStatus.card ? (
<TimelineCard card={actualStatus.card} />
) : null}
{!disableDetails && actualStatus.card ? <TimelineCard card={actualStatus.card} /> : null}
{!disableDetails ? (
<TimelineFullConversation
queryKey={queryKey}
status={actualStatus}
/>
<TimelineFullConversation queryKey={queryKey} status={actualStatus} />
) : null}
<TimelineTranslate status={actualStatus} highlighted={highlighted} />
<TimelineFeedback status={actualStatus} highlighted={highlighted} />
@ -170,10 +159,7 @@ const TimelineDefault: React.FC<Props> = ({
status={actualStatus}
ownAccount={ownAccount}
accts={uniqBy(
(
[actualStatus.account] as Mastodon.Account[] &
Mastodon.Mention[]
)
([actualStatus.account] as Mastodon.Account[] & Mastodon.Mention[])
.concat(actualStatus.mentions)
.filter(d => d?.id !== instanceAccount?.id),
d => d?.id

View File

@ -2,6 +2,7 @@ import analytics from '@components/analytics'
import Icon from '@components/Icon'
import { displayMessage } from '@components/Message'
import CustomText from '@components/Text'
import { useActionSheet } from '@expo/react-native-action-sheet'
import { useNavigation } from '@react-navigation/native'
import { StackNavigationProp } from '@react-navigation/stack'
import { RootStackParamList } from '@utils/navigation/navigators'
@ -48,40 +49,18 @@ const TimelineActions: React.FC<Props> = ({
const theParams = params as MutationVarsTimelineUpdateStatusProperty
if (
// Un-bookmark from bookmarks page
(queryKey[1].page === 'Bookmarks' &&
theParams.payload.property === 'bookmarked') ||
(queryKey[1].page === 'Bookmarks' && theParams.payload.property === 'bookmarked') ||
// Un-favourite from favourites page
(queryKey[1].page === 'Favourites' &&
theParams.payload.property === 'favourited') ||
// Un-reblog from following page
(queryKey[1].page === 'Following' &&
theParams.payload.property === 'reblogged' &&
theParams.payload.currentValue === true)
(queryKey[1].page === 'Favourites' && theParams.payload.property === 'favourited')
) {
queryClient.invalidateQueries(queryKey)
} else if (
theParams.payload.property === 'reblogged' &&
queryKey[1].page !== 'Following'
) {
// When reblogged, update cache of following page
const tempQueryKey: QueryKeyTimeline = [
'Timeline',
{ page: 'Following' }
]
queryClient.invalidateQueries(tempQueryKey)
} else if (theParams.payload.property === 'favourited') {
// When favourited, update favourited page
const tempQueryKey: QueryKeyTimeline = [
'Timeline',
{ page: 'Favourites' }
]
const tempQueryKey: QueryKeyTimeline = ['Timeline', { page: 'Favourites' }]
queryClient.invalidateQueries(tempQueryKey)
} else if (theParams.payload.property === 'bookmarked') {
// When bookmarked, update bookmark page
const tempQueryKey: QueryKeyTimeline = [
'Timeline',
{ page: 'Bookmarks' }
]
const tempQueryKey: QueryKeyTimeline = ['Timeline', { page: 'Bookmarks' }]
queryClient.invalidateQueries(tempQueryKey)
}
},
@ -91,9 +70,7 @@ const TimelineActions: React.FC<Props> = ({
theme,
type: 'error',
message: t('common:message.error.message', {
function: t(
`shared.actions.${correctParam.payload.property}.function`
)
function: t(`shared.actions.${correctParam.payload.property}.function`)
}),
...(err.status &&
typeof err.status === 'number' &&
@ -119,25 +96,87 @@ const TimelineActions: React.FC<Props> = ({
queryKey
})
}, [status.replies_count])
const { showActionSheetWithOptions } = useActionSheet()
const onPressReblog = useCallback(() => {
analytics('timeline_shared_actions_reblog_press', {
page: queryKey[1].page,
count: status.reblogs_count,
current: status.reblogged
})
mutation.mutate({
type: 'updateStatusProperty',
queryKey,
rootQueryKey,
id: status.id,
reblog,
payload: {
property: 'reblogged',
currentValue: status.reblogged,
propertyCount: 'reblogs_count',
countValue: status.reblogs_count
}
})
if (!status.reblogged) {
showActionSheetWithOptions(
{
title: t('shared.actions.reblogged.options.title'),
options: [
t('shared.actions.reblogged.options.public'),
t('shared.actions.reblogged.options.unlisted'),
t('common:buttons.cancel')
],
cancelButtonIndex: 2
},
(selectedIndex: number) => {
switch (selectedIndex) {
case 0:
analytics('timeline_shared_actions_reblog_public_press', {
page: queryKey[1].page,
count: status.reblogs_count,
current: status.reblogged
})
mutation.mutate({
type: 'updateStatusProperty',
queryKey,
rootQueryKey,
id: status.id,
reblog,
payload: {
property: 'reblogged',
currentValue: status.reblogged,
propertyCount: 'reblogs_count',
countValue: status.reblogs_count,
visibility: 'public'
}
})
break
case 1:
analytics('timeline_shared_actions_reblog_unlisted_press', {
page: queryKey[1].page,
count: status.reblogs_count,
current: status.reblogged
})
mutation.mutate({
type: 'updateStatusProperty',
queryKey,
rootQueryKey,
id: status.id,
reblog,
payload: {
property: 'reblogged',
currentValue: status.reblogged,
propertyCount: 'reblogs_count',
countValue: status.reblogs_count,
visibility: 'unlisted'
}
})
break
}
}
)
} else {
analytics('timeline_shared_actions_reblog_press', {
page: queryKey[1].page,
count: status.reblogs_count,
current: status.reblogged
})
mutation.mutate({
type: 'updateStatusProperty',
queryKey,
rootQueryKey,
id: status.id,
reblog,
payload: {
property: 'reblogged',
currentValue: status.reblogged,
propertyCount: 'reblogs_count',
countValue: status.reblogs_count,
visibility: 'public'
}
})
}
}, [status.reblogged, status.reblogs_count])
const onPressFavourite = useCallback(() => {
analytics('timeline_shared_actions_favourite_press', {
@ -182,11 +221,7 @@ const TimelineActions: React.FC<Props> = ({
const childrenReply = useMemo(
() => (
<>
<Icon
name='MessageCircle'
color={iconColor}
size={StyleConstants.Font.Size.L}
/>
<Icon name='MessageCircle' color={iconColor} size={StyleConstants.Font.Size.L} />
{status.replies_count > 0 ? (
<CustomText
style={{
@ -209,8 +244,7 @@ const TimelineActions: React.FC<Props> = ({
<Icon
name='Repeat'
color={
status.visibility === 'direct' ||
(status.visibility === 'private' && !ownAccount)
status.visibility === 'direct' || (status.visibility === 'private' && !ownAccount)
? colors.disabled
: color(status.reblogged)
}
@ -237,11 +271,7 @@ const TimelineActions: React.FC<Props> = ({
const color = (state: boolean) => (state ? colors.red : colors.secondary)
return (
<>
<Icon
name='Heart'
color={color(status.favourited)}
size={StyleConstants.Font.Size.L}
/>
<Icon name='Heart' color={color(status.favourited)} size={StyleConstants.Font.Size.L} />
{status.favourites_count > 0 ? (
<CustomText
style={{
@ -260,29 +290,21 @@ const TimelineActions: React.FC<Props> = ({
const childrenBookmark = useMemo(() => {
const color = (state: boolean) => (state ? colors.yellow : colors.secondary)
return (
<Icon
name='Bookmark'
color={color(status.bookmarked)}
size={StyleConstants.Font.Size.L}
/>
<Icon name='Bookmark' color={color(status.bookmarked)} size={StyleConstants.Font.Size.L} />
)
}, [status.bookmarked])
return (
<View
style={{
paddingLeft: highlighted
? 0
: StyleConstants.Avatar.M + StyleConstants.Spacing.S
paddingLeft: highlighted ? 0 : StyleConstants.Avatar.M + StyleConstants.Spacing.S
}}
>
<View style={{ flexDirection: 'row' }}>
<Pressable
{...(highlighted
? {
accessibilityLabel: t(
'shared.actions.reply.accessibilityLabel'
),
accessibilityLabel: t('shared.actions.reply.accessibilityLabel'),
accessibilityRole: 'button'
}
: { accessibilityLabel: '' })}
@ -294,9 +316,7 @@ const TimelineActions: React.FC<Props> = ({
<Pressable
{...(highlighted
? {
accessibilityLabel: t(
'shared.actions.reblogged.accessibilityLabel'
),
accessibilityLabel: t('shared.actions.reblogged.accessibilityLabel'),
accessibilityRole: 'button'
}
: { accessibilityLabel: '' })}
@ -304,17 +324,14 @@ const TimelineActions: React.FC<Props> = ({
onPress={onPressReblog}
children={childrenReblog}
disabled={
status.visibility === 'direct' ||
(status.visibility === 'private' && !ownAccount)
status.visibility === 'direct' || (status.visibility === 'private' && !ownAccount)
}
/>
<Pressable
{...(highlighted
? {
accessibilityLabel: t(
'shared.actions.favourited.accessibilityLabel'
),
accessibilityLabel: t('shared.actions.favourited.accessibilityLabel'),
accessibilityRole: 'button'
}
: { accessibilityLabel: '' })}
@ -326,9 +343,7 @@ const TimelineActions: React.FC<Props> = ({
<Pressable
{...(highlighted
? {
accessibilityLabel: t(
'shared.actions.bookmarked.accessibilityLabel'
),
accessibilityLabel: t('shared.actions.bookmarked.accessibilityLabel'),
accessibilityRole: 'button'
}
: { accessibilityLabel: '' })}

View File

@ -6,10 +6,7 @@ import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
import React from 'react'
import { createContext } from 'react'
import { Platform } from 'react-native'
import ContextMenu, {
ContextMenuAction,
ContextMenuProps
} from 'react-native-context-menu-view'
import ContextMenu, { ContextMenuAction, ContextMenuProps } from 'react-native-context-menu-view'
export interface Props {
copiableContent: React.MutableRefObject<{
@ -52,13 +49,15 @@ const TimelineContextMenu: React.FC<Props & ContextMenuProps> = ({
queryKey,
rootQueryKey
})
const accountOnPress = contextMenuAccount({
actions,
type: 'status',
queryKey,
rootQueryKey,
id: status.account.id
})
const accountOnPress = status?.account?.id
? contextMenuAccount({
actions,
type: 'status',
queryKey,
rootQueryKey,
id: status.account.id
})
: null
const instanceOnPress = contextMenuInstance({
actions,
status,
@ -71,12 +70,7 @@ const TimelineContextMenu: React.FC<Props & ContextMenuProps> = ({
<ContextMenu
actions={actions}
onPress={({ nativeEvent: { index } }) => {
for (const on of [
shareOnPress,
statusOnPress,
accountOnPress,
instanceOnPress
]) {
for (const on of [shareOnPress, statusOnPress, accountOnPress, instanceOnPress]) {
on && on(index)
}
}}

View File

@ -1,8 +1,8 @@
{
"HTML": {
"accessibilityHint": "",
"expanded": "{{hint}}{{totalLines}}",
"totalLines": "",
"expanded": "{{hint}}{{moreLines}}",
"moreLines": "",
"defaultHint": ""
}
}

View File

@ -38,7 +38,12 @@
},
"reblogged": {
"accessibilityLabel": "Tröt boosten",
"function": "Boost"
"function": "Boost",
"options": {
"title": "",
"public": "",
"unlisted": ""
}
},
"favourited": {
"accessibilityLabel": "Favorit",

View File

@ -1,8 +1,8 @@
{
"HTML": {
"accessibilityHint": "Tap to expand or collapse content",
"expanded": "{{hint}}{{totalLines}}",
"totalLines": " ({{count}} lines)",
"expanded": "{{hint}}{{moreLines}}",
"moreLines": " ({{count}} more lines)",
"defaultHint": "Long toot"
}
}

View File

@ -38,7 +38,12 @@
},
"reblogged": {
"accessibilityLabel": "Boost this toot",
"function": "Boost toot"
"function": "Boost toot",
"options": {
"title": "Choose boost visibility",
"public": "Public boost",
"unlisted": "Unlist boost"
}
},
"favourited": {
"accessibilityLabel": "Add this toot to favourites",

View File

@ -9,6 +9,7 @@ import ko from '@root/i18n/ko/_all'
import pt_BR from '@root/i18n/pt_BR/_all'
import vi from '@root/i18n/vi/_all'
import zh_Hans from '@root/i18n/zh-Hans/_all'
import zh_Hant from '@root/i18n/zh-Hant/_all'
import '@formatjs/intl-getcanonicallocales/polyfill'
import '@formatjs/intl-locale/polyfill'
@ -32,6 +33,7 @@ import '@formatjs/intl-numberformat/locale-data/ko'
import '@formatjs/intl-numberformat/locale-data/pt'
import '@formatjs/intl-numberformat/locale-data/vi'
import '@formatjs/intl-numberformat/locale-data/zh-Hans'
import '@formatjs/intl-numberformat/locale-data/zh-Hant'
import '@formatjs/intl-datetimeformat/polyfill'
import '@formatjs/intl-datetimeformat/locale-data/de'
@ -42,6 +44,7 @@ import '@formatjs/intl-datetimeformat/locale-data/ko'
import '@formatjs/intl-datetimeformat/locale-data/pt'
import '@formatjs/intl-datetimeformat/locale-data/vi'
import '@formatjs/intl-datetimeformat/locale-data/zh-Hans'
import '@formatjs/intl-datetimeformat/locale-data/zh-Hant'
import '@formatjs/intl-datetimeformat/add-all-tz'
import '@formatjs/intl-relativetimeformat/polyfill'
@ -53,6 +56,7 @@ import '@formatjs/intl-relativetimeformat/locale-data/ko'
import '@formatjs/intl-relativetimeformat/locale-data/pt'
import '@formatjs/intl-relativetimeformat/locale-data/vi'
import '@formatjs/intl-relativetimeformat/locale-data/zh-Hans'
import '@formatjs/intl-relativetimeformat/locale-data/zh-Hant'
i18n.use(initReactI18next).init({
lng: 'en',
@ -61,7 +65,7 @@ i18n.use(initReactI18next).init({
ns: ['common'],
defaultNS: 'common',
resources: { de, en, it, ja, ko, 'pt-BR': pt_BR, vi, 'zh-Hans': zh_Hans },
resources: { de, en, it, ja, ko, 'pt-BR': pt_BR, vi, 'zh-Hans': zh_Hans, 'zh-Hant': zh_Hant },
returnEmptyString: false,
saveMissing: true,

View File

@ -1,8 +1,8 @@
{
"HTML": {
"accessibilityHint": "",
"expanded": "{{hint}}{{totalLines}}",
"totalLines": "",
"expanded": "{{hint}}{{moreLines}}",
"moreLines": "",
"defaultHint": ""
}
}

View File

@ -38,7 +38,12 @@
},
"reblogged": {
"accessibilityLabel": "Ricondividi questo toot",
"function": "Ricondividi toot"
"function": "Ricondividi toot",
"options": {
"title": "",
"public": "",
"unlisted": ""
}
},
"favourited": {
"accessibilityLabel": "Apprezza questo toot",

View File

@ -1,8 +1,8 @@
{
"HTML": {
"accessibilityHint": "タップして内容を展開または折りたたむ",
"expanded": "{{hint}}{{totalLines}}",
"totalLines": " ({{count}} 行)",
"expanded": "{{hint}}{{moreLines}}",
"moreLines": "",
"defaultHint": "長いトゥート"
}
}

View File

@ -21,14 +21,14 @@
"shared": {
"actioned": {
"pinned": "固定された投稿",
"favourite": "{name}さんがあなたのトゥートをお気に入りに登録しました",
"status": "{name}さんが投稿しました",
"follow": "{name}さんにフォローされました",
"favourite": "{{name}}さんがあなたのトゥートをお気に入りに登録しました",
"status": "{{name}}さんが投稿しました",
"follow": "{{name}}さんにフォローされました",
"follow_request": "{{name}}さんがフォローをリクエストしました",
"poll": "アンケートが終了しました",
"reblog": {
"default": "{name}さんがブースト",
"notification": "{name}さんがあなたのトゥートをブーストしました"
"default": "{{name}}さんがブースト",
"notification": "{{name}}さんがあなたのトゥートをブーストしました"
},
"update": "ブーストしたトゥートが編集されました"
},
@ -38,7 +38,12 @@
},
"reblogged": {
"accessibilityLabel": "このトゥートをブーストしますか?",
"function": "トゥートをブースト"
"function": "トゥートをブースト",
"options": {
"title": "",
"public": "",
"unlisted": ""
}
},
"favourited": {
"accessibilityLabel": "このトゥートをお気に入りに追加",

View File

@ -1,8 +1,8 @@
{
"HTML": {
"accessibilityHint": "",
"expanded": "{{hint}}{{totalLines}}",
"totalLines": "",
"expanded": "{{hint}}{{moreLines}}",
"moreLines": "",
"defaultHint": ""
}
}

View File

@ -38,7 +38,12 @@
},
"reblogged": {
"accessibilityLabel": "이 툿 부스트",
"function": "툿 부스트"
"function": "툿 부스트",
"options": {
"title": "",
"public": "",
"unlisted": ""
}
},
"favourited": {
"accessibilityLabel": "이 툿 즐겨찾기에 추가",

View File

@ -6,7 +6,8 @@ const LOCALES = {
ko: '한국어',
'pt-BR': 'Português (Brasil)',
vi: 'Tiếng Việt',
'zh-Hans': '简体中文'
'zh-Hans': '简体中文',
'zh-Hant': '繁體中文'
}
export { LOCALES }

View File

@ -1,8 +1,8 @@
{
"HTML": {
"accessibilityHint": "Toque para expandir ou recolher conteúdo",
"expanded": "{{hint}}{{totalLines}}",
"totalLines": "",
"expanded": "{{hint}}{{moreLines}}",
"moreLines": "",
"defaultHint": ""
}
}

View File

@ -38,7 +38,12 @@
},
"reblogged": {
"accessibilityLabel": "Boost este toot",
"function": "Boost toot"
"function": "Boost toot",
"options": {
"title": "",
"public": "",
"unlisted": ""
}
},
"favourited": {
"accessibilityLabel": "Adicionar este toot aos favoritos",

View File

@ -1,8 +1,8 @@
{
"HTML": {
"accessibilityHint": "Nhấn để mở rộng hoặc thu gọn nội dung",
"expanded": "{{hint}}{{totalLines}}",
"totalLines": " ({{count}} dòng)",
"expanded": "{{hint}}{{moreLines}}",
"moreLines": "",
"defaultHint": "Tút dài"
}
}

View File

@ -38,7 +38,12 @@
},
"reblogged": {
"accessibilityLabel": "Đăng lại tút này",
"function": "Đăng lại tút"
"function": "Đăng lại tút",
"options": {
"title": "",
"public": "",
"unlisted": ""
}
},
"favourited": {
"accessibilityLabel": "Thích tút này",

View File

@ -48,7 +48,7 @@
"action": "删除嘟文",
"alert": {
"title": "确认删除?",
"message": "所转发及收藏将被清除,包括所有回复。",
"message": "所转发及收藏将被清除,包括所有回复。",
"buttons": {
"confirm": "确认"
}
@ -58,7 +58,7 @@
"action": "删除嘟文并重新发布",
"alert": {
"title": "确认删除并重新发布?",
"message": "所转发及收藏将被清除,包括所有回复。",
"message": "所转发及收藏将被清除,包括所有回复。",
"buttons": {
"confirm": "确认"
}

View File

@ -1,8 +1,8 @@
{
"HTML": {
"accessibilityHint": "点击展开或折叠内容",
"expanded": "{{hint}}{{totalLines}}",
"totalLines": " ({{count}} 行)",
"expanded": "{{hint}}{{moreLines}}",
"moreLines": "(还有 {{count}} 行)",
"defaultHint": "长嘟文"
}
}

View File

@ -38,7 +38,12 @@
},
"reblogged": {
"accessibilityLabel": "转发此嘟文",
"function": "转嘟"
"function": "转嘟",
"options": {
"title": "选择转嘟可见性",
"public": "公开转嘟",
"unlisted": "不公开转嘟"
}
},
"favourited": {
"accessibilityLabel": "添加此嘟文至喜欢列表",

18
src/i18n/zh-Hant/_all.ts Normal file
View File

@ -0,0 +1,18 @@
export default {
common: require('./common'),
screens: require('./screens'),
screenActions: require('./screens/actions'),
screenAnnouncements: require('./screens/announcements'),
screenCompose: require('./screens/compose'),
screenImageViewer: require('./screens/imageViewer'),
screenTabs: require('./screens/tabs'),
componentContextMenu: require('./components/contextMenu'),
componentEmojis: require('./components/emojis'),
componentInstance: require('./components/instance'),
componentMediaSelector: require('./components/mediaSelector'),
componentParse: require('./components/parse'),
componentRelationship: require('./components/relationship'),
componentTimeline: require('./components/timeline')
}

View File

@ -9,7 +9,7 @@
},
"message": {
"success": {
"message": "{{function}} 成功完成"
"message": "{{function}} 成功"
},
"warning": {
"message": ""

View File

@ -1,76 +1,76 @@
{
"accessibilityHint": "",
"accessibilityHint": "更多關於此條嘟文,例如發佈者等",
"account": {
"title": "",
"title": "使用者操作",
"mute": {
"action_false": "",
"action_true": ""
"action_false": "靜音使用者",
"action_true": "解除靜音使用者"
},
"block": {
"action_false": "",
"action_true": ""
"action_false": "封鎖使用者",
"action_true": "解除封鎖使用者"
},
"reports": {
"action": ""
"action": "檢舉並封鎖"
}
},
"copy": {
"action": "",
"succeed": ""
"action": "複製嘟文",
"succeed": "已複製"
},
"instance": {
"title": "",
"title": "站點操作",
"block": {
"action": "",
"action": "封鎖站點 {{instance}}",
"alert": {
"title": "",
"message": "",
"title": "確認封鎖站點 {{instance}}",
"message": "多數情況下,靜音或封鎖特定使用者即可。\n\n封鎖之後來自此站點的所有內容將被移除。",
"buttons": {
"confirm": ""
"confirm": "確認"
}
}
}
},
"share": {
"status": {
"action": ""
"action": "分享嘟文"
},
"account": {
"action": ""
"action": "分享使用者"
}
},
"status": {
"title": "",
"title": "嘟文操作",
"edit": {
"action": ""
"action": "編輯嘟文"
},
"delete": {
"action": "",
"action": "刪除嘟文",
"alert": {
"title": "",
"message": "",
"title": "確認刪除?",
"message": "所有轉嘟及最愛將被清除,也包含所有回覆。",
"buttons": {
"confirm": ""
"confirm": "確認"
}
}
},
"deleteEdit": {
"action": "",
"action": "刪除嘟文並重新發佈",
"alert": {
"title": "",
"message": "",
"title": "確認刪除並重新發佈?",
"message": "所有轉嘟及最愛將被清除,也包含所有回覆。",
"buttons": {
"confirm": ""
"confirm": "確認"
}
}
},
"mute": {
"action_false": "",
"action_true": ""
"action_false": "靜音嘟文及回覆",
"action_true": "解除靜音嘟文及回覆"
},
"pin": {
"action_false": "",
"action_true": ""
"action_false": "釘選嘟文",
"action_true": "取消釘選嘟文"
}
}
}

View File

@ -11,10 +11,10 @@
"domains": "串聯宇宙"
},
"disclaimer": {
"base": ""
"base": "將使用系統內建的瀏覽器來登入tooot 無法讀取您的帳號資訊。"
},
"terms": {
"base": ""
"base": "登入則表示您同意<0>隱私條款</0>和<1>服務條款</1>。"
}
},
"update": {

View File

@ -1,10 +1,10 @@
{
"title": "選擇媒體來源",
"message": "",
"message": "媒體 EXIF 資料不會被上傳",
"options": {
"image": "",
"image_max": "",
"video": "",
"video_max": ""
"image": "上傳圖片",
"image_max": "上傳圖片(最多 {{max}}",
"video": "上傳影片",
"video_max": "上傳影片(最多 {{max}}"
}
}

View File

@ -1,8 +1,8 @@
{
"HTML": {
"accessibilityHint": "",
"expanded": "{{hint}}{{totalLines}}",
"totalLines": "",
"defaultHint": ""
"accessibilityHint": "點擊展開或折疊內容",
"expanded": "{{hint}}{{moreLines}}",
"moreLines": "(還有 {{count}} 行)",
"defaultHint": "長嘟文"
}
}

View File

@ -15,7 +15,7 @@
"message": "上次閱讀於"
},
"refresh": {
"fetchPreviousPage": "",
"fetchPreviousPage": "較新的嘟文",
"refetch": "到最新的位置"
},
"shared": {
@ -30,7 +30,7 @@
"default": "{{name}} 轉嘟了",
"notification": "{{name}} 轉嘟了您的嘟文"
},
"update": ""
"update": "轉嘟已編輯"
},
"actions": {
"reply": {
@ -38,7 +38,12 @@
},
"reblogged": {
"accessibilityLabel": "轉發此嘟",
"function": "轉嘟"
"function": "轉嘟",
"options": {
"title": "選擇轉嘟範圍",
"public": "公開轉嘟",
"unlisted": "不公開轉嘟"
}
},
"favourited": {
"accessibilityLabel": "將嘟文加入最愛",
@ -64,82 +69,82 @@
"accessibilityLabel": "嘟文被編輯了 {{count}} 次",
"accessibilityHint": "點擊查看編輯紀錄",
"text_one": "{{count}} 次編輯",
"text_other": ""
"text_other": "{{count}} 次編輯"
}
},
"attachment": {
"sensitive": {
"button": ""
"button": "顯示敏感內容"
},
"unsupported": {
"text": "",
"button": ""
"text": "載入錯誤",
"button": "嘗試遠端連接"
}
},
"avatar": {
"accessibilityLabel": "",
"accessibilityHint": ""
"accessibilityLabel": "{{name}} 的大頭貼",
"accessibilityHint": "點擊進入 {{name}} 的頁面"
},
"content": {
"expandHint": ""
"expandHint": "隱藏內容"
},
"filtered": "",
"fullConversation": "",
"filtered": "已過濾",
"fullConversation": "閱讀全部對話",
"translate": {
"default": "",
"succeed": "",
"failed": "",
"source_not_supported": "",
"target_not_supported": ""
"default": "翻譯",
"succeed": "由 {{provider}} 翻譯自 {{source}}",
"failed": "翻譯失敗",
"source_not_supported": "不支援嘟文的語言",
"target_not_supported": "不支援目標翻譯語言"
},
"header": {
"shared": {
"account": {
"name": {
"accessibilityHint": ""
"accessibilityHint": "使用者顯示名稱"
},
"account": {
"accessibilityHint": ""
"accessibilityHint": "使用者帳戶"
}
},
"application": "",
"application": "{{application}}",
"edited": {
"accessibilityLabel": ""
"accessibilityLabel": "嘟文已編輯"
},
"muted": {
"accessibilityLabel": ""
"accessibilityLabel": "已靜音此嘟文"
},
"visibility": {
"direct": {
"accessibilityLabel": ""
"accessibilityLabel": "此嘟文是私訊"
},
"private": {
"accessibilityLabel": ""
"accessibilityLabel": "此嘟文僅跟隨者可見"
}
}
},
"conversation": {
"withAccounts": "",
"withAccounts": "@",
"delete": {
"function": ""
"function": "刪除私訊"
}
}
},
"poll": {
"meta": {
"button": {
"vote": "",
"refresh": ""
"vote": "投票",
"refresh": "重新整理"
},
"count": {
"voters_one": "",
"voters_other": "",
"votes_one": "",
"votes_other": ""
"voters_one": "{{count}} 人投票",
"voters_other": "{{count}} 人投票",
"votes_one": "{{count}} 票",
"votes_other": "{{count}} 票"
},
"expiration": {
"expired": "",
"until": ""
"expired": "投票已結束",
"until": "<0 />截止"
}
}
}

View File

@ -1,18 +1,18 @@
{
"screenshot": {
"title": "保護隱私",
"title": "隱私權保護",
"message": "請不要散佈使用者的身份,像是使用者名稱、大頭照等,謝謝你!",
"button": "確認"
},
"localCorrupt": {
"message": "登入狀態已過期,請再登入一次"
"message": "登入狀態已過期,請重新登入"
},
"pushError": {
"message": "推播服務錯誤",
"description": "請在設定重新啟用推播"
"description": "請在設定重新啟用推播"
},
"shareError": {
"imageNotSupported": "",
"videoNotSupported": ""
"imageNotSupported": "不支援 {{type}} 類型的圖片",
"videoNotSupported": "不支援 {{type}} 類型的影片"
}
}

View File

@ -1,6 +1,6 @@
{
"heading": "",
"heading": "分享到...",
"content": {
"select_account": ""
"select_account": "選擇帳號"
}
}

View File

@ -1,19 +1,19 @@
{
"content": {
"altText": {
"heading": ""
"heading": "替代文字"
},
"notificationsFilter": {
"heading": "",
"heading": "顯示通知類型",
"content": {
"follow": "",
"follow_request": "",
"favourite": "",
"reblog": "",
"mention": "",
"poll": "",
"status": "",
"update": ""
"follow": "$t(screenTabs:me.push.follow.heading)",
"follow_request": "跟隨請求",
"favourite": "$t(screenTabs:me.push.favourite.heading)",
"reblog": "$t(screenTabs:me.push.reblog.heading)",
"mention": "$t(screenTabs:me.push.mention.heading)",
"poll": "$t(screenTabs:me.push.poll.heading)",
"status": "訂閱使用者的嘟文",
"update": "轉嘟被編輯"
}
}
}

View File

@ -1,10 +1,10 @@
{
"heading": "",
"heading": "公告",
"content": {
"published": "",
"published": "發佈於 <0 />",
"button": {
"read": "",
"unread": ""
"read": "已讀",
"unread": "標記為已讀"
}
}
}

View File

@ -1,35 +1,35 @@
{
"heading": {
"left": {
"button": "",
"button": "取消",
"alert": {
"title": "",
"title": "確認取消編輯?",
"buttons": {
"save": "",
"delete": "",
"cancel": ""
"save": "儲存草稿",
"delete": "刪除草稿",
"cancel": "取消"
}
}
},
"right": {
"button": {
"default": "",
"conversation": "",
"reply": "",
"deleteEdit": "",
"edit": "",
"share": ""
"default": "發嘟",
"conversation": "發送私訊",
"reply": "發佈回覆",
"deleteEdit": "發嘟",
"edit": "發嘟",
"share": "發嘟"
},
"alert": {
"default": {
"title": "",
"button": ""
"title": "發嘟失敗",
"button": "再試一次"
},
"removeReply": {
"title": "",
"description": "",
"cancel": "",
"confirm": ""
"title": "回覆的嘟文不存在",
"description": "回覆的嘟文可能已被刪除。確認移除回覆嘟文的關聯?",
"cancel": "$t(common:buttons.cancel)",
"confirm": "移除關聯"
}
}
}
@ -37,143 +37,143 @@
"content": {
"root": {
"header": {
"postingAs": "",
"postingAs": "以 @{{acct}}@{{domain}} 發嘟",
"spoilerInput": {
"placeholder": ""
"placeholder": "輸入警告訊息"
},
"textInput": {
"placeholder": "",
"placeholder": "正在想些什麼嗎?",
"keyboardImage": {
"exceedMaximum": {
"title": "",
"OK": ""
"title": "已達附件數量上限",
"OK": "$t(common:buttons.OK)"
}
}
}
},
"footer": {
"attachments": {
"sensitive": "",
"sensitive": "標記附件為敏感內容",
"remove": {
"accessibilityLabel": ""
"accessibilityLabel": "刪除已上傳的附件,序號 {{attachment}}"
},
"edit": {
"accessibilityLabel": ""
"accessibilityLabel": "編輯已上傳的附件,序號 {{attachment}}"
},
"upload": {
"accessibilityLabel": ""
"accessibilityLabel": "上傳更多附件"
}
},
"emojis": {
"accessibilityHint": ""
"accessibilityHint": "點擊新增表情符號到嘟文"
},
"poll": {
"option": {
"placeholder": {
"accessibilityLabel": "",
"single": "",
"multiple": ""
"accessibilityLabel": "投票選項 {{index}}",
"single": "單選題",
"multiple": "複選題"
}
},
"quantity": {
"reduce": {
"accessibilityLabel": "",
"accessibilityHint": ""
"accessibilityLabel": "減少至 {{amount}} 選項",
"accessibilityHint": "已達到最低選項數,目前有 {{amount}} 選項"
},
"increase": {
"accessibilityLabel": "",
"accessibilityHint": ""
"accessibilityLabel": "增加至 {{amount}} 選項",
"accessibilityHint": "已達到最高選項數,目前有 {{amount}} 選項"
}
},
"multiple": {
"heading": "",
"heading": "選擇類型",
"options": {
"single": "",
"multiple": "",
"cancel": ""
"single": "單選題",
"multiple": "複選題",
"cancel": "$t(common:buttons.cancel)"
}
},
"expiration": {
"heading": "",
"heading": "結束時間",
"options": {
"300": "",
"1800": "",
"3600": "",
"21600": "",
"86400": "",
"259200": "",
"604800": "",
"cancel": ""
"300": "5 分鐘",
"1800": "30 分鐘",
"3600": "1 小時",
"21600": "6 小時",
"86400": "1 天",
"259200": "3 天",
"604800": "7 天",
"cancel": "$t(common:buttons.cancel)"
}
}
}
},
"actions": {
"attachment": {
"accessibilityLabel": "",
"accessibilityHint": "",
"accessibilityLabel": "上傳附件",
"accessibilityHint": "當有附件時,投票功能將被禁用",
"failed": {
"alert": {
"title": "",
"button": ""
"title": "上傳失敗",
"button": "再試一次"
}
}
},
"poll": {
"accessibilityLabel": "",
"accessibilityHint": ""
"accessibilityLabel": "新增投票",
"accessibilityHint": "當啟用投票功能時,附件功能將被禁用"
},
"visibility": {
"accessibilityLabel": "",
"title": "",
"accessibilityLabel": "此嘟文公開範圍為 {{visibility}}",
"title": "嘟文公開範圍",
"options": {
"public": "",
"unlisted": "",
"private": "",
"direct": "",
"cancel": ""
"public": "公開",
"unlisted": "不公開",
"private": "僅限跟隨者",
"direct": "私訊",
"cancel": "$t(common:buttons.cancel)"
}
},
"spoiler": {
"accessibilityLabel": ""
"accessibilityLabel": "劇透"
},
"emoji": {
"accessibilityLabel": "",
"accessibilityHint": ""
"accessibilityLabel": "新增表情符號",
"accessibilityHint": "打開表情選擇面板,水平滑動切換頁面"
}
},
"drafts_one": "",
"drafts_other": ""
"drafts_one": "草稿 ({{count}})",
"drafts_other": "草稿 ({{count}})"
},
"editAttachment": {
"header": {
"title": "",
"title": "編輯附件",
"right": {
"accessibilityLabel": "",
"accessibilityLabel": "儲存編輯附件",
"failed": {
"title": "",
"button": ""
"title": "編輯失敗",
"button": "再試一次"
}
}
},
"content": {
"altText": {
"heading": "",
"placeholder": ""
"heading": "為附件增加文字說明",
"placeholder": "你可以為附件增加文字說明,以便更多人可以查看他們(包括視力障礙或視力受損人士)。\n\n優質的描述應該簡潔明瞭但要準確地描述照片中的內容以便使用者理解其含義。"
},
"imageFocus": ""
"imageFocus": "在預覽圖上拖動圓圈,以選擇縮略圖的焦點"
}
},
"draftsList": {
"header": {
"title": ""
"title": "草稿"
},
"warning": "",
"warning": "草稿只儲存在你的設備上,在部分情況下可能丟失。建議不要長期儲存草稿。",
"content": {
"accessibilityHint": "",
"textEmpty": ""
"accessibilityHint": "已儲存的草稿,點擊編輯此草稿",
"textEmpty": "沒有內容"
},
"checkAttachment": ""
"checkAttachment": "正在檢查伺服器上的附件..."
}
}
}

View File

@ -1,17 +1,17 @@
{
"content": {
"actions": {
"accessibilityLabel": "",
"accessibilityHint": ""
"accessibilityLabel": "更多此圖片的操作",
"accessibilityHint": "您可以儲存或分享此圖片"
},
"options": {
"save": "",
"share": "",
"cancel": ""
"save": "儲存圖片",
"share": "分享圖片",
"cancel": "$t(common:buttons.cancel)"
},
"save": {
"succeed": "",
"failed": ""
"succeed": "圖片已儲存",
"failed": "儲存圖片失敗"
}
}
}

View File

@ -25,8 +25,8 @@
},
"notifications": {
"filter": {
"accessibilityLabel": "篩選器",
"accessibilityHint": ""
"accessibilityLabel": "過濾器",
"accessibilityHint": "過濾顯示的通知類型"
}
},
"me": {
@ -44,7 +44,7 @@
"name": "嘟文字體大小"
},
"language": {
"name": ""
"name": "語言"
},
"lists": {
"name": "清單"
@ -78,276 +78,276 @@
}
},
"fontSize": {
"demo": "",
"demo": "<p>這是一條測試用的嘟文😊。以下是可供選擇的字體大小,從小至超大。<br /><br />這個設定僅會調整嘟文的本身字體大小,不影響其它字體大小。</p>",
"sizes": {
"S": "",
"M": "",
"L": "",
"XL": "",
"XXL": ""
"S": "",
"M": "M - 預設",
"L": "",
"XL": "超大",
"XXL": "特大"
}
},
"profile": {
"cancellation": {
"title": "",
"message": "",
"title": "變更尚未儲存",
"message": "您的變更尚未儲存。是否放棄儲存變更?",
"buttons": {
"cancel": "",
"discard": ""
"cancel": "$t(common:buttons.cancel)",
"discard": "不儲存"
}
},
"feedback": {
"succeed": "",
"failed": ""
"succeed": "{{type}} 已更新",
"failed": "{{type}} 更新失敗,請重試。"
},
"root": {
"name": {
"title": ""
"title": "顯示名稱"
},
"avatar": {
"title": "",
"description": ""
"title": "大頭貼",
"description": "會按比例縮小成 400x400 像素"
},
"header": {
"title": "",
"description": ""
"title": "頁面頂端",
"description": "會按比例縮小成 1500x500 像素"
},
"note": {
"title": ""
"title": "簡介"
},
"fields": {
"title": "描述資料",
"total_one": "",
"total_other": ""
"total_one": "{{count}} 項",
"total_other": "{{count}} 項"
},
"visibility": {
"title": "",
"title": "嘟文預設公開範圍",
"options": {
"public": "",
"unlisted": "",
"private": "",
"cancel": ""
"public": "公開",
"unlisted": "不公開",
"private": "僅限跟隨者",
"cancel": "$t(common:buttons.cancel)"
}
},
"sensitive": {
"title": ""
"title": "媒體預設標為敏感"
},
"lock": {
"title": "",
"description": ""
"title": "鎖定帳號",
"description": "需要您手動批准跟隨請求"
},
"bot": {
"title": "",
"description": ""
"title": "機器人帳號",
"description": "此帳號主要執行自動操作且可能未被監控"
}
},
"fields": {
"group": "",
"label": "",
"content": ""
"group": "第 {{index}} 組",
"label": "標籤",
"content": "內容"
},
"mediaSelectionFailed": ""
"mediaSelectionFailed": "圖片處理失敗,請重試"
},
"push": {
"notAvailable": "",
"notAvailable": "您的手機不支援 tooot 推播通知",
"enable": {
"direct": "",
"settings": ""
"direct": "啟用推播通知",
"settings": "在設定中啟用"
},
"global": {
"heading": "",
"description": ""
"heading": "啟用 {{acct}}",
"description": "通知訊息將經由 tooot 伺服器轉發"
},
"decode": {
"heading": "",
"description": ""
"heading": "顯示通知內容",
"description": "經由 tooot 伺服器轉發的通知訊息已被加密,但可以允許 tooot 伺服器解密並轉發訊息。tooot 訊息伺服器為開放原始碼,且不儲存任何日誌。"
},
"default": {
"heading": ""
"heading": "預設"
},
"follow": {
"heading": ""
"heading": "新的跟隨者"
},
"follow_request": {
"heading": ""
"heading": "跟隨請求"
},
"favourite": {
"heading": ""
"heading": "嘟文被喜歡"
},
"reblog": {
"heading": ""
"heading": "嘟文被轉嘟"
},
"mention": {
"heading": ""
"heading": "嘟文提及您"
},
"poll": {
"heading": ""
"heading": "投票更新"
},
"status": {
"heading": ""
"heading": "訂閱使用者的嘟文"
},
"howitworks": ""
"howitworks": "了解通知訊息轉發如何工作"
},
"root": {
"announcements": {
"content": {
"unread": "",
"read": "",
"empty": ""
"unread": "{{amount}} 條未讀",
"read": "全部已讀",
"empty": ""
}
},
"push": {
"content": {
"enabled": "",
"disabled": ""
"enabled": "啟用",
"disabled": "關閉"
}
},
"update": {
"title": ""
"title": "已更新到最新版本"
},
"logout": {
"button": "",
"button": "登出",
"alert": {
"title": "",
"message": "",
"title": "確定要登出?",
"message": "登出後,需要重新驗證帳號",
"buttons": {
"logout": "",
"cancel": ""
"logout": "登出",
"cancel": "$t(common:buttons.cancel)"
}
}
}
},
"settings": {
"fontsize": {
"heading": "",
"heading": "$t(me.stacks.fontSize.name)",
"content": {
"S": "",
"M": "",
"L": "",
"XL": "",
"XXL": ""
"S": "$t(me.fontSize.sizes.S)",
"M": "$t(me.fontSize.sizes.M)",
"L": "$t(me.fontSize.sizes.L)",
"XL": "$t(me.fontSize.sizes.XL)",
"XXL": "$t(me.fontSize.sizes.XXL)"
}
},
"language": {
"heading": "",
"heading": "$t(me.stacks.language.name)",
"options": {
"cancel": ""
"cancel": "$t(common:buttons.cancel)"
}
},
"theme": {
"heading": "",
"heading": "外觀",
"options": {
"auto": "",
"light": "",
"dark": "",
"cancel": ""
"auto": "跟隨系統",
"light": "淺色模式",
"dark": "深色模式",
"cancel": "$t(common:buttons.cancel)"
}
},
"darkTheme": {
"heading": "",
"heading": "深色主題",
"options": {
"lighter": "",
"darker": "",
"cancel": ""
"lighter": "暗淡",
"darker": "暗黑",
"cancel": "$t(common:buttons.cancel)"
}
},
"browser": {
"heading": "",
"heading": "開啟連結",
"options": {
"internal": "",
"external": "",
"cancel": ""
"internal": "從應用程式內開啟",
"external": "使用系統瀏覽器開啟",
"cancel": "$t(common:buttons.cancel)"
}
},
"staticEmoji": {
"heading": "",
"description": ""
"heading": "使用靜態表情",
"description": "如果您在查看表情列表時經常遇到程式無預警退出,您可以嘗試使用靜態表情。"
},
"feedback": {
"heading": ""
"heading": "功能建議"
},
"support": {
"heading": ""
"heading": "贊助 tooot 開發"
},
"review": {
"heading": ""
"heading": "給 tooot 評分"
},
"contact": {
"heading": ""
"heading": "聯繫 tooot"
},
"analytics": {
"heading": "",
"description": ""
"heading": "幫助我們改善",
"description": "僅收集不與使用者關聯的資料"
},
"version": "",
"instanceVersion": ""
"version": "Version v{{version}}",
"instanceVersion": "Mastodon version v{{version}}"
},
"switch": {
"existing": "",
"new": ""
"existing": "選擇已登入的帳號",
"new": "登入新站點"
}
},
"shared": {
"account": {
"actions": {
"accessibilityLabel": "",
"accessibilityHint": ""
"accessibilityLabel": "對使用者 {{user}} 的操作",
"accessibilityHint": "您可以靜音、封鎖、檢舉或分享此使用者"
},
"followed_by": "",
"moved": "",
"created_at": "",
"followed_by": " 正在跟隨你",
"moved": "使用者已轉移",
"created_at": "加入於:{{date}}",
"summary": {
"statuses_count": "",
"following_count": "",
"followers_count": ""
"statuses_count": "{{count}} 條嘟文",
"following_count": "$t(shared.users.accounts.following)",
"followers_count": "$t(shared.users.accounts.followers)"
},
"toots": {
"default": "",
"all": ""
"default": "嘟文",
"all": "嘟文與回覆"
}
},
"attachments": {
"name": ""
"name": "<0 /><1>的媒體</1>"
},
"search": {
"header": {
"prefix": "",
"placeholder": ""
"prefix": "搜尋",
"placeholder": "什麼呢"
},
"empty": {
"general": "",
"general": "輸入關鍵字搜尋<bold>$t(screenTabs:shared.search.sections.accounts)</bold>、<bold>$t(screenTabs:shared.search.sections.hashtags)</bold>或<bold>$t(screenTabs:shared.search.sections.statuses)</bold>",
"advanced": {
"header": "",
"header": "進階搜尋",
"example": {
"account": "",
"hashtag": "",
"statusLink": "",
"accountLink": ""
"account": "$t(shared.search.header.prefix) $t(shared.search.sections.accounts)",
"hashtag": "$t(shared.search.header.prefix) $t(shared.search.sections.hashtags)",
"statusLink": "$t(shared.search.header.prefix) $t(shared.search.sections.statuses)",
"accountLink": "$t(shared.search.header.prefix) $t(shared.search.sections.accounts)"
}
}
},
"sections": {
"accounts": "",
"hashtags": "",
"statuses": ""
"accounts": "使用者",
"hashtags": "主題標籤",
"statuses": "嘟文"
},
"notFound": ""
"notFound": "找不到 <bold>{{searchTerm}}</bold> 相關的 {{type}}"
},
"toot": {
"name": ""
"name": "討論"
},
"users": {
"accounts": {
"following": "",
"followers": ""
"following": "正在跟隨 {{count}} 人",
"followers": "被 {{count}} 人跟隨"
},
"statuses": {
"reblogged_by": "",
"favourited_by": ""
"reblogged_by": "{{count}} 人轉嘟",
"favourited_by": "{{count}} 人喜歡"
}
},
"history": {
"name": ""
"name": "編輯歷史"
}
}
}

View File

@ -9,7 +9,7 @@ import formatText from '@screens/Compose/formatText'
import ComposeRoot from '@screens/Compose/Root'
import * as Sentry from '@sentry/react-native'
import { RootStackScreenProps } from '@utils/navigation/navigators'
import { QueryKeyTimeline, useTimelineMutation } from '@utils/queryHooks/timeline'
import { useTimelineMutation } from '@utils/queryHooks/timeline'
import { updateStoreReview } from '@utils/slices/contextsSlice'
import {
getInstanceAccount,
@ -280,8 +280,6 @@ const ScreenCompose: React.FC<RootStackScreenProps<'Screen-Compose'>> = ({
} else {
dispatch(updateStoreReview(1))
}
const queryKey: QueryKeyTimeline = ['Timeline', { page: 'Following' }]
queryClient.invalidateQueries(queryKey)
switch (params?.type) {
case 'edit':

View File

@ -88,7 +88,7 @@ const composeReducer = (
attachments: {
...state.attachments,
uploads: state.attachments.uploads.map(upload =>
upload.remote!.id === action.payload!.id
upload.remote?.id === action.payload?.id
? { ...upload, remote: action.payload }
: upload
)

View File

@ -5,22 +5,18 @@ import { RootStackParamList } from '@utils/navigation/navigators'
import { Theme } from '@utils/styles/themes'
import * as FileSystem from 'expo-file-system'
import i18next from 'i18next'
import { RefObject } from 'react'
import { PermissionsAndroid, Platform } from 'react-native'
import FlashMessage from 'react-native-flash-message'
type CommonProps = {
messageRef: RefObject<FlashMessage>
theme: Theme
image: RootStackParamList['Screen-ImagesViewer']['imageUrls'][0]
}
const saveIos = async ({ messageRef, theme, image }: CommonProps) => {
const saveIos = async ({ theme, image }: CommonProps) => {
CameraRoll.save(image.url)
.then(() => {
haptics('Success')
displayMessage({
ref: messageRef,
theme,
type: 'success',
message: i18next.t('screenImageViewer:content.save.succeed')
@ -32,7 +28,6 @@ const saveIos = async ({ messageRef, theme, image }: CommonProps) => {
.then(() => {
haptics('Success')
displayMessage({
ref: messageRef,
theme,
type: 'success',
message: i18next.t('screenImageViewer:content.save.succeed')
@ -41,7 +36,6 @@ const saveIos = async ({ messageRef, theme, image }: CommonProps) => {
.catch(() => {
haptics('Error')
displayMessage({
ref: messageRef,
theme,
type: 'error',
message: i18next.t('screenImageViewer:content.save.failed')
@ -50,7 +44,6 @@ const saveIos = async ({ messageRef, theme, image }: CommonProps) => {
} else {
haptics('Error')
displayMessage({
ref: messageRef,
theme,
type: 'error',
message: i18next.t('screenImageViewer:content.save.failed')
@ -59,7 +52,7 @@ const saveIos = async ({ messageRef, theme, image }: CommonProps) => {
})
}
const saveAndroid = async ({ messageRef, theme, image }: CommonProps) => {
const saveAndroid = async ({ theme, image }: CommonProps) => {
const fileUri: string = `${FileSystem.documentDirectory}${image.id}.jpg`
const downloadedFile: FileSystem.FileSystemDownloadResult =
await FileSystem.downloadAsync(image.url, fileUri)
@ -67,7 +60,6 @@ const saveAndroid = async ({ messageRef, theme, image }: CommonProps) => {
if (downloadedFile.status != 200) {
haptics('Error')
displayMessage({
ref: messageRef,
theme,
type: 'error',
message: i18next.t('screenImageViewer:content.save.failed')
@ -83,7 +75,6 @@ const saveAndroid = async ({ messageRef, theme, image }: CommonProps) => {
if (status !== 'granted') {
haptics('Error')
displayMessage({
ref: messageRef,
theme,
type: 'error',
message: i18next.t('screenImageViewer:content.save.failed')
@ -96,7 +87,6 @@ const saveAndroid = async ({ messageRef, theme, image }: CommonProps) => {
.then(() => {
haptics('Success')
displayMessage({
ref: messageRef,
theme,
type: 'success',
message: i18next.t('screenImageViewer:content.save.succeed')
@ -105,7 +95,6 @@ const saveAndroid = async ({ messageRef, theme, image }: CommonProps) => {
.catch(() => {
haptics('Error')
displayMessage({
ref: messageRef,
theme,
type: 'error',
message: i18next.t('screenImageViewer:content.save.failed')

View File

@ -1,15 +1,15 @@
import analytics from '@components/analytics'
import GracefullyImage from '@components/GracefullyImage'
import { HeaderCenter, HeaderLeft, HeaderRight } from '@components/Header'
import { Message } from '@components/Message'
import { useActionSheet } from '@expo/react-native-action-sheet'
import { RootStackScreenProps } from '@utils/navigation/navigators'
import { useTheme } from '@utils/styles/ThemeManager'
import React, { useCallback, useRef, useState } from 'react'
import React, { useCallback, useState } from 'react'
import { useTranslation } from 'react-i18next'
import {
Dimensions,
FlatList,
Image,
PixelRatio,
Platform,
Share,
@ -17,13 +17,9 @@ import {
View,
ViewToken
} from 'react-native'
import FlashMessage from 'react-native-flash-message'
import {
Directions,
FlingGestureHandler,
LongPressGestureHandler,
State
} from 'react-native-gesture-handler'
import { Directions, Gesture, LongPressGestureHandler } from 'react-native-gesture-handler'
import { LiveTextImageView } from 'react-native-live-text-image-view'
import { runOnJS, useSharedValue } from 'react-native-reanimated'
import { Zoom, createZoomListComponent } from 'react-native-reanimated-zoom'
import { SafeAreaProvider, useSafeAreaInsets } from 'react-native-safe-area-context'
import saveImage from './ImageViewer/save'
@ -52,9 +48,6 @@ const ScreenImagesViewer = ({
const initialIndex = imageUrls.findIndex(image => image.id === id)
const [currentIndex, setCurrentIndex] = useState(initialIndex)
const listRef = useRef<FlatList>(null)
const messageRef = useRef<FlashMessage>(null)
const { showActionSheetWithOptions } = useActionSheet()
const onPress = useCallback(() => {
analytics('imageviewer_more_press')
@ -72,7 +65,7 @@ const ScreenImagesViewer = ({
switch (buttonIndex) {
case 0:
analytics('imageviewer_more_save_press')
saveImage({ messageRef, theme, image: imageUrls[currentIndex] })
saveImage({ theme, image: imageUrls[currentIndex] })
break
case 1:
analytics('imageviewer_more_share_press')
@ -90,6 +83,8 @@ const ScreenImagesViewer = ({
)
}, [currentIndex])
const isZoomed = useSharedValue(false)
const renderItem = React.useCallback(
({
item
@ -107,7 +102,15 @@ const ScreenImagesViewer = ({
return (
<Zoom
isZoomed={isZoomed}
maximumZoomScale={max > 8 ? 8 : max}
simultaneousGesture={Gesture.Fling()
.direction(Directions.DOWN)
.onStart(() => {
if (isZoomed.value === false) {
runOnJS(navigation.goBack)()
}
})}
children={
<View
style={{
@ -118,31 +121,33 @@ const ScreenImagesViewer = ({
justifyContent: 'center'
}}
>
<GracefullyImage
uri={{ preview: item.preview_url, remote: item.remote_url, original: item.url }}
blurhash={item.blurhash}
dimension={{
width:
screenRatio > imageRatio
? (SCREEN_HEIGHT / imageHeight) * imageWidth
: SCREEN_WIDTH,
height:
screenRatio > imageRatio
? SCREEN_HEIGHT
: (SCREEN_WIDTH / imageWidth) * imageHeight
}}
/>
<LiveTextImageView>
<GracefullyImage
uri={{ preview: item.preview_url, remote: item.remote_url, original: item.url }}
blurhash={item.blurhash}
dimension={{
width:
screenRatio > imageRatio
? (SCREEN_HEIGHT / imageHeight) * imageWidth
: SCREEN_WIDTH,
height:
screenRatio > imageRatio
? SCREEN_HEIGHT
: (SCREEN_WIDTH / imageWidth) * imageHeight
}}
/>
</LiveTextImageView>
</View>
}
/>
)
},
[]
[isZoomed.value]
)
const onViewableItemsChanged = useCallback(
({ viewableItems }: { viewableItems: ViewToken[] }) => {
setCurrentIndex(viewableItems[0].index || 0)
setCurrentIndex(viewableItems[0]?.index || 0)
},
[]
)
@ -172,72 +177,61 @@ const ScreenImagesViewer = ({
onPress={onPress}
/>
</View>
<FlingGestureHandler
direction={Directions.DOWN}
numberOfPointers={1}
onEnded={() => navigation.goBack()}
>
<LongPressGestureHandler
onEnded={() => {
analytics('imageviewer_more_press')
showActionSheetWithOptions(
{
options: [
t('content.options.save'),
t('content.options.share'),
t('content.options.cancel')
],
cancelButtonIndex: 2,
userInterfaceStyle: mode
},
async buttonIndex => {
switch (buttonIndex) {
case 0:
analytics('imageviewer_more_save_press')
saveImage({
messageRef,
theme,
image: imageUrls[currentIndex]
})
break
case 1:
analytics('imageviewer_more_share_press')
switch (Platform.OS) {
case 'ios':
await Share.share({ url: imageUrls[currentIndex].url })
break
case 'android':
await Share.share({
message: imageUrls[currentIndex].url
})
break
}
break
}
<LongPressGestureHandler
onEnded={() => {
analytics('imageviewer_more_press')
showActionSheetWithOptions(
{
options: [
t('content.options.save'),
t('content.options.share'),
t('content.options.cancel')
],
cancelButtonIndex: 2,
userInterfaceStyle: mode
},
async buttonIndex => {
switch (buttonIndex) {
case 0:
analytics('imageviewer_more_save_press')
saveImage({ theme, image: imageUrls[currentIndex] })
break
case 1:
analytics('imageviewer_more_share_press')
switch (Platform.OS) {
case 'ios':
await Share.share({ url: imageUrls[currentIndex].url })
break
case 'android':
await Share.share({
message: imageUrls[currentIndex].url
})
break
}
break
}
)
}
)
}}
>
<ZoomFlatList
data={imageUrls}
pagingEnabled
horizontal
keyExtractor={item => item.id}
renderItem={renderItem}
onViewableItemsChanged={onViewableItemsChanged}
viewabilityConfig={{
itemVisiblePercentThreshold: 50
}}
>
<ZoomFlatList
data={imageUrls}
pagingEnabled
horizontal
keyExtractor={item => item.id}
renderItem={renderItem}
onViewableItemsChanged={onViewableItemsChanged}
viewabilityConfig={{
itemVisiblePercentThreshold: 50
}}
initialScrollIndex={initialIndex}
getItemLayout={(_, index) => ({
length: SCREEN_WIDTH,
offset: SCREEN_WIDTH * index,
index
})}
/>
</LongPressGestureHandler>
</FlingGestureHandler>
<Message ref={messageRef} />
initialScrollIndex={initialIndex}
getItemLayout={(_, index) => ({
length: SCREEN_WIDTH,
offset: SCREEN_WIDTH * index,
index
})}
/>
</LongPressGestureHandler>
</SafeAreaProvider>
)
}

View File

@ -43,7 +43,7 @@ const TabLocal = React.memo(
title: t('tabs.local.name'),
disabled: queryKey[1].page === 'Following'
},
...lists.map(list => ({
...lists?.map(list => ({
id: list.id,
title: list.title,
disabled: queryKey[1].page === 'List' && queryKey[1].list === list.id

View File

@ -72,7 +72,7 @@ const TabMeProfileRoot: React.FC<
}
}
)
}, [theme, data?.source.privacy])
}, [theme, data?.source?.privacy])
const onPressSensitive = useCallback(() => {
analytics('me_profile_sensitive', {

View File

@ -46,7 +46,7 @@ const Collections: React.FC = () => {
updateInstanceMePage({
announcements: {
shown: announcementsQuery.data?.length ? true : false,
unread: announcementsQuery.data.filter(
unread: announcementsQuery.data?.filter(
announcement => !announcement.read
).length
}

View File

@ -12,10 +12,7 @@ const TabSharedToot: React.FC<TabSharedStackScreenProps<'Tab-Shared-Toot'>> = ({
params: { toot, rootQueryKey }
}
}) => {
const queryKey: QueryKeyTimeline = [
'Timeline',
{ page: 'Toot', toot: toot.id }
]
const queryKey: QueryKeyTimeline = ['Timeline', { page: 'Toot', toot: toot.id }]
const flRef = useRef<FlatList>(null)
@ -46,10 +43,12 @@ const TabSharedToot: React.FC<TabSharedStackScreenProps<'Tab-Shared-Toot'>> = ({
if (pointer < 1) return
try {
setTimeout(() => {
flRef.current?.scrollToIndex({
index: pointer,
viewOffset: 100
})
try {
flRef.current?.scrollToIndex({
index: pointer,
viewOffset: 100
})
} catch {}
}, 500)
} catch (error) {
return

View File

@ -8,8 +8,8 @@ import { getExpoToken, retriveExpoToken } from '@utils/slices/appSlice'
import { disableAllPushes } from '@utils/slices/instancesSlice'
import { useTheme } from '@utils/styles/ThemeManager'
import * as Notifications from 'expo-notifications'
import { TFunction } from 'i18next'
import { useEffect } from 'react'
import { TFunction } from 'react-i18next'
import { AppState } from 'react-native'
import { useSelector } from 'react-redux'
@ -33,6 +33,7 @@ const pushUseConnect = ({ t, instances }: Params) => {
url: `push/connect/${expoToken}`,
sentry: true
}).catch(error => {
Notifications.setBadgeCountAsync(0)
if (error?.status == 404) {
displayMessage({
theme,

View File

@ -293,11 +293,18 @@ export type MutationVarsTimelineUpdateStatusProperty = {
countValue: undefined
}
| {
property: 'favourited' | 'reblogged'
property: 'favourited'
currentValue: boolean
propertyCount: 'favourites_count' | 'reblogs_count'
countValue: number
}
| {
property: 'reblogged'
currentValue: boolean
propertyCount: 'favourites_count' | 'reblogs_count'
countValue: number
visibility: 'public' | 'unlisted'
}
| {
property: 'poll'
id: Mastodon.Poll['id']
@ -371,11 +378,16 @@ const mutationFunction = async (params: MutationVarsTimeline) => {
...(params.payload.type === 'vote' && { body: formData })
})
default:
const body = new FormData()
if (params.payload.property === 'reblogged') {
body.append('visibility', params.payload.visibility)
}
return apiInstance<Mastodon.Status>({
method: 'post',
url: `statuses/${params.id}/${
params.payload.currentValue ? 'un' : ''
}${MapPropertyToUrl[params.payload.property]}`
}${MapPropertyToUrl[params.payload.property]}`,
body
})
}
case 'updateAccountProperty':

View File

@ -147,11 +147,11 @@ const instancesSlice = createSlice({
.map((e, i) =>
i === foundEmojiIndex
? {
...e,
score: calculateScore(e),
count: e.count + 1,
lastUsed: new Date().getTime()
}
...e,
score: calculateScore(e),
count: e.count + 1,
lastUsed: new Date().getTime()
}
: e
)
.sort((a, b) => b.score - a.score)
@ -350,17 +350,17 @@ export const getInstanceVersion = ({ instances: { instances } }: RootState) =>
instances[findInstanceActive(instances)]?.version
export const checkInstanceFeature =
(feature: string) =>
({ instances: { instances } }: RootState): Boolean => {
return (
features
.filter(f => f.feature === feature)
.filter(
f =>
parseFloat(instances[findInstanceActive(instances)]?.version) >=
f.version
).length > 0
)
}
({ instances: { instances } }: RootState): Boolean => {
return (
features
.filter(f => f.feature === feature)
.filter(
f =>
parseFloat(instances[findInstanceActive(instances)]?.version) >=
f.version
)?.length > 0
)
}
/* Get Instance Configuration */
export const getInstanceConfigurationStatusMaxChars = ({
@ -434,7 +434,7 @@ export const getInstanceAccount = ({ instances: { instances } }: RootState) =>
export const getInstanceNotificationsFilter = ({
instances: { instances }
}: RootState) => instances[findInstanceActive(instances)].notifications_filter
}: RootState) => instances[findInstanceActive(instances)]?.notifications_filter
export const getInstancePush = ({ instances: { instances } }: RootState) =>
instances[findInstanceActive(instances)]?.push

527
yarn.lock
View File

@ -55,21 +55,21 @@
json5 "^2.2.1"
semver "^6.3.0"
"@babel/core@^7.19.3":
version "7.19.3"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.3.tgz#2519f62a51458f43b682d61583c3810e7dcee64c"
integrity sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==
"@babel/core@^7.19.6":
version "7.19.6"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.6.tgz#7122ae4f5c5a37c0946c066149abd8e75f81540f"
integrity sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==
dependencies:
"@ampproject/remapping" "^2.1.0"
"@babel/code-frame" "^7.18.6"
"@babel/generator" "^7.19.3"
"@babel/generator" "^7.19.6"
"@babel/helper-compilation-targets" "^7.19.3"
"@babel/helper-module-transforms" "^7.19.0"
"@babel/helpers" "^7.19.0"
"@babel/parser" "^7.19.3"
"@babel/helper-module-transforms" "^7.19.6"
"@babel/helpers" "^7.19.4"
"@babel/parser" "^7.19.6"
"@babel/template" "^7.18.10"
"@babel/traverse" "^7.19.3"
"@babel/types" "^7.19.3"
"@babel/traverse" "^7.19.6"
"@babel/types" "^7.19.4"
convert-source-map "^1.7.0"
debug "^4.1.0"
gensync "^1.0.0-beta.2"
@ -85,12 +85,12 @@
"@jridgewell/gen-mapping" "^0.3.2"
jsesc "^2.5.1"
"@babel/generator@^7.19.3":
version "7.19.3"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.3.tgz#d7f4d1300485b4547cb6f94b27d10d237b42bf59"
integrity sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ==
"@babel/generator@^7.19.6", "@babel/generator@^7.20.0":
version "7.20.0"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.0.tgz#0bfc5379e0efb05ca6092091261fcdf7ec36249d"
integrity sha512-GUPcXxWibClgmYJuIwC2Bc2Lg+8b9VjaJ+HlNdACEVt+Wlr1eoU1OPZjZRm7Hzl0gaTsUZNQfeihvZJhG7oc3w==
dependencies:
"@babel/types" "^7.19.3"
"@babel/types" "^7.20.0"
"@jridgewell/gen-mapping" "^0.3.2"
jsesc "^2.5.1"
@ -217,6 +217,20 @@
"@babel/traverse" "^7.19.0"
"@babel/types" "^7.19.0"
"@babel/helper-module-transforms@^7.19.6":
version "7.19.6"
resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz#6c52cc3ac63b70952d33ee987cbee1c9368b533f"
integrity sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==
dependencies:
"@babel/helper-environment-visitor" "^7.18.9"
"@babel/helper-module-imports" "^7.18.6"
"@babel/helper-simple-access" "^7.19.4"
"@babel/helper-split-export-declaration" "^7.18.6"
"@babel/helper-validator-identifier" "^7.19.1"
"@babel/template" "^7.18.10"
"@babel/traverse" "^7.19.6"
"@babel/types" "^7.19.4"
"@babel/helper-optimise-call-expression@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe"
@ -257,6 +271,13 @@
dependencies:
"@babel/types" "^7.18.6"
"@babel/helper-simple-access@^7.19.4":
version "7.19.4"
resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz#be553f4951ac6352df2567f7daa19a0ee15668e7"
integrity sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==
dependencies:
"@babel/types" "^7.19.4"
"@babel/helper-skip-transparent-expression-wrappers@^7.18.9":
version "7.18.9"
resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz#778d87b3a758d90b471e7b9918f34a9a02eb5818"
@ -276,6 +297,11 @@
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56"
integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==
"@babel/helper-string-parser@^7.19.4":
version "7.19.4"
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63"
integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==
"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1":
version "7.19.1"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2"
@ -305,6 +331,15 @@
"@babel/traverse" "^7.19.0"
"@babel/types" "^7.19.0"
"@babel/helpers@^7.19.4":
version "7.20.0"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.0.tgz#27c8ffa8cc32a2ed3762fba48886e7654dbcf77f"
integrity sha512-aGMjYraN0zosCEthoGLdqot1oRsmxVTQRHadsUPz5QM44Zej2PYRz7XiDE7GqnkZnNtLbOuxqoZw42vkU7+XEQ==
dependencies:
"@babel/template" "^7.18.10"
"@babel/traverse" "^7.20.0"
"@babel/types" "^7.20.0"
"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf"
@ -319,10 +354,10 @@
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.1.tgz#6f6d6c2e621aad19a92544cc217ed13f1aac5b4c"
integrity sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A==
"@babel/parser@^7.19.3":
version "7.19.3"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.3.tgz#8dd36d17c53ff347f9e55c328710321b49479a9a"
integrity sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ==
"@babel/parser@^7.19.6", "@babel/parser@^7.20.0":
version "7.20.0"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.0.tgz#b26133c888da4d79b0d3edcf42677bcadc783046"
integrity sha512-G9VgAhEaICnz8iiJeGJQyVl6J2nTjbW0xeisva0PK6XcKsga7BIaqm4ZF8Rg1Wbaqmy6znspNqhPaPkyukujzg==
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6":
version "7.18.6"
@ -1129,19 +1164,19 @@
debug "^4.1.0"
globals "^11.1.0"
"@babel/traverse@^7.19.3":
version "7.19.3"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.3.tgz#3a3c5348d4988ba60884e8494b0592b2f15a04b4"
integrity sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ==
"@babel/traverse@^7.19.6", "@babel/traverse@^7.20.0":
version "7.20.0"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.0.tgz#538c4c6ce6255f5666eba02252a7b59fc2d5ed98"
integrity sha512-5+cAXQNARgjRUK0JWu2UBwja4JLSO/rBMPJzpsKb+oBF5xlUuCfljQepS4XypBQoiigL0VQjTZy6WiONtUdScQ==
dependencies:
"@babel/code-frame" "^7.18.6"
"@babel/generator" "^7.19.3"
"@babel/generator" "^7.20.0"
"@babel/helper-environment-visitor" "^7.18.9"
"@babel/helper-function-name" "^7.19.0"
"@babel/helper-hoist-variables" "^7.18.6"
"@babel/helper-split-export-declaration" "^7.18.6"
"@babel/parser" "^7.19.3"
"@babel/types" "^7.19.3"
"@babel/parser" "^7.20.0"
"@babel/types" "^7.20.0"
debug "^4.1.0"
globals "^11.1.0"
@ -1154,12 +1189,12 @@
"@babel/helper-validator-identifier" "^7.18.6"
to-fast-properties "^2.0.0"
"@babel/types@^7.19.3":
version "7.19.3"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.3.tgz#fc420e6bbe54880bce6779ffaf315f5e43ec9624"
integrity sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw==
"@babel/types@^7.19.4", "@babel/types@^7.20.0":
version "7.20.0"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.0.tgz#52c94cf8a7e24e89d2a194c25c35b17a64871479"
integrity sha512-Jlgt3H0TajCW164wkTOTzHkZb075tMQMULzrLUoUeKmO7eFL96GgDxf7/Axhc5CAuKE3KFyVW1p6ysKsi2oXAg==
dependencies:
"@babel/helper-string-parser" "^7.18.10"
"@babel/helper-string-parser" "^7.19.4"
"@babel/helper-validator-identifier" "^7.19.1"
to-fast-properties "^2.0.0"
@ -1180,10 +1215,10 @@
mv "~2"
safe-json-stringify "~1"
"@expo/cli@0.3.1":
version "0.3.1"
resolved "https://registry.yarnpkg.com/@expo/cli/-/cli-0.3.1.tgz#827cbfa4e538243962217d684e924f55b5bafaa7"
integrity sha512-amdsNf5quVs9ZbO+q35sdtpWJvvQz5pqtl8ZOv5jqRriIp1G9zcOFTDG0TnGxANQ0F2b5GcU4fn7pxAzRLDHmQ==
"@expo/cli@0.3.2":
version "0.3.2"
resolved "https://registry.yarnpkg.com/@expo/cli/-/cli-0.3.2.tgz#83c8587ec38f9c7361222751bc4bb829520201b8"
integrity sha512-P6yogdPCRKaoLjuH7D8jgq6kTzM4gWuQ+vssBPWhbnoymV5AClQOxvACPDHD+biKhvGsaXEQLMoi93lPQzcDlQ==
dependencies:
"@babel/runtime" "^7.14.0"
"@expo/code-signing-certificates" "^0.0.2"
@ -1455,10 +1490,10 @@
semver "7.3.2"
xml2js "0.4.23"
"@expo/react-native-action-sheet@^3.14.0":
version "3.14.0"
resolved "https://registry.yarnpkg.com/@expo/react-native-action-sheet/-/react-native-action-sheet-3.14.0.tgz#484781425fb31c2a76c4344cdfdbb3609509846e"
integrity sha512-JvABIv68dyxbdXg965+K7OYDJdlJftHesqmaWGv1KF4bobbwKli4NK/zQKSltlfiI+cLxONwzBlvmx+AjlYGng==
"@expo/react-native-action-sheet@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@expo/react-native-action-sheet/-/react-native-action-sheet-4.0.0.tgz#d51475ebe6ea29b78aeecd699519c9ae0e1fcc9d"
integrity sha512-y+w5BpkEN7SZ/+cZN5lOJlOsatO9TIfwlJRB1iq33ateAU5uVrN4yRGPPDDrX3q8hpGky5hXplJ5I+GFM4DqlQ==
dependencies:
"@types/hoist-non-react-statics" "^3.3.1"
hoist-non-react-statics "^3.3.0"
@ -1510,10 +1545,10 @@
find-up "^5.0.0"
js-yaml "^4.1.0"
"@formatjs/ecma402-abstract@1.12.0":
version "1.12.0"
resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.12.0.tgz#2fb5e8983d5fae2fad9ec6c77aec1803c2b88d8e"
integrity sha512-0/wm9b7brUD40kx7KSE0S532T8EfH06Zc41rGlinoNyYXnuusR6ull2x63iFJgVXgwahm42hAW7dcYdZ+llZzA==
"@formatjs/ecma402-abstract@1.13.0":
version "1.13.0"
resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.13.0.tgz#df6db3cbee0182bbd2fd6217103781c802aee819"
integrity sha512-CQ8Ykd51jYD1n05dtoX6ns6B9n/+6ZAxnWUAonvHC4kkuAemROYBhHkEB4tm1uVrRlE7gLDqXkAnY51Y0pRCWQ==
dependencies:
"@formatjs/intl-localematcher" "0.2.31"
tslib "2.4.0"
@ -1525,38 +1560,38 @@
dependencies:
tslib "2.4.0"
"@formatjs/icu-messageformat-parser@2.1.8":
version "2.1.8"
resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.1.8.tgz#45cb678da4c760009b52fe6ca2c13aedbc200fee"
integrity sha512-T1R/UtPSCdznwjlfIJDl9XnjZdcFap+rPJrKC9uATr/sUdziVad3SfRQFf50JOuHptbk6knz+VdiYdApek4Sag==
"@formatjs/icu-messageformat-parser@2.1.10":
version "2.1.10"
resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.1.10.tgz#d11114343fcb4c6d5ccabdeac50badf49c83fd9e"
integrity sha512-KkRMxhifWkRC45dhM9tqm0GXbb6NPYTGVYY3xx891IKc6p++DQrZTnmkVSNNO47OEERLfuP2KkPFPJBuu8z/wg==
dependencies:
"@formatjs/ecma402-abstract" "1.12.0"
"@formatjs/icu-skeleton-parser" "1.3.13"
"@formatjs/ecma402-abstract" "1.13.0"
"@formatjs/icu-skeleton-parser" "1.3.14"
tslib "2.4.0"
"@formatjs/icu-skeleton-parser@1.3.13":
version "1.3.13"
resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.13.tgz#f7e186e72ed73c3272d22a3aacb646e77368b099"
integrity sha512-qb1kxnA4ep76rV+d9JICvZBThBpK5X+nh1dLmmIReX72QyglicsaOmKEcdcbp7/giCWfhVs6CXPVA2JJ5/ZvAw==
"@formatjs/icu-skeleton-parser@1.3.14":
version "1.3.14"
resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.14.tgz#b99ef7f855f8a58cab2519ec4f921f11c2bf74a7"
integrity sha512-7bv60HQQcBb3+TSj+45tOb/CHV5z1hOpwdtS50jsSBXfB+YpGhnoRsZxSRksXeCxMy6xn6tA6VY2601BrrK+OA==
dependencies:
"@formatjs/ecma402-abstract" "1.12.0"
"@formatjs/ecma402-abstract" "1.13.0"
tslib "2.4.0"
"@formatjs/intl-datetimeformat@^6.2.0":
version "6.2.0"
resolved "https://registry.yarnpkg.com/@formatjs/intl-datetimeformat/-/intl-datetimeformat-6.2.0.tgz#4fce81c5045469bbc3afb4e539c3bcf0b961352a"
integrity sha512-5oPDeXiKKE8nOoN+a9K5HW7hr8B/Z6px4lxsHG5MJ4XspI9hnYkzpJpfKuARN33mz7ZkaGNrbt82I/4B0rtjCA==
"@formatjs/intl-datetimeformat@^6.3.1":
version "6.3.1"
resolved "https://registry.yarnpkg.com/@formatjs/intl-datetimeformat/-/intl-datetimeformat-6.3.1.tgz#a5909ee5b6f26572758c2d8e809c7cd888e01b68"
integrity sha512-6uJS+ipQo4m8+F8sSbTOd+4osoDe/9V10Me0OYL2jFCgxC/fKemRVqqGccNOg4l3rQghGHnmrsJLsZ1ydBo5LQ==
dependencies:
"@formatjs/ecma402-abstract" "1.12.0"
"@formatjs/ecma402-abstract" "1.13.0"
"@formatjs/intl-localematcher" "0.2.31"
tslib "2.4.0"
"@formatjs/intl-displaynames@6.1.3":
version "6.1.3"
resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-6.1.3.tgz#c9d283db518cd721c0855e9854bfadb9ba304b6a"
integrity sha512-yBB165IH72fweGymRPrq8PQ4R5gKMR8vOj6XmkxGBICyJMhknc+RpG02g9Jsk/4jvO6qw/H0QtXHrHIg+Jv0sw==
"@formatjs/intl-displaynames@6.1.4":
version "6.1.4"
resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-6.1.4.tgz#26b2c7b814f5132b2e6d781bf4af7bce86f46852"
integrity sha512-sEbziGLsWQo6nA8ZUBcsDRlZzPg+uMVjDmbTalgGqRWLbdXuxMldTYdaCK+UptyJhkmNVM/erz3csTiyqamXHQ==
dependencies:
"@formatjs/ecma402-abstract" "1.12.0"
"@formatjs/ecma402-abstract" "1.13.0"
"@formatjs/intl-localematcher" "0.2.31"
tslib "2.4.0"
@ -1567,21 +1602,21 @@
dependencies:
tslib "2.4.0"
"@formatjs/intl-listformat@7.1.2":
version "7.1.2"
resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-7.1.2.tgz#3c5145436434795fa834150d0b6b6dc577aa6964"
integrity sha512-WfWkJ8k41jZIhXgBtC2T1SpTSKYig99g9MVqrVRco4kduv/6GUWq1eMjk84qZfbU4rwdwc8qct+/gB6DTS17+w==
"@formatjs/intl-listformat@7.1.3":
version "7.1.3"
resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-7.1.3.tgz#e2bda750a46d2a90d7fa023b02a984588978829c"
integrity sha512-rs0Kxl78PeRCedx2cmFoBqcun2Kf0bCQrF8ycna54sfePpDhMskvODWeI4G/xBioW01FjK7CJSvtJJ87hrr79A==
dependencies:
"@formatjs/ecma402-abstract" "1.12.0"
"@formatjs/ecma402-abstract" "1.13.0"
"@formatjs/intl-localematcher" "0.2.31"
tslib "2.4.0"
"@formatjs/intl-locale@^3.0.6":
version "3.0.6"
resolved "https://registry.yarnpkg.com/@formatjs/intl-locale/-/intl-locale-3.0.6.tgz#de20eb26fc3d3989e6160296891ed8c5e02d6592"
integrity sha512-vP3zSl74frX24UuiCXxUBjDmyg3tWaSN4Yep9m74fJF81VkxanQSUtQVQKKv8CzBmrwFPc1c5LF7co801zPp8Q==
"@formatjs/intl-locale@^3.0.7":
version "3.0.7"
resolved "https://registry.yarnpkg.com/@formatjs/intl-locale/-/intl-locale-3.0.7.tgz#e8fa1eddb31d4f9d1e5228eca5f400ba1949b5b9"
integrity sha512-XucpMNDhiS/gkp+OdvGyHOKBgnB7DVnY81ErjUFI/ztLWxskEDfFhQrWJ4VeG+z0+k2kVnm2akAixhJws3hoKA==
dependencies:
"@formatjs/ecma402-abstract" "1.12.0"
"@formatjs/ecma402-abstract" "1.13.0"
"@formatjs/intl-getcanonicallocales" "2.0.4"
tslib "2.4.0"
@ -1592,44 +1627,44 @@
dependencies:
tslib "2.4.0"
"@formatjs/intl-numberformat@^8.1.3":
version "8.1.3"
resolved "https://registry.yarnpkg.com/@formatjs/intl-numberformat/-/intl-numberformat-8.1.3.tgz#7666e2b3df9accdc0835cf7a3241abfda3b1fa72"
integrity sha512-OLa6/k7rzLCPfNnoCYE1nStZAU6dswFYrTNCyWpDt0uP5UOR6bgpYpLg0ZcnJX9MhV2ZEtcc69bvhL6pULxwDw==
"@formatjs/intl-numberformat@^8.2.0":
version "8.2.0"
resolved "https://registry.yarnpkg.com/@formatjs/intl-numberformat/-/intl-numberformat-8.2.0.tgz#7c2262eb66aff1e899bec155da43c6d6ad50356a"
integrity sha512-X9tIhOSrzw8ywBowd0QGyNE6oXHCcp2GKfTxBR3BZ9m99f5omoQTEH89wTdEFM38oQcWgXN4juSpJYbtZUQ2MA==
dependencies:
"@formatjs/ecma402-abstract" "1.12.0"
"@formatjs/ecma402-abstract" "1.13.0"
"@formatjs/intl-localematcher" "0.2.31"
tslib "2.4.0"
"@formatjs/intl-pluralrules@^5.1.3":
version "5.1.3"
resolved "https://registry.yarnpkg.com/@formatjs/intl-pluralrules/-/intl-pluralrules-5.1.3.tgz#0d65f733bf88fe4138ce79a75d00645d7712808f"
integrity sha512-jNEDAXhwpxO1IjOY+UNk7l5SLHX6QCIvJHd40q/HXyThLZULbweayam2rMMhoa/et5dW7K574qYwk2JIeiyxPA==
"@formatjs/intl-pluralrules@^5.1.4":
version "5.1.4"
resolved "https://registry.yarnpkg.com/@formatjs/intl-pluralrules/-/intl-pluralrules-5.1.4.tgz#7b8f0101a47a017d6b747a5a42959ccb604e4bef"
integrity sha512-SD9G54mH5Kp8COUxZbGL44oLG5ZoNc3MYG/09jtPbPLv8GjLXbs9EEvnwGi0OD9PEnj7dkg0FoOLMulFLcoeCA==
dependencies:
"@formatjs/ecma402-abstract" "1.12.0"
"@formatjs/ecma402-abstract" "1.13.0"
"@formatjs/intl-localematcher" "0.2.31"
tslib "2.4.0"
"@formatjs/intl-relativetimeformat@^11.1.3":
version "11.1.3"
resolved "https://registry.yarnpkg.com/@formatjs/intl-relativetimeformat/-/intl-relativetimeformat-11.1.3.tgz#a265154ce66f66d1b37745783282003a8013c46e"
integrity sha512-P4NLw7NEny3Z+y5IUzPHClcSJE+tuiRBMILXGA5KHayOzzIecm5MO44cOH6aDotunXu43W43Sk7IHHFBlYokBA==
"@formatjs/intl-relativetimeformat@^11.1.4":
version "11.1.4"
resolved "https://registry.yarnpkg.com/@formatjs/intl-relativetimeformat/-/intl-relativetimeformat-11.1.4.tgz#e8ececbae337caf4c62946f6080ef9eecfc6f36f"
integrity sha512-vUz2O1OpmKAyLTyQw6BUT0KMrm/2373zPUlF5wlCmy6mT4YIvxUAizaeSLHKpjQgc6qWmzsOiQTJG04Sz2vtYA==
dependencies:
"@formatjs/ecma402-abstract" "1.12.0"
"@formatjs/ecma402-abstract" "1.13.0"
"@formatjs/intl-localematcher" "0.2.31"
tslib "2.4.0"
"@formatjs/intl@2.4.2":
version "2.4.2"
resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-2.4.2.tgz#a2ae882cfd840391f6c319d241d449437511c285"
integrity sha512-RuZT+fecObhWA4CuoDolftfbEYn1yaqTG4yiTSX7W6vnvAupZOqyZXctzebtQ9pDhm6uHHNQSLQ0NL3Y8pCi9g==
"@formatjs/intl@2.5.1":
version "2.5.1"
resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-2.5.1.tgz#7a743c3f5ca70b7c7881d6e67e5ce14e2fffac2a"
integrity sha512-P01ZGuDDlcN8bHHBCEHspJPvs8WJeO8SXlUIcVGWhS3IN5vUgz0QKUXcKBFnJbEHhONJ+azlObVwvlDKsE+kUg==
dependencies:
"@formatjs/ecma402-abstract" "1.12.0"
"@formatjs/ecma402-abstract" "1.13.0"
"@formatjs/fast-memoize" "1.2.6"
"@formatjs/icu-messageformat-parser" "2.1.8"
"@formatjs/intl-displaynames" "6.1.3"
"@formatjs/intl-listformat" "7.1.2"
intl-messageformat "10.1.5"
"@formatjs/icu-messageformat-parser" "2.1.10"
"@formatjs/intl-displaynames" "6.1.4"
"@formatjs/intl-listformat" "7.1.3"
intl-messageformat "10.2.1"
tslib "2.4.0"
"@gar/promisify@^1.0.1":
@ -1971,10 +2006,10 @@
prompts "^2.4.0"
semver "^6.3.0"
"@react-native-community/netinfo@^9.3.4":
version "9.3.4"
resolved "https://registry.yarnpkg.com/@react-native-community/netinfo/-/netinfo-9.3.4.tgz#712d567703e05c4a01d82a18bd646a93c6757007"
integrity sha512-IXbJ+L8p4oE2ssDPfXCyxx9xVo5WuTMv6HA5YJw2McuRLLtVKR/vambycrB47AWTkHCTj3e0VOz28iUOvTSVPw==
"@react-native-community/netinfo@^9.3.6":
version "9.3.6"
resolved "https://registry.yarnpkg.com/@react-native-community/netinfo/-/netinfo-9.3.6.tgz#730de4ebf83f7263fa61b0cbec6cde9b28660077"
integrity sha512-SwbBnHZuXcCUpYdL6ebt4HPAZEugPASl+RPxIyNe91Y+boZptzAFLywYW6yU93DYAhiHHFQBL6x6LxwF/K/tOQ==
"@react-native-community/segmented-control@^2.2.2":
version "2.2.2"
@ -2047,10 +2082,10 @@
dependencies:
nanoid "^3.1.23"
"@react-navigation/stack@^6.3.2":
version "6.3.2"
resolved "https://registry.yarnpkg.com/@react-navigation/stack/-/stack-6.3.2.tgz#ba0a65e10e2b165185f20718046f25d8c9abb076"
integrity sha512-wb8koMp4OTrG5geOqEFPDatTyl8dsSyRBHN4h0wzgNT29V/JjkS3LYwkGLLfUmMfeLXFyIfEPILAjYLFmnk3dA==
"@react-navigation/stack@^6.3.3":
version "6.3.3"
resolved "https://registry.yarnpkg.com/@react-navigation/stack/-/stack-6.3.3.tgz#2a8447038eddd5778bda04605ff3c52c898e6213"
integrity sha512-7CMwLA4NiTnt0qwzZNKwI2ekHEDhTnn3rR6BhD26/De7J1Cogxpxd5pbvEiCG4w95YP/dD054i596howT0Mlmg==
dependencies:
"@react-navigation/elements" "^1.3.6"
color "^4.2.3"
@ -2074,14 +2109,14 @@
component-type "^1.2.1"
join-component "^1.1.0"
"@sentry/browser@7.14.2":
version "7.14.2"
resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.14.2.tgz#668359603e3f32e6debf6a139652f5233b4d3e58"
integrity sha512-KGAZ+5lK7gIO2CM3/MAQGY8JtNVCWXRi807lAxndJ3E1oIQb9A0x7b+AJNr1+6jlwf6QESblr92MCLKPHDpNbA==
"@sentry/browser@7.16.0":
version "7.16.0"
resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.16.0.tgz#afd2bac91857d2359272a0d9d2b1ee5ca7d69828"
integrity sha512-tJ063zvoF8Raw7mzQEXupOFPSN6v36WIbsDVGeFdToPCwViaBuATaxvWCrudGzsnBkMyItmTLJkzn9SEIXUOiw==
dependencies:
"@sentry/core" "7.14.2"
"@sentry/types" "7.14.2"
"@sentry/utils" "7.14.2"
"@sentry/core" "7.16.0"
"@sentry/types" "7.16.0"
"@sentry/utils" "7.16.0"
tslib "^1.9.3"
"@sentry/cli@1.74.4":
@ -2110,83 +2145,83 @@
proxy-from-env "^1.1.0"
which "^2.0.2"
"@sentry/core@7.14.2":
version "7.14.2"
resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.14.2.tgz#47262aad43d94d8c5fb73b668a7e8e9c4b91c98f"
integrity sha512-AXcH6nROugziO5KsKSQ9TmAXq6HJa8Fn+kDqAL/sNY65w6YYlHifMO2xHkSXVJxGw7vx9DYh/5SF+KnLn6NDNA==
"@sentry/core@7.16.0":
version "7.16.0"
resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.16.0.tgz#60f9b54ef2ec524176b329e1d15be39c36da5953"
integrity sha512-vq6H1b/IPTvzDD9coQ3wIudvSjkAYuUlXb1dv69dRlq4v3st9dcKBps1Zf0lQ1i4TVlDLoe1iGMmNFglMF1Q5w==
dependencies:
"@sentry/hub" "7.14.2"
"@sentry/types" "7.14.2"
"@sentry/utils" "7.14.2"
"@sentry/types" "7.16.0"
"@sentry/utils" "7.16.0"
tslib "^1.9.3"
"@sentry/hub@7.14.2":
version "7.14.2"
resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-7.14.2.tgz#b7b4d6e5002cd5abe9a829a84db5f4270689c666"
integrity sha512-18cuSesTn9VAF0JC107flLmtCRt/6DBn38uz0G9cPThKtTSNwjGvGZ/ag4J1iq+IDjVS5MA6iTncXOsSpVP2Wg==
"@sentry/hub@7.16.0":
version "7.16.0"
resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-7.16.0.tgz#26d65a2f6c71d18ec7a20f352fa8c4c461db2940"
integrity sha512-eCM66JPS2nw+fQK3vpJhs6Lxf4FqOwPqIpFbJ2TivQ8kgJyolHOyeH/LsmJbcw97P4sc3O3LHt5v93vTKmlDrw==
dependencies:
"@sentry/types" "7.14.2"
"@sentry/utils" "7.14.2"
"@sentry/core" "7.16.0"
"@sentry/types" "7.16.0"
"@sentry/utils" "7.16.0"
tslib "^1.9.3"
"@sentry/integrations@7.14.2":
version "7.14.2"
resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.14.2.tgz#52026f758e4c2a0436c4896bb8b2fa2765982042"
integrity sha512-vxS6ZDgPOxmbfEV6mynu7gouFSnq5LjlnEQYe2D7+/aRPzcgXzwPiqLt/Qd0OG+8LR2UjX+ziBTJOyARZcHxRA==
"@sentry/integrations@7.16.0":
version "7.16.0"
resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.16.0.tgz#fa6a2a2b7275efec5cf67c07eb76297447301ff2"
integrity sha512-PJRmFUHOKMf1APOlwxGB7Z6LHzJP4xL6OLSoiwnruRuHaGvdyILA53fr/A6wRMSPyTxJDJpNkcN36cA56mLxYA==
dependencies:
"@sentry/types" "7.14.2"
"@sentry/utils" "7.14.2"
"@sentry/types" "7.16.0"
"@sentry/utils" "7.16.0"
localforage "^1.8.1"
tslib "^1.9.3"
"@sentry/react-native@^4.6.1":
version "4.6.1"
resolved "https://registry.yarnpkg.com/@sentry/react-native/-/react-native-4.6.1.tgz#7d4842275c565c755212104a01ea48db9a120cff"
integrity sha512-P92DqyfqYURpHmaO2yqgqnmB4TW4id1HXe1JrwBvatSpCsinzVtySkmadxQMkIYKhCSEVSfhjGpz5zEosVRpQw==
"@sentry/react-native@^4.7.1":
version "4.7.1"
resolved "https://registry.yarnpkg.com/@sentry/react-native/-/react-native-4.7.1.tgz#e1cf140c524b5fe5a70133365a2020cc3ad960cb"
integrity sha512-IyqTJFTvxqjdvUOBhdEV9wijDba8If2Ns8AS9MmBnDySgx7dGHWvdGco0SUnT3gtc3jeus+/xjN3DCNp6VBACg==
dependencies:
"@sentry/browser" "7.14.2"
"@sentry/browser" "7.16.0"
"@sentry/cli" "1.74.4"
"@sentry/core" "7.14.2"
"@sentry/hub" "7.14.2"
"@sentry/integrations" "7.14.2"
"@sentry/react" "7.14.2"
"@sentry/tracing" "7.14.2"
"@sentry/types" "7.14.2"
"@sentry/utils" "7.14.2"
"@sentry/core" "7.16.0"
"@sentry/hub" "7.16.0"
"@sentry/integrations" "7.16.0"
"@sentry/react" "7.16.0"
"@sentry/tracing" "7.16.0"
"@sentry/types" "7.16.0"
"@sentry/utils" "7.16.0"
"@sentry/wizard" "1.2.17"
"@sentry/react@7.14.2":
version "7.14.2"
resolved "https://registry.yarnpkg.com/@sentry/react/-/react-7.14.2.tgz#2c59d09d543246d5228e603bd3af76fb30369b75"
integrity sha512-gWPSxOYcAEG/c7Ubuv0yAGMhOvHwMHQ47fEhYa8Be5e/kzXMzc/lQAaoKLNr73BZGvBvY7ghdC53ATGQXLGxpg==
"@sentry/react@7.16.0":
version "7.16.0"
resolved "https://registry.yarnpkg.com/@sentry/react/-/react-7.16.0.tgz#7b214736804b7516ba66230301bc6f0202060a91"
integrity sha512-tJH5zO4MPopzqZgi7Yd4iIB9Am5uGVefgkHaoeCGXffveEVWqEdjj8TqPL36SBb76gCmtpa01NBDsUSDZ1w/yw==
dependencies:
"@sentry/browser" "7.14.2"
"@sentry/types" "7.14.2"
"@sentry/utils" "7.14.2"
"@sentry/browser" "7.16.0"
"@sentry/types" "7.16.0"
"@sentry/utils" "7.16.0"
hoist-non-react-statics "^3.3.2"
tslib "^1.9.3"
"@sentry/tracing@7.14.2":
version "7.14.2"
resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-7.14.2.tgz#77f36618f10202a502dec4454dff43c6ede832d9"
integrity sha512-KCZogsvqUYiR9vNPWXVgSM00CF+yfYJaBd363fN3HUbjya4j96cHJg65zf6oy85Igr6IGclYaTkoEbiZ6xdNDw==
"@sentry/tracing@7.16.0":
version "7.16.0"
resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-7.16.0.tgz#823b84abf0df08ecd16669547b4281e3c7a96ac9"
integrity sha512-8a9bViUY7oS35msBMouxkgz5OGd9NGutuKF7SQ8hPZwTcQPOxOwPyHccykgr56k6OmaDjGCLZMqZowaysJj+4g==
dependencies:
"@sentry/hub" "7.14.2"
"@sentry/types" "7.14.2"
"@sentry/utils" "7.14.2"
"@sentry/core" "7.16.0"
"@sentry/types" "7.16.0"
"@sentry/utils" "7.16.0"
tslib "^1.9.3"
"@sentry/types@7.14.2":
version "7.14.2"
resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.14.2.tgz#78e2e2632d1ee10092549ba32efbe2bc288cbf6f"
integrity sha512-JzkOtenArOXmJBAk/FBbxKKX7XC650HqkhGL4ugT/f+RyxfiDZ0X1TAYMrvKIe+qpn5Nh7JUBfR+BARKAiu2wQ==
"@sentry/types@7.16.0":
version "7.16.0"
resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.16.0.tgz#79c06ada153a84feb949fa49b1c9d15f91decd79"
integrity sha512-i6D+OK6d0l/k+VQvRp/Pt21WkDEgVBUIZq+sOkEZJczbcfexVdXKeXXoYTD2vYuFq8Yy28fzlsZaKI+NoH94yQ==
"@sentry/utils@7.14.2":
version "7.14.2"
resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.14.2.tgz#5af245fc2d72211490cb9aeaf2098e048739120a"
integrity sha512-vpZolN+k1IoxWXhKyOVcRl7V1bgww+96gHqTJdcMzOB83x/ofels7L0kqxb03WukKTYcnc7Ep+yBiKi/OYX9og==
"@sentry/utils@7.16.0":
version "7.16.0"
resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.16.0.tgz#b832520c661d4435808969ee04814ff8e20497b1"
integrity sha512-3Zh1txg7IRp4kZAdG27YF7K6lD1IZyuAo9KjoPg1Xzqa4DOZyASJuEkbf+rK2a9T4HrtVHHXJUsNbKg8WM3VHg==
dependencies:
"@sentry/types" "7.14.2"
"@sentry/types" "7.16.0"
tslib "^1.9.3"
"@sentry/wizard@1.2.17":
@ -2297,10 +2332,10 @@
resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb"
integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==
"@types/react-dom@^18.0.6":
version "18.0.6"
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.6.tgz#36652900024842b74607a17786b6662dd1e103a1"
integrity sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==
"@types/react-dom@^18.0.8":
version "18.0.8"
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.8.tgz#d2606d855186cd42cc1b11e63a71c39525441685"
integrity sha512-C3GYO0HLaOkk9dDAz3Dl4sbe4AKUGTCfFIZsz3n/82dPNN8Du533HzKatDxeUYWu24wJgMP1xICqkWk1YOLOIw==
dependencies:
"@types/react" "*"
@ -2328,7 +2363,7 @@
dependencies:
"@types/react" "*"
"@types/react@*", "@types/react@16 || 17 || 18", "@types/react@^18.0.21":
"@types/react@*", "@types/react@16 || 17 || 18":
version "18.0.21"
resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.21.tgz#b8209e9626bb00a34c76f55482697edd2b43cc67"
integrity sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA==
@ -2337,6 +2372,15 @@
"@types/scheduler" "*"
csstype "^3.0.2"
"@types/react@^18.0.24":
version "18.0.24"
resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.24.tgz#2f79ed5b27f08d05107aab45c17919754cc44c20"
integrity sha512-wRJWT6ouziGUy+9uX0aW4YOJxAY0bG6/AOk5AW5QSvZqI7dk6VBIbXvcVgIw/W5Jrl24f77df98GEKTJGOLx7Q==
dependencies:
"@types/prop-types" "*"
"@types/scheduler" "*"
csstype "^3.0.2"
"@types/scheduler@*":
version "0.16.2"
resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39"
@ -4003,10 +4047,10 @@ expo-modules-autolinking@0.10.3:
find-up "^5.0.0"
fs-extra "^9.1.0"
expo-modules-core@0.11.7:
version "0.11.7"
resolved "https://registry.yarnpkg.com/expo-modules-core/-/expo-modules-core-0.11.7.tgz#538f2a4d7c353467fb0313de4788e86dd8f251e3"
integrity sha512-lTH6MYULX99JK3zN4bhjRD3I9Y1CGx0RAhpZ6gCTO8GQ/DNw4xZRUwburKL9dJeZM5G1xJOcGoBkTfeMjUVe+g==
expo-modules-core@0.11.8:
version "0.11.8"
resolved "https://registry.yarnpkg.com/expo-modules-core/-/expo-modules-core-0.11.8.tgz#68de1bc56a148b9a9c03f1268c67e9e264d4d4b9"
integrity sha512-goC2ghZFVaV6nXEbk+kz9oKnQmqW8fHVUCSPxC0QXhV0ay1dA9Ki6qqMPagkBJUPAz89NsNqW3bYR6DFXq7lvA==
dependencies:
compare-versions "^3.4.0"
invariant "^2.2.4"
@ -4069,13 +4113,13 @@ expo-web-browser@^11.0.0, expo-web-browser@~11.0.0:
dependencies:
compare-urls "^2.0.0"
expo@^46.0.15:
version "46.0.15"
resolved "https://registry.yarnpkg.com/expo/-/expo-46.0.15.tgz#c10d27c0ee85669132310949f2e56e95b4a14469"
integrity sha512-/uZLQgXKni/rLoJPUESte901Z8owZH4weItLGhac2T37zZEUHIqcWdI/1+BaN8Racz9x54PzgbIMh09QMgv9mQ==
expo@^46.0.16:
version "46.0.16"
resolved "https://registry.yarnpkg.com/expo/-/expo-46.0.16.tgz#8fe6d10207dabda34a684efac2c45c3c1c089f11"
integrity sha512-lZETkf3t+gbZjKjSceIpU7I8Rmm5nZ0ZG1WPzNBBbm+k64/+kKV96s6RqS37W1TTDpIbd+AucT9kKpvtv0JB2A==
dependencies:
"@babel/runtime" "^7.14.0"
"@expo/cli" "0.3.1"
"@expo/cli" "0.3.2"
"@expo/vector-icons" "^13.0.0"
babel-preset-expo "~9.2.0"
cross-spawn "^6.0.5"
@ -4086,7 +4130,7 @@ expo@^46.0.15:
expo-font "~10.2.1"
expo-keep-awake "~10.2.0"
expo-modules-autolinking "0.10.3"
expo-modules-core "0.11.7"
expo-modules-core "0.11.8"
fbemitter "^3.0.0"
getenv "^1.0.0"
invariant "^2.2.4"
@ -4739,10 +4783,10 @@ https-proxy-agent@^5.0.0:
agent-base "6"
debug "4"
i18next@^21.10.0:
version "21.10.0"
resolved "https://registry.yarnpkg.com/i18next/-/i18next-21.10.0.tgz#85429af55fdca4858345d0e16b584ec29520197d"
integrity sha512-YeuIBmFsGjUfO3qBmMOc0rQaun4mIpGKET5WDwvu8lU7gvwpcariZLNtL0Fzj+zazcHUrlXHiptcFhBMFaxzfg==
i18next@^22.0.4:
version "22.0.4"
resolved "https://registry.yarnpkg.com/i18next/-/i18next-22.0.4.tgz#77d8871687b0ab072b38991e3887187823667e30"
integrity sha512-TOp7BTMKDbUkOHMzDlVsCYWpyaFkKakrrO3HNXfSz4EeJaWwnBScRmgQSTaWHScXVHBUFXTvShrCW8uryBYFcg==
dependencies:
"@babel/runtime" "^7.17.2"
@ -4860,14 +4904,14 @@ internal-slot@^1.0.3:
has "^1.0.3"
side-channel "^1.0.4"
intl-messageformat@10.1.5:
version "10.1.5"
resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.1.5.tgz#ec053e0367ee5e4d40a9448ddbb9fff143266a9d"
integrity sha512-bDQz81oQ6TkQp1pSnlBK36ahGL5/tLb0+3hSiG/1/SnVbz5NWPQTqaPx2cT7nmGujDrPn9pQ0ik8RWE8v1lzEw==
intl-messageformat@10.2.1:
version "10.2.1"
resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.2.1.tgz#2f5626db773c82f3038d355f56ac4736ceef362b"
integrity sha512-1lrJG2qKzcC1TVzYu1VuB1yiY68LU5rwpbHa2THCzA67Vutkz7+1lv5U20K3Lz5RAiH78zxNztMEtchokMWv8A==
dependencies:
"@formatjs/ecma402-abstract" "1.12.0"
"@formatjs/ecma402-abstract" "1.13.0"
"@formatjs/fast-memoize" "1.2.6"
"@formatjs/icu-messageformat-parser" "2.1.8"
"@formatjs/icu-messageformat-parser" "2.1.10"
tslib "2.4.0"
invariant@*, invariant@^2.2.4:
@ -6588,24 +6632,25 @@ password-prompt@^1.0.4:
ansi-escapes "^3.1.0"
cross-spawn "^6.0.5"
patch-package@^6.4.7:
version "6.4.7"
resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.4.7.tgz#2282d53c397909a0d9ef92dae3fdeb558382b148"
integrity sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ==
patch-package@^6.5.0:
version "6.5.0"
resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.5.0.tgz#feb058db56f0005da59cfa316488321de585e88a"
integrity sha512-tC3EqJmo74yKqfsMzELaFwxOAu6FH6t+FzFOsnWAuARm7/n2xB5AOeOueE221eM9gtMuIKMKpF9tBy/X2mNP0Q==
dependencies:
"@yarnpkg/lockfile" "^1.1.0"
chalk "^2.4.2"
chalk "^4.1.2"
cross-spawn "^6.0.5"
find-yarn-workspace-root "^2.0.0"
fs-extra "^7.0.1"
is-ci "^2.0.0"
klaw-sync "^6.0.0"
minimist "^1.2.0"
minimist "^1.2.6"
open "^7.4.2"
rimraf "^2.6.3"
semver "^5.6.0"
slash "^2.0.0"
tmp "^0.0.33"
yaml "^1.10.2"
path-browserify@^1.0.0:
version "1.0.1"
@ -6894,28 +6939,28 @@ react-freeze@^1.0.0:
resolved "https://registry.yarnpkg.com/react-freeze/-/react-freeze-1.0.3.tgz#5e3ca90e682fed1d73a7cb50c2c7402b3e85618d"
integrity sha512-ZnXwLQnGzrDpHBHiC56TXFXvmolPeMjTn1UOm610M4EXGzbEDR7oOIyS2ZiItgbs6eZc4oU/a0hpk8PrcKvv5g==
react-i18next@^11.18.6:
version "11.18.6"
resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-11.18.6.tgz#e159c2960c718c1314f1e8fcaa282d1c8b167887"
integrity sha512-yHb2F9BiT0lqoQDt8loZ5gWP331GwctHz9tYQ8A2EIEUu+CcEdjBLQWli1USG3RdWQt3W+jqQLg/d4rrQR96LA==
react-i18next@^12.0.0:
version "12.0.0"
resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-12.0.0.tgz#634015a2c035779c5736ae4c2e5c34c1659753b1"
integrity sha512-/O7N6aIEAl1FaWZBNvhdIo9itvF/MO/nRKr9pYqRc9LhuC1u21SlfwpiYQqvaeNSEW3g3qUXLREOWMt+gxrWbg==
dependencies:
"@babel/runtime" "^7.14.5"
html-parse-stringify "^3.0.1"
react-intl@^6.1.2:
version "6.1.2"
resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-6.1.2.tgz#31ef6f0f2ed6e51910d4c1e7e27fb43fe7895b57"
integrity sha512-42Kkne7QzXjvljZQ3/ilWz5dHooG2cfgwmZbhtn90gZtUKzmyxRU11Os8nZvCuuLCW1vnecHTjsbBP+7Wpbp6g==
react-intl@^6.2.1:
version "6.2.1"
resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-6.2.1.tgz#976a44f86a58270d1e498d09636b0ece63ad0344"
integrity sha512-hYxcSamgoA3Mvc55nwhTF1v15T0NUSkaV/EScMNVZXg0kRyaMAoNHkCi9/9H+TnXWNiWrcWH9bjlMlJwrG2V7g==
dependencies:
"@formatjs/ecma402-abstract" "1.12.0"
"@formatjs/icu-messageformat-parser" "2.1.8"
"@formatjs/intl" "2.4.2"
"@formatjs/intl-displaynames" "6.1.3"
"@formatjs/intl-listformat" "7.1.2"
"@formatjs/ecma402-abstract" "1.13.0"
"@formatjs/icu-messageformat-parser" "2.1.10"
"@formatjs/intl" "2.5.1"
"@formatjs/intl-displaynames" "6.1.4"
"@formatjs/intl-listformat" "7.1.3"
"@types/hoist-non-react-statics" "^3.3.1"
"@types/react" "16 || 17 || 18"
hoist-non-react-statics "^3.3.2"
intl-messageformat "10.1.5"
intl-messageformat "10.2.1"
tslib "2.4.0"
"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0:
@ -6967,10 +7012,10 @@ react-native-context-menu-view@xmflsct/react-native-context-menu-view:
version "1.5.4"
resolved "https://codeload.github.com/xmflsct/react-native-context-menu-view/tar.gz/bff5773d318970cd67b5cf114d4bec1e200178eb"
react-native-fast-image@^8.6.1:
version "8.6.1"
resolved "https://registry.yarnpkg.com/react-native-fast-image/-/react-native-fast-image-8.6.1.tgz#6a3a11b8ebc7629919265d33a420a04d13c897e0"
integrity sha512-ILuP7EuakqHNzTr8ZbumhuxG4tE/wGQ66z4nEEuzc0FlqY6rYaPsnq/UD2ahoyFj6QP1WvA2RIK3odib+VcqWg==
react-native-fast-image@^8.6.3:
version "8.6.3"
resolved "https://registry.yarnpkg.com/react-native-fast-image/-/react-native-fast-image-8.6.3.tgz#6edc3f9190092a909d636d93eecbcc54a8822255"
integrity sha512-Sdw4ESidXCXOmQ9EcYguNY2swyoWmx53kym2zRsvi+VeFCHEdkO+WG1DK+6W81juot40bbfLNhkc63QnWtesNg==
react-native-feather@^1.1.2:
version "1.1.2"
@ -6985,10 +7030,10 @@ react-native-flash-message@^0.3.1:
prop-types "^15.8.1"
react-native-iphone-x-helper "^1.3.1"
react-native-gesture-handler@^2.7.1:
version "2.7.1"
resolved "https://registry.yarnpkg.com/react-native-gesture-handler/-/react-native-gesture-handler-2.7.1.tgz#c109d33c38cb182fafcda13012b77c6cac43b127"
integrity sha512-Rnak7U4v3ZB+vjVghv5CvAGS+UfRLsXUq7Nq+FycloxZ7jUZjBo+7rPnt+EdTIE2zc2pKhQHIQKcD+IAPg2Scg==
react-native-gesture-handler@^2.8.0:
version "2.8.0"
resolved "https://registry.yarnpkg.com/react-native-gesture-handler/-/react-native-gesture-handler-2.8.0.tgz#ef9857871c10663c95a51546225b6e00cd4740cf"
integrity sha512-poOSfz/w0IyD6Qwq7aaIRRfEaVTl1ecQFoyiIbpOpfNTjm2B1niY2FLrdVQIOtIOe+K9nH55Qal04nr4jGkHdQ==
dependencies:
"@egjs/hammerjs" "^2.0.17"
hoist-non-react-statics "^3.3.0"
@ -7024,20 +7069,25 @@ react-native-language-detection@^0.1.0:
resolved "https://registry.yarnpkg.com/react-native-language-detection/-/react-native-language-detection-0.1.0.tgz#06b5d20bffb60dbbd599c8e62b6acf500952afa8"
integrity sha512-26CLndVMmMbVp40Y9Herza73nfR08JFTcYkJ3MX5MIQbGRoqgNAG89z8pA1y7dPHHK1Nfa6AWKAYpNv7tMRCaw==
react-native-pager-view@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/react-native-pager-view/-/react-native-pager-view-6.0.1.tgz#353abf38d3c2b91ed7c586f10af0f94700f5b1dc"
integrity sha512-kOVNu+4JnR3Gpykviy4WbOAnQz8TgP6O2pRvne221oPUDQLYrvEE/FINR0P85TxbMgvKTPlLejGw0ZHQbezK/g==
react-native-live-text-image-view@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/react-native-live-text-image-view/-/react-native-live-text-image-view-0.4.0.tgz#d23d5850788609fd1448533213fc6c453c584761"
integrity sha512-PhVFE0YogSLrTlnHIxUWL80CrmbDvxk1JvLx4UHiRHRwLda4dV/e/9Q+Pyh7Vq7qwAPE6vGoN6sjbXNaj4WCew==
react-native-reanimated-zoom@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/react-native-reanimated-zoom/-/react-native-reanimated-zoom-0.3.1.tgz#f8f7ab088df920e612dce4cd77a2cd772b50bc17"
integrity sha512-/RlmFwfRbRABMWJbZZ51u9wEtDXQ6cR5oM6X9/NAJZhg9KDXzy8Ijt/DYSOsEFMIE2BrZZCY7v/UsM3XdsNdFA==
react-native-pager-view@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/react-native-pager-view/-/react-native-pager-view-6.0.2.tgz#447b85fcb9f35225c4d6885c18689a7d30c181d9"
integrity sha512-XL3Qc9k7o0BykclGHtuRUz97FpF6rcKbP8LqszLeS2hKnINYcbUPYqg46EhbwVhFOUJE+XhT3idrSO1e/D6jtQ==
react-native-reanimated@^2.10.0:
version "2.10.0"
resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-2.10.0.tgz#ed53be66bbb553b5b5e93e93ef4217c87b8c73db"
integrity sha512-jKm3xz5nX7ABtHzzuuLmawP0pFWP77lXNdIC6AWOceBs23OHUaJ29p4prxr/7Sb588GwTbkPsYkDqVFaE3ezNQ==
react-native-reanimated-zoom@^0.3.2:
version "0.3.2"
resolved "https://registry.yarnpkg.com/react-native-reanimated-zoom/-/react-native-reanimated-zoom-0.3.2.tgz#11ffcf9d518023cca68ac1968ddf836abd4653a4"
integrity sha512-p/IVINRdejc+hXoHIXuC3fl1ewlZLYTXZ9ShjLkEJY8SXa4swFFLWzoERwhJxYhc7D6Mxc5cQOTxpiEp2bAVGw==
react-native-reanimated@^2.12.0:
version "2.12.0"
resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-2.12.0.tgz#5821eecfb1769b1617a67a2d4dec12fdeedb2b6e"
integrity sha512-nrlPyw+Hx9u4iJhZk9PoTvDo/QmVAd+bo7OK9Tv3hveNEF9++5oig/g3Uv9V93shy9avTYGsUprUvAEt/xdzeQ==
dependencies:
"@babel/plugin-transform-object-assign" "^7.16.7"
"@babel/preset-typescript" "^7.16.7"
@ -7052,10 +7102,10 @@ react-native-safe-area-context@^4.4.1:
resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-4.4.1.tgz#239c60b8a9a80eac70a38a822b04c0f1d15ffc01"
integrity sha512-N9XTjiuD73ZpVlejHrUWIFZc+6Z14co1K/p1IFMkImU7+avD69F3y+lhkqA2hN/+vljdZrBSiOwXPkuo43nFQA==
react-native-screens@^3.18.1:
version "3.18.1"
resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-3.18.1.tgz#19059f34a29a2ff4247ebb1bf0c2f9beacec1ec4"
integrity sha512-GtEC1AbvpvtKDJldavuONF/hXW1aEZO7qz8SioyHrV9L9/nDiy+iTviMFmeEoix9KwmEHHxoYxc0xiDrFxKHyA==
react-native-screens@^3.18.2:
version "3.18.2"
resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-3.18.2.tgz#d7ab2d145258d3db9fa630fa5379dc4474117866"
integrity sha512-ANUEuvMUlsYJ1QKukEhzhfrvOUO9BVH9Nzg+6eWxpn3cfD/O83yPBOF8Mx6x5H/2+sMy+VS5x/chWOOo/U7QJw==
dependencies:
react-freeze "^1.0.0"
warn-once "^0.1.0"
@ -8685,6 +8735,11 @@ yallist@^4.0.0:
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
yaml@^1.10.2:
version "1.10.2"
resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
yargs-parser@^18.1.2:
version "18.1.3"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"