From cd4dc9528bf364b8bf05a8ac801ba63292cd1839 Mon Sep 17 00:00:00 2001 From: t0mm0 Date: Fri, 29 Jul 2022 18:41:48 +0100 Subject: [PATCH 01/37] Accept text shared with image on Android (#6324) --- .../app/src/main/java/com/mattermost/share/ShareModule.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/android/app/src/main/java/com/mattermost/share/ShareModule.java b/android/app/src/main/java/com/mattermost/share/ShareModule.java index 1a441dfb6..0a101f349 100644 --- a/android/app/src/main/java/com/mattermost/share/ShareModule.java +++ b/android/app/src/main/java/com/mattermost/share/ShareModule.java @@ -167,6 +167,11 @@ public class ShareModule extends ReactContextBaseJavaModule { map.putString("type", type); map.putBoolean("isString", false); items.pushMap(map); + + map = Arguments.createMap(); + map.putString("value", extra); + map.putBoolean("isString", true); + items.pushMap(map); } } else if (Intent.ACTION_SEND_MULTIPLE.equals(action)) { ArrayList uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); From b6b77411f0b1db2e7206fe979d2cfdc1225502c3 Mon Sep 17 00:00:00 2001 From: Weblate Date: Thu, 28 Jul 2022 17:37:47 +0200 Subject: [PATCH 02/37] Added translation using Weblate (Catalan) --- assets/base/i18n/ca.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 assets/base/i18n/ca.json diff --git a/assets/base/i18n/ca.json b/assets/base/i18n/ca.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/assets/base/i18n/ca.json @@ -0,0 +1 @@ +{} From c4620963fa3a98752cc00d3bcf30900a007bdbca Mon Sep 17 00:00:00 2001 From: Elias Nahum Date: Wed, 3 Aug 2022 13:53:01 -0400 Subject: [PATCH 03/37] Bump version to 1.55.0 and build to 416 (#6538) * Bump app version number to 1.55.0 * Bump app build number to 416 --- android/app/build.gradle | 4 +-- fastlane/Gemfile.lock | 36 ++++++++++++------------ ios/Mattermost.xcodeproj/project.pbxproj | 4 +-- ios/Mattermost/Info.plist | 4 +-- ios/MattermostShare/Info.plist | 4 +-- ios/NotificationService/Info.plist | 4 +-- package-lock.json | 2 +- package.json | 2 +- 8 files changed, 30 insertions(+), 30 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 4a445fef8..5207833ae 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -131,8 +131,8 @@ android { applicationId "com.mattermost.rnbeta" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 410 - versionName "1.54.0" + versionCode 416 + versionName "1.55.0" multiDexEnabled = true testBuildType System.getProperty('testBuildType', 'debug') testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' diff --git a/fastlane/Gemfile.lock b/fastlane/Gemfile.lock index ef2086bdb..07bb7f5ef 100644 --- a/fastlane/Gemfile.lock +++ b/fastlane/Gemfile.lock @@ -8,20 +8,20 @@ GEM artifactory (3.0.15) atomos (0.1.3) aws-eventstream (1.2.0) - aws-partitions (1.602.0) - aws-sdk-core (3.131.2) + aws-partitions (1.614.0) + aws-sdk-core (3.131.5) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.525.0) aws-sigv4 (~> 1.1) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.57.0) + aws-sdk-kms (1.58.0) aws-sdk-core (~> 3, >= 3.127.0) aws-sigv4 (~> 1.1) aws-sdk-s3 (1.114.0) aws-sdk-core (~> 3, >= 3.127.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.4) - aws-sigv4 (1.5.0) + aws-sigv4 (1.5.1) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) claide (1.1.0) @@ -34,9 +34,9 @@ GEM rake (>= 12.0.0, < 14.0.0) domain_name (0.5.20190701) unf (>= 0.0.5, < 1.0.0) - dotenv (2.7.6) + dotenv (2.8.1) emoji_regex (3.2.3) - excon (0.92.3) + excon (0.92.4) faraday (1.10.0) faraday-em_http (~> 1.0) faraday-em_synchrony (~> 1.0) @@ -66,7 +66,7 @@ GEM faraday_middleware (1.2.0) faraday (~> 1.0) fastimage (2.2.6) - fastlane (2.207.0) + fastlane (2.208.0) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) @@ -111,8 +111,8 @@ GEM fastlane-plugin-find_replace_string (0.1.0) fastlane-plugin-versioning_android (0.1.0) gh_inspector (1.1.3) - google-apis-androidpublisher_v3 (0.23.0) - google-apis-core (>= 0.6, < 2.a) + google-apis-androidpublisher_v3 (0.25.0) + google-apis-core (>= 0.7, < 2.a) google-apis-core (0.7.0) addressable (~> 2.5, >= 2.5.1) googleauth (>= 0.16.2, < 2.a) @@ -122,23 +122,23 @@ GEM retriable (>= 2.0, < 4.a) rexml webrick - google-apis-iamcredentials_v1 (0.12.0) - google-apis-core (>= 0.6, < 2.a) - google-apis-playcustomapp_v1 (0.9.0) - google-apis-core (>= 0.6, < 2.a) - google-apis-storage_v1 (0.16.0) - google-apis-core (>= 0.6, < 2.a) + google-apis-iamcredentials_v1 (0.13.0) + google-apis-core (>= 0.7, < 2.a) + google-apis-playcustomapp_v1 (0.10.0) + google-apis-core (>= 0.7, < 2.a) + google-apis-storage_v1 (0.17.0) + google-apis-core (>= 0.7, < 2.a) google-cloud-core (1.6.0) google-cloud-env (~> 1.0) google-cloud-errors (~> 1.0) google-cloud-env (1.6.0) faraday (>= 0.17.3, < 3.0) google-cloud-errors (1.2.0) - google-cloud-storage (1.37.0) + google-cloud-storage (1.38.0) addressable (~> 2.8) digest-crc (~> 0.4) google-apis-iamcredentials_v1 (~> 0.1) - google-apis-storage_v1 (~> 0.1) + google-apis-storage_v1 (~> 0.17.0) google-cloud-core (~> 1.6) googleauth (>= 0.16.2, < 2.a) mini_mime (~> 1.0) @@ -164,7 +164,7 @@ GEM multipart-post (2.0.0) nanaimo (0.3.0) naturally (2.2.1) - nokogiri (1.13.6) + nokogiri (1.13.8) mini_portile2 (~> 2.8.0) racc (~> 1.4) optparse (0.1.1) diff --git a/ios/Mattermost.xcodeproj/project.pbxproj b/ios/Mattermost.xcodeproj/project.pbxproj index 39e66d24d..9c279ef31 100644 --- a/ios/Mattermost.xcodeproj/project.pbxproj +++ b/ios/Mattermost.xcodeproj/project.pbxproj @@ -911,7 +911,7 @@ CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 410; + CURRENT_PROJECT_VERSION = 416; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = UQ8HT4Q2XM; ENABLE_BITCODE = NO; @@ -953,7 +953,7 @@ CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 410; + CURRENT_PROJECT_VERSION = 416; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = UQ8HT4Q2XM; ENABLE_BITCODE = NO; diff --git a/ios/Mattermost/Info.plist b/ios/Mattermost/Info.plist index 35221fe3a..2a5c9a57c 100644 --- a/ios/Mattermost/Info.plist +++ b/ios/Mattermost/Info.plist @@ -21,7 +21,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.54.0 + 1.55.0 CFBundleSignature ???? CFBundleURLTypes @@ -37,7 +37,7 @@ CFBundleVersion - 410 + 416 ITSAppUsesNonExemptEncryption LSRequiresIPhoneOS diff --git a/ios/MattermostShare/Info.plist b/ios/MattermostShare/Info.plist index 22c2cca4b..ff7d294d6 100644 --- a/ios/MattermostShare/Info.plist +++ b/ios/MattermostShare/Info.plist @@ -19,9 +19,9 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 1.54.0 + 1.55.0 CFBundleVersion - 410 + 416 NSAppTransportSecurity NSAllowsArbitraryLoads diff --git a/ios/NotificationService/Info.plist b/ios/NotificationService/Info.plist index f8b36ea5f..33a7e48b2 100644 --- a/ios/NotificationService/Info.plist +++ b/ios/NotificationService/Info.plist @@ -19,9 +19,9 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 1.54.0 + 1.55.0 CFBundleVersion - 410 + 416 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index 77628e303..27c201793 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "mattermost-mobile", - "version": "1.54.0", + "version": "1.55.0", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/package.json b/package.json index 722439f9e..7e538b2c8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mattermost-mobile", - "version": "1.54.0", + "version": "1.55.0", "description": "Mattermost Mobile with React Native", "repository": "git@github.com:mattermost/mattermost-mobile.git", "author": "Mattermost, Inc.", From 7461acb01a91e4a3dc582168c9e0d066822913df Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Aug 2022 14:00:48 -0400 Subject: [PATCH 04/37] Bump moment from 2.29.2 to 2.29.4 in /detox (#6540) Bumps [moment](https://github.com/moment/moment) from 2.29.2 to 2.29.4. - [Release notes](https://github.com/moment/moment/releases) - [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md) - [Commits](https://github.com/moment/moment/compare/2.29.2...2.29.4) --- updated-dependencies: - dependency-name: moment dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- detox/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/detox/package-lock.json b/detox/package-lock.json index 87d830032..e2accc45b 100644 --- a/detox/package-lock.json +++ b/detox/package-lock.json @@ -6765,9 +6765,9 @@ } }, "node_modules/moment": { - "version": "2.29.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz", - "integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==", + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", "dev": true, "optional": true, "engines": { @@ -13536,9 +13536,9 @@ } }, "moment": { - "version": "2.29.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz", - "integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==", + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", "dev": true, "optional": true }, From e37ee22a1baee97710ed66097f9471d4573bc95e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Aug 2022 14:01:28 -0400 Subject: [PATCH 05/37] Bump moment from 2.29.2 to 2.29.4 (#6541) Bumps [moment](https://github.com/moment/moment) from 2.29.2 to 2.29.4. - [Release notes](https://github.com/moment/moment/releases) - [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md) - [Commits](https://github.com/moment/moment/compare/2.29.2...2.29.4) --- updated-dependencies: - dependency-name: moment dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 149 ++++++++++++++++------------------------------ 1 file changed, 52 insertions(+), 97 deletions(-) diff --git a/package-lock.json b/package-lock.json index 27c201793..c0649deda 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,7 +5,7 @@ "requires": true, "packages": { "": { - "version": "1.51.0", + "version": "1.55.0", "hasInstallScript": true, "license": "Apache 2.0", "dependencies": { @@ -17415,9 +17415,9 @@ "integrity": "sha512-iniQP4rj1FhBdBYS/+eQv7j1tadJ9lJtdzgOpvsOHng/GbcDh2Fhdeq+ZRldrPYdXvCyfFUmFeEwEGXZB5I/AQ==" }, "node_modules/moment": { - "version": "2.29.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz", - "integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==", + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", "engines": { "node": "*" } @@ -26021,8 +26021,7 @@ "version": "0.3.6", "resolved": "https://registry.npmjs.org/@mattermost/react-native-paste-input/-/react-native-paste-input-0.3.6.tgz", "integrity": "sha512-/XwUkWfkXDPv1/N+3sILKRoqa4sElqN/fADQzkC2KHYxVKN72297vMm8s+X1n2l+y7phNQ8ZmhjjL0ghuz/1og==", - "requires": { - } + "requires": {} }, "@msgpack/msgpack": { "version": "2.7.1", @@ -26074,8 +26073,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/@react-native-community/cameraroll/-/cameraroll-4.1.2.tgz", "integrity": "sha512-jkdhMByMKD2CZ/5MPeBieYn8vkCfC4MOTouPpBpps3I8N6HUYJk+1JnDdktVYl2WINnqXpQptDA2YptVyifYAg==", - "requires": { - } + "requires": {} }, "@react-native-community/cli": { "version": "6.4.0", @@ -26825,8 +26823,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/@react-native-community/clipboard/-/clipboard-1.5.1.tgz", "integrity": "sha512-AHAmrkLEH5UtPaDiRqoULERHh3oNv7Dgs0bTC0hO5Z2GdNokAMPT5w8ci8aMcRemcwbtdHjxChgtjbeA38GBdA==", - "requires": { - } + "requires": {} }, "@react-native-community/datetimepicker": { "version": "5.1.0", @@ -26931,8 +26928,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-22.4.1.tgz", "integrity": "sha512-gcLfn6P2PrFAVx3AobaOzlIEevpAEf9chTpFZz7bYfc7pz8XRv7vuKTIE4hxPKZSha6XWKKplDQ0x9Pq8xX2mg==", "dev": true, - "requires": { - } + "requires": {} }, "eslint-plugin-react-native": { "version": "3.11.0", @@ -26962,15 +26958,13 @@ "version": "0.1.11", "resolved": "https://registry.npmjs.org/@react-native-community/masked-view/-/masked-view-0.1.11.tgz", "integrity": "sha512-rQfMIGSR/1r/SyN87+VD8xHHzDYeHaJq6elOSCAD+0iLagXkSI2pfA0LmSXP21uw5i3em7GkkRjfJ8wpqWXZNw==", - "requires": { - } + "requires": {} }, "@react-native-community/netinfo": { "version": "7.1.9", "resolved": "https://registry.npmjs.org/@react-native-community/netinfo/-/netinfo-7.1.9.tgz", "integrity": "sha512-xxbxFherpOjQeJm3rIx6gmZNEEBqVDIcmBII5QVSN8zf3xAwmaT/RxT74ISYDkeSlZwv4eegpkD4QA1ky52CNg==", - "requires": { - } + "requires": {} }, "@react-native-cookies/cookies": { "version": "6.0.11", @@ -27011,8 +27005,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-1.3.0.tgz", "integrity": "sha512-C0roIxajvleskEpeYYJ1+2XTg8UqZO6o/SyzqTRuEUVsVD8CbFzKSOfj9kpfzA7jbYNzZPbzUJcm9kIigY9kHg==", - "requires": { - } + "requires": {} }, "@react-navigation/native": { "version": "6.0.7", @@ -27962,8 +27955,7 @@ "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", "dev": true, - "requires": { - } + "requires": {} }, "@webpack-cli/info": { "version": "1.4.1", @@ -27979,8 +27971,7 @@ "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", "dev": true, - "requires": { - } + "requires": {} }, "@xtuc/ieee754": { "version": "1.2.0", @@ -28065,16 +28056,14 @@ "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", "dev": true, "peer": true, - "requires": { - } + "requires": {} }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "requires": { - } + "requires": {} }, "acorn-walk": { "version": "7.2.0", @@ -28462,8 +28451,7 @@ "version": "7.0.0-bridge.0", "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", - "requires": { - } + "requires": {} }, "babel-eslint": { "version": "10.1.0", @@ -30771,8 +30759,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz", "integrity": "sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==", "dev": true, - "requires": { - } + "requires": {} }, "eslint-plugin-import": { "version": "2.25.4", @@ -30899,8 +30886,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz", "integrity": "sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==", "dev": true, - "requires": { - } + "requires": {} }, "eslint-plugin-react-native-globals": { "version": "0.1.2", @@ -34542,8 +34528,7 @@ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", "dev": true, - "requires": { - } + "requires": {} }, "jest-regex-util": { "version": "27.4.0", @@ -35364,8 +35349,7 @@ "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", "dev": true, "peer": true, - "requires": { - } + "requires": {} } } }, @@ -35374,8 +35358,7 @@ "resolved": "https://registry.npmjs.org/jsdom-global/-/jsdom-global-3.0.2.tgz", "integrity": "sha1-a9KZwTsMRiay2iwDk81DhdYGrLk=", "dev": true, - "requires": { - } + "requires": {} }, "jsesc": { "version": "2.5.2", @@ -37378,9 +37361,9 @@ "integrity": "sha512-iniQP4rj1FhBdBYS/+eQv7j1tadJ9lJtdzgOpvsOHng/GbcDh2Fhdeq+ZRldrPYdXvCyfFUmFeEwEGXZB5I/AQ==" }, "moment": { - "version": "2.29.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz", - "integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==" + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" }, "moment-timezone": { "version": "0.5.34", @@ -38793,8 +38776,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/react-freeze/-/react-freeze-1.0.0.tgz", "integrity": "sha512-yQaiOqDmoKqks56LN9MTgY06O0qQHgV4FUrikH357DydArSZHQhl0BJFqGKIZoTqi8JizF9Dxhuk1FIZD6qCaw==", - "requires": { - } + "requires": {} }, "react-intl": { "version": "2.8.0", @@ -39002,8 +38984,7 @@ "version": "8.4.8", "resolved": "https://registry.npmjs.org/react-native-device-info/-/react-native-device-info-8.4.8.tgz", "integrity": "sha512-92676ZWHZHsPM/EW1ulgb2MuVfjYfMWRTWMbLcrCsipkcMaZ9Traz5mpsnCS7KZpsOksnvUinzDIjsct2XGc6Q==", - "requires": { - } + "requires": {} }, "react-native-document-picker": { "version": "8.0.0", @@ -39041,22 +39022,19 @@ "version": "2.10.10", "resolved": "https://registry.npmjs.org/react-native-exception-handler/-/react-native-exception-handler-2.10.10.tgz", "integrity": "sha512-otAXGoZDl1689OoUJWN/rXxVbdoZ3xcmyF1uq/CsizdLwwyZqVGd6d+p/vbYvnF996FfEyAEBnHrdFxulTn51w==", - "requires": { - } + "requires": {} }, "react-native-fast-image": { "version": "8.5.11", "resolved": "https://registry.npmjs.org/react-native-fast-image/-/react-native-fast-image-8.5.11.tgz", "integrity": "sha512-cNW4bIJg3nvKaheG8vGMfqCt5LMWX9MS5+wMudgKIHbGO51spRr4sgnlhVgwHLcZ5aeNOVJ8CPRxDIWKRq/0QA==", - "requires": { - } + "requires": {} }, "react-native-file-viewer": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/react-native-file-viewer/-/react-native-file-viewer-2.1.5.tgz", "integrity": "sha512-MGC6sx9jsqHdefhVQ6o0akdsPGpkXgiIbpygb2Sg4g4bh7v6K1cardLV1NwGB9A6u1yICOSDT/MOC//9Ez6EUg==", - "requires": { - } + "requires": {} }, "react-native-gesture-handler": { "version": "2.2.0", @@ -39074,42 +39052,36 @@ "version": "1.13.0", "resolved": "https://registry.npmjs.org/react-native-haptic-feedback/-/react-native-haptic-feedback-1.13.0.tgz", "integrity": "sha512-g8G5QURitDeC/zRlobDvUXLxKYfMlIM2HQNWJKbHPSu61qfs0djnK4s1NZuQzihkeAO0KJ4AS2XWvKBzUmlXtA==", - "requires": { - } + "requires": {} }, "react-native-hw-keyboard-event": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/react-native-hw-keyboard-event/-/react-native-hw-keyboard-event-0.0.4.tgz", "integrity": "sha512-G8qp0nm17PHigLb/axgdF9xg51BKCG2p1AGeq//J/luLp5zNczIcQJh+nm02R1MeEUE3e53wqO4LMe0MV3raZg==", - "requires": { - } + "requires": {} }, "react-native-image-picker": { "version": "4.7.3", "resolved": "https://registry.npmjs.org/react-native-image-picker/-/react-native-image-picker-4.7.3.tgz", "integrity": "sha512-eRKm4wlsmZHmsWFyv77kYc2F+ZyEVqe0m7mqhsMzWk6TQT4FBDtEDxmRDDFq+ivCu/1QD+EPhmYcAIpeGr7Ekg==", - "requires": { - } + "requires": {} }, "react-native-incall-manager": { "version": "git+ssh://git@github.com/cpoile/react-native-incall-manager.git#8c55b9dac0a2ab25d651fb54b504d384f9989b36", "from": "react-native-incall-manager@github:cpoile/react-native-incall-manager", - "requires": { - } + "requires": {} }, "react-native-keyboard-aware-scrollview": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/react-native-keyboard-aware-scrollview/-/react-native-keyboard-aware-scrollview-2.1.0.tgz", "integrity": "sha512-XfWozWFPhdecfxN+wuqERX3mCGDrAim5siC6TWg3Qw7wK/zlwIwe1UIsHDNOQCzf9oIh0SkZXvoOFsMrnyIVmQ==", - "requires": { - } + "requires": {} }, "react-native-keyboard-tracking-view": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/react-native-keyboard-tracking-view/-/react-native-keyboard-tracking-view-5.7.0.tgz", "integrity": "sha512-MDeEwAbn9LJDOfHq0QLCGaZirVLk2X/tHqkAqz3y6uxryTRdSl9PwleOVar5Jx2oAPEg4J9BXbUD1wwOOi+5Kg==", - "requires": { - } + "requires": {} }, "react-native-keychain": { "version": "8.0.0", @@ -39120,22 +39092,19 @@ "version": "2.5.6", "resolved": "https://registry.npmjs.org/react-native-linear-gradient/-/react-native-linear-gradient-2.5.6.tgz", "integrity": "sha512-HDwEaXcQIuXXCV70O+bK1rizFong3wj+5Q/jSyifKFLg0VWF95xh8XQgfzXwtq0NggL9vNjPKXa016KuFu+VFg==", - "requires": { - } + "requires": {} }, "react-native-local-auth": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/react-native-local-auth/-/react-native-local-auth-1.6.0.tgz", "integrity": "sha512-36cYGZGCG82pMiVJbQa5WMA93khP4v5JqLutFkMyB/eRpCULHmojNIBlbUPIY9SCeN4sg5VBRFTVGCtTg2r2kA==", - "requires": { - } + "requires": {} }, "react-native-localize": { "version": "2.1.9", "resolved": "https://registry.npmjs.org/react-native-localize/-/react-native-localize-2.1.9.tgz", "integrity": "sha512-n2Bi5P0cII8BrnG23Fs9PmpYcufD3JRbr1IBn3ArIA3Z3cGWg4eebv6am+CgdFC4kTPWUlVzX9fEgEMA+X8d6w==", - "requires": { - } + "requires": {} }, "react-native-math-view": { "version": "3.9.5", @@ -39152,8 +39121,7 @@ "version": "0.6.11", "resolved": "https://registry.npmjs.org/react-native-mmkv-storage/-/react-native-mmkv-storage-0.6.11.tgz", "integrity": "sha512-PaxUxbTwr+PHfzoYt6E1Mds9/CjV5uOFVstuBW0laFUWlGrTHgiaLWR8VwJt0EPScSl5Lz4RM8IiqmXbIUSbbw==", - "requires": { - } + "requires": {} }, "react-native-navigation": { "version": "7.25.1", @@ -39178,8 +39146,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/react-native-notifications/-/react-native-notifications-4.1.3.tgz", "integrity": "sha512-A4SmRyfh2OlkptlJQvcQKkfnBKO1toUShmFplTkLXPNCqfpm/i4Fz+Uv+LzHSvbsU5U7EYf3JX9sfuyR06ZGPg==", - "requires": { - } + "requires": {} }, "react-native-passcode-status": { "version": "1.1.2", @@ -39190,8 +39157,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/react-native-permissions/-/react-native-permissions-3.2.0.tgz", "integrity": "sha512-UPXxf2twjYL9vPI4HP2kT15AOTY489MhsNuyAgp+wJM2IRkkSVW6rO3k4WuSRL9ZmPhwkWb9bYjf8EEwRzZcXg==", - "requires": { - } + "requires": {} }, "react-native-ratings": { "version": "8.0.4", @@ -39249,8 +39215,7 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-3.3.2.tgz", "integrity": "sha512-yOwiiPJ1rk+/nfK13eafbpW6sKW0jOnsRem2C1LPJjM3tfTof6hlvV5eWHATye3XOpu2cJ7N+HdkUvUDGwFD2Q==", - "requires": { - } + "requires": {} }, "react-native-screens": { "version": "3.10.2", @@ -39275,8 +39240,7 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/react-native-size-matters/-/react-native-size-matters-0.3.1.tgz", "integrity": "sha512-mKOfBLIBFBcs9br1rlZDvxD5+mAl8Gfr5CounwJtxI6Z82rGrMO+Kgl9EIg3RMVf3G855a85YVqHJL2f5EDRlw==", - "requires": { - } + "requires": {} }, "react-native-slider": { "version": "0.11.0", @@ -39290,8 +39254,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/react-native-startup-time/-/react-native-startup-time-2.0.0.tgz", "integrity": "sha512-tYruEDvwoVEOf+FMTTqp3aHNfA5ARWXXV+ar4wJBIQBdIlPEYDQWaYljOAV2dITuTsKAyPY2Q/N58gkKvGWIrA==", - "requires": { - } + "requires": {} }, "react-native-svg": { "version": "12.1.1", @@ -39656,8 +39619,7 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/redux-batched-actions/-/redux-batched-actions-0.5.0.tgz", "integrity": "sha512-6orZWyCnIQXMGY4DUGM0oj0L7oYnwTACsfsru/J7r94RM3P9eS7SORGpr3LCeRCMoIMQcpfKZ7X4NdyFHBS8Eg==", - "requires": { - } + "requires": {} }, "redux-mock-store": { "version": "1.5.4", @@ -39672,8 +39634,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/redux-persist/-/redux-persist-6.0.0.tgz", "integrity": "sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ==", - "requires": { - } + "requires": {} }, "redux-persist-node-storage": { "version": "2.0.0", @@ -39702,8 +39663,7 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.1.tgz", "integrity": "sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q==", - "requires": { - } + "requires": {} }, "reflect.ownkeys": { "version": "0.2.0", @@ -40046,8 +40006,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/rn-placeholder/-/rn-placeholder-3.0.3.tgz", "integrity": "sha512-EmVeLT8zDcTPilQZ2OHO/IiYUy2gApKGgbshDZBX0C4qxsn0cFATwgwOwyz8O7Vwg1Hul97Ci95hu7d6Js6XMQ==", - "requires": { - } + "requires": {} }, "rst-selector-parser": { "version": "2.2.3", @@ -40363,8 +40322,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, - "requires": { - } + "requires": {} }, "json-schema-traverse": { "version": "0.4.1", @@ -41431,8 +41389,7 @@ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, "peer": true, - "requires": { - } + "requires": {} }, "json-schema-traverse": { "version": "0.4.1", @@ -42160,8 +42117,7 @@ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, "peer": true, - "requires": { - } + "requires": {} }, "json-schema-traverse": { "version": "0.4.1", @@ -42435,8 +42391,7 @@ "version": "7.5.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", - "requires": { - } + "requires": {} }, "xcode": { "version": "3.0.1", From 23785709a8ddf121bafc2660c380e62d93912ed8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Aug 2022 23:09:55 -0400 Subject: [PATCH 06/37] Bump terser from 5.10.0 to 5.14.2 (#6492) --- package-lock.json | 162 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 129 insertions(+), 33 deletions(-) diff --git a/package-lock.json b/package-lock.json index c0649deda..808173e93 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2862,6 +2862,70 @@ "node": ">=8" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true, + "peer": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@mattermost/react-native-paste-input": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/@mattermost/react-native-paste-input/-/react-native-paste-input-0.3.6.tgz", @@ -22515,14 +22579,15 @@ } }, "node_modules/terser": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", - "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", + "version": "5.14.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", + "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", "dev": true, "peer": true, "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", "source-map-support": "~0.5.20" }, "bin": { @@ -22530,14 +22595,6 @@ }, "engines": { "node": ">=10" - }, - "peerDependencies": { - "acorn": "^8.5.0" - }, - "peerDependenciesMeta": { - "acorn": { - "optional": true - } } }, "node_modules/terser-webpack-plugin": { @@ -22645,16 +22702,6 @@ "dev": true, "peer": true }, - "node_modules/terser/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -26017,6 +26064,61 @@ } } }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "peer": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "peer": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "peer": true + }, + "@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "peer": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true, + "peer": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "dev": true, + "peer": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@mattermost/react-native-paste-input": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/@mattermost/react-native-paste-input/-/react-native-paste-input-0.3.6.tgz", @@ -41329,14 +41431,15 @@ } }, "terser": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", - "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", + "version": "5.14.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", + "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", "dev": true, "peer": true, "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", "source-map-support": "~0.5.20" }, "dependencies": { @@ -41346,13 +41449,6 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, "peer": true - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true, - "peer": true } } }, From 8cbf57781b8e1e079c9971d1061acaae055a359a Mon Sep 17 00:00:00 2001 From: Jean-Paul Manuel Date: Thu, 4 Aug 2022 17:30:06 +0400 Subject: [PATCH 07/37] [MM-41749] Fixed SettingsSidebar component added back to navigation stack (#6503) Co-authored-by: Jean-Paul Manuel --- app/mattermost.js | 22 ++++++++++------------ app/store/ephemeral_store.js | 2 +- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/app/mattermost.js b/app/mattermost.js index 5c3047a77..537dbc1a4 100644 --- a/app/mattermost.js +++ b/app/mattermost.js @@ -140,18 +140,16 @@ export function componentDidDisappearListener({componentId}) { if (componentId === 'MainSidebar') { EventEmitter.emit(NavigationTypes.MAIN_SIDEBAR_DID_CLOSE); - } - - if (componentId === THREAD) { - if (EphemeralStore.hasModalsOpened()) { - for (const modal of EphemeralStore.navigationModalStack) { - const enableSwipe = { - modal: { - swipeToDismiss: true, - }, - }; - Navigation.mergeOptions(modal, enableSwipe); - } + } else if (componentId === 'SettingsSidebar') { + EventEmitter.emit(NavigationTypes.CLOSE_SETTINGS_SIDEBAR); + } else if (componentId === THREAD && EphemeralStore.hasModalsOpened()) { + for (const modal of EphemeralStore.navigationModalStack) { + const enableSwipe = { + modal: { + swipeToDismiss: true, + }, + }; + Navigation.mergeOptions(modal, enableSwipe); } } } diff --git a/app/store/ephemeral_store.js b/app/store/ephemeral_store.js index 912ce2e7e..4283340a3 100644 --- a/app/store/ephemeral_store.js +++ b/app/store/ephemeral_store.js @@ -41,7 +41,7 @@ class EphemeralStore { addToNavigationComponentIdStack = (componentId) => { const index = this.navigationComponentIdStack.indexOf(componentId); - if (index > 0) { + if (index >= 0) { this.navigationComponentIdStack.slice(index, 1); } From 0165e2ab1f1e518ab706d3d2cd0971693ea32727 Mon Sep 17 00:00:00 2001 From: Jason Frerich Date: Thu, 4 Aug 2022 14:28:27 -0500 Subject: [PATCH 08/37] [MM-38103] initialize select fields with the value (#5640) Co-authored-by: Mattermod --- app/screens/apps_form/apps_form_field.tsx | 29 ++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/app/screens/apps_form/apps_form_field.tsx b/app/screens/apps_form/apps_form_field.tsx index 55ba20e2e..14b6cfafb 100644 --- a/app/screens/apps_form/apps_form_field.tsx +++ b/app/screens/apps_form/apps_form_field.tsx @@ -52,7 +52,34 @@ export default class AppsFormField extends React.PureComponent { constructor(props: Props) { super(props); - this.state = {}; + let selected; + switch (props.field.type) { + case AppFieldTypes.STATIC_SELECT: + case AppFieldTypes.DYNAMIC_SELECT: + case AppFieldTypes.USER: + case AppFieldTypes.CHANNEL: { + const value = props.value as AppSelectOption[] | AppSelectOption | null; + if (value) { + if (Array.isArray(value)) { + selected = value.map((option) => { + return { + text: option.label, + value: option.value, + }; + }); + } else { + selected = { + text: value.label, + value: value.value, + }; + } + } + } + } + + this.state = { + selected, + }; } handleAutocompleteSelect = (selected: DialogOption) => { From 6119ac46e1c5ebe7c3624617e4358e61e0b5423a Mon Sep 17 00:00:00 2001 From: Elias Nahum Date: Thu, 11 Aug 2022 08:52:15 -0400 Subject: [PATCH 09/37] Bump app build number to 418 (#6564) --- android/app/build.gradle | 2 +- ios/Mattermost.xcodeproj/project.pbxproj | 4 ++-- ios/Mattermost/Info.plist | 2 +- ios/MattermostShare/Info.plist | 2 +- ios/NotificationService/Info.plist | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 5207833ae..8c925b81f 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -131,7 +131,7 @@ android { applicationId "com.mattermost.rnbeta" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 416 + versionCode 418 versionName "1.55.0" multiDexEnabled = true testBuildType System.getProperty('testBuildType', 'debug') diff --git a/ios/Mattermost.xcodeproj/project.pbxproj b/ios/Mattermost.xcodeproj/project.pbxproj index 9c279ef31..2f5d2630a 100644 --- a/ios/Mattermost.xcodeproj/project.pbxproj +++ b/ios/Mattermost.xcodeproj/project.pbxproj @@ -911,7 +911,7 @@ CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 416; + CURRENT_PROJECT_VERSION = 418; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = UQ8HT4Q2XM; ENABLE_BITCODE = NO; @@ -953,7 +953,7 @@ CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 416; + CURRENT_PROJECT_VERSION = 418; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = UQ8HT4Q2XM; ENABLE_BITCODE = NO; diff --git a/ios/Mattermost/Info.plist b/ios/Mattermost/Info.plist index 2a5c9a57c..269497aae 100644 --- a/ios/Mattermost/Info.plist +++ b/ios/Mattermost/Info.plist @@ -37,7 +37,7 @@ CFBundleVersion - 416 + 418 ITSAppUsesNonExemptEncryption LSRequiresIPhoneOS diff --git a/ios/MattermostShare/Info.plist b/ios/MattermostShare/Info.plist index ff7d294d6..eca63846f 100644 --- a/ios/MattermostShare/Info.plist +++ b/ios/MattermostShare/Info.plist @@ -21,7 +21,7 @@ CFBundleShortVersionString 1.55.0 CFBundleVersion - 416 + 418 NSAppTransportSecurity NSAllowsArbitraryLoads diff --git a/ios/NotificationService/Info.plist b/ios/NotificationService/Info.plist index 33a7e48b2..135e98bd1 100644 --- a/ios/NotificationService/Info.plist +++ b/ios/NotificationService/Info.plist @@ -21,7 +21,7 @@ CFBundleShortVersionString 1.55.0 CFBundleVersion - 416 + 418 NSExtension NSExtensionPointIdentifier From 19c6ae86ebb460c8cfda14fa804355cc23b110ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Espino=20Garc=C3=ADa?= Date: Fri, 12 Aug 2022 23:09:23 +0200 Subject: [PATCH 10/37] Fix convert channel to private (#6568) --- app/client/rest/channels.ts | 7 +------ app/mm-redux/actions/channels.test.js | 2 +- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/app/client/rest/channels.ts b/app/client/rest/channels.ts index 2f2d0fee3..10d293590 100644 --- a/app/client/rest/channels.ts +++ b/app/client/rest/channels.ts @@ -119,12 +119,7 @@ const ClientChannels = (superclass: any) => class extends superclass { }; convertChannelToPrivate = async (channelId: string) => { - analytics.trackAPI('api_channels_convert_to_private', {channel_id: channelId}); - - return this.doFetch( - `${this.getChannelRoute(channelId)}/convert`, - {method: 'post'}, - ); + return this.updateChannelPrivacy(channelId, 'P'); }; updateChannelPrivacy = async (channelId: string, privacy: any) => { diff --git a/app/mm-redux/actions/channels.test.js b/app/mm-redux/actions/channels.test.js index 6eff3d4fa..c76b82b3f 100644 --- a/app/mm-redux/actions/channels.test.js +++ b/app/mm-redux/actions/channels.test.js @@ -277,7 +277,7 @@ describe('Actions.Channels', () => { it('convertChannelToPrivate', async () => { const publicChannel = TestHelper.basicChannel; nock(Client4.getChannelRoute(publicChannel.id)). - post('/convert'). + put('/privacy'). reply(200, {...TestHelper.basicChannel, type: General.PRIVATE_CHANNEL}); assert.equal(TestHelper.basicChannel.type, General.OPEN_CHANNEL); From d13a787049b37661d01eae40e73acd0e9db4a5b2 Mon Sep 17 00:00:00 2001 From: Carrie Warner Date: Tue, 9 Aug 2022 22:16:31 +0200 Subject: [PATCH 11/37] Deleted translation using Weblate (Catalan) --- assets/base/i18n/ca.json | 1 - 1 file changed, 1 deletion(-) delete mode 100644 assets/base/i18n/ca.json diff --git a/assets/base/i18n/ca.json b/assets/base/i18n/ca.json deleted file mode 100644 index 0967ef424..000000000 --- a/assets/base/i18n/ca.json +++ /dev/null @@ -1 +0,0 @@ -{} From c1936040c384652beaaa966b059d0b61dcbb18a5 Mon Sep 17 00:00:00 2001 From: Michael Kochell <6913320+mickmister@users.noreply.github.com> Date: Tue, 23 Aug 2022 12:33:48 -0400 Subject: [PATCH 12/37] MM-33993 Allow apps form and interactive dialogs to clear select fields (#5398) * allow apps form and int dialogs to clear select fields * don't show x if the field is disabled * change down chevron to right chevron * increase padding around close x to increase touch area * positioning * remove chevron and divider * use hitSlop instead of padding. fix position of x * lint * types * update type * lint * make onClear optional * optional chaining * set multiselect value to empty array on clear * include null in type * useCallback improvement * fix clearing multi-selected items state issue * fix clearing multi-selected items state issue * lint Co-authored-by: Mattermod --- .../autocomplete_selector.tsx | 62 ++++++++++++++----- .../action_menu/action_menu.tsx | 6 +- app/mm-redux/types/apps.ts | 2 +- app/screens/apps_form/apps_form_field.tsx | 14 ++++- .../interactive_dialog/dialog_element.js | 8 +++ 5 files changed, 72 insertions(+), 20 deletions(-) diff --git a/app/components/autocomplete_selector/autocomplete_selector.tsx b/app/components/autocomplete_selector/autocomplete_selector.tsx index d1c7f2cf2..08283494f 100644 --- a/app/components/autocomplete_selector/autocomplete_selector.tsx +++ b/app/components/autocomplete_selector/autocomplete_selector.tsx @@ -32,12 +32,13 @@ type Props = { placeholder?: string; dataSource?: string; options?: DialogOption[]; - selected?: DialogOption | DialogOption[]; + selected?: DialogOption | DialogOption[] | null; optional?: boolean; showRequiredAsterisk?: boolean; teammateNameDisplay?: string; theme: Theme; onSelected?: ((item: DialogOption) => void) | ((item: DialogOption[]) => void); + onClear?: () => void; helpText?: string; errorText?: string; roundedBorders?: boolean; @@ -47,7 +48,7 @@ type Props = { type State = { selectedText: string; - selected?: DialogOption | DialogOption[]; + selected?: DialogOption | DialogOption[] | null; } export default class AutocompleteSelector extends PureComponent { @@ -70,7 +71,15 @@ export default class AutocompleteSelector extends PureComponent { } static getDerivedStateFromProps(props: Props, state: State) { - if (!props.selected || props.selected === state.selected) { + if (props.selected === state.selected) { + return null; + } + + if (!props.selected) { + if (state.selected) { + return {selected: props.selected}; + } + return null; } @@ -99,6 +108,11 @@ export default class AutocompleteSelector extends PureComponent { }; } + handleClear = () => { + this.setState({selectedText: ''}); + this.props.onClear?.(); + }; + handleSelect = (selected: Selection) => { if (!selected) { return; @@ -230,14 +244,14 @@ export default class AutocompleteSelector extends PureComponent { showRequiredAsterisk, roundedBorders, disabled, + selected, + onClear, } = this.props; const {selectedText} = this.state; const style = getStyleSheet(theme); const textStyles = getMarkdownTextStyles(theme); const blockStyles = getMarkdownBlockStyles(theme); - const chevron = Platform.select({ios: 'chevron-right', default: 'chevron-down'}); - let text = placeholder || intl.formatMessage({id: 'mobile.action_menu.select', defaultMessage: 'Select an option'}); let selectedStyle = style.dropdownPlaceholder; @@ -326,11 +340,21 @@ export default class AutocompleteSelector extends PureComponent { > {text} - + {!disabled && onClear && selected && ( + + + + )} {helpTextContent} @@ -366,18 +390,21 @@ const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => { dropdownPlaceholder: { top: 3, marginLeft: 5, + paddingRight: 55, color: changeOpacity(theme.centerChannelColor, 0.5), }, dropdownSelected: { top: 3, marginLeft: 5, + paddingRight: 55, color: theme.centerChannelColor, }, - icon: { + clearx: { position: 'absolute', - top: 6, - right: 12, - fontSize: 28, + top: 1, + right: 5, + padding: 8, + marginRight: 7, }, labelContainer: { flexDirection: 'row', @@ -419,3 +446,10 @@ const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => { }, }; }); + +const clearXHitSlop = { + left: 30, + right: 20, + top: 20, + bottom: 20, +}; diff --git a/app/components/post_list/post/body/content/message_attachments/action_menu/action_menu.tsx b/app/components/post_list/post/body/content/message_attachments/action_menu/action_menu.tsx index e9f06b39b..b8db54960 100644 --- a/app/components/post_list/post/body/content/message_attachments/action_menu/action_menu.tsx +++ b/app/components/post_list/post/body/content/message_attachments/action_menu/action_menu.tsx @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import React from 'react'; +import React, {useCallback} from 'react'; import AutocompleteSelector from '@components/autocomplete_selector'; import {PostActionOption} from '@mm-redux/types/integration_actions'; @@ -28,13 +28,13 @@ const ActionMenu = ({dataSource, defaultOption, disabled, id, name, options, pos isSelected = selected; } - const handleSelect = (selectedItem?: PostActionOption) => { + const handleSelect = useCallback((selectedItem?: PostActionOption) => { if (!selectedItem) { return; } selectAttachmentMenuAction(postId, id, selectedItem.text, selectedItem.value); - }; + }, [postId, id]); return ( void; + onChange: (name: string, value: AppFormValue) => void; performLookup: (name: string, userInput: string) => Promise; } type State = { - selected?: DialogOption | DialogOption[]; + selected?: DialogOption | DialogOption[] | null; } const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => { @@ -100,6 +100,15 @@ export default class AppsFormField extends React.PureComponent { this.props.onChange(field.name, selectedOption); }; + handleClear = () => { + const {field, onChange} = this.props; + + const selected = null; + + this.setState({selected}); + onChange(field.name, selected); + }; + handleMultioptionAutocompleteSelect = (selected: DialogOption[]) => { if (!selected) { return; @@ -237,6 +246,7 @@ export default class AppsFormField extends React.PureComponent { dataSource={dataSource} options={options} optional={!field.is_required} + onClear={this.handleClear} onSelected={field.multiselect ? this.handleMultioptionAutocompleteSelect : this.handleAutocompleteSelect} getDynamicOptions={this.getDynamicOptions} helpText={field.description} diff --git a/app/screens/interactive_dialog/dialog_element.js b/app/screens/interactive_dialog/dialog_element.js index 17bb9761c..fa7c3f3c7 100644 --- a/app/screens/interactive_dialog/dialog_element.js +++ b/app/screens/interactive_dialog/dialog_element.js @@ -54,6 +54,13 @@ export default class DialogElement extends PureComponent { onChange(name, newValue); }; + handleClear = () => { + const {name, onChange} = this.props; + + this.setState({selected: null}); + onChange(name, null); + }; + handleAutocompleteSelect = (selected) => { if (!selected) { return; @@ -134,6 +141,7 @@ export default class DialogElement extends PureComponent { options={options} optional={optional} onSelected={this.handleAutocompleteSelect} + onClear={this.handleClear} helpText={helpText} errorText={errorText} placeholder={placeholder} From 2cbee12d1135e4e5fb65b7123445613005ebf1d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=84=D0=B2=D0=B3=D0=B5=D0=BD=D1=96=D0=B9=20=D0=AF=D0=BD?= =?UTF-8?q?=D1=87=D0=B5=D0=B2=D1=81=D1=8C=D0=BA=D0=B8=D0=B9?= Date: Mon, 5 Sep 2022 18:03:28 +0200 Subject: [PATCH 13/37] Translated using Weblate (Ukrainian) Currently translated at 76.3% (604 of 791 strings) Translation: mattermost-languages-shipped/mattermost-mobile Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile_master/uk/ --- assets/base/i18n/uk.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/assets/base/i18n/uk.json b/assets/base/i18n/uk.json index 88d220724..77854066f 100644 --- a/assets/base/i18n/uk.json +++ b/assets/base/i18n/uk.json @@ -11,7 +11,15 @@ "about.teamEditiont1": "Enterprise Edition", "about.title": "Про {appTitle}", "announcment_banner.dont_show_again": "Не показувати знову", + "api.channel.add_guest.added": "{addedUsername} доданий до каналу під гостьовим ім'ям {username}.", "api.channel.add_member.added": "{addedUsername} додано до каналу за {username}.", + "api.channel.guest_join_channel.post_and_forget": "{username} приєднався до каналу як гість.", + "apps.error": "Помилка:{error}", + "apps.error.command.field_missing": "Обов'язкові поля відсутні:`{fieldName}`.", + "apps.error.command.same_channel": "Канал повторюється для поля `{fieldName}`: `{option}`.", + "apps.error.command.same_option": "Опція повторюється для поля `{fieldName}`: `{option}`.", + "apps.error.command.same_user": "Користувач повторюється для поля `{fieldName}`: `{option}`.", + "apps.error.command.unknown_channel": "Невідомий канал для поля `{fieldName}`: `{option}`.", "archivedChannelMessage": "Ви переглядаєте **архівований канал**. Нові повідомлення не можуть бути опубліковані.", "center_panel.archived.closeChannel": "Закрити канал", "channel.channelHasGuests": "У цому каналі є гості", From cd01c460461a385aedab2413e6e43fb84a813ece Mon Sep 17 00:00:00 2001 From: Kaya Zeren Date: Mon, 5 Sep 2022 18:03:28 +0200 Subject: [PATCH 14/37] Translated using Weblate (Turkish) Currently translated at 100.0% (791 of 791 strings) Translation: mattermost-languages-shipped/mattermost-mobile Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile_master/tr/ Translated using Weblate (Turkish) Currently translated at 100.0% (791 of 791 strings) Translation: mattermost-languages-shipped/mattermost-mobile Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile_master/tr/ --- assets/base/i18n/tr.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/assets/base/i18n/tr.json b/assets/base/i18n/tr.json index 3112b8bb1..93adaf960 100644 --- a/assets/base/i18n/tr.json +++ b/assets/base/i18n/tr.json @@ -1,14 +1,14 @@ { "about.date": "Yapım tarihi:", - "about.enterpriseEditionLearn": "Enterprise sürüm hakkında şuradan ayrıntılı bilgi alabilirsiniz ", + "about.enterpriseEditionLearn": "Enterprise paketi hakkında ayrıntılı bilgiyi şuradan alabilirsiniz ", "about.enterpriseEditionSt": "Güvenlik duvarının arkasından modern iletişim.", - "about.enterpriseEditione1": "Enterprise sürümü", + "about.enterpriseEditione1": "Enterprise paketi", "about.hash": "Yapım karması:", - "about.hashee": "Enterprise sürüm yapım karması:", + "about.hashee": "Enterprise tarifesi yapım karması:", "about.teamEditionLearn": "Mattermost topluluğuna katılın: ", "about.teamEditionSt": "Tüm takım iletişimi tek bir yerde, anında aranabilir ve her yerden erişilebilir.", - "about.teamEditiont0": "Team sürümü", - "about.teamEditiont1": "Enterprise sürümü", + "about.teamEditiont0": "Team paketi", + "about.teamEditiont1": "Enterprise paketi", "about.title": "{appTitle} hakkında", "announcment_banner.dont_show_again": "Yeniden görüntülenmesin", "api.channel.add_guest.added": "{addedUsername}, {username} tarafından konuk olarak kanala eklendi.", @@ -595,7 +595,7 @@ "mobile.server_link.unreachable_user.error": "Bu bağlantı silinmiş bir kullanıcıya ait.", "mobile.server_ssl.error.text": "{host} sertifikası güvenilir değil.\n\nLütfen sertifika sorunlarını çözerek bu sunucu ile bağlantı kurulabilmesini sağlaması için sistem yöneticiniz ile görüşün.", "mobile.server_ssl.error.title": "Güvenli olmayan sertifika", - "mobile.server_upgrade.alert_description": "Bu sunucu sürümü desteklenmediğinden, kullanıcılar uyumluluk sorunlarından kaynaklanan çökmeler ya da uygulamanın temel işlevselliğini bozan ciddi sorunlar ile karşılaşacak. Sunucu sürümünün {serverVersion} ya da üzerindeki bir sürüme yükseltilmesi gerekli.", + "mobile.server_upgrade.alert_description": "Bu sunucu sürümü desteklenmediğinden, kullanıcılar uyumluluk sorunlarından kaynaklanan çökmeler ya da uygulamanın temel işlevselliğini bozan ciddi sorunlar ile karşılaşacak. Sunucunun {serverVersion} ya da üzerindeki bir sürüme güncellenmesi gerekli.", "mobile.server_upgrade.button": "Tamam", "mobile.server_upgrade.dismiss": "Kapat", "mobile.server_upgrade.learn_more": "Ayrıntılı bilgi alın", @@ -636,7 +636,7 @@ "mobile.timezone_settings.manual": "Saat dilimini değiştir", "mobile.timezone_settings.select": "Saat dilimini seçin", "mobile.tos_link": "Hizmet koşulları", - "mobile.unsupported_server.message": "Ek dosyalar, bağlantı ön izlemeleri, tepkiler ve gömülü veriler doğru görüntülenmeyebilir. Bu sorun sürerse sistem yöneticinize Mattermost sürümünü yükseltmesi gerektiğini bildirin.", + "mobile.unsupported_server.message": "Ek dosyalar, bağlantı ön izlemeleri, tepkiler ve gömülü veriler doğru görüntülenmeyebilir. Bu sorun sürerse sistem yöneticinize Mattermost sunucusunu güncellemesi gerektiğini bildirin.", "mobile.unsupported_server.ok": "Tamam", "mobile.unsupported_server.title": "Sunucu sürümü desteklenmiyor", "mobile.user.settings.notifications.email.fifteenMinutes": "15 dakikada bir", From 44e69a421fb4a1aeb62e812fed8a80fa5615989d Mon Sep 17 00:00:00 2001 From: jprusch Date: Mon, 5 Sep 2022 18:03:28 +0200 Subject: [PATCH 15/37] Translated using Weblate (German) Currently translated at 99.8% (790 of 791 strings) Translation: mattermost-languages-shipped/mattermost-mobile Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile_master/de/ Translated using Weblate (German) Currently translated at 100.0% (791 of 791 strings) Translation: mattermost-languages-shipped/mattermost-mobile Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile_master/de/ Translated using Weblate (German) Currently translated at 100.0% (791 of 791 strings) Translation: mattermost-languages-shipped/mattermost-mobile Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile_master/de/ --- assets/base/i18n/de.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/assets/base/i18n/de.json b/assets/base/i18n/de.json index 287de637d..bbeac4aef 100644 --- a/assets/base/i18n/de.json +++ b/assets/base/i18n/de.json @@ -96,7 +96,7 @@ "channel_modal.headerHelp": "Der Text, der in der Kopfzeile des Kanals neben dem Namen steht. Zum Beispiel könntest Du häufig genutzte Links durch Hinzufügen von [Link Titel](http://example.de) anzeigen lassen.", "channel_modal.name": "Name", "channel_modal.nameEx": "Z.B.: \"Bugs\", \"Marketing\", \"客户支持\"", - "channel_modal.optional": "(wahlweise)", + "channel_modal.optional": "(optional)", "channel_modal.purpose": "Zweck", "channel_modal.purposeEx": "Z.B.: \"Ein Kanal um Fehler und Verbesserungsvorschläge abzulegen\"", "channel_modal.type.private": "Privater Kanal", @@ -115,7 +115,7 @@ "combined_system_message.added_to_channel.two": "{firstUser} und {secondUser} wurden durch {actor} **zum Kanal hinzugefügt**.", "combined_system_message.added_to_team.many_expanded": "{users} und {lastUser} wurden durch {actor} **zum Team hinzugefügt**.", "combined_system_message.added_to_team.one": "{firstUser} wurde durch {actor} **zum Team hinzugefügt**.", - "combined_system_message.added_to_team.one_you": "Du wurden durch {actor} **zum Team hinzugefügt**.", + "combined_system_message.added_to_team.one_you": "Du wurdest durch {actor} **zum Team hinzugefügt**.", "combined_system_message.added_to_team.two": "{firstUser} und {secondUser} wurden durch {actor} **zum Team hinzugefügt**.", "combined_system_message.joined_channel.many_expanded": "{users} und {lastUser} **sind dem Kanal beigetreten**.", "combined_system_message.joined_channel.one": "{firstUser} **ist dem Kanal beigetreten**.", @@ -683,11 +683,11 @@ "permalink.show_dialog_warn.description": "Du bist dabei, \"{channel}\" beizutreten ohne explizit durch den Kanaladministrator hinzugefügt worden zu sein. Bist Du sicher, dass du diesem privaten Kanal beitreten willst?", "permalink.show_dialog_warn.join": "Beitreten", "permalink.show_dialog_warn.title": "Privatem Kanal beitreten", - "post_body.check_for_out_of_channel_groups_mentions.message": "wurde durch diese Erwähnung nicht benachrichtigt, da sich der Benutzer nicht im Kanal befindet. Er kann dem Kanal nicht hinzugefügt werden, da er nicht Mitglied der verknüpften Gruppen ist. Um ihn zu diesem Kanal hinzuzufügen, muss er zu den verknüpften Gruppen hinzugefügt werden.", + "post_body.check_for_out_of_channel_groups_mentions.message": "wurde durch diese Erwähnung nicht benachrichtigt, da sie sich nicht im Kanal befinden. Sie sind auch keine Mitglieder der mit diesem Kanal verknüpften Gruppen.", "post_body.check_for_out_of_channel_mentions.link.and": " und ", "post_body.check_for_out_of_channel_mentions.link.private": "sie zu diesem privaten Kanal hinzufügen", - "post_body.check_for_out_of_channel_mentions.link.public": "sie zu diesem Kanal hinzufügen", - "post_body.check_for_out_of_channel_mentions.message.multiple": "wurde durch diese Erwähnung nicht benachrichtigt, da der Benutzer sich nicht im Kanal befindet. Möchtest Du ", + "post_body.check_for_out_of_channel_mentions.link.public": "ihn/sie zu diesem Kanal hinzufügen", + "post_body.check_for_out_of_channel_mentions.message.multiple": "wurden erwähnt, sind aber nicht im Kanal. Möchtest Du ", "post_body.check_for_out_of_channel_mentions.message.one": "wurde durch diese Erwähnung nicht benachrichtigt, da der Benutzer sich nicht im Kanal befindet. Möchtest Du ", "post_body.check_for_out_of_channel_mentions.message_last": "? Sie werden Zugriff auf den Nachrichtenverlauf haben.", "post_body.commentedOn": "Kommentierte auf {name}{apostrophe} Nachricht: ", From 2534685fdccaa89a6a823b2817c5017ff323b7b6 Mon Sep 17 00:00:00 2001 From: Tom De Moor Date: Mon, 5 Sep 2022 18:03:29 +0200 Subject: [PATCH 16/37] Translated using Weblate (Dutch) Currently translated at 100.0% (791 of 791 strings) Translation: mattermost-languages-shipped/mattermost-mobile Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile_master/nl/ --- assets/base/i18n/nl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/base/i18n/nl.json b/assets/base/i18n/nl.json index 1ebe856b9..6930dd15a 100644 --- a/assets/base/i18n/nl.json +++ b/assets/base/i18n/nl.json @@ -141,7 +141,7 @@ "combined_system_message.removed_from_team.one": "{firstUser} werd **verwijderd uit het team**.", "combined_system_message.removed_from_team.one_you": "Je werd **verwijderd uit het team**.", "combined_system_message.removed_from_team.two": "{firstUser} en {secondUser} werden **verwijderd van het team**.", - "combined_system_message.you": "Jij", + "combined_system_message.you": "jou", "create_comment.addComment": "Voeg commentaar toe...", "create_post.deactivated": "Je bekijkt een gearchiveerd kanaal met een gedeactiveerde gebruiker.", "create_post.write": "Schrijven naar {channelDisplayName}", From 149ebd6a154f3267199b6db724716d79c65d07eb Mon Sep 17 00:00:00 2001 From: Elias Nahum Date: Wed, 7 Sep 2022 09:09:03 -0300 Subject: [PATCH 17/37] Bump version to 1.55.1 build 423 (#6625) * Bump app version number to 1.55.1 * Bump app build number to 423 --- android/app/build.gradle | 4 +- fastlane/Gemfile.lock | 18 +-- ios/Mattermost.xcodeproj/project.pbxproj | 4 +- ios/Mattermost/Info.plist | 4 +- ios/MattermostShare/Info.plist | 4 +- ios/NotificationService/Info.plist | 4 +- package-lock.json | 137 +++++++++++++++-------- package.json | 2 +- 8 files changed, 111 insertions(+), 66 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 8c925b81f..ec5900125 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -131,8 +131,8 @@ android { applicationId "com.mattermost.rnbeta" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 418 - versionName "1.55.0" + versionCode 423 + versionName "1.55.1" multiDexEnabled = true testBuildType System.getProperty('testBuildType', 'debug') testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' diff --git a/fastlane/Gemfile.lock b/fastlane/Gemfile.lock index 07bb7f5ef..c90dd6bc5 100644 --- a/fastlane/Gemfile.lock +++ b/fastlane/Gemfile.lock @@ -3,13 +3,13 @@ GEM specs: CFPropertyList (3.0.5) rexml - addressable (2.8.0) - public_suffix (>= 2.0.2, < 5.0) + addressable (2.8.1) + public_suffix (>= 2.0.2, < 6.0) artifactory (3.0.15) atomos (0.1.3) aws-eventstream (1.2.0) - aws-partitions (1.614.0) - aws-sdk-core (3.131.5) + aws-partitions (1.626.0) + aws-sdk-core (3.141.0) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.525.0) aws-sigv4 (~> 1.1) @@ -37,7 +37,7 @@ GEM dotenv (2.8.1) emoji_regex (3.2.3) excon (0.92.4) - faraday (1.10.0) + faraday (1.10.2) faraday-em_http (~> 1.0) faraday-em_synchrony (~> 1.0) faraday-excon (~> 1.1) @@ -66,7 +66,7 @@ GEM faraday_middleware (1.2.0) faraday (~> 1.0) fastimage (2.2.6) - fastlane (2.208.0) + fastlane (2.209.1) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) @@ -134,7 +134,7 @@ GEM google-cloud-env (1.6.0) faraday (>= 0.17.3, < 3.0) google-cloud-errors (1.2.0) - google-cloud-storage (1.38.0) + google-cloud-storage (1.39.0) addressable (~> 2.8) digest-crc (~> 0.4) google-apis-iamcredentials_v1 (~> 0.1) @@ -155,7 +155,7 @@ GEM httpclient (2.8.3) jmespath (1.6.1) json (2.6.2) - jwt (2.4.1) + jwt (2.5.0) memoist (0.16.2) mini_magick (4.11.0) mini_mime (1.1.2) @@ -170,7 +170,7 @@ GEM optparse (0.1.1) os (1.1.4) plist (3.6.0) - public_suffix (4.0.7) + public_suffix (5.0.0) racc (1.6.0) rake (13.0.6) representable (3.2.0) diff --git a/ios/Mattermost.xcodeproj/project.pbxproj b/ios/Mattermost.xcodeproj/project.pbxproj index 2f5d2630a..2e90177e1 100644 --- a/ios/Mattermost.xcodeproj/project.pbxproj +++ b/ios/Mattermost.xcodeproj/project.pbxproj @@ -911,7 +911,7 @@ CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 418; + CURRENT_PROJECT_VERSION = 423; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = UQ8HT4Q2XM; ENABLE_BITCODE = NO; @@ -953,7 +953,7 @@ CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 418; + CURRENT_PROJECT_VERSION = 423; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = UQ8HT4Q2XM; ENABLE_BITCODE = NO; diff --git a/ios/Mattermost/Info.plist b/ios/Mattermost/Info.plist index 269497aae..9da6b10e3 100644 --- a/ios/Mattermost/Info.plist +++ b/ios/Mattermost/Info.plist @@ -21,7 +21,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.55.0 + 1.55.1 CFBundleSignature ???? CFBundleURLTypes @@ -37,7 +37,7 @@ CFBundleVersion - 418 + 423 ITSAppUsesNonExemptEncryption LSRequiresIPhoneOS diff --git a/ios/MattermostShare/Info.plist b/ios/MattermostShare/Info.plist index eca63846f..a5e3a9463 100644 --- a/ios/MattermostShare/Info.plist +++ b/ios/MattermostShare/Info.plist @@ -19,9 +19,9 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 1.55.0 + 1.55.1 CFBundleVersion - 418 + 423 NSAppTransportSecurity NSAllowsArbitraryLoads diff --git a/ios/NotificationService/Info.plist b/ios/NotificationService/Info.plist index 135e98bd1..3371184c3 100644 --- a/ios/NotificationService/Info.plist +++ b/ios/NotificationService/Info.plist @@ -19,9 +19,9 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 1.55.0 + 1.55.1 CFBundleVersion - 418 + 423 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index 808173e93..15a325df8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "mattermost-mobile", - "version": "1.55.0", + "version": "1.55.1", "lockfileVersion": 2, "requires": true, "packages": { @@ -26123,7 +26123,8 @@ "version": "0.3.6", "resolved": "https://registry.npmjs.org/@mattermost/react-native-paste-input/-/react-native-paste-input-0.3.6.tgz", "integrity": "sha512-/XwUkWfkXDPv1/N+3sILKRoqa4sElqN/fADQzkC2KHYxVKN72297vMm8s+X1n2l+y7phNQ8ZmhjjL0ghuz/1og==", - "requires": {} + "requires": { + } }, "@msgpack/msgpack": { "version": "2.7.1", @@ -26175,7 +26176,8 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/@react-native-community/cameraroll/-/cameraroll-4.1.2.tgz", "integrity": "sha512-jkdhMByMKD2CZ/5MPeBieYn8vkCfC4MOTouPpBpps3I8N6HUYJk+1JnDdktVYl2WINnqXpQptDA2YptVyifYAg==", - "requires": {} + "requires": { + } }, "@react-native-community/cli": { "version": "6.4.0", @@ -26925,7 +26927,8 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/@react-native-community/clipboard/-/clipboard-1.5.1.tgz", "integrity": "sha512-AHAmrkLEH5UtPaDiRqoULERHh3oNv7Dgs0bTC0hO5Z2GdNokAMPT5w8ci8aMcRemcwbtdHjxChgtjbeA38GBdA==", - "requires": {} + "requires": { + } }, "@react-native-community/datetimepicker": { "version": "5.1.0", @@ -27030,7 +27033,8 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-22.4.1.tgz", "integrity": "sha512-gcLfn6P2PrFAVx3AobaOzlIEevpAEf9chTpFZz7bYfc7pz8XRv7vuKTIE4hxPKZSha6XWKKplDQ0x9Pq8xX2mg==", "dev": true, - "requires": {} + "requires": { + } }, "eslint-plugin-react-native": { "version": "3.11.0", @@ -27060,13 +27064,15 @@ "version": "0.1.11", "resolved": "https://registry.npmjs.org/@react-native-community/masked-view/-/masked-view-0.1.11.tgz", "integrity": "sha512-rQfMIGSR/1r/SyN87+VD8xHHzDYeHaJq6elOSCAD+0iLagXkSI2pfA0LmSXP21uw5i3em7GkkRjfJ8wpqWXZNw==", - "requires": {} + "requires": { + } }, "@react-native-community/netinfo": { "version": "7.1.9", "resolved": "https://registry.npmjs.org/@react-native-community/netinfo/-/netinfo-7.1.9.tgz", "integrity": "sha512-xxbxFherpOjQeJm3rIx6gmZNEEBqVDIcmBII5QVSN8zf3xAwmaT/RxT74ISYDkeSlZwv4eegpkD4QA1ky52CNg==", - "requires": {} + "requires": { + } }, "@react-native-cookies/cookies": { "version": "6.0.11", @@ -27107,7 +27113,8 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-1.3.0.tgz", "integrity": "sha512-C0roIxajvleskEpeYYJ1+2XTg8UqZO6o/SyzqTRuEUVsVD8CbFzKSOfj9kpfzA7jbYNzZPbzUJcm9kIigY9kHg==", - "requires": {} + "requires": { + } }, "@react-navigation/native": { "version": "6.0.7", @@ -28057,7 +28064,8 @@ "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", "dev": true, - "requires": {} + "requires": { + } }, "@webpack-cli/info": { "version": "1.4.1", @@ -28073,7 +28081,8 @@ "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", "dev": true, - "requires": {} + "requires": { + } }, "@xtuc/ieee754": { "version": "1.2.0", @@ -28158,14 +28167,16 @@ "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", "dev": true, "peer": true, - "requires": {} + "requires": { + } }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "requires": {} + "requires": { + } }, "acorn-walk": { "version": "7.2.0", @@ -28553,7 +28564,8 @@ "version": "7.0.0-bridge.0", "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", - "requires": {} + "requires": { + } }, "babel-eslint": { "version": "10.1.0", @@ -30861,7 +30873,8 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz", "integrity": "sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==", "dev": true, - "requires": {} + "requires": { + } }, "eslint-plugin-import": { "version": "2.25.4", @@ -30988,7 +31001,8 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz", "integrity": "sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==", "dev": true, - "requires": {} + "requires": { + } }, "eslint-plugin-react-native-globals": { "version": "0.1.2", @@ -34630,7 +34644,8 @@ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", "dev": true, - "requires": {} + "requires": { + } }, "jest-regex-util": { "version": "27.4.0", @@ -35451,7 +35466,8 @@ "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", "dev": true, "peer": true, - "requires": {} + "requires": { + } } } }, @@ -35460,7 +35476,8 @@ "resolved": "https://registry.npmjs.org/jsdom-global/-/jsdom-global-3.0.2.tgz", "integrity": "sha1-a9KZwTsMRiay2iwDk81DhdYGrLk=", "dev": true, - "requires": {} + "requires": { + } }, "jsesc": { "version": "2.5.2", @@ -38878,7 +38895,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/react-freeze/-/react-freeze-1.0.0.tgz", "integrity": "sha512-yQaiOqDmoKqks56LN9MTgY06O0qQHgV4FUrikH357DydArSZHQhl0BJFqGKIZoTqi8JizF9Dxhuk1FIZD6qCaw==", - "requires": {} + "requires": { + } }, "react-intl": { "version": "2.8.0", @@ -39086,7 +39104,8 @@ "version": "8.4.8", "resolved": "https://registry.npmjs.org/react-native-device-info/-/react-native-device-info-8.4.8.tgz", "integrity": "sha512-92676ZWHZHsPM/EW1ulgb2MuVfjYfMWRTWMbLcrCsipkcMaZ9Traz5mpsnCS7KZpsOksnvUinzDIjsct2XGc6Q==", - "requires": {} + "requires": { + } }, "react-native-document-picker": { "version": "8.0.0", @@ -39124,19 +39143,22 @@ "version": "2.10.10", "resolved": "https://registry.npmjs.org/react-native-exception-handler/-/react-native-exception-handler-2.10.10.tgz", "integrity": "sha512-otAXGoZDl1689OoUJWN/rXxVbdoZ3xcmyF1uq/CsizdLwwyZqVGd6d+p/vbYvnF996FfEyAEBnHrdFxulTn51w==", - "requires": {} + "requires": { + } }, "react-native-fast-image": { "version": "8.5.11", "resolved": "https://registry.npmjs.org/react-native-fast-image/-/react-native-fast-image-8.5.11.tgz", "integrity": "sha512-cNW4bIJg3nvKaheG8vGMfqCt5LMWX9MS5+wMudgKIHbGO51spRr4sgnlhVgwHLcZ5aeNOVJ8CPRxDIWKRq/0QA==", - "requires": {} + "requires": { + } }, "react-native-file-viewer": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/react-native-file-viewer/-/react-native-file-viewer-2.1.5.tgz", "integrity": "sha512-MGC6sx9jsqHdefhVQ6o0akdsPGpkXgiIbpygb2Sg4g4bh7v6K1cardLV1NwGB9A6u1yICOSDT/MOC//9Ez6EUg==", - "requires": {} + "requires": { + } }, "react-native-gesture-handler": { "version": "2.2.0", @@ -39154,36 +39176,42 @@ "version": "1.13.0", "resolved": "https://registry.npmjs.org/react-native-haptic-feedback/-/react-native-haptic-feedback-1.13.0.tgz", "integrity": "sha512-g8G5QURitDeC/zRlobDvUXLxKYfMlIM2HQNWJKbHPSu61qfs0djnK4s1NZuQzihkeAO0KJ4AS2XWvKBzUmlXtA==", - "requires": {} + "requires": { + } }, "react-native-hw-keyboard-event": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/react-native-hw-keyboard-event/-/react-native-hw-keyboard-event-0.0.4.tgz", "integrity": "sha512-G8qp0nm17PHigLb/axgdF9xg51BKCG2p1AGeq//J/luLp5zNczIcQJh+nm02R1MeEUE3e53wqO4LMe0MV3raZg==", - "requires": {} + "requires": { + } }, "react-native-image-picker": { "version": "4.7.3", "resolved": "https://registry.npmjs.org/react-native-image-picker/-/react-native-image-picker-4.7.3.tgz", "integrity": "sha512-eRKm4wlsmZHmsWFyv77kYc2F+ZyEVqe0m7mqhsMzWk6TQT4FBDtEDxmRDDFq+ivCu/1QD+EPhmYcAIpeGr7Ekg==", - "requires": {} + "requires": { + } }, "react-native-incall-manager": { "version": "git+ssh://git@github.com/cpoile/react-native-incall-manager.git#8c55b9dac0a2ab25d651fb54b504d384f9989b36", "from": "react-native-incall-manager@github:cpoile/react-native-incall-manager", - "requires": {} + "requires": { + } }, "react-native-keyboard-aware-scrollview": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/react-native-keyboard-aware-scrollview/-/react-native-keyboard-aware-scrollview-2.1.0.tgz", "integrity": "sha512-XfWozWFPhdecfxN+wuqERX3mCGDrAim5siC6TWg3Qw7wK/zlwIwe1UIsHDNOQCzf9oIh0SkZXvoOFsMrnyIVmQ==", - "requires": {} + "requires": { + } }, "react-native-keyboard-tracking-view": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/react-native-keyboard-tracking-view/-/react-native-keyboard-tracking-view-5.7.0.tgz", "integrity": "sha512-MDeEwAbn9LJDOfHq0QLCGaZirVLk2X/tHqkAqz3y6uxryTRdSl9PwleOVar5Jx2oAPEg4J9BXbUD1wwOOi+5Kg==", - "requires": {} + "requires": { + } }, "react-native-keychain": { "version": "8.0.0", @@ -39194,19 +39222,22 @@ "version": "2.5.6", "resolved": "https://registry.npmjs.org/react-native-linear-gradient/-/react-native-linear-gradient-2.5.6.tgz", "integrity": "sha512-HDwEaXcQIuXXCV70O+bK1rizFong3wj+5Q/jSyifKFLg0VWF95xh8XQgfzXwtq0NggL9vNjPKXa016KuFu+VFg==", - "requires": {} + "requires": { + } }, "react-native-local-auth": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/react-native-local-auth/-/react-native-local-auth-1.6.0.tgz", "integrity": "sha512-36cYGZGCG82pMiVJbQa5WMA93khP4v5JqLutFkMyB/eRpCULHmojNIBlbUPIY9SCeN4sg5VBRFTVGCtTg2r2kA==", - "requires": {} + "requires": { + } }, "react-native-localize": { "version": "2.1.9", "resolved": "https://registry.npmjs.org/react-native-localize/-/react-native-localize-2.1.9.tgz", "integrity": "sha512-n2Bi5P0cII8BrnG23Fs9PmpYcufD3JRbr1IBn3ArIA3Z3cGWg4eebv6am+CgdFC4kTPWUlVzX9fEgEMA+X8d6w==", - "requires": {} + "requires": { + } }, "react-native-math-view": { "version": "3.9.5", @@ -39223,7 +39254,8 @@ "version": "0.6.11", "resolved": "https://registry.npmjs.org/react-native-mmkv-storage/-/react-native-mmkv-storage-0.6.11.tgz", "integrity": "sha512-PaxUxbTwr+PHfzoYt6E1Mds9/CjV5uOFVstuBW0laFUWlGrTHgiaLWR8VwJt0EPScSl5Lz4RM8IiqmXbIUSbbw==", - "requires": {} + "requires": { + } }, "react-native-navigation": { "version": "7.25.1", @@ -39248,7 +39280,8 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/react-native-notifications/-/react-native-notifications-4.1.3.tgz", "integrity": "sha512-A4SmRyfh2OlkptlJQvcQKkfnBKO1toUShmFplTkLXPNCqfpm/i4Fz+Uv+LzHSvbsU5U7EYf3JX9sfuyR06ZGPg==", - "requires": {} + "requires": { + } }, "react-native-passcode-status": { "version": "1.1.2", @@ -39259,7 +39292,8 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/react-native-permissions/-/react-native-permissions-3.2.0.tgz", "integrity": "sha512-UPXxf2twjYL9vPI4HP2kT15AOTY489MhsNuyAgp+wJM2IRkkSVW6rO3k4WuSRL9ZmPhwkWb9bYjf8EEwRzZcXg==", - "requires": {} + "requires": { + } }, "react-native-ratings": { "version": "8.0.4", @@ -39317,7 +39351,8 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-3.3.2.tgz", "integrity": "sha512-yOwiiPJ1rk+/nfK13eafbpW6sKW0jOnsRem2C1LPJjM3tfTof6hlvV5eWHATye3XOpu2cJ7N+HdkUvUDGwFD2Q==", - "requires": {} + "requires": { + } }, "react-native-screens": { "version": "3.10.2", @@ -39342,7 +39377,8 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/react-native-size-matters/-/react-native-size-matters-0.3.1.tgz", "integrity": "sha512-mKOfBLIBFBcs9br1rlZDvxD5+mAl8Gfr5CounwJtxI6Z82rGrMO+Kgl9EIg3RMVf3G855a85YVqHJL2f5EDRlw==", - "requires": {} + "requires": { + } }, "react-native-slider": { "version": "0.11.0", @@ -39356,7 +39392,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/react-native-startup-time/-/react-native-startup-time-2.0.0.tgz", "integrity": "sha512-tYruEDvwoVEOf+FMTTqp3aHNfA5ARWXXV+ar4wJBIQBdIlPEYDQWaYljOAV2dITuTsKAyPY2Q/N58gkKvGWIrA==", - "requires": {} + "requires": { + } }, "react-native-svg": { "version": "12.1.1", @@ -39721,7 +39758,8 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/redux-batched-actions/-/redux-batched-actions-0.5.0.tgz", "integrity": "sha512-6orZWyCnIQXMGY4DUGM0oj0L7oYnwTACsfsru/J7r94RM3P9eS7SORGpr3LCeRCMoIMQcpfKZ7X4NdyFHBS8Eg==", - "requires": {} + "requires": { + } }, "redux-mock-store": { "version": "1.5.4", @@ -39736,7 +39774,8 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/redux-persist/-/redux-persist-6.0.0.tgz", "integrity": "sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ==", - "requires": {} + "requires": { + } }, "redux-persist-node-storage": { "version": "2.0.0", @@ -39765,7 +39804,8 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.1.tgz", "integrity": "sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q==", - "requires": {} + "requires": { + } }, "reflect.ownkeys": { "version": "0.2.0", @@ -40108,7 +40148,8 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/rn-placeholder/-/rn-placeholder-3.0.3.tgz", "integrity": "sha512-EmVeLT8zDcTPilQZ2OHO/IiYUy2gApKGgbshDZBX0C4qxsn0cFATwgwOwyz8O7Vwg1Hul97Ci95hu7d6Js6XMQ==", - "requires": {} + "requires": { + } }, "rst-selector-parser": { "version": "2.2.3", @@ -40424,7 +40465,8 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, - "requires": {} + "requires": { + } }, "json-schema-traverse": { "version": "0.4.1", @@ -41485,7 +41527,8 @@ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, "peer": true, - "requires": {} + "requires": { + } }, "json-schema-traverse": { "version": "0.4.1", @@ -42213,7 +42256,8 @@ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, "peer": true, - "requires": {} + "requires": { + } }, "json-schema-traverse": { "version": "0.4.1", @@ -42487,7 +42531,8 @@ "version": "7.5.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", - "requires": {} + "requires": { + } }, "xcode": { "version": "3.0.1", diff --git a/package.json b/package.json index 7e538b2c8..5aeb09187 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mattermost-mobile", - "version": "1.55.0", + "version": "1.55.1", "description": "Mattermost Mobile with React Native", "repository": "git@github.com:mattermost/mattermost-mobile.git", "author": "Mattermost, Inc.", From 7b8313929eba02433e631d1bbbf9f590ce780c55 Mon Sep 17 00:00:00 2001 From: MArtin Johnson Date: Sat, 10 Sep 2022 01:41:58 +0200 Subject: [PATCH 18/37] Translated using Weblate (Swedish) Currently translated at 100.0% (791 of 791 strings) Translation: mattermost-languages-shipped/mattermost-mobile Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile_master/sv/ --- assets/base/i18n/sv.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/base/i18n/sv.json b/assets/base/i18n/sv.json index 93a383419..32fc13848 100644 --- a/assets/base/i18n/sv.json +++ b/assets/base/i18n/sv.json @@ -141,7 +141,7 @@ "combined_system_message.removed_from_team.one": "{firstUser} **togs bort från kanalen**.", "combined_system_message.removed_from_team.one_you": "Du **togs bort från teamet**.", "combined_system_message.removed_from_team.two": "{firstUser} och {secondUser} **togs bort från teamet**.", - "combined_system_message.you": "Du", + "combined_system_message.you": "dig", "create_comment.addComment": "Lägg till en kommentar...", "create_post.deactivated": "Du visar en arkiverad kanal med ett avstängt användarkonto.", "create_post.write": "Skriv i kanalen {channelDisplayName}", From e873f84a244bc4ba55fb5c5488801f07c06cfb3b Mon Sep 17 00:00:00 2001 From: Ji-Hyeon Gim Date: Mon, 19 Sep 2022 18:03:36 +0200 Subject: [PATCH 19/37] Translated using Weblate (Korean) Currently translated at 99.8% (790 of 791 strings) Translation: mattermost-languages-shipped/mattermost-mobile Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile_master/ko/ --- assets/base/i18n/ko.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/base/i18n/ko.json b/assets/base/i18n/ko.json index 978523092..e48dc0005 100644 --- a/assets/base/i18n/ko.json +++ b/assets/base/i18n/ko.json @@ -700,7 +700,7 @@ "post_info.system": "시스템", "post_message_view.edited": "(수정됨)", "posts_view.newMsg": "새로운 메시지", - "rhs_thread.rootPostDeletedMessage.body": "이 글타래의 일부는 데이터 보존 정책으로 인해 삭제되었습니다. 더 이상 이 글타래에 회신할 수 없습니다.", + "rhs_thread.rootPostDeletedMessage.body": "이 글타래의 일부는 데이터 보존 정책으로 인해 삭제되었습니다. 더 이상 이 글타래에 응답 할 수 없습니다.", "search_bar.search": "검색", "search_header.results": "검색 결과", "search_header.title2": "최근 멘션", From ccdde858c7402620d2003d2b0757ea51d15682c5 Mon Sep 17 00:00:00 2001 From: Christopher Poile Date: Mon, 3 Oct 2022 13:10:23 -0400 Subject: [PATCH 20/37] handle candidate message (#6662) --- app/products/calls/connection.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/products/calls/connection.ts b/app/products/calls/connection.ts index 29f72f43b..008f4615c 100644 --- a/app/products/calls/connection.ts +++ b/app/products/calls/connection.ts @@ -203,7 +203,7 @@ export async function newClient(channelID: string, iceServers: ICEServersConfigs ws.on('message', ({data}) => { const msg = JSON.parse(data); - if (msg.type === 'answer' || msg.type === 'offer') { + if (msg.type === 'answer' || msg.type === 'candidate' || msg.type === 'offer') { peer?.signal(data); } }); From e0c2578c3711ee460898b0de90f56ae5150ce7c2 Mon Sep 17 00:00:00 2001 From: Dmitriy Danilov Date: Tue, 4 Oct 2022 01:48:02 +0200 Subject: [PATCH 21/37] Translated using Weblate (Ukrainian) Currently translated at 78.8% (624 of 791 strings) Translation: mattermost-languages-shipped/mattermost-mobile Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile_master/uk/ --- assets/base/i18n/uk.json | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/assets/base/i18n/uk.json b/assets/base/i18n/uk.json index 77854066f..b819e8165 100644 --- a/assets/base/i18n/uk.json +++ b/assets/base/i18n/uk.json @@ -40,6 +40,7 @@ "channel_loader.someone": "Хтось", "channel_members_modal.remove": "Видалити", "channel_modal.cancel": "Відміна", + "channel_modal.channelType": "Тип", "channel_modal.descriptionHelp": "Опишіть, як слід використовувати цей канал.", "channel_modal.header": "Заголовок", "channel_modal.headerEx": "Наприклад: \"[Тема посилання](http://example.com)\"", @@ -78,7 +79,7 @@ "combined_system_message.left_channel.one_you": "**залишив канал**.", "combined_system_message.left_channel.two": "{firstUser} і {secondUser} **залишив канал**. ", "combined_system_message.left_team.many_expanded": "{users} і {lastUser} **залишили команду**.", - "combined_system_message.left_team.one": "{firstUser} **залишає команду**. ", + "combined_system_message.left_team.one": "{firstUser} **залишає команду**.", "combined_system_message.left_team.one_you": "**залишив команду**.", "combined_system_message.left_team.two": "{firstUser} та {secondUser} **залишили команду**.", "combined_system_message.removed_from_channel.many_expanded": "{users} та {lastUser} **видалені з каналу**.", @@ -93,16 +94,26 @@ "create_comment.addComment": "Додати коментар...", "create_post.deactivated": "Ви переглядаєте архівований канал з деактивованим користувачем.", "create_post.write": "Написати у {channelDisplayName}", + "custom_status.expiry_dropdown.custom": "На вибір", + "custom_status.expiry_dropdown.today": "Сьогодні", + "custom_status.expiry_time.today": "Сьогодні", "date_separator.today": "Сьогодні", "date_separator.yesterday": "Вчора", "edit_post.editPost": "Редагувати повідомлення...", "edit_post.save": "Зберегти", + "emoji_picker.custom": "На вибір", + "emoji_picker.flags": "Прапори", + "emoji_picker.objects": "Об'єкти", + "emoji_picker.searchResults": "Результати пошуку", + "emoji_picker.symbols": "Символи", "file_upload.fileAbove": "Не можна завантажити файл більше {max} МВ: {filename}", + "friendly_date.yesterday": "Вчора", "gallery.download_file": "Завантажити файл", "gallery.footer.channel_name": "Поділилися в {channelName}", "gallery.open_file": "Відкрити файл", "gallery.unsuppored": "Попередній перегляд не підтримується для цього типу файлу", "get_post_link_modal.title": "Скопіювати посилання", + "global_threads.markAllRead.cancel": "Відміна", "integrations.add": "Додати", "intro_messages.anyMember": "Будь-який учасник може зайти і читати цей канал.", "intro_messages.beginning": "Початок {name}", @@ -160,7 +171,7 @@ "mobile.advanced_settings.delete_message": "\nДана дія приведе до очищення локальних даних і перезапуску програми.\n", "mobile.advanced_settings.delete_title": "Delete Documents & Data", "mobile.advanced_settings.timezone": "Часовий пояс ", - "mobile.advanced_settings.title": "Додаткові параметри ", + "mobile.advanced_settings.title": "Додаткові параметри", "mobile.alert_dialog.alertCancel": "Відміна", "mobile.android.back_handler_exit": "Повторно натисніть назад, щоб вийти", "mobile.android.photos_permission_denied_description": "Щоб завантажити зображення з вашої бібліотеки, будь-ласка, змініть налаштування вашого дозволу.", @@ -219,6 +230,7 @@ "mobile.create_channel.public": "Новий публічний канал", "mobile.create_post.read_only": "Цей канал доступний лише для читання", "mobile.custom_list.no_results": "Немає результатів", + "mobile.custom_status.modal_confirm": "Готово", "mobile.display_settings.sidebar": "Бічна панель ", "mobile.display_settings.theme": "Тема ", "mobile.document_preview.failed_description": "Під час відкриття документа сталася помилка. Будь-ласка, переконайтеся, що ви встановили програму перегляду {fileType} та повторіть спробу.\n", @@ -263,19 +275,24 @@ "mobile.files_paste.error_title": "Не вдалося вставити", "mobile.flagged_posts.empty_description": "Збережені повідомлення бачите лише ви. Позначте повідомлення для подальших дій або збережіть на потім, довго натискаючи повідомлення та вибираючи Зберегти в меню.", "mobile.flagged_posts.empty_title": "Ще немає збережених повідомлень", + "mobile.forms.select.done": "Готово", "mobile.gallery.title": "{index} з {total}", + "mobile.general.error.title": "Помилка", "mobile.help.title": "Допомога ", + "mobile.interactive_dialog.defaultSubmit": "Відправити", "mobile.intro_messages.DM": "Початок історії особистих повідомлень з {teammate}. Особисті повідомлення і файли доступні тут і не видно за межами цієї області.", "mobile.intro_messages.default_message": "Це перший канал, який бачить новий учасник групи - використовуйте його для направлення повідомлень, які повинні побачити всі.", "mobile.intro_messages.default_welcome": "Ласкаво просимо до {name}!", "mobile.ios.photos_permission_denied_description": "Щоб зберегти зображення та відео в бібліотеці, змініть налаштування вашого дозволу.", "mobile.ios.photos_permission_denied_title": "Потрібен доступ до фото-бібліотеки", "mobile.join_channel.error": "Ми не можемо підключитися до каналу {displayName}. Будь-ласка, перевірте підключення та спробуйте знову.", + "mobile.link.error.title": "Помилка", "mobile.loading_channels": "Завантаження списку каналів...", "mobile.loading_members": "Завантаження списку учасників...", "mobile.loading_options": "Параметри завантаження...", "mobile.loading_posts": "Завантаження повідомлень...", "mobile.login_options.choose_title": "Виберіть спосіб входу", + "mobile.mailTo.error.title": "Помилка", "mobile.managed.blocked_by": "Заблоковано {vendor}", "mobile.managed.exit": "Вхід", "mobile.managed.jailbreak": "Пристрої з Jailbroken не є довіреними {vendor}, вийдіть з програми.", @@ -341,6 +358,7 @@ "mobile.open_dm.error": "Ми не можемо підключитися до каналу {displayName}. Будь-ласка, перевірте підключення та спробуйте знову.", "mobile.open_gm.error": "Помилка з'єднання із групи з цими користувачами. Будь-ласка, перевірте підключення та спробуйте заново.", "mobile.open_unknown_channel.error": "Не вдається приєднатися до каналу. Скиньте кеш і спробуйте ще раз.", + "mobile.participants.you": "(Це ви)", "mobile.permission_denied_dismiss": "Не дозволяти", "mobile.permission_denied_retry": "Налаштування", "mobile.pinned_posts.empty_description": "Закріпіть важливі повідомлення, видимі для всього каналу. Довго натискайте повідомлення та виберіть Закріпити на каналі, щоб зберегти його тут.", @@ -370,7 +388,7 @@ "mobile.post_textbox.entire_channel.title": "Підтвердьте надсилання повідомлень на весь канал", "mobile.post_textbox.groups.title": "Confirm sending notifications to groups", "mobile.post_textbox.one_group.message.without_timezones": "Використовуючи {mention}, ви збираєтеся надіслати сповіщення {totalMembers} людям. Ви впевнені, що хочете це зробити?", - "mobile.post_textbox.uploadFailedDesc": "Деякі вкладення не змогли завантажити на сервер. Ви впевнені, що хочете опублікувати це повідомлення? ", + "mobile.post_textbox.uploadFailedDesc": "Деякі вкладення не змогли завантажити на сервер. Ви впевнені, що хочете опублікувати це повідомлення?", "mobile.post_textbox.uploadFailedTitle": "Вкладення несправності", "mobile.posts_view.moreMsg": "Більше нових повідомлень ", "mobile.prepare_file.failed_description": "Під час підготовки файлу сталася помилка. Будь ласка спробуйте ще раз.\n", @@ -416,6 +434,7 @@ "mobile.routes.sso": "Одиночна система входу", "mobile.routes.table": "Таблиця", "mobile.routes.thread": "{channelName} Деталі", + "mobile.routes.thread_crt": "Thread", "mobile.routes.thread_dm": "Прямий потік повідомлень", "mobile.routes.user_profile": "Профіль ", "mobile.routes.user_profile.edit": "Редагувати", @@ -518,6 +537,7 @@ "password_send.reset": "Скинути пароль ", "permalink.error.access": "Постійне посилання належить до видаленого повідомлення або до каналу, на який ви не маєте доступу.", "permalink.error.link_not_found": "Посилання не знайдено", + "permalink.show_dialog_warn.cancel": "Відміна", "post_body.check_for_out_of_channel_groups_mentions.message": "did not get notified by this mention because they are not in the channel. They cannot be added to the channel because they are not a member of the linked groups. To add them to this channel, they must be added to the linked groups.", "post_body.check_for_out_of_channel_mentions.link.and": "і", "post_body.check_for_out_of_channel_mentions.link.private": "додайте їх до цього приватного каналу", @@ -586,9 +606,10 @@ "user.settings.general.emailSamlCantUpdate": "Вхід здійснюється через GitLab. Електронна пошта не може бути оновлена. Електронна адреса, яку використовують для сповіщень, є {email}. ", "user.settings.general.field_handled_externally": "Це поле обробляється вашим провайдером входу. Якщо ви хочете це змінити,то потрібно це зробити через свого постачальника послуг входу.", "user.settings.general.firstName": "Ім'я ", - "user.settings.general.lastName": "Прізвище ", + "user.settings.general.lastName": "Прізвище", "user.settings.general.nickname": "Псевдонім", "user.settings.general.position": "Посада", + "user.settings.general.status": "Статус", "user.settings.general.username": "Ім'я користувача", "user.settings.modal.display": "Вигляд", "user.settings.modal.notifications": "Сповіщення ", From 8137241f1256abcc920da18d32c23cc43bc8c569 Mon Sep 17 00:00:00 2001 From: Elias Nahum Date: Thu, 13 Oct 2022 08:40:43 -0300 Subject: [PATCH 22/37] [V1] update deps (#6666) * v1 update dependencies * fix eslint * update ci node version * Fix detox and jest expect imports * update gradle memory settings * QA feedback * android executor xlarge Co-authored-by: Joseph Baylon --- .circleci/config.yml | 7 +- .eslintrc.json | 4 +- .flowconfig | 4 +- .gitignore | 10 +- android/app/build.gradle | 166 +- android/app/src/debug/AndroidManifest.xml | 2 +- .../debug/java/com/rn/ReactNativeFlipper.java | 5 +- android/app/src/main/AndroidManifest.xml | 10 +- .../MainApplicationReactNativeHost.java | 116 + .../components/MainComponentsRegistry.java | 36 + ...ApplicationTurboModuleManagerDelegate.java | 48 + .../rnbeta/CustomPushNotification.java | 3 +- .../rnbeta/CustomPushNotificationHelper.java | 26 +- .../com/mattermost/rnbeta/MainActivity.java | 59 +- .../mattermost/rnbeta/MainApplication.java | 118 +- .../NotificationReplyBroadcastReceiver.java | 3 +- android/app/src/main/jni/Android.mk | 48 + .../jni/MainApplicationModuleProvider.cpp | 24 + .../main/jni/MainApplicationModuleProvider.h | 16 + ...nApplicationTurboModuleManagerDelegate.cpp | 45 + ...ainApplicationTurboModuleManagerDelegate.h | 38 + .../src/main/jni/MainComponentsRegistry.cpp | 61 + .../app/src/main/jni/MainComponentsRegistry.h | 32 + android/app/src/main/jni/OnLoad.cpp | 11 + android/build.gradle | 21 +- android/gradle.properties | 18 +- android/gradle/wrapper/gradle-wrapper.jar | Bin 59203 -> 59536 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- android/gradlew | 269 +- android/settings.gradle | 7 + .../__snapshots__/badge.test.js.snap | 24 +- .../__snapshots__/fade.test.js.snap | 12 +- .../profile_picture_button.test.js.snap | 6 +- .../__snapshots__/swiper.test.js.snap | 8 +- .../announcement_banner.test.js.snap | 24 +- .../__snapshots__/at_mention.test.js.snap | 18 +- .../__snapshots__/index.test.js.snap | 4 +- app/components/autocomplete/autocomplete.js | 2 +- .../emoji_suggestion.test.js.snap | 12 +- .../slash_suggestion.test.tsx.snap | 16 +- .../app_slash_suggestion.test.tsx.snap | 10 +- .../slash_suggestion_item.tsx | 12 +- .../autocomplete_selector.tsx | 2 + .../__snapshots__/avatars.test.tsx.snap | 26 +- app/components/badge.js | 4 +- .../__snapshots__/channel_link.test.js.snap | 4 +- .../__snapshots__/channel_loader.test.js.snap | 150 +- .../__snapshots__/index.test.js.snap | 28 +- .../__snapshots__/user_list_test.test.js.snap | 76 +- .../__snapshots__/clear_button.test.tsx.snap | 8 +- .../custom_status_emoji.test.tsx.snap | 8 +- .../custom_status_expiry.test.tsx.snap | 12 +- .../custom_status_text.test.tsx.snap | 8 +- .../edit_channel_info.test.js.snap | 74 +- .../__snapshots__/emoji_picker.test.js.snap | 8404 ++++----- .../__snapshots__/error_text.test.js.snap | 8 +- .../__snapshots__/thread_footer.test.tsx.snap | 22 +- .../__snapshots__/thread_item.test.tsx.snap | 58 +- .../__snapshots__/index.test.tsx.snap | 52 +- .../global_threads/thread_list/index.tsx | 6 +- .../__snapshots__/index.test.tsx.snap | 14 +- .../load_more_posts/load_more_posts.js | 3 +- app/components/loading.js | 2 +- .../__snapshots__/markdown.test.js.snap | 16 +- .../hashtag/__snapshots__/index.test.js.snap | 2 +- .../latex_code_block.test.js.snap | 44 +- .../__snapshots__/latex_inline.test.js.snap | 28 +- .../__snapshots__/markdown_emoji.test.js.snap | 38 +- .../__snapshots__/markdown_table.test.js.snap | 34 +- .../markdown_table_image.tsx | 2 - app/components/markdown/transform.test.js | 44 - .../__snapshots__/post_draft.test.js.snap | 134 +- .../__snapshots__/archived.test.js.snap | 12 +- .../__snapshots__/post_input.test.js.snap | 2 +- .../__snapshots__/quick_actions.test.js.snap | 12 +- .../camera_quick_action.test.js.snap | 4 +- .../file_quick_action.test.js.snap | 4 +- .../image_quick_action.test.js.snap | 4 +- .../input_quick_action.test.js.snap | 2 +- .../__snapshots__/read_only.test.js.snap | 14 +- .../__snapshots__/send.test.js.snap | 16 +- .../__snapshots__/upload_item.test.js.snap | 12 +- .../__snapshots__/upload_remove.test.js.snap | 4 +- .../__snapshots__/post_list.test.js.snap | 14 +- .../__snapshots__/date_separator.test.js.snap | 124 +- .../more_messages_button.test.js.snap | 34 +- .../more_messages_button.tsx | 2 + .../attachment_footer.test.tsx.snap | 12 +- .../system_message_helpers.test.js.snap | 100 +- app/components/post_list/post_list.tsx | 10 +- .../progressive_image.test.js.snap | 44 +- .../radio_button_group.test.js.snap | 4 +- .../reaction_picker.test.js.snap | 44 +- .../__snapshots__/search_bar.test.js.snap | 34 +- .../__snapshots__/main_sidebar.test.js.snap | 2 +- .../__snapshots__/channel_item.test.js.snap | 226 +- .../__snapshots__/filtered_list.test.js.snap | 38 +- .../list/__snapshots__/list.test.js.snap | 28 +- .../sidebars/main/channels_list/list/index.js | 16 +- .../switch_teams_button.test.js.snap | 16 +- .../unread_indicator/unread_indicator.base.js | 2 +- .../teams_list_item.test.js.snap | 20 +- .../__snapshots__/drawer_item.test.js.snap | 46 +- .../settings_sidebar.test.js.snap | 10 +- .../slide_up_panel_indicator.test.js.snap | 4 +- app/components/tag.js | 3 +- .../__snapshots__/team_icon.test.js.snap | 14 +- .../__snapshots__/user_status.test.js.snap | 8 +- app/components/vector_icon.js | 4 +- .../__snapshots__/radio_setting.test.js.snap | 28 +- .../widgets/settings/bool_setting.tsx | 2 +- .../mattermost-managed.ios.js | 1 + .../entities/__snapshots__/apps.test.js.snap | 226 +- app/mm-redux/reducers/entities/posts.test.js | 2 - .../__snapshots__/call_avatar.test.js.snap | 30 +- .../__snapshots__/call_duration.test.js.snap | 2 +- .../floating_call_container.test.js.snap | 8 +- .../__snapshots__/call_message.test.js.snap | 60 +- .../__snapshots__/current_call.test.js.snap | 42 +- .../components/floating_call_container.tsx | 2 +- .../__snapshots__/join_call.test.js.snap | 18 +- app/products/calls/hooks.ts | 1 + .../__snapshots__/call_screen.test.js.snap | 390 +- .../__snapshots__/action.test.js.snap | 44 +- .../call_other_actions.test.js.snap | 6 +- .../__snapshots__/add_reaction.test.js.snap | 2 +- .../apps_form_component.test.tsx.snap | 50 +- .../dialog_introduction_text.test.tsx.snap | 58 +- .../apps_form/apps_form_component.test.tsx | 15 +- app/screens/apps_form/apps_form_component.tsx | 9 + app/screens/apps_form/apps_form_container.tsx | 3 + .../channel_nav_bar.test.js.snap | 37 +- ...ettings_sidebar_drawer_button.test.js.snap | 4 +- .../channel_search_button.test.js.snap | 8 +- .../__snapshots__/channel_title.test.js.snap | 100 +- .../main_sidebar_drawer_button.test.js.snap | 20 +- .../channel_post_list.test.js.snap | 10 +- .../__snapshots__/channel_info.test.js.snap | 250 +- .../channel_info_header.test.js.snap | 784 +- .../channel_info_row.test.js.snap | 14 +- .../__snapshots__/add_members.test.js.snap | 4 +- .../channel_info/add_members/add_members.tsx | 1 + .../__snapshots__/archive.test.js.snap | 8 +- app/screens/channel_info/archive/archive.tsx | 5 + .../convert_private.test.js.snap | 4 +- .../convert_private/convert_private.tsx | 6 + .../__snapshots__/edit_channel.test.js.snap | 4 +- .../edit_channel/edit_channel.tsx | 1 + .../__snapshots__/favorite.test.js.snap | 4 +- .../ignore_mentions.test.js.snap | 4 +- .../leave/__snapshots__/leave.test.js.snap | 16 +- app/screens/channel_info/leave/leave.tsx | 1 + .../__snapshots__/manage_members.test.js.snap | 10 +- .../manage_members/manage_members.tsx | 3 +- .../mute/__snapshots__/mute.test.js.snap | 4 +- .../notification_preference.test.js.snap | 2 +- .../notification_preference.tsx | 2 + .../pinned/__snapshots__/pinned.test.js.snap | 2 +- app/screens/channel_info/pinned/pinned.tsx | 3 +- .../channel_members.test.js.snap | 18 +- ...annel_notification_preference.test.js.snap | 40 +- .../custom_status_modal.test.tsx.snap | 56 +- .../custom_status_suggestion.test.tsx.snap | 26 +- .../clear_after_menu_item.test.tsx.snap | 22 +- .../clear_after_modal.test.tsx.snap | 12 +- .../date_time_selector.test.tsx.snap | 28 +- .../date_time_selector.tsx | 4 +- .../__snapshots__/edit_post.test.js.snap | 30 +- .../__snapshots__/edit_profile.test.js.snap | 2 +- .../error_teams_list.test.js.snap | 8 +- .../forgot_password.test.js.snap | 80 +- app/screens/gallery/gallery_viewer.tsx | 4 +- .../dialog_introduction_text.test.js.snap | 58 +- .../interactive_dialog.test.js.snap | 10 +- .../latex/__snapshots__/latex.test.js.snap | 66 +- .../__snapshots__/more_channels.test.js.snap | 22 +- .../__snapshots__/selected_users.test.js.snap | 34 +- app/screens/notification/index.tsx | 1 + .../options_modal_list.test.js.snap | 32 +- .../__snapshots__/permalink.test.js.snap | 26 +- .../__snapshots__/pinned_posts.test.js.snap | 26 +- .../__snapshots__/post_options.test.js.snap | 46 +- .../reaction_header.test.js.snap | 12 +- .../reaction_header_item.test.js.snap | 18 +- .../__snapshots__/reaction_list.test.js.snap | 38 +- .../__snapshots__/reaction_row.test.js.snap | 16 +- .../recent_mentions.test.js.snap | 20 +- .../__snapshots__/saved_posts.test.js.snap | 20 +- .../__snapshots__/modifier.test.js.snap | 14 +- .../__snapshots__/recent_item.test.js.snap | 6 +- .../search/__snapshots__/search.test.js.snap | 42 +- .../channel_display_name.test.js.snap | 12 +- .../search_result_post.test.js.snap | 2 +- .../__snapshots__/select_team.test.js.snap | 32 +- .../selector_screen.test.tsx.snap | 86 +- .../selected_options.test.tsx.snap | 16 +- .../selector_screen/selector_screen.tsx | 1 + .../display_settings.test.js.snap | 34 +- .../notification_settings.test.js.snap | 176 +- ...cation_settings_email.android.test.js.snap | 36 +- ...tification_settings_email.ios.test.js.snap | 14 +- ...on_settings_mentions_keywords.test.js.snap | 60 +- .../__snapshots__/sidebar.test.js.snap | 18 +- .../theme/__snapshots__/theme.test.js.snap | 30 +- .../select_timezone.test.js.snap | 16 +- app/screens/sso/index.tsx | 2 + .../terms_of_service.test.js.snap | 206 +- .../__snapshots__/thread.ios.test.js.snap | 22 +- .../thread_options.test.tsx.snap | 18 +- .../__snapshots__/user_profile.test.js.snap | 182 +- app/store/helpers.ts | 2 +- detox/e2e/support/server_api/ldap.js | 4 +- detox/e2e/support/server_api/system.js | 3 +- detox/e2e/support/server_api/team.js | 4 +- .../e2e/support/ui/component/autocomplete.js | 2 + .../e2e/support/ui/component/main_sidebar.js | 2 + .../e2e/support/ui/component/post_options.js | 2 + .../support/ui/component/settings_sidebar.js | 2 + detox/e2e/support/ui/screen/about.js | 2 + detox/e2e/support/ui/screen/add_reaction.js | 2 + .../support/ui/screen/advanced_settings.js | 2 + detox/e2e/support/ui/screen/channel.js | 2 + .../support/ui/screen/channel_add_members.js | 2 + detox/e2e/support/ui/screen/channel_info.js | 2 + .../e2e/support/ui/screen/channel_members.js | 2 + .../screen/channel_notification_preference.js | 2 + .../ui/screen/clock_display_settings.js | 2 + detox/e2e/support/ui/screen/create_channel.js | 2 + detox/e2e/support/ui/screen/custom_status.js | 2 + .../ui/screen/custom_status_clear_after.js | 1 + .../e2e/support/ui/screen/display_settings.js | 2 + detox/e2e/support/ui/screen/edit_channel.js | 2 + detox/e2e/support/ui/screen/edit_post.js | 2 + detox/e2e/support/ui/screen/edit_profile.js | 2 + .../e2e/support/ui/screen/general_settings.js | 2 + detox/e2e/support/ui/screen/login.js | 2 + detox/e2e/support/ui/screen/more_channels.js | 2 + .../support/ui/screen/more_direct_messages.js | 2 + detox/e2e/support/ui/screen/notification.js | 2 + .../ui/screen/notification_settings.js | 2 + .../ui/screen/notification_settings_email.js | 2 + .../ui/screen/notification_settings_mobile.js | 2 + detox/e2e/support/ui/screen/permalink.js | 2 + .../e2e/support/ui/screen/pinned_messages.js | 2 + detox/e2e/support/ui/screen/reaction_list.js | 2 + .../e2e/support/ui/screen/recent_mentions.js | 2 + detox/e2e/support/ui/screen/saved_messages.js | 3 +- detox/e2e/support/ui/screen/search.js | 2 + detox/e2e/support/ui/screen/select_team.js | 2 + detox/e2e/support/ui/screen/table.js | 2 + detox/e2e/support/ui/screen/thread.js | 2 + detox/e2e/support/ui/screen/user_profile.js | 2 + detox/e2e/support/utils/email.js | 3 +- .../account_settings/advanced_settings.e2e.js | 2 + .../account_settings/clock_display.e2e.js | 1 + .../account_settings/language_settings.e2e.js | 2 + .../test/account_settings/user_profile.e2e.js | 2 + detox/e2e/test/autocomplete/at_mention.e2e.js | 2 + .../e2e/test/autocomplete/autocomplete.e2e.js | 2 + .../e2e/test/autocomplete/edit_channel.e2e.js | 2 + detox/e2e/test/autocomplete/edit_post.e2e.js | 2 + detox/e2e/test/autocomplete/post_draft.e2e.js | 2 + detox/e2e/test/autocomplete/search.e2e.js | 2 + detox/e2e/test/bot_account/bot_account.e2e.js | 2 + .../remove_user_from_channel.e2e.js | 2 + .../channel_add_members.e2e.js | 2 + .../test/channel_settings/channel_info.e2e.js | 2 + .../channel_view_members.e2e.js | 2 + .../test/channels/archived_channels.e2e.js | 2 + detox/e2e/test/channels/channels_list.e2e.js | 2 + .../channels/create_public_channel.e2e.js | 4 +- .../e2e/test/channels/direct_messages.e2e.js | 2 + .../test/channels/favorite_channels.e2e.js | 2 + detox/e2e/test/channels/group_messages.e2e.js | 2 + .../test/custom_statuses/custom_status.e2e.js | 2 + .../custom_status_expiry.e2e.js | 1 + .../disable_upload.e2e.js | 2 + .../enable_upload.e2e.js | 2 + .../guest_account/guest_experience.e2e.js | 2 + .../e2e/test/main_sidebar/main_sidebar.e2e.js | 2 + detox/e2e/test/messaging/at_mention.e2e.js | 2 + detox/e2e/test/messaging/channel_link.e2e.js | 2 + .../messaging/emojis_and_reactions.e2e.js | 2 + detox/e2e/test/messaging/hashtags.e2e.js | 2 + detox/e2e/test/messaging/mark_as_read.e2e.js | 4 +- .../e2e/test/messaging/mark_as_unread.e2e.js | 2 + .../messaging/markdown_block_quote.e2e.js | 2 + .../test/messaging/markdown_separator.e2e.js | 2 + .../e2e/test/messaging/markdown_table.e2e.js | 2 + .../test/messaging/message_deletion.e2e.js | 2 + detox/e2e/test/messaging/message_draft.e2e.js | 2 + detox/e2e/test/messaging/message_edit.e2e.js | 2 + .../e2e/test/messaging/message_posting.e2e.js | 1 + detox/e2e/test/messaging/message_reply.e2e.js | 2 + detox/e2e/test/messaging/permalink.e2e.js | 2 + .../e2e/test/messaging/pinned_messages.e2e.js | 2 + .../e2e/test/messaging/recent_mentions.e2e.js | 2 + .../e2e/test/messaging/saved_messages.e2e.js | 2 + detox/e2e/test/messaging/scrolling.e2e.js | 2 + .../tap_send_button_repeatedly.e2e.js | 4 +- ...ping_channel_url_link_joins_channel.e2e.js | 2 + .../channel_notification_default.e2e.js | 2 + .../channel_notification_preference.e2e.js | 2 + .../notifications/in_app_notification.e2e.js | 2 + .../test/notifications/mention_badges.e2e.js | 2 + .../test/signin_authentication/login.e2e.js | 2 + .../select_server.e2e.js | 2 + detox/e2e/test/smoke_test/about.e2e.js | 2 + detox/e2e/test/smoke_test/add_reaction.e2e.js | 2 + .../test/smoke_test/advanced_settings.e2e.js | 2 + .../smoke_test/channel_add_members.e2e.js | 2 + .../smoke_test/channel_manage_members.e2e.js | 2 + detox/e2e/test/smoke_test/channels.e2e.js | 2 + .../e2e/test/smoke_test/clock_display.e2e.js | 1 + .../test/smoke_test/direct_messages.e2e.js | 2 + detox/e2e/test/smoke_test/edit_channel.e2e.js | 2 + .../smoke_test/email_notifications.e2e.js | 4 +- .../test/smoke_test/favorite_channels.e2e.js | 2 + .../e2e/test/smoke_test/group_messages.e2e.js | 2 + .../e2e/test/smoke_test/mention_badges.e2e.js | 2 + .../test/smoke_test/message_deletion.e2e.js | 2 + detox/e2e/test/smoke_test/message_edit.e2e.js | 2 + .../test/smoke_test/message_posting.e2e.js | 1 + .../e2e/test/smoke_test/message_reply.e2e.js | 2 + .../e2e/test/smoke_test/mute_channels.e2e.js | 2 + .../test/smoke_test/private_channels.e2e.js | 2 + .../test/smoke_test/public_channels.e2e.js | 2 + .../test/smoke_test/recent_mentions.e2e.js | 2 + .../e2e/test/smoke_test/saved_messages.e2e.js | 2 + detox/e2e/test/smoke_test/search.e2e.js | 2 + detox/e2e/test/smoke_test/select_team.e2e.js | 2 + detox/e2e/test/smoke_test/teams.e2e.js | 2 + .../test/smoke_test/unread_channels.e2e.js | 2 + detox/e2e/test/smoke_test/user_status.e2e.js | 2 + detox/e2e/test/teams/select_team.e2e.js | 2 + detox/package-lock.json | 6548 ++++--- detox/package.json | 26 +- eslint/eslint-mattermost.json | 505 + eslint/eslint-react.json | 123 + ios/.xcode.env | 10 + ios/Gemfile | 2 +- ios/Gemfile.lock | 31 +- ios/Mattermost.xcodeproj/project.pbxproj | 204 +- .../xcschemes/Mattermost.xcscheme | 2 +- .../{AppDelegate.m => AppDelegate.mm} | 119 +- ios/Mattermost/main.m | 3 +- ios/Podfile | 27 +- ios/Podfile.lock | 789 +- .../project.pbxproj | 4 +- package-lock.json | 14295 +++++++++------- package.json | 179 +- ...eact-native-community+netinfo+9.3.4.patch} | 0 ...rstack+rudder-sdk-react-native+1.1.1.patch | 13 - ...rstack+rudder-sdk-react-native+1.5.1.patch | 27 + patches/jail-monkey+2.6.0.patch | 13 - patches/jail-monkey+2.7.0.patch | 21 + ...0.67.2.patch => react-native+0.69.6.patch} | 98 +- patches/react-native-button+3.0.1.patch | 33 +- ... => react-native-device-info+10.2.1.patch} | 0 ...ch => react-native-fast-image+8.6.1.patch} | 0 ...react-native-haptic-feedback+1.14.0.patch} | 0 patches/react-native-keychain+8.0.0.patch | 62 - patches/react-native-keychain+8.1.1.patch | 169 + patches/react-native-local-auth+1.6.0.patch | 10 +- .../react-native-mmkv-storage+0.6.11.patch | 30 - patches/react-native-mmkv-storage+0.8.0.patch | 30 + patches/react-native-navigation+7.25.1.patch | 150 - patches/react-native-navigation+7.29.0.patch | 125 + ...=> react-native-notifications+4.3.1.patch} | 239 +- patches/react-native-reanimated+2.10.0.patch | 60 + patches/react-native-slider+0.11.0.patch | 46 + ....1.patch => react-native-svg+13.3.0.patch} | 16 +- ... => react-native-vector-icons+9.2.0.patch} | 0 patches/react-native-youtube+2.0.2.patch | 31 +- test/setup.js | 5 +- 375 files changed, 21357 insertions(+), 18670 deletions(-) create mode 100644 android/app/src/main/java/com/mattermost/newarchitecture/MainApplicationReactNativeHost.java create mode 100644 android/app/src/main/java/com/mattermost/newarchitecture/components/MainComponentsRegistry.java create mode 100644 android/app/src/main/java/com/mattermost/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate.java create mode 100644 android/app/src/main/jni/Android.mk create mode 100644 android/app/src/main/jni/MainApplicationModuleProvider.cpp create mode 100644 android/app/src/main/jni/MainApplicationModuleProvider.h create mode 100644 android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.cpp create mode 100644 android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.h create mode 100644 android/app/src/main/jni/MainComponentsRegistry.cpp create mode 100644 android/app/src/main/jni/MainComponentsRegistry.h create mode 100644 android/app/src/main/jni/OnLoad.cpp create mode 100644 eslint/eslint-mattermost.json create mode 100644 eslint/eslint-react.json create mode 100644 ios/.xcode.env rename ios/Mattermost/{AppDelegate.m => AppDelegate.mm} (66%) rename patches/{@react-native-community+netinfo+7.1.9.patch => @react-native-community+netinfo+9.3.4.patch} (100%) delete mode 100644 patches/@rudderstack+rudder-sdk-react-native+1.1.1.patch create mode 100644 patches/@rudderstack+rudder-sdk-react-native+1.5.1.patch delete mode 100644 patches/jail-monkey+2.6.0.patch create mode 100644 patches/jail-monkey+2.7.0.patch rename patches/{react-native+0.67.2.patch => react-native+0.69.6.patch} (51%) rename patches/{react-native-device-info+8.4.8.patch => react-native-device-info+10.2.1.patch} (100%) rename patches/{react-native-fast-image+8.5.11.patch => react-native-fast-image+8.6.1.patch} (100%) rename patches/{react-native-haptic-feedback+1.13.0.patch => react-native-haptic-feedback+1.14.0.patch} (100%) delete mode 100644 patches/react-native-keychain+8.0.0.patch create mode 100644 patches/react-native-keychain+8.1.1.patch delete mode 100644 patches/react-native-mmkv-storage+0.6.11.patch create mode 100644 patches/react-native-mmkv-storage+0.8.0.patch delete mode 100644 patches/react-native-navigation+7.25.1.patch create mode 100644 patches/react-native-navigation+7.29.0.patch rename patches/{react-native-notifications+4.1.3.patch => react-native-notifications+4.3.1.patch} (69%) create mode 100644 patches/react-native-reanimated+2.10.0.patch create mode 100644 patches/react-native-slider+0.11.0.patch rename patches/{react-native-svg+12.1.1.patch => react-native-svg+13.3.0.patch} (69%) rename patches/{react-native-vector-icons+9.0.0.patch => react-native-vector-icons+9.2.0.patch} (100%) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9cfbb84ef..9b1814410 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,13 +1,13 @@ version: 2.1 orbs: owasp: entur/owasp@0.0.10 - node: circleci/node@4.5.1 + node: circleci/node@5.0.3 executors: android: parameters: resource_class: - default: large + default: xlarge type: string environment: NODE_OPTIONS: --max_old_space_size=12000 @@ -93,8 +93,7 @@ commands: description: "Get JavaScript dependencies" steps: - node/install: - node-version: '16.2.0' - install-npm: false + node-version: '16.15.0' - restore_cache: name: Restore npm cache key: v2-npm-{{ checksum "package.json" }}-{{ arch }} diff --git a/.eslintrc.json b/.eslintrc.json index 4c90e5998..2e8835ccf 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,13 +1,13 @@ { "extends": [ - "plugin:mattermost/react", + "./eslint/eslint-mattermost", + "./eslint/eslint-react", "plugin:@typescript-eslint/eslint-recommended", "plugin:@typescript-eslint/recommended" ], "parser": "@typescript-eslint/parser", "plugins": [ "@typescript-eslint", - "mattermost", "import" ], "settings": { diff --git a/.flowconfig b/.flowconfig index 53ab6fb5c..baad119d2 100644 --- a/.flowconfig +++ b/.flowconfig @@ -11,6 +11,8 @@ node_modules/react-native/Libraries/polyfills/.* ; Flow doesn't support platforms .*/Libraries/Utilities/LoadingView.js +.*/node_modules/resolve/test/resolver/malformed_package_json/package\.json$ + [untyped] .*/node_modules/@react-native-community/cli/.*/.* @@ -63,4 +65,4 @@ untyped-import untyped-type-import [version] -^0.162.0 +^0.176.3 diff --git a/.gitignore b/.gitignore index 0f8fa3058..5392a043e 100644 --- a/.gitignore +++ b/.gitignore @@ -32,8 +32,10 @@ DerivedData *.apk *.aab *.xcuserstate +ios/.xcode.env.local project.xcworkspace ios/Pods +/vendor/bundle/ .podinstall # Android/IntelliJ @@ -79,11 +81,11 @@ tags # For more information about the recommended setup visit: # https://docs.fastlane.tools/best-practices/source-control/ -*/fastlane/report.xml -*/fastlane/Preview.html -*/fastlane/screenshots +**/fastlane/report.xml +**/fastlane/Preview.html +**/fastlane/screenshots +**/fastlane/test_output fastlane/.env -fastlane/report.xml # Sentry android/sentry.properties diff --git a/android/app/build.gradle b/android/app/build.gradle index ec5900125..bb1e5e15f 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -120,9 +120,12 @@ def jscFlavor = 'org.webkit:android-jsc-intl:+' def enableHermes = project.ext.react.get("enableHermes", false); /** - * Architectures to build native code for in debug. + * Architectures to build native code for. */ -def nativeArchitectures = project.getProperties().get("reactNativeDebugArchitectures") +def reactNativeArchitectures() { + def value = project.getProperties().get("reactNativeArchitectures") + return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"] +} android { compileSdkVersion rootProject.ext.compileSdkVersion @@ -136,6 +139,78 @@ android { multiDexEnabled = true testBuildType System.getProperty('testBuildType', 'debug') testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' + buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString() + + if (isNewArchitectureEnabled()) { + // We configure the NDK build only if you decide to opt-in for the New Architecture. + externalNativeBuild { + ndkBuild { + arguments "APP_PLATFORM=android-21", + "APP_STL=c++_shared", + "NDK_TOOLCHAIN_VERSION=clang", + "GENERATED_SRC_DIR=$buildDir/generated/source", + "PROJECT_BUILD_DIR=$buildDir", + "REACT_ANDROID_DIR=$rootDir/../node_modules/react-native/ReactAndroid", + "REACT_ANDROID_BUILD_DIR=$rootDir/../node_modules/react-native/ReactAndroid/build", + "NODE_MODULES_DIR=$rootDir/../node_modules" + cFlags "-Wall", "-Werror", "-fexceptions", "-frtti", "-DWITH_INSPECTOR=1" + cppFlags "-std=c++17" + // Make sure this target name is the same you specify inside the + // src/main/jni/Android.mk file for the `LOCAL_MODULE` variable. + targets "rndiffapp_appmodules" + // Fix for windows limit on number of character in file paths and in command lines + if (Os.isFamily(Os.FAMILY_WINDOWS)) { + arguments "NDK_APP_SHORT_COMMANDS=true" + } + } + } + if (!enableSeparateBuildPerCPUArchitecture) { + ndk { + abiFilters (*reactNativeArchitectures()) + } + } + } + } + + if (isNewArchitectureEnabled()) { + // We configure the NDK build only if you decide to opt-in for the New Architecture. + externalNativeBuild { + ndkBuild { + path "$projectDir/src/main/jni/Android.mk" + } + } + def reactAndroidProjectDir = project(':ReactAndroid').projectDir + def packageReactNdkDebugLibs = tasks.register("packageReactNdkDebugLibs", Copy) { + dependsOn(":ReactAndroid:packageReactNdkDebugLibsForBuck") + from("$reactAndroidProjectDir/src/main/jni/prebuilt/lib") + into("$buildDir/react-ndk/exported") + } + def packageReactNdkReleaseLibs = tasks.register("packageReactNdkReleaseLibs", Copy) { + dependsOn(":ReactAndroid:packageReactNdkReleaseLibsForBuck") + from("$reactAndroidProjectDir/src/main/jni/prebuilt/lib") + into("$buildDir/react-ndk/exported") + } + afterEvaluate { + // If you wish to add a custom TurboModule or component locally, + // you should uncomment this line. + // preBuild.dependsOn("generateCodegenArtifactsFromSchema") + preDebugBuild.dependsOn(packageReactNdkDebugLibs) + preReleaseBuild.dependsOn(packageReactNdkReleaseLibs) + + // Due to a bug inside AGP, we have to explicitly set a dependency + // between configureNdkBuild* tasks and the preBuild tasks. + // This can be removed once this is solved: https://issuetracker.google.com/issues/207403732 + configureNdkBuildRelease.dependsOn(preReleaseBuild) + configureNdkBuildDebug.dependsOn(preDebugBuild) + reactNativeArchitectures().each { architecture -> + tasks.findByName("configureNdkBuildDebug[${architecture}]")?.configure { + dependsOn("preDebugBuild") + } + tasks.findByName("configureNdkBuildRelease[${architecture}]")?.configure { + dependsOn("preReleaseBuild") + } + } + } } signingConfigs { release { @@ -152,22 +227,25 @@ android { reset() enable enableSeparateBuildPerCPUArchitecture universalApk enableSeparateBuildPerCPUArchitecture // If true, also generate a universal APK - include "armeabi-v7a", "x86", "arm64-v8a", "x86_64" + include (*reactNativeArchitectures()) } } buildTypes { + def useReleaseKey = project.hasProperty('MATTERMOST_RELEASE_STORE_FILE') release { minifyEnabled enableProguardInReleaseBuilds proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" - signingConfig signingConfigs.release + if (useReleaseKey) { + signingConfig signingConfigs.release + } else { + signingConfig signingConfigs.debug + } } debug { - minifyEnabled enableProguardInReleaseBuilds - proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" - if (nativeArchitectures) { - ndk { - abiFilters nativeArchitectures.split(',') - } + if (useReleaseKey) { + signingConfig signingConfigs.release + } else { + signingConfig signingConfigs.debug } } unsigned.initWith(buildTypes.release) @@ -212,25 +290,6 @@ repositories { } } -configurations.all { - resolutionStrategy { - eachDependency { DependencyResolveDetails details -> - if (details.requested.name == 'play-services-base') { - details.useTarget group: details.requested.group, name: details.requested.name, version: '15.0.1' - } - if (details.requested.name == 'play-services-tasks') { - details.useTarget group: details.requested.group, name: details.requested.name, version: '15.0.1' - } - if (details.requested.name == 'play-services-stats') { - details.useTarget group: details.requested.group, name: details.requested.name, version: '15.0.1' - } - if (details.requested.name == 'play-services-basement') { - details.useTarget group: details.requested.group, name: details.requested.name, version: '15.0.1' - } - } - } -} - dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) @@ -250,10 +309,10 @@ dependencies { if (enableHermes) { - def hermesPath = "../../node_modules/hermes-engine/android/"; - debugImplementation files(hermesPath + "hermes-debug.aar") - releaseImplementation files(hermesPath + "hermes-release.aar") - unsignedImplementation files(hermesPath + "hermes-release.aar") + //noinspection GradleDynamicVersion + implementation("com.facebook.react:hermes-engine:+") { // From node_modules + exclude group:'com.facebook.fbjni' + } } else { implementation jscFlavor } @@ -275,6 +334,39 @@ dependencies { androidTestImplementation('com.wix:detox:+') } +configurations.all { + if (isNewArchitectureEnabled()) { + // If new architecture is enabled, we let you build RN from source + // Otherwise we fallback to a prebuilt .aar bundled in the NPM package. + // This will be applied to all the imported transtitive dependency. + resolutionStrategy.dependencySubstitution { + substitute(module("com.facebook.react:react-native")) + .using(project(":ReactAndroid")) + .because("On New Architecture we're building React Native from source") + substitute(module("com.facebook.react:hermes-engine")) + .using(project(":ReactAndroid:hermes-engine")) + .because("On New Architecture we're building Hermes from source") + } + } + + resolutionStrategy { + eachDependency { DependencyResolveDetails details -> + if (details.requested.name == 'play-services-base') { + details.useTarget group: details.requested.group, name: details.requested.name, version: '15.0.1' + } + if (details.requested.name == 'play-services-tasks') { + details.useTarget group: details.requested.group, name: details.requested.name, version: '15.0.1' + } + if (details.requested.name == 'play-services-stats') { + details.useTarget group: details.requested.group, name: details.requested.name, version: '15.0.1' + } + if (details.requested.name == 'play-services-basement') { + details.useTarget group: details.requested.group, name: details.requested.name, version: '15.0.1' + } + } + } +} + // Run this once to be able to run the application with BUCK // puts all compile dependencies into folder libs for BUCK to use task copyDownloadableDepsToLibs(type: Copy) { @@ -284,3 +376,11 @@ task copyDownloadableDepsToLibs(type: Copy) { apply plugin: 'com.google.gms.google-services' apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) + +def isNewArchitectureEnabled() { + // To opt-in for the New Architecture, you can either: + // - Set `newArchEnabled` to true inside the `gradle.properties` file + // - Invoke gradle with `-newArchEnabled=true` + // - Set an environment variable `ORG_GRADLE_PROJECT_newArchEnabled=true` + return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true" +} diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml index 0063cf4f3..180b076f5 100644 --- a/android/app/src/debug/AndroidManifest.xml +++ b/android/app/src/debug/AndroidManifest.xml @@ -8,6 +8,6 @@ android:usesCleartextTraffic="true" tools:targetApi="28" tools:ignore="GoogleAppIndexingWarning"> - + diff --git a/android/app/src/debug/java/com/rn/ReactNativeFlipper.java b/android/app/src/debug/java/com/rn/ReactNativeFlipper.java index f6fb760e5..1197406be 100644 --- a/android/app/src/debug/java/com/rn/ReactNativeFlipper.java +++ b/android/app/src/debug/java/com/rn/ReactNativeFlipper.java @@ -1,5 +1,5 @@ /** - * Copyright (c) Facebook, Inc. and its affiliates. + * Copyright (c) Meta Platforms, Inc. and affiliates. * *

This source code is licensed under the MIT license found in the LICENSE file in the root * directory of this source tree. @@ -19,6 +19,7 @@ import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor; import com.facebook.flipper.plugins.network.NetworkFlipperPlugin; import com.facebook.flipper.plugins.react.ReactFlipperPlugin; 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; @@ -47,7 +48,7 @@ public class ReactNativeFlipper { ReactContext reactContext = reactInstanceManager.getCurrentReactContext(); if (reactContext == null) { reactInstanceManager.addReactInstanceEventListener( - new ReactInstanceManager.ReactInstanceEventListener() { + new ReactInstanceEventListener() { @Override public void onReactContextInitialized(ReactContext reactContext) { reactInstanceManager.removeReactInstanceEventListener(this); diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 6fce38562..351221352 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -33,10 +33,12 @@ + android:taskAffinity="" + android:exported="true" + > @@ -72,7 +74,9 @@ android:screenOrientation="portrait" android:theme="@style/AppTheme" android:taskAffinity="com.mattermost.share" - android:launchMode="singleInstance"> + android:launchMode="singleInstance" + android:exported="true" + > diff --git a/android/app/src/main/java/com/mattermost/newarchitecture/MainApplicationReactNativeHost.java b/android/app/src/main/java/com/mattermost/newarchitecture/MainApplicationReactNativeHost.java new file mode 100644 index 000000000..5a5d736bf --- /dev/null +++ b/android/app/src/main/java/com/mattermost/newarchitecture/MainApplicationReactNativeHost.java @@ -0,0 +1,116 @@ +package com.mattermost.newarchitecture; + +import android.app.Application; +import androidx.annotation.NonNull; +import com.facebook.react.PackageList; +import com.facebook.react.ReactInstanceManager; +import com.facebook.react.ReactNativeHost; +import com.facebook.react.ReactPackage; +import com.facebook.react.ReactPackageTurboModuleManagerDelegate; +import com.facebook.react.bridge.JSIModulePackage; +import com.facebook.react.bridge.JSIModuleProvider; +import com.facebook.react.bridge.JSIModuleSpec; +import com.facebook.react.bridge.JSIModuleType; +import com.facebook.react.bridge.JavaScriptContextHolder; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.UIManager; +import com.facebook.react.fabric.ComponentFactory; +import com.facebook.react.fabric.CoreComponentsRegistry; +import com.facebook.react.fabric.FabricJSIModuleProvider; +import com.facebook.react.fabric.ReactNativeConfig; +import com.facebook.react.uimanager.ViewManagerRegistry; +import com.mattermost.rnbeta.BuildConfig; +import com.mattermost.newarchitecture.components.MainComponentsRegistry; +import com.mattermost.newarchitecture.modules.MainApplicationTurboModuleManagerDelegate; +import java.util.ArrayList; +import java.util.List; + +/** + * A {@link ReactNativeHost} that helps you load everything needed for the New Architecture, both + * TurboModule delegates and the Fabric Renderer. + * + *

Please note that this class is used ONLY if you opt-in for the New Architecture (see the + * `newArchEnabled` property). Is ignored otherwise. + */ +public class MainApplicationReactNativeHost extends ReactNativeHost { + public MainApplicationReactNativeHost(Application application) { + super(application); + } + + @Override + public boolean getUseDeveloperSupport() { + return BuildConfig.DEBUG; + } + + @Override + protected List getPackages() { + List packages = new PackageList(this).getPackages(); + // Packages that cannot be autolinked yet can be added manually here, for example: + // packages.add(new MyReactNativePackage()); + // TurboModules must also be loaded here providing a valid TurboReactPackage implementation: + // packages.add(new TurboReactPackage() { ... }); + // If you have custom Fabric Components, their ViewManagers should also be loaded here + // inside a ReactPackage. + return packages; + } + + @Override + protected String getJSMainModuleName() { + return "index"; + } + + @NonNull + @Override + protected ReactPackageTurboModuleManagerDelegate.Builder + getReactPackageTurboModuleManagerDelegateBuilder() { + // Here we provide the ReactPackageTurboModuleManagerDelegate Builder. This is necessary + // for the new architecture and to use TurboModules correctly. + return new MainApplicationTurboModuleManagerDelegate.Builder(); + } + + @Override + protected JSIModulePackage getJSIModulePackage() { + return new JSIModulePackage() { + @Override + public List getJSIModules( + final ReactApplicationContext reactApplicationContext, + final JavaScriptContextHolder jsContext) { + final List specs = new ArrayList<>(); + + // Here we provide a new JSIModuleSpec that will be responsible of providing the + // custom Fabric Components. + specs.add( + new JSIModuleSpec() { + @Override + public JSIModuleType getJSIModuleType() { + return JSIModuleType.UIManager; + } + + @Override + public JSIModuleProvider getJSIModuleProvider() { + final ComponentFactory componentFactory = new ComponentFactory(); + CoreComponentsRegistry.register(componentFactory); + + // Here we register a Components Registry. + // The one that is generated with the template contains no components + // and just provides you the one from React Native core. + MainComponentsRegistry.register(componentFactory); + + final ReactInstanceManager reactInstanceManager = getReactInstanceManager(); + + ViewManagerRegistry viewManagerRegistry = + new ViewManagerRegistry( + reactInstanceManager.getOrCreateViewManagers(reactApplicationContext)); + + return new FabricJSIModuleProvider( + reactApplicationContext, + componentFactory, + ReactNativeConfig.DEFAULT_CONFIG, + viewManagerRegistry); + } + }); + return specs; + } + }; + } +} \ No newline at end of file diff --git a/android/app/src/main/java/com/mattermost/newarchitecture/components/MainComponentsRegistry.java b/android/app/src/main/java/com/mattermost/newarchitecture/components/MainComponentsRegistry.java new file mode 100644 index 000000000..4168988bd --- /dev/null +++ b/android/app/src/main/java/com/mattermost/newarchitecture/components/MainComponentsRegistry.java @@ -0,0 +1,36 @@ +package com.mattermost.newarchitecture.components; + +import com.facebook.jni.HybridData; +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.fabric.ComponentFactory; +import com.facebook.soloader.SoLoader; + +/** + * Class responsible to load the custom Fabric Components. This class has native methods and needs a + * corresponding C++ implementation/header file to work correctly (already placed inside the jni/ + * folder for you). + * + *

Please note that this class is used ONLY if you opt-in for the New Architecture (see the + * `newArchEnabled` property). Is ignored otherwise. + */ +@DoNotStrip +public class MainComponentsRegistry { + static { + SoLoader.loadLibrary("fabricjni"); + } + + @DoNotStrip private final HybridData mHybridData; + + @DoNotStrip + private native HybridData initHybrid(ComponentFactory componentFactory); + + @DoNotStrip + private MainComponentsRegistry(ComponentFactory componentFactory) { + mHybridData = initHybrid(componentFactory); + } + + @DoNotStrip + public static MainComponentsRegistry register(ComponentFactory componentFactory) { + return new MainComponentsRegistry(componentFactory); + } +} \ No newline at end of file diff --git a/android/app/src/main/java/com/mattermost/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate.java b/android/app/src/main/java/com/mattermost/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate.java new file mode 100644 index 000000000..a5e317674 --- /dev/null +++ b/android/app/src/main/java/com/mattermost/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate.java @@ -0,0 +1,48 @@ +package com.mattermost.newarchitecture.modules; + +import com.facebook.jni.HybridData; +import com.facebook.react.ReactPackage; +import com.facebook.react.ReactPackageTurboModuleManagerDelegate; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.soloader.SoLoader; +import java.util.List; + +/** + * Class responsible to load the TurboModules. This class has native methods and needs a + * corresponding C++ implementation/header file to work correctly (already placed inside the jni/ + * folder for you). + * + *

Please note that this class is used ONLY if you opt-in for the New Architecture (see the + * `newArchEnabled` property). Is ignored otherwise. + */ +public class MainApplicationTurboModuleManagerDelegate + extends ReactPackageTurboModuleManagerDelegate { + + private static volatile boolean sIsSoLibraryLoaded; + + protected MainApplicationTurboModuleManagerDelegate( + ReactApplicationContext reactApplicationContext, List packages) { + super(reactApplicationContext, packages); + } + + protected native HybridData initHybrid(); + + native boolean canCreateTurboModule(String moduleName); + + public static class Builder extends ReactPackageTurboModuleManagerDelegate.Builder { + protected MainApplicationTurboModuleManagerDelegate build( + ReactApplicationContext context, List packages) { + return new MainApplicationTurboModuleManagerDelegate(context, packages); + } + } + + @Override + protected synchronized void maybeLoadOtherSoLibraries() { + if (!sIsSoLibraryLoaded) { + // If you change the name of your application .so file in the Android.mk file, + // make sure you update the name here as well. + SoLoader.loadLibrary("rndiffapp_appmodules"); + sIsSoLibraryLoaded = true; + } + } +} \ No newline at end of file diff --git a/android/app/src/main/java/com/mattermost/rnbeta/CustomPushNotification.java b/android/app/src/main/java/com/mattermost/rnbeta/CustomPushNotification.java index 73468cb50..e084b1efa 100644 --- a/android/app/src/main/java/com/mattermost/rnbeta/CustomPushNotification.java +++ b/android/app/src/main/java/com/mattermost/rnbeta/CustomPushNotification.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Map; import com.wix.reactnativenotifications.core.notification.PushNotification; +import com.wix.reactnativenotifications.core.NotificationIntentAdapter; import com.wix.reactnativenotifications.core.AppLaunchHelper; import com.wix.reactnativenotifications.core.AppLifecycleFacade; import com.wix.reactnativenotifications.core.JsIOHelper; @@ -246,7 +247,7 @@ public class CustomPushNotification extends PushNotification { } private void buildNotification(Integer notificationId, boolean createSummary) { - final PendingIntent pendingIntent = super.getCTAPendingIntent(); + final PendingIntent pendingIntent = NotificationIntentAdapter.createPendingNotificationIntent(mContext, mNotificationProps); final Notification notification = buildNotification(pendingIntent); if (createSummary) { final Notification summary = getNotificationSummaryBuilder(pendingIntent).build(); diff --git a/android/app/src/main/java/com/mattermost/rnbeta/CustomPushNotificationHelper.java b/android/app/src/main/java/com/mattermost/rnbeta/CustomPushNotificationHelper.java index 1fbaff01f..5f89c5092 100644 --- a/android/app/src/main/java/com/mattermost/rnbeta/CustomPushNotificationHelper.java +++ b/android/app/src/main/java/com/mattermost/rnbeta/CustomPushNotificationHelper.java @@ -1,5 +1,6 @@ package com.mattermost.rnbeta; +import android.annotation.SuppressLint; import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; @@ -128,11 +129,20 @@ public class CustomPushNotificationHelper { replyIntent.putExtra(NOTIFICATION_ID, notificationId); replyIntent.putExtra("pushNotification", bundle); - PendingIntent replyPendingIntent = PendingIntent.getBroadcast( - context, - notificationId, - replyIntent, - PendingIntent.FLAG_UPDATE_CURRENT); + PendingIntent replyPendingIntent; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + replyPendingIntent = PendingIntent.getBroadcast( + context, + notificationId, + replyIntent, + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE); + } else { + replyPendingIntent = PendingIntent.getBroadcast( + context, + notificationId, + replyIntent, + PendingIntent.FLAG_UPDATE_CURRENT); + } RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY) .setLabel("Reply") @@ -381,10 +391,12 @@ public class CustomPushNotificationHelper { private static void setNotificationDeleteIntent(Context context, NotificationCompat.Builder notification, Bundle bundle, int notificationId) { // Let's add a delete intent when the notification is dismissed + final String PUSH_NOTIFICATION_EXTRA_NAME = "pushNotification"; Intent delIntent = new Intent(context, NotificationDismissService.class); - PushNotificationProps notificationProps = new PushNotificationProps(bundle); delIntent.putExtra(NOTIFICATION_ID, notificationId); - PendingIntent deleteIntent = NotificationIntentAdapter.createPendingNotificationIntent(context, delIntent, notificationProps); + delIntent.putExtra(PUSH_NOTIFICATION_EXTRA_NAME, bundle); + @SuppressLint("UnspecifiedImmutableFlag") + PendingIntent deleteIntent = PendingIntent.getService(context, (int) System.currentTimeMillis(), delIntent, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE); notification.setDeleteIntent(deleteIntent); } diff --git a/android/app/src/main/java/com/mattermost/rnbeta/MainActivity.java b/android/app/src/main/java/com/mattermost/rnbeta/MainActivity.java index 537e76fcc..fe1b6fc4c 100644 --- a/android/app/src/main/java/com/mattermost/rnbeta/MainActivity.java +++ b/android/app/src/main/java/com/mattermost/rnbeta/MainActivity.java @@ -1,18 +1,44 @@ package com.mattermost.rnbeta; import android.os.Bundle; - -import androidx.annotation.NonNull; import androidx.annotation.Nullable; + import android.view.KeyEvent; import android.content.res.Configuration; +import com.facebook.react.bridge.Arguments; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.WritableMap; +import com.facebook.react.ReactActivityDelegate; +import com.facebook.react.ReactRootView; import com.reactnativenavigation.NavigationActivity; import com.github.emilioicai.hwkeyboardevent.HWKeyboardEventModule; public class MainActivity extends NavigationActivity { private boolean HWKeyboardConnected = false; + public static class MainActivityDelegate extends ReactActivityDelegate { + public MainActivityDelegate(NavigationActivity activity, String mainComponentName) { + super(activity, mainComponentName); + } + + @Override + protected ReactRootView createRootView() { + ReactRootView reactRootView = new ReactRootView(getContext()); + // If you opted-in for the New Architecture, we enable the Fabric Renderer. + reactRootView.setIsFabric(BuildConfig.IS_NEW_ARCHITECTURE_ENABLED); + return reactRootView; + } + + @Override + protected boolean isConcurrentRootEnabled() { + // If you opted-in for the New Architecture, we enable Concurrent Root (i.e. React 18). + // More on this on https://reactjs.org/blog/2022/03/29/react-v18.html + return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED; + } + } + @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -21,7 +47,7 @@ public class MainActivity extends NavigationActivity { } @Override - public void onConfigurationChanged(@NonNull Configuration newConfig) { + public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) { @@ -31,6 +57,12 @@ public class MainActivity extends NavigationActivity { } } + @Override + public void onWindowFocusChanged(boolean hasFocus) { + super.onWindowFocusChanged(hasFocus); + getReactGateway().onWindowFocusChanged(hasFocus); + } + /* https://mattermost.atlassian.net/browse/MM-10601 Required by react-native-hw-keyboard-event @@ -38,15 +70,24 @@ public class MainActivity extends NavigationActivity { */ @Override public boolean dispatchKeyEvent(KeyEvent event) { - if (HWKeyboardConnected && event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP) { - String keyPressed = event.isShiftPressed() ? "shift-enter" : "enter"; - HWKeyboardEventModule.getInstance().keyPressed(keyPressed); - return true; + if (HWKeyboardConnected) { + int keyCode = event.getKeyCode(); + int keyAction = event.getAction(); + if (keyAction == KeyEvent.ACTION_UP) { + if (keyCode == KeyEvent.KEYCODE_ENTER) { + String keyPressed = event.isShiftPressed() ? "shift-enter" : "enter"; + HWKeyboardEventModule.getInstance().keyPressed(keyPressed); + return true; + } else if (keyCode == KeyEvent.KEYCODE_K && event.isCtrlPressed()) { + HWKeyboardEventModule.getInstance().keyPressed("find-channels"); + return true; + } + } } return super.dispatchKeyEvent(event); - } + }; private void setHWKeyboardConnected() { HWKeyboardConnected = getResources().getConfiguration().keyboard == Configuration.KEYBOARD_QWERTY; } -} +} \ No newline at end of file diff --git a/android/app/src/main/java/com/mattermost/rnbeta/MainApplication.java b/android/app/src/main/java/com/mattermost/rnbeta/MainApplication.java index 9316646dd..088af821d 100644 --- a/android/app/src/main/java/com/mattermost/rnbeta/MainApplication.java +++ b/android/app/src/main/java/com/mattermost/rnbeta/MainApplication.java @@ -25,16 +25,19 @@ import com.wix.reactnativenotifications.core.JsIOHelper; import com.facebook.react.PackageList; import com.facebook.react.ReactInstanceManager; import com.facebook.react.ReactPackage; +import com.facebook.react.config.ReactFeatureFlags; import com.facebook.react.ReactNativeHost; import com.facebook.react.TurboReactPackage; +import com.facebook.react.bridge.JSIModulePackage; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactContext; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.module.model.ReactModuleInfo; import com.facebook.react.module.model.ReactModuleInfoProvider; import com.facebook.soloader.SoLoader; +import com.facebook.react.config.ReactFeatureFlags; -import com.facebook.react.bridge.JSIModulePackage; +import com.mattermost.newarchitecture.MainApplicationReactNativeHost; public class MainApplication extends NavigationApplication implements INotificationsApplication, INotificationsDrawerApplication { @@ -44,68 +47,75 @@ public class MainApplication extends NavigationApplication implements INotificat private Bundle mManagedConfig = null; -private final ReactNativeHost mReactNativeHost = - new ReactNativeHost(this) { - @Override - public boolean getUseDeveloperSupport() { - return BuildConfig.DEBUG; - } + private final ReactNativeHost mReactNativeHost = + new ReactNativeHost(this) { + @Override + public boolean getUseDeveloperSupport() { + return BuildConfig.DEBUG; + } - @Override - protected List getPackages() { - List packages = new PackageList(this).getPackages(); - // Packages that cannot be auto linked yet can be added manually here, for example: - // packages.add(new MyReactNativePackage()); - packages.add(new RNNotificationsPackage(MainApplication.this)); - packages.add( - new TurboReactPackage() { - @Override - public NativeModule getModule(String name, ReactApplicationContext reactContext) { - switch (name) { - case "MattermostManaged": - return MattermostManagedModule.getInstance(reactContext); - case "MattermostShare": - return new ShareModule(instance, reactContext); - case "NotificationPreferences": - return NotificationPreferencesModule.getInstance(instance, reactContext); - case "RNTextInputReset": - return new RNTextInputResetModule(reactContext); - default: - throw new IllegalArgumentException("Could not find module " + name); + @Override + protected List getPackages() { + List packages = new PackageList(this).getPackages(); + // Packages that cannot be auto linked yet can be added manually here, for example: + // packages.add(new MyReactNativePackage()); + packages.add(new RNNotificationsPackage(MainApplication.this)); + packages.add( + new TurboReactPackage() { + @Override + public NativeModule getModule(String name, ReactApplicationContext reactContext) { + switch (name) { + case "MattermostManaged": + return MattermostManagedModule.getInstance(reactContext); + case "MattermostShare": + return new ShareModule(instance, reactContext); + case "NotificationPreferences": + return NotificationPreferencesModule.getInstance(instance, reactContext); + case "RNTextInputReset": + return new RNTextInputResetModule(reactContext); + default: + throw new IllegalArgumentException("Could not find module " + name); + } + } + + @Override + public ReactModuleInfoProvider getReactModuleInfoProvider() { + return () -> { + Map map = new HashMap<>(); + map.put("MattermostManaged", new ReactModuleInfo("MattermostManaged", "com.mattermost.rnbeta.MattermostManagedModule", false, false, false, false, false)); + map.put("MattermostShare", new ReactModuleInfo("MattermostShare", "com.mattermost.share.ShareModule", false, false, true, false, false)); + map.put("NotificationPreferences", new ReactModuleInfo("NotificationPreferences", "com.mattermost.rnbeta.NotificationPreferencesModule", false, false, false, false, false)); + map.put("RNTextInputReset", new ReactModuleInfo("RNTextInputReset", "com.mattermost.rnbeta.RNTextInputResetModule", false, false, false, false, false)); + return map; + }; } } + ); - @Override - public ReactModuleInfoProvider getReactModuleInfoProvider() { - return () -> { - Map map = new HashMap<>(); - map.put("MattermostManaged", new ReactModuleInfo("MattermostManaged", "com.mattermost.rnbeta.MattermostManagedModule", false, false, false, false, false)); - map.put("MattermostShare", new ReactModuleInfo("MattermostShare", "com.mattermost.share.ShareModule", false, false, true, false, false)); - map.put("NotificationPreferences", new ReactModuleInfo("NotificationPreferences", "com.mattermost.rnbeta.NotificationPreferencesModule", false, false, false, false, false)); - map.put("RNTextInputReset", new ReactModuleInfo("RNTextInputReset", "com.mattermost.rnbeta.RNTextInputResetModule", false, false, false, false, false)); - return map; - }; - } - } - ); + return packages; + } - return packages; - } + @Override + protected String getJSMainModuleName() { + return "index"; + } - @Override - protected String getJSMainModuleName() { - return "index"; - } - - @Override - protected JSIModulePackage getJSIModulePackage() { - return (JSIModulePackage) new CustomMMKVJSIModulePackage(); - } + @Override + protected JSIModulePackage getJSIModulePackage() { + return (JSIModulePackage) new CustomMMKVJSIModulePackage(); + } }; + private final ReactNativeHost mNewArchitectureNativeHost = + new MainApplicationReactNativeHost(this); + @Override public ReactNativeHost getReactNativeHost() { - return mReactNativeHost; + if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { + return mNewArchitectureNativeHost; + } else { + return mReactNativeHost; + } } @Override @@ -118,6 +128,8 @@ private final ReactNativeHost mReactNativeHost = RealPathUtil.deleteTempFiles(tempFolder); Log.i("ReactNative", "Cleaning temp cache " + tempFolder.getAbsolutePath()); + // If you opted-in for the New Architecture, we enable the TurboModule system + ReactFeatureFlags.useTurboModules = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED; SoLoader.init(this, /* native exopackage */ false); initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); } diff --git a/android/app/src/main/java/com/mattermost/rnbeta/NotificationReplyBroadcastReceiver.java b/android/app/src/main/java/com/mattermost/rnbeta/NotificationReplyBroadcastReceiver.java index c345222d0..754fd8476 100644 --- a/android/app/src/main/java/com/mattermost/rnbeta/NotificationReplyBroadcastReceiver.java +++ b/android/app/src/main/java/com/mattermost/rnbeta/NotificationReplyBroadcastReceiver.java @@ -129,9 +129,8 @@ public class NotificationReplyBroadcastReceiver extends BroadcastReceiver { } private void recreateNotification(int notificationId, final CharSequence message) { - final Intent cta = new Intent(mContext, ProxyService.class); final PushNotificationProps notificationProps = new PushNotificationProps(bundle); - final PendingIntent pendingIntent = NotificationIntentAdapter.createPendingNotificationIntent(mContext, cta, notificationProps); + final PendingIntent pendingIntent = NotificationIntentAdapter.createPendingNotificationIntent(mContext, notificationProps); NotificationCompat.Builder builder = CustomPushNotificationHelper.createNotificationBuilder(mContext, pendingIntent, bundle, false); Notification notification = builder.build(); NotificationCompat.MessagingStyle messagingStyle = NotificationCompat.MessagingStyle.extractMessagingStyleFromNotification(notification); diff --git a/android/app/src/main/jni/Android.mk b/android/app/src/main/jni/Android.mk new file mode 100644 index 000000000..710541138 --- /dev/null +++ b/android/app/src/main/jni/Android.mk @@ -0,0 +1,48 @@ +THIS_DIR := $(call my-dir) + +include $(REACT_ANDROID_DIR)/Android-prebuilt.mk + +# If you wish to add a custom TurboModule or Fabric component in your app you +# will have to include the following autogenerated makefile. +# include $(GENERATED_SRC_DIR)/codegen/jni/Android.mk +include $(CLEAR_VARS) + +LOCAL_PATH := $(THIS_DIR) + +# You can customize the name of your application .so file here. +LOCAL_MODULE := mattermost_appmodules + +LOCAL_C_INCLUDES := $(LOCAL_PATH) +LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp) +LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) + +# If you wish to add a custom TurboModule or Fabric component in your app you +# will have to uncomment those lines to include the generated source +# files from the codegen (placed in $(GENERATED_SRC_DIR)/codegen/jni) +# +# LOCAL_C_INCLUDES += $(GENERATED_SRC_DIR)/codegen/jni +# LOCAL_SRC_FILES += $(wildcard $(GENERATED_SRC_DIR)/codegen/jni/*.cpp) +# LOCAL_EXPORT_C_INCLUDES += $(GENERATED_SRC_DIR)/codegen/jni + +# Here you should add any native library you wish to depend on. +LOCAL_SHARED_LIBRARIES := \ + libfabricjni \ + libfbjni \ + libfolly_runtime \ + libglog \ + libjsi \ + libreact_codegen_rncore \ + libreact_debug \ + libreact_nativemodule_core \ + libreact_render_componentregistry \ + libreact_render_core \ + libreact_render_debug \ + libreact_render_graphics \ + librrc_view \ + libruntimeexecutor \ + libturbomodulejsijni \ + libyoga + +LOCAL_CFLAGS := -DLOG_TAG=\"ReactNative\" -fexceptions -frtti -std=c++17 -Wall + +include $(BUILD_SHARED_LIBRARY) \ No newline at end of file diff --git a/android/app/src/main/jni/MainApplicationModuleProvider.cpp b/android/app/src/main/jni/MainApplicationModuleProvider.cpp new file mode 100644 index 000000000..39de093d1 --- /dev/null +++ b/android/app/src/main/jni/MainApplicationModuleProvider.cpp @@ -0,0 +1,24 @@ +#include "MainApplicationModuleProvider.h" + +#include + +namespace facebook { +namespace react { + +std::shared_ptr MainApplicationModuleProvider( + const std::string moduleName, + const JavaTurboModule::InitParams ¶ms) { + // Here you can provide your own module provider for TurboModules coming from + // either your application or from external libraries. The approach to follow + // is similar to the following (for a library called `samplelibrary`: + // + // auto module = samplelibrary_ModuleProvider(moduleName, params); + // if (module != nullptr) { + // return module; + // } + // return rncore_ModuleProvider(moduleName, params); + return rncore_ModuleProvider(moduleName, params); +} + +} // namespace react +} // namespace facebook \ No newline at end of file diff --git a/android/app/src/main/jni/MainApplicationModuleProvider.h b/android/app/src/main/jni/MainApplicationModuleProvider.h new file mode 100644 index 000000000..2f2fb24a3 --- /dev/null +++ b/android/app/src/main/jni/MainApplicationModuleProvider.h @@ -0,0 +1,16 @@ +#pragma once + +#include +#include + +#include + +namespace facebook { +namespace react { + +std::shared_ptr MainApplicationModuleProvider( + const std::string moduleName, + const JavaTurboModule::InitParams ¶ms); + +} // namespace react +} // namespace facebook \ No newline at end of file diff --git a/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.cpp b/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.cpp new file mode 100644 index 000000000..f2e4714dc --- /dev/null +++ b/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.cpp @@ -0,0 +1,45 @@ +#include "MainApplicationTurboModuleManagerDelegate.h" +#include "MainApplicationModuleProvider.h" + +namespace facebook { +namespace react { + +jni::local_ref +MainApplicationTurboModuleManagerDelegate::initHybrid( + jni::alias_ref) { + return makeCxxInstance(); +} + +void MainApplicationTurboModuleManagerDelegate::registerNatives() { + registerHybrid({ + makeNativeMethod( + "initHybrid", MainApplicationTurboModuleManagerDelegate::initHybrid), + makeNativeMethod( + "canCreateTurboModule", + MainApplicationTurboModuleManagerDelegate::canCreateTurboModule), + }); +} + +std::shared_ptr +MainApplicationTurboModuleManagerDelegate::getTurboModule( + const std::string name, + const std::shared_ptr jsInvoker) { + // Not implemented yet: provide pure-C++ NativeModules here. + return nullptr; +} + +std::shared_ptr +MainApplicationTurboModuleManagerDelegate::getTurboModule( + const std::string name, + const JavaTurboModule::InitParams ¶ms) { + return MainApplicationModuleProvider(name, params); +} + +bool MainApplicationTurboModuleManagerDelegate::canCreateTurboModule( + std::string name) { + return getTurboModule(name, nullptr) != nullptr || + getTurboModule(name, {.moduleName = name}) != nullptr; +} + +} // namespace react +} // namespace facebook \ No newline at end of file diff --git a/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.h b/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.h new file mode 100644 index 000000000..ea4a0fc98 --- /dev/null +++ b/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.h @@ -0,0 +1,38 @@ +#include +#include + +#include +#include + +namespace facebook { +namespace react { + +class MainApplicationTurboModuleManagerDelegate + : public jni::HybridClass< + MainApplicationTurboModuleManagerDelegate, + TurboModuleManagerDelegate> { + public: + // Adapt it to the package you used for your Java class. + static constexpr auto kJavaDescriptor = + "Lcom/mattermost/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate;"; + + static jni::local_ref initHybrid(jni::alias_ref); + + static void registerNatives(); + + std::shared_ptr getTurboModule( + const std::string name, + const std::shared_ptr jsInvoker) override; + std::shared_ptr getTurboModule( + const std::string name, + const JavaTurboModule::InitParams ¶ms) override; + + /** + * Test-only method. Allows user to verify whether a TurboModule can be + * created by instances of this class. + */ + bool canCreateTurboModule(std::string name); +}; + +} // namespace react +} // namespace facebook \ No newline at end of file diff --git a/android/app/src/main/jni/MainComponentsRegistry.cpp b/android/app/src/main/jni/MainComponentsRegistry.cpp new file mode 100644 index 000000000..c5188f4dc --- /dev/null +++ b/android/app/src/main/jni/MainComponentsRegistry.cpp @@ -0,0 +1,61 @@ +#include "MainComponentsRegistry.h" + +#include +#include +#include +#include + +namespace facebook { +namespace react { + +MainComponentsRegistry::MainComponentsRegistry(ComponentFactory *delegate) {} + +std::shared_ptr +MainComponentsRegistry::sharedProviderRegistry() { + auto providerRegistry = CoreComponentsRegistry::sharedProviderRegistry(); + + // Custom Fabric Components go here. You can register custom + // components coming from your App or from 3rd party libraries here. + // + // providerRegistry->add(concreteComponentDescriptorProvider< + // AocViewerComponentDescriptor>()); + return providerRegistry; +} + +jni::local_ref +MainComponentsRegistry::initHybrid( + jni::alias_ref, + ComponentFactory *delegate) { + auto instance = makeCxxInstance(delegate); + + auto buildRegistryFunction = + [](EventDispatcher::Weak const &eventDispatcher, + ContextContainer::Shared const &contextContainer) + -> ComponentDescriptorRegistry::Shared { + auto registry = MainComponentsRegistry::sharedProviderRegistry() + ->createComponentDescriptorRegistry( + {eventDispatcher, contextContainer}); + + auto mutableRegistry = + std::const_pointer_cast(registry); + + mutableRegistry->setFallbackComponentDescriptor( + std::make_shared( + ComponentDescriptorParameters{ + eventDispatcher, contextContainer, nullptr})); + + return registry; + }; + + delegate->buildRegistryFunction = buildRegistryFunction; + return instance; +} + +void MainComponentsRegistry::registerNatives() { + registerHybrid({ + makeNativeMethod("initHybrid", MainComponentsRegistry::initHybrid), + }); +} + +} // namespace react +} // namespace facebook \ No newline at end of file diff --git a/android/app/src/main/jni/MainComponentsRegistry.h b/android/app/src/main/jni/MainComponentsRegistry.h new file mode 100644 index 000000000..07af8980b --- /dev/null +++ b/android/app/src/main/jni/MainComponentsRegistry.h @@ -0,0 +1,32 @@ +#pragma once + +#include +#include +#include +#include + +namespace facebook { +namespace react { + +class MainComponentsRegistry + : public facebook::jni::HybridClass { + public: + // Adapt it to the package you used for your Java class. + constexpr static auto kJavaDescriptor = + "Lcom/mattermost/newarchitecture/components/MainComponentsRegistry;"; + + static void registerNatives(); + + MainComponentsRegistry(ComponentFactory *delegate); + + private: + static std::shared_ptr + sharedProviderRegistry(); + + static jni::local_ref initHybrid( + jni::alias_ref, + ComponentFactory *delegate); +}; + +} // namespace react +} // namespace facebook \ No newline at end of file diff --git a/android/app/src/main/jni/OnLoad.cpp b/android/app/src/main/jni/OnLoad.cpp new file mode 100644 index 000000000..ae1ef007d --- /dev/null +++ b/android/app/src/main/jni/OnLoad.cpp @@ -0,0 +1,11 @@ +#include +#include "MainApplicationTurboModuleManagerDelegate.h" +#include "MainComponentsRegistry.h" + +JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) { + return facebook::jni::initialize(vm, [] { + facebook::react::MainApplicationTurboModuleManagerDelegate:: + registerNatives(); + facebook::react::MainComponentsRegistry::registerNatives(); + }); +} \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle index 6296de78b..f6af98fdf 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -2,16 +2,21 @@ buildscript { ext { - buildToolsVersion = "30.0.2" + buildToolsVersion = "31.0.0" minSdkVersion = 24 - compileSdkVersion = 30 - targetSdkVersion = 30 - supportLibVersion = "28.0.0" + compileSdkVersion = 31 + targetSdkVersion = 31 + supportLibVersion = "31.0.0" kotlinVersion = "1.5.30" firebaseVersion = "21.0.0" RNNKotlinVersion = kotlinVersion - ndkVersion = "21.4.7075529" - + if (System.properties['os.arch'] == "aarch64") { + // For M1 Users we need to use the NDK 24 which added support for aarch64 + ndkVersion = "24.0.8215888" + } else { + // Otherwise we default to the side-by-side NDK version from AGP. + ndkVersion = "21.4.7075529" + } } repositories { google() @@ -19,7 +24,9 @@ buildscript { mavenLocal() } dependencies { - classpath 'com.android.tools.build:gradle:4.2.2' + classpath 'com.android.tools.build:gradle:7.1.1' + classpath("com.facebook.react:react-native-gradle-plugin") + classpath("de.undercouch:gradle-download-task:5.0.1") classpath 'com.google.gms:google-services:4.3.10' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" diff --git a/android/gradle.properties b/android/gradle.properties index c88cd69c4..5bb2974a3 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -9,9 +9,8 @@ # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -# Default value: -Xmx1024m -XX:MaxPermSize=256m -# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -org.gradle.jvmargs=-Xmx2048M +# Default value: -Xmx512m -XX:MaxMetaspaceSize=256m +org.gradle.jvmargs=-Xmx1024m -XX:MaxMetaspaceSize=512m # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit @@ -30,4 +29,15 @@ android.useAndroidX=true android.enableJetifier=true # Version of flipper SDK to use with React Native -FLIPPER_VERSION=0.99.0 +FLIPPER_VERSION=0.125.0 + +# Use this property to specify which architecture you want to build. +# You can also override it from the CLI using +# ./gradlew -PreactNativeArchitectures=x86_64 +reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 +# Use this property to enable support to the new architecture. +# This will allow you to use TurboModules and the Fabric render in +# your application. You should enable this flag either if you want +# to write custom TurboModules/Fabric components OR use libraries that +# are providing them. +newArchEnabled=false \ No newline at end of file diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar index e708b1c023ec8b20f512888fe07c5bd3ff77bb8f..7454180f2ae8848c63b8b4dea2cb829da983f2fa 100644 GIT binary patch delta 18435 zcmY&<19zBR)MXm8v2EM7ZQHi-#I|kQZfv7Tn#Q)%81v4zX3d)U4d4 zYYc!v@NU%|U;_sM`2z(4BAilWijmR>4U^KdN)D8%@2KLcqkTDW%^3U(Wg>{qkAF z&RcYr;D1I5aD(N-PnqoEeBN~JyXiT(+@b`4Pv`;KmkBXYN48@0;iXuq6!ytn`vGp$ z6X4DQHMx^WlOek^bde&~cvEO@K$oJ}i`T`N;M|lX0mhmEH zuRpo!rS~#&rg}ajBdma$$}+vEhz?JAFUW|iZEcL%amAg_pzqul-B7Itq6Y_BGmOCC zX*Bw3rFz3R)DXpCVBkI!SoOHtYstv*e-May|+?b80ZRh$MZ$FerlC`)ZKt} zTd0Arf9N2dimjs>mg5&@sfTPsRXKXI;0L~&t+GH zkB<>wxI9D+k5VHHcB7Rku{Z>i3$&hgd9Mt_hS_GaGg0#2EHzyV=j=u5xSyV~F0*qs zW{k9}lFZ?H%@4hII_!bzao!S(J^^ZZVmG_;^qXkpJb7OyR*sPL>))Jx{K4xtO2xTr@St!@CJ=y3q2wY5F`77Tqwz8!&Q{f7Dp zifvzVV1!Dj*dxG%BsQyRP6${X+Tc$+XOG zzvq5xcC#&-iXlp$)L=9t{oD~bT~v^ZxQG;FRz|HcZj|^L#_(VNG)k{=_6|6Bs-tRNCn-XuaZ^*^hpZ@qwi`m|BxcF6IWc?_bhtK_cDZRTw#*bZ2`1@1HcB`mLUmo_>@2R&nj7&CiH zF&laHkG~7#U>c}rn#H)q^|sk+lc!?6wg0xy`VPn!{4P=u@cs%-V{VisOxVqAR{XX+ zw}R;{Ux@6A_QPka=48|tph^^ZFjSHS1BV3xfrbY84^=?&gX=bmz(7C({=*oy|BEp+ zYgj;<`j)GzINJA>{HeSHC)bvp6ucoE`c+6#2KzY9)TClmtEB1^^Mk)(mXWYvup02e%Ghm9qyjz#fO3bNGBX} zFiB>dvc1+If!>I10;qZk`?6pEd*(?bI&G*3YLt;MWw&!?=Mf7%^Op?qnyXWur- zwX|S^P>jF?{m9c&mmK-epCRg#WB+-VDe!2d2~YVoi%7_q(dyC{(}zB${!ElKB2D}P z7QNFM!*O^?FrPMGZ}wQ0TrQAVqZy!weLhu_Zq&`rlD39r*9&2sJHE(JT0EY5<}~x@ z1>P0!L2IFDqAB!($H9s2fI`&J_c+5QT|b#%99HA3@zUWOuYh(~7q7!Pf_U3u!ij5R zjFzeZta^~RvAmd_TY+RU@e}wQaB_PNZI26zmtzT4iGJg9U(Wrgrl>J%Z3MKHOWV(? zj>~Ph$<~8Q_sI+)$DOP^9FE6WhO09EZJ?1W|KidtEjzBX3RCLUwmj9qH1CM=^}MaK z59kGxRRfH(n|0*lkE?`Rpn6d^u5J6wPfi0WF(rucTv(I;`aW)3;nY=J=igkjsn?ED ztH&ji>}TW8)o!Jg@9Z}=i2-;o4#xUksQHu}XT~yRny|kg-$Pqeq!^78xAz2mYP9+4 z9gwAoti2ICvUWxE&RZ~}E)#M8*zy1iwz zHqN%q;u+f6Ti|SzILm0s-)=4)>eb5o-0K zbMW8ecB4p^6OuIX@u`f{>Yn~m9PINEl#+t*jqalwxIx=TeGB9(b6jA}9VOHnE$9sC zH`;epyH!k-3kNk2XWXW!K`L_G!%xOqk0ljPCMjK&VweAxEaZ==cT#;!7)X&C|X{dY^IY(e4D#!tx^vV3NZqK~--JW~wtXJ8X19adXim?PdN(|@o(OdgH3AiHts~?#QkolO?*=U_buYC&tQ3sc(O5HGHN~=6wB@dgIAVT$ z_OJWJ^&*40Pw&%y^t8-Wn4@l9gOl`uU z{Uda_uk9!Iix?KBu9CYwW9Rs=yt_lE11A+k$+)pkY5pXpocxIEJe|pTxwFgB%Kpr&tH;PzgOQ&m|(#Otm?@H^r`v)9yiR8v&Uy>d#TNdRfyN4Jk;`g zp+jr5@L2A7TS4=G-#O<`A9o;{En5!I8lVUG?!PMsv~{E_yP%QqqTxxG%8%KxZ{uwS zOT+EA5`*moN8wwV`Z=wp<3?~f#frmID^K?t7YL`G^(X43gWbo!6(q*u%HxWh$$^2EOq`Hj zp=-fS#Av+s9r-M)wGIggQ)b<@-BR`R8l1G@2+KODmn<_$Tzb7k35?e8;!V0G>`(!~ zY~qZz!6*&|TupOcnvsQYPbcMiJ!J{RyfezB^;fceBk znpA1XS)~KcC%0^_;ihibczSxwBuy;^ksH7lwfq7*GU;TLt*WmUEVQxt{ zKSfJf;lk$0XO8~48Xn2dnh8tMC9WHu`%DZj&a`2!tNB`5%;Md zBs|#T0Ktf?vkWQ)Y+q!At1qgL`C|nbzvgc(+28Q|4N6Geq)Il%+I5c@t02{9^=QJ?=h2BTe`~BEu=_u3xX2&?^zwcQWL+)7dI>JK0g8_`W1n~ zMaEP97X>Ok#=G*nkPmY`VoP8_{~+Rp7DtdSyWxI~?TZHxJ&=6KffcO2Qx1?j7=LZA z?GQt`oD9QpXw+s7`t+eeLO$cpQpl9(6h3_l9a6OUpbwBasCeCw^UB6we!&h9Ik@1zvJ`j4i=tvG9X8o34+N|y(ay~ho$f=l z514~mP>Z>#6+UxM<6@4z*|hFJ?KnkQBs_9{H(-v!_#Vm6Z4(xV5WgWMd3mB9A(>@XE292#k(HdI7P zJkQ2)`bQXTKlr}{VrhSF5rK9TsjtGs0Rs&nUMcH@$ZX_`Hh$Uje*)(Wd&oLW($hZQ z_tPt`{O@f8hZ<}?aQc6~|9iHt>=!%We3=F9yIfiqhXqp=QUVa!@UY@IF5^dr5H8$R zIh{=%S{$BHG+>~a=vQ={!B9B=<-ID=nyjfA0V8->gN{jRL>Qc4Rc<86;~aY+R!~Vs zV7MI~gVzGIY`B*Tt@rZk#Lg}H8sL39OE31wr_Bm%mn}8n773R&N)8B;l+-eOD@N$l zh&~Wz`m1qavVdxwtZLACS(U{rAa0;}KzPq9r76xL?c{&GaG5hX_NK!?)iq`t7q*F# zFoKI{h{*8lb>&sOeHXoAiqm*vV6?C~5U%tXR8^XQ9Y|(XQvcz*>a?%HQ(Vy<2UhNf zVmGeOO#v159KV@1g`m%gJ)XGPLa`a|?9HSzSSX{j;)xg>G(Ncc7+C>AyAWYa(k}5B3mtzg4tsA=C^Wfezb1&LlyrBE1~kNfeiubLls{C)!<%#m@f}v^o+7<VZ6!FZ;JeiAG@5vw7Li{flC8q1%jD_WP2ApBI{fQ}kN zhvhmdZ0bb5(qK@VS5-)G+@GK(tuF6eJuuV5>)Odgmt?i_`tB69DWpC~e8gqh!>jr_ zL1~L0xw@CbMSTmQflpRyjif*Y*O-IVQ_OFhUw-zhPrXXW>6X}+73IoMsu2?uuK3lT>;W#38#qG5tDl66A7Y{mYh=jK8Se!+f=N7%nv zYSHr6a~Nxd`jqov9VgII{%EpC_jFCEc>>SND0;}*Ja8Kv;G)MK7?T~h((c&FEBcQq zvUU1hW2^TX(dDCeU@~a1LF-(+#lz3997A@pipD53&Dr@III2tlw>=!iGabjXzbyUJ z4Hi~M1KCT-5!NR#I%!2Q*A>mqI{dpmUa_mW)%SDs{Iw1LG}0y=wbj@0ba-`q=0!`5 zr(9q1p{#;Rv2CY!L#uTbs(UHVR5+hB@m*zEf4jNu3(Kj$WwW|v?YL*F_0x)GtQC~! zzrnZRmBmwt+i@uXnk05>uR5&1Ddsx1*WwMrIbPD3yU*2By`71pk@gt{|H0D<#B7&8 z2dVmXp*;B)SWY)U1VSNs4ds!yBAj;P=xtatUx^7_gC5tHsF#vvdV;NmKwmNa1GNWZ zi_Jn-B4GnJ%xcYWD5h$*z^haku#_Irh818x^KB)3-;ufjf)D0TE#6>|zFf@~pU;Rs zNw+}c9S+6aPzxkEA6R%s*xhJ37wmgc)-{Zd1&mD5QT}4BQvczWr-Xim>(P^)52`@R z9+Z}44203T5}`AM_G^Snp<_KKc!OrA(5h7{MT^$ZeDsSr(R@^kI?O;}QF)OU zQ9-`t^ys=6DzgLcWt0U{Q(FBs22=r zKD%fLQ^5ZF24c-Z)J{xv?x$&4VhO^mswyb4QTIofCvzq+27*WlYm;h@;Bq%i;{hZA zM97mHI6pP}XFo|^pRTuWQzQs3B-8kY@ajLV!Fb?OYAO3jFv*W-_;AXd;G!CbpZt04iW`Ie^_+cQZGY_Zd@P<*J9EdRsc>c=edf$K|;voXRJ zk*aC@@=MKwR120(%I_HX`3pJ+8GMeO>%30t?~uXT0O-Tu-S{JA;zHoSyXs?Z;fy58 zi>sFtI7hoxNAdOt#3#AWFDW)4EPr4kDYq^`s%JkuO7^efX+u#-qZ56aoRM!tC^P6O zP(cFuBnQGjhX(^LJ(^rVe4-_Vk*3PkBCj!?SsULdmVr0cGJM^=?8b0^DuOFq>0*yA zk1g|C7n%pMS0A8@Aintd$fvRbH?SNdRaFrfoAJ=NoX)G5Gr}3-$^IGF+eI&t{I-GT zp=1fj)2|*ur1Td)+s&w%p#E6tDXX3YYOC{HGHLiCvv?!%%3DO$B$>A}aC;8D0Ef#b z{7NNqC8j+%1n95zq8|hFY`afAB4E)w_&7?oqG0IPJZv)lr{MT}>9p?}Y`=n+^CZ6E zKkjIXPub5!82(B-O2xQojW^P(#Q*;ETpEr^+Wa=qDJ9_k=Wm@fZB6?b(u?LUzX(}+ zE6OyapdG$HC& z&;oa*ALoyIxVvB2cm_N&h&{3ZTuU|aBrJlGOLtZc3KDx)<{ z27@)~GtQF@%6B@w3emrGe?Cv_{iC@a#YO8~OyGRIvp@%RRKC?fclXMP*6GzBFO z5U4QK?~>AR>?KF@I;|(rx(rKxdT9-k-anYS+#S#e1SzKPslK!Z&r8iomPsWG#>`Ld zJ<#+8GFHE!^wsXt(s=CGfVz5K+FHYP5T0E*?0A-z*lNBf)${Y`>Gwc@?j5{Q|6;Bl zkHG1%r$r&O!N^><8AEL+=y(P$7E6hd=>BZ4ZZ9ukJ2*~HR4KGvUR~MUOe$d>E5UK3 z*~O2LK4AnED}4t1Fs$JgvPa*O+WeCji_cn1@Tv7XQ6l@($F1K%{E$!naeX)`bfCG> z8iD<%_M6aeD?a-(Qqu61&fzQqC(E8ksa%CulMnPvR35d{<`VsmaHyzF+B zF6a@1$CT0xGVjofcct4SyxA40uQ`b#9kI)& z?B67-12X-$v#Im4CVUGZHXvPWwuspJ610ITG*A4xMoRVXJl5xbk;OL(;}=+$9?H`b z>u2~yd~gFZ*V}-Q0K6E@p}mtsri&%Zep?ZrPJmv`Qo1>94Lo||Yl)nqwHXEbe)!g( zo`w|LU@H14VvmBjjkl~=(?b{w^G$~q_G(HL`>|aQR%}A64mv0xGHa`S8!*Wb*eB}` zZh)&rkjLK!Rqar)UH)fM<&h&@v*YyOr!Xk2OOMV%$S2mCRdJxKO1RL7xP_Assw)bb z9$sQ30bapFfYTS`i1PihJZYA#0AWNmp>x(;C!?}kZG7Aq?zp!B+gGyJ^FrXQ0E<>2 zCjqZ(wDs-$#pVYP3NGA=en<@_uz!FjFvn1&w1_Igvqs_sL>ExMbcGx4X5f%`Wrri@ z{&vDs)V!rd=pS?G(ricfwPSg(w<8P_6=Qj`qBC7_XNE}1_5>+GBjpURPmvTNE7)~r)Y>ZZecMS7Ro2` z0}nC_GYo3O7j|Wux?6-LFZs%1IV0H`f`l9or-8y0=5VGzjPqO2cd$RRHJIY06Cnh- ztg@Pn1OeY=W`1Mv3`Ti6!@QIT{qcC*&vptnX4Pt1O|dWv8u2s|(CkV`)vBjAC_U5` zCw1f&c4o;LbBSp0=*q z3Y^horBAnR)u=3t?!}e}14%K>^562K!)Vy6r~v({5{t#iRh8WIL|U9H6H97qX09xp zjb0IJ^9Lqxop<-P*VA0By@In*5dq8Pr3bTPu|ArID*4tWM7w+mjit0PgmwLV4&2PW z3MnIzbdR`3tPqtUICEuAH^MR$K_u8~-U2=N1)R=l>zhygus44>6V^6nJFbW-`^)f} zI&h$FK)Mo*x?2`0npTD~jRd}5G~-h8=wL#Y-G+a^C?d>OzsVl7BFAaM==(H zR;ARWa^C3J)`p~_&FRsxt|@e+M&!84`eq)@aO9yBj8iifJv0xVW4F&N-(#E=k`AwJ z3EFXWcpsRlB%l_0Vdu`0G(11F7( zsl~*@XP{jS@?M#ec~%Pr~h z2`M*lIQaolzWN&;hkR2*<=!ORL(>YUMxOzj(60rQfr#wTrkLO!t{h~qg% zv$R}0IqVIg1v|YRu9w7RN&Uh7z$ijV=3U_M(sa`ZF=SIg$uY|=NdC-@%HtkUSEqJv zg|c}mKTCM=Z8YmsFQu7k{VrXtL^!Cts-eb@*v0B3M#3A7JE*)MeW1cfFqz~^S6OXFOIP&iL;Vpy z4dWKsw_1Wn%Y;eW1YOfeP_r1s4*p1C(iDG_hrr~-I%kA>ErxnMWRYu{IcG{sAW;*t z9T|i4bI*g)FXPpKM@~!@a7LDVVGqF}C@mePD$ai|I>73B+9!Ks7W$pw;$W1B%-rb; zJ*-q&ljb=&41dJ^*A0)7>Wa@khGZ;q1fL(2qW=|38j43mTl_;`PEEw07VKY%71l6p z@F|jp88XEnm1p~<5c*cVXvKlj0{THF=n3sU7g>Ki&(ErR;!KSmfH=?49R5(|c_*xw z4$jhCJ1gWT6-g5EV)Ahg?Nw=}`iCyQ6@0DqUb%AZEM^C#?B-@Hmw?LhJ^^VU>&phJ zlB!n5&>I>@sndh~v$2I2Ue23F?0!0}+9H~jg7E`?CS_ERu75^jSwm%!FTAegT`6s7 z^$|%sj2?8wtPQR>@D3sA0-M-g-vL@47YCnxdvd|1mPymvk!j5W1jHnVB&F-0R5e-vs`@u8a5GKdv`LF7uCfKncI4+??Z4iG@AxuX7 z6+@nP^TZ5HX#*z(!y+-KJ3+Ku0M90BTY{SC^{ z&y2#RZPjfX_PE<<>XwGp;g4&wcXsQ0T&XTi(^f+}4qSFH1%^GYi+!rJo~t#ChTeAX zmR0w(iODzQOL+b&{1OqTh*psAb;wT*drr^LKdN?c?HJ*gJl+%kEH&48&S{s28P=%p z7*?(xFW_RYxJxxILS!kdLIJYu@p#mnQ(?moGD1)AxQd66X6b*KN?o&e`u9#N4wu8% z^Gw#G!@|>c740RXziOR=tdbkqf(v~wS_N^CS^1hN-N4{Dww1lvSWcBTX*&9}Cz|s@ z*{O@jZ4RVHq19(HC9xSBZI0M)E;daza+Q*zayrX~N5H4xJ33BD4gn5Ka^Hj{995z4 zzm#Eo?ntC$q1a?)dD$qaC_M{NW!5R!vVZ(XQqS67xR3KP?rA1^+s3M$60WRTVHeTH z6BJO$_jVx0EGPXy}XK_&x597 zt(o6ArN8vZX0?~(lFGHRtHP{gO0y^$iU6Xt2e&v&ugLxfsl;GD)nf~3R^ACqSFLQ< zV7`cXgry((wDMJB55a6D4J;13$z6pupC{-F+wpToW%k1qKjUS^$Mo zN3@}T!ZdpiV7rkNvqP3KbpEn|9aB;@V;gMS1iSb@ zwyD7!5mfj)q+4jE1dq3H`sEKgrVqk|y8{_vmn8bMOi873!rmnu5S=1=-DFx+Oj)Hi zx?~ToiJqOrvSou?RVALltvMADodC7BOg7pOyc4m&6yd(qIuV5?dYUpYzpTe!BuWKi zpTg(JHBYzO&X1e{5o|ZVU-X5e?<}mh=|eMY{ldm>V3NsOGwyxO2h)l#)rH@BI*TN; z`yW26bMSp=k6C4Ja{xB}s`dNp zE+41IwEwo>7*PA|7v-F#jLN>h#a`Er9_86!fwPl{6yWR|fh?c%qc44uP~Ocm2V*(* zICMpS*&aJjxutxKC0Tm8+FBz;3;R^=ajXQUB*nTN*Lb;mruQHUE<&=I7pZ@F-O*VMkJbI#FOrBM8`QEL5Uy=q5e2 z_BwVH%c0^uIWO0*_qD;0jlPoA@sI7BPwOr-mrp7y`|EF)j;$GYdOtEPFRAKyUuUZS z(N4)*6R*ux8s@pMdC*TP?Hx`Zh{{Ser;clg&}CXriXZCr2A!wIoh;j=_eq3_%n7V} za?{KhXg2cXPpKHc90t6=`>s@QF-DNcTJRvLTS)E2FTb+og(wTV7?$kI?QZYgVBn)& zdpJf@tZ{j>B;<MVHiPl_U&KlqBT)$ic+M0uUQWK|N1 zCMl~@o|}!!7yyT%7p#G4?T^Azxt=D(KP{tyx^lD_(q&|zNFgO%!i%7T`>mUuU^FeR zHP&uClWgXm6iXgI8*DEA!O&X#X(zdrNctF{T#pyax16EZ5Lt5Z=RtAja!x+0Z31U8 zjfaky?W)wzd+66$L>o`n;DISQNs09g{GAv%8q2k>2n8q)O^M}=5r#^WR^=se#WSCt zQ`7E1w4qdChz4r@v6hgR?nsaE7pg2B6~+i5 zcTTbBQ2ghUbC-PV(@xvIR(a>Kh?{%YAsMV#4gt1nxBF?$FZ2~nFLKMS!aK=(`WllA zHS<_7ugqKw!#0aUtQwd#A$8|kPN3Af?Tkn)dHF?_?r#X68Wj;|$aw)Wj2Dkw{6)*^ zZfy!TWwh=%g~ECDCy1s8tTgWCi}F1BvTJ9p3H6IFq&zn#3FjZoecA_L_bxGWgeQup zAAs~1IPCnI@H>g|6Lp^Bk)mjrA3_qD4(D(65}l=2RzF-8@h>|Aq!2K-qxt(Q9w7c^ z;gtx`I+=gKOl;h=#fzSgw-V*YT~2_nnSz|!9hIxFb{~dKB!{H zSi??dnmr@%(1w^Be=*Jz5bZeofEKKN&@@uHUMFr-DHS!pb1I&;x9*${bmg6=2I4Zt zHb5LSvojY7ubCNGhp)=95jQ00sMAC{IZdAFsN!lAVQDeiec^HAu=8);2AKqNTT!&E zo+FAR`!A1#T6w@0A+o%&*yzkvxsrqbrfVTG+@z8l4+mRi@j<&)U9n6L>uZoezW>qS zA4YfO;_9dQSyEYpkWnsk0IY}Nr2m(ql@KuQjLgY-@g z4=$uai6^)A5+~^TvLdvhgfd+y?@+tRE^AJabamheJFnpA#O*5_B%s=t8<;?I;qJ}j z&g-9?hbwWEez-!GIhqpB>nFvyi{>Yv>dPU=)qXnr;3v-cd`l}BV?6!v{|cHDOx@IG z;TSiQQ(8=vlH^rCEaZ@Yw}?4#a_Qvx=}BJuxACxm(E7tP4hki^jU@8A zUS|4tTLd)gr@T|F$1eQXPY%fXb7u}(>&9gsd3It^B{W#6F2_g40cgo1^)@-xO&R5X z>qKon+Nvp!4v?-rGQu#M_J2v+3e+?N-WbgPQWf`ZL{Xd9KO^s{uIHTJ6~@d=mc7i z+##ya1p+ZHELmi%3C>g5V#yZt*jMv( zc{m*Y;7v*sjVZ-3mBuaT{$g+^sbs8Rp7BU%Ypi+c%JxtC4O}|9pkF-p-}F{Z7-+45 zDaJQx&CNR)8x~0Yf&M|-1rw%KW3ScjWmKH%J1fBxUp(;F%E+w!U470e_3%+U_q7~P zJm9VSWmZ->K`NfswW(|~fGdMQ!K2z%k-XS?Bh`zrjZDyBMu74Fb4q^A=j6+Vg@{Wc zPRd5Vy*-RS4p1OE-&8f^Fo}^yDj$rb+^>``iDy%t)^pHSV=En5B5~*|32#VkH6S%9 zxgIbsG+|{-$v7mhOww#v-ejaS>u(9KV9_*X!AY#N*LXIxor9hDv%aie@+??X6@Et=xz>6ev9U>6Pn$g4^!}w2Z%Kpqpp+M%mk~?GE-jL&0xLC zy(`*|&gm#mLeoRU8IU?Ujsv=;ab*URmsCl+r?%xcS1BVF*rP}XRR%MO_C!a9J^fOe>U;Y&3aj3 zX`3?i12*^W_|D@VEYR;h&b^s#Kd;JMNbZ#*x8*ZXm(jgw3!jyeHo14Zq!@_Q`V;Dv zKik~!-&%xx`F|l^z2A92aCt4x*I|_oMH9oeqsQgQDgI0j2p!W@BOtCTK8Jp#txi}7 z9kz);EX-2~XmxF5kyAa@n_$YYP^Hd4UPQ>O0-U^-pw1*n{*kdX`Jhz6{!W=V8a$0S z9mYboj#o)!d$gs6vf8I$OVOdZu7L5%)Vo0NhN`SwrQFhP3y4iXe2uV@(G{N{yjNG( zKvcN{k@pXkxyB~9ucR(uPSZ7{~sC=lQtz&V(^A^HppuN!@B4 zS>B=kb14>M-sR>{`teApuHlca6YXs6&sRvRV;9G!XI08CHS~M$=%T~g5Xt~$exVk` zWP^*0h{W%`>K{BktGr@+?ZP}2t0&smjKEVw@3=!rSjw5$gzlx`{dEajg$A58m|Okx zG8@BTPODSk@iqLbS*6>FdVqk}KKHuAHb0UJNnPm!(XO{zg--&@#!niF4T!dGVdNif z3_&r^3+rfQuV^8}2U?bkI5Ng*;&G>(O4&M<86GNxZK{IgKNbRfpg>+32I>(h`T&uv zUN{PRP&onFj$tn1+Yh|0AF330en{b~R+#i9^QIbl9fBv>pN|k&IL2W~j7xbkPyTL^ z*TFONZUS2f33w3)fdzr?)Yg;(s|||=aWZV(nkDaACGSxNCF>XLJSZ=W@?$*` z#sUftY&KqTV+l@2AP5$P-k^N`Bme-xcWPS|5O~arUq~%(z8z87JFB|llS&h>a>Som zC34(_uDViE!H2jI3<@d+F)LYhY)hoW6)i=9u~lM*WH?hI(yA$X#ip}yYld3RAv#1+sBt<)V_9c4(SN9Fn#$}_F}A-}P>N+8io}I3mh!}> z*~*N}ZF4Zergb;`R_g49>ZtTCaEsCHiFb(V{9c@X0`YV2O^@c6~LXg2AE zhA=a~!ALnP6aO9XOC^X15(1T)3!1lNXBEVj5s*G|Wm4YBPV`EOhU&)tTI9-KoLI-U zFI@adu6{w$dvT(zu*#aW*4F=i=!7`P!?hZy(9iL;Z^De3?AW`-gYTPALhrZ*K2|3_ zfz;6xQN9?|;#_U=4t^uS2VkQ8$|?Ub5CgKOj#Ni5j|(zX>x#K(h7LgDP-QHwok~-I zOu9rn%y97qrtKdG=ep)4MKF=TY9^n6CugQ3#G2yx;{))hvlxZGE~rzZ$qEHy-8?pU#G;bwufgSN6?*BeA!7N3RZEh{xS>>-G1!C(e1^ zzd#;39~PE_wFX3Tv;zo>5cc=md{Q}(Rb?37{;YPtAUGZo7j*yHfGH|TOVR#4ACaM2 z;1R0hO(Gl}+0gm9Bo}e@lW)J2OU4nukOTVKshHy7u)tLH^9@QI-jAnDBp(|J8&{fKu=_97$v&F67Z zq+QsJ=gUx3_h_%=+q47msQ*Ub=gMzoSa@S2>`Y9Cj*@Op4plTc!jDhu51nSGI z^sfZ(4=yzlR}kP2rcHRzAY9@T7f`z>fdCU0zibx^gVg&fMkcl)-0bRyWe12bT0}<@ z^h(RgGqS|1y#M;mER;8!CVmX!j=rfNa6>#_^j{^C+SxGhbSJ_a0O|ae!ZxiQCN2qA zKs_Z#Zy|9BOw6x{0*APNm$6tYVG2F$K~JNZ!6>}gJ_NLRYhcIsxY1z~)mt#Yl0pvC zO8#Nod;iow5{B*rUn(0WnN_~~M4|guwfkT(xv;z)olmj=f=aH#Y|#f_*d1H!o( z!EXNxKxth9w1oRr0+1laQceWfgi8z`YS#uzg#s9-QlTT7y2O^^M1PZx z3YS7iegfp6Cs0-ixlG93(JW4wuE7)mfihw}G~Uue{Xb+#F!BkDWs#*cHX^%(We}3% zT%^;m&Juw{hLp^6eyM}J({luCL_$7iRFA6^8B!v|B9P{$42F>|M`4Z_yA{kK()WcM zu#xAZWG%QtiANfX?@+QQOtbU;Avr*_>Yu0C2>=u}zhH9VLp6M>fS&yp*-7}yo8ZWB z{h>ce@HgV?^HgwRThCYnHt{Py0MS=Ja{nIj5%z;0S@?nGQ`z`*EVs&WWNwbzlk`(t zxDSc)$dD+4G6N(p?K>iEKXIk>GlGKTH{08WvrehnHhh%tgpp&8db4*FLN zETA@<$V=I7S^_KxvYv$Em4S{gO>(J#(Wf;Y%(NeECoG3n+o;d~Bjme-4dldKukd`S zRVAnKxOGjWc;L#OL{*BDEA8T=zL8^`J=2N)d&E#?OMUqk&9j_`GX*A9?V-G zdA5QQ#(_Eb^+wDkDiZ6RXL`fck|rVy%)BVv;dvY#`msZ}{x5fmd! zInmWSxvRgXbJ{unxAi*7=Lt&7_e0B#8M5a=Ad0yX#0rvMacnKnXgh>4iiRq<&wit93n!&p zeq~-o37qf)L{KJo3!{l9l9AQb;&>)^-QO4RhG>j`rBlJ09~cbfNMR_~pJD1$UzcGp zOEGTzz01j$=-kLC+O$r8B|VzBotz}sj(rUGOa7PDYwX~9Tum^sW^xjjoncxSz;kqz z$Pz$Ze|sBCTjk7oM&`b5g2mFtuTx>xl{dj*U$L%y-xeQL~|i>KzdUHeep-Yd@}p&L*ig< zgg__3l9T=nbM3bw0Sq&Z2*FA)P~sx0h634BXz0AxV69cED7QGTbK3?P?MENkiy-mV zZ1xV5ry3zIpy>xmThBL0Q!g+Wz@#?6fYvzmEczs(rcujrfCN=^!iWQ6$EM zaCnRThqt~gI-&6v@KZ78unqgv9j6-%TOxpbV`tK{KaoBbhc}$h+rK)5h|bT6wY*t6st-4$e99+Egb#3ip+ERbve08G@Ref&hP)qB&?>B94?eq5i3k;dOuU#!y-@+&5>~!FZik=z4&4|YHy=~!F254 zQAOTZr26}Nc7jzgJ;V~+9ry#?7Z0o*;|Q)k+@a^87lC}}1C)S))f5tk+lMNqw>vh( z`A9E~5m#b9!ZDBltf7QIuMh+VheCoD7nCFhuzThlhA?|8NCt3w?oWW|NDin&&eDU6 zwH`aY=))lpWG?{fda=-auXYp1WIPu&3 zwK|t(Qiqvc@<;1_W#ALDJ}bR;3&v4$9rP)eAg`-~iCte`O^MY+SaP!w%~+{{1tMo` zbp?T%ENs|mHP)Lsxno=nWL&qizR+!Ib=9i%4=B@(Umf$|7!WVxkD%hfRjvxV`Co<; zG*g4QG_>;RE{3V_DOblu$GYm&!+}%>G*yO{-|V9GYG|bH2JIU2iO}ZvY>}Fl%1!OE zZFsirH^$G>BDIy`8;R?lZl|uu@qWj2T5}((RG``6*05AWsVVa2Iu>!F5U>~7_Tlv{ zt=Dpgm~0QVa5mxta+fUt)I0gToeEm9eJX{yYZ~3sLR&nCuyuFWuiDIVJ+-lwViO(E zH+@Rg$&GLueMR$*K8kOl>+aF84Hss5p+dZ8hbW$=bWNIk0paB!qEK$xIm5{*^ad&( zgtA&gb&6FwaaR2G&+L+Pp>t^LrG*-B&Hv;-s(h0QTuYWdnUObu8LRSZoAVd7SJ;%$ zh%V?58mD~3G2X<$H7I)@x?lmbeeSY7X~QiE`dfQ5&K^FB#9e!6!@d9vrSt!);@ZQZ zO#84N5yH$kjm9X4iY#f+U`FKhg=x*FiDoUeu1O5LcC2w&$~5hKB9ZnH+8BpbTGh5T zi_nfmyQY$vQh%ildbR7T;7TKPxSs#vhKR|uup`qi1PufMa(tNCjRbllakshQgn1)a8OO-j8W&aBc_#q1hKDF5-X$h`!CeT z+c#Ial~fDsGAenv7~f@!icm(~)a3OKi((=^zcOb^qH$#DVciGXslUwTd$gt{7)&#a`&Lp ze%AnL0#U?lAl8vUkv$n>bxH*`qOujO0HZkPWZnE0;}0DSEu1O!hg-d9#{&#B1Dm)L zvN%r^hdEt1vR<4zwshg*0_BNrDWjo65be1&_82SW8#iKWs7>TCjUT;-K~*NxpG2P% zovXUo@S|fMGudVSRQrP}J3-Wxq;4xIxJJC|Y#TQBr>pwfy*%=`EUNE*dr-Y?9y9xK zmh1zS@z{^|UL}v**LNYY!?1qIRPTvr!gNXzE{%=-`oKclPrfMKwn` zUwPeIvLcxkIV>(SZ-SeBo-yw~{p!<&_}eELG?wxp zee-V59%@BtB+Z&Xs=O(@P$}v_qy1m=+`!~r^aT> zY+l?+6(L-=P%m4ScfAYR8;f9dyVw)@(;v{|nO#lAPI1xDHXMYt~-BGiP&9y2OQsYdh7-Q1(vL<$u6W0nxVn-qh=nwuRk}{d!uACozccRGx6~xZQ;=#JCE?OuA@;4 zadp$sm}jfgW4?La(pb!3f0B=HUI{5A4b$2rsB|ZGb?3@CTA{|zBf07pYpQ$NM({C6Srv6%_{rVkCndT=1nS}qyEf}Wjtg$e{ng7Wgz$7itYy0sWW_$qld);iUm85GBH)fk3b=2|5mvflm?~inoVo zDH_%e;y`DzoNj|NgZ`U%a9(N*=~8!qqy0Etkxo#`r!!{|(NyT0;5= z8nVZ6AiM+SjMG8J@6c4_f-KXd_}{My?Se1GWP|@wROFpD^5_lu?I%CBzpwi(`x~xh B8dv}T delta 17845 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 X49Luk)baa85H9$5YCsTPT`SVRWMtMW diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 966aa8e62..f338a8808 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-all.zip diff --git a/android/gradlew b/android/gradlew index 645f6ca31..a58591e97 100755 --- a/android/gradlew +++ b/android/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/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,78 +17,113 @@ # ############################################################################## -## -## 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 -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +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"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; 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 # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -97,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + 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. Please set the JAVA_HOME variable in your environment to match the @@ -105,79 +140,95 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +# For Cygwin or MSYS, switch paths to Windows format before running java +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 + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# 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 \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" \ No newline at end of file diff --git a/android/settings.gradle b/android/settings.gradle index 9369160c6..dc0b28055 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -3,3 +3,10 @@ include ':reactnativenotifications' project(':reactnativenotifications').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-notifications/lib/android/app') apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) include ':app' +includeBuild('../node_modules/react-native-gradle-plugin') +if (settings.hasProperty("newArchEnabled") && settings.newArchEnabled == "true") { + include(":ReactAndroid") + project(":ReactAndroid").projectDir = file('../node_modules/react-native/ReactAndroid') + include(":ReactAndroid:hermes-engine") + project(":ReactAndroid:hermes-engine").projectDir = file('../node_modules/react-native/ReactAndroid/hermes-engine') +} \ No newline at end of file diff --git a/app/components/__snapshots__/badge.test.js.snap b/app/components/__snapshots__/badge.test.js.snap index bf77c93db..efa6975da 100644 --- a/app/components/__snapshots__/badge.test.js.snap +++ b/app/components/__snapshots__/badge.test.js.snap @@ -3,14 +3,14 @@ exports[`Badge should match snapshot 1`] = ` `; diff --git a/app/components/__snapshots__/swiper.test.js.snap b/app/components/__snapshots__/swiper.test.js.snap index 9545911fb..7cdb8e044 100644 --- a/app/components/__snapshots__/swiper.test.js.snap +++ b/app/components/__snapshots__/swiper.test.js.snap @@ -4,8 +4,8 @@ exports[`Swiper should match snapshot 1`] = ` @John.Smith @@ -21,18 +21,18 @@ exports[`AtMention should match snapshot, with highlight 1`] = ` onLongPress={[Function]} onPress={[Function]} style={ - Object { + { "backgroundColor": "yellow", } } > { iconColor: { tintColor: theme.centerChannelColor, }, + iconSize: { + width: 10, + height: 16, + }, container: { flexDirection: 'row', alignItems: 'center', @@ -100,18 +104,14 @@ const SlashSuggestionItem = (props: Props) => { let image = ( ); if (props.icon === COMMAND_SUGGESTION_ERROR) { image = ( ); diff --git a/app/components/autocomplete_selector/autocomplete_selector.tsx b/app/components/autocomplete_selector/autocomplete_selector.tsx index 08283494f..5300bb787 100644 --- a/app/components/autocomplete_selector/autocomplete_selector.tsx +++ b/app/components/autocomplete_selector/autocomplete_selector.tsx @@ -204,6 +204,7 @@ export default class AutocompleteSelector extends PureComponent { goToSelectorScreen = preventDoubleTap(async () => { const closeButton = await CompassIcon.getImageSource(Platform.select({ios: 'arrow-back-ios', default: 'arrow-left'}), 24, this.props.theme.sidebarHeaderTextColor); + // @ts-expect-error context type definition const {formatMessage} = this.context.intl; const {actions, dataSource, options, placeholder, getDynamicOptions, theme} = this.props; const screen = 'SelectorScreen'; @@ -233,6 +234,7 @@ export default class AutocompleteSelector extends PureComponent { }); render() { + // @ts-expect-error context type definition const {intl} = this.context; const { placeholder, diff --git a/app/components/avatars/__snapshots__/avatars.test.tsx.snap b/app/components/avatars/__snapshots__/avatars.test.tsx.snap index 585590876..d63045143 100644 --- a/app/components/avatars/__snapshots__/avatars.test.tsx.snap +++ b/app/components/avatars/__snapshots__/avatars.test.tsx.snap @@ -7,14 +7,14 @@ exports[`Avatars should match snapshot for overflow 1`] = ` > `; exports[`CustomList should match snapshot, renderSectionHeader 1`] = ` - + `; diff --git a/app/components/emoji_picker/__snapshots__/emoji_picker.test.js.snap b/app/components/emoji_picker/__snapshots__/emoji_picker.test.js.snap index f159da5c4..c018dab55 100644 --- a/app/components/emoji_picker/__snapshots__/emoji_picker.test.js.snap +++ b/app/components/emoji_picker/__snapshots__/emoji_picker.test.js.snap @@ -1,15 +1,15 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`components/emoji_picker/emoji_picker.ios should match snapshot 1`] = ` - - + `; diff --git a/app/components/error_text/__snapshots__/error_text.test.js.snap b/app/components/error_text/__snapshots__/error_text.test.js.snap index 4171a0af9..2dbb436db 100644 --- a/app/components/error_text/__snapshots__/error_text.test.js.snap +++ b/app/components/error_text/__snapshots__/error_text.test.js.snap @@ -3,18 +3,18 @@ exports[`ErrorText should match snapshot 1`] = ` item, []); + const keyExtractor = React.useCallback((item: string) => item, []); - const renderPost = React.useCallback(({item}) => { + const renderPost = React.useCallback(({item}: ListRenderItemInfo) => { return ( @@ -40,7 +40,7 @@ exports[`Global Thread List Header Should render threads with functional tabs & > diff --git a/app/components/markdown/transform.test.js b/app/components/markdown/transform.test.js index fdedab7a9..80189a680 100644 --- a/app/components/markdown/transform.test.js +++ b/app/components/markdown/transform.test.js @@ -3100,50 +3100,6 @@ function nodeToString(node) { return out; } -const ignoredKeys = {_sourcepos: true, _lastLineBlank: true, _open: true, _string_content: true, _info: true, _isFenced: true, _fenceChar: true, _fenceLength: true, _fenceOffset: true, _onEnter: true, _onExit: true}; -function astToJson(node, visited = [], indent = '') { - let out = '{'; - - const myVisited = [...visited]; - myVisited.push(node); - - const keys = Object.keys(node).filter((key) => !ignoredKeys[key]); - if (keys.length > 0) { - out += '\n'; - } - - for (const [i, key] of keys.entries()) { - out += indent + ' "' + key + '":'; - - const value = node[key]; - if (myVisited.indexOf(value) !== -1) { - out += '[Circular]'; - } else if (value === null) { - out += 'null'; - } else if (typeof value === 'number') { - out += value; - } else if (typeof value === 'string') { - out += '"' + value + '"'; - } else if (typeof value === 'boolean') { - out += String(value); - } else if (typeof value === 'object') { - out += astToJson(value, myVisited, indent + ' '); // eslint-disable-line @typescript-eslint/no-unused-vars - } - - if (i !== keys.length - 1) { - out += ',\n'; - } - } - - if (keys.length > 0) { - out += '\n' + indent; - } - - out += '}'; - - return out; -} - // Converts an AST represented as a JavaScript object into a full Commonmark-compatitle AST. // This function is intended for use while testing. An example of input would be: // { diff --git a/app/components/post_draft/__snapshots__/post_draft.test.js.snap b/app/components/post_draft/__snapshots__/post_draft.test.js.snap index b2fce7be7..e8056f863 100644 --- a/app/components/post_draft/__snapshots__/post_draft.test.js.snap +++ b/app/components/post_draft/__snapshots__/post_draft.test.js.snap @@ -3,7 +3,7 @@ exports[`PostDraft Should render the Archived for channelIsArchived 1`] = ` - + `; diff --git a/app/components/post_draft/send_action/__snapshots__/send.test.js.snap b/app/components/post_draft/send_action/__snapshots__/send.test.js.snap index d940e01e0..069592290 100644 --- a/app/components/post_draft/send_action/__snapshots__/send.test.js.snap +++ b/app/components/post_draft/send_action/__snapshots__/send.test.js.snap @@ -3,7 +3,7 @@ exports[`SendAction should change theme backgroundColor to 0.3 opacity 1`] = ` { const {unreadCount} = this.props; + + // @ts-expect-error context type definition const {formatMessage} = this.context.intl; const isInitialMessage = unreadCount === count; diff --git a/app/components/post_list/post/body/content/message_attachments/__snapshots__/attachment_footer.test.tsx.snap b/app/components/post_list/post/body/content/message_attachments/__snapshots__/attachment_footer.test.tsx.snap index bee08d2fe..b30051ee7 100644 --- a/app/components/post_list/post/body/content/message_attachments/__snapshots__/attachment_footer.test.tsx.snap +++ b/app/components/post_list/post/body/content/message_attachments/__snapshots__/attachment_footer.test.tsx.snap @@ -3,7 +3,7 @@ exports[`AttachmentFooter it matches snapshot when both footer and footer_icon are provided 1`] = ` @username @username @username @other.user @username. @@ -233,8 +233,8 @@ exports[`renderSystemMessage uses renderer for Guest added and join to channel 2 exports[`renderSystemMessage uses renderer for OLD archived channel without a username 1`] = ` @username @username { + const registerViewableItemsListener = useCallback((listener: any) => { onViewableItemsChangedListener.current = listener; const removeListener = () => { onViewableItemsChangedListener.current = undefined; @@ -113,7 +113,7 @@ const PostList = ({ return removeListener; }, []); - const registerScrollEndIndexListener = useCallback((listener) => { + const registerScrollEndIndexListener = useCallback((listener: any) => { onScrollEndIndexListener.current = listener; const removeListener = () => { onScrollEndIndexListener.current = undefined; @@ -122,7 +122,7 @@ const PostList = ({ return removeListener; }, []); - const keyExtractor = useCallback((item) => { + const keyExtractor = useCallback((item: string) => { // All keys are strings (either post IDs or special keys) return item; }, []); @@ -173,7 +173,7 @@ const PostList = ({ } }, []); - const renderItem = useCallback(({item, index}) => { + const renderItem = useCallback(({item, index}: ListRenderItemInfo) => { if (isStartOfNewMessages(item)) { // postIds includes a date item after the new message indicator so 2 // needs to be added to the index for the length check to be correct. diff --git a/app/components/progressive_image/__snapshots__/progressive_image.test.js.snap b/app/components/progressive_image/__snapshots__/progressive_image.test.js.snap index 1ca1fdf6b..c22f90784 100644 --- a/app/components/progressive_image/__snapshots__/progressive_image.test.js.snap +++ b/app/components/progressive_image/__snapshots__/progressive_image.test.js.snap @@ -3,26 +3,26 @@ exports[`ProgressiveImage should match snapshot for BackgroundImage 1`] = ` @@ -56,8 +56,8 @@ exports[`ProgressiveImage should match snapshot for Default Image 1`] = ` resizeMode="contain" source="https://images.com/image.png" style={ - Array [ - Object { + [ + { "bottom": 0, "left": 0, "position": "absolute", @@ -75,14 +75,14 @@ exports[`ProgressiveImage should match snapshot for Default Image 1`] = ` exports[`ProgressiveImage should match snapshot for Image 1`] = ` } containerStyle={ - Object { + { "backgroundColor": "#ffffff", "flex": 1, "paddingBottom": 0, @@ -73,14 +73,14 @@ exports[`SearchBar should match snapshot 1`] = ` editable={true} enablesReturnKeyAutomatically={true} inputContainerStyle={ - Object { + { "backgroundColor": undefined, "borderRadius": 2, "height": 10, } } inputStyle={ - Object { + { "backgroundColor": "transparent", "color": "#fff", "fontSize": 14, @@ -93,7 +93,7 @@ exports[`SearchBar should match snapshot 1`] = ` keyboardAppearance="keyboard-appearance" keyboardType="keyboard-type" leftIconContainerStyle={ - Object { + { "marginLeft": 4, "width": 30, } @@ -114,11 +114,11 @@ exports[`SearchBar should match snapshot 1`] = ` name="magnify" size={24} style={ - Array [ - Object { + [ + { "flex": 1, }, - Object { + { "color": "#bbbbbb", "top": 8, }, diff --git a/app/components/sidebars/main/__snapshots__/main_sidebar.test.js.snap b/app/components/sidebars/main/__snapshots__/main_sidebar.test.js.snap index d955b64b8..40c1c0015 100644 --- a/app/components/sidebars/main/__snapshots__/main_sidebar.test.js.snap +++ b/app/components/sidebars/main/__snapshots__/main_sidebar.test.js.snap @@ -4,7 +4,7 @@ exports[`MainSidebar should match, full snapshot 1`] = ` diff --git a/app/components/sidebars/settings/__snapshots__/settings_sidebar.test.js.snap b/app/components/sidebars/settings/__snapshots__/settings_sidebar.test.js.snap index f56a457a1..eac01aae4 100644 --- a/app/components/sidebars/settings/__snapshots__/settings_sidebar.test.js.snap +++ b/app/components/sidebars/settings/__snapshots__/settings_sidebar.test.js.snap @@ -5,7 +5,7 @@ exports[`SettingsSidebar Custom Status should close sidebar when update custom s drawerPosition="right" drawerWidth={710} forwardRef={ - Object { + { "current": null, } } @@ -21,7 +21,7 @@ exports[`SettingsSidebar Custom Status should keep sidebar open when update cust drawerPosition="right" drawerWidth={710} forwardRef={ - Object { + { "current": null, } } @@ -37,7 +37,7 @@ exports[`SettingsSidebar should match snapshot 1`] = ` drawerPosition="right" drawerWidth={710} forwardRef={ - Object { + { "current": null, } } @@ -53,7 +53,7 @@ exports[`SettingsSidebar should match snapshot with custom status enabled 1`] = drawerPosition="right" drawerWidth={710} forwardRef={ - Object { + { "current": null, } } @@ -69,7 +69,7 @@ exports[`SettingsSidebar should match snapshot with custom status expiry 1`] = ` drawerPosition="right" drawerWidth={710} forwardRef={ - Object { + { "current": null, } } diff --git a/app/components/slide_up_panel/__snapshots__/slide_up_panel_indicator.test.js.snap b/app/components/slide_up_panel/__snapshots__/slide_up_panel_indicator.test.js.snap index e2e49dd9b..253701c84 100644 --- a/app/components/slide_up_panel/__snapshots__/slide_up_panel_indicator.test.js.snap +++ b/app/components/slide_up_panel/__snapshots__/slide_up_panel_indicator.test.js.snap @@ -3,7 +3,7 @@ exports[`SlideUpPanelIndicator should match snapshot 1`] = ` 00:15 diff --git a/app/products/calls/components/__snapshots__/floating_call_container.test.js.snap b/app/products/calls/components/__snapshots__/floating_call_container.test.js.snap index 31e9b18d9..ca28a87f8 100644 --- a/app/products/calls/components/__snapshots__/floating_call_container.test.js.snap +++ b/app/products/calls/components/__snapshots__/floating_call_container.test.js.snap @@ -4,8 +4,8 @@ exports[`FloatingCallContainer should match snapshot 1`] = ` { diff --git a/app/products/calls/components/join_call/__snapshots__/join_call.test.js.snap b/app/products/calls/components/join_call/__snapshots__/join_call.test.js.snap index 4df265679..a79cab84c 100644 --- a/app/products/calls/components/join_call/__snapshots__/join_call.test.js.snap +++ b/app/products/calls/components/join_call/__snapshots__/join_call.test.js.snap @@ -3,7 +3,7 @@ exports[`JoinCall should match snapshot 1`] = ` } userIds={ - Array [ + [ "user-1-id", "user-2-id", ] diff --git a/app/products/calls/hooks.ts b/app/products/calls/hooks.ts index d6911a7e1..4b09d545c 100644 --- a/app/products/calls/hooks.ts +++ b/app/products/calls/hooks.ts @@ -57,6 +57,7 @@ export const useCallsChannelSettings = () => { useEffect(() => { if (pluginEnabled) { + // @ts-expect-error ActionFunc dispatch(loadConfig()); } }, []); diff --git a/app/products/calls/screens/call/__snapshots__/call_screen.test.js.snap b/app/products/calls/screens/call/__snapshots__/call_screen.test.js.snap index 4bc3e1d4b..2456a2d2c 100644 --- a/app/products/calls/screens/call/__snapshots__/call_screen.test.js.snap +++ b/app/products/calls/screens/call/__snapshots__/call_screen.test.js.snap @@ -3,14 +3,14 @@ exports[`CallScreen Landscape should match snapshot 1`] = `