Compare commits

...

32 Commits
v4.9.6 ... main

Author SHA1 Message Date
xmflsct 7bcef6fe1d
Fix patch 2024-02-07 00:26:41 +01:00
xmflsct 6f27785a12
Try fixing navigation 2024-02-07 00:22:22 +01:00
xmflsct 5cec5e8084
Clean up 2024-02-06 22:09:36 +01:00
xmflsct 7b63150e73
Squashed commit of the following:
commit 37d93d723606fc3b43ec3e0379e0a87b27afac72
Author: xmflsct <me@xmflsct.com>
Date:   Mon Feb 5 01:14:40 2024 +0100

    Match Android

commit 3a192afc7704fcab7ddd14c5496ad68eac12405c
Author: xmflsct <me@xmflsct.com>
Date:   Mon Feb 5 00:33:38 2024 +0100

    Updates

commit 84617bdadf7fd0ba6474e610a174decc92015b0b
Author: xmflsct <me@xmflsct.com>
Date:   Mon Feb 5 00:24:56 2024 +0100

    Updates

commit 9919e8890e02e7d583046e22e3dbe34af02e3f28
Author: xmflsct <me@xmflsct.com>
Date:   Mon Feb 5 00:19:19 2024 +0100

    Updates

commit fca65a03665f4162696dc50c16098bc28f336f31
Author: xmflsct <me@xmflsct.com>
Date:   Mon Feb 5 00:13:20 2024 +0100

    Updates

commit d208d67a052464939197a15877f67302f262c222
Author: xmflsct <me@xmflsct.com>
Date:   Mon Feb 5 00:09:05 2024 +0100

    Updates

commit 5527ebca78d863515848521571657f1eac628de4
Author: xmflsct <me@xmflsct.com>
Date:   Mon Feb 5 00:03:19 2024 +0100

    Bump core
2024-02-05 01:14:54 +01:00
xmflsct 997a267b89
Update Gemfile.lock 2024-02-04 12:51:44 +01:00
xmflsct 41c09d4ae9
Bump building chain 2024-02-04 12:39:10 +01:00
xmflsct a70dce9780
New Crowdin updates (#762)
* New translations tabs.json (Swedish)

* New translations instance.json (Portuguese, Brazilian)

* New translations timeline.json (Portuguese, Brazilian)

* New translations contextMenu.json (Portuguese, Brazilian)

* New translations tabs.json (Swedish)

* New translations common.json (Russian)

* New translations instance.json (Russian)

* New translations parse.json (Russian)

* New translations relationship.json (Russian)

* New translations timeline.json (Russian)

* New translations timeline.json (Russian)
2023-11-12 17:57:10 +01:00
xmflsct d16178abc9
Bump patch versions 2023-11-12 17:44:52 +01:00
xmflsct fa8d7ed47e
New Crowdin updates (#760)
* New translations tabs.json (Portuguese, Brazilian)

* New translations contextMenu.json (Portuguese, Brazilian)

* New translations tabs.json (Portuguese, Brazilian)
2023-08-28 00:40:30 +02:00
xmflsct 9f8064ded4
Fix Android crashes using PlatformColor 2023-08-28 00:27:10 +02:00
vitalyster c3aba848a5
Use system separator color in Separator component (#757)
* border color is too distracting and does not look "native". Now we using system separator color to provide "native" experience :-)
2023-08-24 22:21:31 +02:00
xmflsct f64135a6df
Fix #756 2023-08-22 00:03:06 +02:00
xmflsct 1de8a40cda
New Crowdin updates (#752)
* New translations tabs.json (Chinese Traditional)

* New translations tabs.json (Dutch)

* New translations tabs.json (Dutch)

* New translations common.json (Portuguese, Brazilian)

* New translations parse.json (Portuguese, Brazilian)

* New translations timeline.json (Portuguese, Brazilian)

* New translations tabs.json (Portuguese, Brazilian)

* New translations tabs.json (Swedish)

* New translations tabs.json (Swedish)

* New translations common.json (Swedish)

* New translations contextMenu.json (Swedish)
2023-08-17 10:07:44 +02:00
xmflsct c5c616e3dc
Fix #754 2023-08-16 23:47:00 +02:00
xmflsct 34043fc1b3
Bumps 2023-07-30 21:45:08 +02:00
xmflsct 5b031b40c0
New Crowdin updates (#751)
* New translations tabs.json (German)

* New translations tabs.json (Chinese Traditional)
2023-07-16 23:10:14 +02:00
xmflsct 7b6c9d5130
Update index.tsx 2023-07-16 23:10:05 +02:00
xmflsct da623dac56
New Crowdin updates (#748)
* New translations tabs.json (Belarusian)

* New translations tabs.json (French)

* New translations tabs.json (Spanish)

* New translations tabs.json (Catalan)

* New translations tabs.json (Czech)

* New translations tabs.json (German)

* New translations tabs.json (Greek)

* New translations tabs.json (Basque)

* New translations tabs.json (Italian)

* New translations tabs.json (Japanese)

* New translations tabs.json (Korean)

* New translations tabs.json (Dutch)

* New translations tabs.json (Norwegian)

* New translations tabs.json (Polish)

* New translations tabs.json (Russian)

* New translations tabs.json (Swedish)

* New translations tabs.json (Ukrainian)

* New translations tabs.json (Chinese Simplified)

* New translations tabs.json (Chinese Traditional)

* New translations tabs.json (Vietnamese)

* New translations tabs.json (Portuguese, Brazilian)

* New translations tabs.json (Spanish)

* New translations tabs.json (Catalan)

* New translations tabs.json (Basque)

* New translations tabs.json (Norwegian)

* New translations tabs.json (Ukrainian)

* New translations tabs.json (Belarusian)

* New translations tabs.json (German)

* New translations tabs.json (Dutch)

* New translations tabs.json (Chinese Simplified)

* New translations tabs.json (Chinese Traditional)
2023-07-14 23:08:10 +02:00
xmflsct 0a99669af6
Update index.tsx 2023-07-14 22:56:08 +02:00
xmflsct cdd80250d1
Fix muting 2023-07-14 21:48:12 +02:00
xmflsct 09bc6c30af
Added a button to fetch latest toot on load 2023-07-13 23:30:26 +02:00
xmflsct 8b3ca21ac9
Fix #749 2023-07-13 22:26:06 +02:00
xmflsct 6e5b06f3a7
Fix #734 2023-07-13 21:55:26 +02:00
xmflsct f7729f33db
Fix Android menu indication 2023-07-12 23:36:44 +02:00
xmflsct f2b275d815
Bumps 2023-07-12 22:34:50 +02:00
xmflsct 0e64350df8
New Crowdin updates (#745)
* New translations tabs.json (Belarusian)

* New translations common.json (Italian)

* New translations instance.json (Italian)

* New translations timeline.json (Italian)
2023-07-11 23:31:30 +02:00
xmflsct 760c8b4c68
Bump packages 2023-07-11 23:21:41 +02:00
xmflsct f1ba7ce377
Test iOS
Known Android build failure
2023-06-22 00:07:17 +02:00
xmflsct 3154540bba
Bump packages 2023-06-21 23:05:40 +02:00
xmflsct 93b3ac1618
Bump JS packages 2023-06-09 23:56:15 +02:00
xmflsct 4b2b701cea
Fix #741 2023-06-09 23:50:36 +02:00
dependabot[bot] 33709f8fa6
Bump fast-xml-parser from 4.2.2 to 4.2.4 (#742)
Bumps [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser) from 4.2.2 to 4.2.4.
- [Release notes](https://github.com/NaturalIntelligence/fast-xml-parser/releases)
- [Changelog](https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/NaturalIntelligence/fast-xml-parser/commits)

---
updated-dependencies:
- dependency-name: fast-xml-parser
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-06-09 23:18:15 +02:00
117 changed files with 9767 additions and 8130 deletions

View File

@ -7,12 +7,12 @@ on:
jobs:
build-ios:
runs-on: macos-13
runs-on: macos-14
steps:
- uses: tj-actions/branch-names@v6
- uses: tj-actions/branch-names@v8
id: branch
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
- run: corepack enable
@ -20,7 +20,7 @@ jobs:
- run: bundle install
- run: yarn app:build ios
env:
DEVELOPER_DIR: /Applications/Xcode_14.3.app/Contents/Developer
DEVELOPER_DIR: /Applications/Xcode_15.2.app/Contents/Developer
ENVIRONMENT: ${{ steps.branch.outputs.current_branch }}
SENTRY_ENVIRONMENT: ${{ steps.branch.outputs.current_branch }}
LC_ALL: en_US.UTF-8
@ -38,18 +38,18 @@ jobs:
GH_PAT_GET_RELEASE: ${{ secrets.GITHUB_TOKEN }}
build-android:
runs-on: macos-13
runs-on: macos-14
steps:
- uses: tj-actions/branch-names@v6
- uses: tj-actions/branch-names@v8
id: branch
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
- uses: actions/setup-java@v3
- uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: '11'
java-version: '17'
- run: corepack enable
- run: yarn install
- run: bundle install
@ -67,19 +67,19 @@ jobs:
GH_PAT_GET_RELEASE: ${{ secrets.GITHUB_TOKEN }}
create-release:
runs-on: macos-13
runs-on: macos-14
needs: [build-ios, build-android]
steps:
- uses: tj-actions/branch-names@v6
- uses: tj-actions/branch-names@v8
id: branch
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
- uses: actions/setup-java@v3
- uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: '11'
java-version: '17'
- run: corepack enable
- run: yarn install
- run: bundle install

2
.nvmrc
View File

@ -1 +1 @@
18
20

View File

@ -1,13 +0,0 @@
diff --git a/ios/EXAV/EXAudioSessionManager.m b/ios/EXAV/EXAudioSessionManager.m
index 81dce13366c3947b12c863f7b39c0237882a6c36..fa27e0a354d48a994ca46e19642a5e224d42d9a8 100644
--- a/ios/EXAV/EXAudioSessionManager.m
+++ b/ios/EXAV/EXAudioSessionManager.m
@@ -170,7 +170,7 @@ - (void)moduleDidBackground:(id)backgroundingModule
[_foregroundedModules compact];
// Any possible failures are silent
- [self _updateSessionConfiguration];
+ // [self _updateSessionConfiguration];
}
- (void)moduleDidForeground:(id)module

View File

@ -1,14 +0,0 @@
diff --git a/src/functions/Helpers.ts b/src/functions/Helpers.ts
index e04486540494891ab07ec130b686dc4acddf2d0c..265e6ac11439276a1c52c222dfc4c50daf1689ae 100644
--- a/src/functions/Helpers.ts
+++ b/src/functions/Helpers.ts
@@ -77,7 +77,8 @@ export function getNativeNodeHandle(nativeRef: React.Component){
const nodeHandle = findNodeHandle(nativeRef);
if(nodeHandle == null){
- throw new Error('Unable to get the node handle for the native ref.');
+ return 0
+ // throw new Error('Unable to get the node handle for the native ref.');
};
return nodeHandle;

View File

@ -0,0 +1,64 @@
diff --git a/ios/Sources/Common/AutoLayoutWrapperView.swift b/ios/Sources/Common/AutoLayoutWrapperView.swift
index e2b9be9c129c66eed3eaebb4e33f5456ce98f5da..ef6a0087f524c8d228b7fee31e54fc3dba769ffa 100644
--- a/ios/Sources/Common/AutoLayoutWrapperView.swift
+++ b/ios/Sources/Common/AutoLayoutWrapperView.swift
@@ -18,7 +18,11 @@ class AutoLayoutWrapperView: UIView {
override func addSubview(_ view: UIView) {
if let detachedView = view as? RNIDetachedView {
- detachedView.updateBounds(newSize: self.bounds.size);
+ do {
+ try detachedView.updateBounds(newSize: self.bounds.size);
+ } catch {
+ print("Error: \(error)");
+ };
};
super.addSubview(view);
@@ -37,7 +41,11 @@ class AutoLayoutWrapperView: UIView {
func updateSizeOfSubviews(newSize: CGSize? = nil){
self.subviews.forEach {
guard let detachedView = $0 as? RNIDetachedView else { return };
- detachedView.updateBounds(newSize: newSize ?? self.bounds.size);
+ do {
+ try detachedView.updateBounds(newSize: newSize ?? self.bounds.size);
+ } catch {
+ print("Error: \(error)");
+ };
};
};
};
diff --git a/ios/Sources/RNIContextMenuView/RNIContextMenuPreviewController.swift b/ios/Sources/RNIContextMenuView/RNIContextMenuPreviewController.swift
index 2b4dc6287c68c88d6652b963ac2cc5f59251ffa9..7c8472e90dac8359f6b40ce2c096323fcf388249 100644
--- a/ios/Sources/RNIContextMenuView/RNIContextMenuPreviewController.swift
+++ b/ios/Sources/RNIContextMenuView/RNIContextMenuPreviewController.swift
@@ -63,7 +63,11 @@ class RNIContextMenuPreviewController: UIViewController {
case .STRETCH:
guard let menuCustomPreviewView = self.menuCustomPreviewView else { return };
- menuCustomPreviewView.updateBounds(newSize: self.view.bounds.size);
+ do {
+ try menuCustomPreviewView.updateBounds(newSize: self.view.bounds.size);
+ } catch {
+ print("Error: \(error)");
+ };
self.preferredContentSize = .zero;
case .INHERIT:
diff --git a/ios/Sources/RNIContextMenuView/RNIContextMenuView.swift b/ios/Sources/RNIContextMenuView/RNIContextMenuView.swift
index affabcdee8303681f1438c6cfdb9d90d6a105ba6..7c470229e06250f4bd80d3133e381b91ff4f61c5 100644
--- a/ios/Sources/RNIContextMenuView/RNIContextMenuView.swift
+++ b/ios/Sources/RNIContextMenuView/RNIContextMenuView.swift
@@ -307,7 +307,11 @@ public class RNIContextMenuView:
.init(with: detachedView)
);
- detachedView.detach();
+ do {
+ try detachedView.detach();
+ } catch {
+ print("Error: \(error)");
+ };
};
#if DEBUG

View File

@ -35,4 +35,4 @@ index 70ce1c8d6a43e711f06b93d1eda3b44a3ad9a659..cdc2713470f2d332b8bf3e9c97e38fd9
+ });
});
const pinch = Gesture.Pinch()
const pinch = Gesture.Pinch()

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

893
.yarn/releases/yarn-4.1.0.cjs vendored Executable file

File diff suppressed because one or more lines are too long

View File

@ -1,7 +1,7 @@
compressionLevel: mixed
enableGlobalCache: false
nodeLinker: node-modules
plugins:
- path: .yarn/plugins/@yarnpkg/plugin-typescript.cjs
spec: "@yarnpkg/plugin-typescript"
- path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
spec: "@yarnpkg/plugin-interactive-tools"
yarnPath: .yarn/releases/yarn-4.1.0.cjs

View File

@ -1,6 +1,13 @@
source "https://rubygems.org"
# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version
ruby ">= 2.6.10"
# Cocoapods 1.15 introduced a bug which break the build. We will remove the upper
# bound in the template on Cocoapods with next React Native release.
gem 'cocoapods', '>= 1.13', '< 1.15'
gem 'activesupport', '>= 6.1.7.5', '< 7.1.0'
gem "fastlane"
gem 'cocoapods'
plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')
eval_gemfile(plugins_path) if File.exist?(plugins_path)

View File

@ -8,37 +8,37 @@ GEM
i18n (>= 1.6, < 2)
minitest (>= 5.1)
tzinfo (~> 2.0)
addressable (2.8.1)
addressable (2.8.6)
public_suffix (>= 2.0.2, < 6.0)
algoliasearch (1.27.5)
httpclient (~> 2.8, >= 2.8.3)
json (>= 1.5.1)
artifactory (3.0.15)
atomos (0.1.3)
aws-eventstream (1.2.0)
aws-partitions (1.722.0)
aws-sdk-core (3.170.0)
aws-eventstream (~> 1, >= 1.0.2)
aws-eventstream (1.3.0)
aws-partitions (1.887.0)
aws-sdk-core (3.191.0)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.5)
aws-sigv4 (~> 1.8)
jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.63.0)
aws-sdk-core (~> 3, >= 3.165.0)
aws-sdk-kms (1.77.0)
aws-sdk-core (~> 3, >= 3.191.0)
aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.119.1)
aws-sdk-core (~> 3, >= 3.165.0)
aws-sdk-s3 (1.143.0)
aws-sdk-core (~> 3, >= 3.191.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.4)
aws-sigv4 (1.5.2)
aws-sigv4 (~> 1.8)
aws-sigv4 (1.8.0)
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
claide (1.1.0)
cocoapods (1.12.0)
cocoapods (1.14.3)
addressable (~> 2.8)
claide (>= 1.0.2, < 2.0)
cocoapods-core (= 1.12.0)
cocoapods-core (= 1.14.3)
cocoapods-deintegrate (>= 1.0.3, < 2.0)
cocoapods-downloader (>= 1.6.0, < 2.0)
cocoapods-downloader (>= 2.1, < 3.0)
cocoapods-plugins (>= 1.0.0, < 2.0)
cocoapods-search (>= 1.0.0, < 2.0)
cocoapods-trunk (>= 1.6.0, < 2.0)
@ -50,8 +50,8 @@ GEM
molinillo (~> 0.8.0)
nap (~> 1.0)
ruby-macho (>= 2.3.0, < 3.0)
xcodeproj (>= 1.21.0, < 2.0)
cocoapods-core (1.12.0)
xcodeproj (>= 1.23.0, < 2.0)
cocoapods-core (1.14.3)
activesupport (>= 5.0, < 8)
addressable (~> 2.8)
algoliasearch (~> 1.0)
@ -62,7 +62,7 @@ GEM
public_suffix (~> 4.0)
typhoeus (~> 1.0)
cocoapods-deintegrate (1.0.5)
cocoapods-downloader (1.6.3)
cocoapods-downloader (2.1)
cocoapods-plugins (1.0.0)
nap
cocoapods-search (1.0.1)
@ -76,16 +76,15 @@ GEM
highline (~> 2.0.0)
concurrent-ruby (1.2.2)
declarative (0.0.20)
digest-crc (0.6.4)
digest-crc (0.6.5)
rake (>= 12.0.0, < 14.0.0)
domain_name (0.5.20190701)
unf (>= 0.0.5, < 1.0.0)
domain_name (0.6.20240107)
dotenv (2.8.1)
emoji_regex (3.2.3)
escape (0.0.4)
ethon (0.16.0)
ffi (>= 1.15.0)
excon (0.99.0)
excon (0.109.0)
faraday (1.10.3)
faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0)
@ -114,8 +113,8 @@ GEM
faraday-retry (1.0.3)
faraday_middleware (1.2.0)
faraday (~> 1.0)
fastimage (2.2.6)
fastlane (2.212.1)
fastimage (2.3.0)
fastlane (2.219.0)
CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
@ -134,20 +133,22 @@ GEM
gh_inspector (>= 1.1.2, < 2.0.0)
google-apis-androidpublisher_v3 (~> 0.3)
google-apis-playcustomapp_v1 (~> 0.1)
google-cloud-env (>= 1.6.0, < 2.0.0)
google-cloud-storage (~> 1.31)
highline (~> 2.0)
http-cookie (~> 1.0.5)
json (< 3.0.0)
jwt (>= 2.1.0, < 3)
mini_magick (>= 4.9.4, < 5.0.0)
multipart-post (~> 2.0.0)
multipart-post (>= 2.0.0, < 3.0.0)
naturally (~> 2.2)
optparse (~> 0.1.1)
optparse (>= 0.1.1)
plist (>= 3.1.0, < 4.0.0)
rubyzip (>= 2.0.0, < 3.0.0)
security (= 0.1.3)
simctl (~> 1.6.3)
terminal-notifier (>= 2.0.0, < 3.0.0)
terminal-table (>= 1.4.5, < 2.0.0)
terminal-table (~> 3)
tty-screen (>= 0.6.3, < 1.0.0)
tty-spinner (>= 0.8.0, < 1.0.0)
word_wrap (~> 1.0.0)
@ -159,13 +160,13 @@ GEM
os (~> 1.1, >= 1.1.4)
fastlane-plugin-versioning_android (0.1.1)
fastlane-plugin-yarn (1.2)
ffi (1.15.5)
ffi (1.16.3)
fourflusher (2.3.1)
fuzzy_match (2.0.4)
gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.35.0)
google-apis-androidpublisher_v3 (0.54.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-core (0.11.0)
google-apis-core (0.11.3)
addressable (~> 2.5, >= 2.5.1)
googleauth (>= 0.16.2, < 2.a)
httpclient (>= 2.8.1, < 3.a)
@ -173,31 +174,29 @@ GEM
representable (~> 3.0)
retriable (>= 2.0, < 4.a)
rexml
webrick
google-apis-iamcredentials_v1 (0.17.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-playcustomapp_v1 (0.13.0)
google-apis-core (>= 0.11.0, < 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-apis-storage_v1 (0.31.0)
google-apis-core (>= 0.11.0, < 2.a)
google-cloud-core (1.6.1)
google-cloud-env (>= 1.0, < 3.a)
google-cloud-errors (~> 1.0)
google-cloud-env (1.6.0)
faraday (>= 0.17.3, < 3.0)
google-cloud-errors (1.3.1)
google-cloud-storage (1.44.0)
google-cloud-storage (1.47.0)
addressable (~> 2.8)
digest-crc (~> 0.4)
google-apis-iamcredentials_v1 (~> 0.1)
google-apis-storage_v1 (~> 0.19.0)
google-apis-storage_v1 (~> 0.31.0)
google-cloud-core (~> 1.6)
googleauth (>= 0.16.2, < 2.a)
mini_mime (~> 1.0)
googleauth (1.3.0)
googleauth (1.8.1)
faraday (>= 0.17.3, < 3.a)
jwt (>= 1.4, < 3.0)
memoist (~> 0.16)
multi_json (~> 1.11)
os (>= 0.9, < 2.0)
signet (>= 0.16, < 2.a)
@ -208,36 +207,35 @@ GEM
i18n (1.12.0)
concurrent-ruby (~> 1.0)
jmespath (1.6.2)
json (2.6.3)
jwt (2.7.0)
memoist (0.16.2)
json (2.7.1)
jwt (2.7.1)
mini_magick (4.12.0)
mini_mime (1.1.2)
mini_mime (1.1.5)
minitest (5.18.0)
molinillo (0.8.0)
multi_json (1.15.0)
multipart-post (2.0.0)
multipart-post (2.3.0)
nanaimo (0.3.0)
nap (1.1.0)
naturally (2.2.1)
netrc (0.11.0)
optparse (0.1.1)
optparse (0.4.0)
os (1.1.4)
plist (3.7.0)
plist (3.7.1)
public_suffix (4.0.7)
rake (13.0.6)
rake (13.1.0)
representable (3.2.0)
declarative (< 0.1.0)
trailblazer-option (>= 0.1.1, < 0.2.0)
uber (< 0.2.0)
retriable (3.1.2)
rexml (3.2.5)
rexml (3.2.6)
rouge (2.0.7)
ruby-macho (2.5.1)
ruby2_keywords (0.0.5)
rubyzip (2.3.2)
security (0.1.3)
signet (0.17.0)
signet (0.18.0)
addressable (~> 2.8)
faraday (>= 0.17.5, < 3.a)
jwt (>= 1.5, < 3.0)
@ -246,25 +244,21 @@ GEM
CFPropertyList
naturally
terminal-notifier (2.0.0)
terminal-table (1.8.0)
unicode-display_width (~> 1.1, >= 1.1.1)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
trailblazer-option (0.1.2)
tty-cursor (0.7.1)
tty-screen (0.8.1)
tty-screen (0.8.2)
tty-spinner (0.9.3)
tty-cursor (~> 0.7)
typhoeus (1.4.0)
typhoeus (1.4.1)
ethon (>= 0.9.0)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
uber (0.1.0)
unf (0.1.4)
unf_ext
unf_ext (0.0.8.2)
unicode-display_width (1.8.0)
webrick (1.8.1)
unicode-display_width (2.5.0)
word_wrap (1.0.0)
xcodeproj (1.22.0)
xcodeproj (1.24.0)
CFPropertyList (>= 2.3.3, < 4.0)
atomos (~> 0.1.3)
claide (>= 1.0.2, < 2.0)
@ -280,12 +274,16 @@ PLATFORMS
arm64-darwin-22
DEPENDENCIES
cocoapods
activesupport (>= 6.1.7.5, < 7.1.0)
cocoapods (>= 1.13, < 1.15)
fastlane
fastlane-plugin-json
fastlane-plugin-sentry
fastlane-plugin-versioning_android
fastlane-plugin-yarn
RUBY VERSION
ruby 3.1.2p20
BUNDLED WITH
2.3.24

View File

@ -1,9 +1,8 @@
apply plugin: "com.android.application"
apply plugin: "org.jetbrains.kotlin.android"
apply plugin: "com.facebook.react"
apply plugin: 'com.google.gms.google-services'
import com.android.build.OutputFile
/**
* This is the configuration block to customize your React Native Android app.
* By default you don't need to apply any configuration, just uncomment the lines you need.
@ -15,8 +14,8 @@ react {
// root = file("../")
// The folder where the react-native NPM package is. Default is ../node_modules/react-native
// reactNativeDir = file("../node_modules/react-native")
// The folder where the react-native Codegen package is. Default is ../node_modules/react-native-codegen
// codegenDir = file("../node_modules/react-native-codegen")
// The folder where the react-native Codegen package is. Default is ../node_modules/@react-native/codegen
// codegenDir = file("../node_modules/@react-native/codegen")
// The cli.js file which is the React Native CLI entrypoint. Default is ../node_modules/react-native/cli.js
// cliFile = file("../node_modules/react-native/cli.js")
/* Variants */
@ -51,14 +50,6 @@ react {
// hermesFlags = ["-O", "-output-source-map"]
}
/**
* Set this to true to create four separate APKs instead of one,
* one for each native architecture. This is useful if you don't
* use App Bundles (https://developer.android.com/guide/app-bundle/)
* and want to have separate APKs to upload to the Play Store.
*/
def enableSeparateBuildPerCPUArchitecture = false
/**
* Set this to true to Run Proguard on Release builds to minify the Java bytecode.
*/
@ -77,20 +68,11 @@ def enableProguardInReleaseBuilds = false
*/
def jscFlavor = 'org.webkit:android-jsc:+'
/**
* Private function to get the list of Native Architectures you want to build.
* This reads the value from reactNativeArchitectures in your gradle.properties
* file and works together with the --active-arch-only flag of react-native run-android.
*/
def reactNativeArchitectures() {
def value = project.getProperties().get("reactNativeArchitectures")
return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
}
android {
ndkVersion rootProject.ext.ndkVersion
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
compileSdk rootProject.ext.compileSdkVersion
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
@ -105,14 +87,6 @@ android {
versionCode 50
versionName "0.2"
}
splits {
abi {
reset()
enable enableSeparateBuildPerCPUArchitecture
universalApk false // If true, also generate a universal APK
include (*reactNativeArchitectures())
}
}
signingConfigs {
debug {
storeFile file('debug.keystore')
@ -133,28 +107,9 @@ android {
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
}
}
// applicationVariants are e.g. debug, release
applicationVariants.all { variant ->
variant.outputs.each { output ->
// For each separate APK per architecture, set a unique version code as described here:
// https://developer.android.com/studio/build/configure-apk-splits.html
def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
def abi = output.getFilter(OutputFile.ABI)
if (abi != null) { // null for the universal-debug, universal-release variants
output.versionCodeOverride =
defaultConfig.versionCode * 1000 + versionCodes.get(abi)
}
}
}
}
dependencies {
implementation ("androidx.lifecycle:lifecycle-runtime-ktx:2.3.0") {
force = true
}
def isGifEnabled = (findProperty('expo.gif.enabled') ?: "") == "true";
def isWebpEnabled = (findProperty('expo.webp.enabled') ?: "") == "true";
def isWebpAnimatedEnabled = (findProperty('expo.webp.animated') ?: "") == "true";
@ -182,13 +137,8 @@ dependencies {
// The version of react-native is set by the React Native Gradle Plugin
implementation("com.facebook.react:react-android")
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.0.0")
debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}")
debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
exclude group:'com.squareup.okhttp3', module:'okhttp'
}
implementation("com.facebook.react:flipper-integration")
debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}")
if (hermesEnabled.toBoolean()) {
implementation("com.facebook.react:hermes-android")
} else {

View File

@ -1,12 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<application
android:usesCleartextTraffic="true"
tools:targetApi="28"
tools:ignore="GoogleAppIndexingWarning">
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" android:exported="false" />
</application>
</manifest>
tools:ignore="GoogleAppIndexingWarning"/>
</manifest>

View File

@ -1,72 +0,0 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* <p>This source code is licensed under the MIT license found in the LICENSE file in the root
* directory of this source tree.
*/
package com.tooot;
import android.content.Context;
import com.facebook.flipper.android.AndroidFlipperClient;
import com.facebook.flipper.android.utils.FlipperUtils;
import com.facebook.flipper.core.FlipperClient;
import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin;
import com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin;
import com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin;
import com.facebook.flipper.plugins.inspector.DescriptorMapping;
import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin;
import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor;
import com.facebook.flipper.plugins.network.NetworkFlipperPlugin;
import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin;
import com.facebook.react.ReactInstanceEventListener;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.modules.network.NetworkingModule;
import okhttp3.OkHttpClient;
/**
* Class responsible of loading Flipper inside your React Native application. This is the debug
* flavor of it. Here you can add your own plugins and customize the Flipper setup.
*/
public class ReactNativeFlipper {
public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) {
if (FlipperUtils.shouldEnableFlipper(context)) {
final FlipperClient client = AndroidFlipperClient.getInstance(context);
client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults()));
client.addPlugin(new DatabasesFlipperPlugin(context));
client.addPlugin(new SharedPreferencesFlipperPlugin(context));
client.addPlugin(CrashReporterPlugin.getInstance());
NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin();
NetworkingModule.setCustomClientBuilder(
new NetworkingModule.CustomClientBuilder() {
@Override
public void apply(OkHttpClient.Builder builder) {
builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin));
}
});
client.addPlugin(networkFlipperPlugin);
client.start();
// Fresco Plugin needs to ensure that ImagePipelineFactory is initialized
// Hence we run if after all native modules have been initialized
ReactContext reactContext = reactInstanceManager.getCurrentReactContext();
if (reactContext == null) {
reactInstanceManager.addReactInstanceEventListener(
new ReactInstanceEventListener() {
@Override
public void onReactContextInitialized(ReactContext reactContext) {
reactInstanceManager.removeReactInstanceEventListener(this);
reactContext.runOnNativeModulesQueueThread(
new Runnable() {
@Override
public void run() {
client.addPlugin(new FrescoFlipperPlugin());
}
});
}
});
} else {
client.addPlugin(new FrescoFlipperPlugin());
}
}
}
}

View File

@ -1,42 +0,0 @@
package com.xmflsct.app.tooot;
import android.os.Bundle;
import com.facebook.react.ReactActivity;
import com.facebook.react.ReactActivityDelegate;
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint;
import com.facebook.react.defaults.DefaultReactActivityDelegate;
import expo.modules.ReactActivityDelegateWrapper;
public class MainActivity extends ReactActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(null);
}
/**
* Returns the name of the main component registered from JavaScript.
* This is used to schedule rendering of the component.
*/
@Override
protected String getMainComponentName() {
return "main";
}
/**
* Returns the instance of the {@link ReactActivityDelegate}. Here we use a util class {@link
* DefaultReactActivityDelegate} which allows you to easily enable Fabric and Concurrent React
* (aka React 18) with two boolean flags.
*/
@Override
protected ReactActivityDelegate createReactActivityDelegate() {
return new DefaultReactActivityDelegate(
this,
getMainComponentName(),
// If you opted-in for the New Architecture, we enable the Fabric Renderer.
DefaultNewArchitectureEntryPoint.getFabricEnabled(), // fabricEnabled
// If you opted-in for the New Architecture, we enable Concurrent React (i.e. React 18).
DefaultNewArchitectureEntryPoint.getConcurrentReactEnabled() // concurrentRootEnabled
);
}
}

View File

@ -0,0 +1,61 @@
package com.xmflsct.app.tooot;
import android.os.Build
import android.os.Bundle
import com.facebook.react.ReactActivity
import com.facebook.react.ReactActivityDelegate
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled
import com.facebook.react.defaults.DefaultReactActivityDelegate
import expo.modules.ReactActivityDelegateWrapper
class MainActivity : ReactActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
// Set the theme to AppTheme BEFORE onCreate to support
// coloring the background, status bar, and navigation bar.
// This is required for expo-splash-screen.
setTheme(R.style.AppTheme);
super.onCreate(null)
}
/**
* Returns the name of the main component registered from JavaScript. This is used to schedule
* rendering of the component.
*/
override fun getMainComponentName(): String = "main"
/**
* Returns the instance of the [ReactActivityDelegate]. We use [DefaultReactActivityDelegate]
* which allows you to enable New Architecture with a single boolean flags [fabricEnabled]
*/
override fun createReactActivityDelegate(): ReactActivityDelegate {
return ReactActivityDelegateWrapper(
this,
BuildConfig.IS_NEW_ARCHITECTURE_ENABLED,
object : DefaultReactActivityDelegate(
this,
mainComponentName,
fabricEnabled
){})
}
/**
* Align the back button behavior with Android S
* where moving root activities to background instead of finishing activities.
* @see <a href="https://developer.android.com/reference/android/app/Activity#onBackPressed()">onBackPressed</a>
*/
override fun invokeDefaultOnBackPressed() {
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) {
if (!moveTaskToBack(false)) {
// For non-root activities, use the default implementation to finish them.
super.invokeDefaultOnBackPressed()
}
return
}
// Use the default back button implementation on Android S
// because it's doing more than [Activity.moveTaskToBack] in fact.
super.invokeDefaultOnBackPressed()
}
}

View File

@ -1,69 +0,0 @@
package com.xmflsct.app.tooot;
import android.app.Application;
import android.content.res.Configuration;
import androidx.annotation.NonNull;
import com.facebook.react.PackageList;
import com.facebook.react.ReactApplication;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint;
import com.facebook.react.defaults.DefaultReactNativeHost;
import com.facebook.soloader.SoLoader;
import expo.modules.ApplicationLifecycleDispatcher;
import expo.modules.ReactNativeHostWrapper;
import java.util.List;
public class MainApplication extends Application implements ReactApplication {
private final ReactNativeHost mReactNativeHost = new ReactNativeHostWrapper(
this,
new DefaultReactNativeHost(this) {
@Override
public boolean getUseDeveloperSupport() {
return BuildConfig.DEBUG;
}
@Override
protected List<ReactPackage> getPackages() {
@SuppressWarnings("UnnecessaryLocalVariable")
List<ReactPackage> packages = new PackageList(this).getPackages();
// Packages that cannot be autolinked yet can be added manually here, for example:
// packages.add(new MyReactNativePackage());
return packages;
}
@Override
protected String getJSMainModuleName() {
return "index";
}
@Override
protected boolean isNewArchEnabled() {
return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED;
}
@Override
protected Boolean isHermesEnabled() {
return BuildConfig.IS_HERMES_ENABLED;
}
});
@Override
public ReactNativeHost getReactNativeHost() {
return mReactNativeHost;
}
@Override
public void onCreate() {
super.onCreate();
SoLoader.init(this, /* native exopackage */ false);
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
// If you opted-in for the New Architecture, we load the native entry point for this app.
DefaultNewArchitectureEntryPoint.load();
}
// ReactNativeFlipper.initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
}
}

View File

@ -0,0 +1,58 @@
package com.xmflsct.app.tooot;
import android.app.Application
import android.content.res.Configuration
import androidx.annotation.NonNull
import com.facebook.react.PackageList
import com.facebook.react.ReactApplication
import com.facebook.react.ReactHost
import com.facebook.react.ReactNativeHost
import com.facebook.react.ReactPackage
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load
import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost
import com.facebook.react.defaults.DefaultReactNativeHost
import com.facebook.react.flipper.ReactNativeFlipper
import com.facebook.soloader.SoLoader
import expo.modules.ApplicationLifecycleDispatcher
import expo.modules.ReactNativeHostWrapper
class MainApplication : Application(), ReactApplication {
override val reactNativeHost: ReactNativeHost = ReactNativeHostWrapper(
this,
object : DefaultReactNativeHost(this) {
override fun getPackages(): List<ReactPackage> {
// Packages that cannot be autolinked yet can be added manually here, for example:
// packages.add(new MyReactNativePackage());
return PackageList(this).packages
}
override fun getJSMainModuleName(): String = "index"
override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG
override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED
override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED
}
)
override val reactHost: ReactHost
get() = getDefaultReactHost(this.applicationContext, reactNativeHost)
override fun onCreate() {
super.onCreate()
SoLoader.init(this, false)
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
// If you opted-in for the New Architecture, we load the native entry point for this app.
load()
}
ApplicationLifecycleDispatcher.onApplicationCreate(this)
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
ApplicationLifecycleDispatcher.onConfigurationChanged(this, newConfig)
}
}

View File

@ -1,20 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* <p>This source code is licensed under the MIT license found in the LICENSE file in the root
* directory of this source tree.
*/
package com.rndiffapp;
import android.content.Context;
import com.facebook.react.ReactInstanceManager;
/**
* Class responsible of loading Flipper inside your React Native application. This is the release
* flavor of it so it's empty as we don't want to load Flipper.
*/
public class ReactNativeFlipper {
public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) {
// Do nothing as we don't want to initialize Flipper on Release.
}
}

View File

@ -1,15 +1,11 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext {
buildToolsVersion = "33.0.0"
buildToolsVersion = "34.0.0"
minSdkVersion = 21
compileSdkVersion = 33
targetSdkVersion = 33
kotlinVersion = '1.8.21'
// We use NDK 23 which has both M1 support and is the side-by-side NDK version from AGP.
ndkVersion = "23.1.7779620"
compileSdkVersion = 34
targetSdkVersion = 34
ndkVersion = "25.1.8937393"
kotlinVersion = '1.8.0'
}
repositories {
google()
@ -17,8 +13,11 @@ buildscript {
jcenter()
}
dependencies {
classpath("com.android.tools.build:gradle:7.4.1")
classpath("com.android.tools.build:gradle")
classpath("com.facebook.react:react-native-gradle-plugin")
classpath 'com.google.gms:google-services:4.3.14'
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin")
}
}
apply plugin: "com.facebook.react.rootproject"

View File

@ -25,9 +25,6 @@ android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true
# Version of flipper SDK to use with React Native
FLIPPER_VERSION=0.176.1
# Use this property to specify which architecture you want to build.
# You can also override it from the CLI using
# ./gradlew <task> -PreactNativeArchitectures=x86_64
@ -43,10 +40,10 @@ newArchEnabled=false
# If set to false, you will be using JSC instead.
hermesEnabled=true
org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=4096m -XX:+HeapDumpOnOutOfMemoryError
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.configureondemand=true
org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m
# org.gradle.daemon=true
# org.gradle.parallel=true
# org.gradle.configureondemand=true
# The hosted JavaScript engine
# Supported values: expo.jsEngine = "hermes" | "jsc"

Binary file not shown.

View File

@ -1,5 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

81
android/gradlew vendored
View File

@ -1,7 +1,7 @@
#!/bin/sh
#
# Copyright 2015 the original author or authors.
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@ -17,14 +17,56 @@
#
##############################################################################
##
## Gradle start up script for UN*X
##
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
@ -37,13 +79,11 @@ do
*) app_path=$APP_HOME$link ;;
esac
done
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_NAME="Gradle"
APP_BASE_NAME=${0##*/}
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
@ -73,6 +113,7 @@ esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
@ -89,22 +130,29 @@ location of your Java installation."
fi
else
JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
fi
# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
@ -122,7 +170,9 @@ fi
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
@ -147,16 +197,27 @@ if "$cygwin" || "$msys" ; then
done
fi
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
fi
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
@ -183,4 +244,4 @@ eval "set -- $(
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"
exec "$JAVACMD" "$@"

17
android/gradlew.bat vendored
View File

@ -14,7 +14,7 @@
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@ -25,7 +25,7 @@
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
if "%DIRNAME%"=="" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
if %ERRORLEVEL% equ 0 goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@ -69,20 +69,23 @@ goto fail
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
set EXIT_CODE=%ERRORLEVEL%
if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
:omega

View File

@ -1,11 +1,10 @@
rootProject.name = 'tooot'
apply from: new File(["node", "--print", "require.resolve('expo/package.json')"].execute().text.trim(), "../scripts/autolinking.gradle");
apply from: new File(["node", "--print", "require.resolve('expo/package.json')"].execute(null, rootDir).text.trim(), "../scripts/autolinking.gradle");
useExpoModules()
apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json')"].execute().text.trim(), "../native_modules.gradle");
apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json')"].execute(null, rootDir).text.trim(), "../native_modules.gradle");
applyNativeModulesSettingsGradle(settings)
include ':app'
includeBuild('../node_modules/react-native-gradle-plugin')
includeBuild(new File(["node", "--print", "require.resolve('@react-native/gradle-plugin/package.json')"].execute(null, rootDir).text.trim()).getParentFile())

View File

@ -1,26 +1,27 @@
module.exports = function (api) {
api.cache(false)
const plugins = [
'@babel/plugin-proposal-optional-chaining',
[
'module-resolver',
{
root: ['./'],
alias: {
'@components': './src/components',
'@i18n': './src/i18n',
'@screens': './src/screens',
'@utils': './src/utils'
return {
presets: ['babel-preset-expo'],
plugins: [
'@babel/plugin-proposal-optional-chaining',
[
'module-resolver',
{
root: ['./'],
alias: {
'@components': './src/components',
'@i18n': './src/i18n',
'@screens': './src/screens',
'@utils': './src/utils'
}
}
}
],
'react-native-reanimated/plugin'
]
if (process.env.NODE_ENV === 'production' || process.env.BABEL_ENV === 'production') {
plugins.push('transform-remove-console')
]
].concat(
process.env.NODE_ENV === 'production' || process.env.BABEL_ENV === 'production'
? ['transform-remove-console']
: [],
['react-native-reanimated/plugin']
)
}
return { presets: ['babel-preset-expo'], plugins }
}

View File

@ -1,2 +1 @@
Enjoy toooting! This version includes following improvements and fixes:
- Fixed functionality version check (e.g. cannot edit own toots)
Enjoy toooting! This version includes improvements and fixes.

View File

@ -1,2 +1 @@
tooot-ing愉快此版本包括以下改进和修复
- 修复版本功能检查(如无法编辑嘟文)
tooot-ing愉快此版本包括改进和修复。

View File

@ -1,8 +1,13 @@
require File.join(File.dirname(`node --print "require.resolve('expo/package.json')"`), "scripts/autolinking")
require File.join(File.dirname(`node --print "require.resolve('react-native/package.json')"`), "scripts/react_native_pods")
require File.join(File.dirname(`node --print "require.resolve('@react-native-community/cli-platform-ios/package.json')"`), "native_modules")
platform :ios, '13.0'
# Resolve react_native_pods.rb with node to allow for hoisting
require Pod::Executable.execute_command('node', ['-p',
'require.resolve(
"react-native/scripts/react_native_pods.rb",
{paths: [process.argv[1]]},
)', __dir__]).strip
platform :ios, '13.4'
prepare_react_native_project!
flipper_config = ENV['NO_FLIPPER'] == "1" ? FlipperConfiguration.disabled : FlipperConfiguration.enabled
linkage = ENV['USE_FRAMEWORKS']
@ -18,13 +23,8 @@ target 'tooot' do
use_expo_modules!
config = use_native_modules!
# Flags change depending on the env values.
flags = get_default_flags()
use_react_native!(
:path => config[:reactNativePath],
:hermes_enabled => true,
:fabric_enabled => flags[:fabric_enabled],
:flipper_configuration => FlipperConfiguration.disabled,
# An absolute path to your application root.
:app_path => "#{Pod::Config.instance.installation_root}/.."
@ -33,11 +33,9 @@ target 'tooot' do
post_install do |installer|
react_native_post_install(
installer,
# Set `mac_catalyst_enabled` to `true` in order to apply patches
# necessary for Mac Catalyst builds
config[:reactNativePath],
:mac_catalyst_enabled => false
)
__apply_Xcode_12_5_M1_post_install_workaround(installer)
# For share extension
installer.pods_project.targets.each do |target|
@ -45,15 +43,6 @@ 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|
@ -67,7 +56,6 @@ end
target 'ShareExtension' do
use_react_native!(
:hermes_enabled => true,
:flipper_configuration => FlipperConfiguration.disabled
)

File diff suppressed because it is too large Load Diff

View File

@ -225,6 +225,7 @@
buildPhases = (
08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */,
FD10A7F022414F080027D42C /* Start Packager */,
395686AEA3960C8699AE1CAD /* [Expo] Configure project */,
13B07F871A680F5B00A75B9A /* Sources */,
13B07F8C1A680F5B00A75B9A /* Frameworks */,
13B07F8E1A680F5B00A75B9A /* Resources */,
@ -385,6 +386,25 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
395686AEA3960C8699AE1CAD /* [Expo] Configure project */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "[Expo] Configure project";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-tooot/expo-configure-project.sh\"\n";
};
49D30A53634620EF2A5C6692 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
@ -411,12 +431,14 @@
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-tooot/Pods-tooot-resources.sh",
"${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/EXConstants.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/RCTI18nStrings.bundle",
"${PODS_ROOT}/Sentry/Sources/Resources/PrivacyInfo.xcprivacy",
);
name = "[CP] Copy Pods Resources";
outputPaths = (
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXConstants.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCTI18nStrings.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/PrivacyInfo.xcprivacy",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
@ -452,11 +474,11 @@
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-ShareExtension/Pods-ShareExtension-resources.sh",
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/RCTI18nStrings.bundle",
);
name = "[CP] Copy Pods Resources";
outputPaths = (
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCTI18nStrings.bundle",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
@ -574,7 +596,7 @@
);
INFOPLIST_FILE = tooot/Info.plist;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@ -589,8 +611,8 @@
PRODUCT_NAME = tooot;
PROVISIONING_PROFILE_SPECIFIER = "match AdHoc com.xmflsct.app.tooot";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = YES;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES;
SWIFT_OBJC_BRIDGING_HEADER = "tooot-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_PRECOMPILE_BRIDGING_HEADER = YES;
@ -614,7 +636,7 @@
"ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES;
INFOPLIST_FILE = tooot/Info.plist;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@ -629,8 +651,8 @@
PRODUCT_NAME = tooot;
PROVISIONING_PROFILE_SPECIFIER = "match AppStore com.xmflsct.app.tooot";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = YES;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES;
SWIFT_OBJC_BRIDGING_HEADER = "tooot-Bridging-Header.h";
SWIFT_PRECOMPILE_BRIDGING_HEADER = YES;
SWIFT_VERSION = 5.0;
@ -644,7 +666,7 @@
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "c++17";
CLANG_CXX_LANGUAGE_STANDARD = "c++20";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
@ -681,6 +703,7 @@
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION,
);
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@ -697,8 +720,12 @@
LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"\"";
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = "$(inherited)";
OTHER_CPLUSPLUSFLAGS = "$(inherited)";
OTHER_LDFLAGS = "$(inherited)";
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
USE_HERMES = true;
};
name = Debug;
};
@ -707,7 +734,7 @@
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "c++17";
CLANG_CXX_LANGUAGE_STANDARD = "c++20";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
@ -739,6 +766,10 @@
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_PREPROCESSOR_DEFINITIONS = (
"$(inherited)",
_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION,
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
@ -753,9 +784,13 @@
LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"\"";
MTL_ENABLE_DEBUG_INFO = NO;
ONLY_ACTIVE_ARCH = NO;
OTHER_CFLAGS = "$(inherited)";
OTHER_CPLUSPLUSFLAGS = "$(inherited)";
OTHER_LDFLAGS = "$(inherited)";
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
USE_HERMES = true;
VALIDATE_PRODUCT = YES;
};
name = Release;
@ -782,8 +817,7 @@
INFOPLIST_FILE = ShareExtension/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = ShareExtension;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
"IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.2;
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@ -798,7 +832,8 @@
PROVISIONING_PROFILE_SPECIFIER = "match AdHoc com.xmflsct.app.tooot.ShareExtension";
"PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "match AdHoc com.xmflsct.app.tooot.ShareExtension";
SKIP_INSTALL = YES;
SUPPORTS_MACCATALYST = YES;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OBJC_BRIDGING_HEADER = "ShareExtension/ShareExtension-Bridging-Header.h";
@ -832,8 +867,7 @@
INFOPLIST_FILE = ShareExtension/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = ShareExtension;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
"IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.2;
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@ -847,7 +881,8 @@
PROVISIONING_PROFILE_SPECIFIER = "match AppStore com.xmflsct.app.tooot.ShareExtension";
"PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "match AppStore com.xmflsct.app.tooot.ShareExtension";
SKIP_INSTALL = YES;
SUPPORTS_MACCATALYST = YES;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OBJC_BRIDGING_HEADER = "ShareExtension/ShareExtension-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-O";

View File

@ -14,6 +14,10 @@
}
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
return [self getBundleURL];
}
- (NSURL *)getBundleURL
{
#if DEBUG
return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"];
@ -22,16 +26,6 @@
#endif
}
/// This method controls whether the `concurrentRoot`feature of React18 is turned on or off.
///
/// @see: https://reactjs.org/blog/2022/03/29/react-v18.html
/// @note: This requires to be rendering on Fabric (i.e. on the New Architecture).
/// @return: `true` if the `concurrentRoot` feature is enabled. Otherwise, it returns `false`.
- (BOOL)concurrentRootEnabled
{
return true;
}
// Linking API
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
NSString *urlString = url.absoluteString;

View File

@ -49,14 +49,11 @@
<true/>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>localhost</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
<!-- Do not change NSAllowsArbitraryLoads to true, or you will risk app rejection! -->
<key>NSAllowsArbitraryLoads</key>
<false/>
<key>NSAllowsLocalNetworking</key>
<true/>
</dict>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>

View File

@ -1,3 +1,11 @@
module.exports = {
transformer: { inlineRequires: true }
}
const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config')
/**
* Metro configuration
* https://facebook.github.io/metro/docs/configuration
*
* @type {import('metro-config').MetroConfig}
*/
const config = {};
module.exports = mergeConfig(getDefaultConfig(__dirname), config)

View File

@ -1,6 +1,6 @@
{
"name": "tooot",
"version": "4.9.6",
"version": "4.11.0",
"description": "tooot for Mastodon",
"author": "xmflsct <me@xmflsct.com>",
"license": "GPL-3.0-or-later",
@ -12,109 +12,110 @@
"start": "react-native start",
"android": "react-native run-android",
"phone": "react-native run-ios --device",
"iphone": "react-native run-ios --simulator 'iPhone 14 Pro'",
"iphone": "react-native run-ios --simulator 'iPhone 15 Pro'",
"ipad": "react-native run-ios --simulator 'iPad Pro (11-inch) (4th generation)'",
"app:build": "bundle exec fastlane",
"clean": "react-native-clean-project"
},
"dependencies": {
"@expo/react-native-action-sheet": "^4.0.1",
"@formatjs/intl-datetimeformat": "^6.8.0",
"@formatjs/intl-getcanonicallocales": "^2.2.0",
"@formatjs/intl-locale": "^3.3.0",
"@formatjs/intl-numberformat": "^8.5.0",
"@formatjs/intl-pluralrules": "^5.2.2",
"@formatjs/intl-relativetimeformat": "^11.2.2",
"@mattermost/react-native-paste-input": "^0.6.2",
"@formatjs/intl-datetimeformat": "^6.12.2",
"@formatjs/intl-getcanonicallocales": "^2.3.0",
"@formatjs/intl-locale": "^3.4.5",
"@formatjs/intl-numberformat": "^8.10.0",
"@formatjs/intl-pluralrules": "^5.2.12",
"@formatjs/intl-relativetimeformat": "^11.2.12",
"@mattermost/react-native-paste-input": "^0.7.0",
"@neverdull-agency/expo-unlimited-secure-store": "^1.0.10",
"@react-native-async-storage/async-storage": "~1.17.11",
"@react-native-camera-roll/camera-roll": "^5.4.0",
"@react-native-clipboard/clipboard": "^1.11.2",
"@react-native-community/blur": "^4.3.2",
"@react-native-community/netinfo": "9.3.10",
"@react-native-firebase/app": "^17.5.0",
"@react-native-menu/menu": "^0.7.3",
"@react-native-segmented-control/segmented-control": "^2.4.1",
"@react-navigation/bottom-tabs": "^6.5.7",
"@react-navigation/native": "^6.1.6",
"@react-navigation/native-stack": "^6.9.12",
"@react-navigation/stack": "^6.3.16",
"@sentry/react-native": "5.5.0",
"@sharcoux/slider": "^6.1.2",
"@tanstack/react-query": "^4.29.7",
"axios": "^1.4.0",
"@react-native-async-storage/async-storage": "~1.21.0",
"@react-native-camera-roll/camera-roll": "^7.4.0",
"@react-native-clipboard/clipboard": "^1.13.2",
"@react-native-community/blur": "^4.4.0",
"@react-native-community/netinfo": "^11.2.1",
"@react-native-firebase/app": "^18.8.0",
"@react-native-menu/menu": "^0.9.1",
"@react-native-segmented-control/segmented-control": "^2.5.0",
"@react-navigation/bottom-tabs": "^6.5.11",
"@react-navigation/native": "^6.1.9",
"@react-navigation/native-stack": "^6.9.17",
"@react-navigation/stack": "^6.3.20",
"@sentry/react-native": "^5.18.0",
"@sharcoux/slider": "^7.1.1",
"@tanstack/react-query": "^4.36.1",
"axios": "^1.6.7",
"diff": "^5.1.0",
"expo": "48.0.17",
"expo-auth-session": "^4.1.0",
"expo-av": "^13.3.0",
"expo-constants": "^14.3.0",
"expo-crypto": "^12.3.0",
"expo-file-system": "^15.3.0",
"expo-haptics": "^12.3.0",
"expo-image": "^1.2.3",
"expo-linking": "^4.1.0",
"expo-localization": "^14.2.0",
"expo-notifications": "^0.18.1",
"expo-screen-capture": "5.1.1",
"expo-screen-orientation": "^5.2.0",
"expo-secure-store": "^12.1.1",
"expo-splash-screen": "^0.18.2",
"expo-store-review": "^6.3.0",
"expo-video-thumbnails": "^7.3.0",
"expo-web-browser": "~12.1.1",
"htmlparser2": "^9.0.0",
"i18next": "^22.5.0",
"linkify-it": "^4.0.1",
"expo": "^50.0.6",
"expo-auth-session": "^5.4.0",
"expo-av": "^13.10.5",
"expo-constants": "^15.4.5",
"expo-crypto": "^12.8.0",
"expo-file-system": "^16.0.6",
"expo-haptics": "^12.8.1",
"expo-image": "^1.11.0",
"expo-linking": "^6.2.2",
"expo-localization": "^14.8.3",
"expo-notifications": "^0.27.6",
"expo-screen-capture": "^5.8.1",
"expo-screen-orientation": "^6.4.1",
"expo-secure-store": "^12.8.1",
"expo-splash-screen": "^0.26.4",
"expo-store-review": "^6.8.3",
"expo-video-thumbnails": "^7.9.0",
"expo-web-browser": "^12.8.2",
"htmlparser2": "^9.1.0",
"i18next": "^23.8.2",
"linkify-it": "^5.0.0",
"lodash": "^4.17.21",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-i18next": "^12.3.1",
"react-intl": "^6.4.2",
"react-native": "^0.71.8",
"react-native-flash-message": "^0.4.1",
"react-native-gesture-handler": "~2.10.1",
"react-native-image-picker": "^5.3.1",
"react-native-ios-context-menu": "^1.15.3",
"react-i18next": "^14.0.5",
"react-intl": "^6.6.2",
"react-native": "^0.73.4",
"react-native-flash-message": "^0.4.2",
"react-native-gesture-handler": "^2.15.0",
"react-native-image-picker": "^7.1.0",
"react-native-ios-context-menu": "^2.3.2",
"react-native-ios-utilities": "^4.3.0",
"react-native-language-detection": "^0.2.2",
"react-native-mmkv": "~2.8.0",
"react-native-pager-view": "^6.2.0",
"react-native-quick-base64": "^2.0.6",
"react-native-reanimated": "^3.1.0",
"react-native-mmkv": "^2.11.0",
"react-native-pager-view": "^6.2.3",
"react-native-quick-base64": "^2.0.8",
"react-native-reanimated": "^3.6.2",
"react-native-reanimated-zoom": "^0.3.3",
"react-native-safe-area-context": "^4.5.3",
"react-native-screens": "^3.20.0",
"react-native-safe-area-context": "^4.9.0",
"react-native-screens": "^3.29.0",
"react-native-share-menu": "^6.0.0",
"react-native-svg": "^13.9.0",
"react-native-svg": "^14.1.0",
"react-native-swipe-list-view": "^3.2.9",
"react-native-tab-view": "^3.5.1",
"react-native-tab-view": "^3.5.2",
"rn-placeholder": "^3.0.3",
"zeego": "^1.6.1"
"zeego": "^1.7.2"
},
"devDependencies": {
"@babel/core": "^7.21.8",
"@babel/core": "^7.23.9",
"@babel/plugin-proposal-optional-chaining": "^7.21.0",
"@babel/preset-typescript": "^7.21.5",
"@expo/config": "^8.0.4",
"@types/diff": "^5.0.3",
"@types/linkify-it": "^3.0.2",
"@types/lodash": "^4.14.194",
"@types/react": "^18.2.6",
"@types/react-dom": "^18.2.4",
"@types/react-native-share-menu": "^5.0.2",
"@babel/preset-typescript": "^7.23.3",
"@expo/config": "^8.5.4",
"@react-native/metro-config": "^0.73.5",
"@react-native/typescript-config": "^0.74.0",
"@types/diff": "^5.0.9",
"@types/linkify-it": "^3.0.5",
"@types/lodash": "^4.14.202",
"@types/react": "^18.2.55",
"@types/react-dom": "^18.2.18",
"@types/react-native-share-menu": "^5.0.5",
"babel-plugin-module-resolver": "^5.0.0",
"babel-plugin-transform-remove-console": "^6.9.4",
"chalk": "^4.1.2",
"deprecated-react-native-prop-types": "^4.1.0",
"dotenv": "^16.0.3",
"react-native-clean-project": "^4.0.1",
"typescript": "^5.0.4"
"dotenv": "^16.4.1",
"react-native-clean-project": "^4.0.3",
"typescript": "^5.3.3"
},
"packageManager": "yarn@3.3.1",
"packageManager": "yarn@4.1.0",
"resolutions": {
"expo-av@^13.0.2": "patch:expo-av@npm%3A13.0.2#./.yarn/patches/expo-av-npm-13.0.2-7a651776f1.patch",
"react-native-share-menu@^6.0.0": "patch:react-native-share-menu@npm%3A6.0.0#./.yarn/patches/react-native-share-menu-npm-6.0.0-f1094c3204.patch",
"@types/react-native-share-menu@^5.0.2": "patch:@types/react-native-share-menu@npm%3A5.0.2#./.yarn/patches/@types-react-native-share-menu-npm-5.0.2-373df17ecc.patch",
"react-native-ios-context-menu@^1.15.1": "patch:react-native-ios-context-menu@npm%3A1.15.1#./.yarn/patches/react-native-ios-context-menu-npm-1.15.1-0034bfa5ba.patch",
"react-native-ios-context-menu@^2.3.2": "patch:react-native-ios-context-menu@npm%3A2.3.2#~/.yarn/patches/react-native-ios-context-menu-npm-2.3.2-9099ed7858.patch",
"react-native-reanimated-zoom@^0.3.3": "patch:react-native-reanimated-zoom@npm%3A0.3.3#./.yarn/patches/react-native-reanimated-zoom-npm-0.3.3-bbb8d84109.patch"
}
}

View File

@ -1,5 +1,6 @@
import Icon, { IconName } from '@components/Icon'
import CustomText from '@components/Text'
import { useNavigation } from '@react-navigation/native'
import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager'
import React from 'react'
@ -9,7 +10,7 @@ export type Props = {
native?: boolean
background?: boolean
onPress: () => void
onPress?: () => void
} & ({ type?: undefined; content?: IconName } | { type: 'text'; content: string })
const HeaderLeft: React.FC<Props> = ({
@ -19,6 +20,7 @@ const HeaderLeft: React.FC<Props> = ({
background = false,
onPress
}) => {
const navigation = useNavigation()
const { colors } = useTheme()
const children = () => {
@ -40,7 +42,7 @@ const HeaderLeft: React.FC<Props> = ({
return (
<Pressable
onPress={onPress}
onPress={onPress ? onPress : () => navigation.goBack()}
children={children()}
style={{
flexDirection: 'row',

View File

@ -17,6 +17,7 @@ export type Props = {
loading?: boolean
disabled?: boolean
destructive?: boolean
destructiveColor?: string
onPress: () => void
} & ({ type?: undefined; content: IconName } | { type: 'text'; content: string })
@ -34,6 +35,7 @@ const HeaderRight: React.FC<Props> = ({
loading,
disabled,
destructive = false,
destructiveColor,
onPress
}) => {
const { colors } = useTheme()
@ -57,7 +59,7 @@ const HeaderRight: React.FC<Props> = ({
color: disabled
? colors.secondary
: destructive
? colors.red
? destructiveColor || colors.red
: colors.primaryDefault,
opacity: loading ? 0 : 1
}}

View File

@ -1,18 +1,18 @@
import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager'
import { StyleConstants } from '@utils/styles/constants'
import React from 'react'
import { Pressable, View } from 'react-native'
import haptics from './haptics'
import Icon from './Icon'
import { ParseEmojis } from './Parse'
import CustomText from './Text'
import haptics from './haptics'
export interface Props {
title?: string
multiple?: boolean
options: { selected: boolean; content: string }[]
setOptions: React.Dispatch<React.SetStateAction<{ selected: boolean; content: string }[]>>
setOptions: React.Dispatch<React.SetStateAction<any>>
disabled?: boolean
invalid?: boolean
}

View File

@ -22,7 +22,7 @@ const ComponentSeparator: React.FC<Props> = ({
style,
{
backgroundColor: colors.backgroundDefault,
borderTopColor: colors.border,
borderTopColor: colors.separator,
borderTopWidth: 1,
marginLeft: StyleConstants.Spacing.Global.PagePadding + extraMarginLeft,
marginRight: StyleConstants.Spacing.Global.PagePadding + extraMarginRight

View File

@ -1,33 +1,32 @@
import GracefullyImage from '@components/GracefullyImage'
import openLink from '@components/openLink'
import CustomText from '@components/Text'
import openLink from '@components/openLink'
import { useNeodbQuery } from '@utils/queryHooks/neodb'
import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager'
import { StyleConstants } from '@utils/styles/constants'
import * as Linking from 'expo-linking'
import { useState } from 'react'
import { useContext, useState } from 'react'
import { Pressable, View } from 'react-native'
import StatusContext from '../Context'
import { Rating } from './Rating'
export type Props = {
card: Mastodon.Card
}
export const CardNeodb: React.FC<Props> = ({ card }) => {
export const CardNeodb: React.FC = () => {
const { status } = useContext(StatusContext)
const { colors } = useTheme()
const segments = Linking.parse(card.url).path?.split('/')
if (!segments || !['movie', 'book', 'tv', 'game', 'album', 'podcast'].includes(segments[0]))
const path = Linking.parse(status?.card?.url || '').path
if (!path) return null
const segments = path?.split('/')
if (
!segments ||
!['movie', 'book', 'tv', 'game', 'album', 'podcast', 'performance'].includes(segments[0])
)
return null
const [headingLines, setHeadingLines] = useState(3)
const [headingLines, setHeadingLines] = useState<number>()
const { data } = useNeodbQuery({
path:
segments[0] === 'tv' && segments[1] === 'season'
? `${segments[0]}${segments[1]}/${segments[2]}`
: `${segments[0]}/${segments[1]}`
})
const { data } = useNeodbQuery({ path })
if (!data) return null
@ -40,11 +39,17 @@ export const CardNeodb: React.FC<Props> = ({ card }) => {
padding: StyleConstants.Spacing.S,
flexDirection: 'row'
}}
onPress={() => openLink(card.url)}
onPress={() => status?.card?.url && openLink(status.card.url)}
>
{data.cover_image_url ? (
<GracefullyImage
sources={{ default: { uri: data.cover_image_url } }}
sources={{
default: {
uri: data.cover_image_url.startsWith('/')
? `https://neodb.social${data.cover_image_url}`
: data.cover_image_url
}
}}
dimension={{
width: StyleConstants.Font.LineHeight.M * 4,
height: StyleConstants.Font.LineHeight.M * 5
@ -61,7 +66,9 @@ export const CardNeodb: React.FC<Props> = ({ card }) => {
fontWeight='Bold'
style={{ color: colors.primaryDefault }}
numberOfLines={3}
onTextLayout={({ nativeEvent }) => setHeadingLines(nativeEvent.lines.length)}
onTextLayout={({ nativeEvent }) =>
!headingLines && setHeadingLines(nativeEvent.lines.length)
}
children={heading.filter(d => d).join(' ')}
/>
<Rating rating={data.rating / 2} />
@ -70,7 +77,7 @@ export const CardNeodb: React.FC<Props> = ({ card }) => {
<CustomText
fontStyle='S'
style={{ color: colors.secondary }}
numberOfLines={4 - headingLines}
numberOfLines={4 - (headingLines || 3)}
children={details.filter(d => d).join(' / ')}
/>
</View>
@ -162,6 +169,27 @@ export const CardNeodb: React.FC<Props> = ({ card }) => {
return (
<Content heading={[data.title]} details={[data.hosts.join(' '), data.genre.join(' ')]} />
)
case 'performance':
if (segments[1] === 'production') {
return (
<Content
heading={[data.display_title]}
details={[
data.opening_date,
data.director.join(' '),
data.playwright.join(' '),
data.composer.join(' ')
]}
/>
)
} else {
return (
<Content
heading={[data.title, data.orig_title]}
details={[data.genre.join(' '), data.playwright.join(' '), data.director.join(' ')]}
/>
)
}
default:
return null
}

View File

@ -1,7 +1,7 @@
import ComponentAccount from '@components/Account'
import GracefullyImage from '@components/GracefullyImage'
import openLink from '@components/openLink'
import CustomText from '@components/Text'
import openLink from '@components/openLink'
import { useNavigation } from '@react-navigation/native'
import { StackNavigationProp } from '@react-navigation/stack'
import { isDevelopment } from '@utils/helpers/checkEnvironment'
@ -9,8 +9,8 @@ import { urlMatcher } from '@utils/helpers/urlMatcher'
import { TabLocalStackParamList } from '@utils/navigation/navigators'
import { useAccountQuery } from '@utils/queryHooks/account'
import { useStatusQuery } from '@utils/queryHooks/status'
import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager'
import { StyleConstants } from '@utils/styles/constants'
import React, { useContext, useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { Pressable, View } from 'react-native'
@ -32,7 +32,7 @@ const TimelineCard: React.FC = () => {
i18n.language.toLowerCase().startsWith('zh-hans')) ||
isDevelopment
) {
return <CardNeodb card={status.card} />
return <CardNeodb />
}
const { colors } = useTheme()

View File

@ -36,6 +36,7 @@ const TimelineContent: React.FC<Props> = ({ notificationOwnToot = false, setSpoi
adaptiveSize
numberOfLines={999}
color={suppressSpoiler ? colors.disabled : undefined}
selectable
/>
{inThread ? (
<CustomText
@ -62,6 +63,7 @@ const TimelineContent: React.FC<Props> = ({ notificationOwnToot = false, setSpoi
}
expandHint={t('shared.content.expandHint')}
setSpoilerExpanded={setSpoilerExpanded}
selectable
/>
</>
) : (
@ -70,6 +72,7 @@ const TimelineContent: React.FC<Props> = ({ notificationOwnToot = false, setSpoi
size={highlighted ? 'L' : 'M'}
adaptiveSize
numberOfLines={highlighted || inThread ? 999 : notificationOwnToot ? 2 : undefined}
selectable
/>
)}
</View>

View File

@ -1,3 +1,4 @@
import Icon from '@components/Icon'
import ComponentSeparator from '@components/Separator'
import CustomText from '@components/Text'
import TimelineDefault from '@components/Timeline/Default'
@ -10,12 +11,20 @@ import {
setAccountStorage,
useGlobalStorageListener
} from '@utils/storage/actions'
import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager'
import { StyleConstants } from '@utils/styles/constants'
import { throttle } from 'lodash'
import React, { RefObject, useCallback, useEffect, useRef, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { FlatList, FlatListProps, Platform, RefreshControl } from 'react-native'
import {
FlatList,
FlatListProps,
Platform,
Pressable,
RefreshControl,
StyleProp,
ViewStyle
} from 'react-native'
import Animated, {
Easing,
runOnJS,
@ -127,6 +136,27 @@ const Timeline: React.FC<Props> = ({
transform: [{ translateY: fetchedNoticeTop.value }]
}))
const refetchedNoticeBottom = useDerivedValue(() => {
if (firstLoad.value) {
return withSequence(
withTiming(0),
withDelay(
3000,
withTiming(fetchedNoticeHeight.value + 32, { easing: Easing.out(Easing.ease) })
)
)
} else {
return fetchedNoticeHeight.value + 32
}
}, [])
const refetchedNoticeAnimate = useAnimatedStyle(() => ({
transform: [
{
translateY: refetchedNoticeBottom.value
}
]
}))
const scrollY = useSharedValue(0)
const fetchingType = useSharedValue<0 | 1 | 2>(0)
@ -169,10 +199,9 @@ const Timeline: React.FC<Props> = ({
throttle(() => {
if (readMarker) {
const currentMarker = getAccountStorage.string(readMarker) || '0'
// setAccountStorage([{ key: readMarker, value: '108425743226508521' }])
if (latestMarker.current > currentMarker) {
setAccountStorage([{ key: readMarker, value: latestMarker.current }])
} else {
// setAccountStorage([{ key: readMarker, value: '105250709762254246' }])
}
}
}, 1000 * 15),
@ -242,6 +271,18 @@ const Timeline: React.FC<Props> = ({
flRef.current?.scrollToOffset({ offset: 0, animated: false })
)
const noticeDefaults: StyleProp<Animated.AnimateStyle<StyleProp<ViewStyle>>> = {
position: 'absolute',
alignSelf: 'center',
borderRadius: 99,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: colors.backgroundDefault,
shadowColor: colors.primaryDefault,
shadowOffset: { width: 0, height: 0 },
shadowOpacity: theme === 'light' ? 0.16 : 0.24
}
return (
<>
<TimelineRefresh
@ -286,42 +327,78 @@ const Timeline: React.FC<Props> = ({
{...customProps}
/>
{!disableRefresh ? (
<Animated.View
style={[
{
position: 'absolute',
alignSelf: 'center',
top: -fetchedNoticeHeight.value - 16,
paddingVertical: StyleConstants.Spacing.S,
paddingHorizontal: StyleConstants.Spacing.M,
backgroundColor: colors.backgroundDefault,
shadowColor: colors.primaryDefault,
shadowOffset: { width: 0, height: 0 },
shadowOpacity: theme === 'light' ? 0.16 : 0.24,
borderRadius: 99,
justifyContent: 'center',
alignItems: 'center'
},
fetchedNoticeAnimate
]}
onLayout={({
nativeEvent: {
layout: { height }
}
}) => (fetchedNoticeHeight.value = height)}
>
<CustomText
fontStyle='S'
style={{ color: colors.primaryDefault }}
children={
fetchedCount !== null
? fetchedCount > 0
? t('refresh.fetched.found', { count: fetchedCount })
: t('refresh.fetched.none')
: t('refresh.fetching')
}
/>
</Animated.View>
<>
<Animated.View
style={[
{
top: -fetchedNoticeHeight.value - 16,
paddingVertical: StyleConstants.Spacing.S,
paddingHorizontal: StyleConstants.Spacing.M,
...noticeDefaults
},
fetchedNoticeAnimate
]}
onLayout={({
nativeEvent: {
layout: { height }
}
}) => (fetchedNoticeHeight.value = height)}
>
<CustomText
fontStyle='S'
style={{ color: colors.primaryDefault }}
children={
fetchedCount !== null
? fetchedCount > 0
? t('refresh.fetched.found', { count: fetchedCount })
: t('refresh.fetched.none')
: t('refresh.fetching')
}
/>
</Animated.View>
{readMarker ? (
<Animated.View
style={[
{
bottom: 16,
borderColor: colors.primaryDefault,
borderWidth: 0.5,
...noticeDefaults
},
refetchedNoticeAnimate
]}
>
<Pressable
style={{
flexDirection: 'row',
alignItems: 'center',
gap: StyleConstants.Spacing.S,
paddingVertical: StyleConstants.Spacing.S,
paddingHorizontal: StyleConstants.Spacing.M
}}
onPress={async () => {
if (readMarker) {
setAccountStorage([{ key: readMarker, value: undefined }])
}
flRef.current?.scrollToOffset({ offset: 0 })
await refetch()
}}
>
<CustomText
fontStyle='M'
style={{ color: colors.primaryDefault }}
children={t('refresh.refetch')}
/>
<Icon
name='log-in'
color={colors.primaryDefault}
size={StyleConstants.Font.Size.M}
style={{ transform: [{ rotate: '-90deg' }] }}
/>
</Pressable>
</Animated.View>
) : null}
</>
) : null}
</>
)

View File

@ -4,6 +4,7 @@ import { useNavigation } from '@react-navigation/native'
import { NativeStackNavigationProp } from '@react-navigation/native-stack'
import { useQueryClient } from '@tanstack/react-query'
import apiInstance from '@utils/api/instance'
import { featureCheck } from '@utils/helpers/featureCheck'
import { checkIsMyAccount } from '@utils/helpers/isMyAccount'
import { TabSharedStackParamList, useNavState } from '@utils/navigation/navigators'
import { useAccountQuery } from '@utils/queryHooks/account'
@ -203,13 +204,22 @@ const menuAccount = ({
type: 'item',
key: 'account-mute',
props: {
onSelect: () =>
actualAccount &&
timelineMutation.mutate({
type: 'updateAccountProperty',
id: actualAccount.id,
payload: { property: 'mute', currentValue: data?.muting }
}),
onSelect: () => {
if (actualAccount) {
if (data?.muting !== true) {
if (featureCheck('mute_duration')) {
navigation.navigate('Tab-Shared-Mute', { account: actualAccount })
return
}
}
timelineMutation.mutate({
type: 'updateAccountProperty',
id: actualAccount.id,
payload: { property: 'mute', currentValue: data?.muting }
})
}
},
disabled: Platform.OS !== 'android' ? !data || !isFetched : false,
destructive: false,
hidden: false

View File

@ -390,8 +390,8 @@
"accessibilityHint": "Вы можаце ігнараваць, блакіраваць або абагуліць гэтага карыстальніка"
},
"followed_by": " падпісаны на вас",
"privateNote": "",
"moved": "",
"privateNote": "Задаць прыватную нататку",
"moved": "Карыстальнік перанесены",
"created_at": "Далучыўся: {{date}}",
"summary": {
"statuses_count": "{{count}} допісаў"
@ -412,11 +412,25 @@
},
"filter": {
"name": "Дадаць у фільтр",
"existed": ""
"existed": "Існаваў у гэтых фільтрах"
},
"history": {
"name": "Гісторыя рэдагавання"
},
"mute": {
"name": "",
"mute": "",
"description": "",
"notification": "",
"duration": {
"heading": "",
"0": "Бестэрмінова",
"1800": "30 хвілін",
"3600": "1 гадзіна",
"86400": "1 дзень",
"604800": "1 тыдзень"
}
},
"report": {
"name": "Паскардзіцца на {{acct}}",
"report": "Скарга",
@ -468,7 +482,7 @@
"name": "Абмеркаванні",
"remoteFetch": {
"title": "Змяшчае аддаленае змесціва",
"message": ""
"message": "Федэратыўны кантэнт не заўсёды даступны на лакальным серверы. Гэты кантэнт атрымліваецца з аддаленага сервера і мае пазнаку. Вы можаце ўзаемадзейнічаць з гэтым кантэнтам як звычайна."
}
},
"users": {

View File

@ -417,6 +417,20 @@
"history": {
"name": "Edita l'historial"
},
"mute": {
"name": "Silencia {{acct}}",
"mute": "Silencia",
"description": "Amaga publicacions i mencions d'aquest usuari, però encara podrà veure les teves publicacions i seguir-te.",
"notification": "També amaga notificacions d'aquest usuari",
"duration": {
"heading": "D'una durada",
"0": "Indefinida",
"1800": "30 minuts",
"3600": "1 hora",
"86400": "1 dia",
"604800": "1 setmana"
}
},
"report": {
"name": "Denúncia a {{acct}}",
"report": "Denúncia",

View File

@ -417,6 +417,20 @@
"history": {
"name": ""
},
"mute": {
"name": "",
"mute": "",
"description": "",
"notification": "",
"duration": {
"heading": "",
"0": "",
"1800": "",
"3600": "",
"86400": "",
"604800": ""
}
},
"report": {
"name": "",
"report": "",

View File

@ -417,6 +417,20 @@
"history": {
"name": "Bearbeitungsverlauf"
},
"mute": {
"name": "@{{acct}} stummschalten",
"mute": "Stummschalten",
"description": "Verstecke Tröts des Users und solche, in denen das Konto erwähnt wird. Die Person wird weiterhin deine Beiträge lesen und dir folgen können.",
"notification": "Benachrichtigungen dieses Profils ebenfalls ausblenden",
"duration": {
"heading": "Für die Dauer",
"0": "Dauerhaft",
"1800": "30 Minuten",
"3600": "1 Stunde",
"86400": "1 Tag",
"604800": "1 Woche"
}
},
"report": {
"name": "{{acct}} melden",
"report": "Melden",

View File

@ -417,6 +417,20 @@
"history": {
"name": "Ιστορικό επεξεργασίας"
},
"mute": {
"name": "",
"mute": "",
"description": "",
"notification": "",
"duration": {
"heading": "",
"0": "",
"1800": "",
"3600": "",
"86400": "",
"604800": ""
}
},
"report": {
"name": "Αναφορά {{acct}}",
"report": "Αναφορά",

View File

@ -417,6 +417,20 @@
"history": {
"name": "Edit History"
},
"mute": {
"name": "Mute {{acct}}",
"mute": "Mute",
"description": "Hide posts from this user and posts mentioning them, but it will still allow them to see your posts and follow you.",
"notification": "Also hide notifications from this user",
"duration": {
"heading": "For duration",
"0": "Indefinitely",
"1800": "30 minutes",
"3600": "1 hour",
"86400": "1 day",
"604800": "1 week"
}
},
"report": {
"name": "Report {{acct}}",
"report": "Report",

View File

@ -417,6 +417,20 @@
"history": {
"name": "Historial de ediciones"
},
"mute": {
"name": "Silenciar a {{acct}}",
"mute": "Silenciar",
"description": "Oculta publicaciones y menciones a este usuario, pero podrá ver tus publicaciones y seguirte.",
"notification": "También oculta notificaciones de este usuario",
"duration": {
"heading": "Durante",
"0": "Indefinidamente",
"1800": "30 minutos",
"3600": "1 hora",
"86400": "1 día",
"604800": "1 semana"
}
},
"report": {
"name": "Denuncia {{acct}}",
"report": "Denuncia",

View File

@ -417,6 +417,20 @@
"history": {
"name": ""
},
"mute": {
"name": "Mututu {{acct}}",
"mute": "Mututu",
"description": "Ezkutatu erabiltzaile honen argitalpenak berari aipatzen dieten argitalpenak, hala ere, berak zure argitalpenak irakurri ahal izango ditu eta zuri jarraitu ere.",
"notification": "Baita ere, ezkutatu erabiltzaile honen jakinarazpenak",
"duration": {
"heading": "Iraupena",
"0": "Mugagabe",
"1800": "30 minutu",
"3600": "Ordu 1",
"86400": "Egun 1",
"604800": "Aste 1"
}
},
"report": {
"name": "",
"report": "",

View File

@ -417,6 +417,20 @@
"history": {
"name": "Modifier l'historique"
},
"mute": {
"name": "",
"mute": "",
"description": "",
"notification": "",
"duration": {
"heading": "",
"0": "",
"1800": "",
"3600": "",
"86400": "",
"604800": ""
}
},
"report": {
"name": "",
"report": "",

View File

@ -5,11 +5,11 @@
"cancel": "Annulla",
"discard": "Scarta",
"continue": "Continua",
"create": "",
"delete": "",
"done": "",
"create": "Crea",
"delete": "Elimina",
"done": "Fatto",
"confirm": "Ho capito",
"add": ""
"add": "Aggiungi"
},
"customEmoji": {
"accessibilityLabel": "Emoji personalizzata {{emoji}}"

View File

@ -1,13 +1,13 @@
{
"server": {
"textInput": {
"placeholder": ""
"placeholder": "Dominio dell'istanza"
},
"whitelisted": "",
"whitelisted": "Questa potrebbe essere un'istanza nella whitelist nella quale tooot non può accedere ai dati di essa prima di fare il log-in.",
"button": "Accedi",
"information": {
"name": "Nome",
"description": ""
"description": "Descrizione"
},
"disclaimer": {
"base": "Per accedere, verrà aperta una pagina del browser di sistema. I dati di accesso del tuo account sono protetti."

View File

@ -17,10 +17,10 @@
"refresh": {
"fetchPreviousPage": "Più recenti da qui",
"refetch": "Al più recente",
"fetching": "",
"fetching": "Recupero nuovi toot ...",
"fetched": {
"none": "",
"found": ""
"none": "Nessun nuovo toot",
"found": "{{count}} toot recuperati"
}
},
"shared": {

View File

@ -417,6 +417,20 @@
"history": {
"name": "Cronologia delle modifiche"
},
"mute": {
"name": "",
"mute": "",
"description": "",
"notification": "",
"duration": {
"heading": "",
"0": "",
"1800": "",
"3600": "",
"86400": "",
"604800": ""
}
},
"report": {
"name": "",
"report": "",

View File

@ -417,6 +417,20 @@
"history": {
"name": "編集履歴"
},
"mute": {
"name": "",
"mute": "",
"description": "",
"notification": "",
"duration": {
"heading": "",
"0": "",
"1800": "",
"3600": "",
"86400": "",
"604800": ""
}
},
"report": {
"name": "{{acct}} の違反報告",
"report": "報告",

View File

@ -417,6 +417,20 @@
"history": {
"name": "수정 이력"
},
"mute": {
"name": "",
"mute": "",
"description": "",
"notification": "",
"duration": {
"heading": "",
"0": "",
"1800": "",
"3600": "",
"86400": "",
"604800": ""
}
},
"report": {
"name": "@{{acct}} 신고",
"report": "신고",

View File

@ -417,6 +417,20 @@
"history": {
"name": "Geschiedenis bewerken"
},
"mute": {
"name": "Demp {{acct}}",
"mute": "Dempen",
"description": "Verberg berichten van deze gebruiker en berichten die hen vermelden, maar het geeft hen nog steeds de mogelijkheid om je posts te zien en je te volgen.",
"notification": "Verberg ook meldingen van deze gebruiker",
"duration": {
"heading": "Voor duur",
"0": "Onbepaalde tijd",
"1800": "30 minuten",
"3600": "1 uur",
"86400": "1 dag",
"604800": "1 week"
}
},
"report": {
"name": "Rapporteer {{acct}}",
"report": "Rapporteer",

View File

@ -417,6 +417,20 @@
"history": {
"name": "Rediger historikk"
},
"mute": {
"name": "Demp {{acct}}",
"mute": "Demp",
"description": "Skjul innlegg fra denne brukeren og innleggene som nevner brukeren, men det vil fortsatt la brukeren se dine innlegg og følge deg.",
"notification": "Skjul varsler også for denne brukeren",
"duration": {
"heading": "For varighet",
"0": "På ubestemt tid",
"1800": "30 minutter",
"3600": "Én time",
"86400": "Én dag",
"604800": "én uke"
}
},
"report": {
"name": "Rapporter {{acct}}",
"report": "Rapporter",

View File

@ -417,6 +417,20 @@
"history": {
"name": "Historia edycji"
},
"mute": {
"name": "",
"mute": "",
"description": "",
"notification": "",
"duration": {
"heading": "",
"0": "",
"1800": "",
"3600": "",
"86400": "",
"604800": ""
}
},
"report": {
"name": "Zgłoś {{acct}}",
"report": "Zgłoś",

View File

@ -9,7 +9,7 @@
"delete": "Excluir",
"done": "Concluído",
"confirm": "Confirmar",
"add": ""
"add": "Adicionar"
},
"customEmoji": {
"accessibilityLabel": "Emoji personalizado {{emoji}}"

View File

@ -9,17 +9,17 @@
"inLists": "Listas contendo usuário ...",
"showBoosts": {
"action_false": "Mostrar boosts do usuário",
"action_true": ""
"action_true": "Ocultar boosts dos usuários"
},
"mute": {
"action_false": "Silenciar usuário",
"action_true": "Desativar o silêncio do usuário"
},
"followAs": {
"trigger": "",
"trigger": "Seguir como ...",
"succeed_default": "Agora seguindo @{{target}} com @{{source}}",
"succeed_locked": "",
"failed": ""
"succeed_locked": "Enviado o pedido para seguir @{{target}} com {{source}}, aguardando aprovação",
"failed": "Seguir como"
},
"blockReport": "Bloquear e denunciar",
"block": {
@ -38,7 +38,7 @@
},
"at": {
"direct": "Mensagem Direta",
"public": ""
"public": "Mensagem pública"
},
"copy": {
"action": "Copiar toot",

View File

@ -3,7 +3,7 @@
"textInput": {
"placeholder": "Domínio da instância"
},
"whitelisted": "",
"whitelisted": "Esta pode ser uma instância na lista de permissões da qual o tooot não consegue recuperar dados antes de se conectar.",
"button": "Entrar",
"information": {
"name": "Nome",

View File

@ -2,7 +2,7 @@
"HTML": {
"accessibilityHint": "Toque para expandir ou recolher conteúdo",
"expanded": "{{hint}}{{moreLines}}",
"moreLines": "",
"moreLines": " ({{count}} mais linhas)",
"defaultHint": "Toot longo"
}
}

View File

@ -20,7 +20,7 @@
"fetching": "Buscando toots mais recentes...",
"fetched": {
"none": "Nenhum novo toot",
"found": ""
"found": "toots {{count}} obtidos"
}
},
"shared": {
@ -33,12 +33,12 @@
"poll": "Uma enquete em que você votou terminou",
"reblog": {
"default": "{{name}} boostou",
"myself": "",
"myself": "Eu impulsionei",
"notification": "{{name}} deu boost no teu toot"
},
"update": "Toot foi editado",
"admin.sign_up": "",
"admin.report": ""
"admin.sign_up": "{{name}} entrou na instância",
"admin.report": "{{name}} relatou:"
},
"actions": {
"reply": {

View File

@ -11,13 +11,13 @@
"segments": {
"federated": "Global",
"local": "Local",
"explore": ""
"explore": "Explorar"
},
"exploring": {
"heading": "",
"heading": "Explorando",
"trending": "",
"followRemote": "",
"noTitle": "",
"noTitle": "Sem título",
"errors": {
"existed": "Você já está seguindo esta instância.",
"notAvailable": "A linha do tempo desta instância não é acessível ao público. Por favor, tente outra instância."
@ -172,15 +172,15 @@
},
"filters": {
"title": "Filtros de conteúdo",
"content": ""
"content": "{{count}} ativo"
},
"web_only": {
"title": "",
"title": "Atualizar configurações",
"description": "As configurações abaixo só podem ser atualizadas usando a interface web"
}
},
"preferencesFilters": {
"expired": "",
"expired": "Expirado",
"keywords_one": "{{count}} palavra-chave",
"keywords_other": "{{count}} palavras-chave",
"statuses_one": "{{count}} toot",
@ -271,8 +271,8 @@
"settings": "Ativar em configurações"
},
"missingServerKey": {
"message": "",
"description": ""
"message": "Servidor configurado incorretamente para push",
"description": "Entre em contato com o administrador do servidor para configurar o suporte push"
},
"global": {
"heading": "Habilitar para {{acct}}",
@ -390,7 +390,7 @@
"accessibilityHint": "Você pode silenciar, bloquear, relatar ou compartilhar este usuário"
},
"followed_by": " está seguindo você",
"privateNote": "",
"privateNote": "Adicionar nota privada",
"moved": "Usuário movido",
"created_at": "Registrado em: {{date}}",
"summary": {
@ -404,7 +404,7 @@
},
"accountInLists": {
"name": "Listas de @{{username}}",
"inLists": "",
"inLists": "Nas listas",
"notInLists": "Outras listas"
},
"attachments": {
@ -417,6 +417,20 @@
"history": {
"name": "Histórico de Edição"
},
"mute": {
"name": "Silenciar {{acct}}",
"mute": "Silenciar",
"description": "Oculte postagens e menções a este usuário, mas isso ainda permitirá que ele veja suas postagens e siga você.",
"notification": "Ocultar também notificações deste usuário",
"duration": {
"heading": "Por duração",
"0": "Indefinidamente",
"1800": "30 minutos",
"3600": "1 hora",
"86400": "1 dia",
"604800": "1 semana"
}
},
"report": {
"name": "Denuncia {{acct}}",
"report": "Denunciar",
@ -467,7 +481,7 @@
"toot": {
"name": "Discussões",
"remoteFetch": {
"title": "",
"title": "Contém conteúdo remoto",
"message": "O conteúdo global nem sempre está disponível na instância local. Estes conteúdos são obtidos de instâncias remotas e marcados. Você pode interagir com esses conteúdos normalmente."
}
},

View File

@ -9,7 +9,7 @@
"delete": "Удалить",
"done": "Готово",
"confirm": "Подтвердить",
"add": ""
"add": "Добавить"
},
"customEmoji": {
"accessibilityLabel": "Пользовательские эмодзи {{emoji}}"

View File

@ -7,7 +7,7 @@
"button": "Войти",
"information": {
"name": "Название",
"description": ""
"description": "Описание"
},
"disclaimer": {
"base": "Вход в систему использует системный браузер, информация о вашем аккаунте не будет видна приложению."

View File

@ -1,8 +1,8 @@
{
"HTML": {
"accessibilityHint": "",
"expanded": "",
"moreLines": "",
"defaultHint": ""
"accessibilityHint": "Нажмите, чтобы развернуть или свернуть содержимое",
"expanded": "{{hint}}{{moreLines}}",
"moreLines": " ({{count}} больше строк)",
"defaultHint": "Длинное сообщение"
}
}

View File

@ -1,16 +1,16 @@
{
"follow": {
"function": ""
"function": "Подписаться на пользователя"
},
"block": {
"function": ""
"function": "Заблокировать пользователя"
},
"button": {
"error": "",
"blocked_by": "",
"blocking": "",
"following": "",
"requested": "",
"default": ""
"error": "Ошибка загрузки",
"blocked_by": "Заблокирован пользователем",
"blocking": "Разблокировать",
"following": "Отписаться",
"requested": "Отменить запрос",
"default": "Подписаться"
}
}

View File

@ -1,81 +1,81 @@
{
"empty": {
"error": {
"message": "",
"button": ""
"message": "Ошибка загрузки",
"button": "Повторить"
},
"success": {
"message": ""
"message": "Лента пуста"
}
},
"end": {
"message": ""
"message": "Конец, как насчет чашки <0 />"
},
"lookback": {
"message": ""
"message": "Последний просмотр в"
},
"refresh": {
"fetchPreviousPage": "",
"refetch": "",
"fetching": "",
"fetchPreviousPage": "Новинки отсюда",
"refetch": "В конец",
"fetching": "Получение новых сообщений ...",
"fetched": {
"none": "",
"found": ""
"none": "Нет новых сообщений",
"found": "Получено {{count}} сообщений"
}
},
"shared": {
"actioned": {
"pinned": "Закрепить",
"favourite": "",
"favourite": "{{name}} добавил(а) ваш пост в избранное",
"status": "{{name}} только что запостил",
"follow": "{{name}} подписался (-лась) на вас",
"follow_request": "{{name}} хочет подписаться на вас",
"poll": "",
"poll": "Опрос, в котором вы участвовали, завершен",
"reblog": {
"default": "",
"myself": "",
"notification": ""
"default": "{{name}} продвинул(а)",
"myself": "Я продвинул(а)",
"notification": "{{name}} продвинул(а) ваш пост"
},
"update": "",
"admin.sign_up": "",
"admin.report": ""
"update": "Репост был отредактирован",
"admin.sign_up": "{{name}} присоединился к серверу",
"admin.report": "{{name}} сообщил(а):"
},
"actions": {
"reply": {
"accessibilityLabel": ""
"accessibilityLabel": "Ответить на это сообщение"
},
"reblogged": {
"accessibilityLabel": "",
"function": "",
"accessibilityLabel": "Продвинуть это сообщение",
"function": "Продвинуть сообщение",
"options": {
"title": "",
"public": "",
"unlisted": ""
"title": "Выберите видимость продвижения",
"public": "Публичное продвижение",
"unlisted": "Убрать из списка"
}
},
"favourited": {
"accessibilityLabel": "",
"function": ""
"accessibilityLabel": "Добавить этот пост в избранное",
"function": "Избранное"
},
"bookmarked": {
"accessibilityLabel": "",
"function": ""
"accessibilityLabel": "Добавить этот пост в закладки",
"function": "Закладки"
},
"openReport": ""
"openReport": "Открыть отчет"
},
"actionsUsers": {
"reblogged_by": {
"accessibilityLabel": "",
"accessibilityHint": "",
"text": ""
"accessibilityLabel": "{{count}} пользователей продвинули этот пост",
"accessibilityHint": "Нажмите, чтобы узнать пользователей",
"text": "$t(screenTabs:shared.users.statuses.reblogged_by)"
},
"favourited_by": {
"accessibilityLabel": "",
"accessibilityHint": "",
"text": ""
"accessibilityLabel": "{{count}} пользователей добавили этот пост в избранное",
"accessibilityHint": "Нажмите, чтобы узнать пользователей",
"text": "$t(screenTabs:shared.users.statuses.favourited_by)"
},
"history": {
"accessibilityLabel": "",
"accessibilityLabel": "Этот пост был отредактирован {{count}} раз",
"accessibilityHint": "",
"text_one": "",
"text_other": ""

View File

@ -417,6 +417,20 @@
"history": {
"name": ""
},
"mute": {
"name": "",
"mute": "",
"description": "",
"notification": "",
"duration": {
"heading": "",
"0": "",
"1800": "",
"3600": "",
"86400": "",
"604800": ""
}
},
"report": {
"name": "",
"report": "",

View File

@ -9,7 +9,7 @@
"delete": "Radera",
"done": "Klar",
"confirm": "Bekräfta",
"add": ""
"add": "Lägg till"
},
"customEmoji": {
"accessibilityLabel": "Anpassad emoji {{emoji}}"

View File

@ -16,7 +16,7 @@
"action_true": "Sluta tysta användare"
},
"followAs": {
"trigger": "",
"trigger": "Följ som ...",
"succeed_default": "Följer nu @{{target}} med @{{source}}",
"succeed_locked": "Följförfrågan skickades till @{{target}} med {{source}}, väntar på godkännande",
"failed": "Följ som"
@ -56,7 +56,7 @@
},
"hashtag": {
"follow": {
"action_false": "",
"action_false": "Följ",
"action_true": ""
},
"filter": {
@ -100,7 +100,7 @@
},
"filter": {
"action_false": "",
"action_true": ""
"action_true": "Hantera filter ..."
}
}
}

View File

@ -83,13 +83,13 @@
"name": ""
},
"preferencesFilters": {
"name": ""
"name": "Alla innehållsfilter"
},
"preferencesFilterAdd": {
"name": ""
"name": "Skapa ett filter"
},
"preferencesFilterEdit": {
"name": ""
"name": "Redigera filter"
},
"profile": {
"name": "Redigera profil"
@ -150,7 +150,7 @@
"options": {
"public": "",
"unlisted": "",
"private": ""
"private": "Endast följare"
}
},
"sensitive": {
@ -181,8 +181,8 @@
},
"preferencesFilters": {
"expired": "",
"keywords_one": "",
"keywords_other": "",
"keywords_one": "{{count}} nyckelord",
"keywords_other": "{{count}} nyckelord",
"statuses_one": "",
"statuses_other": "",
"context": "",
@ -191,20 +191,20 @@
"notifications": "",
"public": "",
"thread": "",
"account": ""
"account": "profil"
}
},
"preferencesFilter": {
"name": "",
"name": "Namn",
"expiration": "",
"expirationOptions": {
"0": "",
"1800": "",
"3600": "",
"43200": "",
"86400": "",
"604800": "",
"18144000": ""
"0": "Aldrig",
"1800": "Efter 30 minuter",
"3600": "Efter 1 timme",
"43200": "Efter 12 timmar",
"86400": "Efter 1 dag",
"604800": "Efter 1 vecka",
"18144000": "Efter 1 månad"
},
"context": "",
"contexts": {
@ -417,6 +417,20 @@
"history": {
"name": "Redigeringshistorik"
},
"mute": {
"name": "",
"mute": "",
"description": "",
"notification": "",
"duration": {
"heading": "",
"0": "",
"1800": "30 minuter",
"3600": "1 timme",
"86400": "1 dag",
"604800": "1 vecka"
}
},
"report": {
"name": "Rapportera {{acct}}",
"report": "Rapport",

View File

@ -417,6 +417,20 @@
"history": {
"name": "Редагувати історію"
},
"mute": {
"name": "Ігнорувати {{acct}}",
"mute": "Ігнорувати",
"description": "Сховає дописи від цього користувача і дописи зі згадками про них, проте вони все одно матимуть змогу бачити ваші дописи та слідкувати за вами.",
"notification": "Також сховати сповіщення цього користувача",
"duration": {
"heading": "На час",
"0": "Безтерміново",
"1800": "30 хвилин",
"3600": "1 годину",
"86400": "1 день",
"604800": "1 тиждень"
}
},
"report": {
"name": "Скарга на {{acct}}",
"report": "Скарга",

View File

@ -417,6 +417,20 @@
"history": {
"name": "Lịch sử chỉnh sửa"
},
"mute": {
"name": "",
"mute": "",
"description": "",
"notification": "",
"duration": {
"heading": "",
"0": "",
"1800": "",
"3600": "",
"86400": "",
"604800": ""
}
},
"report": {
"name": "Báo cáo @{{acct}}",
"report": "Báo cáo",

View File

@ -417,6 +417,20 @@
"history": {
"name": "编辑历史"
},
"mute": {
"name": "隐藏{{acct}}",
"mute": "隐藏",
"description": "此用户的嘟文及提到此用户的嘟文都会隐藏,但他们仍可以看到你的嘟文,也可以关注你。",
"notification": "同时隐藏来自此用户的通知",
"duration": {
"heading": "时限",
"0": "无限期",
"1800": "30分钟",
"3600": "一小时",
"86400": "一天",
"604800": "一周"
}
},
"report": {
"name": "举报 {{acct}}",
"report": "举报",

View File

@ -417,6 +417,20 @@
"history": {
"name": "編輯歷史"
},
"mute": {
"name": "靜音{{acct}}",
"mute": "靜音",
"description": "該使用者的嘟文及提到該使用者的嘟文都會被隱藏,但他們仍然可以看到你的嘟文,也可以關注你。",
"notification": "同時隱藏來自該使用者的通知",
"duration": {
"heading": "時限",
"0": "無限期",
"1800": "30分鐘",
"3600": "一小時",
"86400": "一天",
"604800": "一週"
}
},
"report": {
"name": "檢舉 {{acct}}",
"report": "檢舉",

View File

@ -6,7 +6,6 @@ import { ParseHTML } from '@components/Parse'
import RelativeTime from '@components/RelativeTime'
import CustomText from '@components/Text'
import { BlurView } from '@react-native-community/blur'
import { useAccessibility } from '@utils/accessibility/AccessibilityManager'
import { RootStackScreenProps } from '@utils/navigation/navigators'
import { useAnnouncementMutation, useAnnouncementQuery } from '@utils/queryHooks/announcement'
import { StyleConstants } from '@utils/styles/constants'
@ -30,7 +29,6 @@ const ScreenAnnouncements: React.FC<RootStackScreenProps<'Screen-Announcements'>
},
navigation
}) => {
const { reduceMotionEnabled } = useAccessibility()
const { colors, mode } = useTheme()
const [index, setIndex] = useState(0)
const { t } = useTranslation('screenAnnouncements')

View File

@ -1,4 +1,3 @@
import { HeaderLeft } from '@components/Header'
import Icon from '@components/Icon'
import { SwipeToActions } from '@components/SwipeToActions'
import CustomText from '@components/Text'
@ -7,10 +6,10 @@ import { connectMedia } from '@utils/api/helpers/connect'
import apiInstance from '@utils/api/instance'
import { ScreenComposeStackScreenProps } from '@utils/navigation/navigators'
import { getAccountStorage, setAccountStorage, useAccountStorage } from '@utils/storage/actions'
import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager'
import { StyleConstants } from '@utils/styles/constants'
import { Image } from 'expo-image'
import React, { useContext, useEffect, useState } from 'react'
import React, { useContext, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { Dimensions, Modal, Pressable, View } from 'react-native'
import ComposeContext from './utils/createContext'
@ -35,13 +34,6 @@ const ComposeDraftsList: React.FC<ScreenComposeStackScreenProps<'Screen-Compose-
const { colors } = useTheme()
const { t } = useTranslation('screenCompose')
useEffect(() => {
navigation.setOptions({
title: t('content.draftsList.header.title'),
headerLeft: () => <HeaderLeft content='chevron-down' onPress={() => navigation.goBack()} />
})
}, [])
const { composeDispatch } = useContext(ComposeContext)
const [drafts] = useAccountStorage.object('drafts')
const [checkingAttachments, setCheckingAttachments] = useState(false)

View File

@ -38,7 +38,6 @@ const ComposeEditAttachment: React.FC<
useEffect(() => {
navigation.setOptions({
title: t('screenCompose:content.editAttachment.header.title'),
headerLeft: () => (
<HeaderLeft
content='chevron-down'

View File

@ -414,12 +414,21 @@ const ScreenCompose: React.FC<RootStackScreenProps<'Screen-Compose'>> = ({
<Stack.Screen
name='Screen-Compose-DraftsList'
component={ComposeDraftsList}
options={{ presentation: 'modal', headerShadowVisible: false }}
options={{
presentation: 'modal',
headerShadowVisible: false,
title: t('screenCompose:content.draftsList.header.title'),
headerLeft: () => <HeaderLeft content='chevron-down' />
}}
/>
<Stack.Screen
name='Screen-Compose-EditAttachment'
component={ComposeEditAttachment}
options={{ presentation: 'modal', headerShadowVisible: false }}
options={{
presentation: 'modal',
headerShadowVisible: false,
title: t('screenCompose:content.editAttachment.header.title')
}}
/>
</Stack.Navigator>
</ComposeContext.Provider>

View File

@ -4,15 +4,19 @@ import usePopToTop from '@utils/navigation/usePopToTop'
import React from 'react'
import TabShared from '../Shared'
import Root from './Root'
import { HeaderLeft } from '@components/Header'
const Stack = createNativeStackNavigator<TabLocalStackParamList>()
const TabLocal: React.FC = () => {
usePopToTop('Tab-Local-Root')
return (
<Stack.Navigator screenOptions={{ headerShadowVisible: false }}>
<Stack.Navigator
screenOptions={{ headerShadowVisible: false, headerLeft: () => <HeaderLeft /> }}
>
<Stack.Screen name='Tab-Local-Root' component={Root} />
{TabShared({ Stack })}
{TabShared(Stack)}
</Stack.Navigator>
)
}

View File

@ -51,7 +51,7 @@ const TabMePreferencesFilter: React.FC<
const titleState = useState(params.type === 'edit' ? params.filter.title : '')
const expirations = ['0', '1800', '3600', '43200', '86400', '604800', '18144000'] as const
const [expiration, setExpiration] = useState<typeof expirations[number]>('0')
const [expiration, setExpiration] = useState<(typeof expirations)[number]>('0')
const [contexts, setContexts] = useState<
{
@ -226,8 +226,10 @@ const TabMePreferencesFilter: React.FC<
cancelButtonIndex: expirations.length,
...androidActionSheetStyles(colors)
},
(selectedIndex: number) => {
selectedIndex < expirations.length && setExpiration(expirations[selectedIndex])
selectedIndex => {
selectedIndex &&
selectedIndex < expirations.length &&
setExpiration(expirations[selectedIndex])
}
)
}

View File

@ -12,7 +12,7 @@ import TabMeProfileRoot from './Root'
const Stack = createNativeStackNavigator<TabMeProfileStackParamList>()
const TabMeProfile: React.FC<TabMeStackScreenProps<'Tab-Me-Switch'>> = ({ navigation }) => {
const TabMeProfile: React.FC<TabMeStackScreenProps<'Tab-Me-Profile'>> = ({ navigation }) => {
const { t } = useTranslation('screenTabs')
const messageRef = useRef<FlashMessage>(null)

View File

@ -23,6 +23,20 @@ import { useTranslation } from 'react-i18next'
import { AppState, Linking, Platform, ScrollView, View } from 'react-native'
import { fromByteArray } from 'react-native-quick-base64'
export const getPushPath = ({
expoToken,
domain,
accountId
}: {
expoToken?: string
domain: string
accountId: string | number
}) => `${expoToken}/${domain}/${accountId}`
export const getPushendpoint = (pushPath: string) =>
`https://${TOOOT_API_DOMAIN}/push/send/${pushPath}/${(Math.random() + 1)
.toString(36)
.substring(2)}`
const TabMePush: React.FC = () => {
const { colors } = useTheme()
const { t } = useTranslation('screenTabs')
@ -116,7 +130,7 @@ const TabMePush: React.FC = () => {
))
: null
const pushPath = `${expoToken}/${domain}/${accountId}`
const pushPath = getPushPath({ expoToken, domain, accountId })
const accountFull = `@${accountAcct}@${accountDomain}`
return appsQuery.isFetched ? (
@ -176,17 +190,13 @@ const TabMePush: React.FC = () => {
if (push.key?.length <= 10) {
authKey = fromByteArray(Crypto.getRandomBytes(16))
}
// Turning on
const randomPath = (Math.random() + 1).toString(36).substring(2)
const endpoint = `https://${TOOOT_API_DOMAIN}/push/send/${pushPath}/${randomPath}`
const body: {
subscription: any
data: { alerts: Mastodon.PushSubscription['alerts'] }
} = {
subscription: {
endpoint,
endpoint: getPushendpoint(pushPath),
keys: {
p256dh:
'BMn2PLpZrMefG981elzG6SB1EY9gU7QZwmtZ/a/J2vUeWG+zXgeskMPwHh4T/bxsD4l7/8QT94F57CbZqYRRfJo=',

View File

@ -6,7 +6,7 @@ import { useNavigation } from '@react-navigation/native'
import { androidActionSheetStyles } from '@utils/helpers/androidActionSheetStyles'
import { urlMatcher } from '@utils/helpers/urlMatcher'
import { storage } from '@utils/storage'
import { getGlobalStorage, useGlobalStorage } from '@utils/storage/actions'
import { getGlobalStorage, setGlobalStorage, useGlobalStorage } from '@utils/storage/actions'
import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager'
import React from 'react'
@ -59,6 +59,17 @@ const SettingsDev: React.FC = () => {
}}
onPress={() => displayMessage({ message: 'This is a testing message' })}
/>
<Button
type='text'
content={'Set ExpoToken wrapped'}
style={{
marginHorizontal: StyleConstants.Spacing.Global.PagePadding * 2,
marginBottom: StyleConstants.Spacing.Global.PagePadding * 2
}}
onPress={() => {
setGlobalStorage('app.expo_token', 'ExponentPushToken[DEVELOPMENT_1]')
}}
/>
<Button
type='text'
content={'Purge MMKV'}
@ -87,7 +98,7 @@ const SettingsDev: React.FC = () => {
content={'Crash test'}
style={{
marginHorizontal: StyleConstants.Spacing.Global.PagePadding * 2,
marginBottom: StyleConstants.Spacing.Global.PagePadding * 2
marginBottom: StyleConstants.Spacing.Global.PagePadding
}}
destructive
onPress={() => {

View File

@ -156,7 +156,7 @@ const TabMe: React.FC = () => {
})}
/>
{TabShared({ Stack })}
{TabShared(Stack)}
</Stack.Navigator>
)
}

View File

@ -54,7 +54,7 @@ const TabNotifications: React.FC = () => {
component={TabNotificationsFilters}
options={{ presentation: 'modal', gestureEnabled: false }}
/>
{TabShared({ Stack })}
{TabShared(Stack)}
</Stack.Navigator>
)
}

View File

@ -374,7 +374,10 @@ const Explore = ({ route: { key: page } }: { route: { key: 'Explore' } }) => {
<DropdownMenu.ItemTitle children={item.title} />
<DropdownMenu.ItemSubtitle children={item.domain} />
{index === remotes?.findIndex(r => r.domain === remoteActive) ? (
<DropdownMenu.ItemIcon ios={{ name: 'trash' }} />
<DropdownMenu.ItemIcon
ios={{ name: 'trash' }}
androidIconName='ic_menu_delete'
/>
) : null}
</DropdownMenu.CheckboxItem>
))}
@ -391,7 +394,7 @@ const Explore = ({ route: { key: page } }: { route: { key: 'Explore' } }) => {
<DropdownMenu.ItemTitle
children={t('screenTabs:tabs.public.exploring.followRemote')}
/>
<DropdownMenu.ItemIcon ios={{ name: 'plus' }} />
<DropdownMenu.ItemIcon ios={{ name: 'plus' }} androidIconName='ic_menu_add' />
</DropdownMenu.Item>
</DropdownMenu.Group>
</DropdownMenu.Content>

View File

@ -12,7 +12,7 @@ const TabPublic: React.FC = () => {
return (
<Stack.Navigator screenOptions={{ headerShadowVisible: false }}>
<Stack.Screen name='Tab-Public-Root' component={Root} />
{TabShared({ Stack })}
{TabShared(Stack)}
</Stack.Navigator>
)
}

View File

@ -71,7 +71,7 @@ const AccountInformationActions: React.FC = () => {
round
type='icon'
content='at-sign'
style={{ flex: 1, marginRight: StyleConstants.Spacing.S }}
style={{ marginRight: StyleConstants.Spacing.S }}
onPress={() => {}}
/>
</DropdownMenu.Trigger>
@ -129,7 +129,7 @@ const styles = StyleSheet.create({
base: {
alignSelf: 'flex-end',
flexDirection: 'row',
alignItems: 'stretch'
alignItems: 'center'
}
})

View File

@ -1,17 +1,17 @@
import menuAccount from '@components/contextMenu/account'
import menuShare from '@components/contextMenu/share'
import { HeaderLeft, HeaderRight } from '@components/Header'
import { HeaderRight } from '@components/Header'
import Icon from '@components/Icon'
import CustomText from '@components/Text'
import Timeline from '@components/Timeline'
import menuAccount from '@components/contextMenu/account'
import menuShare from '@components/contextMenu/share'
import { TabSharedStackScreenProps } from '@utils/navigation/navigators'
import { queryClient } from '@utils/queryHooks'
import { useAccountQuery } from '@utils/queryHooks/account'
import { useRelationshipQuery } from '@utils/queryHooks/relationship'
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
import { useAccountStorage } from '@utils/storage/actions'
import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager'
import { StyleConstants } from '@utils/styles/constants'
import React, { Fragment, useEffect, useMemo } from 'react'
import { useTranslation } from 'react-i18next'
import { Platform, Pressable, Text, View } from 'react-native'
@ -65,8 +65,6 @@ const TabSharedAccount: React.FC<TabSharedStackScreenProps<'Tab-Shared-Account'>
navigation.setOptions({
headerTransparent: true,
headerStyle: { backgroundColor: `rgba(255, 255, 255, 0)` },
title: '',
headerLeft: () => <HeaderLeft onPress={() => navigation.goBack()} background />,
headerRight: () => {
return (
<DropdownMenu.Root>

View File

@ -1,6 +1,5 @@
import Button from '@components/Button'
import haptics from '@components/haptics'
import { HeaderRight } from '@components/Header'
import { MenuRow } from '@components/Menu'
import CustomText from '@components/Text'
import { TabSharedStackScreenProps } from '@utils/navigation/navigators'
@ -8,14 +7,13 @@ import { useAccountInListsQuery } from '@utils/queryHooks/account'
import { useListAccountsMutation, useListsQuery } from '@utils/queryHooks/lists'
import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager'
import React, { useEffect } from 'react'
import React from 'react'
import { useTranslation } from 'react-i18next'
import { SectionList, View } from 'react-native'
const TabSharedAccountInLists: React.FC<
TabSharedStackScreenProps<'Tab-Shared-Account-In-Lists'>
> = ({
navigation,
route: {
params: { account }
}
@ -23,20 +21,6 @@ const TabSharedAccountInLists: React.FC<
const { colors } = useTheme()
const { t } = useTranslation(['common', 'screenTabs'])
useEffect(() => {
navigation.setOptions({
presentation: 'modal',
title: t('screenTabs:shared.accountInLists.name', { username: account.username }),
headerRight: () => (
<HeaderRight
type='text'
content={t('common:buttons.done')}
onPress={() => navigation.pop(1)}
/>
)
})
}, [])
const listsQuery = useListsQuery()
const accountInListsQuery = useAccountInListsQuery({ id: account.id })

View File

@ -1,12 +1,7 @@
import { HeaderLeft } from '@components/Header'
import { ParseEmojis } from '@components/Parse'
import CustomText from '@components/Text'
import Timeline from '@components/Timeline'
import { TabSharedStackScreenProps } from '@utils/navigation/navigators'
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
import { useTheme } from '@utils/styles/ThemeManager'
import React, { useEffect } from 'react'
import { Trans } from 'react-i18next'
const TabSharedAttachments: React.FC<TabSharedStackScreenProps<'Tab-Shared-Attachments'>> = ({
navigation,
@ -14,33 +9,7 @@ const TabSharedAttachments: React.FC<TabSharedStackScreenProps<'Tab-Shared-Attac
params: { account }
}
}) => {
const { colors } = useTheme()
useEffect(() => {
navigation.setOptions({
headerLeft: () => <HeaderLeft onPress={() => navigation.goBack()} background />,
headerTitle: () => (
<CustomText numberOfLines={1}>
<Trans
ns='screenTabs'
i18nKey='shared.attachments.name'
components={[
<ParseEmojis
content={account.display_name || account.username}
emojis={account.emojis}
fontBold
/>,
<CustomText
fontStyle='M'
style={{ color: colors.primaryDefault }}
fontWeight='Bold'
/>
]}
/>
</CustomText>
),
headerBackVisible: false
})
navigation.setParams({ queryKey })
}, [])

Some files were not shown because too many files have changed in this diff Show More