mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
36153e2557 | ||
|
|
d2d244cb8f | ||
|
|
af9225ec5f | ||
|
|
4555fc7865 | ||
|
|
989546f97e | ||
|
|
ec3688f95a | ||
|
|
25e2cbb441 | ||
|
|
1fad3af37c | ||
|
|
72e1eda073 | ||
|
|
dfda480a98 | ||
|
|
a5ddc2e165 | ||
|
|
62ef6f5fa1 | ||
|
|
b5f1b26a8f | ||
|
|
48113b5635 | ||
|
|
faaf2560cd | ||
|
|
387ee70e72 | ||
|
|
3fd3fe04da | ||
|
|
fdd7848454 | ||
|
|
1f48b7b0a2 | ||
|
|
6268836c74 | ||
|
|
9efcaffe17 | ||
|
|
8400590abe | ||
|
|
a5c44e622e | ||
|
|
44ee801c29 | ||
|
|
5a8033df98 | ||
|
|
51f5ea15aa | ||
|
|
a4a6e23dec | ||
|
|
e645629323 | ||
|
|
b3f19d7f1f | ||
|
|
cb28a269f0 | ||
|
|
4163386aee | ||
|
|
ccd1708096 | ||
|
|
4e34e6c4fb | ||
|
|
3e69592c5a | ||
|
|
5fd04faf1e | ||
|
|
a761b79ad8 | ||
|
|
d7d33c7ef3 | ||
|
|
7b33f20546 | ||
|
|
4b370ceeb7 | ||
|
|
63e4bd655a | ||
|
|
762db49ded | ||
|
|
65e4d98a71 | ||
|
|
66b82aec55 | ||
|
|
2cd3173991 | ||
|
|
61f0d1a7d1 | ||
|
|
57cc524e93 | ||
|
|
bca4cf023a | ||
|
|
f5d371a2f9 | ||
|
|
b1c30f8f8a | ||
|
|
54f5c8c26c | ||
|
|
48f9733867 | ||
|
|
43d67cd1ec | ||
|
|
805afe4847 | ||
|
|
0924a28b19 | ||
|
|
1b2b2198e1 | ||
|
|
319e4df458 | ||
|
|
71548ffd69 | ||
|
|
58eb8b13a0 | ||
|
|
5ba5ff6eba | ||
|
|
a2a7032477 | ||
|
|
f06df0ef2b | ||
|
|
0fd6ade862 |
@@ -2,10 +2,6 @@
|
||||
[android]
|
||||
target = android-31
|
||||
|
||||
[kotlin]
|
||||
compile_against_abis = True
|
||||
kotlin_version = 1.6.10
|
||||
|
||||
[download]
|
||||
max_number_of_retries = 3
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
# and build a Android application that can be used to run the
|
||||
# tests specified in the scripts/ directory.
|
||||
#
|
||||
FROM reactnativecommunity/react-native-android:5.4
|
||||
FROM reactnativecommunity/react-native-android:5.2
|
||||
|
||||
LABEL Description="React Native Android Test Image"
|
||||
LABEL maintainer="Héctor Ramos <hector@fb.com>"
|
||||
@@ -22,7 +22,6 @@ LABEL maintainer="Héctor Ramos <hector@fb.com>"
|
||||
# set default environment variables
|
||||
ENV GRADLE_OPTS="-Dorg.gradle.daemon=false -Dorg.gradle.jvmargs=\"-Xmx512m -XX:+HeapDumpOnOutOfMemoryError\""
|
||||
ENV JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF8"
|
||||
ENV KOTLIN_HOME="third-party/kotlin"
|
||||
|
||||
ADD .buckconfig /app/.buckconfig
|
||||
ADD .buckjavaargs /app/.buckjavaargs
|
||||
@@ -34,12 +33,9 @@ ADD React /app/React
|
||||
ADD keystores /app/keystores
|
||||
ADD packages/react-native-codegen /app/packages/react-native-codegen
|
||||
ADD tools /app/tools
|
||||
add scripts /app/scripts
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
RUN scripts/download-kotlin-compiler-with-buck.sh
|
||||
|
||||
RUN buck fetch ReactAndroid/src/test/java/com/facebook/react/modules
|
||||
RUN buck fetch ReactAndroid/src/main/java/com/facebook/react
|
||||
RUN buck fetch ReactAndroid/src/main/java/com/facebook/react/shell
|
||||
@@ -53,4 +49,6 @@ ADD . /app
|
||||
|
||||
RUN yarn
|
||||
|
||||
RUN ./gradlew :ReactAndroid:assembleDebug
|
||||
RUN ./gradlew :ReactAndroid:downloadBoost :ReactAndroid:downloadDoubleConversion :ReactAndroid:downloadFolly :ReactAndroid:downloadGlog
|
||||
|
||||
RUN ./gradlew :ReactAndroid:packageReactNdkLibsForBuck -Pjobs=1
|
||||
|
||||
+163
-598
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,60 @@
|
||||
{
|
||||
"root": true,
|
||||
|
||||
"extends": [
|
||||
"./packages/eslint-config-react-native-community/index.js"
|
||||
],
|
||||
|
||||
"plugins": [
|
||||
"@react-native/eslint-plugin-specs"
|
||||
],
|
||||
|
||||
"overrides": [
|
||||
{
|
||||
"files": [
|
||||
"Libraries/**/*.js",
|
||||
],
|
||||
"rules": {
|
||||
"@react-native-community/no-haste-imports": 2,
|
||||
"@react-native-community/error-subclass-name": 2,
|
||||
"@react-native-community/platform-colors": 2,
|
||||
"@react-native/specs/react-native-modules": 2
|
||||
}
|
||||
},
|
||||
{
|
||||
"files": [
|
||||
"flow-typed/**/*.js",
|
||||
],
|
||||
"rules": {
|
||||
quotes: 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"files": [
|
||||
"**/__fixtures__/**/*.js",
|
||||
"**/__mocks__/**/*.js",
|
||||
"**/__tests__/**/*.js",
|
||||
"jest/**/*.js",
|
||||
"packages/rn-tester/**/*.js",
|
||||
],
|
||||
"globals": {
|
||||
// Expose some Jest globals for test helpers
|
||||
"afterAll": true,
|
||||
"afterEach": true,
|
||||
"beforeAll": true,
|
||||
"beforeEach": true,
|
||||
"expect": true,
|
||||
"jest": true,
|
||||
},
|
||||
},
|
||||
{
|
||||
"files": [
|
||||
"**/__tests__/**/*-test.js",
|
||||
],
|
||||
"env": {
|
||||
"jasmine": true,
|
||||
"jest": true
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,77 +0,0 @@
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @format
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
module.exports = {
|
||||
root: true,
|
||||
|
||||
extends: ['./packages/eslint-config-react-native-community/index.js'],
|
||||
|
||||
plugins: ['@react-native/eslint-plugin-specs'],
|
||||
|
||||
overrides: [
|
||||
// overriding the JS config from eslint-config-react-native-community config to ensure
|
||||
// that we use hermes-eslint for all js files
|
||||
{
|
||||
files: ['*.js'],
|
||||
parser: 'hermes-eslint',
|
||||
rules: {
|
||||
// These rules are not required with hermes-eslint
|
||||
'ft-flow/define-flow-type': 0,
|
||||
'ft-flow/use-flow-type': 0,
|
||||
'flowtype/define-flow-type': 0,
|
||||
'flowtype/use-flow-type': 0,
|
||||
// flow handles this check for us, so it's not required
|
||||
'no-undef': 0,
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
files: ['Libraries/**/*.js'],
|
||||
rules: {
|
||||
'@react-native-community/no-haste-imports': 2,
|
||||
'@react-native-community/error-subclass-name': 2,
|
||||
'@react-native-community/platform-colors': 2,
|
||||
'@react-native/specs/react-native-modules': 2,
|
||||
},
|
||||
},
|
||||
{
|
||||
files: ['flow-typed/**/*.js'],
|
||||
rules: {
|
||||
quotes: 0,
|
||||
},
|
||||
},
|
||||
{
|
||||
files: [
|
||||
'**/__fixtures__/**/*.js',
|
||||
'**/__mocks__/**/*.js',
|
||||
'**/__tests__/**/*.js',
|
||||
'jest/**/*.js',
|
||||
'packages/rn-tester/**/*.js',
|
||||
],
|
||||
globals: {
|
||||
// Expose some Jest globals for test helpers
|
||||
afterAll: true,
|
||||
afterEach: true,
|
||||
beforeAll: true,
|
||||
beforeEach: true,
|
||||
expect: true,
|
||||
jest: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
files: ['**/__tests__/**/*-test.js'],
|
||||
env: {
|
||||
jasmine: true,
|
||||
jest: true,
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
+2
-4
@@ -32,7 +32,6 @@ flow/
|
||||
emoji=true
|
||||
|
||||
exact_by_default=true
|
||||
exact_empty_objects=true
|
||||
|
||||
format.bracket_spacing=false
|
||||
|
||||
@@ -52,8 +51,6 @@ suppress_type=$FlowFixMeProps
|
||||
suppress_type=$FlowFixMeState
|
||||
suppress_type=$FlowFixMeEmpty
|
||||
|
||||
experimental.env_mode=ssa
|
||||
|
||||
[lints]
|
||||
sketchy-null-number=warn
|
||||
sketchy-null-mixed=warn
|
||||
@@ -63,6 +60,7 @@ nonstrict-import=warn
|
||||
deprecated-type=error
|
||||
unsafe-getters-setters=warn
|
||||
unnecessary-invariant=warn
|
||||
signature-verification-failure=warn
|
||||
|
||||
[strict]
|
||||
deprecated-type
|
||||
@@ -74,4 +72,4 @@ untyped-import
|
||||
untyped-type-import
|
||||
|
||||
[version]
|
||||
^0.182.0
|
||||
^0.170.0
|
||||
|
||||
+2
-4
@@ -32,7 +32,6 @@ flow/
|
||||
emoji=true
|
||||
|
||||
exact_by_default=true
|
||||
exact_empty_objects=true
|
||||
|
||||
format.bracket_spacing=false
|
||||
|
||||
@@ -52,8 +51,6 @@ suppress_type=$FlowFixMeProps
|
||||
suppress_type=$FlowFixMeState
|
||||
suppress_type=$FlowFixMeEmpty
|
||||
|
||||
experimental.env_mode=ssa
|
||||
|
||||
[lints]
|
||||
sketchy-null-number=warn
|
||||
sketchy-null-mixed=warn
|
||||
@@ -63,6 +60,7 @@ nonstrict-import=warn
|
||||
deprecated-type=error
|
||||
unsafe-getters-setters=warn
|
||||
unnecessary-invariant=warn
|
||||
signature-verification-failure=warn
|
||||
|
||||
[strict]
|
||||
deprecated-type
|
||||
@@ -74,4 +72,4 @@ untyped-import
|
||||
untyped-type-import
|
||||
|
||||
[version]
|
||||
^0.182.0
|
||||
^0.170.0
|
||||
|
||||
@@ -43,6 +43,5 @@ body:
|
||||
Please provide a Snack (https://snack.expo.io/), a link to a repository on GitHub, or provide a minimal code example that reproduces the problem.
|
||||
You may provide a screenshot of the application if you think it is relevant to your bug report.
|
||||
Here are some tips for providing a minimal example: https://stackoverflow.com/help/mcve
|
||||
Please note that a reproducer is mandatory. Issues without reproducer are more likely to stall and will be closed.
|
||||
validations:
|
||||
required: true
|
||||
required: false
|
||||
|
||||
@@ -6,9 +6,6 @@ contact_links:
|
||||
- name: 🤔 Questions and Help
|
||||
url: https://reactnative.dev/help
|
||||
about: Looking for help with your app? Please refer to the React Native community's support resources.
|
||||
- name: 💫 New Architecture - Questions & Technical Deep dive insights
|
||||
url: https://github.com/reactwg/react-native-new-architecture
|
||||
about: Questions and doubts related to technical questions for the New Architecture should be directed to the Working Group. Instructions on how to join are available in the README.
|
||||
- name: 🚀 Discussions and Proposals
|
||||
url: https://github.com/react-native-community/discussions-and-proposals
|
||||
about: Discuss the future of React Native in the React Native community's discussions and proposals repository.
|
||||
|
||||
@@ -1,53 +0,0 @@
|
||||
name: 💫 New Architecture - Bug Report
|
||||
description: Report a reproducible bug or a build issue when using the New Architecture (Fabric & TurboModules) in React Native.
|
||||
labels: ["Needs: Triage :mag:", "Type: New Architecture"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Please provide all the information requested. Issues that do not follow this format are going to be closed.
|
||||
This issue report is reserved to bug & build issues for users on the New Architecture. If you're not using
|
||||
the New Architecture, please don't open issues on this category.
|
||||
- type: textarea
|
||||
id: description
|
||||
attributes:
|
||||
label: Description
|
||||
description: |
|
||||
Please provide a clear and concise description of what the bug or issue is. Include screenshots if needed.
|
||||
Please make sure you check the New Architecture documentation first, as your issue might
|
||||
already be answered there - https://reactnative.dev/docs/next/new-architecture-intro
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
id: version
|
||||
attributes:
|
||||
label: Version
|
||||
description: What react-native version does this appear on? Please test against the latest stable version. Bug reports against older versions are more likely to stall.
|
||||
placeholder: ex. 0.68.0
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: react-native-info
|
||||
attributes:
|
||||
label: Output of `npx react-native info`
|
||||
description: Run `npx react-native info` in your terminal, copy and paste the results here.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: reproduction
|
||||
attributes:
|
||||
label: Steps to reproduce
|
||||
description: Provide a detailed list of steps that reproduce the issue.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: extra
|
||||
attributes:
|
||||
label: Snack, code example, screenshot, or link to a repository
|
||||
description: |
|
||||
Please provide a Snack (https://snack.expo.io/), a link to a repository on GitHub, or provide a minimal code example that reproduces the problem.
|
||||
You may provide a screenshot of the application if you think it is relevant to your bug report.
|
||||
Here are some tips for providing a minimal example: https://stackoverflow.com/help/mcve
|
||||
Please note that a reproducer is mandatory. Issues without reproducer are more likely to stall and will be closed.
|
||||
validations:
|
||||
required: true
|
||||
@@ -1,4 +1,4 @@
|
||||
name: ⬆️ Upgrade - Build Regression
|
||||
name: Upgrade - Build Regression
|
||||
description: If you are upgrading to a new React Native version (stable or pre-release) and encounter a build regression.
|
||||
labels: ["Needs: Triage :mag:", "Type: Upgrade Issue"]
|
||||
body:
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
<!-- Template for pre-release GitHub release -->
|
||||
|
||||
<!-- TODO Post about this release to https://github.com/reactwg/react-native-releases/discussions) -->
|
||||
|
||||
- <!-- TODO List out notable picks for this patch -->
|
||||
|
||||
---
|
||||
|
||||
To test it, run:
|
||||
|
||||
npx react-native init RN__SHORT_VERSION__ --version __VERSION__
|
||||
|
||||
---
|
||||
|
||||
You can participate in the conversation on the status of this release in the [working group](https://github.com/reactwg/react-native-releases/discussions).
|
||||
|
||||
---
|
||||
|
||||
To help you upgrade to this version, you can use the [upgrade helper](https://react-native-community.github.io/upgrade-helper/) ⚛️
|
||||
|
||||
---
|
||||
|
||||
See changes from this release in the [changelog PR](https://github.com/facebook/react-native/labels/%F0%9F%93%9D%20Changelog)
|
||||
@@ -4,13 +4,8 @@ on:
|
||||
issues:
|
||||
types: [opened, edited]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
add-version-label-issue:
|
||||
permissions:
|
||||
issues: write # for react-native-community/actions-apply-version-label to label issues
|
||||
runs-on: ubuntu-latest
|
||||
continue-on-error: true
|
||||
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
name: Run Danger on PR
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types: [opened, edited, reopened, synchronize]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
danger:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- run: yarn install
|
||||
working-directory: bots
|
||||
- name: Danger
|
||||
run: DANGER_GITHUB_API_TOKEN="$PUBLIC_PULLBOT_GITHUB_TOKEN_A""$PUBLIC_PULLBOT_GITHUB_TOKEN_B" yarn danger ci --use-github-checks --failOnErrors --id danger_pr
|
||||
working-directory: bots
|
||||
env:
|
||||
PUBLIC_PULLBOT_GITHUB_TOKEN_A: a6edf8e8d40ce4e8b11a
|
||||
PUBLIC_PULLBOT_GITHUB_TOKEN_B: 150e1341f4dd9c944d2a
|
||||
@@ -4,18 +4,12 @@ on:
|
||||
issue_comment:
|
||||
types: created
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
applyNeedsAttentionLabel:
|
||||
permissions:
|
||||
contents: read # for actions/checkout to fetch code
|
||||
issues: write # for hramos/needs-attention to label issues
|
||||
name: Apply Needs Attention Label
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v2
|
||||
- name: Apply Needs Attention Label
|
||||
uses: hramos/needs-attention@v1
|
||||
with:
|
||||
|
||||
@@ -4,18 +4,12 @@ on:
|
||||
issues:
|
||||
types: labeled
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
respondToIssueBasedOnLabel:
|
||||
permissions:
|
||||
contents: read # for hramos/respond-to-issue-based-on-label to fetch config file
|
||||
issues: write # for hramos/respond-to-issue-based-on-label to update issues
|
||||
name: Respond to Issue Based on Label
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v2
|
||||
- name: Respond to Issue Based on Label
|
||||
uses: hramos/respond-to-issue-based-on-label@v2
|
||||
with:
|
||||
|
||||
@@ -9,11 +9,11 @@ jobs:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: actions/stale@v5
|
||||
- uses: actions/stale@v4
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
days-before-stale: 180
|
||||
stale-issue-message: 'This issue is stale because it has been open 180 days with no activity. Remove stale label or comment or this will be closed in 7 days.'
|
||||
stale-pr-message: 'This PR is stale because it has been open 180 days with no activity. Remove stale label or comment or this will be closed in 7 days.'
|
||||
days-before-stale: 365
|
||||
stale-issue-message: 'This issue is stale because it has been open 365 days with no activity. Remove stale label or comment or this will be closed in 7 days.'
|
||||
stale-pr-message: 'This PR is stale because it has been open 365 days with no activity. Remove stale label or comment or this will be closed in 7 days.'
|
||||
close-issue-message: 'This issue was closed because it has been stalled for 7 days with no activity.'
|
||||
close-pr-message: 'This PR was closed because it has been stalled for 7 days with no activity.'
|
||||
|
||||
@@ -5,22 +5,15 @@ on:
|
||||
branches:
|
||||
- main
|
||||
pull_request:
|
||||
types: [ synchronize ]
|
||||
branches:
|
||||
- main
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
test-docker-android:
|
||||
name: Test Docker
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Free up space by removing unnecessary folders
|
||||
run: |
|
||||
sudo rm -rf /usr/share/dotnet
|
||||
sudo rm -rf /opt/ghc
|
||||
sudo rm -rf "$AGENT_TOOLSDIRECTORY"
|
||||
- uses: actions/checkout@v2
|
||||
- name: Build Docker image with Android test app
|
||||
run: npm run docker-build-android
|
||||
|
||||
+2
-11
@@ -20,12 +20,10 @@ DerivedData
|
||||
*.ipa
|
||||
*.xcuserstate
|
||||
project.xcworkspace
|
||||
**/.xcode.env.local
|
||||
|
||||
# Gradle
|
||||
/build/
|
||||
/packages/react-native-gradle-plugin/build/
|
||||
/packages/rn-tester/build
|
||||
/packages/rn-tester/android/app/.cxx/
|
||||
/packages/rn-tester/android/app/build/
|
||||
/packages/rn-tester/android/app/gradle/
|
||||
@@ -36,8 +34,6 @@ project.xcworkspace
|
||||
/ReactAndroid/gradle/
|
||||
/ReactAndroid/gradlew
|
||||
/ReactAndroid/gradlew.bat
|
||||
/ReactAndroid/hermes-engine/build/
|
||||
/ReactAndroid/hermes-engine/.cxx/
|
||||
/template/android/app/build/
|
||||
/template/android/build/
|
||||
|
||||
@@ -86,6 +82,8 @@ package-lock.json
|
||||
|
||||
# ReactCommon subdir shouldn't have Xcode project
|
||||
/ReactCommon/**/*.xcodeproj
|
||||
/packages/rn-tester/build
|
||||
/packages/rn-tester/android/app/build/*
|
||||
|
||||
# Libs that shouldn't have Xcode project
|
||||
/Libraries/FBLazyVector/**/*.xcodeproj
|
||||
@@ -97,8 +95,6 @@ package-lock.json
|
||||
# Ruby Gems (Bundler)
|
||||
/vendor
|
||||
/template/vendor
|
||||
.ruby-version
|
||||
/**/.ruby-version
|
||||
|
||||
# iOS / CocoaPods
|
||||
/template/ios/build/
|
||||
@@ -116,11 +112,6 @@ package-lock.json
|
||||
/ReactCommon/react/renderer/components/rncore/
|
||||
/packages/rn-tester/NativeModuleExample/ScreenshotManagerSpec*
|
||||
|
||||
# Additional SDKs
|
||||
/sdks/download
|
||||
/sdks/hermes
|
||||
/sdks/hermesc
|
||||
|
||||
# Visual studio
|
||||
.vscode
|
||||
.vs
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
16
|
||||
@@ -0,0 +1 @@
|
||||
2.7.4
|
||||
@@ -10,6 +10,7 @@ load(
|
||||
)
|
||||
load(
|
||||
"//tools/build_defs/oss:rn_defs.bzl",
|
||||
"APPLETVOS",
|
||||
"HERMES_BYTECODE_VERSION",
|
||||
"IOS",
|
||||
"RCT_IMAGE_DATA_DECODER_SOCKET",
|
||||
@@ -35,7 +36,6 @@ RCTCXXBRIDGE_PUBLIC_HEADERS = {
|
||||
"JSCExecutorFactory.h",
|
||||
"NSDataBigString.h",
|
||||
"RCTCxxBridgeDelegate.h",
|
||||
"RCTJSIExecutorRuntimeInstaller.h",
|
||||
"RCTMessageThread.h",
|
||||
]
|
||||
}
|
||||
@@ -57,7 +57,6 @@ fb_native.genrule(
|
||||
) + [
|
||||
react_native_root_target("packages/rn-tester:nativecomponent-srcs"),
|
||||
],
|
||||
labels = ["uses_hg"],
|
||||
cmd = "$(exe {}) $OUT $SRCS".format(react_native_root_target("packages/react-native-codegen:write_to_json")),
|
||||
out = "schema-rncore.json",
|
||||
)
|
||||
@@ -97,7 +96,6 @@ rn_xplat_cxx_library2(
|
||||
# it's linked in your app, transparently use it".
|
||||
labels = [
|
||||
"depslint_never_remove",
|
||||
"pfh:ReactNative_CommonInfrastructurePlaceholder",
|
||||
"supermodule:xplat/default/public.react_native.infra",
|
||||
],
|
||||
preprocessor_flags = get_objc_arc_preprocessor_flags() + get_preprocessor_flags_for_build_mode() + [
|
||||
@@ -154,17 +152,14 @@ rn_xplat_cxx_library2(
|
||||
frameworks = [
|
||||
"$SDKROOT/System/Library/Frameworks/Foundation.framework",
|
||||
],
|
||||
labels = [
|
||||
"pfh:ReactNative_CommonInfrastructurePlaceholder",
|
||||
"supermodule:xplat/default/public.react_native.infra",
|
||||
],
|
||||
labels = ["supermodule:xplat/default/public.react_native.infra"],
|
||||
preprocessor_flags = get_objc_arc_preprocessor_flags() + get_preprocessor_flags_for_build_mode() + ["-DWITH_FBSYSTRACE=1"],
|
||||
visibility = ["PUBLIC"],
|
||||
deps = [
|
||||
":RCTCxxUtils",
|
||||
":ReactInternal",
|
||||
"//xplat/fbsystrace:fbsystrace",
|
||||
"//xplat/folly:headers_only_do_not_use",
|
||||
"//xplat/folly:headers_only",
|
||||
react_native_xplat_target("cxxreact:module"),
|
||||
react_native_xplat_target("cxxreact:bridge"),
|
||||
react_native_xplat_target("reactperflogger:reactperflogger"),
|
||||
@@ -188,16 +183,13 @@ rn_xplat_cxx_library2(
|
||||
exclude = RCTCXXMODULE_PUBLIC_HEADERS.values(),
|
||||
prefix = "React",
|
||||
),
|
||||
apple_sdks = (IOS,),
|
||||
apple_sdks = (IOS, APPLETVOS),
|
||||
contacts = ["oncall+react_native@xmail.facebook.com"],
|
||||
fbobjc_enable_exceptions = True,
|
||||
frameworks = [
|
||||
"$SDKROOT/System/Library/Frameworks/Foundation.framework",
|
||||
],
|
||||
labels = [
|
||||
"pfh:ReactNative_CommonInfrastructurePlaceholder",
|
||||
"supermodule:xplat/default/public.react_native.infra",
|
||||
],
|
||||
labels = ["supermodule:xplat/default/public.react_native.infra"],
|
||||
preprocessor_flags = get_objc_arc_preprocessor_flags() + get_preprocessor_flags_for_build_mode(),
|
||||
visibility = ["PUBLIC"],
|
||||
deps = [
|
||||
@@ -222,10 +214,7 @@ rn_xplat_cxx_library2(
|
||||
),
|
||||
contacts = ["oncall+react_native@xmail.facebook.com"],
|
||||
fbobjc_enable_exceptions = True,
|
||||
labels = [
|
||||
"pfh:ReactNative_CommonInfrastructurePlaceholder",
|
||||
"supermodule:xplat/default/public.react_native.infra",
|
||||
],
|
||||
labels = ["supermodule:xplat/default/public.react_native.infra"],
|
||||
preprocessor_flags = get_objc_arc_preprocessor_flags() + get_preprocessor_flags_for_build_mode(),
|
||||
visibility = ["PUBLIC"],
|
||||
deps = [
|
||||
@@ -255,7 +244,6 @@ REACT_PUBLIC_HEADERS = {
|
||||
"React/RCTBridgeDelegate.h": RCTBASE_PATH + "RCTBridgeDelegate.h",
|
||||
"React/RCTBridgeMethod.h": RCTBASE_PATH + "RCTBridgeMethod.h",
|
||||
"React/RCTBridgeModule.h": RCTBASE_PATH + "RCTBridgeModule.h",
|
||||
"React/RCTBridgeModuleDecorator.h": RCTBASE_PATH + "RCTBridgeModuleDecorator.h",
|
||||
"React/RCTBundleURLProvider.h": RCTBASE_PATH + "RCTBundleURLProvider.h",
|
||||
"React/RCTComponent.h": RCTVIEWS_PATH + "RCTComponent.h",
|
||||
"React/RCTComponentData.h": RCTVIEWS_PATH + "RCTComponentData.h",
|
||||
@@ -351,6 +339,7 @@ REACT_PUBLIC_HEADERS = {
|
||||
"React/RCTViewManager.h": RCTVIEWS_PATH + "RCTViewManager.h",
|
||||
"React/RCTViewUtils.h": RCTVIEWS_PATH + "RCTViewUtils.h",
|
||||
"React/RCTWeakProxy.h": RCTBASE_PATH + "RCTWeakProxy.h",
|
||||
"React/RCTWeakViewHolder.h": RCTVIEWS_PATH + "RCTWeakViewHolder.h",
|
||||
"React/RCTWrapperViewController.h": RCTVIEWS_PATH + "RCTWrapperViewController.h",
|
||||
"React/UIView+React.h": RCTVIEWS_PATH + "UIView+React.h",
|
||||
}
|
||||
@@ -428,7 +417,6 @@ rn_xplat_cxx_library2(
|
||||
labels = [
|
||||
"depslint_never_add",
|
||||
"depslint_never_remove", # Some old NativeModule still relies on +load unfortunately.
|
||||
"pfh:ReactNative_CommonInfrastructurePlaceholder",
|
||||
"supermodule:xplat/default/public.react_native.infra",
|
||||
],
|
||||
platform_preprocessor_flags = [(
|
||||
@@ -446,7 +434,6 @@ rn_xplat_cxx_library2(
|
||||
"//fbobjc/Libraries/FBQPLMetadataProviders/...",
|
||||
"//fbobjc/Libraries/FBReactKit/...",
|
||||
"//fbobjc/Libraries/FBiOSSecurityUtils/...",
|
||||
"//fbobjc/Libraries/RCTPrerendering/...",
|
||||
"//fbobjc/VendorLib/react-native-maps:react-native-maps",
|
||||
"//xplat/js:",
|
||||
"//xplat/js/react-native-github/React/...",
|
||||
@@ -519,7 +506,6 @@ rn_xplat_cxx_library2(
|
||||
header_path_prefix = "React",
|
||||
labels = [
|
||||
"disable_plugins_only_validation",
|
||||
"pfh:ReactNative_CommonInfrastructurePlaceholder",
|
||||
"supermodule:xplat/default/public.react_native.infra",
|
||||
],
|
||||
plugins = [
|
||||
@@ -602,10 +588,7 @@ rn_apple_library(
|
||||
"$PLATFORM_DIR/Developer/Library/Frameworks/Foundation.framework",
|
||||
],
|
||||
inherited_buck_flags = get_static_library_ios_flags(),
|
||||
labels = [
|
||||
"pfh:ReactNative_CommonInfrastructurePlaceholder",
|
||||
"supermodule:xplat/default/public.react_native.infra",
|
||||
],
|
||||
labels = ["supermodule:xplat/default/public.react_native.infra"],
|
||||
preprocessor_flags = get_objc_arc_preprocessor_flags() + get_preprocessor_flags_for_build_mode(),
|
||||
reexport_all_header_dependencies = True,
|
||||
deps = [
|
||||
@@ -675,7 +658,6 @@ rn_apple_library(
|
||||
contacts = ["oncall+react_native@xmail.facebook.com"],
|
||||
labels = [
|
||||
"disable_plugins_only_validation",
|
||||
"pfh:ReactNative_CommonInfrastructurePlaceholder",
|
||||
"supermodule:xplat/default/public.react_native.infra",
|
||||
],
|
||||
plugins = [react_fabric_component_plugin_provider("Image", "RCTImageCls")],
|
||||
@@ -706,10 +688,7 @@ rn_xplat_cxx_library2(
|
||||
},
|
||||
compiler_flags = ["-Wall"],
|
||||
contacts = ["oncall+react_native@xmail.facebook.com"],
|
||||
labels = [
|
||||
"pfh:ReactNative_CommonInfrastructurePlaceholder",
|
||||
"supermodule:xplat/default/public.react_native.infra",
|
||||
],
|
||||
labels = ["supermodule:xplat/default/public.react_native.infra"],
|
||||
visibility = ["PUBLIC"],
|
||||
deps = [
|
||||
"//xplat/js/react-native-github:RCTImage",
|
||||
@@ -736,21 +715,17 @@ rn_library(
|
||||
"**/__*__/**",
|
||||
"**/gulpfile.js",
|
||||
"Libraries/Components/Switch/SwitchSchema.js",
|
||||
"**/*._reactvr.js",
|
||||
],
|
||||
),
|
||||
labels = [
|
||||
"pfh:ReactNative_CommonInfrastructurePlaceholder",
|
||||
"supermodule:xplat/default/public.react_native.core",
|
||||
],
|
||||
labels = ["supermodule:xplat/default/public.react_native.core"],
|
||||
visibility = ["PUBLIC"],
|
||||
deps = [
|
||||
"//xplat/js:node_modules__abort_19controller",
|
||||
"//xplat/js:node_modules__anser",
|
||||
"//xplat/js:node_modules__base64_19js",
|
||||
"//xplat/js:node_modules__deprecated_19react_19native_19prop_19types",
|
||||
"//xplat/js:node_modules__event_19target_19shim",
|
||||
"//xplat/js:node_modules__invariant",
|
||||
"//xplat/js:node_modules__memoize_19one",
|
||||
"//xplat/js:node_modules__nullthrows",
|
||||
"//xplat/js:node_modules__pretty_19format",
|
||||
"//xplat/js:node_modules__promise",
|
||||
@@ -759,9 +734,10 @@ rn_library(
|
||||
"//xplat/js:node_modules__react_19shallow_19renderer",
|
||||
"//xplat/js:node_modules__regenerator_19runtime",
|
||||
"//xplat/js:node_modules__stacktrace_19parser",
|
||||
"//xplat/js:node_modules__use_19sync_19external_19store",
|
||||
"//xplat/js:node_modules__use_19subscription",
|
||||
"//xplat/js:node_modules__whatwg_19fetch",
|
||||
"//xplat/js/RKJSModules/Libraries/Polyfills:Polyfills",
|
||||
"//xplat/js/RKJSModules/Libraries/React:React",
|
||||
"//xplat/js/RKJSModules/vendor/react:react",
|
||||
"//xplat/js/RKJSModules/vendor/react-test-renderer:react-test-renderer",
|
||||
"//xplat/js/RKJSModules/vendor/scheduler:scheduler",
|
||||
@@ -778,10 +754,7 @@ rn_codegen(
|
||||
android_package_name = "com.facebook.fbreact.specs",
|
||||
codegen_modules = True,
|
||||
ios_assume_nonnull = False,
|
||||
library_labels = [
|
||||
"supermodule:xplat/default/public.react_native.infra",
|
||||
"pfh:ReactNative_CommonInfrastructurePlaceholder",
|
||||
],
|
||||
library_labels = ["supermodule:xplat/default/public.react_native.infra"],
|
||||
native_module_spec_name = "FBReactNativeSpec",
|
||||
src_prefix = "Libraries/",
|
||||
)
|
||||
@@ -791,10 +764,7 @@ rn_codegen(
|
||||
name = "FBReactNativeComponentSpec",
|
||||
codegen_components = True,
|
||||
ios_assume_nonnull = False,
|
||||
library_labels = [
|
||||
"supermodule:xplat/default/public.react_native.infra",
|
||||
"pfh:ReactNative_CommonInfrastructurePlaceholder",
|
||||
],
|
||||
library_labels = ["supermodule:xplat/default/public.react_native.infra"],
|
||||
src_prefix = "Libraries/",
|
||||
)
|
||||
|
||||
@@ -828,7 +798,6 @@ rn_apple_library(
|
||||
"depslint_never_remove", # Some old NativeModule still relies on +load unfortunately.
|
||||
"disable_plugins_only_validation",
|
||||
"extension_api_allow_unsafe_unavailable_usages",
|
||||
"pfh:ReactNative_CommonInfrastructurePlaceholder",
|
||||
"supermodule:xplat/default/public.react_native.infra",
|
||||
],
|
||||
plugins =
|
||||
@@ -878,7 +847,6 @@ rn_apple_library(
|
||||
labels = [
|
||||
"depslint_never_remove", # Some old NativeModule still relies on +load unfortunately.
|
||||
"disable_plugins_only_validation",
|
||||
"pfh:ReactNative_CommonInfrastructurePlaceholder",
|
||||
"supermodule:xplat/default/public.react_native.infra",
|
||||
],
|
||||
plugins =
|
||||
@@ -937,7 +905,6 @@ rn_apple_library(
|
||||
"depslint_never_remove", # Some old NativeModule still relies on +load unfortunately.
|
||||
"disable_plugins_only_validation",
|
||||
"extension_api_allow_unsafe_unavailable_usages",
|
||||
"pfh:ReactNative_CommonInfrastructurePlaceholder",
|
||||
"supermodule:xplat/default/public.react_native.infra",
|
||||
],
|
||||
plugins =
|
||||
@@ -985,7 +952,6 @@ rn_apple_library(
|
||||
"depslint_never_remove", # Some old NativeModule still relies on +load unfortunately.
|
||||
"disable_plugins_only_validation",
|
||||
"extension_api_allow_unsafe_unavailable_usages",
|
||||
"pfh:ReactNative_CommonInfrastructurePlaceholder",
|
||||
"supermodule:xplat/default/public.react_native.infra",
|
||||
],
|
||||
plugins =
|
||||
@@ -1037,7 +1003,6 @@ rn_apple_library(
|
||||
"depslint_never_remove", # Some old NativeModule still relies on +load unfortunately.
|
||||
"disable_plugins_only_validation",
|
||||
"extension_api_allow_unsafe_unavailable_usages",
|
||||
"pfh:ReactNative_CommonInfrastructurePlaceholder",
|
||||
"supermodule:xplat/default/public.react_native.infra",
|
||||
],
|
||||
plugins =
|
||||
@@ -1118,7 +1083,6 @@ rn_apple_library(
|
||||
"depslint_never_remove", # Some old NativeModule still relies on +load unfortunately.
|
||||
"disable_plugins_only_validation",
|
||||
"extension_api_allow_unsafe_unavailable_usages",
|
||||
"pfh:ReactNative_CommonInfrastructurePlaceholder",
|
||||
"supermodule:xplat/default/public.react_native.infra",
|
||||
],
|
||||
plugins =
|
||||
@@ -1252,7 +1216,6 @@ rn_xplat_cxx_library2(
|
||||
],
|
||||
labels = [
|
||||
"depslint_never_remove", # Some old NativeModule still relies on +load unfortunately.
|
||||
"pfh:ReactNative_CommonInfrastructurePlaceholder",
|
||||
"supermodule:xplat/default/public.react_native.infra",
|
||||
],
|
||||
preprocessor_flags = get_objc_arc_preprocessor_flags() + get_preprocessor_flags_for_build_mode(),
|
||||
@@ -1285,7 +1248,6 @@ rn_apple_library(
|
||||
labels = [
|
||||
"depslint_never_remove",
|
||||
"disable_plugins_only_validation",
|
||||
"pfh:ReactNative_CommonInfrastructurePlaceholder",
|
||||
"supermodule:xplat/default/public.react_native.infra",
|
||||
],
|
||||
plugins = react_module_plugin_providers(
|
||||
@@ -1326,7 +1288,6 @@ rn_xplat_cxx_library2(
|
||||
],
|
||||
labels = [
|
||||
"depslint_never_remove", # Some old NativeModule still relies on +load unfortunately.
|
||||
"pfh:ReactNative_CommonInfrastructurePlaceholder",
|
||||
"supermodule:xplat/default/public.react_native.infra",
|
||||
],
|
||||
preprocessor_flags = get_objc_arc_preprocessor_flags() + get_preprocessor_flags_for_build_mode(),
|
||||
@@ -1359,7 +1320,6 @@ rn_xplat_cxx_library2(
|
||||
],
|
||||
labels = [
|
||||
"depslint_never_remove",
|
||||
"pfh:ReactNative_CommonInfrastructurePlaceholder",
|
||||
"supermodule:xplat/default/public.react_native.infra",
|
||||
],
|
||||
preprocessor_flags = get_objc_arc_preprocessor_flags() + get_preprocessor_flags_for_build_mode(),
|
||||
@@ -1394,14 +1354,12 @@ rn_xplat_cxx_library2(
|
||||
],
|
||||
labels = [
|
||||
"depslint_never_remove",
|
||||
"pfh:ReactNative_CommonInfrastructurePlaceholder",
|
||||
"supermodule:xplat/default/public.react_native.infra",
|
||||
],
|
||||
preprocessor_flags = get_objc_arc_preprocessor_flags() + get_preprocessor_flags_for_build_mode(),
|
||||
visibility = ["PUBLIC"],
|
||||
deps = [
|
||||
"//fbobjc/Libraries/MobileUI/ComponentKit:ComponentKit",
|
||||
"//xplat/js/react-native-github:RCTFabric",
|
||||
"//xplat/js/react-native-github:RCTLinking",
|
||||
"//xplat/js/react-native-github:RCTPushNotification",
|
||||
"//xplat/js/react-native-github:ReactInternal",
|
||||
@@ -1430,7 +1388,6 @@ rn_xplat_cxx_library2(
|
||||
],
|
||||
labels = [
|
||||
"depslint_never_remove",
|
||||
"pfh:ReactNative_CommonInfrastructurePlaceholder",
|
||||
"supermodule:xplat/default/public.react_native.infra",
|
||||
],
|
||||
preprocessor_flags = get_objc_arc_preprocessor_flags() + get_preprocessor_flags_for_build_mode(),
|
||||
@@ -1438,7 +1395,6 @@ rn_xplat_cxx_library2(
|
||||
deps = [
|
||||
":RCTSurfaceHostingComponent",
|
||||
"//fbobjc/Libraries/MobileUI/ComponentKit:ComponentKit",
|
||||
"//xplat/js/react-native-github:RCTFabric",
|
||||
"//xplat/js/react-native-github:RCTLinking",
|
||||
"//xplat/js/react-native-github:RCTPushNotification",
|
||||
"//xplat/js/react-native-github:ReactInternal",
|
||||
@@ -1452,7 +1408,6 @@ rn_xplat_cxx_library2(
|
||||
"React/RCTConvert+CoreLocation.h": RCTVIEWS_PATH + "RCTConvert+CoreLocation.h",
|
||||
},
|
||||
labels = [
|
||||
"pfh:ReactNative_CommonInfrastructurePlaceholder",
|
||||
"supermodule:xplat/default/public.react_native.infra",
|
||||
],
|
||||
visibility = [
|
||||
|
||||
-493
@@ -1,498 +1,5 @@
|
||||
# Changelog
|
||||
|
||||
## v0.69.1
|
||||
|
||||
### Changed
|
||||
|
||||
#### iOS specific
|
||||
|
||||
- Make all Yoga headers public and add #ifdef __cplusplus ([43f831b23c](https://github.com/facebook/react-native/commit/43f831b23caf22e59af5c6d3fdd62fed3d20d4ec) by [@janicduplessis](https://github.com/janicduplessis))
|
||||
|
||||
### Fixed
|
||||
|
||||
- Use monotonic clock for performance.now() ([114d31feee](https://github.com/facebook/react-native/commit/114d31feeeb47f5a57419e5088c3cbe9340f757a))
|
||||
|
||||
#### iOS specific
|
||||
|
||||
- Fix build for React-RCTText ([4ea38e16bf](https://github.com/facebook/react-native/commit/4ea38e16bf533955557057656cba5346d2372acd) by [@ph4r05](https://github.com/ph4r05))
|
||||
- Fix RCT-Folly build error when use_frameworks! and hermes are both enabled ([79baca678a](https://github.com/facebook/react-native/commit/79baca678a743560fa16fdd551f1d0d018d34304) by [@Kudo](https://github.com/Kudo))
|
||||
- Fix use_frameworks! for 0.69 ([f97c6a5b49](https://github.com/facebook/react-native/commit/f97c6a5b498eec95e99a02c7842cb2ae160cd6cd) by [@Kudo](https://github.com/Kudo))
|
||||
|
||||
## v0.69.0
|
||||
|
||||
### Breaking
|
||||
|
||||
- Support for `console.disableYellowBox` [has been dropped](https://github.com/facebook/react-native/commit/b633cc130533f0731b2577123282c4530e4f0abe)
|
||||
- Already deprecated prop types have been removed ([cdfddb4dad](https://github.com/facebook/react-native/commit/cdfddb4dad7c69904850d7e5f089a32a1d3445d1), [3e229f27bc](https://github.com/facebook/react-native/commit/3e229f27bc9c7556876ff776abf70147289d544b), [10199b1581](https://github.com/facebook/react-native/commit/10199b158138b8645550b5579df87e654213fe42))
|
||||
- `removeListener`, deprecated since RN0.65, [was removed](https://github.com/facebook/react-native/commit/8dfbed786b40082a7a222e00dc0a621c0695697d) from Appearance
|
||||
- If you were using `SegmentedComponentIOS`, you will now need to move to the [segmented-control](https://github.com/react-native-segmented-control/segmented-control) library ([235f168574](https://github.com/facebook/react-native/commit/235f1685748442553e53f8ec6d904bc0314a8ae6))
|
||||
|
||||
### Added
|
||||
|
||||
- Add Hermes scripts to package ([004b8609d9](https://github.com/facebook/react-native/commit/004b8609d97b14a6d5cb8c9e63afdbe343c500da) by [@hramos](https://github.com/hramos))
|
||||
- Expose scheduler through FabricUIManager ([1730949e94](https://github.com/facebook/react-native/commit/1730949e94aa23927a90d2a64d91977b7e2904d6) by [@cortinico](https://github.com/cortinico))
|
||||
- Add event listeners to Scheduler ([e51e19ecc1](https://github.com/facebook/react-native/commit/e51e19ecc1d1b8ac5c860eac55338ef13471844f) by [@cortinico](https://github.com/cortinico))
|
||||
- C++ TurboModule methods can return functions ([c7380ba113](https://github.com/facebook/react-native/commit/c7380ba1131b26b487ecae87239a4cf82afefd15) by [@appden](https://github.com/appden))
|
||||
- Add support for devtools' profiler ([fefa7b6ac8](https://github.com/facebook/react-native/commit/fefa7b6ac8a1e0e33fa7a1070936c5c83c873c0a) by [@jpporto](https://github.com/jpporto))
|
||||
- Add getAll function to FormData class for getting all parts containing that key. This is also available in web API. ([d05a5d1551](https://github.com/facebook/react-native/commit/d05a5d15512ab794ef80b31ef91090d5d88b3fcd) by [@matinzd](https://github.com/matinzd))
|
||||
- Automatic type conversions for C++ TurboModules ([31f0796237](https://github.com/facebook/react-native/commit/31f079623732fb017b1fa38d56abe855d7738ece) by [@appden](https://github.com/appden))
|
||||
- New bridging API for JSI <-> C++ ([30cb78e709](https://github.com/facebook/react-native/commit/30cb78e709bccb4f7bf7aab3f6b0f1ba4261f577) by [@appden](https://github.com/appden))
|
||||
- Add asBool() method to JSI ([603620b739](https://github.com/facebook/react-native/commit/603620b7394da5855e2255790bfea9ad7d80ddf9) by [@appden](https://github.com/appden))
|
||||
- CustomEvent and Event polyfills for React Native ([6abbef1200](https://github.com/facebook/react-native/commit/6abbef1200af9adab1848de17955d77fbe0ad5da) by [@JoshuaGross](https://github.com/JoshuaGross))
|
||||
- Implement Runtime.getHeapUsage for hermes chrome inspector ([cff9590864](https://github.com/facebook/react-native/commit/cff9590864c4be153a4eb49757b7cac8b3f23f66) by [@janicduplessis](https://github.com/janicduplessis))
|
||||
- Introduce ReactNativeFeatureFlags file to control FeatureFlags in React Native ([33aba77456](https://github.com/facebook/react-native/commit/33aba774564acdec216e02e28f17ad08ad7bc26b) by [@mdvacca](https://github.com/mdvacca))
|
||||
- Added fail-safe check to catch MissingWebViewPackage Exception ([8c573d9336](https://github.com/facebook/react-native/commit/8c573d933652ae4da1008502c53fce93057101c0) by [@Kunal-Airtel2022](https://github.com/Kunal-Airtel2022))
|
||||
- Add ability to access properties with symbol keys through JSI ([9010bfe457](https://github.com/facebook/react-native/commit/9010bfe457b77862024214ce6210504ff1786ef5) by [@neildhar](https://github.com/neildhar))
|
||||
- Allow color styles to be animated using native driver ([201f355479](https://github.com/facebook/react-native/commit/201f355479cafbcece3d9eb40a52bae003da3e5c) by [@genkikondo](https://github.com/genkikondo))
|
||||
- Make react-native depend on react-native-gradle-plugin ([3346efb7d4](https://github.com/facebook/react-native/commit/3346efb7d422bd8eb7f48650b454071f9981fa0b) by [@cortinico](https://github.com/cortinico))
|
||||
- Add RawEventTelemetryEventEmitter interface to ReactNativePrivateInterface ([1f15a64028](https://github.com/facebook/react-native/commit/1f15a6402869b001cae049facc17126924b97197) by [@JoshuaGross](https://github.com/JoshuaGross))
|
||||
- Implement Runtime.getHeapUsage for hermes chrome inspector ([3568a72987](https://github.com/facebook/react-native/commit/3568a7298738a651d76c70763362c297ab601ee8) by [@janicduplessis](https://github.com/janicduplessis))
|
||||
- Add support for C++17 in OSS ([c2e4ae39b8](https://github.com/facebook/react-native/commit/c2e4ae39b8a5c6534a3fa4dae4130166eda15169) by [@sammy-SC](https://github.com/sammy-SC))
|
||||
|
||||
#### Android specific
|
||||
|
||||
- Generate `Nullable` for optional objects and arrays in module codegen. ([ffaa5d69bc](https://github.com/facebook/react-native/commit/ffaa5d69bc268918891121e2d60e7ca08ee82530))
|
||||
- Expose an API to enable Concurrent Root on Android ([d7b64b8d4b](https://github.com/facebook/react-native/commit/d7b64b8d4b2f403ce00b27c5df89ffb3a64dc6de) by [@cortinico](https://github.com/cortinico))
|
||||
- Add scrollEventThrottle prop support in Android ([cf55fd587e](https://github.com/facebook/react-native/commit/cf55fd587e6cc82a73079be6076d244ab72fa359) by [@ryancat](https://github.com/ryancat))
|
||||
- Accessibility announcement for list and grid in FlatList ([dd6325bafe](https://github.com/facebook/react-native/commit/dd6325bafe1a539d348f3710e717a6344576b859) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987))
|
||||
- Introduce ModuleDataCleaner.cleanDataFromModules(ReactContext) ([184dfb8f8b](https://github.com/facebook/react-native/commit/184dfb8f8bd4dfbb8d1575e9554e3f3361793015) by [@RSNara](https://github.com/RSNara))
|
||||
- Introduce ReactContext.getNativeModules() ([b978308519](https://github.com/facebook/react-native/commit/b978308519f71c6c7fda4b38a842aa219a349275) by [@RSNara](https://github.com/RSNara))
|
||||
- MapBuffer implementation for JVM -> C++ communication ([cf6f3b680b](https://github.com/facebook/react-native/commit/cf6f3b680b43fae31e97b14af681293503025a0c))
|
||||
- Make links independently focusable by Talkback ([7b5b114d57](https://github.com/facebook/react-native/commit/7b5b114d578142d18bf4a7a5279b179a9ac8d958) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987))
|
||||
- Support animating text color with native driver ([87cdb607e4](https://github.com/facebook/react-native/commit/87cdb607e4792156d433c44b89932e7dae3371da) by [@genkikondo](https://github.com/genkikondo))
|
||||
- Added an experimental prop serialization path based on MapBuffer ([cbcdaae2b5](https://github.com/facebook/react-native/commit/cbcdaae2b5dda2a44c95d83dcb5b5aa0f43bc6f9))
|
||||
- Allow to setup a Gradle Enterprise instance via an external script ([f11dcfaea1](https://github.com/facebook/react-native/commit/f11dcfaea14249b059aea2474ce36a0665140d4f) by [@cortinico](https://github.com/cortinico))
|
||||
- Support platform color with AnimatedColor ([cb42049e0a](https://github.com/facebook/react-native/commit/cb42049e0ae262afe907ace1099414836ab0018d) by [@genkikondo](https://github.com/genkikondo))
|
||||
- Support running animations with AnimatedColor with native driver ([3f49e6763e](https://github.com/facebook/react-native/commit/3f49e6763e66447f6ae17dc2f032e27330b7b74a) by [@genkikondo](https://github.com/genkikondo))
|
||||
- Add public API to ReactRootView to control if JS touch events are dispatched ([0a517ae438](https://github.com/facebook/react-native/commit/0a517ae43892fb764d829f8bae56c1ac58356b1b) by [@ryancat](https://github.com/ryancat))
|
||||
|
||||
#### iOS specific
|
||||
|
||||
- Prepare a method in the AppDelegate to control the concurrentRoot. ([8ac8439e0d](https://github.com/facebook/react-native/commit/8ac8439e0dcc0cc4a9c0cc99f614a5e19bae56eb) by [@cipolleschi](https://github.com/cipolleschi))
|
||||
- `hotkeysEnabled` property is added to `RCTDevMenu` which allows enabling/disabling hotkeys that triggers developer menu popup ([1a1a304ed2](https://github.com/facebook/react-native/commit/1a1a304ed2023d60547aef65b1a7bf56467edf08))
|
||||
- Allow modifying iOS image cache limits ([61b013e7ad](https://github.com/facebook/react-native/commit/61b013e7ad8a1cc28ee39434d2fd96b74b96cf5f) by [@danilobuerger](https://github.com/danilobuerger))
|
||||
- Add dismissActionSheet method to ActionSheetIOS ([64ebe5bbdd](https://github.com/facebook/react-native/commit/64ebe5bbdd32fc3b3a243a8a81a6f724d8f81267) by [@gabrieldonadel](https://github.com/gabrieldonadel))
|
||||
- Integrated the `accessibilityLanguage` prop to all the available components. The prop is available for any platform but it will work only on iOS. ([7b05b091fd](https://github.com/facebook/react-native/commit/7b05b091fd97f95b778369277ac2147730abc7b8) by [@dgopsq](https://github.com/dgopsq))
|
||||
- Support running animations with AnimatedColor with native driver ([49f3f47b1e](https://github.com/facebook/react-native/commit/49f3f47b1e9b840e4374d46b105604f4d2c22dd5) by [@genkikondo](https://github.com/genkikondo))
|
||||
|
||||
### Changed
|
||||
|
||||
- Update direct Metro dependencies to 0.70.1 ([b74e964e70](https://github.com/facebook/react-native/commit/b74e964e705c40834acad7020562e870cdad9db1), ([c92b64b16a](https://github.com/facebook/react-native/commit/c92b64b16a5710c1dfaea9af4c271931e4669636) by [@arushikesarwani94](https://github.com/arushikesarwani94)), ([f89a0b765c](https://github.com/facebook/react-native/commit/f89a0b765c09c9aba573f03777cc76673989628f) by [@robhogan](https://github.com/robhogan))
|
||||
- Upgrade RN CLI to v8.0.0 ([0605880c9e](https://github.com/facebook/react-native/commit/0605880c9ed0aec812f3198eb5075db64fba969a), [1e0226f933](https://github.com/facebook/react-native/commit/1e0226f933814bf9ada87eaa14348bfff863ead1), [24bb7f7380](https://github.com/facebook/react-native/commit/24bb7f7380662925f078d78a03fbc954af2da3d6), [7dceb9b63c](https://github.com/facebook/react-native/commit/7dceb9b63c0bfd5b13bf6d26f9530729506e9097) by [@thymikee](https://github.com/thymikee))
|
||||
- Replace use-subscripton with use-sync-external-store ([93b50be8c2](https://github.com/facebook/react-native/commit/93b50be8c2341a0daf41f6fdc656896c4907c4dc) by [@rickhanlonii](https://github.com/rickhanlonii))
|
||||
- Expose UIManager from Scheduler ([54db5f2012](https://github.com/facebook/react-native/commit/54db5f201292ebf267800d92b7dd5bfa22431963) by [@cortinico](https://github.com/cortinico))
|
||||
- Optimized VirtualizedList context when used with nested lists ([ceb0a54608](https://github.com/facebook/react-native/commit/ceb0a546083509192c059cdd93d6aa379e38ef4e) by [@javache](https://github.com/javache))
|
||||
- Remove usage of std::string in EarlyJsErrorHandler. ([30051b2c41](https://github.com/facebook/react-native/commit/30051b2c4185bff015c72069488b5f6ba3391ad7) by [@sshic](https://github.com/sshic))
|
||||
- `eslint-config`: add support for ESLint 8 ([864a8c11b2](https://github.com/facebook/react-native/commit/864a8c11b2a7540f607ebc0e084edd7393169359) by [@wcandillon](https://github.com/wcandillon))
|
||||
- `eslint-config`: add support for TypeScript 4.5+ ([199ac680c7](https://github.com/facebook/react-native/commit/199ac680c7867a982e25620219bffa18f85f5404) by [@rnike](https://github.com/rnike))
|
||||
- Upgraded react-devtools-core dependency to 4.24.0 ([a7a781ff4a](https://github.com/facebook/react-native/commit/a7a781ff4a13e744f4eb3007ef0657740b277a72))
|
||||
- Avoid flattening nodes with event props ([980c52de41](https://github.com/facebook/react-native/commit/980c52de41258f6cf2d2360144ea7ca16a19c9f8))
|
||||
- Type the argument of Animated.interpolate as read-only ([6584304c10](https://github.com/facebook/react-native/commit/6584304c100ce4d51a5c4d606170a6ad0dc00875) by [@motiz88](https://github.com/motiz88))
|
||||
- Update gradle-download-task to 5.0.1 to support concurrent downloads ([a86cae7aac](https://github.com/facebook/react-native/commit/a86cae7aacc9837536e7d679870a57dcd0f45475) by [@michel-kraemer](https://github.com/michel-kraemer))
|
||||
- Logging a soft error when ReactRootView has an id other than -1 instead of crashing the app in hybrid apps ([1ca2c24930](https://github.com/facebook/react-native/commit/1ca2c2493027c1b027146cd41e17dd8a4fc33a41) by [@Kunal-Airtel2022](https://github.com/Kunal-Airtel2022))
|
||||
|
||||
#### Android specific
|
||||
|
||||
- Gradle: extend the algoritm to find hermesc paths ([aeac6ab677](https://github.com/facebook/react-native/commit/aeac6ab6773cd2c0ca7abe9e5aa3f22fa81683e5) by [@cortinico](https://github.com/cortinico))
|
||||
- Bump boost for Android to 1.76 to align with iOS ([5cd6367f0b](https://github.com/facebook/react-native/commit/5cd6367f0b86543274a15bb6d0e53a8545fed845) by [@kelset](https://github.com/kelset))
|
||||
- Adopt `MapBuffer` interface for `ReadableMapBuffer` ([81e4249315](https://github.com/facebook/react-native/commit/81e42493158edd5e7b88f98c19c87e9d61ba4aba))
|
||||
- Mark intent as nullable ([5ffa0b0aa6](https://github.com/facebook/react-native/commit/5ffa0b0aa6c523234c634167be1f94b0d9edb0f7) by [@sshic](https://github.com/sshic))
|
||||
- Use CMake to build ReactAndroid module ([e3830ddffd](https://github.com/facebook/react-native/commit/e3830ddffd9260fe071e0c9f9df40b379d54cf26))
|
||||
- Update template/android and RN Tester to use `hermes-engine` from the `react-native` NPM package. ([4d91f40fbd](https://github.com/facebook/react-native/commit/4d91f40fbdf0012689b04084113299676342c0dc) by [@cortinico](https://github.com/cortinico))
|
||||
- Build Hermes from Source ([a3d9892ed9](https://github.com/facebook/react-native/commit/a3d9892ed9c993d16fa36fa6b713e2ead43fcc77) by [@cortinico](https://github.com/cortinico))
|
||||
- Rename field with default values for ReactConfig to DEFAULT_CONFIG ([964e816752](https://github.com/facebook/react-native/commit/964e81675286c80a8e322127aa7c052f62621098))
|
||||
- Moved `com/react/facebook/uimanager/interfaces` files into `com/react/facebook/uimanager` to enable Kotlin build ([b1a779392d](https://github.com/facebook/react-native/commit/b1a779392d483c649d428debfe4a6405247b8c0e))
|
||||
- Bump AGP to 7.1.0 and fix bundle inclusion in release mode ([200488e87c](https://github.com/facebook/react-native/commit/200488e87cf4bc355e03c78cd814b97b23452117) by [@gabrieldonadel](https://github.com/gabrieldonadel))
|
||||
- Release react-native-gradle-plugin 0.0.5 ([42272211e4](https://github.com/facebook/react-native/commit/42272211e4a1b7cff7770b59cf1bcf649cbdd6fc) by [@cortinico](https://github.com/cortinico))
|
||||
- ViewPagerAndroid recommendation link. ([7e8cce3d2d](https://github.com/facebook/react-native/commit/7e8cce3d2ddffbe36bcb3c9ec2f006f7e1b42a79) by [@maaxg](https://github.com/maaxg))
|
||||
- Bump android Appcompat to 1.4.1 ([6b61995647](https://github.com/facebook/react-native/commit/6b61995647c789a567845521fed7b0cc1e0cddb7) by [@gabrieldonadel](https://github.com/gabrieldonadel))
|
||||
- Remove `react-native-gradle-plugin` as a dependency from template's package.json ([cd79317672](https://github.com/facebook/react-native/commit/cd79317672e5c99636346f2abb641a688a4ceb82) by [@cortinico](https://github.com/cortinico))
|
||||
- Use 2g as a default heap size for gradle builds ([09e418ef8e](https://github.com/facebook/react-native/commit/09e418ef8e98fd026cf828696ff2475993b76ac2))
|
||||
- Use new StatusBar API on Android 11 (API 30)+ ([50c8e973f0](https://github.com/facebook/react-native/commit/50c8e973f067d4ef1fc3c2eddd360a0709828968) by [@ieatfood](https://github.com/ieatfood))
|
||||
- Change static string to public ([ab45138394](https://github.com/facebook/react-native/commit/ab45138394f41aeb13370882837968636de04c24) by [@sshic](https://github.com/sshic))
|
||||
|
||||
#### iOS specific
|
||||
|
||||
- Use pre-built HermesC if available in current React Native release ([644fe430fd](https://github.com/facebook/react-native/commit/644fe430fdecc0bf1fa098d1c2d52178da6c987c) by [@hramos](https://github.com/hramos))
|
||||
- When building Hermes from source, the filesystem will now be prepared using the new hermes-utils.js scripts, outside of CocoaPods ([aaa01f7710](https://github.com/facebook/react-native/commit/aaa01f77106f891696d9ec508e2ee71111a6af2a) by [@hramos](https://github.com/hramos))
|
||||
- Expose scheduler through RCTSurfacePresenter ([614aa86916](https://github.com/facebook/react-native/commit/614aa86916394d8ee2ecb236f38de6bb7e161ca2) by [@cortinico](https://github.com/cortinico))
|
||||
- Adopt UIGraphicsImageRenderer API ([d70d7fd0b3](https://github.com/facebook/react-native/commit/d70d7fd0b3984ee54622afc4692a6c945618c345) by [@matrush](https://github.com/matrush))
|
||||
- Build Hermes from source when Hermes is used ([bb01b75637](https://github.com/facebook/react-native/commit/bb01b75637edc1159a3bdb3af86936e1c92f39c1) by [@hramos](https://github.com/hramos))
|
||||
- Update CodeGen scripts to accept custom node executable ([323db75c36](https://github.com/facebook/react-native/commit/323db75c36d26d771f6b231c8eabc5afc0da74d3) by [@cipolleschi](https://github.com/cipolleschi))
|
||||
- Fixed the fallback behavior when the `.xcode.env` file is missing, actually using the old `find-node-for-xcode.sh` script ([705c6f57d6](https://github.com/facebook/react-native/commit/705c6f57d66b4499f43489292183a58413402a74) by [@cipolleschi](https://github.com/cipolleschi))
|
||||
- Adding a link in a message for the users. ([2c52131f5e](https://github.com/facebook/react-native/commit/2c52131f5e0eb4668681242fcdd8150afe3c5827) by [@cipolleschi](https://github.com/cipolleschi))
|
||||
- Bump ruby to 2.7.5 ([2c87b7466e](https://github.com/facebook/react-native/commit/2c87b7466e098c5cd230e02b279fc7bc7a357615) by [@danilobuerger](https://github.com/danilobuerger))
|
||||
- This PR removes the `find-node.sh` scripts and replaces it with an `.xcode.env` file that is sourced by the script phases that needs it. The `.xcode.env` file is versioned: to customize a local environment, an unversioned `.xcode.local.env` can be used. ([0480f56c5b](https://github.com/facebook/react-native/commit/0480f56c5b5478b6ebe5ad88e347cad2810bfb17) by [@cipolleschi](https://github.com/cipolleschi))
|
||||
- Update `PushNotificationIOS.checkPermissions` to include iOS 10+ notification settings. ([17ecd2fb5b](https://github.com/facebook/react-native/commit/17ecd2fb5b3cfb8aa0282ed406b16dc3b9777018))
|
||||
- Enable SonarKit in React-Core when the configuration is `'Debug'` ([b5343a6b0d](https://github.com/facebook/react-native/commit/b5343a6b0dd07c1b4ef9dac549df67a4d68ebd1e) by [@cipolleschi](https://github.com/cipolleschi))
|
||||
- When Hermes is enabled, the Hermes Engine will be built from source instead of using the pre-built `hermes-engine` CocoaPod. ([12ad1fffe8](https://github.com/facebook/react-native/commit/12ad1fffe87c0c5ab2e001f318ff4f8d3eda7479) by [@hramos](https://github.com/hramos))
|
||||
- Replaced folly::Optional with std::optional from C++17 in Objc module generator. ([45e2941367](https://github.com/facebook/react-native/commit/45e2941367fbf13584193bbda598173802289167) by [@philIip](https://github.com/philIip))
|
||||
- Removed methodName parameter that was used only for a warning message and moved the warning parameter to be calculated inline. ([cfb11ca2f6](https://github.com/facebook/react-native/commit/cfb11ca2f67c59c090b8a58b2b7bdaacef0e19df))
|
||||
- Fix the crash caused by nil partialLoadHandler ([46bc521513](https://github.com/facebook/react-native/commit/46bc521513c9c78e5ffc49cf3e571757e1a91cef))
|
||||
- Synchronously render cached images ([189c2c8958](https://github.com/facebook/react-native/commit/189c2c8958442541c6b4f42860b2943ece612da2))
|
||||
- Updated Flipper-Glog to 0.5.0.4 ([cd60ffdb62](https://github.com/facebook/react-native/commit/cd60ffdb62b2183cd24baef3075d56f758cea24a))
|
||||
- Add function to report early js errors ([1804951595](https://github.com/facebook/react-native/commit/180495159517dc0bfa103621e5ff62fc04cb3c8b) by [@sshic](https://github.com/sshic))
|
||||
|
||||
### Deprecated
|
||||
|
||||
- Deprecate the use of `react-native/jest/preprocessor.js` by external projects ([c1e9aa9a27](https://github.com/facebook/react-native/commit/c1e9aa9a272aed3cba60c4aeff783eeb8bffce68) by [@motiz88](https://github.com/motiz88))
|
||||
- Deprecate the Promise.prototype.done method and log a warning when it's called in development. ([35800962c1](https://github.com/facebook/react-native/commit/35800962c16a33eb8e9ff1adfd428cf00bb670d3) by [@motiz88](https://github.com/motiz88))
|
||||
|
||||
#### iOS specific
|
||||
|
||||
- Deprecating support for iOS/tvOS SDK 11.0, 12.4+ is now required ([5f2835b14d](https://github.com/facebook/react-native/commit/5f2835b14d35681c268dd64d6ec284ea5f053be3), ([c71e6efbcd](https://github.com/facebook/react-native/commit/c71e6efbcd2b95faee327d9763d321488120bc5e), ([982ca30de0](https://github.com/facebook/react-native/commit/982ca30de079d7e80bd0b50365d58b9048fb628f) by [@philIip](https://github.com/philIip))
|
||||
|
||||
#### iOS specific
|
||||
|
||||
- Removed lint restricting `DynamicColorIOS` to only two properties ([13b0b06522](https://github.com/facebook/react-native/commit/13b0b0652259ada468cc044b0b604edb666b2eb9))
|
||||
|
||||
### Fixed
|
||||
|
||||
- Remove unactionable warning about `codegenNativeComponent` when on 'Paper' ([494b73cb33](https://github.com/facebook/react-native/commit/494b73cb33197fa865e9ead8fdca11bce6822917) by [@tido64](https://github.com/tido64))
|
||||
- Fix typo in Value's constructor with a Symbol ([a7a0f86a73](https://github.com/facebook/react-native/commit/a7a0f86a73ab51be31fb2c3205612d7ff1fb5384) by [@jpporto](https://github.com/jpporto))
|
||||
- Avoid full copy of large folly::dynamic objects by switching to std::move semantics ([3f98c8e4c2](https://github.com/facebook/react-native/commit/3f98c8e4c2c8f40b81c1a90aa65c1bdc9327faed) by [@NikoAri](https://github.com/NikoAri))
|
||||
- Fix performance issue on Animated.interpolate with big input range ([f503b21203](https://github.com/facebook/react-native/commit/f503b212039f79f00ea56b65ecf3cd150b82f087) by [@Almouro](https://github.com/Almouro))
|
||||
- Update function spacing linting rules ([8650220cf9](https://github.com/facebook/react-native/commit/8650220cf99739c4b904a37ce4f19ce7dfd3bdbb) by [@joeframbach](https://github.com/joeframbach))
|
||||
- Add supportsFromJs and supportsToJs template variables ([087624ccaf](https://github.com/facebook/react-native/commit/087624ccaf2e484c0b6425e57edf9afd62a06e9a) by [@appden](https://github.com/appden))
|
||||
- The Array appended to FormData is transmitted as a string ([d2e8e7d58e](https://github.com/facebook/react-native/commit/d2e8e7d58e680e0bb3b4da1f820dd4dd840639f5) by [@bang9](https://github.com/bang9))
|
||||
- AppState.removeEventListener correctly removes listener for blur and focus events ([9aab25ec53](https://github.com/facebook/react-native/commit/9aab25ec536473ffe6d22c5efeae8fea6bd769be) by [@AntoineDoubovetzky](https://github.com/AntoineDoubovetzky))
|
||||
- `focus()` on TextInput to respect its `editable` state ([8a5460ce80](https://github.com/facebook/react-native/commit/8a5460ce80e69c11a007121d4278d55642f6b10e) by [@vonovak](https://github.com/vonovak))
|
||||
- Restore Windows build with RawPropsParser.cpp ([2d64d1d693](https://github.com/facebook/react-native/commit/2d64d1d69360161c047c86a026403d8074ba28bb) by [@TatianaKapos](https://github.com/TatianaKapos))
|
||||
- Fix babel-plugin-codegen crash when export init is null ([ae756647c9](https://github.com/facebook/react-native/commit/ae756647c9b8a88ba615fd30185f621825a33427) by [@janicduplessis](https://github.com/janicduplessis))
|
||||
- Fixed compilation warning due to `using namespace` being used as part of header ([009d80bf5a](https://github.com/facebook/react-native/commit/009d80bf5a55dd74be448960b1344ac7599c6bae) by [@arhelmus](https://github.com/arhelmus))
|
||||
- Allow including TurboModule.h in mixed rtti/no-rtti environment, even if TurboModule.h/cpp is compiled without RTTI. ([1f87729697](https://github.com/facebook/react-native/commit/1f87729697370a4ab31e2bb9ab1780438d9e146f) by [@nlutsenko](https://github.com/nlutsenko))
|
||||
- Remove prettier from dependencies in eslint-config ([2db1bca952](https://github.com/facebook/react-native/commit/2db1bca95224ce39484c3f27508aec9a21ce126a) by [@Kerumen](https://github.com/Kerumen))
|
||||
- Switch Component doesn't disable click functionality when disabled ([b2e625a517](https://github.com/facebook/react-native/commit/b2e625a51723becea4cef0433448fbec679669ee) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987))
|
||||
- Support numeric color values in StyleSheet's Flow types ([83b1975b90](https://github.com/facebook/react-native/commit/83b1975b90569a36020da33156615a13fcc7ba92) by [@motiz88](https://github.com/motiz88))
|
||||
- Fix build break on Windows with ReactCommon ([42b391775f](https://github.com/facebook/react-native/commit/42b391775f663df335f6f2553104fc2fa35b1bee) by [@chiaramooney](https://github.com/chiaramooney))
|
||||
- Fixed opacity value in TouchableOpacity ([3eddc9abb7](https://github.com/facebook/react-native/commit/3eddc9abb70eb54209c68aab7dbd69e363cc7b29) by [@hetanthakkar1](https://github.com/hetanthakkar1))
|
||||
- Remove illegal private property access in VirtualizedSectionList.scrollToLocation ([b2f871a6fa](https://github.com/facebook/react-native/commit/b2f871a6fa9c92dd0712055384b9eca6d828e37d) by [@motiz88](https://github.com/motiz88))
|
||||
- JS animated node value updates properly when listener is attached ([1f778014a7](https://github.com/facebook/react-native/commit/1f778014a7e95c5c473898c38d5b1e0725cd373c) by [@genkikondo](https://github.com/genkikondo))
|
||||
- Working around Long paths limitation on Windows ([7b76abc0d3](https://github.com/facebook/react-native/commit/7b76abc0d3a0a5bec37f314c80954e412fc5f5ec) by [@mganandraj](https://github.com/mganandraj))
|
||||
- Fix VirtualizedList with initialScrollIndex not rendering all elements when data is updated ([c5c17985da](https://github.com/facebook/react-native/commit/c5c17985dae402725abb8a3a94ccedc515428711) by [@AntoineDoubovetzky](https://github.com/AntoineDoubovetzky))
|
||||
|
||||
#### Android specific
|
||||
|
||||
- Add back hermes inspector support ([6b6adcc111](https://github.com/facebook/react-native/commit/6b6adcc111123bec2c4c110070b2506385e74664) by [@Kudo](https://github.com/Kudo))
|
||||
- Fixed issue where any node with an AccessibilityDelegate set (which was any node with any accessibility propoerty), was using ExploreByTouchHelper's built in AccessibilityNodeProvider, and not properly populating their AccessibilityNodeInfo's, leading to focus issues and issues with automated test services like UIAutomator. ([70fcab76a4](https://github.com/facebook/react-native/commit/70fcab76a4dcf65e628ac897620fe050758574e3) by [@blavalla](https://github.com/blavalla))
|
||||
- Fix Extras usage in Android implementation of Linking.sendIntent() ([86f8d0bb52](https://github.com/facebook/react-native/commit/86f8d0bb528a75777c357ae214643ed58c326ca9))
|
||||
- Fix typo in gradle plugin deprecation message ([41cfd2f976](https://github.com/facebook/react-native/commit/41cfd2f9768e4742eedd299ab467d316d016705e) by [@mikehardy](https://github.com/mikehardy))
|
||||
- Fixed `TimingModule` related functions for headless JS tasks, eg. `setTimeout` ([dac56ce077](https://github.com/facebook/react-native/commit/dac56ce0776e0e4d23ed4f8b324f2e2432aefa6a) by [@marcesengel](https://github.com/marcesengel))
|
||||
- Improve support for Android users on M1 machine ([c5babd993a](https://github.com/facebook/react-native/commit/c5babd993a2bed2994ecc4710fa9e424b3e6cfc2) by [@cortinico](https://github.com/cortinico))
|
||||
- Do not use `rootProject` directly in Gradle scripts ([b2bc5aa5c9](https://github.com/facebook/react-native/commit/b2bc5aa5c903ad057a53d4caa82b0fe74e01c07c) by [@cortinico](https://github.com/cortinico))
|
||||
- Adding null check for context in redbox surface delegate ([9527ab1584](https://github.com/facebook/react-native/commit/9527ab1584869d7966c562e8aa7cbf48788156a3) by [@ryancat](https://github.com/ryancat))
|
||||
- Fix crash on empty snapToOffsets array ([145fd041c7](https://github.com/facebook/react-native/commit/145fd041c7afe9a18f08f461487bb515ab2f516a) by [@ryancat](https://github.com/ryancat))
|
||||
- Fix StatusBar not updating to use translucent values when set to the same value across different activities ([d34a75e9e5](https://github.com/facebook/react-native/commit/d34a75e9e5932adcac4a16f5b815bb909c3aa0dd))
|
||||
- Fix underlineColorAndroid transparent not working on API 21 ([52aee50a70](https://github.com/facebook/react-native/commit/52aee50a704bbeab91f5fa05fe3220dee304422f) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987))
|
||||
- Fixed regression on content in scroll view not responding to touch when fling got interrupted ([bb8ff9260f](https://github.com/facebook/react-native/commit/bb8ff9260fe6a783171f35ce1a459927d8179d08) by [@ryancat](https://github.com/ryancat))
|
||||
- Fixes android build error when compiling as library ([c34ef5841c](https://github.com/facebook/react-native/commit/c34ef5841cf3a63a9cc96add577d6bf6d52e4397) by [@nickfujita](https://github.com/nickfujita))
|
||||
- Cancel post touch process when new touch is received ([0368081858](https://github.com/facebook/react-native/commit/0368081858193d7c2537acd9080d11bb701ee98b) by [@ryancat](https://github.com/ryancat))
|
||||
- Improve rendering of images when resampled and corner radius applied ([f743bed657](https://github.com/facebook/react-native/commit/f743bed657591b078300a6519e3d68db542fd757) by [@javache](https://github.com/javache))
|
||||
- Fix transform when calculate overflowInset ([0975e96d53](https://github.com/facebook/react-native/commit/0975e96d53546ac05b2154352fe56e5d82e2a1f8) by [@ryancat](https://github.com/ryancat))
|
||||
- Fix ReactHorizontalScrollView contentOffset ([9f6f97151c](https://github.com/facebook/react-native/commit/9f6f97151c44a0f727c9dd938222be1860ecf3f9) by [@genkikondo](https://github.com/genkikondo))
|
||||
- Text Component does not announce disabled and disables click functionality when disabled ([7b2d8178b1](https://github.com/facebook/react-native/commit/7b2d8178b155f5f1b247614c46e5e20f31bbd438) by [@fabriziobertoglio1987](https://github.com/fabriziobertoglio1987))
|
||||
- Fix StatusBar on Android API 30 ([9ed2df628d](https://github.com/facebook/react-native/commit/9ed2df628ddd410cc3383e68b0386471432445c0) by [@ieatfood](https://github.com/ieatfood))
|
||||
- Use root locale when converting string case. ([5341ad8962](https://github.com/facebook/react-native/commit/5341ad896245c40a00b6faead1b90d01aac58f8c) by [@halaei](https://github.com/halaei))
|
||||
- Fix DarkMode on Calendar DateTimePicker ([97064ae1fb](https://github.com/facebook/react-native/commit/97064ae1fbf84a8a6b653c02c5872191b7d2d622) by [@mdvacca](https://github.com/mdvacca))
|
||||
- Fix ScrollView contentOffset ([be260b9f47](https://github.com/facebook/react-native/commit/be260b9f479a3b55ee43d2959d2c49fd3c1eb4ac) by [@genkikondo](https://github.com/genkikondo))
|
||||
- Do not bundle libhermes.so or libjsc.so inside the React Native Android AAR ([fa85417179](https://github.com/facebook/react-native/commit/fa854171798e67b8a10820f77d7198315e1784ed) by [@cortinico](https://github.com/cortinico))
|
||||
- Enable hitSlop to be set using a single number. ([d682753244](https://github.com/facebook/react-native/commit/d682753244feba28c6a15c31966a3da075a090e6) by [@javache](https://github.com/javache))
|
||||
- Fix crash caused by Image.queryCache parsing null ([ae3d4f7008](https://github.com/facebook/react-native/commit/ae3d4f700843ae4cbb6927ee620095136d1abc3f) by [@skychx](https://github.com/skychx))
|
||||
- Fix NullPointerException when disaptching events ([fbeb51ef51](https://github.com/facebook/react-native/commit/fbeb51ef5133303a5cb71569507d44403ded3447) by [@mdvacca](https://github.com/mdvacca))
|
||||
|
||||
#### iOS specific
|
||||
|
||||
- ScrollView's contentInsetAdjustmentBehavior is reset to Never at every reuse to avoid layout artifacts. ([28a65f4387](https://github.com/facebook/react-native/commit/28a65f438789c29309d6e7c58063a73ca721ef43))
|
||||
- Prevent Nullptr segfault in TurboModule init path ([7f3cc256b5](https://github.com/facebook/react-native/commit/7f3cc256b5bcbf2e64540ca69401f62ec6869f0e) by [@RSNara](https://github.com/RSNara))
|
||||
- Expose the extraData dict attached to JavaScript errors to the native ExceptionManager on iOS, similar to Android ([a65ae8eff6](https://github.com/facebook/react-native/commit/a65ae8eff6ec6f9ad283ac8e96f00802421a14da) by [@GijsWeterings](https://github.com/GijsWeterings))
|
||||
- `RCTLocalizationProvider` Fall back to input when no localization is available ([18196512db](https://github.com/facebook/react-native/commit/18196512db6b8b4469a5e1b098d8892ae72d743a) by [@robhogan](https://github.com/robhogan))
|
||||
- Update iOS LogBox to render its UIWindow with the key window's UIWindowScene ([d31d83f410](https://github.com/facebook/react-native/commit/d31d83f4109c167ec612058c805fd65f69b82476) by [@vincentriemer](https://github.com/vincentriemer))
|
||||
- Remove Gemfile.lock from template ([1907bd31f0](https://github.com/facebook/react-native/commit/1907bd31f066865aa1c5fe4ec88e98ee46448771) by [@danilobuerger](https://github.com/danilobuerger))
|
||||
- Fix `pod install` when `RCT-Folly` version has been updated. ([b2517c3bdc](https://github.com/facebook/react-native/commit/b2517c3bdccc3f9d935f4ee06f959d6ce8f27bbe) by [@fortmarek](https://github.com/fortmarek))
|
||||
- Fix usage of cocoapods with --project-directory flag and new arch ([2f813f873a](https://github.com/facebook/react-native/commit/2f813f873a1692044ea3461e59ca732a4d952300) by [@danilobuerger](https://github.com/danilobuerger))
|
||||
- Ensure LogBoxView is sized relative to the key window instead of the full screen ([84f8c9ad55](https://github.com/facebook/react-native/commit/84f8c9ad550f98295d2e718b4b1d6b1ac724b898) by [@vincentriemer](https://github.com/vincentriemer))
|
||||
- Improved template fastlane gitignore ([f43f05d292](https://github.com/facebook/react-native/commit/f43f05d292fd2fbdf3d5fdfd194ed81b0e346657) by [@danilobuerger](https://github.com/danilobuerger))
|
||||
- Set RCTView borderColor to UIColor ([267d36d0af](https://github.com/facebook/react-native/commit/267d36d0afb4b3713df9b679c2019c44ac6bcc3f) by [@danilobuerger](https://github.com/danilobuerger))
|
||||
- Fix action sheet callback invoked more than once on iPad ([8935d6e697](https://github.com/facebook/react-native/commit/8935d6e697dffb0971f5a8ee1dfbc580080de3e0) by [@janicduplessis](https://github.com/janicduplessis))
|
||||
- Resolve border platform color based on current trait collection ([9a35818797](https://github.com/facebook/react-native/commit/9a3581879764f3f1b2743905e3e54611e96bb618) by [@danilobuerger](https://github.com/danilobuerger))
|
||||
- Enable custom sound for local push notifications. ([eb19499484](https://github.com/facebook/react-native/commit/eb1949948406195c4c02c6041d07cba074ae820c))
|
||||
- Invoke registerForRemoteNotifications on main UI thread. ([3633a05299](https://github.com/facebook/react-native/commit/3633a05299d99b12acc5c3c056b977463df1924e))
|
||||
- Bump flipper pods to get arm64 catalyst slice ([f811da7cc2](https://github.com/facebook/react-native/commit/f811da7cc20cc49ca5c8d4e023d6c61e36e15dd1) by [@fortmarek](https://github.com/fortmarek))
|
||||
- Fix `pod install --project-directory=ios` failing when Hermes is enabled ([1b22e8a039](https://github.com/facebook/react-native/commit/1b22e8a039081887ffd450596d822bff975d6900), ([eb7cc85a91](https://github.com/facebook/react-native/commit/eb7cc85a9146d058694247178f03d57cc125c97a) by [@tido64](https://github.com/tido64))
|
||||
- Fix compilation warning in yoga ([52d8a797e7](https://github.com/facebook/react-native/commit/52d8a797e7a6be3fa472f323ceca4814a28ef596) by [@cuva](https://github.com/cuva))
|
||||
- Prevent deadlock when dispatching events from observers on the same thread. ([68fd1e5508](https://github.com/facebook/react-native/commit/68fd1e55085e871a854563721ee29ca698239607) by [@Pickleboyonline](https://github.com/Pickleboyonline))
|
||||
- In RCTSurfaceHostingComponent, access ckComponent from main queue to pass assertion ([1874c81003](https://github.com/facebook/react-native/commit/1874c81003b468554c227541fec5e29c4adfb82f) by [@p-sun](https://github.com/p-sun))
|
||||
- Fix modal redbox for onDismiss ([46f68aceb2](https://github.com/facebook/react-native/commit/46f68aceb20a10c95c92b5ffeb90f289b015a559) by [@HeyImChris](https://github.com/HeyImChris))
|
||||
- Attempt to fix crash during app termination ([9cd43340a7](https://github.com/facebook/react-native/commit/9cd43340a7e2443564c2ff5e8e85d37f6e1e47ef) by [@sammy-SC](https://github.com/sammy-SC))
|
||||
|
||||
### Security
|
||||
|
||||
- Encode URL params in URLSearchParams.toString() ([1042a8012f](https://github.com/facebook/react-native/commit/1042a8012fb472bd5c882b469fe507dd6279d562) by [@sshic](https://github.com/sshic))
|
||||
|
||||
|
||||
## v0.68.2
|
||||
|
||||
### Changed
|
||||
|
||||
- Bump used version of react-native-codegen to 0.0.17 ([dfda480a98](https://github.com/facebook/react-native/commit/dfda480a9888d95c542cea40f25e8e783565c1db) by [@cortinico](https://github.com/cortinico))
|
||||
- Bump react-native-codegen to 0.0.17 ([a5ddc2e165](https://github.com/facebook/react-native/commit/a5ddc2e16523ea336ffbecf7acfd4820469a29e7) by [@cortinico](https://github.com/cortinico))
|
||||
|
||||
### Fixed
|
||||
|
||||
#### Android specific
|
||||
|
||||
- Working around Long paths limitation on Windows ([62ef6f5fa1](https://github.com/facebook/react-native/commit/62ef6f5fa1ecb918bde130a6024b65afcd34c7e3) by [@mganandraj](https://github.com/mganandraj))
|
||||
|
||||
## v0.68.1
|
||||
|
||||
### Changed
|
||||
|
||||
#### Android specific
|
||||
|
||||
- Bump React Native Gradle plugin to 0.0.6 ([9573d7b84d](https://github.com/facebook/react-native/commit/9573d7b84d35233fbb39a4067cfef65490aa34a7) by [@cortinico](https://github.com/cortinico))
|
||||
- Don't require yarn for codegen tasks ([d5da70e17e](https://github.com/facebook/react-native/commit/d5da70e17e8c8210cd79a4d7b09c6a5ded4b5607) by [@danilobuerger](https://github.com/danilobuerger))
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix dynamic_cast (RTTI) by adding key function to ShadowNodeWrapper and related classes ([58a2eb7f37](https://github.com/facebook/react-native/commit/58a2eb7f37c2dc27ad3575618778ad5b23599b27) by [@kmagiera](https://github.com/kmagiera))
|
||||
- Pin use-subscription to < 1.6.0 ([5534634892](https://github.com/facebook/react-native/commit/5534634892f47a3890e58b661faa2260373acb25) by [@danilobuerger](https://github.com/danilobuerger))
|
||||
|
||||
#### Android specific
|
||||
|
||||
- Use NDK 23 only for Windows users. ([e48a580080](https://github.com/facebook/react-native/commit/e48a580080bdae58b375f30fbcf8a83cc1915b2f) by [@cortinico](https://github.com/cortinico))
|
||||
- Improve support for Android users on M1 machine ([4befd2a29c](https://github.com/facebook/react-native/commit/4befd2a29cb94b026d9c048a041aa9f1817295b5) by [@cortinico](https://github.com/cortinico))
|
||||
- Template: Specify abiFilters if enableSeparateBuildPerCPUArchitecture is not set. ([5dff920177](https://github.com/facebook/react-native/commit/5dff920177220ae5f4e37c662c63c27ebf696c83) by [@cortinico](https://github.com/cortinico))
|
||||
- Fix for building new architecture sources on Windows ([5a8033df98](https://github.com/facebook/react-native/commit/5a8033df98296c941b0a57e49f2349e252339bf9) by [@mganandraj](https://github.com/mganandraj))
|
||||
|
||||
## v0.68.0
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- CI moved to Node 16. ([f1488db109](https://github.com/facebook/react-native/commit/f1488db109d13e748b071c02b40e90cdca1cc79d) by [@kelset](https://github.com/kelset)).
|
||||
This change enforces Node >= 14 for React Native builds.
|
||||
- Bump Android Gradle Plugin to 7.0.1. ([272cfe5d13](https://github.com/facebook/react-native/commit/272cfe5d1371c38a281cf3883ff0254a8d3505a3) by [@dulmandakh](https://github.com/dulmandakh))
|
||||
This version of Android Gradle plugin enforces JDK 11 for Android builds. Do not upgrade to AGP 7.1 as it is not supported by this version of react-native.
|
||||
- Removed `fallbackResource` from `RCTBundleURLProvider` API ([0912ee179c](https://github.com/facebook/react-native/commit/0912ee179c210fb6b2ed9afbb3f2fbc5fb8a2bb3)) by [@philIip](https://github.com/philIip)
|
||||
|
||||
### New Architecture
|
||||
|
||||
*If you are interested in enabling the new architecture, please refer to [the dedicated documentation](https://reactnative.dev/docs/next/new-architecture-intro).*
|
||||
|
||||
- Do not include Facebook license on users codegen'd code ([450967938a](https://github.com/facebook/react-native/commit/450967938ab25c4dabb9d5ecd9f7b57afb1c78dd) by [@cortinico](https://github.com/cortinico))
|
||||
|
||||
#### Android specific
|
||||
|
||||
- Setup a `newArchEnabled` property to Opt-in the New Architecture in the template ([8d652fba4c](https://github.com/facebook/react-native/commit/8d652fba4ce07256784a1b7e86713c810336856d) by [@cortinico](https://github.com/cortinico))
|
||||
|
||||
#### iOS specific
|
||||
|
||||
- Add fabric option to the default app template. ([2e9a376c84](https://github.com/facebook/react-native/commit/2e9a376c8488d1fb11c0b5d604137712321fd90d) by [@sota000](https://github.com/sota000))
|
||||
- Add turbo module support in the default app template. ([8ec0e6919c](https://github.com/facebook/react-native/commit/8ec0e6919c5fab118c8b54538860ee36009bfaa7) by [@sota000](https://github.com/sota000))
|
||||
- Rename the new architecture flag to RCT_NEW_ARCH_ENABLED. ([c0c5439959e](https://github.com/facebook/react-native/commit/c0c5439959e21d7806178bb9139c2cd19b857506) by [@sota000](https://github.com/sota000))
|
||||
|
||||
### Added
|
||||
|
||||
- Create @fb-tools-support/yarn package ([7db294d6d5](https://github.com/facebook/react-native/commit/7db294d6d5b00a38f305dd52be3e0961f35695c8) by [@motiz88](https://github.com/motiz88))
|
||||
- Support string color values in Animated.Color ([d3a0c4129d](https://github.com/facebook/react-native/commit/d3a0c4129d6a5a7beced4e9aa62b2da4e3f4fed4))
|
||||
- New Animated.Color node ([ea90a76efe](https://github.com/facebook/react-native/commit/ea90a76efef60df0f46d29228289f8fc1d26f350))
|
||||
- Added linter warning config for unstable nested components ([988fefc44d](https://github.com/facebook/react-native/commit/988fefc44d39957e8c5e1eecb02dfd1ce119f34c) by [@javache](https://github.com/javache))
|
||||
- Option to supply `platformConfig` to NativeAnimated ([4a227ce2ab](https://github.com/facebook/react-native/commit/4a227ce2ab3f8c181150461ab28b831979093db0) by [@rozele](https://github.com/rozele))
|
||||
- Animated.event can be used to extract values with numeric keys from native events ([b2105711a0](https://github.com/facebook/react-native/commit/b2105711a0b90859f8e3fc1aaec4998e252c2d14) by [@javache](https://github.com/javache))
|
||||
- Adds a setSelection imperative method to TextInput ([771ca921b5](https://github.com/facebook/react-native/commit/771ca921b59cc3b3fd12c8fe3b08ed150bcf7a04) by [@lyahdav](https://github.com/lyahdav))
|
||||
- Native-only prop to optimize text hit testing on some RN platforms ([f3bf2e4f51](https://github.com/facebook/react-native/commit/f3bf2e4f51897f1bb71e37002c288ebf3b23cf78) by [@rozele](https://github.com/rozele))
|
||||
|
||||
#### Android specific
|
||||
|
||||
- Added DoNotStripAny proguard rules ([48318b1542](https://github.com/facebook/react-native/commit/48318b1542910b939ab977c0bc82e98f098abe50) by [@ShikaSD](https://github.com/ShikaSD))
|
||||
- Add new API in ScrollView and HorizontalScrollView to process pointerEvents prop. ([48f6967ae8](https://github.com/facebook/react-native/commit/48f6967ae88100110160e1faf03e6c0d37e404bd) by [@ryancat](https://github.com/ryancat))
|
||||
- Add `accessibilityLabelledBy` props ([36037fa81b](https://github.com/facebook/react-native/commit/36037fa81bbdcc460057e7e7cf608cd364ca48a6) by [@grgr-dkrk](https://github.com/grgr-dkrk))
|
||||
- Added missing constructor to WritableNativeArray ([c68c47d2ba](https://github.com/facebook/react-native/commit/c68c47d2bafa8e8e25b534d6cdd1a63bc77a1cf4) by [@piaskowyk](https://github.com/piaskowyk))
|
||||
- Add new API for custom fling animator to provide predicted travel distance for its fling animation. ([fe6277a30d](https://github.com/facebook/react-native/commit/fe6277a30d3ec19e4772991e30ae20c3a9cfe565) by [@ryancat](https://github.com/ryancat))
|
||||
- Adding new API `onChildEndedNativeGesture` to the RootView interface to let its implementations notify the JS side that a child gesture is ended. ([9b33c31ee0](https://github.com/facebook/react-native/commit/9b33c31ee024bae30e441107f838e1b5044525ba) by [@ryancat](https://github.com/ryancat))
|
||||
- Make the `reactNativeArchitectures` property more discoverable ([0f39a1076d](https://github.com/facebook/react-native/commit/0f39a1076dc154995a2db79352adc36452f46210) by [@cortinico](https://github.com/cortinico))
|
||||
- Added `isAccessibilityServiceEnabled` to get if accessibility services are enabled ([c8b83d4e0b](https://github.com/facebook/react-native/commit/c8b83d4e0b33c2af45093f7b2262ee578ece2faf) by [@grgr-dkrk](https://github.com/grgr-dkrk))
|
||||
- Add bundleForVariant option ([d2c10da5d5](https://github.com/facebook/react-native/commit/d2c10da5d5687833545691f281473381e4466c2e) by [@grit96](https://github.com/grit96))
|
||||
- Add ACCEPT_HANDOVER, ACTIVITY_RECOGNITION, ANSWER_PHONE_CALLS, READ_PHONE_NUMBERS & UWB_RANGING to PermissionsAndroid ([4b25a0aaa0](https://github.com/facebook/react-native/commit/4b25a0aaa077caf9c437bcfeef8a226eda5a102e) by [@iBotPeaches](https://github.com/iBotPeaches))
|
||||
|
||||
#### iOS specific
|
||||
|
||||
- Add new argument to announceForAccessibility to allow queueing on iOS ([4d1357918a](https://github.com/facebook/react-native/commit/4d1357918a4dcb331ccea2140699f487ca45ea30) by [@peterc1731](https://github.com/peterc1731))
|
||||
- Add volta support to find-node.sh ([765844055b](https://github.com/facebook/react-native/commit/765844055ba0d02262a11114bad5da67e935d8df) by [@liamjones](https://github.com/liamjones))
|
||||
- Support fnm when detecting node binary ([c9e4d34885](https://github.com/facebook/react-native/commit/c9e4d3488578d65e55198ad597252a2ac8cc5f73) by [@MoOx](https://github.com/MoOx))
|
||||
- Find-node.sh now respects .nvmrc ([35bcf934b1](https://github.com/facebook/react-native/commit/35bcf934b186e581d100d43e563044300759557f) by [@igrayson](https://github.com/igrayson))
|
||||
- Add macros to be able to stub C functions in tests ([749a9207b6](https://github.com/facebook/react-native/commit/749a9207b6f0545c03ca83efbda7971ffd4d2d57) by [@philIip](https://github.com/philIip))
|
||||
|
||||
|
||||
### Changed
|
||||
|
||||
- Bump RN CLI to v7.0.3, and Metro to 67 ([848ba6fb1d](https://github.com/facebook/react-native/commit/848ba6fb1db81bbb44efd373af9e81f31f227aef) by [@kelset](https://github.com/kelset)) and ([df2e934a69](https://github.com/facebook/react-native/commit/df2e934a697b5b207053db3bbcf71492932a6062) by [@kelset](https://github.com/kelset))
|
||||
- Upgraded react-devtools-core dependency to 4.23.0 ([1cc217d5ef](https://github.com/facebook/react-native/commit/1cc217d5effdbee4cf2f64063a443ecb331673d4) by [@bvaughn](https://github.com/bvaughn))
|
||||
- Bump Flipper to 0.125.0 ([50057158ca](https://github.com/facebook/react-native/commit/50057158ca32842d70160541e3cb5d4bd512f8f5) by [@cortinico](https://github.com/cortinico))
|
||||
- Export Flow type for deceleration rate for use in other files to keep deceleration rate prop values consistently typed ([9b0ed920ef](https://github.com/facebook/react-native/commit/9b0ed920ef087c4c18504adacf9d4f557812cf1b))
|
||||
- Upgrade deprecated-react-native-prop-types dependency ([badd30885f](https://github.com/facebook/react-native/commit/badd30885fb999124b6b54b3fb016edbd988c16b) by [@chiaramooney](https://github.com/chiaramooney))
|
||||
- Improved error message in react.gradle ([7366a866b3](https://github.com/facebook/react-native/commit/7366a866b381db6fc5615153e7788aa4828cfd96) by [@vonovak](https://github.com/vonovak))
|
||||
- Upgraded packages to the latest versions for ESLint v7. ([cf763cdf81](https://github.com/facebook/react-native/commit/cf763cdf816e1cad20caf2347c54bc96c7f6dd47) by [@yungsters](https://github.com/yungsters))
|
||||
- Updated the links for the discussions and changelog ([daf37a1fce](https://github.com/facebook/react-native/commit/daf37a1fce43403e6320e1e3023e86fd1b970bdf) by [@MikeyAlmighty](https://github.com/MikeyAlmighty))
|
||||
- XMLHttpRequest.getAllResponseHeaders() now returns headers with names lowercased and sorted in ascending order, as per specification ([b2415c4866](https://github.com/facebook/react-native/commit/b2415c48669391ee1ab7c6450748c4d91097a666) by [@ascherkus](https://github.com/ascherkus))
|
||||
- Bump react-native-codegen to 0.0.9 ([e3a71b019f](https://github.com/facebook/react-native/commit/e3a71b019fa78e2b4b3454ccc59ea9c8cc543b29) by [@cortinico](https://github.com/cortinico))
|
||||
- Accessing `Image.propTypes`, `Text.propTypes`, `TextInput.propTypes`, `ColorPropType`, `EdgeInsetsPropType`, `PointPropType`, or `ViewPropTypes` now emits a deprecation warning. ([3f629049ba](https://github.com/facebook/react-native/commit/3f629049ba9773793978cf9093c7a71af15e3e8d) by [@yungsters](https://github.com/yungsters))
|
||||
- Bump `core-workflow-apply-version-label` version ([e973b3afc2](https://github.com/facebook/react-native/commit/e973b3afc274f892a0e5a6fdea9004dc5d84eb2b) by [@lucasbento](https://github.com/lucasbento))
|
||||
- Add `vendor/bundle` into .gitignore template ([2f67f5d68b](https://github.com/facebook/react-native/commit/2f67f5d68b17010c49f2996a788fe68c1fe2e9f6) by [@MoOx](https://github.com/MoOx))
|
||||
|
||||
#### Android specific
|
||||
|
||||
- Add allowsEdgeAntialiasing on views with rotations or skew transforms ([e6a3410afe](https://github.com/facebook/react-native/commit/e6a3410afe7d9a4cecf3db0a95503d2ff05bb862))
|
||||
- Bump Kotlin version to 1.6.10 ([d0f0234656](https://github.com/facebook/react-native/commit/d0f0234656dc981b422d1e9aa0885afd5fd29879) by [@AKB48](https://github.com/AKB48))
|
||||
- Bump Soloader to 0.10.3 ([f45889ef95](https://github.com/facebook/react-native/commit/f45889ef95ec694520e91b0032e591a087e088e5) by [@osartun](https://github.com/osartun))
|
||||
- Bump Gradle to 7.3 ([c180627ac7](https://github.com/facebook/react-native/commit/c180627ac7e5e155707b3c9433c4582839e1820e) by [@dulmandakh](https://github.com/dulmandakh))
|
||||
- Bump Android compile and target SDK to 31 ([00ac034353](https://github.com/facebook/react-native/commit/00ac034353cbc867991bf79cb1dd103353f47126) by [@ShikaSD](https://github.com/ShikaSD))
|
||||
- Use side-by-side NDK for Android ([bd7caa64f5](https://github.com/facebook/react-native/commit/bd7caa64f5d6ee5ea9484e92c3629c9ce711f73c) by [@cortinico](https://github.com/cortinico))
|
||||
- Leverage Gradle implicit dependency substitution for Gradle Plugin ([0fccbd53af](https://github.com/facebook/react-native/commit/0fccbd53af86083a8742a33282dc183d07eb27a2) by [@cortinico](https://github.com/cortinico))
|
||||
- Remove unused import of JMessageQueueThread.h ([705236e363](https://github.com/facebook/react-native/commit/705236e3637e4f80e5fa4bd7234df9f1e14a5d3d) by [@sshic](https://github.com/sshic))
|
||||
- Made `MessageQueueThread#runOnQueue` return a boolean. Made `MessageQueueThreadImpl#runOnQueue` return false when the runnable is not submitted. ([89faf0c9a8](https://github.com/facebook/react-native/commit/89faf0c9a87f6de68ca416d10566dbcbe80d9450))
|
||||
- Assume *.ktx assets are packaged as Android drawables ([cb610ddca7](https://github.com/facebook/react-native/commit/cb610ddca79fe29b88568545ab011671fc392c9a) by [@motiz88](https://github.com/motiz88))
|
||||
- Add ViewConfigs to support onEnter/onExit/onMove events ([44143b50fd](https://github.com/facebook/react-native/commit/44143b50fdcafe22caa43d76ec3210132ce3af21) by [@mdvacca](https://github.com/mdvacca))
|
||||
- Let react_native_assert really abort the app ([2ae06df58f](https://github.com/facebook/react-native/commit/2ae06df58f5f5eaf4386c14d28af25b643401bf3) by [@cortinico](https://github.com/cortinico))
|
||||
- Bugfix for multiple shadow threads rendered at the same time, small probability crash. ([9d71b166a6](https://github.com/facebook/react-native/commit/9d71b166a6c9d9afec7186c6a33aedc6975aa43c) by [@chenmo187](https://github.com/chenmo187))
|
||||
- RootView's onChildStartedNativeGesture now takes the child view as its first argument ([03e513de41](https://github.com/facebook/react-native/commit/03e513de41bf60f071eacbbb9604c83605abf625) by [@javache](https://github.com/javache))
|
||||
- Add ReactInstanceEventListenerV2 for migration ([ce74aa4ed3](https://github.com/facebook/react-native/commit/ce74aa4ed335d4c36ce722d47937b582045e05c4) by [@sshic](https://github.com/sshic))
|
||||
- Improved logic of findTargetPathAndCoordinatesForTouch ([dfe42d6b75](https://github.com/facebook/react-native/commit/dfe42d6b75005f519c0e2c87c75e7886dce3345c) by [@javache](https://github.com/javache))
|
||||
- Set a resolution strategy for com.facebook.react:react-native when on New Architecture ([e695bc0bb5](https://github.com/facebook/react-native/commit/e695bc0bb50fc1c712e9862ed8fe4e7cc6619fae) by [@cortinico](https://github.com/cortinico))
|
||||
- Make hermes-executor-common a static lib ([b2cf24f41c](https://github.com/facebook/react-native/commit/b2cf24f41cb5f15653b34d396ef2a1c90defdf43) by [@janicduplessis](https://github.com/janicduplessis))
|
||||
- Static link for hermes-inspector ([20b0eba581](https://github.com/facebook/react-native/commit/20b0eba581a00e5e7e300f6377379b836617c147) by [@janicduplessis](https://github.com/janicduplessis))
|
||||
|
||||
#### iOS specific
|
||||
|
||||
- Don't capitalize the first letter of a word that is starting by a number ([8b5a5d4645](https://github.com/facebook/react-native/commit/8b5a5d4645136ef3d6ee043348e583cbbac87ee3) by [@MaeIg](https://github.com/MaeIg))
|
||||
- updated `jsBundleURLForBundleRoot:fallbackResource` to `jsBundleURLForBundleRoot:` ([aef843bfe6](https://github.com/facebook/react-native/commit/aef843bfe60bda6bcc98d3fb4a6c295c9f4b66e3) by [@philIip](https://github.com/philIip))
|
||||
- Remove iOS 11 availability check ([9b059b6709](https://github.com/facebook/react-native/commit/9b059b67092f4e7d568867a2b3a51dfd7c6f1db6) by [@ken0nek](https://github.com/ken0nek))
|
||||
- Refactor: Assign string label to each case in RCTPLTag enum for startup performance logging ([60e60a9b3d](https://github.com/facebook/react-native/commit/60e60a9b3d42d342eaf5ddee4841b121f6474a6c) by [@p-sun](https://github.com/p-sun))
|
||||
- IOS Ruby Updates ([1e6add1a43](https://github.com/facebook/react-native/commit/1e6add1a43355bb88c57400a7420a656966bef97) by [@barbieri](https://github.com/barbieri))
|
||||
- Update Flipper pods to support re-enable macCatalyst ([2a5265dff7](https://github.com/facebook/react-native/commit/2a5265dff7e654f57b43335804840692313f2a56) by [@mikehardy](https://github.com/mikehardy))
|
||||
- Apple Silicon builds of glog & Flipper-Glog ([274c617f5b](https://github.com/facebook/react-native/commit/274c617f5bda263ff29115b3dcc013e47085a78d) by [@rayzr522](https://github.com/rayzr522))
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix error "mockModal is not a function" ([507b05f4c0](https://github.com/facebook/react-native/commit/507b05f4c02b46109f483a2b79c924a775fd7bd3) by [@AntoineDoubovetzky](https://github.com/AntoineDoubovetzky))
|
||||
- Fixes execution of animation when a toValue of AnimatedValue is used. ([8858c21124](https://github.com/facebook/react-native/commit/8858c2112421be5212c024f9e404e66437a41389))
|
||||
- Fix RN version syntax to match new nightly build structure. ([3d1d4ee457](https://github.com/facebook/react-native/commit/3d1d4ee4572600425b8eb5d0d6512bb0d2a6ea44) by [@chiaramooney](https://github.com/chiaramooney))
|
||||
- Fix typo in _updateBottomIfNecessary function on KeyboardAvoidingView component ([0cc80b4d0c](https://github.com/facebook/react-native/commit/0cc80b4d0cb78a835977dbe5100262a16882bbea) by [@gabrieldonadel](https://github.com/gabrieldonadel))
|
||||
- Fix: Removes interface only check from third party components GenerateThirdPartyFabricComponentsProvider ([3e6902244a](https://github.com/facebook/react-native/commit/3e6902244a0d189261dbbe327296db1349e37410) by [@Ubax](https://github.com/Ubax))
|
||||
- Set CxxModules' Instance before retrieving their Method vector. ([1d45b20b6c](https://github.com/facebook/react-native/commit/1d45b20b6c6ba66df0485cdb9be36463d96cf182) by [@JunielKatarn](https://github.com/JunielKatarn))
|
||||
- AnimatedValue.__detach should store getValue result with offset deducted ([fe53cae954](https://github.com/facebook/react-native/commit/fe53cae954b37528eeaa1258ac0060c4298473bb) by [@rozele](https://github.com/rozele))
|
||||
- AnimatedValue.stopAnimation callback with correct value for NativeAnimated ([8ba771c3dd](https://github.com/facebook/react-native/commit/8ba771c3ddc00b1499e95a2812b4cd5ac904c8df) by [@rozele](https://github.com/rozele))
|
||||
- ESLint no-undef rule clashing with TypeScript compiler for TS files ([ae67c5ac45](https://github.com/facebook/react-native/commit/ae67c5ac45a8044fc1db66aee8eae6e881d660e4) by [@fiznool](https://github.com/fiznool))
|
||||
- ESLint `no-shadow` rule returning false positive for TypeScript enums ([722a0ff6f8](https://github.com/facebook/react-native/commit/722a0ff6f88bed4d54579a2b8bc574e87948187f) by [@fiznool](https://github.com/fiznool))
|
||||
- Fix support for custom port ([b399c2e3d1](https://github.com/facebook/react-native/commit/b399c2e3d10fa521dbec87243d3e96f6bca7df1e) by [@enniel](https://github.com/enniel))
|
||||
- `onLayout` prop is handled correctly in `<KeyboardAvoidingView>` ([9c5e177a79](https://github.com/facebook/react-native/commit/9c5e177a79c64c77f281ce727538973e8222e975))
|
||||
- Modal accepts a testID but didn't forward it to RCTModalHostView, therefore not making it show up for e2e tests depending on viewhierarchy. ([5050e7eaa1](https://github.com/facebook/react-native/commit/5050e7eaa17cb417baf7c20eb5c4406cce6790a5) by [@GijsWeterings](https://github.com/GijsWeterings))
|
||||
- Remove unused and incorrect type declarations in WebSocketInterceptor ([91728e2266](https://github.com/facebook/react-native/commit/91728e2266375b954302ba0cd4b5daf641aefc23) by [@mischnic](https://github.com/mischnic))
|
||||
- Complete missing Flow declarations in URL ([98abf1b02f](https://github.com/facebook/react-native/commit/98abf1b02f64ad40d523335e677a2ede15b3650d) by [@mischnic](https://github.com/mischnic))
|
||||
- Pressable not passing hover props and event handlers to PressabilityConfig ([1b30dd074b](https://github.com/facebook/react-native/commit/1b30dd074b579c2ae138a1111d07ddb56761315d) by [@Saadnajmi](https://github.com/Saadnajmi))
|
||||
- Composite animations will now be ran immediately when the app is in testing mode ([b03e824c52](https://github.com/facebook/react-native/commit/b03e824c52123219a5c8fbd89473391bf0bc31c8) by [@javache](https://github.com/javache))
|
||||
- Remove duplicate class members ([c0e489b729](https://github.com/facebook/react-native/commit/c0e489b7293f15858cb706f1b8587600e429af28) by [@bradzacher](https://github.com/bradzacher))
|
||||
- Fix: Use same implementation for `performance.now()` on iOS and Android ([1721efb54f](https://github.com/facebook/react-native/commit/1721efb54ff9cc4f577b5ae27f13fcf56801a92c) by [@mrousavy](https://github.com/mrousavy))
|
||||
|
||||
#### Android specific
|
||||
|
||||
- Enable cliPath to have an absolute path value ([5d560ca99f](https://github.com/facebook/react-native/commit/5d560ca99ff7220de11d2d76dbe77d73990894a8) by [@Krisztiaan](https://github.com/Krisztiaan))
|
||||
- Make sure configureNdkBuild* tasks are depending on preBuild ([2fdbf6a10f](https://github.com/facebook/react-native/commit/2fdbf6a10fe67fa3209a51a1105a97c16991f561) by [@cortinico](https://github.com/cortinico))
|
||||
- Added a null check to native.value in Switch to fix https://github.com/facebook/react-native/issues/32594 ([8d50bf1133](https://github.com/facebook/react-native/commit/8d50bf113352a6ccdf74c979e1022c6c2ccf6e56) by [@jonathanmos](https://github.com/jonathanmos))
|
||||
- Fix overflowInset calculation by using transform values ([8aa87814f6](https://github.com/facebook/react-native/commit/8aa87814f62e42741ebb01994796625473c1310f) by [@ryancat](https://github.com/ryancat))
|
||||
- Add missing sources jar into published android artifacts ([384e1a0c7b](https://github.com/facebook/react-native/commit/384e1a0c7bc50d2aab5b59bcedcea5a3e98f1659) by [@Kudo](https://github.com/Kudo))
|
||||
- Fix math for detecting if children views are in parent's overflowInset area. ([45244ebce2](https://github.com/facebook/react-native/commit/45244ebce228dfbc3412670e64c11491ba8d8c47) by [@ryancat](https://github.com/ryancat))
|
||||
- Fixed empty screen after retrying a BundleDownloader failure in dev mode ([c8d823b9bd](https://github.com/facebook/react-native/commit/c8d823b9bd9619dfa1f5851af003cc24ba2e8830) by [@samkline](https://github.com/samkline))
|
||||
- Fix crash from ScrollView that occurs while reporting an error from JS ([2151d11527](https://github.com/facebook/react-native/commit/2151d1152719a230565165f1a8dcfab172689eb3) by [@JoshuaGross](https://github.com/JoshuaGross))
|
||||
- Enable hitSlop to be set using a single number. ([589b129581](https://github.com/facebook/react-native/commit/589b129581903a737a64e14eab3f2e29620831d5) by [@javache](https://github.com/javache))
|
||||
- Fix fling and snap with recycler viewgroup where fling to the end of scrollable distance when it goes over current rendered children views. ([ead7b97944](https://github.com/facebook/react-native/commit/ead7b97944522e3066ceb2bd50c63c268c961277) by [@ryancat](https://github.com/ryancat))
|
||||
- Fixed edge case for quick small scrolls causing unexpected scrolling behaviors. ([f70018b375](https://github.com/facebook/react-native/commit/f70018b37532622f08f20b2c51cdbfca55d730ea) by [@ryancat](https://github.com/ryancat))
|
||||
- Fix crash on ReactEditText with AppCompat 1.4.0 ([e21f8ec349](https://github.com/facebook/react-native/commit/e21f8ec34984551f87a306672160cc88e67e4793) by [@cortinico](https://github.com/cortinico))
|
||||
- Do not .lowerCase the library name when codegenerating TurboModule Specs ([28aeb7b865](https://github.com/facebook/react-native/commit/28aeb7b8659b38ee3a27fae213c4d0800f4d7e31) by [@cortinico](https://github.com/cortinico))
|
||||
- Enable hitSlop to be set using a single number. ([a96bdb7154](https://github.com/facebook/react-native/commit/a96bdb7154b0d8c7f43977d8a583e8d2cbdcb795) by [@javache](https://github.com/javache))
|
||||
- Updated TextInput prop types to accomodate for new autoComplete values ([9eb0881c8f](https://github.com/facebook/react-native/commit/9eb0881c8fecd0e974b1cb9f479bad3075854340) by [@TheWirv](https://github.com/TheWirv))
|
||||
- Don't reconstruct app components https://github.com/facebook/react-native/issues/25040 ([fc962c9b6c](https://github.com/facebook/react-native/commit/fc962c9b6c4bf9f88decbe014ab9a9d5c1cf51bc) by [@Somena1](https://github.com/Somena1))
|
||||
- Do NOT skip the first child view in the scroll view group when measuring the lower and upper bounds for snapping. ([61e1b6f86c](https://github.com/facebook/react-native/commit/61e1b6f86cf98d8a74eeb9353143fe0c624fe6e6) by [@ryancat](https://github.com/ryancat))
|
||||
- Fix crash when a Switch is initialised with both backgroundColor and thumbColor. ([456cf3db14](https://github.com/facebook/react-native/commit/456cf3db14c443c483d63aa97c88b45ffd25799b) by [@smarki](https://github.com/smarki))
|
||||
- Fix devDisabledIn not working with multiple productFlavors ([055ea9c7b7](https://github.com/facebook/react-native/commit/055ea9c7b7dea030ef16da72d1f6ecb5d95ac468) by [@grit96](https://github.com/grit96))
|
||||
- Revert `ReactScrollView` to use `Context` instead of `ReactContext` in the constructor to be less restrictive. ([7b77cc637e](https://github.com/facebook/react-native/commit/7b77cc637e1faf4a2b134853f8415f277d0decdc) by [@ryancat](https://github.com/ryancat))
|
||||
- Fix onPress event for nested Text in RN Android ([e494e4beb6](https://github.com/facebook/react-native/commit/e494e4beb6a124008fd116178cbc38335bd87809) by [@mdvacca](https://github.com/mdvacca))
|
||||
- Fix enableVmCleanup not working for apps with product flavors ([a2b5e4cd82](https://github.com/facebook/react-native/commit/a2b5e4cd825a358419cef1e3823b72215b689686) by [@cortinico](https://github.com/cortinico))
|
||||
- Prevent NPE on ThemedReactContext ([f1b5fe1d3e](https://github.com/facebook/react-native/commit/f1b5fe1d3ea49294d8c89accfa27d76a1a97ccea) by [@sshic](https://github.com/sshic))
|
||||
- fix: jvm 11 error message from ReactPlugin.kt and react.gradle ([4e947ecb2d](https://github.com/facebook/react-native/commit/4e947ecb2dabfa0226af7f859c828847b4d891c0) by [@nomi9995](https://github.com/nomi9995))
|
||||
|
||||
#### iOS specific
|
||||
|
||||
- ScrollView: Respect `contentInset` when animating new items with `autoscrollToTopThreshold`, make `automaticallyAdjustKeyboardInsets` work with `autoscrollToTopThreshold` (includes vertical, vertical-inverted, horizontal and horizontal-inverted ScrollViews) ([49a1460a37](https://github.com/facebook/react-native/commit/49a1460a379e3a71358fb38888477ce6ea17e81a) by [@mrousavy](https://github.com/mrousavy))
|
||||
- Prevent RCTConvert error for allowed null blob types ([e1b698c5f2](https://github.com/facebook/react-native/commit/e1b698c5f2b1d689fb3940f8c6a3e298d381ea3a) by [@habovh](https://github.com/habovh))
|
||||
- Migrate ScreenshotManager from NativeModule to TurboModule ([b13e41d98e](https://github.com/facebook/react-native/commit/b13e41d98e818279d1941f3425707d3c0ce407fc) by [@p-sun](https://github.com/p-sun))
|
||||
- Fix usage of cocoapods with --project-directory flag and new arch ([9e7d91f2fc](https://github.com/facebook/react-native/commit/9e7d91f2fc4d576b8fba81304a24e50134da93d6) by [@danilobuerger](https://github.com/danilobuerger))
|
||||
- Post RCTContentDidAppearNotification with new arch ([75105e692c](https://github.com/facebook/react-native/commit/75105e692c2be9bd192089a6a6ffde7572ee1ce1) by [@danilobuerger](https://github.com/danilobuerger))
|
||||
- Remove absolute paths from pods project ([42b01a32a1](https://github.com/facebook/react-native/commit/42b01a32a137f18ae9fd2f00914f2edb0e107421) by [@danilobuerger](https://github.com/danilobuerger))
|
||||
- Respect RCTSetDefaultFontHandler chosen font ([89efa1a0c1](https://github.com/facebook/react-native/commit/89efa1a0c1b633bf9edee66583800ad3fc54ce63) by [@danilobuerger](https://github.com/danilobuerger))
|
||||
- Fixed duplicated UUIDs problem during pod install phase. ([f595a4e681](https://github.com/facebook/react-native/commit/f595a4e681e75aaf737b6582f69855d76a1f33dd))
|
||||
- Fix `Time.h` patch not being applied when running `pod install --project-directory=ios` ([60cef850bd](https://github.com/facebook/react-native/commit/60cef850bd3fd12c32ee1196bd19a559592d1465) by [@tido64](https://github.com/tido64))
|
||||
- Fix WebSocket control frames having payloads longer than 125 bytes ([86db62b7a8](https://github.com/facebook/react-native/commit/86db62b7a8b28ac82dd0a0627a8b6c351875f682) by [@asmeikal](https://github.com/asmeikal))
|
||||
- Stop RedBox from appearing for LogBox handled errors ([9d2df5b8ae](https://github.com/facebook/react-native/commit/9d2df5b8ae95b3cfeae26f64bd1d50bd2b0bbae9) by [@liamjones](https://github.com/liamjones))
|
||||
- Enable hitSlop to be set using a single number. ([3addafa525](https://github.com/facebook/react-native/commit/3addafa5257ade685216900bebbad8c35e24e124) by [@javache](https://github.com/javache))
|
||||
- Fix `__apply_Xcode_12_5_M1_post_install_workaround` failing when one of the Pods has no IPHONEOS_DEPLOYMENT_TARGET set ([9cd4092336](https://github.com/facebook/react-native/commit/9cd40923362ff717a722f8f36c8250a29a5142b7) by [@Yonom](https://github.com/Yonom))
|
||||
- This is a quick speculative fix since we know `CFRunLoopPerformBlock` does not push/pop an autorelease pool. ([3fff164dfa](https://github.com/facebook/react-native/commit/3fff164dfa1c97f69b1701e974effc92a94152d6) by [@christophpurrer](https://github.com/christophpurrer))
|
||||
- Fixed RCTImageLoaderTests ([1542f83527](https://github.com/facebook/react-native/commit/1542f835273c08776b960929b5aa7cefbd225971) by [@philIip](https://github.com/philIip))
|
||||
- Fix Rosetta2 CocoaPods warning on Apple Silicon ([e918362be3](https://github.com/facebook/react-native/commit/e918362be3cb03ae9dee3b8d50a240c599f6723f) by [@oblador](https://github.com/oblador))
|
||||
- Fix `pod install --project-directory=ios` failing due to wrong path to `React-Codegen` ([ebb26cf2e4](https://github.com/facebook/react-native/commit/ebb26cf2e420616c8bf01a5148ca4f8419b238d3) by [@tido64](https://github.com/tido64))
|
||||
|
||||
### Deprecated
|
||||
|
||||
#### Android specific
|
||||
|
||||
- Gradle: Deprecate `reactRoot` in favor of `root` and `reactNativeDir` ([8bc324fd34](https://github.com/facebook/react-native/commit/8bc324fd34337ab159e2e21e213a6c5b06c548da) by [@cortinico](https://github.com/cortinico))
|
||||
|
||||
|
||||
### Removed
|
||||
|
||||
- DeprecatedPropTypes (deep-link) modules removed from React Native. ([23717c6381](https://github.com/facebook/react-native/commit/23717c6381a41b1c5f189376bfa5bc73c7a4da87) by [@yungsters](https://github.com/yungsters))
|
||||
- `accessibilityStates` no longer passed through to RCTView. ([1121ed94ab](https://github.com/facebook/react-native/commit/1121ed94ab470be27207b0c8dbae5d19860c08da) by [@luism3861](https://github.com/luism3861))
|
||||
|
||||
#### iOS specific
|
||||
|
||||
- Remove RCTUIManagerObserver from RCTNativeAnimatedTurboModule ([e9ed115bab](https://github.com/facebook/react-native/commit/e9ed115babbc82968380dae22fa928d4ce3cd6da) by [@p-sun](https://github.com/p-sun))
|
||||
|
||||
|
||||
## v0.67.4
|
||||
|
||||
### Fixed
|
||||
|
||||
#### Android specific
|
||||
|
||||
- Added a null check to native.value in Switch to fix https://github.com/facebook/react-native/issues/32594 ([8d50bf1133](https://github.com/facebook/react-native/commit/8d50bf113352a6ccdf74c979e1022c6c2ccf6e56) by [@jonathanmos](https://github.com/jonathanmos))
|
||||
|
||||
## v0.67.3
|
||||
|
||||
### Fixed
|
||||
|
||||
#### Android specific
|
||||
|
||||
- Text with adjustsFontSizeToFit changes the text layout infinitely ([c1db41f060](https://github.com/facebook/react-native/commit/c1db41f060908e6ab001aaace7c20c610056f59a))
|
||||
|
||||
#### iOS specific
|
||||
|
||||
- Fix a broken input for the Korean alphabet in TextInput ([1a83dc36ce](https://github.com/facebook/react-native/commit/1a83dc36ce0af33ac7a3c311354fce4bfa5ba1a3) by [@bernard-kms](https://github.com/bernard-kms))
|
||||
|
||||
## v0.67.2
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix error "mockModal is not a function" ([507b05f4c0](https://github.com/facebook/react-native/commit/507b05f4c02b46109f483a2b79c924a775fd7bd3) by [@AntoineDoubovetzky](https://github.com/AntoineDoubovetzky))
|
||||
|
||||
#### Android specific
|
||||
|
||||
- Fix potential crash if ReactRootView does not have insets attached. ([6239e2f5ce](https://github.com/facebook/react-native/commit/6239e2f5ce82f7c2e683eb4699b9ce3ff1b58ac5) by [@enahum](https://github.com/enahum))
|
||||
- Upgrading OkHttp from 4.9.1 to 4.9.2 to fix CVE-2021-0341. ([e896d21](https://github.com/facebook/react-native/commit/e896d21ced3c0c917c2fc0044d2b93b44df9a081) by [@owjsub](https://github.com/owjsub))
|
||||
|
||||
#### iOS specific
|
||||
|
||||
- Fix `Time.h` patch not being applied when running `pod install --project-directory=ios` ([60cef850bd](https://github.com/facebook/react-native/commit/60cef850bd3fd12c32ee1196bd19a559592d1465) by [@tido64](https://github.com/tido64))
|
||||
- Find-node.sh now respects .nvmrc ([35bcf934b1](https://github.com/facebook/react-native/commit/35bcf934b186e581d100d43e563044300759557f) by [@igrayson](https://github.com/igrayson))
|
||||
|
||||
## v0.67.1
|
||||
|
||||
### Fixed
|
||||
|
||||
+110
-4
@@ -1,7 +1,113 @@
|
||||
# Contributing to React Native
|
||||
|
||||
Thank you for your interest in contributing to React Native! From commenting on and triaging issues, to reviewing and sending Pull Requests, all contributions are welcome.
|
||||
We aim to build a vibrant and inclusive [ecosystem of partners, core contributors, and community](ECOSYSTEM.md) that goes beyond the main React Native GitHub repository.
|
||||
Thank you for your interest in contributing to React Native! From commenting on and triaging issues, to reviewing and sending Pull Requests, all contributions are welcome. We aim to build a vibrant and inclusive [ecosystem of partners, core contributors, and community](ECOSYSTEM.md) that goes beyond the main React Native GitHub repository.
|
||||
|
||||
To learn more about how to contribute check out the Contributing section on the React Native website:
|
||||
* https://reactnative.dev/contributing/overview
|
||||
The [Open Source Guides](https://opensource.guide/) website has a collection of resources for individuals, communities, and companies who want to learn how to run and contribute to an open source project. Contributors and people new to open source alike will find the following guides especially useful:
|
||||
|
||||
* [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/)
|
||||
* [Building Welcoming Communities](https://opensource.guide/building-community/)
|
||||
|
||||
|
||||
### [Code of Conduct](https://github.com/facebook/react-native/blob/HEAD/CODE_OF_CONDUCT.md)
|
||||
|
||||
As a reminder, all contributors are expected to adhere to the [Code of Conduct](https://github.com/facebook/react-native/blob/HEAD/CODE_OF_CONDUCT.md).
|
||||
|
||||
## Ways to Contribute
|
||||
|
||||
If you are eager to start contributing code right away, we have a list of [good first issues](https://github.com/facebook/react-native/labels/good%20first%20issue) that contain bugs which have a relatively limited scope. As you gain more experience and demonstrate a commitment to evolving React Native, you may be granted issue management permissions in the repository.
|
||||
|
||||
There are other ways you can contribute without writing a single line of code. Here are a few things you can do to help out:
|
||||
|
||||
1. **Replying and handling open issues.** We get a lot of issues every day, and some of them may lack necessary information. You can help out by guiding people through the process of filling out the issue template, asking for clarifying information, or pointing them to existing issues that match their description of the problem. We cover more about this process in the [Issue Triage wiki](https://github.com/facebook/react-native/wiki/Triaging-GitHub-Issues).
|
||||
2. **Reviewing pull requests for the docs.** Reviewing [documentation updates](https://github.com/facebook/react-native-website/pulls) can be as simple as checking for spelling and grammar. If you encounter situations that can be explained better in the docs, click **Edit** at the top of most docs pages to get started with your own contribution.
|
||||
3. **Help people write test plans.** Some pull requests sent to the main repository may lack a proper test plan. These help reviewers understand how the change was tested, and can speed up the time it takes for a contribution to be accepted.
|
||||
|
||||
Each of these tasks is highly impactful, and maintainers will greatly appreciate your help.
|
||||
|
||||
### Our Development Process
|
||||
|
||||
We use GitHub issues and pull requests to keep track of bug reports and contributions from the community. All changes from engineers at Facebook will sync to [GitHub](https://github.com/facebook/react-native) through a bridge with Facebook's internal source control. Changes from the community are handled through GitHub pull requests. Once a change made on GitHub is approved, it will first be imported into Facebook's internal source control and tested against Facebook's codebase. Once merged at Facebook, the change will eventually sync back to GitHub as a single commit once it has passed Facebook's internal tests.
|
||||
|
||||
You can learn more about the contribution process in the following documents:
|
||||
|
||||
* [Issues](https://github.com/facebook/react-native/wiki/Triaging-GitHub-Issues)
|
||||
* [Pull Requests](https://github.com/facebook/react-native/wiki/Managing-Pull-Requests)
|
||||
|
||||
We also have a thriving community of contributors who would be happy to help you get set up. You can reach out to us through [@ReactNative](http://twitter.com/reactnative) (the React Native team) and [@ReactNativeComm](http://twitter.com/reactnativecomm) (the React Native Community organization).
|
||||
|
||||
### Repositories
|
||||
|
||||
The main repository, <https://github.com/facebook/react-native>, contains the React Native framework itself and it is here where we keep track of bug reports and manage pull requests.
|
||||
|
||||
There are a few other repositories you might want to familiarize yourself with:
|
||||
|
||||
* **React Native website** which contains the source code for the website, including the documentation, located at <https://github.com/facebook/react-native-website>
|
||||
* **Releases** Conversations for new releases are happening [in this discussion repo](https://github.com/reactwg/react-native-releases/discussions).
|
||||
* **Changelog** The changelog can be found [here](https://github.com/facebook/react-native/blob/main/CHANGELOG.md).
|
||||
* **Discussions** about the future of React Native take place in the <https://github.com/react-native-community/discussions-and-proposals> repository.
|
||||
* **High-quality plugins** for React Native can be found throughout the [React Native Community GitHub Organization](http://github.com/react-native-community/).
|
||||
|
||||
Browsing through these repositories should provide some insight into how the React Native open source project is managed.
|
||||
|
||||
## GitHub Issues
|
||||
|
||||
We use GitHub issues to track bugs exclusively. We have documented our issue handling processes in the [Issues wiki](https://github.com/facebook/react-native/wiki/Triaging-GitHub-Issues).
|
||||
|
||||
### Security Bugs
|
||||
|
||||
Facebook has a [bounty program](https://www.facebook.com/whitehat/) for the safe disclosure of security bugs. In those cases, please go through the process outlined on that page and do not file a public issue.
|
||||
|
||||
## Helping with Documentation
|
||||
|
||||
The React Native documentation is hosted as part of the React Native website repository at https://github.com/facebook/react-native-website. The website itself is located at <https://reactnative.dev/> and it is built using [Docusaurus](https://docusaurus.io/). If there's anything you'd like to change in the docs, you can get started by clicking on the "Edit" button located on the upper right of most pages in the website.
|
||||
|
||||
If you are adding new functionality or introducing a change in behavior, we will ask you to update the documentation to reflect your changes.
|
||||
|
||||
### Contributing to the Blog
|
||||
|
||||
The React Native blog is generated [from the Markdown sources for the blog](https://github.com/facebook/react-native-website/tree/HEAD/website/blog).
|
||||
|
||||
Please open an issue in the https://github.com/facebook/react-native-website repository or tag us on [@ReactNative on Twitter](http://twitter.com/reactnative) and get the go-ahead from a maintainer before writing an article intended for the React Native blog. In most cases, you might want to share your article on your own blog or writing medium instead. It's worth asking, though, in case we find your article is a good fit for the blog.
|
||||
|
||||
We recommend referring to the [CONTRIBUTING](https://github.com/facebook/react-native-website/blob/HEAD/CONTRIBUTING.md) document for the `react-native-website` repository to learn more about contributing to the website in general.
|
||||
|
||||
## Contributing Code
|
||||
|
||||
Code-level contributions to React Native generally come in the form of [pull requests](https://help.github.com/en/articles/about-pull-requests). These are done by forking the repo and making changes locally. Directly in the repo, there is the [`rn-tester` app](/packages/rn-tester) that you can install on your device (or simulators) and use to test the changes you're making to React Native sources.
|
||||
|
||||
The process of proposing a change to React Native can be summarized as follows:
|
||||
|
||||
1. Fork the React Native repository and create your branch from `main`.
|
||||
2. Make the desired changes to React Native sources. Use the `packages/rn-tester` app to test them out.
|
||||
3. If you've added code that should be tested, add tests.
|
||||
4. If you've changed APIs, update the documentation, which lives in [another repo](https://github.com/facebook/react-native-website/).
|
||||
5. Ensure the test suite passes, either locally or on CI once you opened a pull request.
|
||||
6. Make sure your code lints (for example via `yarn lint --fix`).
|
||||
7. Push the changes to your fork.
|
||||
8. Create a pull request to the React Native repository.
|
||||
9. Review and address comments on your pull request.
|
||||
1. A bot may comment with suggestions. Generally we ask you to resolve these first before a maintainer will review your code.
|
||||
2. If changes are requested and addressed, please [request review](https://docs.github.com/en/github/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/requesting-a-pull-request-review) to notify reviewers to take another look.
|
||||
10. If you haven't already, please complete the [Contributor License Agreement](https://github.com/facebook/react-native/wiki/Contributor-License-Agreement) ("CLA"). **[Complete your CLA here.](https://code.facebook.com/cla)**
|
||||
|
||||
If all goes well, your pull request will be merged. If it is not merged, maintainers will do their best to explain the reason why.
|
||||
|
||||
### Step-by-step Guide
|
||||
|
||||
Whenever you are ready to contribute code, check out our [step-by-step guide to sending your first pull request](https://github.com/facebook/react-native/wiki/How-to-Open-a-Pull-Request), or read the [How to Contribute Code](https://github.com/facebook/react-native/wiki/How-to-Contribute-Code) wiki for more details.
|
||||
|
||||
### Tests
|
||||
|
||||
Tests help us prevent regressions from being introduced to the codebase. The GitHub repository is continuously tested using Circle and Appveyor, the results of which are available through the Checks functionality on [commits](https://github.com/facebook/react-native/commits/HEAD) and pull requests. You can learn more about running and writing tests in the [Tests wiki](http://github.com/facebook/react-native/wiki/Tests).
|
||||
|
||||
## Community Contributions
|
||||
|
||||
Contributions to React Native are not limited to GitHub. You can help others by sharing your experience using React Native, whether that is through blog posts, presenting talks at conferences, or simply sharing your thoughts on Twitter and tagging @ReactNative.
|
||||
|
||||
## Where to Get Help
|
||||
|
||||
As you work on React Native, it is natural that sooner or later you may require help. In addition to the resources listed in [SUPPORT](.github/SUPPORT.md), people interested in contributing may take advantage of the following:
|
||||
|
||||
* **Twitter**. The React Native team at Facebook has its own account at [@reactnative](https://twitter.com/reactnative), and the React Native Community uses [@reactnativecomm](https://twitter.com/reactnativecomm). If you feel stuck, or need help contributing, please do not hesitate to reach out.
|
||||
* **Proposals Repository**. If you are considering working on a feature large in scope, consider [creating a proposal first](https://github.com/react-native-community/discussions-and-proposals). The community can help you figure out the right approach, and we'd be happy to help.
|
||||
* **React Native Community Discord**. While we try to hold most discussions in public, sometimes it can be beneficial to have conversations in real time with other contributors. People who have demonstrated a commitment to moving React Native forward through sustained contributions to the project may eventually be invited to join the React Native Community Discord.
|
||||
|
||||
+5
-5
@@ -12,14 +12,14 @@ There are three types of stakeholders:
|
||||
|
||||
Partners are companies that are significantly invested in React Native and have been for years. Informed by their use of React Native, they push for improvements of the core and/or the ecosystem around it. Partners think of React Native as a product: they understand the trade offs that the project makes as well as future plans and goals. Together we shape the vision for React Native to make it the best way to build applications.
|
||||
|
||||
React Native's current set of partners include Callstack, Expo, Infinite Red, Meta, Microsoft and Software Mansion. Many engineers from these companies are core contributors, and their partner responsibilities also include:
|
||||
React Native's current set of partners include Callstack, Expo, Facebook, Infinite Red, Microsoft and Software Mansion. Many engineers from these companies are core contributors, and their partner responsibilities also include:
|
||||
|
||||
* **[Callstack](https://callstack.com/):** Manages releases, maintains the [React Native CLI](https://github.com/react-native-community/react-native-cli) and organizes [React Native EU](https://react-native.eu/)
|
||||
* **[Expo](https://expo.dev/):** Builds [expo](https://github.com/expo/expo) and [EAS](https://expo.dev/eas) on top of React Native to simplify app development
|
||||
* **[Expo](https://expo.io/):** Builds [expo](https://github.com/expo/expo) on top of React Native to simplify app development
|
||||
* **[Facebook](https://opensource.facebook.com):** Oversees the React Native product and maintains the [React Native core repo](https://reactnative.dev/)
|
||||
* **[Infinite Red](https://infinite.red/):** Maintains the [ignite cli/boilerplate](https://github.com/infinitered/ignite), organizes [Chain React Conf](https://cr.infinite.red/)
|
||||
* **[Meta](https://opensource.fb.com/):** Oversees the React Native product and maintains the [React Native core repo](https://reactnative.dev/)
|
||||
* **[Microsoft](http://aka.ms/reactnative):** Develops [React Native Windows](https://github.com/Microsoft/react-native-windows) and [React Native macOS](https://github.com/microsoft/react-native-macos) for building apps that target Windows and macOS
|
||||
* **[Software Mansion](https://swmansion.com/):** Maintain core infrastructure including JSC, Animated, and other popular third-party plugins and organizes [App.js Conf](https://appjs.co/)
|
||||
* **[Software Mansion](https://swmansion.com/):** Maintain core infrastructure including JSC, Animated, and other popular third-party plugins.
|
||||
|
||||
In terms of open source work, pull requests from partners are commonly prioritized. When you are contributing to React Native, you'll most likely meet somebody who works at one of the partner companies and who is a core contributor:
|
||||
|
||||
@@ -44,7 +44,7 @@ We aim to make contributing to React Native as easy and transparent as possible.
|
||||
|
||||
## Community Contributors
|
||||
|
||||
Community contributors are individuals who support projects in the [react-native-community](https://github.com/react-native-community) organization. This organization exists as an incubator for high quality components that extend the capabilities of React Native with functionality that many but not all applications require. Meta engineers will provide guidance to help build a vibrant community of people and components that make React Native better.
|
||||
Community contributors are individuals who support projects in the [react-native-community](https://github.com/react-native-community) organization. This organization exists as an incubator for high quality components that extend the capabilities of React Native with functionality that many but not all applications require. Facebook engineers will provide guidance to help build a vibrant community of people and components that make React Native better.
|
||||
|
||||
This structure has multiple benefits:
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
source 'https://rubygems.org'
|
||||
|
||||
# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version
|
||||
ruby '>= 2.6.10'
|
||||
ruby '2.7.4'
|
||||
|
||||
gem 'cocoapods', '>= 1.11.3'
|
||||
gem 'cocoapods', '~> 1.11', '>= 1.11.2'
|
||||
|
||||
+22
-20
@@ -1,29 +1,30 @@
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
CFPropertyList (3.0.6)
|
||||
CFPropertyList (3.0.5)
|
||||
rexml
|
||||
activesupport (7.0.5)
|
||||
activesupport (6.1.6.1)
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
i18n (>= 1.6, < 2)
|
||||
minitest (>= 5.1)
|
||||
tzinfo (~> 2.0)
|
||||
addressable (2.8.4)
|
||||
public_suffix (>= 2.0.2, < 6.0)
|
||||
zeitwerk (~> 2.3)
|
||||
addressable (2.8.0)
|
||||
public_suffix (>= 2.0.2, < 5.0)
|
||||
algoliasearch (1.27.5)
|
||||
httpclient (~> 2.8, >= 2.8.3)
|
||||
json (>= 1.5.1)
|
||||
atomos (0.1.3)
|
||||
claide (1.1.0)
|
||||
cocoapods (1.12.1)
|
||||
cocoapods (1.11.3)
|
||||
addressable (~> 2.8)
|
||||
claide (>= 1.0.2, < 2.0)
|
||||
cocoapods-core (= 1.12.1)
|
||||
cocoapods-core (= 1.11.3)
|
||||
cocoapods-deintegrate (>= 1.0.3, < 2.0)
|
||||
cocoapods-downloader (>= 1.6.0, < 2.0)
|
||||
cocoapods-downloader (>= 1.4.0, < 2.0)
|
||||
cocoapods-plugins (>= 1.0.0, < 2.0)
|
||||
cocoapods-search (>= 1.0.0, < 2.0)
|
||||
cocoapods-trunk (>= 1.6.0, < 2.0)
|
||||
cocoapods-trunk (>= 1.4.0, < 2.0)
|
||||
cocoapods-try (>= 1.1.0, < 2.0)
|
||||
colored2 (~> 3.1)
|
||||
escape (~> 0.0.4)
|
||||
@@ -31,10 +32,10 @@ GEM
|
||||
gh_inspector (~> 1.0)
|
||||
molinillo (~> 0.8.0)
|
||||
nap (~> 1.0)
|
||||
ruby-macho (>= 2.3.0, < 3.0)
|
||||
ruby-macho (>= 1.0, < 3.0)
|
||||
xcodeproj (>= 1.21.0, < 2.0)
|
||||
cocoapods-core (1.12.1)
|
||||
activesupport (>= 5.0, < 8)
|
||||
cocoapods-core (1.11.3)
|
||||
activesupport (>= 5.0, < 7)
|
||||
addressable (~> 2.8)
|
||||
algoliasearch (~> 1.0)
|
||||
concurrent-ruby (~> 1.1)
|
||||
@@ -53,19 +54,19 @@ GEM
|
||||
netrc (~> 0.11)
|
||||
cocoapods-try (1.2.0)
|
||||
colored2 (3.1.2)
|
||||
concurrent-ruby (1.2.2)
|
||||
concurrent-ruby (1.1.10)
|
||||
escape (0.0.4)
|
||||
ethon (0.16.0)
|
||||
ethon (0.15.0)
|
||||
ffi (>= 1.15.0)
|
||||
ffi (1.15.5)
|
||||
fourflusher (2.3.1)
|
||||
fuzzy_match (2.0.4)
|
||||
gh_inspector (1.1.3)
|
||||
httpclient (2.8.3)
|
||||
i18n (1.14.1)
|
||||
i18n (1.12.0)
|
||||
concurrent-ruby (~> 1.0)
|
||||
json (2.6.3)
|
||||
minitest (5.18.0)
|
||||
json (2.6.2)
|
||||
minitest (5.16.2)
|
||||
molinillo (0.8.0)
|
||||
nanaimo (0.3.0)
|
||||
nap (1.1.0)
|
||||
@@ -75,7 +76,7 @@ GEM
|
||||
ruby-macho (2.5.1)
|
||||
typhoeus (1.4.0)
|
||||
ethon (>= 0.9.0)
|
||||
tzinfo (2.0.6)
|
||||
tzinfo (2.0.5)
|
||||
concurrent-ruby (~> 1.0)
|
||||
xcodeproj (1.22.0)
|
||||
CFPropertyList (>= 2.3.3, < 4.0)
|
||||
@@ -84,15 +85,16 @@ GEM
|
||||
colored2 (~> 3.1)
|
||||
nanaimo (~> 0.3.0)
|
||||
rexml (~> 3.2.4)
|
||||
zeitwerk (2.6.0)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
||||
DEPENDENCIES
|
||||
cocoapods (>= 1.11.3)
|
||||
cocoapods (~> 1.11, >= 1.11.2)
|
||||
|
||||
RUBY VERSION
|
||||
ruby 2.7.5p203
|
||||
ruby 2.7.4p191
|
||||
|
||||
BUNDLED WITH
|
||||
2.3.11
|
||||
2.2.27
|
||||
|
||||
@@ -33,7 +33,7 @@ const VAL_MERGE_EXPECT = {foo: 1, bar: {hoo: 2, boo: 1}, baz: 2, moo: {a: 3}};
|
||||
let done = (result: ?boolean) => {};
|
||||
let updateMessage = (message: string) => {};
|
||||
|
||||
function runTestCase(description: string, fn: () => void) {
|
||||
function runTestCase(description: string, fn) {
|
||||
updateMessage(description);
|
||||
fn();
|
||||
}
|
||||
@@ -61,20 +61,7 @@ function stringify(
|
||||
return JSON.stringify(value);
|
||||
}
|
||||
|
||||
function expectEqual(
|
||||
lhs: ?(any | string | Array<Array<string>>),
|
||||
rhs:
|
||||
| null
|
||||
| string
|
||||
| {
|
||||
bar: {boo: number, hoo: number},
|
||||
baz: number,
|
||||
foo: number,
|
||||
moo: {a: number},
|
||||
}
|
||||
| Array<Array<string>>,
|
||||
testname: string,
|
||||
) {
|
||||
function expectEqual(lhs, rhs, testname: string) {
|
||||
expectTrue(
|
||||
!deepDiffer(lhs, rhs),
|
||||
'Error in test ' +
|
||||
@@ -86,10 +73,7 @@ function expectEqual(
|
||||
);
|
||||
}
|
||||
|
||||
function expectAsyncNoError(
|
||||
place: string,
|
||||
err: ?(Error | string | Array<Error>),
|
||||
) {
|
||||
function expectAsyncNoError(place, err) {
|
||||
if (err instanceof Error) {
|
||||
err = err.message;
|
||||
}
|
||||
@@ -223,7 +207,7 @@ class AsyncStorageTest extends React.Component<{...}, $FlowFixMeState> {
|
||||
this.setState({done: true}, () => {
|
||||
TestModule.markTestCompleted();
|
||||
});
|
||||
updateMessage = (msg: string) => {
|
||||
updateMessage = msg => {
|
||||
this.setState({messages: this.state.messages.concat('\n' + msg)});
|
||||
DEBUG && console.log(msg);
|
||||
};
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
load("@fbsource//tools/build_defs:js_library_glob.bzl", "js_library_glob")
|
||||
load("@fbsource//tools/build_defs:js_glob.bzl", "js_glob")
|
||||
load("@fbsource//tools/build_defs/oss:metro_defs.bzl", "rn_library")
|
||||
|
||||
# This file was generated by running
|
||||
@@ -6,7 +6,7 @@ load("@fbsource//tools/build_defs/oss:metro_defs.bzl", "rn_library")
|
||||
|
||||
rn_library(
|
||||
name = "IntegrationTests",
|
||||
srcs = js_library_glob(
|
||||
srcs = js_glob(
|
||||
[
|
||||
"**/*",
|
||||
],
|
||||
@@ -17,10 +17,7 @@ rn_library(
|
||||
"websocket_integration_test_server.js",
|
||||
],
|
||||
),
|
||||
labels = [
|
||||
"pfh:ReactNative_CommonInfrastructurePlaceholder",
|
||||
"supermodule:xplat/default/public.react_native.tests",
|
||||
],
|
||||
labels = ["supermodule:xplat/default/public.react_native.tests"],
|
||||
skip_processors = True,
|
||||
visibility = ["PUBLIC"],
|
||||
deps = [
|
||||
|
||||
@@ -19,7 +19,7 @@ import type {ViewStyleProp} from 'react-native/Libraries/StyleSheet/StyleSheet';
|
||||
|
||||
const deepDiffer = require('react-native/Libraries/Utilities/differ/deepDiffer');
|
||||
|
||||
function debug(...args: Array<void | Layout | string>) {
|
||||
function debug(...args) {
|
||||
// console.log.apply(null, arguments);
|
||||
}
|
||||
|
||||
@@ -119,19 +119,16 @@ class LayoutEventsTest extends React.Component<Props, State> {
|
||||
}
|
||||
|
||||
onViewLayout: (e: LayoutEvent) => void = (e: LayoutEvent) => {
|
||||
// $FlowFixMe[incompatible-call]
|
||||
debug('received view layout event\n', e.nativeEvent);
|
||||
this.setState({viewLayout: e.nativeEvent.layout}, this.checkLayout);
|
||||
};
|
||||
|
||||
onTextLayout: (e: LayoutEvent) => void = (e: LayoutEvent) => {
|
||||
// $FlowFixMe[incompatible-call]
|
||||
debug('received text layout event\n', e.nativeEvent);
|
||||
this.setState({textLayout: e.nativeEvent.layout}, this.checkLayout);
|
||||
};
|
||||
|
||||
onImageLayout: (e: LayoutEvent) => void = (e: LayoutEvent) => {
|
||||
// $FlowFixMe[incompatible-call]
|
||||
debug('received image layout event\n', e.nativeEvent);
|
||||
this.setState({imageLayout: e.nativeEvent.layout}, this.checkLayout);
|
||||
};
|
||||
|
||||
+11
-5
@@ -1,12 +1,18 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 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.
|
||||
|
||||
THIS_DIR=$(cd -P "$(dirname "$(readlink "${BASH_SOURCE[0]}" || echo "${BASH_SOURCE[0]}")")" && pwd)
|
||||
pushd "$THIS_DIR" || exit
|
||||
./websocket_integration_test_server.js
|
||||
popd || exit
|
||||
# Set terminal title
|
||||
echo -en "\033]0;Web Socket Test Server\a"
|
||||
clear
|
||||
|
||||
echo "Process terminated."
|
||||
THIS_DIR=$(cd -P "$(dirname "$(readlink "${BASH_SOURCE[0]}" || echo "${BASH_SOURCE[0]}")")" && pwd)
|
||||
pushd "$THIS_DIR"
|
||||
./websocket_integration_test_server.js
|
||||
popd
|
||||
|
||||
echo "Process terminated. Press <enter> to close the window"
|
||||
read
|
||||
@@ -143,13 +143,6 @@ const ActionSheetIOS = {
|
||||
successCallback,
|
||||
);
|
||||
},
|
||||
|
||||
dismissActionSheet: () => {
|
||||
invariant(RCTActionSheetManager, "ActionSheetManager doesn't exist");
|
||||
if (typeof RCTActionSheetManager.dismissActionSheet === 'function') {
|
||||
RCTActionSheetManager.dismissActionSheet();
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
module.exports = ActionSheetIOS;
|
||||
|
||||
@@ -47,7 +47,6 @@ export interface Spec extends TurboModule {
|
||||
|}) => void,
|
||||
successCallback: (completed: boolean, activityType: ?string) => void,
|
||||
) => void;
|
||||
+dismissActionSheet?: () => void;
|
||||
}
|
||||
|
||||
export default (TurboModuleRegistry.get<Spec>('ActionSheetManager'): ?Spec);
|
||||
|
||||
@@ -24,7 +24,7 @@ Pod::Spec.new do |s|
|
||||
s.documentation_url = "https://reactnative.dev/docs/actionsheetios"
|
||||
s.license = package["license"]
|
||||
s.author = "Facebook, Inc. and its affiliates"
|
||||
s.platforms = { :ios => "12.4" }
|
||||
s.platforms = { :ios => "11.0" }
|
||||
s.source = source
|
||||
s.source_files = "*.{m}"
|
||||
s.preserve_paths = "package.json", "LICENSE", "LICENSE-docs"
|
||||
|
||||
@@ -8,9 +8,8 @@
|
||||
* @flow
|
||||
*/
|
||||
|
||||
import type {DialogOptions} from '../NativeModules/specs/NativeDialogManagerAndroid';
|
||||
|
||||
import Platform from '../Utilities/Platform';
|
||||
import type {DialogOptions} from '../NativeModules/specs/NativeDialogManagerAndroid';
|
||||
import RCTAlertManager from './RCTAlertManager';
|
||||
|
||||
export type AlertType =
|
||||
@@ -28,7 +27,6 @@ export type Buttons = Array<{
|
||||
|
||||
type Options = {
|
||||
cancelable?: ?boolean,
|
||||
userInterfaceStyle?: 'unspecified' | 'light' | 'dark',
|
||||
onDismiss?: ?() => void,
|
||||
...
|
||||
};
|
||||
@@ -46,15 +44,7 @@ class Alert {
|
||||
options?: Options,
|
||||
): void {
|
||||
if (Platform.OS === 'ios') {
|
||||
Alert.prompt(
|
||||
title,
|
||||
message,
|
||||
buttons,
|
||||
'default',
|
||||
undefined,
|
||||
undefined,
|
||||
options,
|
||||
);
|
||||
Alert.prompt(title, message, buttons, 'default');
|
||||
} else if (Platform.OS === 'android') {
|
||||
const NativeDialogManagerAndroid =
|
||||
require('../NativeModules/specs/NativeDialogManagerAndroid').default;
|
||||
@@ -92,8 +82,6 @@ class Alert {
|
||||
config.buttonPositive = buttonPositive.text || defaultPositiveText;
|
||||
}
|
||||
|
||||
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by
|
||||
* Flow's LTI update could not be added via codemod */
|
||||
const onAction = (action, buttonKey) => {
|
||||
if (action === constants.buttonClicked) {
|
||||
if (buttonKey === constants.buttonNeutral) {
|
||||
@@ -107,7 +95,7 @@ class Alert {
|
||||
options && options.onDismiss && options.onDismiss();
|
||||
}
|
||||
};
|
||||
const onError = (errorMessage: string) => console.warn(errorMessage);
|
||||
const onError = errorMessage => console.warn(errorMessage);
|
||||
NativeDialogManagerAndroid.showAlert(config, onError, onAction);
|
||||
}
|
||||
}
|
||||
@@ -119,7 +107,6 @@ class Alert {
|
||||
type?: ?AlertType = 'plain-text',
|
||||
defaultValue?: string,
|
||||
keyboardType?: string,
|
||||
options?: Options,
|
||||
): void {
|
||||
if (Platform.OS === 'ios') {
|
||||
let callbacks = [];
|
||||
@@ -137,7 +124,7 @@ class Alert {
|
||||
destructiveButtonKey = String(index);
|
||||
}
|
||||
if (btn.text || index < (callbackOrButtons || []).length - 1) {
|
||||
const btnDef: {[number]: string} = {};
|
||||
const btnDef = {};
|
||||
btnDef[index] = btn.text || '';
|
||||
buttons.push(btnDef);
|
||||
}
|
||||
@@ -154,7 +141,6 @@ class Alert {
|
||||
cancelButtonKey,
|
||||
destructiveButtonKey,
|
||||
keyboardType,
|
||||
userInterfaceStyle: options?.userInterfaceStyle || undefined,
|
||||
},
|
||||
(id, value) => {
|
||||
const cb = callbacks[id];
|
||||
|
||||
@@ -20,7 +20,6 @@ export type Args = {|
|
||||
cancelButtonKey?: string,
|
||||
destructiveButtonKey?: string,
|
||||
keyboardType?: string,
|
||||
userInterfaceStyle?: string,
|
||||
|};
|
||||
|
||||
export interface Spec extends TurboModule {
|
||||
|
||||
@@ -16,8 +16,8 @@ import typeof AnimatedSectionList from './components/AnimatedSectionList';
|
||||
import typeof AnimatedText from './components/AnimatedText';
|
||||
import typeof AnimatedView from './components/AnimatedView';
|
||||
|
||||
import * as AnimatedMock from './AnimatedMock';
|
||||
import * as AnimatedImplementation from './AnimatedImplementation';
|
||||
const AnimatedMock = require('./AnimatedMock');
|
||||
const AnimatedImplementation = require('./AnimatedImplementation');
|
||||
|
||||
const Animated = ((Platform.isTesting
|
||||
? AnimatedMock
|
||||
|
||||
@@ -41,7 +41,7 @@ function attachNativeEvent(
|
||||
// key path inside the `nativeEvent` object. Ex.: ['contentOffset', 'x'].
|
||||
const eventMappings = [];
|
||||
|
||||
const traverse = (value: mixed, path: Array<string>) => {
|
||||
const traverse = (value, path) => {
|
||||
if (value instanceof AnimatedValue) {
|
||||
value.__makeNative(platformConfig);
|
||||
|
||||
@@ -94,8 +94,8 @@ function attachNativeEvent(
|
||||
};
|
||||
}
|
||||
|
||||
function validateMapping(argMapping: $ReadOnlyArray<?Mapping>, args: any) {
|
||||
const validate = (recMapping: ?Mapping, recEvt: any, key: string) => {
|
||||
function validateMapping(argMapping, args) {
|
||||
const validate = (recMapping, recEvt, key) => {
|
||||
if (recMapping instanceof AnimatedValue) {
|
||||
invariant(
|
||||
typeof recEvt === 'number',
|
||||
@@ -223,10 +223,7 @@ class AnimatedEvent {
|
||||
validatedMapping = true;
|
||||
}
|
||||
|
||||
const traverse = (
|
||||
recMapping: ?(Mapping | AnimatedValue),
|
||||
recEvt: any,
|
||||
) => {
|
||||
const traverse = (recMapping, recEvt) => {
|
||||
if (recMapping instanceof AnimatedValue) {
|
||||
if (typeof recEvt === 'number') {
|
||||
recMapping.setValue(recEvt);
|
||||
|
||||
@@ -91,10 +91,10 @@ const diffClamp = function (
|
||||
|
||||
const _combineCallbacks = function (
|
||||
callback: ?EndCallback,
|
||||
config: $ReadOnly<{...AnimationConfig, ...}>,
|
||||
config: {...AnimationConfig, ...},
|
||||
) {
|
||||
if (callback && config.onComplete) {
|
||||
return (...args: Array<EndResult>) => {
|
||||
return (...args) => {
|
||||
config.onComplete && config.onComplete(...args);
|
||||
callback && callback(...args);
|
||||
};
|
||||
@@ -308,7 +308,7 @@ const sequence = function (
|
||||
let current = 0;
|
||||
return {
|
||||
start: function (callback?: ?EndCallback) {
|
||||
const onComplete = function (result: EndResult) {
|
||||
const onComplete = function (result) {
|
||||
if (!result.finished) {
|
||||
callback && callback(result);
|
||||
return;
|
||||
@@ -380,7 +380,7 @@ const parallel = function (
|
||||
}
|
||||
|
||||
animations.forEach((animation, idx) => {
|
||||
const cb = function (endResult: EndResult | {finished: boolean}) {
|
||||
const cb = function (endResult) {
|
||||
hasEnded[idx] = true;
|
||||
doneCount++;
|
||||
if (doneCount === animations.length) {
|
||||
@@ -460,7 +460,6 @@ type LoopAnimationConfig = {
|
||||
|
||||
const loop = function (
|
||||
animation: CompositeAnimation,
|
||||
// $FlowFixMe[prop-missing]
|
||||
{iterations = -1, resetBeforeIteration = true}: LoopAnimationConfig = {},
|
||||
): CompositeAnimation {
|
||||
let isFinished = false;
|
||||
@@ -552,19 +551,6 @@ const event = function (
|
||||
}
|
||||
};
|
||||
|
||||
// All types of animated nodes that represent scalar numbers and can be interpolated (etc)
|
||||
type AnimatedNumeric =
|
||||
| AnimatedAddition
|
||||
| AnimatedDiffClamp
|
||||
| AnimatedDivision
|
||||
| AnimatedInterpolation<number>
|
||||
| AnimatedModulo
|
||||
| AnimatedMultiplication
|
||||
| AnimatedSubtraction
|
||||
| AnimatedValue;
|
||||
|
||||
export type {AnimatedNumeric as Numeric};
|
||||
|
||||
/**
|
||||
* The `Animated` library is designed to make animations fluid, powerful, and
|
||||
* easy to build and maintain. `Animated` focuses on declarative relationships
|
||||
|
||||
@@ -10,8 +10,6 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
import type {EndResult} from './animations/Animation';
|
||||
|
||||
const {AnimatedEvent, attachNativeEvent} = require('./AnimatedEvent');
|
||||
const AnimatedImplementation = require('./AnimatedImplementation');
|
||||
const AnimatedInterpolation = require('./nodes/AnimatedInterpolation');
|
||||
@@ -25,7 +23,7 @@ import type {EndCallback} from './animations/Animation';
|
||||
import type {TimingAnimationConfig} from './animations/TimingAnimation';
|
||||
import type {DecayAnimationConfig} from './animations/DecayAnimation';
|
||||
import type {SpringAnimationConfig} from './animations/SpringAnimation';
|
||||
import type {Numeric as AnimatedNumeric} from './AnimatedImplementation';
|
||||
|
||||
import AnimatedColor from './nodes/AnimatedColor';
|
||||
|
||||
/**
|
||||
@@ -45,7 +43,7 @@ function mockAnimationStart(
|
||||
const guardedCallback =
|
||||
callback == null
|
||||
? callback
|
||||
: (...args: Array<EndResult>) => {
|
||||
: (...args) => {
|
||||
if (inAnimationCallback) {
|
||||
console.warn(
|
||||
'Ignoring recursive animation callback when running mock animations',
|
||||
@@ -160,14 +158,11 @@ type LoopAnimationConfig = {
|
||||
|
||||
const loop = function (
|
||||
animation: CompositeAnimation,
|
||||
// $FlowFixMe[prop-missing]
|
||||
{iterations = -1}: LoopAnimationConfig = {},
|
||||
): CompositeAnimation {
|
||||
return emptyAnimation;
|
||||
};
|
||||
|
||||
export type {AnimatedNumeric as Numeric};
|
||||
|
||||
module.exports = {
|
||||
Value: AnimatedValue,
|
||||
ValueXY: AnimatedValueXY,
|
||||
|
||||
@@ -20,10 +20,7 @@ import type {
|
||||
} from './NativeAnimatedModule';
|
||||
import type {AnimationConfig, EndCallback} from './animations/Animation';
|
||||
import type {InterpolationConfigType} from './nodes/AnimatedInterpolation';
|
||||
import ReactNativeFeatureFlags from '../ReactNative/ReactNativeFeatureFlags';
|
||||
import invariant from 'invariant';
|
||||
import RCTDeviceEventEmitter from '../EventEmitter/RCTDeviceEventEmitter';
|
||||
import type {EventSubscription} from '../vendor/emitter/EventEmitter';
|
||||
|
||||
// TODO T69437152 @petetheheat - Delete this fork when Fabric ships to 100%.
|
||||
const NativeAnimatedModule =
|
||||
@@ -39,83 +36,24 @@ let nativeEventEmitter;
|
||||
let waitingForQueuedOperations = new Set();
|
||||
let queueOperations = false;
|
||||
let queue: Array<() => void> = [];
|
||||
// $FlowFixMe
|
||||
let singleOpQueue: Array<any> = [];
|
||||
|
||||
const useSingleOpBatching =
|
||||
Platform.OS === 'android' &&
|
||||
!!NativeAnimatedModule?.queueAndExecuteBatchedOperations &&
|
||||
ReactNativeFeatureFlags.animatedShouldUseSingleOp();
|
||||
let flushQueueTimeout = null;
|
||||
|
||||
const eventListenerGetValueCallbacks = {};
|
||||
const eventListenerAnimationFinishedCallbacks = {};
|
||||
let globalEventEmitterGetValueListener: ?EventSubscription = null;
|
||||
let globalEventEmitterAnimationFinishedListener: ?EventSubscription = null;
|
||||
|
||||
const nativeOps: ?typeof NativeAnimatedModule = useSingleOpBatching
|
||||
? ((function () {
|
||||
const apis = [
|
||||
'createAnimatedNode', // 1
|
||||
'updateAnimatedNodeConfig', // 2
|
||||
'getValue', // 3
|
||||
'startListeningToAnimatedNodeValue', // 4
|
||||
'stopListeningToAnimatedNodeValue', // 5
|
||||
'connectAnimatedNodes', // 6
|
||||
'disconnectAnimatedNodes', // 7
|
||||
'startAnimatingNode', // 8
|
||||
'stopAnimation', // 9
|
||||
'setAnimatedNodeValue', // 10
|
||||
'setAnimatedNodeOffset', // 11
|
||||
'flattenAnimatedNodeOffset', // 12
|
||||
'extractAnimatedNodeOffset', // 13
|
||||
'connectAnimatedNodeToView', // 14
|
||||
'disconnectAnimatedNodeFromView', // 15
|
||||
'restoreDefaultValues', // 16
|
||||
'dropAnimatedNode', // 17
|
||||
'addAnimatedEventToView', // 18
|
||||
'removeAnimatedEventFromView', // 19
|
||||
'addListener', // 20
|
||||
'removeListener', // 21
|
||||
];
|
||||
return apis.reduce((acc, functionName, i) => {
|
||||
// These indices need to be kept in sync with the indices in native (see NativeAnimatedModule in Java, or the equivalent for any other native platform).
|
||||
// $FlowFixMe[prop-missing]
|
||||
acc[functionName] = i + 1;
|
||||
return acc;
|
||||
}, {});
|
||||
})(): $FlowFixMe)
|
||||
: NativeAnimatedModule;
|
||||
|
||||
/**
|
||||
* Wrappers around NativeAnimatedModule to provide flow and autocomplete support for
|
||||
* the native module methods, and automatic queue management on Android
|
||||
* Simple wrappers around NativeAnimatedModule to provide flow and autocomplete support for
|
||||
* the native module methods
|
||||
*/
|
||||
const API = {
|
||||
getValue: function (
|
||||
tag: number,
|
||||
saveValueCallback: (value: number) => void,
|
||||
): void {
|
||||
invariant(nativeOps, 'Native animated module is not available');
|
||||
if (useSingleOpBatching) {
|
||||
if (saveValueCallback) {
|
||||
eventListenerGetValueCallbacks[tag] = saveValueCallback;
|
||||
}
|
||||
// $FlowFixMe
|
||||
API.queueOperation(nativeOps.getValue, tag);
|
||||
} else {
|
||||
API.queueOperation(nativeOps.getValue, tag, saveValueCallback);
|
||||
}
|
||||
invariant(NativeAnimatedModule, 'Native animated module is not available');
|
||||
API.queueOperation(() => {
|
||||
NativeAnimatedModule.getValue(tag, saveValueCallback);
|
||||
});
|
||||
},
|
||||
setWaitingForIdentifier: function (id: string): void {
|
||||
waitingForQueuedOperations.add(id);
|
||||
queueOperations = true;
|
||||
if (
|
||||
ReactNativeFeatureFlags.animatedShouldDebounceQueueFlush() &&
|
||||
flushQueueTimeout
|
||||
) {
|
||||
clearTimeout(flushQueueTimeout);
|
||||
}
|
||||
},
|
||||
unsetWaitingForIdentifier: function (id: string): void {
|
||||
waitingForQueuedOperations.delete(id);
|
||||
@@ -126,103 +64,58 @@ const API = {
|
||||
}
|
||||
},
|
||||
disableQueue: function (): void {
|
||||
invariant(nativeOps, 'Native animated module is not available');
|
||||
|
||||
if (ReactNativeFeatureFlags.animatedShouldDebounceQueueFlush()) {
|
||||
const prevTimeout = flushQueueTimeout;
|
||||
clearImmediate(prevTimeout);
|
||||
flushQueueTimeout = setImmediate(API.flushQueue);
|
||||
} else {
|
||||
API.flushQueue();
|
||||
}
|
||||
},
|
||||
flushQueue: function (): void {
|
||||
invariant(NativeAnimatedModule, 'Native animated module is not available');
|
||||
flushQueueTimeout = null;
|
||||
|
||||
// Early returns before calling any APIs
|
||||
if (useSingleOpBatching && singleOpQueue.length === 0) {
|
||||
return;
|
||||
if (Platform.OS === 'android') {
|
||||
NativeAnimatedModule.startOperationBatch();
|
||||
}
|
||||
if (!useSingleOpBatching && queue.length === 0) {
|
||||
return;
|
||||
for (let q = 0, l = queue.length; q < l; q++) {
|
||||
queue[q]();
|
||||
}
|
||||
|
||||
if (useSingleOpBatching) {
|
||||
// Set up event listener for callbacks if it's not set up
|
||||
if (
|
||||
!globalEventEmitterGetValueListener ||
|
||||
!globalEventEmitterAnimationFinishedListener
|
||||
) {
|
||||
setupGlobalEventEmitterListeners();
|
||||
}
|
||||
// Single op batching doesn't use callback functions, instead we
|
||||
// use RCTDeviceEventEmitter. This reduces overhead of sending lots of
|
||||
// JSI functions across to native code; but also, TM infrastructure currently
|
||||
// does not support packing a function into native arrays.
|
||||
NativeAnimatedModule.queueAndExecuteBatchedOperations?.(singleOpQueue);
|
||||
singleOpQueue.length = 0;
|
||||
} else {
|
||||
Platform.OS === 'android' && NativeAnimatedModule.startOperationBatch?.();
|
||||
for (let q = 0, l = queue.length; q < l; q++) {
|
||||
queue[q]();
|
||||
}
|
||||
queue.length = 0;
|
||||
Platform.OS === 'android' &&
|
||||
NativeAnimatedModule.finishOperationBatch?.();
|
||||
queue.length = 0;
|
||||
if (Platform.OS === 'android') {
|
||||
NativeAnimatedModule.finishOperationBatch();
|
||||
}
|
||||
},
|
||||
queueOperation: <Args: $ReadOnlyArray<mixed>, Fn: (...Args) => void>(
|
||||
fn: Fn,
|
||||
...args: Args
|
||||
): void => {
|
||||
if (useSingleOpBatching) {
|
||||
// Get the command ID from the queued function, and push that ID and any arguments needed to execute the operation
|
||||
// $FlowFixMe: surprise, fn is actually a number
|
||||
singleOpQueue.push(fn, ...args);
|
||||
return;
|
||||
}
|
||||
|
||||
// If queueing is explicitly on, *or* the queue has not yet
|
||||
// been flushed, use the queue. This is to prevent operations
|
||||
// from being executed out of order.
|
||||
if (queueOperations || queue.length !== 0) {
|
||||
queue.push(() => fn(...args));
|
||||
queueOperation: (fn: () => void): void => {
|
||||
if (queueOperations) {
|
||||
queue.push(fn);
|
||||
} else {
|
||||
fn(...args);
|
||||
fn();
|
||||
}
|
||||
},
|
||||
createAnimatedNode: function (tag: number, config: AnimatedNodeConfig): void {
|
||||
invariant(nativeOps, 'Native animated module is not available');
|
||||
API.queueOperation(nativeOps.createAnimatedNode, tag, config);
|
||||
},
|
||||
updateAnimatedNodeConfig: function (
|
||||
tag: number,
|
||||
config: AnimatedNodeConfig,
|
||||
): void {
|
||||
invariant(nativeOps, 'Native animated module is not available');
|
||||
if (nativeOps.updateAnimatedNodeConfig) {
|
||||
API.queueOperation(nativeOps.updateAnimatedNodeConfig, tag, config);
|
||||
}
|
||||
invariant(NativeAnimatedModule, 'Native animated module is not available');
|
||||
API.queueOperation(() =>
|
||||
NativeAnimatedModule.createAnimatedNode(tag, config),
|
||||
);
|
||||
},
|
||||
startListeningToAnimatedNodeValue: function (tag: number) {
|
||||
invariant(nativeOps, 'Native animated module is not available');
|
||||
API.queueOperation(nativeOps.startListeningToAnimatedNodeValue, tag);
|
||||
invariant(NativeAnimatedModule, 'Native animated module is not available');
|
||||
API.queueOperation(() =>
|
||||
NativeAnimatedModule.startListeningToAnimatedNodeValue(tag),
|
||||
);
|
||||
},
|
||||
stopListeningToAnimatedNodeValue: function (tag: number) {
|
||||
invariant(nativeOps, 'Native animated module is not available');
|
||||
API.queueOperation(nativeOps.stopListeningToAnimatedNodeValue, tag);
|
||||
invariant(NativeAnimatedModule, 'Native animated module is not available');
|
||||
API.queueOperation(() =>
|
||||
NativeAnimatedModule.stopListeningToAnimatedNodeValue(tag),
|
||||
);
|
||||
},
|
||||
connectAnimatedNodes: function (parentTag: number, childTag: number): void {
|
||||
invariant(nativeOps, 'Native animated module is not available');
|
||||
API.queueOperation(nativeOps.connectAnimatedNodes, parentTag, childTag);
|
||||
invariant(NativeAnimatedModule, 'Native animated module is not available');
|
||||
API.queueOperation(() =>
|
||||
NativeAnimatedModule.connectAnimatedNodes(parentTag, childTag),
|
||||
);
|
||||
},
|
||||
disconnectAnimatedNodes: function (
|
||||
parentTag: number,
|
||||
childTag: number,
|
||||
): void {
|
||||
invariant(nativeOps, 'Native animated module is not available');
|
||||
API.queueOperation(nativeOps.disconnectAnimatedNodes, parentTag, childTag);
|
||||
invariant(NativeAnimatedModule, 'Native animated module is not available');
|
||||
API.queueOperation(() =>
|
||||
NativeAnimatedModule.disconnectAnimatedNodes(parentTag, childTag),
|
||||
);
|
||||
},
|
||||
startAnimatingNode: function (
|
||||
animationId: number,
|
||||
@@ -230,85 +123,84 @@ const API = {
|
||||
config: AnimatingNodeConfig,
|
||||
endCallback: EndCallback,
|
||||
): void {
|
||||
invariant(nativeOps, 'Native animated module is not available');
|
||||
if (useSingleOpBatching) {
|
||||
if (endCallback) {
|
||||
eventListenerAnimationFinishedCallbacks[animationId] = endCallback;
|
||||
}
|
||||
// $FlowFixMe
|
||||
API.queueOperation(
|
||||
nativeOps.startAnimatingNode,
|
||||
animationId,
|
||||
nodeTag,
|
||||
config,
|
||||
);
|
||||
} else {
|
||||
API.queueOperation(
|
||||
nativeOps.startAnimatingNode,
|
||||
invariant(NativeAnimatedModule, 'Native animated module is not available');
|
||||
API.queueOperation(() =>
|
||||
NativeAnimatedModule.startAnimatingNode(
|
||||
animationId,
|
||||
nodeTag,
|
||||
config,
|
||||
endCallback,
|
||||
);
|
||||
}
|
||||
),
|
||||
);
|
||||
},
|
||||
stopAnimation: function (animationId: number) {
|
||||
invariant(nativeOps, 'Native animated module is not available');
|
||||
API.queueOperation(nativeOps.stopAnimation, animationId);
|
||||
invariant(NativeAnimatedModule, 'Native animated module is not available');
|
||||
API.queueOperation(() => NativeAnimatedModule.stopAnimation(animationId));
|
||||
},
|
||||
setAnimatedNodeValue: function (nodeTag: number, value: number): void {
|
||||
invariant(nativeOps, 'Native animated module is not available');
|
||||
API.queueOperation(nativeOps.setAnimatedNodeValue, nodeTag, value);
|
||||
invariant(NativeAnimatedModule, 'Native animated module is not available');
|
||||
API.queueOperation(() =>
|
||||
NativeAnimatedModule.setAnimatedNodeValue(nodeTag, value),
|
||||
);
|
||||
},
|
||||
setAnimatedNodeOffset: function (nodeTag: number, offset: number): void {
|
||||
invariant(nativeOps, 'Native animated module is not available');
|
||||
API.queueOperation(nativeOps.setAnimatedNodeOffset, nodeTag, offset);
|
||||
invariant(NativeAnimatedModule, 'Native animated module is not available');
|
||||
API.queueOperation(() =>
|
||||
NativeAnimatedModule.setAnimatedNodeOffset(nodeTag, offset),
|
||||
);
|
||||
},
|
||||
flattenAnimatedNodeOffset: function (nodeTag: number): void {
|
||||
invariant(nativeOps, 'Native animated module is not available');
|
||||
API.queueOperation(nativeOps.flattenAnimatedNodeOffset, nodeTag);
|
||||
invariant(NativeAnimatedModule, 'Native animated module is not available');
|
||||
API.queueOperation(() =>
|
||||
NativeAnimatedModule.flattenAnimatedNodeOffset(nodeTag),
|
||||
);
|
||||
},
|
||||
extractAnimatedNodeOffset: function (nodeTag: number): void {
|
||||
invariant(nativeOps, 'Native animated module is not available');
|
||||
API.queueOperation(nativeOps.extractAnimatedNodeOffset, nodeTag);
|
||||
invariant(NativeAnimatedModule, 'Native animated module is not available');
|
||||
API.queueOperation(() =>
|
||||
NativeAnimatedModule.extractAnimatedNodeOffset(nodeTag),
|
||||
);
|
||||
},
|
||||
connectAnimatedNodeToView: function (nodeTag: number, viewTag: number): void {
|
||||
invariant(nativeOps, 'Native animated module is not available');
|
||||
API.queueOperation(nativeOps.connectAnimatedNodeToView, nodeTag, viewTag);
|
||||
invariant(NativeAnimatedModule, 'Native animated module is not available');
|
||||
API.queueOperation(() =>
|
||||
NativeAnimatedModule.connectAnimatedNodeToView(nodeTag, viewTag),
|
||||
);
|
||||
},
|
||||
disconnectAnimatedNodeFromView: function (
|
||||
nodeTag: number,
|
||||
viewTag: number,
|
||||
): void {
|
||||
invariant(nativeOps, 'Native animated module is not available');
|
||||
API.queueOperation(
|
||||
nativeOps.disconnectAnimatedNodeFromView,
|
||||
nodeTag,
|
||||
viewTag,
|
||||
invariant(NativeAnimatedModule, 'Native animated module is not available');
|
||||
API.queueOperation(() =>
|
||||
NativeAnimatedModule.disconnectAnimatedNodeFromView(nodeTag, viewTag),
|
||||
);
|
||||
},
|
||||
restoreDefaultValues: function (nodeTag: number): void {
|
||||
invariant(nativeOps, 'Native animated module is not available');
|
||||
invariant(NativeAnimatedModule, 'Native animated module is not available');
|
||||
// Backwards compat with older native runtimes, can be removed later.
|
||||
if (nativeOps.restoreDefaultValues != null) {
|
||||
API.queueOperation(nativeOps.restoreDefaultValues, nodeTag);
|
||||
if (NativeAnimatedModule.restoreDefaultValues != null) {
|
||||
API.queueOperation(() =>
|
||||
NativeAnimatedModule.restoreDefaultValues(nodeTag),
|
||||
);
|
||||
}
|
||||
},
|
||||
dropAnimatedNode: function (tag: number): void {
|
||||
invariant(nativeOps, 'Native animated module is not available');
|
||||
API.queueOperation(nativeOps.dropAnimatedNode, tag);
|
||||
invariant(NativeAnimatedModule, 'Native animated module is not available');
|
||||
API.queueOperation(() => NativeAnimatedModule.dropAnimatedNode(tag));
|
||||
},
|
||||
addAnimatedEventToView: function (
|
||||
viewTag: number,
|
||||
eventName: string,
|
||||
eventMapping: EventMapping,
|
||||
) {
|
||||
invariant(nativeOps, 'Native animated module is not available');
|
||||
API.queueOperation(
|
||||
nativeOps.addAnimatedEventToView,
|
||||
viewTag,
|
||||
eventName,
|
||||
eventMapping,
|
||||
invariant(NativeAnimatedModule, 'Native animated module is not available');
|
||||
API.queueOperation(() =>
|
||||
NativeAnimatedModule.addAnimatedEventToView(
|
||||
viewTag,
|
||||
eventName,
|
||||
eventMapping,
|
||||
),
|
||||
);
|
||||
},
|
||||
removeAnimatedEventFromView(
|
||||
@@ -316,77 +208,36 @@ const API = {
|
||||
eventName: string,
|
||||
animatedNodeTag: number,
|
||||
) {
|
||||
invariant(nativeOps, 'Native animated module is not available');
|
||||
API.queueOperation(
|
||||
nativeOps.removeAnimatedEventFromView,
|
||||
viewTag,
|
||||
eventName,
|
||||
animatedNodeTag,
|
||||
invariant(NativeAnimatedModule, 'Native animated module is not available');
|
||||
API.queueOperation(() =>
|
||||
NativeAnimatedModule.removeAnimatedEventFromView(
|
||||
viewTag,
|
||||
eventName,
|
||||
animatedNodeTag,
|
||||
),
|
||||
);
|
||||
},
|
||||
};
|
||||
|
||||
function setupGlobalEventEmitterListeners() {
|
||||
globalEventEmitterGetValueListener = RCTDeviceEventEmitter.addListener(
|
||||
'onNativeAnimatedModuleGetValue',
|
||||
function (params) {
|
||||
const {tag} = params;
|
||||
const callback = eventListenerGetValueCallbacks[tag];
|
||||
if (!callback) {
|
||||
return;
|
||||
}
|
||||
callback(params.value);
|
||||
delete eventListenerGetValueCallbacks[tag];
|
||||
},
|
||||
);
|
||||
globalEventEmitterAnimationFinishedListener =
|
||||
RCTDeviceEventEmitter.addListener(
|
||||
'onNativeAnimatedModuleAnimationFinished',
|
||||
function (params) {
|
||||
const {animationId} = params;
|
||||
const callback = eventListenerAnimationFinishedCallbacks[animationId];
|
||||
if (!callback) {
|
||||
return;
|
||||
}
|
||||
callback(params);
|
||||
delete eventListenerAnimationFinishedCallbacks[animationId];
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Styles allowed by the native animated implementation.
|
||||
*
|
||||
* In general native animated implementation should support any numeric or color property that
|
||||
* doesn't need to be updated through the shadow view hierarchy (all non-layout properties).
|
||||
* In general native animated implementation should support any numeric property that doesn't need
|
||||
* to be updated through the shadow view hierarchy (all non-layout properties).
|
||||
*/
|
||||
const SUPPORTED_COLOR_STYLES = {
|
||||
backgroundColor: true,
|
||||
borderBottomColor: true,
|
||||
borderColor: true,
|
||||
borderEndColor: true,
|
||||
borderLeftColor: true,
|
||||
borderRightColor: true,
|
||||
borderStartColor: true,
|
||||
borderTopColor: true,
|
||||
color: true,
|
||||
tintColor: true,
|
||||
};
|
||||
|
||||
const SUPPORTED_STYLES = {
|
||||
...SUPPORTED_COLOR_STYLES,
|
||||
opacity: true,
|
||||
transform: true,
|
||||
borderRadius: true,
|
||||
borderBottomEndRadius: true,
|
||||
borderBottomLeftRadius: true,
|
||||
borderBottomRightRadius: true,
|
||||
borderBottomStartRadius: true,
|
||||
borderRadius: true,
|
||||
borderTopEndRadius: true,
|
||||
borderTopLeftRadius: true,
|
||||
borderTopRightRadius: true,
|
||||
borderTopStartRadius: true,
|
||||
elevation: true,
|
||||
opacity: true,
|
||||
transform: true,
|
||||
zIndex: true,
|
||||
/* ios styles */
|
||||
shadowOpacity: true,
|
||||
@@ -431,22 +282,6 @@ function addWhitelistedInterpolationParam(param: string): void {
|
||||
SUPPORTED_INTERPOLATION_PARAMS[param] = true;
|
||||
}
|
||||
|
||||
function isSupportedColorStyleProp(prop: string): boolean {
|
||||
return SUPPORTED_COLOR_STYLES.hasOwnProperty(prop);
|
||||
}
|
||||
|
||||
function isSupportedStyleProp(prop: string): boolean {
|
||||
return SUPPORTED_STYLES.hasOwnProperty(prop);
|
||||
}
|
||||
|
||||
function isSupportedTransformProp(prop: string): boolean {
|
||||
return SUPPORTED_TRANSFORMS.hasOwnProperty(prop);
|
||||
}
|
||||
|
||||
function isSupportedInterpolationParam(param: string): boolean {
|
||||
return SUPPORTED_INTERPOLATION_PARAMS.hasOwnProperty(param);
|
||||
}
|
||||
|
||||
function validateTransform(
|
||||
configs: Array<
|
||||
| {
|
||||
@@ -464,7 +299,7 @@ function validateTransform(
|
||||
>,
|
||||
): void {
|
||||
configs.forEach(config => {
|
||||
if (!isSupportedTransformProp(config.property)) {
|
||||
if (!SUPPORTED_TRANSFORMS.hasOwnProperty(config.property)) {
|
||||
throw new Error(
|
||||
`Property '${config.property}' is not supported by native animated module`,
|
||||
);
|
||||
@@ -474,7 +309,7 @@ function validateTransform(
|
||||
|
||||
function validateStyles(styles: {[key: string]: ?number, ...}): void {
|
||||
for (const key in styles) {
|
||||
if (!isSupportedStyleProp(key)) {
|
||||
if (!SUPPORTED_STYLES.hasOwnProperty(key)) {
|
||||
throw new Error(
|
||||
`Style property '${key}' is not supported by native animated module`,
|
||||
);
|
||||
@@ -482,11 +317,9 @@ function validateStyles(styles: {[key: string]: ?number, ...}): void {
|
||||
}
|
||||
}
|
||||
|
||||
function validateInterpolation<OutputT: number | string>(
|
||||
config: InterpolationConfigType<OutputT>,
|
||||
): void {
|
||||
function validateInterpolation(config: InterpolationConfigType): void {
|
||||
for (const key in config) {
|
||||
if (!isSupportedInterpolationParam(key)) {
|
||||
if (!SUPPORTED_INTERPOLATION_PARAMS.hasOwnProperty(key)) {
|
||||
throw new Error(
|
||||
`Interpolation property '${key}' is not supported by native animated module`,
|
||||
);
|
||||
@@ -509,7 +342,7 @@ function assertNativeAnimatedModule(): void {
|
||||
let _warnedMissingNativeAnimated = false;
|
||||
|
||||
function shouldUseNativeDriver(
|
||||
config: $ReadOnly<{...AnimationConfig, ...}> | EventConfig,
|
||||
config: {...AnimationConfig, ...} | EventConfig,
|
||||
): boolean {
|
||||
if (config.useNativeDriver == null) {
|
||||
console.warn(
|
||||
@@ -552,10 +385,6 @@ function transformDataType(value: number | string): number | string {
|
||||
|
||||
module.exports = {
|
||||
API,
|
||||
isSupportedColorStyleProp,
|
||||
isSupportedStyleProp,
|
||||
isSupportedTransformProp,
|
||||
isSupportedInterpolationParam,
|
||||
addWhitelistedStyleProp,
|
||||
addWhitelistedTransformProp,
|
||||
addWhitelistedInterpolationParam,
|
||||
|
||||
@@ -29,7 +29,6 @@ export interface Spec extends TurboModule {
|
||||
+startOperationBatch: () => void;
|
||||
+finishOperationBatch: () => void;
|
||||
+createAnimatedNode: (tag: number, config: AnimatedNodeConfig) => void;
|
||||
+updateAnimatedNodeConfig?: (tag: number, config: AnimatedNodeConfig) => void;
|
||||
+getValue: (tag: number, saveValueCallback: SaveValueCallback) => void;
|
||||
+startListeningToAnimatedNodeValue: (tag: number) => void;
|
||||
+stopListeningToAnimatedNodeValue: (tag: number) => void;
|
||||
@@ -64,9 +63,6 @@ export interface Spec extends TurboModule {
|
||||
// Events
|
||||
+addListener: (eventName: string) => void;
|
||||
+removeListeners: (count: number) => void;
|
||||
|
||||
// All of the above in a batched mode
|
||||
+queueAndExecuteBatchedOperations?: (operationsAndArgs: Array<any>) => void;
|
||||
}
|
||||
|
||||
export default (TurboModuleRegistry.get<Spec>('NativeAnimatedModule'): ?Spec);
|
||||
|
||||
@@ -29,7 +29,6 @@ export interface Spec extends TurboModule {
|
||||
+startOperationBatch: () => void;
|
||||
+finishOperationBatch: () => void;
|
||||
+createAnimatedNode: (tag: number, config: AnimatedNodeConfig) => void;
|
||||
+updateAnimatedNodeConfig?: (tag: number, config: AnimatedNodeConfig) => void;
|
||||
+getValue: (tag: number, saveValueCallback: SaveValueCallback) => void;
|
||||
+startListeningToAnimatedNodeValue: (tag: number) => void;
|
||||
+stopListeningToAnimatedNodeValue: (tag: number) => void;
|
||||
@@ -64,9 +63,6 @@ export interface Spec extends TurboModule {
|
||||
// Events
|
||||
+addListener: (eventName: string) => void;
|
||||
+removeListeners: (count: number) => void;
|
||||
|
||||
// All of the above in a batched mode
|
||||
+queueAndExecuteBatchedOperations?: (operationsAndArgs: Array<any>) => void;
|
||||
}
|
||||
|
||||
export default (TurboModuleRegistry.get<Spec>(
|
||||
|
||||
@@ -19,26 +19,21 @@
|
||||
|
||||
const bezier = require('../bezier');
|
||||
|
||||
const identity = function (x: number) {
|
||||
const identity = function (x) {
|
||||
return x;
|
||||
};
|
||||
|
||||
function assertClose(a: number, b: number, precision: number = 3) {
|
||||
function assertClose(a, b, precision = 3) {
|
||||
expect(a).toBeCloseTo(b, precision);
|
||||
}
|
||||
|
||||
function makeAssertCloseWithPrecision(precision: number) {
|
||||
return function (a: number, b: number) {
|
||||
function makeAssertCloseWithPrecision(precision) {
|
||||
return function (a, b) {
|
||||
assertClose(a, b, precision);
|
||||
};
|
||||
}
|
||||
|
||||
function allEquals(
|
||||
be1: (x: number) => number,
|
||||
be2: (x: number) => number,
|
||||
samples: number,
|
||||
assertion: $FlowFixMe,
|
||||
) {
|
||||
function allEquals(be1, be2, samples, assertion) {
|
||||
if (!assertion) {
|
||||
assertion = assertClose;
|
||||
}
|
||||
@@ -48,8 +43,8 @@ function allEquals(
|
||||
}
|
||||
}
|
||||
|
||||
function repeat(n: number) {
|
||||
return function (f: () => void) {
|
||||
function repeat(n) {
|
||||
return function (f) {
|
||||
for (let i = 0; i < n; ++i) {
|
||||
f();
|
||||
}
|
||||
@@ -104,7 +99,7 @@ describe('bezier', function () {
|
||||
d = Math.random();
|
||||
const easing = bezier(a, b, c, d);
|
||||
const projected = bezier(b, a, d, c);
|
||||
const composed = function (x: number) {
|
||||
const composed = function (x) {
|
||||
return projected(easing(x));
|
||||
};
|
||||
allEquals(identity, composed, 100, makeAssertCloseWithPrecision(2));
|
||||
@@ -140,7 +135,7 @@ describe('bezier', function () {
|
||||
c = 1 - a,
|
||||
d = 1 - b;
|
||||
const easing = bezier(a, b, c, d);
|
||||
const sym = function (x: number) {
|
||||
const sym = function (x) {
|
||||
return 1 - easing(1 - x);
|
||||
};
|
||||
allEquals(easing, sym, 100, makeAssertCloseWithPrecision(2));
|
||||
|
||||
@@ -44,7 +44,7 @@ export type SpringAnimationConfig = {
|
||||
...
|
||||
}
|
||||
| AnimatedColor
|
||||
| AnimatedInterpolation<number>,
|
||||
| AnimatedInterpolation,
|
||||
overshootClamping?: boolean,
|
||||
restDisplacementThreshold?: number,
|
||||
restSpeedThreshold?: number,
|
||||
@@ -67,7 +67,7 @@ export type SpringAnimationConfig = {
|
||||
|
||||
export type SpringAnimationConfigSingle = {
|
||||
...AnimationConfig,
|
||||
toValue: number,
|
||||
toValue: number | AnimatedValue | AnimatedInterpolation,
|
||||
overshootClamping?: boolean,
|
||||
restDisplacementThreshold?: number,
|
||||
restSpeedThreshold?: number,
|
||||
@@ -90,7 +90,7 @@ class SpringAnimation extends Animation {
|
||||
_startPosition: number;
|
||||
_lastPosition: number;
|
||||
_fromValue: number;
|
||||
_toValue: number;
|
||||
_toValue: any;
|
||||
_stiffness: number;
|
||||
_damping: number;
|
||||
_mass: number;
|
||||
|
||||
@@ -19,11 +19,10 @@ const {shouldUseNativeDriver} = require('../NativeAnimatedHelper');
|
||||
|
||||
import type {PlatformConfig} from '../AnimatedPlatformConfig';
|
||||
import type {AnimationConfig, EndCallback} from './Animation';
|
||||
import type {RgbaValue} from '../nodes/AnimatedColor';
|
||||
|
||||
import AnimatedColor from '../nodes/AnimatedColor';
|
||||
|
||||
export type TimingAnimationConfig = $ReadOnly<{
|
||||
export type TimingAnimationConfig = {
|
||||
...AnimationConfig,
|
||||
toValue:
|
||||
| number
|
||||
@@ -34,21 +33,27 @@ export type TimingAnimationConfig = $ReadOnly<{
|
||||
...
|
||||
}
|
||||
| AnimatedValueXY
|
||||
| RgbaValue
|
||||
| {
|
||||
r: number,
|
||||
g: number,
|
||||
b: number,
|
||||
a: number,
|
||||
...
|
||||
}
|
||||
| AnimatedColor
|
||||
| AnimatedInterpolation<number>,
|
||||
| AnimatedInterpolation,
|
||||
easing?: (value: number) => number,
|
||||
duration?: number,
|
||||
delay?: number,
|
||||
}>;
|
||||
};
|
||||
|
||||
export type TimingAnimationConfigSingle = $ReadOnly<{
|
||||
export type TimingAnimationConfigSingle = {
|
||||
...AnimationConfig,
|
||||
toValue: number,
|
||||
toValue: number | AnimatedValue | AnimatedInterpolation,
|
||||
easing?: (value: number) => number,
|
||||
duration?: number,
|
||||
delay?: number,
|
||||
}>;
|
||||
};
|
||||
|
||||
let _easeInOut;
|
||||
function easeInOut() {
|
||||
@@ -62,7 +67,7 @@ function easeInOut() {
|
||||
class TimingAnimation extends Animation {
|
||||
_startTime: number;
|
||||
_fromValue: number;
|
||||
_toValue: number;
|
||||
_toValue: any;
|
||||
_duration: number;
|
||||
_delay: number;
|
||||
_easing: (value: number) => number;
|
||||
|
||||
@@ -24,8 +24,8 @@ const setAndForwardRef = require('../Utilities/setAndForwardRef');
|
||||
let animatedComponentNextId = 1;
|
||||
|
||||
export type AnimatedComponentType<
|
||||
-Props: {+[string]: mixed, ...},
|
||||
+Instance = mixed,
|
||||
Props: {+[string]: mixed, ...},
|
||||
Instance,
|
||||
> = React.AbstractComponent<
|
||||
$ObjMap<
|
||||
Props &
|
||||
@@ -55,7 +55,6 @@ function createAnimatedComponent<Props: {+[string]: mixed, ...}, Instance>(
|
||||
_prevComponent: any;
|
||||
_propsAnimated: AnimatedProps;
|
||||
_eventDetachers: Array<Function> = [];
|
||||
_initialAnimatedProps: Object;
|
||||
|
||||
// Only to be used in this file, and only in Fabric.
|
||||
_animatedComponentId: string = `${animatedComponentNextId++}:animatedComponent`;
|
||||
@@ -200,21 +199,8 @@ function createAnimatedComponent<Props: {+[string]: mixed, ...}, Instance>(
|
||||
},
|
||||
});
|
||||
|
||||
render(): React.Node {
|
||||
// When rendering in Fabric and an AnimatedValue is used, we keep track of
|
||||
// the initial value of that Value, to avoid additional prop updates when
|
||||
// this component re-renders
|
||||
const initialPropsIfFabric = this._isFabric()
|
||||
? this._initialAnimatedProps
|
||||
: null;
|
||||
|
||||
const animatedProps =
|
||||
this._propsAnimated.__getValue(initialPropsIfFabric) || {};
|
||||
if (!this._initialAnimatedProps) {
|
||||
this._initialAnimatedProps = animatedProps;
|
||||
}
|
||||
|
||||
const {style = {}, ...props} = animatedProps;
|
||||
render() {
|
||||
const {style = {}, ...props} = this._propsAnimated.__getValue() || {};
|
||||
const {style: passthruStyle = {}, ...passthruProps} =
|
||||
this.props.passthroughAnimatedPropExplicitValues || {};
|
||||
const mergedStyle = {...style, ...passthruStyle};
|
||||
|
||||
@@ -38,9 +38,7 @@ class AnimatedAddition extends AnimatedWithChildren {
|
||||
return this._a.__getValue() + this._b.__getValue();
|
||||
}
|
||||
|
||||
interpolate<OutputT: number | string>(
|
||||
config: InterpolationConfigType<OutputT>,
|
||||
): AnimatedInterpolation<OutputT> {
|
||||
interpolate(config: InterpolationConfigType): AnimatedInterpolation {
|
||||
return new AnimatedInterpolation(this, config);
|
||||
}
|
||||
|
||||
|
||||
@@ -14,27 +14,18 @@ import AnimatedValue from './AnimatedValue';
|
||||
import AnimatedWithChildren from './AnimatedWithChildren';
|
||||
import normalizeColor from '../../StyleSheet/normalizeColor';
|
||||
import {processColorObject} from '../../StyleSheet/PlatformColorValueTypes';
|
||||
import NativeAnimatedHelper from '../NativeAnimatedHelper';
|
||||
|
||||
import type {PlatformConfig} from '../AnimatedPlatformConfig';
|
||||
import type {ColorValue} from '../../StyleSheet/StyleSheet';
|
||||
import type {NativeColorValue} from '../../StyleSheet/PlatformColorValueTypes';
|
||||
import type {ProcessedColorValue} from '../../StyleSheet/processColor';
|
||||
|
||||
export type AnimatedColorConfig = $ReadOnly<{
|
||||
useNativeDriver: boolean,
|
||||
}>;
|
||||
|
||||
type ColorListenerCallback = (value: ColorValue) => mixed;
|
||||
|
||||
export type RgbaValue = {
|
||||
type ColorListenerCallback = (value: string) => mixed;
|
||||
type RgbaValue = {
|
||||
+r: number,
|
||||
+g: number,
|
||||
+b: number,
|
||||
+a: number,
|
||||
...
|
||||
};
|
||||
|
||||
type RgbaAnimatedValue = {
|
||||
+r: AnimatedValue,
|
||||
+g: AnimatedValue,
|
||||
@@ -43,43 +34,30 @@ type RgbaAnimatedValue = {
|
||||
...
|
||||
};
|
||||
|
||||
const NativeAnimatedAPI = NativeAnimatedHelper.API;
|
||||
|
||||
const defaultColor: RgbaValue = {r: 0, g: 0, b: 0, a: 1.0};
|
||||
let _uniqueId = 1;
|
||||
|
||||
/* eslint no-bitwise: 0 */
|
||||
function processColor(
|
||||
color?: ?(ColorValue | RgbaValue),
|
||||
): ?(RgbaValue | NativeColorValue) {
|
||||
function processColor(color?: ?ColorValue): ?(RgbaValue | NativeColorValue) {
|
||||
if (color === undefined || color === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (isRgbaValue(color)) {
|
||||
// $FlowIgnore[incompatible-cast] - Type is verified above
|
||||
return (color: RgbaValue);
|
||||
}
|
||||
|
||||
let normalizedColor: ?ProcessedColorValue = normalizeColor(
|
||||
// $FlowIgnore[incompatible-cast] - Type is verified above
|
||||
(color: ColorValue),
|
||||
);
|
||||
let normalizedColor = normalizeColor(color);
|
||||
if (normalizedColor === undefined || normalizedColor === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (typeof normalizedColor === 'object') {
|
||||
const processedColorObj: ?NativeColorValue =
|
||||
processColorObject(normalizedColor);
|
||||
const processedColorObj = processColorObject(normalizedColor);
|
||||
if (processedColorObj != null) {
|
||||
return processedColorObj;
|
||||
}
|
||||
} else if (typeof normalizedColor === 'number') {
|
||||
const r: number = (normalizedColor & 0xff000000) >>> 24;
|
||||
const g: number = (normalizedColor & 0x00ff0000) >>> 16;
|
||||
const b: number = (normalizedColor & 0x0000ff00) >>> 8;
|
||||
const a: number = (normalizedColor & 0x000000ff) / 255;
|
||||
const r = (normalizedColor & 0xff000000) >>> 24;
|
||||
const g = (normalizedColor & 0x00ff0000) >>> 16;
|
||||
const b = (normalizedColor & 0x0000ff00) >>> 8;
|
||||
const a = (normalizedColor & 0x000000ff) / 255;
|
||||
|
||||
return {r, g, b, a};
|
||||
}
|
||||
@@ -112,7 +90,6 @@ export default class AnimatedColor extends AnimatedWithChildren {
|
||||
g: AnimatedValue;
|
||||
b: AnimatedValue;
|
||||
a: AnimatedValue;
|
||||
nativeColor: ?NativeColorValue;
|
||||
_listeners: {
|
||||
[key: string]: {
|
||||
r: string,
|
||||
@@ -122,15 +99,13 @@ export default class AnimatedColor extends AnimatedWithChildren {
|
||||
...
|
||||
},
|
||||
...
|
||||
} = {};
|
||||
};
|
||||
|
||||
constructor(
|
||||
valueIn?: ?(RgbaValue | RgbaAnimatedValue | ColorValue),
|
||||
config?: ?AnimatedColorConfig,
|
||||
) {
|
||||
constructor(valueIn?: ?(RgbaValue | RgbaAnimatedValue | ColorValue)) {
|
||||
super();
|
||||
let value: RgbaValue | RgbaAnimatedValue | ColorValue =
|
||||
valueIn ?? defaultColor;
|
||||
valueIn || defaultColor;
|
||||
|
||||
if (isRgbaAnimatedValue(value)) {
|
||||
// $FlowIgnore[incompatible-cast] - Type is verified above
|
||||
const rgbaAnimatedValue: RgbaAnimatedValue = (value: RgbaAnimatedValue);
|
||||
@@ -139,71 +114,32 @@ export default class AnimatedColor extends AnimatedWithChildren {
|
||||
this.b = rgbaAnimatedValue.b;
|
||||
this.a = rgbaAnimatedValue.a;
|
||||
} else {
|
||||
const processedColor: RgbaValue | NativeColorValue =
|
||||
// $FlowIgnore[incompatible-cast] - Type is verified above
|
||||
processColor((value: ColorValue | RgbaValue)) ?? defaultColor;
|
||||
let initColor: RgbaValue = defaultColor;
|
||||
if (isRgbaValue(processedColor)) {
|
||||
// $FlowIgnore[incompatible-cast] - Type is verified above
|
||||
initColor = (processedColor: RgbaValue);
|
||||
} else {
|
||||
// $FlowIgnore[incompatible-cast] - Type is verified above
|
||||
this.nativeColor = (processedColor: NativeColorValue);
|
||||
// Handle potential parsable string color or platform color object
|
||||
if (!isRgbaValue(value)) {
|
||||
// $FlowIgnore[incompatible-cast] - Type is verified via conditionals
|
||||
value = processColor((value: ColorValue)) || {r: 0, g: 0, b: 0, a: 1.0};
|
||||
// TODO: support platform color
|
||||
}
|
||||
|
||||
this.r = new AnimatedValue(initColor.r);
|
||||
this.g = new AnimatedValue(initColor.g);
|
||||
this.b = new AnimatedValue(initColor.b);
|
||||
this.a = new AnimatedValue(initColor.a);
|
||||
}
|
||||
if (this.nativeColor || (config && config.useNativeDriver)) {
|
||||
this.__makeNative();
|
||||
// $FlowIgnore[incompatible-cast] - Type is verified via conditionals
|
||||
const rgbaValue: RgbaValue = (value: RgbaValue);
|
||||
this.r = new AnimatedValue(rgbaValue.r);
|
||||
this.g = new AnimatedValue(rgbaValue.g);
|
||||
this.b = new AnimatedValue(rgbaValue.b);
|
||||
this.a = new AnimatedValue(rgbaValue.a);
|
||||
}
|
||||
this._listeners = {};
|
||||
}
|
||||
|
||||
/**
|
||||
* Directly set the value. This will stop any animations running on the value
|
||||
* and update all the bound properties.
|
||||
*/
|
||||
setValue(value: RgbaValue | ColorValue): void {
|
||||
let shouldUpdateNodeConfig = false;
|
||||
if (this.__isNative) {
|
||||
const nativeTag = this.__getNativeTag();
|
||||
NativeAnimatedAPI.setWaitingForIdentifier(nativeTag.toString());
|
||||
}
|
||||
|
||||
const processedColor: RgbaValue | NativeColorValue =
|
||||
processColor(value) ?? defaultColor;
|
||||
if (isRgbaValue(processedColor)) {
|
||||
// $FlowIgnore[incompatible-type] - Type is verified above
|
||||
const rgbaValue: RgbaValue = processedColor;
|
||||
this.r.setValue(rgbaValue.r);
|
||||
this.g.setValue(rgbaValue.g);
|
||||
this.b.setValue(rgbaValue.b);
|
||||
this.a.setValue(rgbaValue.a);
|
||||
if (this.nativeColor != null) {
|
||||
this.nativeColor = null;
|
||||
shouldUpdateNodeConfig = true;
|
||||
}
|
||||
} else {
|
||||
// $FlowIgnore[incompatible-type] - Type is verified above
|
||||
const nativeColor: NativeColorValue = processedColor;
|
||||
if (this.nativeColor !== nativeColor) {
|
||||
this.nativeColor = nativeColor;
|
||||
shouldUpdateNodeConfig = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (this.__isNative) {
|
||||
const nativeTag = this.__getNativeTag();
|
||||
if (shouldUpdateNodeConfig) {
|
||||
NativeAnimatedAPI.updateAnimatedNodeConfig(
|
||||
nativeTag,
|
||||
this.__getNativeConfig(),
|
||||
);
|
||||
}
|
||||
NativeAnimatedAPI.unsetWaitingForIdentifier(nativeTag.toString());
|
||||
}
|
||||
setValue(value: {r: number, g: number, b: number, a: number, ...}): void {
|
||||
this.r.setValue(value.r);
|
||||
this.g.setValue(value.g);
|
||||
this.b.setValue(value.b);
|
||||
this.a.setValue(value.a);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -211,7 +147,7 @@ export default class AnimatedColor extends AnimatedWithChildren {
|
||||
* via `setValue`, an animation, or `Animated.event`. Useful for compensating
|
||||
* things like the start of a pan gesture.
|
||||
*/
|
||||
setOffset(offset: RgbaValue): void {
|
||||
setOffset(offset: {r: number, g: number, b: number, a: number, ...}): void {
|
||||
this.r.setOffset(offset.r);
|
||||
this.g.setOffset(offset.g);
|
||||
this.b.setOffset(offset.b);
|
||||
@@ -249,7 +185,7 @@ export default class AnimatedColor extends AnimatedWithChildren {
|
||||
*/
|
||||
addListener(callback: ColorListenerCallback): string {
|
||||
const id = String(_uniqueId++);
|
||||
const jointCallback = ({value: number}: any) => {
|
||||
const jointCallback = ({value: number}) => {
|
||||
callback(this.__getValue());
|
||||
};
|
||||
this._listeners[id] = {
|
||||
@@ -289,7 +225,7 @@ export default class AnimatedColor extends AnimatedWithChildren {
|
||||
* final value after stopping the animation, which is useful for updating
|
||||
* state to match the animation position with layout.
|
||||
*/
|
||||
stopAnimation(callback?: ColorListenerCallback): void {
|
||||
stopAnimation(callback?: (value: string) => void): void {
|
||||
this.r.stopAnimation();
|
||||
this.g.stopAnimation();
|
||||
this.b.stopAnimation();
|
||||
@@ -300,7 +236,7 @@ export default class AnimatedColor extends AnimatedWithChildren {
|
||||
/**
|
||||
* Stops any animation and resets the value to its original.
|
||||
*/
|
||||
resetAnimation(callback?: ColorListenerCallback): void {
|
||||
resetAnimation(callback?: (value: string) => void): void {
|
||||
this.r.resetAnimation();
|
||||
this.g.resetAnimation();
|
||||
this.b.resetAnimation();
|
||||
@@ -308,12 +244,8 @@ export default class AnimatedColor extends AnimatedWithChildren {
|
||||
callback && callback(this.__getValue());
|
||||
}
|
||||
|
||||
__getValue(): ColorValue {
|
||||
if (this.nativeColor != null) {
|
||||
return this.nativeColor;
|
||||
} else {
|
||||
return `rgba(${this.r.__getValue()}, ${this.g.__getValue()}, ${this.b.__getValue()}, ${this.a.__getValue()})`;
|
||||
}
|
||||
__getValue(): string {
|
||||
return `rgba(${this.r.__getValue()}, ${this.g.__getValue()}, ${this.b.__getValue()}, ${this.a.__getValue()})`;
|
||||
}
|
||||
|
||||
__attach(): void {
|
||||
@@ -331,23 +263,4 @@ export default class AnimatedColor extends AnimatedWithChildren {
|
||||
this.a.__removeChild(this);
|
||||
super.__detach();
|
||||
}
|
||||
|
||||
__makeNative(platformConfig: ?PlatformConfig) {
|
||||
this.r.__makeNative(platformConfig);
|
||||
this.g.__makeNative(platformConfig);
|
||||
this.b.__makeNative(platformConfig);
|
||||
this.a.__makeNative(platformConfig);
|
||||
super.__makeNative(platformConfig);
|
||||
}
|
||||
|
||||
__getNativeConfig(): {...} {
|
||||
return {
|
||||
type: 'color',
|
||||
r: this.r.__getNativeTag(),
|
||||
g: this.g.__getNativeTag(),
|
||||
b: this.b.__getNativeTag(),
|
||||
a: this.a.__getNativeTag(),
|
||||
nativeColor: this.nativeColor,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,9 +38,7 @@ class AnimatedDiffClamp extends AnimatedWithChildren {
|
||||
super.__makeNative(platformConfig);
|
||||
}
|
||||
|
||||
interpolate<OutputT: number | string>(
|
||||
config: InterpolationConfigType<OutputT>,
|
||||
): AnimatedInterpolation<OutputT> {
|
||||
interpolate(config: InterpolationConfigType): AnimatedInterpolation {
|
||||
return new AnimatedInterpolation(this, config);
|
||||
}
|
||||
|
||||
|
||||
@@ -54,9 +54,7 @@ class AnimatedDivision extends AnimatedWithChildren {
|
||||
return a / b;
|
||||
}
|
||||
|
||||
interpolate<OutputT: number | string>(
|
||||
config: InterpolationConfigType<OutputT>,
|
||||
): AnimatedInterpolation<OutputT> {
|
||||
interpolate(config: InterpolationConfigType): AnimatedInterpolation {
|
||||
return new AnimatedInterpolation(this, config);
|
||||
}
|
||||
|
||||
|
||||
@@ -23,14 +23,14 @@ import type {PlatformConfig} from '../AnimatedPlatformConfig';
|
||||
|
||||
type ExtrapolateType = 'extend' | 'identity' | 'clamp';
|
||||
|
||||
export type InterpolationConfigType<OutputT: number | string> = $ReadOnly<{
|
||||
export type InterpolationConfigType = {
|
||||
inputRange: $ReadOnlyArray<number>,
|
||||
outputRange: $ReadOnlyArray<OutputT>,
|
||||
outputRange: $ReadOnlyArray<number> | $ReadOnlyArray<string>,
|
||||
easing?: (input: number) => number,
|
||||
extrapolate?: ExtrapolateType,
|
||||
extrapolateLeft?: ExtrapolateType,
|
||||
extrapolateRight?: ExtrapolateType,
|
||||
}>;
|
||||
};
|
||||
|
||||
const linear = (t: number) => t;
|
||||
|
||||
@@ -38,31 +38,28 @@ const linear = (t: number) => t;
|
||||
* Very handy helper to map input ranges to output ranges with an easing
|
||||
* function and custom behavior outside of the ranges.
|
||||
*/
|
||||
function createInterpolation<OutputT: number | string>(
|
||||
config: InterpolationConfigType<OutputT>,
|
||||
): (input: number) => OutputT {
|
||||
function createInterpolation(
|
||||
config: InterpolationConfigType,
|
||||
): (input: number) => number | string {
|
||||
if (config.outputRange && typeof config.outputRange[0] === 'string') {
|
||||
return (createInterpolationFromStringOutputRange((config: any)): any);
|
||||
return createInterpolationFromStringOutputRange(config);
|
||||
}
|
||||
|
||||
const outputRange: $ReadOnlyArray<number> = (config.outputRange: any);
|
||||
const outputRange: Array<number> = (config.outputRange: any);
|
||||
checkInfiniteRange('outputRange', outputRange);
|
||||
|
||||
const inputRange = config.inputRange;
|
||||
checkInfiniteRange('inputRange', inputRange);
|
||||
checkValidInputRange(inputRange);
|
||||
|
||||
if (__DEV__) {
|
||||
checkInfiniteRange('outputRange', outputRange);
|
||||
checkInfiniteRange('inputRange', inputRange);
|
||||
checkValidInputRange(inputRange);
|
||||
|
||||
invariant(
|
||||
inputRange.length === outputRange.length,
|
||||
'inputRange (' +
|
||||
inputRange.length +
|
||||
') and outputRange (' +
|
||||
outputRange.length +
|
||||
') must have the same length',
|
||||
);
|
||||
}
|
||||
invariant(
|
||||
inputRange.length === outputRange.length,
|
||||
'inputRange (' +
|
||||
inputRange.length +
|
||||
') and outputRange (' +
|
||||
outputRange.length +
|
||||
') must have the same length',
|
||||
);
|
||||
|
||||
const easing = config.easing || linear;
|
||||
|
||||
@@ -87,7 +84,7 @@ function createInterpolation<OutputT: number | string>(
|
||||
);
|
||||
|
||||
const range = findRange(input, inputRange);
|
||||
return (interpolate(
|
||||
return interpolate(
|
||||
input,
|
||||
inputRange[range],
|
||||
inputRange[range + 1],
|
||||
@@ -96,7 +93,7 @@ function createInterpolation<OutputT: number | string>(
|
||||
easing,
|
||||
extrapolateLeft,
|
||||
extrapolateRight,
|
||||
): any);
|
||||
);
|
||||
};
|
||||
}
|
||||
|
||||
@@ -195,7 +192,7 @@ const stringShapeRegex = /[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?/g;
|
||||
* -45deg // values with units
|
||||
*/
|
||||
function createInterpolationFromStringOutputRange(
|
||||
config: InterpolationConfigType<string>,
|
||||
config: InterpolationConfigType,
|
||||
): (input: number) => string {
|
||||
let outputRange: Array<string> = (config.outputRange: any);
|
||||
invariant(outputRange.length >= 2, 'Bad output range');
|
||||
@@ -279,10 +276,16 @@ function findRange(input: number, inputRange: $ReadOnlyArray<number>) {
|
||||
|
||||
function checkValidInputRange(arr: $ReadOnlyArray<number>) {
|
||||
invariant(arr.length >= 2, 'inputRange must have at least 2 elements');
|
||||
const message =
|
||||
'inputRange must be monotonically non-decreasing ' + String(arr);
|
||||
for (let i = 1; i < arr.length; ++i) {
|
||||
invariant(arr[i] >= arr[i - 1], message);
|
||||
invariant(
|
||||
arr[i] >= arr[i - 1],
|
||||
/* $FlowFixMe[incompatible-type] (>=0.13.0) - In the addition expression
|
||||
* below this comment, one or both of the operands may be something that
|
||||
* doesn't cleanly convert to a string, like undefined, null, and object,
|
||||
* etc. If you really mean this implicit string conversion, you can do
|
||||
* something like String(myThing) */
|
||||
'inputRange must be monotonically non-decreasing ' + arr,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -299,19 +302,17 @@ function checkInfiniteRange(name: string, arr: $ReadOnlyArray<number>) {
|
||||
);
|
||||
}
|
||||
|
||||
class AnimatedInterpolation<
|
||||
OutputT: number | string,
|
||||
> extends AnimatedWithChildren {
|
||||
class AnimatedInterpolation extends AnimatedWithChildren {
|
||||
// Export for testing.
|
||||
static __createInterpolation: (
|
||||
config: InterpolationConfigType<OutputT>,
|
||||
) => (input: number) => OutputT = createInterpolation;
|
||||
config: InterpolationConfigType,
|
||||
) => (input: number) => number | string = createInterpolation;
|
||||
|
||||
_parent: AnimatedNode;
|
||||
_config: InterpolationConfigType<OutputT>;
|
||||
_interpolation: (input: number) => OutputT;
|
||||
_config: InterpolationConfigType;
|
||||
_interpolation: (input: number) => number | string;
|
||||
|
||||
constructor(parent: AnimatedNode, config: InterpolationConfigType<OutputT>) {
|
||||
constructor(parent: AnimatedNode, config: InterpolationConfigType) {
|
||||
super();
|
||||
this._parent = parent;
|
||||
this._config = config;
|
||||
@@ -332,9 +333,7 @@ class AnimatedInterpolation<
|
||||
return this._interpolation(parentValue);
|
||||
}
|
||||
|
||||
interpolate<NewOutputT: number | string>(
|
||||
config: InterpolationConfigType<NewOutputT>,
|
||||
): AnimatedInterpolation<NewOutputT> {
|
||||
interpolate(config: InterpolationConfigType): AnimatedInterpolation {
|
||||
return new AnimatedInterpolation(this, config);
|
||||
}
|
||||
|
||||
@@ -347,7 +346,7 @@ class AnimatedInterpolation<
|
||||
super.__detach();
|
||||
}
|
||||
|
||||
__transformDataType(range: $ReadOnlyArray<OutputT>): Array<any> {
|
||||
__transformDataType(range: Array<any>): Array<any> {
|
||||
return range.map(NativeAnimatedHelper.transformDataType);
|
||||
}
|
||||
|
||||
@@ -359,6 +358,9 @@ class AnimatedInterpolation<
|
||||
return {
|
||||
inputRange: this._config.inputRange,
|
||||
// Only the `outputRange` can contain strings so we don't need to transform `inputRange` here
|
||||
/* $FlowFixMe[incompatible-call] (>=0.38.0) - Flow error detected during
|
||||
* the deployment of v0.38.0. To see the error, remove this comment and
|
||||
* run flow */
|
||||
outputRange: this.__transformDataType(this._config.outputRange),
|
||||
extrapolateLeft:
|
||||
this._config.extrapolateLeft || this._config.extrapolate || 'extend',
|
||||
|
||||
@@ -38,9 +38,7 @@ class AnimatedModulo extends AnimatedWithChildren {
|
||||
);
|
||||
}
|
||||
|
||||
interpolate<OutputT: number | string>(
|
||||
config: InterpolationConfigType<OutputT>,
|
||||
): AnimatedInterpolation<OutputT> {
|
||||
interpolate(config: InterpolationConfigType): AnimatedInterpolation {
|
||||
return new AnimatedInterpolation(this, config);
|
||||
}
|
||||
|
||||
|
||||
@@ -38,11 +38,10 @@ class AnimatedMultiplication extends AnimatedWithChildren {
|
||||
return this._a.__getValue() * this._b.__getValue();
|
||||
}
|
||||
|
||||
interpolate<OutputT: number | string>(
|
||||
config: InterpolationConfigType<OutputT>,
|
||||
): AnimatedInterpolation<OutputT> {
|
||||
interpolate(config: InterpolationConfigType): AnimatedInterpolation {
|
||||
return new AnimatedInterpolation(this, config);
|
||||
}
|
||||
|
||||
__attach(): void {
|
||||
this._a.__addChild(this);
|
||||
this._b.__addChild(this);
|
||||
|
||||
@@ -130,12 +130,12 @@ class AnimatedNode {
|
||||
if (data.tag !== this.__getNativeTag()) {
|
||||
return;
|
||||
}
|
||||
this.__onAnimatedValueUpdateReceived(data.value);
|
||||
this._onAnimatedValueUpdateReceived(data.value);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
__onAnimatedValueUpdateReceived(value: number) {
|
||||
_onAnimatedValueUpdateReceived(value: number) {
|
||||
this.__callListeners(value);
|
||||
}
|
||||
|
||||
|
||||
@@ -10,15 +10,16 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
import type {PlatformConfig} from '../AnimatedPlatformConfig';
|
||||
|
||||
const ReactNative = require('../../Renderer/shims/ReactNative');
|
||||
const {AnimatedEvent} = require('../AnimatedEvent');
|
||||
const NativeAnimatedHelper = require('../NativeAnimatedHelper');
|
||||
const AnimatedNode = require('./AnimatedNode');
|
||||
const AnimatedStyle = require('./AnimatedStyle');
|
||||
const NativeAnimatedHelper = require('../NativeAnimatedHelper');
|
||||
const ReactNative = require('../../Renderer/shims/ReactNative');
|
||||
|
||||
const invariant = require('invariant');
|
||||
|
||||
import type {PlatformConfig} from '../AnimatedPlatformConfig';
|
||||
|
||||
class AnimatedProps extends AnimatedNode {
|
||||
_props: Object;
|
||||
_animatedView: any;
|
||||
@@ -36,21 +37,15 @@ class AnimatedProps extends AnimatedNode {
|
||||
this._callback = callback;
|
||||
}
|
||||
|
||||
__getValue(initialProps: ?Object): Object {
|
||||
const props: {[string]: any | ((...args: any) => void)} = {};
|
||||
__getValue(): Object {
|
||||
const props = {};
|
||||
for (const key in this._props) {
|
||||
const value = this._props[key];
|
||||
if (value instanceof AnimatedNode) {
|
||||
// During initial render we want to use the initial value of both natively and non-natively
|
||||
// driven nodes. On subsequent renders, we cannot use the value of natively driven nodes
|
||||
// as they may not be up to date, so we use the initial value to ensure that values of
|
||||
// native animated nodes do not impact rerenders.
|
||||
if (value instanceof AnimatedStyle) {
|
||||
props[key] = value.__getValue(initialProps?.style);
|
||||
} else if (!initialProps || !value.__isNative) {
|
||||
if (!value.__isNative || value instanceof AnimatedStyle) {
|
||||
// We cannot use value of natively driven nodes this way as the value we have access from
|
||||
// JS may not be up to date.
|
||||
props[key] = value.__getValue();
|
||||
} else if (initialProps.hasOwnProperty(key)) {
|
||||
props[key] = initialProps[key];
|
||||
}
|
||||
} else if (value instanceof AnimatedEvent) {
|
||||
props[key] = value.__getHandler();
|
||||
@@ -58,12 +53,11 @@ class AnimatedProps extends AnimatedNode {
|
||||
props[key] = value;
|
||||
}
|
||||
}
|
||||
|
||||
return props;
|
||||
}
|
||||
|
||||
__getAnimatedValue(): Object {
|
||||
const props: {[string]: any} = {};
|
||||
const props = {};
|
||||
for (const key in this._props) {
|
||||
const value = this._props[key];
|
||||
if (value instanceof AnimatedNode) {
|
||||
@@ -171,7 +165,7 @@ class AnimatedProps extends AnimatedNode {
|
||||
}
|
||||
|
||||
__getNativeConfig(): Object {
|
||||
const propsConfig: {[string]: number} = {};
|
||||
const propsConfig = {};
|
||||
for (const propKey in this._props) {
|
||||
const value = this._props[propKey];
|
||||
if (value instanceof AnimatedNode) {
|
||||
|
||||
@@ -10,20 +10,21 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
import type {PlatformConfig} from '../AnimatedPlatformConfig';
|
||||
|
||||
const flattenStyle = require('../../StyleSheet/flattenStyle');
|
||||
const NativeAnimatedHelper = require('../NativeAnimatedHelper');
|
||||
const AnimatedNode = require('./AnimatedNode');
|
||||
const AnimatedTransform = require('./AnimatedTransform');
|
||||
const AnimatedWithChildren = require('./AnimatedWithChildren');
|
||||
const NativeAnimatedHelper = require('../NativeAnimatedHelper');
|
||||
|
||||
const flattenStyle = require('../../StyleSheet/flattenStyle');
|
||||
|
||||
import type {PlatformConfig} from '../AnimatedPlatformConfig';
|
||||
|
||||
class AnimatedStyle extends AnimatedWithChildren {
|
||||
_style: Object;
|
||||
|
||||
constructor(style: any) {
|
||||
super();
|
||||
style = flattenStyle(style) || ({}: {[string]: any});
|
||||
style = flattenStyle(style) || {};
|
||||
if (style.transform) {
|
||||
style = {
|
||||
...style,
|
||||
@@ -34,23 +35,19 @@ class AnimatedStyle extends AnimatedWithChildren {
|
||||
}
|
||||
|
||||
// Recursively get values for nested styles (like iOS's shadowOffset)
|
||||
_walkStyleAndGetValues(style: any, initialStyle: ?Object) {
|
||||
const updatedStyle: {[string]: any | {...}} = {};
|
||||
_walkStyleAndGetValues(style: any) {
|
||||
const updatedStyle = {};
|
||||
for (const key in style) {
|
||||
const value = style[key];
|
||||
if (value instanceof AnimatedNode) {
|
||||
// During initial render we want to use the initial value of both natively and non-natively
|
||||
// driven nodes. On subsequent renders, we cannot use the value of natively driven nodes
|
||||
// as they may not be up to date, so we use the initial value to ensure that values of
|
||||
// native animated nodes do not impact rerenders.
|
||||
if (!initialStyle || !value.__isNative) {
|
||||
if (!value.__isNative) {
|
||||
// We cannot use value of natively driven nodes this way as the value we have access from
|
||||
// JS may not be up to date.
|
||||
updatedStyle[key] = value.__getValue();
|
||||
} else if (initialStyle.hasOwnProperty(key)) {
|
||||
updatedStyle[key] = initialStyle[key];
|
||||
}
|
||||
} else if (value && !Array.isArray(value) && typeof value === 'object') {
|
||||
// Support animating nested values (for example: shadowOffset.height)
|
||||
updatedStyle[key] = this._walkStyleAndGetValues(value, initialStyle);
|
||||
updatedStyle[key] = this._walkStyleAndGetValues(value);
|
||||
} else {
|
||||
updatedStyle[key] = value;
|
||||
}
|
||||
@@ -58,13 +55,13 @@ class AnimatedStyle extends AnimatedWithChildren {
|
||||
return updatedStyle;
|
||||
}
|
||||
|
||||
__getValue(initialStyle: ?Object): Object {
|
||||
return this._walkStyleAndGetValues(this._style, initialStyle);
|
||||
__getValue(): Object {
|
||||
return this._walkStyleAndGetValues(this._style);
|
||||
}
|
||||
|
||||
// Recursively get animated values for nested styles (like iOS's shadowOffset)
|
||||
_walkStyleAndGetAnimatedValues(style: any) {
|
||||
const updatedStyle: {[string]: any | {...}} = {};
|
||||
const updatedStyle = {};
|
||||
for (const key in style) {
|
||||
const value = style[key];
|
||||
if (value instanceof AnimatedNode) {
|
||||
@@ -111,7 +108,7 @@ class AnimatedStyle extends AnimatedWithChildren {
|
||||
}
|
||||
|
||||
__getNativeConfig(): Object {
|
||||
const styleConfig: {[string]: ?number} = {};
|
||||
const styleConfig = {};
|
||||
for (const styleKey in this._style) {
|
||||
if (this._style[styleKey] instanceof AnimatedNode) {
|
||||
const style = this._style[styleKey];
|
||||
|
||||
@@ -38,9 +38,7 @@ class AnimatedSubtraction extends AnimatedWithChildren {
|
||||
return this._a.__getValue() - this._b.__getValue();
|
||||
}
|
||||
|
||||
interpolate<OutputT: number | string>(
|
||||
config: InterpolationConfigType<OutputT>,
|
||||
): AnimatedInterpolation<OutputT> {
|
||||
interpolate(config: InterpolationConfigType): AnimatedInterpolation {
|
||||
return new AnimatedInterpolation(this, config);
|
||||
}
|
||||
|
||||
|
||||
@@ -10,11 +10,11 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
import type {PlatformConfig} from '../AnimatedPlatformConfig';
|
||||
|
||||
const NativeAnimatedHelper = require('../NativeAnimatedHelper');
|
||||
const AnimatedNode = require('./AnimatedNode');
|
||||
const AnimatedWithChildren = require('./AnimatedWithChildren');
|
||||
const NativeAnimatedHelper = require('../NativeAnimatedHelper');
|
||||
|
||||
import type {PlatformConfig} from '../AnimatedPlatformConfig';
|
||||
|
||||
class AnimatedTransform extends AnimatedWithChildren {
|
||||
_transforms: $ReadOnlyArray<Object>;
|
||||
@@ -38,7 +38,7 @@ class AnimatedTransform extends AnimatedWithChildren {
|
||||
|
||||
__getValue(): $ReadOnlyArray<Object> {
|
||||
return this._transforms.map(transform => {
|
||||
const result: {[string]: any} = {};
|
||||
const result = {};
|
||||
for (const key in transform) {
|
||||
const value = transform[key];
|
||||
if (value instanceof AnimatedNode) {
|
||||
@@ -53,7 +53,7 @@ class AnimatedTransform extends AnimatedWithChildren {
|
||||
|
||||
__getAnimatedValue(): $ReadOnlyArray<Object> {
|
||||
return this._transforms.map(transform => {
|
||||
const result: {[string]: any} = {};
|
||||
const result = {};
|
||||
for (const key in transform) {
|
||||
const value = transform[key];
|
||||
if (value instanceof AnimatedNode) {
|
||||
|
||||
@@ -20,10 +20,6 @@ import type Animation, {EndCallback} from '../animations/Animation';
|
||||
import type {InterpolationConfigType} from './AnimatedInterpolation';
|
||||
import type AnimatedTracking from './AnimatedTracking';
|
||||
|
||||
export type AnimatedValueConfig = $ReadOnly<{
|
||||
useNativeDriver: boolean,
|
||||
}>;
|
||||
|
||||
const NativeAnimatedAPI = NativeAnimatedHelper.API;
|
||||
|
||||
/**
|
||||
@@ -91,7 +87,7 @@ class AnimatedValue extends AnimatedWithChildren {
|
||||
_animation: ?Animation;
|
||||
_tracking: ?AnimatedTracking;
|
||||
|
||||
constructor(value: number, config?: ?AnimatedValueConfig) {
|
||||
constructor(value: number) {
|
||||
super();
|
||||
if (typeof value !== 'number') {
|
||||
throw new Error('AnimatedValue: Attempting to set value to undefined');
|
||||
@@ -99,9 +95,6 @@ class AnimatedValue extends AnimatedWithChildren {
|
||||
this._startingValue = this._value = value;
|
||||
this._offset = 0;
|
||||
this._animation = null;
|
||||
if (config && config.useNativeDriver) {
|
||||
this.__makeNative();
|
||||
}
|
||||
}
|
||||
|
||||
__detach() {
|
||||
@@ -134,9 +127,9 @@ class AnimatedValue extends AnimatedWithChildren {
|
||||
!this.__isNative /* don't perform a flush for natively driven values */,
|
||||
);
|
||||
if (this.__isNative) {
|
||||
_executeAsAnimatedBatch(this.__getNativeTag().toString(), () =>
|
||||
NativeAnimatedAPI.setAnimatedNodeValue(this.__getNativeTag(), value),
|
||||
);
|
||||
_executeAsAnimatedBatch(this.__getNativeTag().toString(), () => {
|
||||
NativeAnimatedAPI.setAnimatedNodeValue(this.__getNativeTag(), value);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -218,7 +211,7 @@ class AnimatedValue extends AnimatedWithChildren {
|
||||
}
|
||||
}
|
||||
|
||||
__onAnimatedValueUpdateReceived(value: number): void {
|
||||
_onAnimatedValueUpdateReceived(value: number): void {
|
||||
this._updateValue(value, false /*flush*/);
|
||||
}
|
||||
|
||||
@@ -226,9 +219,7 @@ class AnimatedValue extends AnimatedWithChildren {
|
||||
* Interpolates the value before updating the property, e.g. mapping 0-1 to
|
||||
* 0-10.
|
||||
*/
|
||||
interpolate<OutputT: number | string>(
|
||||
config: InterpolationConfigType<OutputT>,
|
||||
): AnimatedInterpolation<OutputT> {
|
||||
interpolate(config: InterpolationConfigType): AnimatedInterpolation {
|
||||
return new AnimatedInterpolation(this, config);
|
||||
}
|
||||
|
||||
|
||||
@@ -10,16 +10,11 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
import type {PlatformConfig} from '../AnimatedPlatformConfig';
|
||||
|
||||
const AnimatedValue = require('./AnimatedValue');
|
||||
const AnimatedWithChildren = require('./AnimatedWithChildren');
|
||||
|
||||
const invariant = require('invariant');
|
||||
|
||||
export type AnimatedValueXYConfig = $ReadOnly<{
|
||||
useNativeDriver: boolean,
|
||||
}>;
|
||||
type ValueXYListenerCallback = (value: {
|
||||
x: number,
|
||||
y: number,
|
||||
@@ -52,7 +47,6 @@ class AnimatedValueXY extends AnimatedWithChildren {
|
||||
+y: number | AnimatedValue,
|
||||
...
|
||||
},
|
||||
config?: ?AnimatedValueXYConfig,
|
||||
) {
|
||||
super();
|
||||
const value: any = valueIn || {x: 0, y: 0}; // @flowfixme: shouldn't need `: any`
|
||||
@@ -69,9 +63,6 @@ class AnimatedValueXY extends AnimatedWithChildren {
|
||||
this.y = value.y;
|
||||
}
|
||||
this._listeners = {};
|
||||
if (config && config.useNativeDriver) {
|
||||
this.__makeNative();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -177,7 +168,7 @@ class AnimatedValueXY extends AnimatedWithChildren {
|
||||
*/
|
||||
addListener(callback: ValueXYListenerCallback): string {
|
||||
const id = String(_uniqueId++);
|
||||
const jointCallback = ({value: number}: any) => {
|
||||
const jointCallback = ({value: number}) => {
|
||||
callback(this.__getValue());
|
||||
};
|
||||
this._listeners[id] = {
|
||||
@@ -230,24 +221,6 @@ class AnimatedValueXY extends AnimatedWithChildren {
|
||||
getTranslateTransform(): Array<{[key: string]: AnimatedValue, ...}> {
|
||||
return [{translateX: this.x}, {translateY: this.y}];
|
||||
}
|
||||
|
||||
__attach(): void {
|
||||
this.x.__addChild(this);
|
||||
this.y.__addChild(this);
|
||||
super.__attach();
|
||||
}
|
||||
|
||||
__detach(): void {
|
||||
this.x.__removeChild(this);
|
||||
this.y.__removeChild(this);
|
||||
super.__detach();
|
||||
}
|
||||
|
||||
__makeNative(platformConfig: ?PlatformConfig) {
|
||||
this.x.__makeNative(platformConfig);
|
||||
this.y.__makeNative(platformConfig);
|
||||
super.__makeNative(platformConfig);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = AnimatedValueXY;
|
||||
|
||||
@@ -82,7 +82,6 @@ export default function useAnimatedProps<TProps: {...}, TInstance>(
|
||||
scheduleUpdate();
|
||||
} else if (!node.__isNative) {
|
||||
// $FlowIgnore[not-a-function] - Assume it's still a function.
|
||||
// $FlowFixMe[incompatible-use]
|
||||
instance.setNativeProps(node.__getAnimatedValue());
|
||||
} else {
|
||||
throw new Error(
|
||||
|
||||
@@ -127,6 +127,38 @@ class AppState {
|
||||
}
|
||||
throw new Error('Trying to subscribe to unknown event: ' + type);
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Use `remove` on the EventSubscription from `addEventListener`.
|
||||
*/
|
||||
removeEventListener<K: $Keys<AppStateEventDefinitions>>(
|
||||
type: K,
|
||||
listener: (...$ElementType<AppStateEventDefinitions, K>) => mixed,
|
||||
): void {
|
||||
const emitter = this._emitter;
|
||||
if (emitter == null) {
|
||||
throw new Error('Cannot use AppState when `isAvailable` is false.');
|
||||
}
|
||||
// NOTE: This will report a deprecation notice via `console.error`.
|
||||
switch (type) {
|
||||
case 'change':
|
||||
// $FlowIssue[invalid-tuple-arity] Flow cannot refine handler based on the event type
|
||||
// $FlowIssue[incompatible-call]
|
||||
emitter.removeListener('appStateDidChange', listener);
|
||||
return;
|
||||
case 'memoryWarning':
|
||||
// $FlowIssue[invalid-tuple-arity] Flow cannot refine handler based on the event type
|
||||
emitter.removeListener('memoryWarning', listener);
|
||||
return;
|
||||
case 'blur':
|
||||
case 'focus':
|
||||
// $FlowIssue[invalid-tuple-arity] Flow cannot refine handler based on the event type
|
||||
// $FlowIssue[incompatible-call]
|
||||
emitter.addListener('appStateFocusChange', listener);
|
||||
return;
|
||||
}
|
||||
throw new Error('Trying to unsubscribe from unknown event: ' + type);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = (new AppState(): AppState);
|
||||
|
||||
@@ -10,12 +10,13 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
const ErrorUtils = require('../vendor/core/ErrorUtils');
|
||||
const Systrace = require('../Performance/Systrace');
|
||||
|
||||
const deepFreezeAndThrowOnMutationInDev = require('../Utilities/deepFreezeAndThrowOnMutationInDev');
|
||||
const invariant = require('invariant');
|
||||
const stringifySafe = require('../Utilities/stringifySafe').default;
|
||||
const warnOnce = require('../Utilities/warnOnce');
|
||||
const ErrorUtils = require('../vendor/core/ErrorUtils');
|
||||
const invariant = require('invariant');
|
||||
|
||||
export type SpyData = {
|
||||
type: number,
|
||||
@@ -198,7 +199,7 @@ class MessageQueue {
|
||||
delete this._debugInfo[this._callID - DEBUG_INFO_LIMIT];
|
||||
}
|
||||
if (this._successCallbacks.size > 500) {
|
||||
const info: {[number]: {method: string, module: string}} = {};
|
||||
const info = {};
|
||||
this._successCallbacks.forEach((_, callID) => {
|
||||
const debug = this._debugInfo[callID];
|
||||
const module = debug && this._remoteModuleTable[debug[0]];
|
||||
@@ -252,7 +253,7 @@ class MessageQueue {
|
||||
// folly-convertible. As a special case, if a prop value is a
|
||||
// function it is permitted here, and special-cased in the
|
||||
// conversion.
|
||||
const isValidArgument = (val: mixed) => {
|
||||
const isValidArgument = val => {
|
||||
switch (typeof val) {
|
||||
case 'undefined':
|
||||
case 'boolean':
|
||||
@@ -286,7 +287,7 @@ class MessageQueue {
|
||||
// Replacement allows normally non-JSON-convertible values to be
|
||||
// seen. There is ambiguity with string values, but in context,
|
||||
// it should at least be a strong hint.
|
||||
const replacer = (key: string, val: $FlowFixMe) => {
|
||||
const replacer = (key, val) => {
|
||||
const t = typeof val;
|
||||
if (t === 'function') {
|
||||
return '<<Function ' + val.name + '>>';
|
||||
@@ -404,22 +405,15 @@ class MessageQueue {
|
||||
this.__spy({type: TO_JS, module, method, args});
|
||||
}
|
||||
const moduleMethods = this.getCallableModule(module);
|
||||
if (!moduleMethods) {
|
||||
const callableModuleNames = Object.keys(this._lazyCallableModules);
|
||||
const n = callableModuleNames.length;
|
||||
const callableModuleNameList = callableModuleNames.join(', ');
|
||||
invariant(
|
||||
false,
|
||||
`Failed to call into JavaScript module method ${module}.${method}(). Module has not been registered as callable. Registered callable JavaScript modules (n = ${n}): ${callableModuleNameList}.
|
||||
A frequent cause of the error is that the application entry file path is incorrect. This can also happen when the JS bundle is corrupt or there is an early initialization error when loading React Native.`,
|
||||
);
|
||||
}
|
||||
if (!moduleMethods[method]) {
|
||||
invariant(
|
||||
false,
|
||||
`Failed to call into JavaScript module method ${module}.${method}(). Module exists, but the method is undefined.`,
|
||||
);
|
||||
}
|
||||
invariant(
|
||||
!!moduleMethods,
|
||||
`Module ${module} is not a registered callable module (calling ${method}). A frequent cause of the error is that the application entry file path is incorrect.
|
||||
This can also happen when the JS bundle is corrupt or there is an early initialization error when loading React Native.`,
|
||||
);
|
||||
invariant(
|
||||
!!moduleMethods[method],
|
||||
`Method ${method} does not exist on module ${module}`,
|
||||
);
|
||||
moduleMethods[method].apply(moduleMethods, args);
|
||||
Systrace.endEvent();
|
||||
}
|
||||
|
||||
@@ -10,11 +10,12 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
import type {ExtendedError} from '../Core/ExtendedError';
|
||||
|
||||
const BatchedBridge = require('./BatchedBridge');
|
||||
|
||||
const invariant = require('invariant');
|
||||
|
||||
import type {ExtendedError} from '../Core/ExtendedError';
|
||||
|
||||
export type ModuleConfig = [
|
||||
string /* name */,
|
||||
?{...} /* constants */,
|
||||
@@ -50,7 +51,7 @@ function genModule(
|
||||
return {name: moduleName};
|
||||
}
|
||||
|
||||
const module: {[string]: mixed} = {};
|
||||
const module = {};
|
||||
methods &&
|
||||
methods.forEach((methodName, methodID) => {
|
||||
const isPromise =
|
||||
|
||||
@@ -108,8 +108,8 @@ describe('MessageQueue', function () {
|
||||
const unknownModule = 'UnknownModule',
|
||||
unknownMethod = 'UnknownMethod';
|
||||
expect(() => queue.__callFunction(unknownModule, unknownMethod)).toThrow(
|
||||
`Failed to call into JavaScript module method ${unknownModule}.${unknownMethod}(). Module has not been registered as callable. Registered callable JavaScript modules (n = 1): MessageQueueTestModule.
|
||||
A frequent cause of the error is that the application entry file path is incorrect. This can also happen when the JS bundle is corrupt or there is an early initialization error when loading React Native.`,
|
||||
`Module ${unknownModule} is not a registered callable module (calling ${unknownMethod}). A frequent cause of the error is that the application entry file path is incorrect.
|
||||
This can also happen when the JS bundle is corrupt or there is an early initialization error when loading React Native.`,
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
@@ -105,12 +105,6 @@ class Blob {
|
||||
blobId: this.data.blobId,
|
||||
offset,
|
||||
size,
|
||||
/* Since `blob.slice()` creates a new view onto the same binary
|
||||
* data as the original blob, we should re-use the same collector
|
||||
* object so that the underlying resource gets deallocated when
|
||||
* the last view into the data is released, not the first.
|
||||
*/
|
||||
__collector: this.data.__collector,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -46,6 +46,7 @@ class FileReader extends (EventTarget(...READER_EVENTS): any) {
|
||||
_error: ?Error;
|
||||
_result: ?ReaderResult;
|
||||
_aborted: boolean = false;
|
||||
_subscriptions: Array<any> = [];
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
@@ -58,6 +59,11 @@ class FileReader extends (EventTarget(...READER_EVENTS): any) {
|
||||
this._result = null;
|
||||
}
|
||||
|
||||
_clearSubscriptions(): void {
|
||||
this._subscriptions.forEach(sub => sub.remove());
|
||||
this._subscriptions = [];
|
||||
}
|
||||
|
||||
_setReadyState(newState: ReadyState) {
|
||||
this._readyState = newState;
|
||||
this.dispatchEvent({type: 'readystatechange'});
|
||||
|
||||
@@ -31,26 +31,24 @@ RCT_EXPORT_METHOD(readAsText:(NSDictionary<NSString *, id> *)blob
|
||||
reject:(RCTPromiseRejectBlock)reject)
|
||||
{
|
||||
RCTBlobManager *blobManager = [_moduleRegistry moduleForName:"BlobModule"];
|
||||
dispatch_async(blobManager.methodQueue, ^{
|
||||
NSData *data = [blobManager resolve:blob];
|
||||
NSData *data = [blobManager resolve:blob];
|
||||
|
||||
if (data == nil) {
|
||||
reject(RCTErrorUnspecified,
|
||||
[NSString stringWithFormat:@"Unable to resolve data for blob: %@", [RCTConvert NSString:blob[@"blobId"]]], nil);
|
||||
if (data == nil) {
|
||||
reject(RCTErrorUnspecified,
|
||||
[NSString stringWithFormat:@"Unable to resolve data for blob: %@", [RCTConvert NSString:blob[@"blobId"]]], nil);
|
||||
} else {
|
||||
NSStringEncoding stringEncoding;
|
||||
|
||||
if (encoding == nil) {
|
||||
stringEncoding = NSUTF8StringEncoding;
|
||||
} else {
|
||||
NSStringEncoding stringEncoding;
|
||||
|
||||
if (encoding == nil) {
|
||||
stringEncoding = NSUTF8StringEncoding;
|
||||
} else {
|
||||
stringEncoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding((CFStringRef) encoding));
|
||||
}
|
||||
|
||||
NSString *text = [[NSString alloc] initWithData:data encoding:stringEncoding];
|
||||
|
||||
resolve(text);
|
||||
stringEncoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding((CFStringRef) encoding));
|
||||
}
|
||||
});
|
||||
|
||||
NSString *text = [[NSString alloc] initWithData:data encoding:stringEncoding];
|
||||
|
||||
resolve(text);
|
||||
}
|
||||
}
|
||||
|
||||
RCT_EXPORT_METHOD(readAsDataURL:(NSDictionary<NSString *, id> *)blob
|
||||
@@ -58,21 +56,19 @@ RCT_EXPORT_METHOD(readAsDataURL:(NSDictionary<NSString *, id> *)blob
|
||||
reject:(RCTPromiseRejectBlock)reject)
|
||||
{
|
||||
RCTBlobManager *blobManager = [_moduleRegistry moduleForName:"BlobModule"];
|
||||
dispatch_async(blobManager.methodQueue, ^{
|
||||
NSData *data = [blobManager resolve:blob];
|
||||
NSData *data = [blobManager resolve:blob];
|
||||
|
||||
if (data == nil) {
|
||||
reject(RCTErrorUnspecified,
|
||||
[NSString stringWithFormat:@"Unable to resolve data for blob: %@", [RCTConvert NSString:blob[@"blobId"]]], nil);
|
||||
} else {
|
||||
NSString *type = [RCTConvert NSString:blob[@"type"]];
|
||||
NSString *text = [NSString stringWithFormat:@"data:%@;base64,%@",
|
||||
type != nil && [type length] > 0 ? type : @"application/octet-stream",
|
||||
[data base64EncodedStringWithOptions:0]];
|
||||
if (data == nil) {
|
||||
reject(RCTErrorUnspecified,
|
||||
[NSString stringWithFormat:@"Unable to resolve data for blob: %@", [RCTConvert NSString:blob[@"blobId"]]], nil);
|
||||
} else {
|
||||
NSString *type = [RCTConvert NSString:blob[@"type"]];
|
||||
NSString *text = [NSString stringWithFormat:@"data:%@;base64,%@",
|
||||
type != nil && [type length] > 0 ? type : @"application/octet-stream",
|
||||
[data base64EncodedStringWithOptions:0]];
|
||||
|
||||
resolve(text);
|
||||
}
|
||||
});
|
||||
resolve(text);
|
||||
}
|
||||
}
|
||||
|
||||
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const facebook::react::ObjCTurboModule::InitParams &)params
|
||||
|
||||
@@ -17,7 +17,7 @@ else
|
||||
end
|
||||
|
||||
folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32'
|
||||
folly_version = '2021.07.22.00'
|
||||
folly_version = '2021.06.28.00-v2'
|
||||
|
||||
Pod::Spec.new do |s|
|
||||
s.name = "React-RCTBlob"
|
||||
@@ -26,7 +26,7 @@ Pod::Spec.new do |s|
|
||||
s.homepage = "https://reactnative.dev/"
|
||||
s.license = package["license"]
|
||||
s.author = "Facebook, Inc. and its affiliates"
|
||||
s.platforms = { :ios => "12.4" }
|
||||
s.platforms = { :ios => "11.0" }
|
||||
s.compiler_flags = folly_compiler_flags + ' -Wno-nullability-completeness'
|
||||
s.source = source
|
||||
s.source_files = "*.{h,m,mm}"
|
||||
@@ -34,7 +34,7 @@ Pod::Spec.new do |s|
|
||||
s.header_dir = "RCTBlob"
|
||||
s.pod_target_xcconfig = {
|
||||
"USE_HEADERMAP" => "YES",
|
||||
"CLANG_CXX_LANGUAGE_STANDARD" => "c++17",
|
||||
"CLANG_CXX_LANGUAGE_STANDARD" => "c++14",
|
||||
"HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/RCT-Folly\" \"${PODS_ROOT}/Headers/Public/React-Codegen/react/renderer/components\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-Codegen/React_Codegen.framework/Headers\""
|
||||
}
|
||||
|
||||
|
||||
@@ -101,13 +101,7 @@ export class URLSearchParams {
|
||||
}
|
||||
const last = this._searchParams.length - 1;
|
||||
return this._searchParams.reduce((acc, curr, index) => {
|
||||
return (
|
||||
acc +
|
||||
encodeURIComponent(curr[0]) +
|
||||
'=' +
|
||||
encodeURIComponent(curr[1]) +
|
||||
(index === last ? '' : '&')
|
||||
);
|
||||
return acc + curr.join('=') + (index === last ? '' : '&');
|
||||
}, '');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,208 +0,0 @@
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @flow strict-local
|
||||
* @format
|
||||
*/
|
||||
|
||||
import type {HostComponent} from '../../Renderer/shims/ReactNativeTypes';
|
||||
import type {EventSubscription} from '../../vendor/emitter/EventEmitter';
|
||||
import type {ElementRef} from 'react';
|
||||
|
||||
// Events that are only supported on Android.
|
||||
type AccessibilityEventDefinitionsAndroid = {
|
||||
accessibilityServiceChanged: [boolean],
|
||||
};
|
||||
|
||||
// Events that are only supported on iOS.
|
||||
type AccessibilityEventDefinitionsIOS = {
|
||||
announcementFinished: [{announcement: string, success: boolean}],
|
||||
boldTextChanged: [boolean],
|
||||
grayscaleChanged: [boolean],
|
||||
invertColorsChanged: [boolean],
|
||||
reduceTransparencyChanged: [boolean],
|
||||
};
|
||||
|
||||
type AccessibilityEventDefinitions = {
|
||||
...AccessibilityEventDefinitionsAndroid,
|
||||
...AccessibilityEventDefinitionsIOS,
|
||||
change: [boolean], // screenReaderChanged
|
||||
reduceMotionChanged: [boolean],
|
||||
screenReaderChanged: [boolean],
|
||||
};
|
||||
|
||||
type AccessibilityEventTypes = 'click' | 'focus';
|
||||
/**
|
||||
* Sometimes it's useful to know whether or not the device has a screen reader
|
||||
* that is currently active. The `AccessibilityInfo` API is designed for this
|
||||
* purpose. You can use it to query the current state of the screen reader as
|
||||
* well as to register to be notified when the state of the screen reader
|
||||
* changes.
|
||||
*
|
||||
* See https://reactnative.dev/docs/accessibilityinfo
|
||||
*/
|
||||
export interface AccessibilityInfo {
|
||||
/**
|
||||
* Query whether bold text is currently enabled.
|
||||
*
|
||||
* Returns a promise which resolves to a boolean.
|
||||
* The result is `true` when bold text is enabled and `false` otherwise.
|
||||
*
|
||||
* See https://reactnative.dev/docs/accessibilityinfo#isBoldTextEnabled
|
||||
*/
|
||||
isBoldTextEnabled: () => Promise<boolean>;
|
||||
|
||||
/**
|
||||
* Query whether grayscale is currently enabled.
|
||||
*
|
||||
* Returns a promise which resolves to a boolean.
|
||||
* The result is `true` when grayscale is enabled and `false` otherwise.
|
||||
*
|
||||
* See https://reactnative.dev/docs/accessibilityinfo#isGrayscaleEnabled
|
||||
*/
|
||||
isGrayscaleEnabled: () => Promise<boolean>;
|
||||
|
||||
/**
|
||||
* Query whether inverted colors are currently enabled.
|
||||
*
|
||||
* Returns a promise which resolves to a boolean.
|
||||
* The result is `true` when invert color is enabled and `false` otherwise.
|
||||
*
|
||||
* See https://reactnative.dev/docs/accessibilityinfo#isInvertColorsEnabled
|
||||
*/
|
||||
isInvertColorsEnabled: () => Promise<boolean>;
|
||||
|
||||
/**
|
||||
* Query whether reduced motion is currently enabled.
|
||||
*
|
||||
* Returns a promise which resolves to a boolean.
|
||||
* The result is `true` when a reduce motion is enabled and `false` otherwise.
|
||||
*
|
||||
* See https://reactnative.dev/docs/accessibilityinfo#isReduceMotionEnabled
|
||||
*/
|
||||
isReduceMotionEnabled: () => Promise<boolean>;
|
||||
|
||||
/**
|
||||
* Query whether reduce motion and prefer cross-fade transitions settings are currently enabled.
|
||||
*
|
||||
* Returns a promise which resolves to a boolean.
|
||||
* The result is `true` when prefer cross-fade transitions is enabled and `false` otherwise.
|
||||
*
|
||||
* See https://reactnative.dev/docs/accessibilityinfo#prefersCrossFadeTransitions
|
||||
*/
|
||||
prefersCrossFadeTransitions: () => Promise<boolean>;
|
||||
|
||||
/**
|
||||
* Query whether reduced transparency is currently enabled.
|
||||
*
|
||||
* Returns a promise which resolves to a boolean.
|
||||
* The result is `true` when a reduce transparency is enabled and `false` otherwise.
|
||||
*
|
||||
* See https://reactnative.dev/docs/accessibilityinfo#isReduceTransparencyEnabled
|
||||
*/
|
||||
isReduceTransparencyEnabled: () => Promise<boolean>;
|
||||
|
||||
/**
|
||||
* Query whether a screen reader is currently enabled.
|
||||
*
|
||||
* Returns a promise which resolves to a boolean.
|
||||
* The result is `true` when a screen reader is enabled and `false` otherwise.
|
||||
*
|
||||
* See https://reactnative.dev/docs/accessibilityinfo#isScreenReaderEnabled
|
||||
*/
|
||||
isScreenReaderEnabled: () => Promise<boolean>;
|
||||
|
||||
/**
|
||||
* Query whether Accessibility Service is currently enabled.
|
||||
*
|
||||
* Returns a promise which resolves to a boolean.
|
||||
* The result is `true` when any service is enabled and `false` otherwise.
|
||||
*
|
||||
* @platform android
|
||||
*
|
||||
* See https://reactnative.dev/docs/accessibilityinfo/#isaccessibilityserviceenabled-android
|
||||
*/
|
||||
isAccessibilityServiceEnabled: () => Promise<boolean>;
|
||||
|
||||
/**
|
||||
* Add an event handler. Supported events:
|
||||
*
|
||||
* - `reduceMotionChanged`: Fires when the state of the reduce motion toggle changes.
|
||||
* The argument to the event handler is a boolean. The boolean is `true` when a reduce
|
||||
* motion is enabled (or when "Transition Animation Scale" in "Developer options" is
|
||||
* "Animation off") and `false` otherwise.
|
||||
* - `screenReaderChanged`: Fires when the state of the screen reader changes. The argument
|
||||
* to the event handler is a boolean. The boolean is `true` when a screen
|
||||
* reader is enabled and `false` otherwise.
|
||||
*
|
||||
* These events are only supported on iOS:
|
||||
*
|
||||
* - `boldTextChanged`: iOS-only event. Fires when the state of the bold text toggle changes.
|
||||
* The argument to the event handler is a boolean. The boolean is `true` when a bold text
|
||||
* is enabled and `false` otherwise.
|
||||
* - `grayscaleChanged`: iOS-only event. Fires when the state of the gray scale toggle changes.
|
||||
* The argument to the event handler is a boolean. The boolean is `true` when a gray scale
|
||||
* is enabled and `false` otherwise.
|
||||
* - `invertColorsChanged`: iOS-only event. Fires when the state of the invert colors toggle
|
||||
* changes. The argument to the event handler is a boolean. The boolean is `true` when a invert
|
||||
* colors is enabled and `false` otherwise.
|
||||
* - `reduceTransparencyChanged`: iOS-only event. Fires when the state of the reduce transparency
|
||||
* toggle changes. The argument to the event handler is a boolean. The boolean is `true`
|
||||
* when a reduce transparency is enabled and `false` otherwise.
|
||||
* - `announcementFinished`: iOS-only event. Fires when the screen reader has
|
||||
* finished making an announcement. The argument to the event handler is a
|
||||
* dictionary with these keys:
|
||||
* - `announcement`: The string announced by the screen reader.
|
||||
* - `success`: A boolean indicating whether the announcement was
|
||||
* successfully made.
|
||||
*
|
||||
* See https://reactnative.dev/docs/accessibilityinfo#addeventlistener
|
||||
*/
|
||||
addEventListener<K: $Keys<AccessibilityEventDefinitions>>(
|
||||
eventName: K,
|
||||
handler: (...$ElementType<AccessibilityEventDefinitions, K>) => void,
|
||||
): EventSubscription;
|
||||
|
||||
/**
|
||||
* Set accessibility focus to a React component.
|
||||
*
|
||||
* See https://reactnative.dev/docs/accessibilityinfo#setaccessibilityfocus
|
||||
*/
|
||||
setAccessibilityFocus: (reactTag: number) => void;
|
||||
|
||||
/**
|
||||
* Send a named accessibility event to a HostComponent.
|
||||
*/
|
||||
sendAccessibilityEvent: (
|
||||
handle: ElementRef<HostComponent<mixed>>,
|
||||
eventType: AccessibilityEventTypes,
|
||||
) => void;
|
||||
|
||||
/**
|
||||
* Post a string to be announced by the screen reader.
|
||||
*
|
||||
* See https://reactnative.dev/docs/accessibilityinfo#announceforaccessibility
|
||||
*/
|
||||
announceForAccessibility: (announcement: string) => void;
|
||||
|
||||
/**
|
||||
* Post a string to be announced by the screen reader.
|
||||
* - `announcement`: The string announced by the screen reader.
|
||||
* - `options`: An object that configures the reading options.
|
||||
* - `queue`: The announcement will be queued behind existing announcements. iOS only.
|
||||
*/
|
||||
announceForAccessibilityWithOptions: (
|
||||
announcement: string,
|
||||
options: {queue?: boolean},
|
||||
) => void;
|
||||
|
||||
/**
|
||||
* Get the recommended timeout for changes to the UI needed by this user.
|
||||
*
|
||||
* See https://reactnative.dev/docs/accessibilityinfo#getrecommendedtimeoutmillis
|
||||
*/
|
||||
getRecommendedTimeoutMillis: (originalTimeout: number) => Promise<number>;
|
||||
}
|
||||
@@ -12,12 +12,12 @@ import RCTDeviceEventEmitter from '../../EventEmitter/RCTDeviceEventEmitter';
|
||||
import {sendAccessibilityEvent} from '../../Renderer/shims/ReactNative';
|
||||
import type {HostComponent} from '../../Renderer/shims/ReactNativeTypes';
|
||||
import Platform from '../../Utilities/Platform';
|
||||
import type EventEmitter from '../../vendor/emitter/EventEmitter';
|
||||
import type {EventSubscription} from '../../vendor/emitter/EventEmitter';
|
||||
import NativeAccessibilityInfoAndroid from './NativeAccessibilityInfo';
|
||||
import NativeAccessibilityManagerIOS from './NativeAccessibilityManager';
|
||||
import legacySendAccessibilityEvent from './legacySendAccessibilityEvent';
|
||||
import type {ElementRef} from 'react';
|
||||
import type {AccessibilityInfo as AccessibilityInfoType} from './AccessibilityInfo.flow';
|
||||
|
||||
// Events that are only supported on Android.
|
||||
type AccessibilityEventDefinitionsAndroid = {
|
||||
@@ -74,7 +74,7 @@ const EventNames: Map<
|
||||
*
|
||||
* See https://reactnative.dev/docs/accessibilityinfo
|
||||
*/
|
||||
const AccessibilityInfo: AccessibilityInfoType = {
|
||||
const AccessibilityInfo = {
|
||||
/**
|
||||
* Query whether bold text is currently enabled.
|
||||
*
|
||||
@@ -179,34 +179,6 @@ const AccessibilityInfo: AccessibilityInfoType = {
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Query whether reduce motion and prefer cross-fade transitions settings are currently enabled.
|
||||
*
|
||||
* Returns a promise which resolves to a boolean.
|
||||
* The result is `true` when prefer cross-fade transitions is enabled and `false` otherwise.
|
||||
*
|
||||
* See https://reactnative.dev/docs/accessibilityinfo#prefersCrossFadeTransitions
|
||||
*/
|
||||
prefersCrossFadeTransitions(): Promise<boolean> {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (Platform.OS === 'android') {
|
||||
return Promise.resolve(false);
|
||||
} else {
|
||||
if (
|
||||
NativeAccessibilityManagerIOS?.getCurrentPrefersCrossFadeTransitionsState !=
|
||||
null
|
||||
) {
|
||||
NativeAccessibilityManagerIOS.getCurrentPrefersCrossFadeTransitionsState(
|
||||
resolve,
|
||||
reject,
|
||||
);
|
||||
} else {
|
||||
reject(null);
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Query whether reduced transparency is currently enabled.
|
||||
*
|
||||
@@ -324,7 +296,6 @@ const AccessibilityInfo: AccessibilityInfoType = {
|
||||
*/
|
||||
addEventListener<K: $Keys<AccessibilityEventDefinitions>>(
|
||||
eventName: K,
|
||||
// $FlowIssue[incompatible-type] - Flow bug with unions and generics (T128099423)
|
||||
handler: (...$ElementType<AccessibilityEventDefinitions, K>) => void,
|
||||
): EventSubscription {
|
||||
const deviceEventName = EventNames.get(eventName);
|
||||
@@ -345,7 +316,7 @@ const AccessibilityInfo: AccessibilityInfoType = {
|
||||
/**
|
||||
* Send a named accessibility event to a HostComponent.
|
||||
*/
|
||||
sendAccessibilityEvent(
|
||||
sendAccessibilityEvent_unstable(
|
||||
handle: ElementRef<HostComponent<mixed>>,
|
||||
eventType: AccessibilityEventTypes,
|
||||
) {
|
||||
@@ -394,6 +365,25 @@ const AccessibilityInfo: AccessibilityInfoType = {
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* @deprecated Use `remove` on the EventSubscription from `addEventListener`.
|
||||
*/
|
||||
removeEventListener<K: $Keys<AccessibilityEventDefinitions>>(
|
||||
eventName: K,
|
||||
handler: (...$ElementType<AccessibilityEventDefinitions, K>) => void,
|
||||
): void {
|
||||
// NOTE: This will report a deprecation notice via `console.error`.
|
||||
const deviceEventName = EventNames.get(eventName);
|
||||
if (deviceEventName != null) {
|
||||
// $FlowIgnore[incompatible-cast]
|
||||
(RCTDeviceEventEmitter: EventEmitter<$FlowFixMe>).removeListener(
|
||||
'deviceEventName',
|
||||
// $FlowFixMe[invalid-tuple-arity]
|
||||
handler,
|
||||
);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Get the recommended timeout for changes to the UI needed by this user.
|
||||
*
|
||||
|
||||
@@ -28,10 +28,6 @@ export interface Spec extends TurboModule {
|
||||
onSuccess: (isReduceMotionEnabled: boolean) => void,
|
||||
onError: (error: Object) => void,
|
||||
) => void;
|
||||
+getCurrentPrefersCrossFadeTransitionsState?: (
|
||||
onSuccess: (prefersCrossFadeTransitions: boolean) => void,
|
||||
onError: (error: Object) => void,
|
||||
) => void;
|
||||
+getCurrentReduceTransparencyState: (
|
||||
onSuccess: (isReduceTransparencyEnabled: boolean) => void,
|
||||
onError: (error: Object) => void,
|
||||
|
||||
@@ -146,7 +146,6 @@ type ButtonProps = $ReadOnly<{|
|
||||
onAccessibilityAction?: ?(event: AccessibilityActionEvent) => mixed,
|
||||
accessibilityState?: ?AccessibilityState,
|
||||
accessibilityHint?: ?string,
|
||||
accessibilityLanguage?: ?Stringish,
|
||||
|}>;
|
||||
|
||||
/**
|
||||
@@ -278,7 +277,6 @@ class Button extends React.Component<ButtonProps> {
|
||||
accessible,
|
||||
accessibilityActions,
|
||||
accessibilityHint,
|
||||
accessibilityLanguage,
|
||||
onAccessibilityAction,
|
||||
} = this.props;
|
||||
const buttonStyles = [styles.button];
|
||||
@@ -322,7 +320,6 @@ class Button extends React.Component<ButtonProps> {
|
||||
onAccessibilityAction={onAccessibilityAction}
|
||||
accessibilityLabel={accessibilityLabel}
|
||||
accessibilityHint={accessibilityHint}
|
||||
accessibilityLanguage={accessibilityLanguage}
|
||||
accessibilityRole="button"
|
||||
accessibilityState={accessibilityState}
|
||||
hasTVPreferredFocus={hasTVPreferredFocus}
|
||||
|
||||
@@ -11,11 +11,6 @@
|
||||
import type {TurboModule} from '../../TurboModule/RCTExport';
|
||||
import * as TurboModuleRegistry from '../../TurboModule/TurboModuleRegistry';
|
||||
|
||||
/**
|
||||
* This file backs native modules that are used internally at Meta
|
||||
* and this JS spec was intentionally left here. In the meanwhile this
|
||||
* file should not be deleted.
|
||||
*/
|
||||
export interface Spec extends TurboModule {
|
||||
+open: (options: Object) => Promise<Object>;
|
||||
}
|
||||
|
||||
@@ -232,8 +232,6 @@ class DrawerLayoutAndroid extends React.Component<Props, State> {
|
||||
);
|
||||
}
|
||||
|
||||
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
|
||||
* LTI update could not be added via codemod */
|
||||
_onDrawerSlide = event => {
|
||||
if (this.props.onDrawerSlide) {
|
||||
this.props.onDrawerSlide(event);
|
||||
@@ -255,8 +253,6 @@ class DrawerLayoutAndroid extends React.Component<Props, State> {
|
||||
}
|
||||
};
|
||||
|
||||
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
|
||||
* LTI update could not be added via codemod */
|
||||
_onDrawerStateChanged = event => {
|
||||
if (this.props.onDrawerStateChanged) {
|
||||
this.props.onDrawerStateChanged(
|
||||
|
||||
@@ -24,7 +24,7 @@ export type KeyboardEventEasing =
|
||||
| 'linear'
|
||||
| 'keyboard';
|
||||
|
||||
export type KeyboardMetrics = $ReadOnly<{|
|
||||
export type KeyboardEventCoordinates = $ReadOnly<{|
|
||||
screenX: number,
|
||||
screenY: number,
|
||||
width: number,
|
||||
@@ -36,7 +36,7 @@ export type KeyboardEvent = AndroidKeyboardEvent | IOSKeyboardEvent;
|
||||
type BaseKeyboardEvent = {|
|
||||
duration: number,
|
||||
easing: KeyboardEventEasing,
|
||||
endCoordinates: KeyboardMetrics,
|
||||
endCoordinates: KeyboardEventCoordinates,
|
||||
|};
|
||||
|
||||
export type AndroidKeyboardEvent = $ReadOnly<{|
|
||||
@@ -47,7 +47,7 @@ export type AndroidKeyboardEvent = $ReadOnly<{|
|
||||
|
||||
export type IOSKeyboardEvent = $ReadOnly<{|
|
||||
...BaseKeyboardEvent,
|
||||
startCoordinates: KeyboardMetrics,
|
||||
startCoordinates: KeyboardEventCoordinates,
|
||||
isEventFromThisApp: boolean,
|
||||
|}>;
|
||||
|
||||
@@ -103,8 +103,6 @@ type KeyboardEventDefinitions = {
|
||||
*/
|
||||
|
||||
class Keyboard {
|
||||
_currentlyShowing: ?KeyboardEvent;
|
||||
|
||||
_emitter: NativeEventEmitter<KeyboardEventDefinitions> =
|
||||
new NativeEventEmitter(
|
||||
// T88715063: NativeEventEmitter only used this parameter on iOS. Now it uses it on all platforms, so this code was modified automatically to preserve its behavior
|
||||
@@ -112,15 +110,6 @@ class Keyboard {
|
||||
Platform.OS !== 'ios' ? null : NativeKeyboardObserver,
|
||||
);
|
||||
|
||||
constructor() {
|
||||
this.addListener('keyboardDidShow', ev => {
|
||||
this._currentlyShowing = ev;
|
||||
});
|
||||
this.addListener('keyboardDidHide', _ev => {
|
||||
this._currentlyShowing = null;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* The `addListener` function connects a JavaScript function to an identified native
|
||||
* keyboard notification event.
|
||||
@@ -152,6 +141,17 @@ class Keyboard {
|
||||
return this._emitter.addListener(eventType, listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Use `remove` on the EventSubscription from `addListener`.
|
||||
*/
|
||||
removeListener<K: $Keys<KeyboardEventDefinitions>>(
|
||||
eventType: K,
|
||||
listener: (...$ElementType<KeyboardEventDefinitions, K>) => mixed,
|
||||
): void {
|
||||
// NOTE: This will report a deprecation notice via `console.error`.
|
||||
this._emitter.removeListener(eventType, listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes all listeners for a specific event type.
|
||||
*
|
||||
@@ -168,20 +168,6 @@ class Keyboard {
|
||||
dismissKeyboard();
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether the keyboard is last known to be visible.
|
||||
*/
|
||||
isVisible(): boolean {
|
||||
return !!this._currentlyShowing;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the metrics of the soft-keyboard if visible.
|
||||
*/
|
||||
metrics(): ?KeyboardMetrics {
|
||||
return this._currentlyShowing?.endCoordinates;
|
||||
}
|
||||
|
||||
/**
|
||||
* Useful for syncing TextInput (or other keyboard accessory view) size of
|
||||
* position changes with keyboard movements.
|
||||
|
||||
@@ -22,8 +22,7 @@ import type {
|
||||
ViewLayout,
|
||||
ViewLayoutEvent,
|
||||
} from '../View/ViewPropTypes';
|
||||
import type {KeyboardEvent, KeyboardMetrics} from './Keyboard';
|
||||
import AccessibilityInfo from '../AccessibilityInfo/AccessibilityInfo';
|
||||
import type {KeyboardEvent, KeyboardEventCoordinates} from './Keyboard';
|
||||
|
||||
type Props = $ReadOnly<{|
|
||||
...ViewProps,
|
||||
@@ -72,24 +71,12 @@ class KeyboardAvoidingView extends React.Component<Props, State> {
|
||||
this.viewRef = React.createRef();
|
||||
}
|
||||
|
||||
async _relativeKeyboardHeight(
|
||||
keyboardFrame: KeyboardMetrics,
|
||||
): Promise<number> {
|
||||
_relativeKeyboardHeight(keyboardFrame: KeyboardEventCoordinates): number {
|
||||
const frame = this._frame;
|
||||
if (!frame || !keyboardFrame) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// On iOS when Prefer Cross-Fade Transitions is enabled, the keyboard position
|
||||
// & height is reported differently (0 instead of Y position value matching height of frame)
|
||||
if (
|
||||
Platform.OS === 'ios' &&
|
||||
keyboardFrame.screenY === 0 &&
|
||||
(await AccessibilityInfo.prefersCrossFadeTransitions())
|
||||
) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
const keyboardY =
|
||||
keyboardFrame.screenY - (this.props.keyboardVerticalOffset ?? 0);
|
||||
|
||||
@@ -103,7 +90,7 @@ class KeyboardAvoidingView extends React.Component<Props, State> {
|
||||
this._updateBottomIfNecessary();
|
||||
};
|
||||
|
||||
_onLayout = async (event: ViewLayoutEvent) => {
|
||||
_onLayout = (event: ViewLayoutEvent) => {
|
||||
const wasFrameNull = this._frame == null;
|
||||
this._frame = event.nativeEvent.layout;
|
||||
if (!this._initialFrameHeight) {
|
||||
@@ -112,7 +99,7 @@ class KeyboardAvoidingView extends React.Component<Props, State> {
|
||||
}
|
||||
|
||||
if (wasFrameNull) {
|
||||
await this._updateBottomIfNecessary();
|
||||
this._updateBottomIfNecessary();
|
||||
}
|
||||
|
||||
if (this.props.onLayout) {
|
||||
@@ -120,14 +107,14 @@ class KeyboardAvoidingView extends React.Component<Props, State> {
|
||||
}
|
||||
};
|
||||
|
||||
_updateBottomIfNecessary = async () => {
|
||||
_updateBottomIfNecessary = () => {
|
||||
if (this._keyboardEvent == null) {
|
||||
this.setState({bottom: 0});
|
||||
return;
|
||||
}
|
||||
|
||||
const {duration, easing, endCoordinates} = this._keyboardEvent;
|
||||
const height = await this._relativeKeyboardHeight(endCoordinates);
|
||||
const height = this._relativeKeyboardHeight(endCoordinates);
|
||||
|
||||
if (this.state.bottom === height) {
|
||||
return;
|
||||
|
||||
@@ -22,7 +22,7 @@ import type {
|
||||
} from '../View/ViewAccessibility';
|
||||
import {PressabilityDebugView} from '../../Pressability/PressabilityDebug';
|
||||
import usePressability from '../../Pressability/usePressability';
|
||||
import {type RectOrSize} from '../../StyleSheet/Rect';
|
||||
import {normalizeRect, type RectOrSize} from '../../StyleSheet/Rect';
|
||||
import type {
|
||||
LayoutEvent,
|
||||
MouseEvent,
|
||||
@@ -43,7 +43,6 @@ type Props = $ReadOnly<{|
|
||||
accessibilityActions?: ?$ReadOnlyArray<AccessibilityActionInfo>,
|
||||
accessibilityElementsHidden?: ?boolean,
|
||||
accessibilityHint?: ?Stringish,
|
||||
accessibilityLanguage?: ?Stringish,
|
||||
accessibilityIgnoresInvertColors?: ?boolean,
|
||||
accessibilityLabel?: ?Stringish,
|
||||
accessibilityLiveRegion?: ?('none' | 'polite' | 'assertive'),
|
||||
@@ -170,8 +169,6 @@ type Props = $ReadOnly<{|
|
||||
* Component used to build display components that should respond to whether the
|
||||
* component is currently pressed or not.
|
||||
*/
|
||||
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
|
||||
* LTI update could not be added via codemod */
|
||||
function Pressable(props: Props, forwardedRef): React.Node {
|
||||
const {
|
||||
accessible,
|
||||
@@ -184,7 +181,6 @@ function Pressable(props: Props, forwardedRef): React.Node {
|
||||
delayLongPress,
|
||||
disabled,
|
||||
focusable,
|
||||
hitSlop,
|
||||
onHoverIn,
|
||||
onHoverOut,
|
||||
onLongPress,
|
||||
@@ -205,6 +201,8 @@ function Pressable(props: Props, forwardedRef): React.Node {
|
||||
|
||||
const [pressed, setPressed] = usePressState(testOnly_pressed === true);
|
||||
|
||||
const hitSlop = normalizeRect(props.hitSlop);
|
||||
|
||||
const accessibilityState =
|
||||
disabled != null
|
||||
? {...props.accessibilityState, disabled}
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
*/
|
||||
|
||||
import type {ViewProps} from '../View/ViewPropTypes';
|
||||
import type {WithDefault} from '../../Types/CodegenTypes';
|
||||
|
||||
import codegenNativeComponent from '../../Utilities/codegenNativeComponent';
|
||||
import type {HostComponent} from '../../Renderer/shims/ReactNativeTypes';
|
||||
@@ -16,7 +17,8 @@ import type {HostComponent} from '../../Renderer/shims/ReactNativeTypes';
|
||||
type NativeProps = $ReadOnly<{|
|
||||
...ViewProps,
|
||||
|
||||
// No props
|
||||
// Props
|
||||
emulateUnlessSupported?: WithDefault<boolean, false>,
|
||||
|}>;
|
||||
|
||||
export default (codegenNativeComponent<NativeProps>('SafeAreaView', {
|
||||
|
||||
@@ -12,9 +12,18 @@ import Platform from '../../Utilities/Platform';
|
||||
import * as React from 'react';
|
||||
import View from '../View/View';
|
||||
|
||||
import type {HostComponent} from '../../Renderer/shims/ReactNativeTypes';
|
||||
import type {ViewProps} from '../View/ViewPropTypes';
|
||||
|
||||
let exported: React.AbstractComponent<ViewProps, React.ElementRef<typeof View>>;
|
||||
type Props = $ReadOnly<{|
|
||||
...ViewProps,
|
||||
emulateUnlessSupported?: boolean,
|
||||
|}>;
|
||||
|
||||
let exported: React.AbstractComponent<
|
||||
Props,
|
||||
React.ElementRef<HostComponent<mixed>>,
|
||||
>;
|
||||
|
||||
/**
|
||||
* Renders nested content and automatically applies paddings reflect the portion
|
||||
@@ -26,9 +35,27 @@ let exported: React.AbstractComponent<ViewProps, React.ElementRef<typeof View>>;
|
||||
* sensor housing area on iPhone X).
|
||||
*/
|
||||
if (Platform.OS === 'android') {
|
||||
exported = View;
|
||||
exported = React.forwardRef<Props, React.ElementRef<HostComponent<mixed>>>(
|
||||
function SafeAreaView(props, forwardedRef) {
|
||||
const {emulateUnlessSupported, ...localProps} = props;
|
||||
return <View {...localProps} ref={forwardedRef} />;
|
||||
},
|
||||
);
|
||||
} else {
|
||||
exported = require('./RCTSafeAreaViewNativeComponent').default;
|
||||
const RCTSafeAreaViewNativeComponent =
|
||||
require('./RCTSafeAreaViewNativeComponent').default;
|
||||
|
||||
exported = React.forwardRef<Props, React.ElementRef<HostComponent<mixed>>>(
|
||||
function SafeAreaView(props, forwardedRef) {
|
||||
return (
|
||||
<RCTSafeAreaViewNativeComponent
|
||||
emulateUnlessSupported={true}
|
||||
{...props}
|
||||
ref={forwardedRef}
|
||||
/>
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
export default exported;
|
||||
|
||||
+10
-6
@@ -1,7 +1,9 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`<SafeAreaView /> should render as expected: should deep render when mocked (please verify output manually) 1`] = `
|
||||
<RCTSafeAreaView>
|
||||
<RCTSafeAreaView
|
||||
emulateUnlessSupported={true}
|
||||
>
|
||||
<View>
|
||||
<Text>
|
||||
Hello World!
|
||||
@@ -11,7 +13,9 @@ exports[`<SafeAreaView /> should render as expected: should deep render when moc
|
||||
`;
|
||||
|
||||
exports[`<SafeAreaView /> should render as expected: should deep render when not mocked (please verify output manually) 1`] = `
|
||||
<RCTSafeAreaView>
|
||||
<RCTSafeAreaView
|
||||
emulateUnlessSupported={true}
|
||||
>
|
||||
<View>
|
||||
<Text>
|
||||
Hello World!
|
||||
@@ -21,21 +25,21 @@ exports[`<SafeAreaView /> should render as expected: should deep render when not
|
||||
`;
|
||||
|
||||
exports[`<SafeAreaView /> should render as expected: should shallow render as <SafeAreaView /> when mocked 1`] = `
|
||||
<RCTSafeAreaView>
|
||||
<ForwardRef(SafeAreaView)>
|
||||
<View>
|
||||
<Text>
|
||||
Hello World!
|
||||
</Text>
|
||||
</View>
|
||||
</RCTSafeAreaView>
|
||||
</ForwardRef(SafeAreaView)>
|
||||
`;
|
||||
|
||||
exports[`<SafeAreaView /> should render as expected: should shallow render as <SafeAreaView /> when not mocked 1`] = `
|
||||
<RCTSafeAreaView>
|
||||
<ForwardRef(SafeAreaView)>
|
||||
<View>
|
||||
<Text>
|
||||
Hello World!
|
||||
</Text>
|
||||
</View>
|
||||
</RCTSafeAreaView>
|
||||
</ForwardRef(SafeAreaView)>
|
||||
`;
|
||||
|
||||
@@ -9,55 +9,46 @@
|
||||
*/
|
||||
|
||||
import type {ScrollViewNativeProps as Props} from './ScrollViewNativeComponentType';
|
||||
import type {
|
||||
HostComponent,
|
||||
PartialViewConfig,
|
||||
} from '../../Renderer/shims/ReactNativeTypes';
|
||||
import type {HostComponent} from '../../Renderer/shims/ReactNativeTypes';
|
||||
import * as NativeComponentRegistry from '../../NativeComponent/NativeComponentRegistry';
|
||||
|
||||
export const __INTERNAL_VIEW_CONFIG: PartialViewConfig = {
|
||||
uiViewClassName: 'AndroidHorizontalScrollView',
|
||||
bubblingEventTypes: {},
|
||||
directEventTypes: {},
|
||||
validAttributes: {
|
||||
decelerationRate: true,
|
||||
disableIntervalMomentum: true,
|
||||
endFillColor: {process: require('../../StyleSheet/processColor')},
|
||||
fadingEdgeLength: true,
|
||||
nestedScrollEnabled: true,
|
||||
overScrollMode: true,
|
||||
pagingEnabled: true,
|
||||
persistentScrollbar: true,
|
||||
scrollEnabled: true,
|
||||
scrollPerfTag: true,
|
||||
sendMomentumEvents: true,
|
||||
showsHorizontalScrollIndicator: true,
|
||||
snapToAlignment: true,
|
||||
snapToEnd: true,
|
||||
snapToInterval: true,
|
||||
snapToStart: true,
|
||||
snapToOffsets: true,
|
||||
contentOffset: true,
|
||||
borderBottomLeftRadius: true,
|
||||
borderBottomRightRadius: true,
|
||||
borderRadius: true,
|
||||
borderStyle: true,
|
||||
borderRightColor: {process: require('../../StyleSheet/processColor')},
|
||||
borderColor: {process: require('../../StyleSheet/processColor')},
|
||||
borderBottomColor: {process: require('../../StyleSheet/processColor')},
|
||||
borderTopLeftRadius: true,
|
||||
borderTopColor: {process: require('../../StyleSheet/processColor')},
|
||||
removeClippedSubviews: true,
|
||||
borderTopRightRadius: true,
|
||||
borderLeftColor: {process: require('../../StyleSheet/processColor')},
|
||||
pointerEvents: true,
|
||||
},
|
||||
};
|
||||
|
||||
const AndroidHorizontalScrollViewNativeComponent: HostComponent<Props> =
|
||||
NativeComponentRegistry.get<Props>(
|
||||
'AndroidHorizontalScrollView',
|
||||
() => __INTERNAL_VIEW_CONFIG,
|
||||
);
|
||||
NativeComponentRegistry.get<Props>('AndroidHorizontalScrollView', () => ({
|
||||
uiViewClassName: 'AndroidHorizontalScrollView',
|
||||
bubblingEventTypes: {},
|
||||
directEventTypes: {},
|
||||
validAttributes: {
|
||||
decelerationRate: true,
|
||||
disableIntervalMomentum: true,
|
||||
endFillColor: {process: require('../../StyleSheet/processColor')},
|
||||
fadingEdgeLength: true,
|
||||
nestedScrollEnabled: true,
|
||||
overScrollMode: true,
|
||||
pagingEnabled: true,
|
||||
persistentScrollbar: true,
|
||||
scrollEnabled: true,
|
||||
scrollPerfTag: true,
|
||||
sendMomentumEvents: true,
|
||||
showsHorizontalScrollIndicator: true,
|
||||
snapToAlignment: true,
|
||||
snapToEnd: true,
|
||||
snapToInterval: true,
|
||||
snapToStart: true,
|
||||
snapToOffsets: true,
|
||||
contentOffset: true,
|
||||
borderBottomLeftRadius: true,
|
||||
borderBottomRightRadius: true,
|
||||
borderRadius: true,
|
||||
borderStyle: true,
|
||||
borderRightColor: {process: require('../../StyleSheet/processColor')},
|
||||
borderColor: {process: require('../../StyleSheet/processColor')},
|
||||
borderBottomColor: {process: require('../../StyleSheet/processColor')},
|
||||
borderTopLeftRadius: true,
|
||||
borderTopColor: {process: require('../../StyleSheet/processColor')},
|
||||
removeClippedSubviews: true,
|
||||
borderTopRightRadius: true,
|
||||
borderLeftColor: {process: require('../../StyleSheet/processColor')},
|
||||
},
|
||||
}));
|
||||
|
||||
export default AndroidHorizontalScrollViewNativeComponent;
|
||||
|
||||
@@ -8,24 +8,16 @@
|
||||
* @flow
|
||||
*/
|
||||
|
||||
import type {
|
||||
HostComponent,
|
||||
PartialViewConfig,
|
||||
} from '../../Renderer/shims/ReactNativeTypes';
|
||||
import type {HostComponent} from '../../Renderer/shims/ReactNativeTypes';
|
||||
import * as NativeComponentRegistry from '../../NativeComponent/NativeComponentRegistry';
|
||||
import type {ViewProps as Props} from '../View/ViewPropTypes';
|
||||
|
||||
export const __INTERNAL_VIEW_CONFIG: PartialViewConfig = {
|
||||
uiViewClassName: 'RCTScrollContentView',
|
||||
bubblingEventTypes: {},
|
||||
directEventTypes: {},
|
||||
validAttributes: {},
|
||||
};
|
||||
|
||||
const ScrollContentViewNativeComponent: HostComponent<Props> =
|
||||
NativeComponentRegistry.get<Props>(
|
||||
'RCTScrollContentView',
|
||||
() => __INTERNAL_VIEW_CONFIG,
|
||||
);
|
||||
NativeComponentRegistry.get<Props>('RCTScrollContentView', () => ({
|
||||
uiViewClassName: 'RCTScrollContentView',
|
||||
bubblingEventTypes: {},
|
||||
directEventTypes: {},
|
||||
validAttributes: {},
|
||||
}));
|
||||
|
||||
export default ScrollContentViewNativeComponent;
|
||||
|
||||
@@ -42,7 +42,7 @@ import type {HostComponent} from '../../Renderer/shims/ReactNativeTypes';
|
||||
import type {ViewProps} from '../View/ViewPropTypes';
|
||||
import ScrollViewContext, {HORIZONTAL, VERTICAL} from './ScrollViewContext';
|
||||
import type {Props as ScrollViewStickyHeaderProps} from './ScrollViewStickyHeader';
|
||||
import type {KeyboardEvent, KeyboardMetrics} from '../Keyboard/Keyboard';
|
||||
import type {KeyboardEvent} from '../Keyboard/Keyboard';
|
||||
import type {EventSubscription} from '../../vendor/emitter/EventEmitter';
|
||||
|
||||
import Commands from './ScrollViewCommands';
|
||||
@@ -173,8 +173,8 @@ type IOSProps = $ReadOnly<{|
|
||||
*/
|
||||
automaticallyAdjustContentInsets?: ?boolean,
|
||||
/**
|
||||
* Controls whether the ScrollView should automatically adjust its `contentInset`
|
||||
* and `scrollViewInsets` when the Keyboard changes its size. The default value is false.
|
||||
* Controls whether the ScrollView should automatically adjust it's contentInset
|
||||
* and scrollViewInsets when the Keyboard changes it's size. The default value is false.
|
||||
* @platform ios
|
||||
*/
|
||||
automaticallyAdjustKeyboardInsets?: ?boolean,
|
||||
@@ -190,6 +190,12 @@ type IOSProps = $ReadOnly<{|
|
||||
* @platform ios
|
||||
*/
|
||||
contentInset?: ?EdgeInsetsProp,
|
||||
/**
|
||||
* Used to manually set the starting scroll offset.
|
||||
* The default value is `{x: 0, y: 0}`.
|
||||
* @platform ios
|
||||
*/
|
||||
contentOffset?: ?PointProp,
|
||||
/**
|
||||
* When true, the scroll view bounces when it reaches the end of the
|
||||
* content if the content is larger then the scroll view along the axis of
|
||||
@@ -451,11 +457,6 @@ export type Props = $ReadOnly<{|
|
||||
* ```
|
||||
*/
|
||||
contentContainerStyle?: ?ViewStyleProp,
|
||||
/**
|
||||
* Used to manually set the starting scroll offset.
|
||||
* The default value is `{x: 0, y: 0}`.
|
||||
*/
|
||||
contentOffset?: ?PointProp,
|
||||
/**
|
||||
* When true, the scroll view stops on the next index (in relation to scroll
|
||||
* position at release) regardless of how fast the gesture is. This can be
|
||||
@@ -674,7 +675,7 @@ type State = {|
|
||||
|
||||
const IS_ANIMATING_TOUCH_START_THRESHOLD_MS = 16;
|
||||
|
||||
export type ScrollViewComponentStatics = $ReadOnly<{|
|
||||
type ScrollViewComponentStatics = $ReadOnly<{|
|
||||
Context: typeof ScrollViewContext,
|
||||
|}>;
|
||||
|
||||
@@ -731,7 +732,7 @@ class ScrollView extends React.Component<Props, State> {
|
||||
new Map();
|
||||
_headerLayoutYs: Map<string, number> = new Map();
|
||||
|
||||
_keyboardMetrics: ?KeyboardMetrics = null;
|
||||
_keyboardWillOpenTo: ?KeyboardEvent = null;
|
||||
_additionalScrollOffset: number = 0;
|
||||
_isTouching: boolean = false;
|
||||
_lastMomentumScrollBeginTime: number = 0;
|
||||
@@ -769,7 +770,7 @@ class ScrollView extends React.Component<Props, State> {
|
||||
);
|
||||
}
|
||||
|
||||
this._keyboardMetrics = Keyboard.metrics();
|
||||
this._keyboardWillOpenTo = null;
|
||||
this._additionalScrollOffset = 0;
|
||||
|
||||
this._subscriptionKeyboardWillShow = Keyboard.addListener(
|
||||
@@ -1075,8 +1076,8 @@ class ScrollView extends React.Component<Props, State> {
|
||||
let keyboardScreenY = Dimensions.get('window').height;
|
||||
|
||||
const scrollTextInputIntoVisibleRect = () => {
|
||||
if (this._keyboardMetrics != null) {
|
||||
keyboardScreenY = this._keyboardMetrics.screenY;
|
||||
if (this._keyboardWillOpenTo != null) {
|
||||
keyboardScreenY = this._keyboardWillOpenTo.endCoordinates.screenY;
|
||||
}
|
||||
let scrollOffsetY =
|
||||
top - keyboardScreenY + height + this._additionalScrollOffset;
|
||||
@@ -1094,8 +1095,8 @@ class ScrollView extends React.Component<Props, State> {
|
||||
this._preventNegativeScrollOffset = false;
|
||||
};
|
||||
|
||||
if (this._keyboardMetrics == null) {
|
||||
// `_keyboardMetrics` is set inside `scrollResponderKeyboardWillShow` which
|
||||
if (this._keyboardWillOpenTo == null) {
|
||||
// `_keyboardWillOpenTo` is set inside `scrollResponderKeyboardWillShow` which
|
||||
// is not guaranteed to be called before `_inputMeasureAndScrollToKeyboard` but native has already scheduled it.
|
||||
// In case it was not called before `_inputMeasureAndScrollToKeyboard`, we postpone scrolling to
|
||||
// text input.
|
||||
@@ -1107,7 +1108,7 @@ class ScrollView extends React.Component<Props, State> {
|
||||
}
|
||||
};
|
||||
|
||||
_getKeyForIndex(index: $FlowFixMe, childArray: $FlowFixMe) {
|
||||
_getKeyForIndex(index, childArray) {
|
||||
const child = childArray[index];
|
||||
return child && child.key;
|
||||
}
|
||||
@@ -1140,7 +1141,7 @@ class ScrollView extends React.Component<Props, State> {
|
||||
}
|
||||
}
|
||||
|
||||
_onStickyHeaderLayout(index: $FlowFixMe, event: $FlowFixMe, key: $FlowFixMe) {
|
||||
_onStickyHeaderLayout(index, event, key) {
|
||||
const {stickyHeaderIndices} = this.props;
|
||||
if (!stickyHeaderIndices) {
|
||||
return;
|
||||
@@ -1243,28 +1244,32 @@ class ScrollView extends React.Component<Props, State> {
|
||||
scrollResponderKeyboardWillShow: (e: KeyboardEvent) => void = (
|
||||
e: KeyboardEvent,
|
||||
) => {
|
||||
this._keyboardMetrics = e.endCoordinates;
|
||||
this._keyboardWillOpenTo = e;
|
||||
this.props.onKeyboardWillShow && this.props.onKeyboardWillShow(e);
|
||||
};
|
||||
|
||||
scrollResponderKeyboardWillHide: (e: KeyboardEvent) => void = (
|
||||
e: KeyboardEvent,
|
||||
) => {
|
||||
this._keyboardMetrics = null;
|
||||
this._keyboardWillOpenTo = null;
|
||||
this.props.onKeyboardWillHide && this.props.onKeyboardWillHide(e);
|
||||
};
|
||||
|
||||
scrollResponderKeyboardDidShow: (e: KeyboardEvent) => void = (
|
||||
e: KeyboardEvent,
|
||||
) => {
|
||||
this._keyboardMetrics = e.endCoordinates;
|
||||
// TODO(7693961): The event for DidShow is not available on iOS yet.
|
||||
// Use the one from WillShow and do not assign.
|
||||
if (e) {
|
||||
this._keyboardWillOpenTo = e;
|
||||
}
|
||||
this.props.onKeyboardDidShow && this.props.onKeyboardDidShow(e);
|
||||
};
|
||||
|
||||
scrollResponderKeyboardDidHide: (e: KeyboardEvent) => void = (
|
||||
e: KeyboardEvent,
|
||||
) => {
|
||||
this._keyboardMetrics = null;
|
||||
this._keyboardWillOpenTo = null;
|
||||
this.props.onKeyboardDidHide && this.props.onKeyboardDidHide(e);
|
||||
};
|
||||
|
||||
@@ -1514,7 +1519,6 @@ class ScrollView extends React.Component<Props, State> {
|
||||
keyboardNeverPersistTaps &&
|
||||
this._keyboardIsDismissible() &&
|
||||
e.target != null &&
|
||||
// $FlowFixMe[incompatible-call]
|
||||
!TextInputState.isTextInput(e.target)
|
||||
) {
|
||||
return true;
|
||||
@@ -1543,7 +1547,7 @@ class ScrollView extends React.Component<Props, State> {
|
||||
// keyboard, except on Android where setting windowSoftInputMode to
|
||||
// adjustNone leads to missing keyboard events.
|
||||
const softKeyboardMayBeOpen =
|
||||
this._keyboardMetrics != null || Platform.OS === 'android';
|
||||
this._keyboardWillOpenTo != null || Platform.OS === 'android';
|
||||
|
||||
return hasFocusedTextInput && softKeyboardMayBeOpen;
|
||||
};
|
||||
@@ -1818,9 +1822,7 @@ const styles = StyleSheet.create({
|
||||
},
|
||||
});
|
||||
|
||||
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
|
||||
* LTI update could not be added via codemod */
|
||||
function Wrapper(props, ref: (mixed => mixed) | {current: mixed, ...}) {
|
||||
function Wrapper(props, ref) {
|
||||
return <ScrollView {...props} scrollViewRef={ref} />;
|
||||
}
|
||||
Wrapper.displayName = 'ScrollView';
|
||||
|
||||
@@ -9,15 +9,11 @@
|
||||
*/
|
||||
|
||||
import type {ScrollViewNativeProps as Props} from './ScrollViewNativeComponentType';
|
||||
import type {
|
||||
HostComponent,
|
||||
PartialViewConfig,
|
||||
} from '../../Renderer/shims/ReactNativeTypes';
|
||||
import type {HostComponent} from '../../Renderer/shims/ReactNativeTypes';
|
||||
import * as NativeComponentRegistry from '../../NativeComponent/NativeComponentRegistry';
|
||||
import {ConditionallyIgnoredEventHandlers} from '../../NativeComponent/ViewConfigIgnore';
|
||||
import Platform from '../../Utilities/Platform';
|
||||
|
||||
export const __INTERNAL_VIEW_CONFIG: PartialViewConfig =
|
||||
const RCTScrollViewViewConfig =
|
||||
Platform.OS === 'android'
|
||||
? {
|
||||
uiViewClassName: 'RCTScrollView',
|
||||
@@ -74,7 +70,6 @@ export const __INTERNAL_VIEW_CONFIG: PartialViewConfig =
|
||||
removeClippedSubviews: true,
|
||||
borderTopRightRadius: true,
|
||||
borderLeftColor: {process: require('../../StyleSheet/processColor')},
|
||||
pointerEvents: true,
|
||||
},
|
||||
}
|
||||
: {
|
||||
@@ -143,21 +138,13 @@ export const __INTERNAL_VIEW_CONFIG: PartialViewConfig =
|
||||
snapToOffsets: true,
|
||||
snapToStart: true,
|
||||
zoomScale: true,
|
||||
...ConditionallyIgnoredEventHandlers({
|
||||
onScrollBeginDrag: true,
|
||||
onMomentumScrollEnd: true,
|
||||
onScrollEndDrag: true,
|
||||
onMomentumScrollBegin: true,
|
||||
onScrollToTop: true,
|
||||
onScroll: true,
|
||||
}),
|
||||
},
|
||||
};
|
||||
|
||||
const ScrollViewNativeComponent: HostComponent<Props> =
|
||||
NativeComponentRegistry.get<Props>(
|
||||
'RCTScrollView',
|
||||
() => __INTERNAL_VIEW_CONFIG,
|
||||
() => RCTScrollViewViewConfig,
|
||||
);
|
||||
|
||||
export default ScrollViewNativeComponent;
|
||||
|
||||
@@ -90,7 +90,7 @@ class ScrollViewStickyHeader extends React.Component<Props, State> {
|
||||
}
|
||||
|
||||
updateTranslateListener(
|
||||
translateY: AnimatedNode,
|
||||
translateY: AnimatedImplementation.Interpolation,
|
||||
isFabric: boolean,
|
||||
offset: AnimatedDiffClamp | null,
|
||||
) {
|
||||
@@ -170,15 +170,11 @@ class ScrollViewStickyHeader extends React.Component<Props, State> {
|
||||
|
||||
this.props.onLayout(event);
|
||||
const child = React.Children.only(this.props.children);
|
||||
if (child.props.onCellLayout) {
|
||||
child.props.onCellLayout(event, child.props.cellKey, child.props.index);
|
||||
} else if (child.props.onLayout) {
|
||||
if (child.props.onLayout) {
|
||||
child.props.onLayout(event);
|
||||
}
|
||||
};
|
||||
|
||||
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
|
||||
* LTI update could not be added via codemod */
|
||||
_setComponentRef = ref => {
|
||||
this._ref = ref;
|
||||
};
|
||||
@@ -276,11 +272,11 @@ class ScrollViewStickyHeader extends React.Component<Props, State> {
|
||||
.interpolate({
|
||||
extrapolateLeft: 'clamp',
|
||||
inputRange: [layoutY, layoutY + 1],
|
||||
outputRange: [0, 1],
|
||||
outputRange: ([0, 1]: Array<number>),
|
||||
})
|
||||
.interpolate({
|
||||
inputRange: [0, 1],
|
||||
outputRange: [0, -1],
|
||||
outputRange: ([0, -1]: Array<number>),
|
||||
}),
|
||||
-this.state.layoutHeight,
|
||||
0,
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @flow strict-local
|
||||
* @format
|
||||
*/
|
||||
|
||||
import codegenNativeComponent from '../../Utilities/codegenNativeComponent';
|
||||
import type {HostComponent} from '../../Renderer/shims/ReactNativeTypes';
|
||||
import type {ViewProps} from '../View/ViewPropTypes';
|
||||
import type {
|
||||
BubblingEventHandler,
|
||||
WithDefault,
|
||||
Int32,
|
||||
} from '../../Types/CodegenTypes';
|
||||
import type {ColorValue} from '../../StyleSheet/StyleSheet';
|
||||
|
||||
export type OnChangeEvent = $ReadOnly<{|
|
||||
value: Int32,
|
||||
selectedSegmentIndex: Int32,
|
||||
|}>;
|
||||
|
||||
type NativeProps = $ReadOnly<{|
|
||||
...ViewProps,
|
||||
|
||||
// Props
|
||||
values?: $ReadOnlyArray<string>,
|
||||
selectedIndex?: WithDefault<Int32, 0>,
|
||||
enabled?: WithDefault<boolean, true>,
|
||||
tintColor?: ?ColorValue,
|
||||
textColor?: ?ColorValue,
|
||||
backgroundColor?: ?ColorValue,
|
||||
momentary?: WithDefault<boolean, false>,
|
||||
|
||||
// Events
|
||||
onChange?: ?BubblingEventHandler<OnChangeEvent>,
|
||||
|}>;
|
||||
|
||||
export default (codegenNativeComponent<NativeProps>(
|
||||
'RCTSegmentedControl',
|
||||
): HostComponent<NativeProps>);
|
||||
@@ -0,0 +1,45 @@
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @format
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
import * as React from 'react';
|
||||
import StyleSheet from '../../StyleSheet/StyleSheet';
|
||||
import Text from '../../Text/Text';
|
||||
import View from '../View/View';
|
||||
|
||||
class DummySegmentedControlIOS extends React.Component {
|
||||
render() {
|
||||
return (
|
||||
<View style={[styles.dummy, this.props.style]}>
|
||||
<Text style={styles.text}>
|
||||
SegmentedControlIOS is not supported on this platform!
|
||||
</Text>
|
||||
</View>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
dummy: {
|
||||
width: 120,
|
||||
height: 50,
|
||||
backgroundColor: '#ffbcbc',
|
||||
borderWidth: 1,
|
||||
borderColor: 'red',
|
||||
alignItems: 'center',
|
||||
justifyContent: 'center',
|
||||
},
|
||||
text: {
|
||||
color: '#333333',
|
||||
margin: 5,
|
||||
fontSize: 10,
|
||||
},
|
||||
});
|
||||
|
||||
module.exports = DummySegmentedControlIOS;
|
||||
@@ -0,0 +1,123 @@
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @format
|
||||
* @flow strict-local
|
||||
*/
|
||||
|
||||
import * as React from 'react';
|
||||
import StyleSheet from '../../StyleSheet/StyleSheet';
|
||||
import type {OnChangeEvent} from './RCTSegmentedControlNativeComponent';
|
||||
import type {ViewProps} from '../View/ViewPropTypes';
|
||||
import RCTSegmentedControlNativeComponent from './RCTSegmentedControlNativeComponent';
|
||||
import type {SyntheticEvent} from 'react-native/Libraries/Types/CoreEventTypes';
|
||||
|
||||
type SegmentedControlIOSProps = $ReadOnly<{|
|
||||
...ViewProps,
|
||||
/**
|
||||
* The labels for the control's segment buttons, in order.
|
||||
*
|
||||
* The default value is an empty array.
|
||||
*/
|
||||
values?: $ReadOnlyArray<string>,
|
||||
/**
|
||||
* The index in `props.values` of the segment to be (pre)selected.
|
||||
*/
|
||||
selectedIndex?: ?number,
|
||||
/**
|
||||
* If false the user won't be able to interact with the control.
|
||||
*
|
||||
* The default value is true.
|
||||
*/
|
||||
enabled?: boolean,
|
||||
/**
|
||||
* Accent color of the control.
|
||||
*/
|
||||
tintColor?: ?string,
|
||||
/**
|
||||
* If true, then selecting a segment won't persist visually.
|
||||
* The `onValueChange` callback will still work as expected.
|
||||
*/
|
||||
momentary?: ?boolean,
|
||||
/**
|
||||
* Callback that is called when the user taps a segment
|
||||
*/
|
||||
onChange?: ?(event: SyntheticEvent<OnChangeEvent>) => void,
|
||||
/**
|
||||
* Callback that is called when the user taps a segment;
|
||||
* passes the segment's value as an argument
|
||||
*/
|
||||
onValueChange?: ?(value: number) => mixed,
|
||||
|}>;
|
||||
|
||||
type Props = $ReadOnly<{|
|
||||
...SegmentedControlIOSProps,
|
||||
forwardedRef: ?React.Ref<typeof RCTSegmentedControlNativeComponent>,
|
||||
|}>;
|
||||
|
||||
/**
|
||||
* Use `SegmentedControlIOS` to render a UISegmentedControl iOS.
|
||||
*
|
||||
* #### Programmatically changing selected index
|
||||
*
|
||||
* The selected index can be changed on the fly by assigning the
|
||||
* selectedIndex prop to a state variable, then changing that variable.
|
||||
* Note that the state variable would need to be updated as the user
|
||||
* selects a value and changes the index, as shown in the example below.
|
||||
*
|
||||
* ````
|
||||
* <SegmentedControlIOS
|
||||
* values={['One', 'Two']}
|
||||
* selectedIndex={this.state.selectedIndex}
|
||||
* onChange={(event) => {
|
||||
* this.setState({selectedIndex: event.nativeEvent.selectedSegmentIndex});
|
||||
* }}
|
||||
* />
|
||||
* ````
|
||||
*/
|
||||
|
||||
class SegmentedControlIOS extends React.Component<Props> {
|
||||
_onChange = (event: SyntheticEvent<OnChangeEvent>) => {
|
||||
this.props.onChange && this.props.onChange(event);
|
||||
this.props.onValueChange &&
|
||||
this.props.onValueChange(event.nativeEvent.value);
|
||||
};
|
||||
|
||||
render() {
|
||||
const {enabled, forwardedRef, onValueChange, style, values, ...props} =
|
||||
this.props;
|
||||
return (
|
||||
<RCTSegmentedControlNativeComponent
|
||||
{...props}
|
||||
ref={forwardedRef}
|
||||
style={[styles.segmentedControl, style]}
|
||||
enabled={enabled !== false}
|
||||
values={values ?? []}
|
||||
onChange={this._onChange}
|
||||
/>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
segmentedControl: {
|
||||
height: 28,
|
||||
},
|
||||
});
|
||||
|
||||
const SegmentedControlIOSWithRef = React.forwardRef(
|
||||
(
|
||||
props: SegmentedControlIOSProps,
|
||||
forwardedRef: ?React.Ref<typeof RCTSegmentedControlNativeComponent>,
|
||||
) => {
|
||||
return <SegmentedControlIOS {...props} forwardedRef={forwardedRef} />;
|
||||
},
|
||||
);
|
||||
|
||||
/* $FlowFixMe[cannot-resolve-name] (>=0.89.0 site=react_native_ios_fb) This
|
||||
* comment suppresses an error found when Flow v0.89 was deployed. To see the
|
||||
* error, delete this comment and run Flow. */
|
||||
module.exports = (SegmentedControlIOSWithRef: NativeSegmentedControlIOS);
|
||||
@@ -0,0 +1,55 @@
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+react_native
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const React = require('react');
|
||||
const ReactTestRenderer = require('react-test-renderer');
|
||||
|
||||
const SegmentedControlIOS = require('../SegmentedControlIOS.ios');
|
||||
|
||||
describe('SegmentedControlIOS', () => {
|
||||
it('renders the segmented control', () => {
|
||||
const component = ReactTestRenderer.create(<SegmentedControlIOS />);
|
||||
expect(component).not.toBeNull();
|
||||
});
|
||||
it('renders the segmented control with enabled default value', () => {
|
||||
const component = ReactTestRenderer.create(<SegmentedControlIOS />);
|
||||
expect(component.toTree().rendered.props.enabled).toBe(true);
|
||||
expect(component).toMatchSnapshot();
|
||||
});
|
||||
it('renders the segmented control with enabled', () => {
|
||||
const component = ReactTestRenderer.create(
|
||||
<SegmentedControlIOS enabled={true} />,
|
||||
);
|
||||
expect(component.toTree().rendered.props.enabled).toBe(true);
|
||||
expect(component).toMatchSnapshot();
|
||||
});
|
||||
it('renders the segmented control with enabled set to false', () => {
|
||||
const component = ReactTestRenderer.create(
|
||||
<SegmentedControlIOS enabled={false} />,
|
||||
);
|
||||
expect(component.toTree().rendered.props.enabled).toBe(false);
|
||||
expect(component).toMatchSnapshot();
|
||||
});
|
||||
it('renders the segmented control with values default value', () => {
|
||||
const component = ReactTestRenderer.create(<SegmentedControlIOS />);
|
||||
expect(component.toTree().rendered.props.values).toEqual([]);
|
||||
expect(component).toMatchSnapshot();
|
||||
});
|
||||
it('renders the segmented control with values', () => {
|
||||
const values = ['One', 'Two'];
|
||||
const component = ReactTestRenderer.create(
|
||||
<SegmentedControlIOS values={values} />,
|
||||
);
|
||||
expect(component.toTree().rendered.props.values).toBe(values);
|
||||
expect(component).toMatchSnapshot();
|
||||
});
|
||||
});
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`SegmentedControlIOS renders the segmented control with enabled 1`] = `
|
||||
<RCTSegmentedControl
|
||||
enabled={true}
|
||||
onChange={[Function]}
|
||||
style={
|
||||
Array [
|
||||
Object {
|
||||
"height": 28,
|
||||
},
|
||||
undefined,
|
||||
]
|
||||
}
|
||||
values={Array []}
|
||||
/>
|
||||
`;
|
||||
|
||||
exports[`SegmentedControlIOS renders the segmented control with enabled default value 1`] = `
|
||||
<RCTSegmentedControl
|
||||
enabled={true}
|
||||
onChange={[Function]}
|
||||
style={
|
||||
Array [
|
||||
Object {
|
||||
"height": 28,
|
||||
},
|
||||
undefined,
|
||||
]
|
||||
}
|
||||
values={Array []}
|
||||
/>
|
||||
`;
|
||||
|
||||
exports[`SegmentedControlIOS renders the segmented control with enabled set to false 1`] = `
|
||||
<RCTSegmentedControl
|
||||
enabled={false}
|
||||
onChange={[Function]}
|
||||
style={
|
||||
Array [
|
||||
Object {
|
||||
"height": 28,
|
||||
},
|
||||
undefined,
|
||||
]
|
||||
}
|
||||
values={Array []}
|
||||
/>
|
||||
`;
|
||||
|
||||
exports[`SegmentedControlIOS renders the segmented control with values 1`] = `
|
||||
<RCTSegmentedControl
|
||||
enabled={true}
|
||||
onChange={[Function]}
|
||||
style={
|
||||
Array [
|
||||
Object {
|
||||
"height": 28,
|
||||
},
|
||||
undefined,
|
||||
]
|
||||
}
|
||||
values={
|
||||
Array [
|
||||
"One",
|
||||
"Two",
|
||||
]
|
||||
}
|
||||
/>
|
||||
`;
|
||||
|
||||
exports[`SegmentedControlIOS renders the segmented control with values default value 1`] = `
|
||||
<RCTSegmentedControl
|
||||
enabled={true}
|
||||
onChange={[Function]}
|
||||
style={
|
||||
Array [
|
||||
Object {
|
||||
"height": 28,
|
||||
},
|
||||
undefined,
|
||||
]
|
||||
}
|
||||
values={Array []}
|
||||
/>
|
||||
`;
|
||||
@@ -228,6 +228,7 @@ const Slider = (
|
||||
}
|
||||
: null;
|
||||
|
||||
const onChangeEvent = onValueChangeEvent;
|
||||
const onSlidingCompleteEvent = onSlidingComplete
|
||||
? (event: Event) => {
|
||||
onSlidingComplete(event.nativeEvent.value);
|
||||
@@ -249,6 +250,7 @@ const Slider = (
|
||||
disabled={disabled}
|
||||
maximumValue={maximumValue}
|
||||
minimumValue={minimumValue}
|
||||
onChange={onChangeEvent}
|
||||
onResponderTerminationRequest={() => false}
|
||||
onSlidingComplete={onSlidingCompleteEvent}
|
||||
onStartShouldSetResponder={() => true}
|
||||
|
||||
@@ -47,6 +47,7 @@ type NativeProps = $ReadOnly<{|
|
||||
value?: WithDefault<Double, 0>,
|
||||
|
||||
// Events
|
||||
onChange?: ?BubblingEventHandler<Event>,
|
||||
onValueChange?: ?BubblingEventHandler<Event>,
|
||||
onSlidingComplete?: ?DirectEventHandler<Event>,
|
||||
|}>;
|
||||
|
||||
@@ -112,17 +112,14 @@ function mergePropsStack(
|
||||
propsStack: Array<Object>,
|
||||
defaultValues: Object,
|
||||
): Object {
|
||||
return propsStack.reduce(
|
||||
(prev, cur) => {
|
||||
for (const prop in cur) {
|
||||
if (cur[prop] != null) {
|
||||
prev[prop] = cur[prop];
|
||||
}
|
||||
return propsStack.reduce((prev, cur) => {
|
||||
for (const prop in cur) {
|
||||
if (cur[prop] != null) {
|
||||
prev[prop] = cur[prop];
|
||||
}
|
||||
return prev;
|
||||
},
|
||||
{...defaultValues},
|
||||
);
|
||||
}
|
||||
return prev;
|
||||
}, Object.assign({}, defaultValues));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -474,12 +471,7 @@ class StatusBar extends React.Component<Props> {
|
||||
if (!oldProps || oldProps.hidden.value !== mergedProps.hidden.value) {
|
||||
NativeStatusBarManagerAndroid.setHidden(mergedProps.hidden.value);
|
||||
}
|
||||
// Activities are not translucent by default, so always set if true.
|
||||
if (
|
||||
!oldProps ||
|
||||
oldProps.translucent !== mergedProps.translucent ||
|
||||
mergedProps.translucent
|
||||
) {
|
||||
if (!oldProps || oldProps.translucent !== mergedProps.translucent) {
|
||||
NativeStatusBarManagerAndroid.setTranslucent(mergedProps.translucent);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -185,18 +185,8 @@ const SwitchWithForwardedRef: React.AbstractComponent<
|
||||
}, [value, native]);
|
||||
|
||||
if (Platform.OS === 'android') {
|
||||
const {accessibilityState} = restProps;
|
||||
const _disabled =
|
||||
disabled != null ? disabled : accessibilityState?.disabled;
|
||||
|
||||
const _accessibilityState =
|
||||
_disabled !== accessibilityState?.disabled
|
||||
? {...accessibilityState, disabled: _disabled}
|
||||
: accessibilityState;
|
||||
|
||||
const platformProps = {
|
||||
accessibilityState: _accessibilityState,
|
||||
enabled: _disabled !== true,
|
||||
enabled: disabled !== true,
|
||||
on: value === true,
|
||||
style,
|
||||
thumbTintColor: thumbColor,
|
||||
|
||||
@@ -17,10 +17,7 @@ import type {
|
||||
Int32,
|
||||
WithDefault,
|
||||
} from '../../Types/CodegenTypes';
|
||||
import type {
|
||||
HostComponent,
|
||||
PartialViewConfig,
|
||||
} from '../../Renderer/shims/ReactNativeTypes';
|
||||
import type {HostComponent} from '../../Renderer/shims/ReactNativeTypes';
|
||||
import type {
|
||||
TextStyleProp,
|
||||
ViewStyleProp,
|
||||
@@ -596,125 +593,123 @@ export const Commands: NativeCommands = codegenNativeCommands<NativeCommands>({
|
||||
supportedCommands: ['focus', 'blur', 'setTextAndSelection'],
|
||||
});
|
||||
|
||||
export const __INTERNAL_VIEW_CONFIG: PartialViewConfig = {
|
||||
uiViewClassName: 'AndroidTextInput',
|
||||
bubblingEventTypes: {
|
||||
topBlur: {
|
||||
phasedRegistrationNames: {
|
||||
bubbled: 'onBlur',
|
||||
captured: 'onBlurCapture',
|
||||
},
|
||||
},
|
||||
topEndEditing: {
|
||||
phasedRegistrationNames: {
|
||||
bubbled: 'onEndEditing',
|
||||
captured: 'onEndEditingCapture',
|
||||
},
|
||||
},
|
||||
topFocus: {
|
||||
phasedRegistrationNames: {
|
||||
bubbled: 'onFocus',
|
||||
captured: 'onFocusCapture',
|
||||
},
|
||||
},
|
||||
topKeyPress: {
|
||||
phasedRegistrationNames: {
|
||||
bubbled: 'onKeyPress',
|
||||
captured: 'onKeyPressCapture',
|
||||
},
|
||||
},
|
||||
topSubmitEditing: {
|
||||
phasedRegistrationNames: {
|
||||
bubbled: 'onSubmitEditing',
|
||||
captured: 'onSubmitEditingCapture',
|
||||
},
|
||||
},
|
||||
topTextInput: {
|
||||
phasedRegistrationNames: {
|
||||
bubbled: 'onTextInput',
|
||||
captured: 'onTextInputCapture',
|
||||
},
|
||||
},
|
||||
},
|
||||
directEventTypes: {
|
||||
topScroll: {
|
||||
registrationName: 'onScroll',
|
||||
},
|
||||
},
|
||||
validAttributes: {
|
||||
maxFontSizeMultiplier: true,
|
||||
adjustsFontSizeToFit: true,
|
||||
minimumFontScale: true,
|
||||
autoFocus: true,
|
||||
placeholder: true,
|
||||
inlineImagePadding: true,
|
||||
contextMenuHidden: true,
|
||||
textShadowColor: {process: require('../../StyleSheet/processColor')},
|
||||
maxLength: true,
|
||||
selectTextOnFocus: true,
|
||||
textShadowRadius: true,
|
||||
underlineColorAndroid: {
|
||||
process: require('../../StyleSheet/processColor'),
|
||||
},
|
||||
textDecorationLine: true,
|
||||
blurOnSubmit: true,
|
||||
textAlignVertical: true,
|
||||
fontStyle: true,
|
||||
textShadowOffset: true,
|
||||
selectionColor: {process: require('../../StyleSheet/processColor')},
|
||||
selection: true,
|
||||
placeholderTextColor: {process: require('../../StyleSheet/processColor')},
|
||||
importantForAutofill: true,
|
||||
lineHeight: true,
|
||||
textTransform: true,
|
||||
returnKeyType: true,
|
||||
keyboardType: true,
|
||||
multiline: true,
|
||||
color: {process: require('../../StyleSheet/processColor')},
|
||||
autoComplete: true,
|
||||
numberOfLines: true,
|
||||
letterSpacing: true,
|
||||
returnKeyLabel: true,
|
||||
fontSize: true,
|
||||
onKeyPress: true,
|
||||
cursorColor: {process: require('../../StyleSheet/processColor')},
|
||||
text: true,
|
||||
showSoftInputOnFocus: true,
|
||||
textAlign: true,
|
||||
autoCapitalize: true,
|
||||
autoCorrect: true,
|
||||
caretHidden: true,
|
||||
secureTextEntry: true,
|
||||
textBreakStrategy: true,
|
||||
onScroll: true,
|
||||
onContentSizeChange: true,
|
||||
disableFullscreenUI: true,
|
||||
includeFontPadding: true,
|
||||
fontWeight: true,
|
||||
fontFamily: true,
|
||||
allowFontScaling: true,
|
||||
onSelectionChange: true,
|
||||
mostRecentEventCount: true,
|
||||
inlineImageLeft: true,
|
||||
editable: true,
|
||||
fontVariant: true,
|
||||
borderBottomRightRadius: true,
|
||||
borderBottomColor: {process: require('../../StyleSheet/processColor')},
|
||||
borderRadius: true,
|
||||
borderRightColor: {process: require('../../StyleSheet/processColor')},
|
||||
borderColor: {process: require('../../StyleSheet/processColor')},
|
||||
borderTopRightRadius: true,
|
||||
borderStyle: true,
|
||||
borderBottomLeftRadius: true,
|
||||
borderLeftColor: {process: require('../../StyleSheet/processColor')},
|
||||
borderTopLeftRadius: true,
|
||||
borderTopColor: {process: require('../../StyleSheet/processColor')},
|
||||
},
|
||||
};
|
||||
|
||||
let AndroidTextInputNativeComponent = NativeComponentRegistry.get<NativeProps>(
|
||||
'AndroidTextInput',
|
||||
() => __INTERNAL_VIEW_CONFIG,
|
||||
() => ({
|
||||
uiViewClassName: 'AndroidTextInput',
|
||||
bubblingEventTypes: {
|
||||
topBlur: {
|
||||
phasedRegistrationNames: {
|
||||
bubbled: 'onBlur',
|
||||
captured: 'onBlurCapture',
|
||||
},
|
||||
},
|
||||
topEndEditing: {
|
||||
phasedRegistrationNames: {
|
||||
bubbled: 'onEndEditing',
|
||||
captured: 'onEndEditingCapture',
|
||||
},
|
||||
},
|
||||
topFocus: {
|
||||
phasedRegistrationNames: {
|
||||
bubbled: 'onFocus',
|
||||
captured: 'onFocusCapture',
|
||||
},
|
||||
},
|
||||
topKeyPress: {
|
||||
phasedRegistrationNames: {
|
||||
bubbled: 'onKeyPress',
|
||||
captured: 'onKeyPressCapture',
|
||||
},
|
||||
},
|
||||
topSubmitEditing: {
|
||||
phasedRegistrationNames: {
|
||||
bubbled: 'onSubmitEditing',
|
||||
captured: 'onSubmitEditingCapture',
|
||||
},
|
||||
},
|
||||
topTextInput: {
|
||||
phasedRegistrationNames: {
|
||||
bubbled: 'onTextInput',
|
||||
captured: 'onTextInputCapture',
|
||||
},
|
||||
},
|
||||
},
|
||||
directEventTypes: {
|
||||
topScroll: {
|
||||
registrationName: 'onScroll',
|
||||
},
|
||||
},
|
||||
validAttributes: {
|
||||
maxFontSizeMultiplier: true,
|
||||
adjustsFontSizeToFit: true,
|
||||
minimumFontScale: true,
|
||||
autoFocus: true,
|
||||
placeholder: true,
|
||||
inlineImagePadding: true,
|
||||
contextMenuHidden: true,
|
||||
textShadowColor: {process: require('../../StyleSheet/processColor')},
|
||||
maxLength: true,
|
||||
selectTextOnFocus: true,
|
||||
textShadowRadius: true,
|
||||
underlineColorAndroid: {
|
||||
process: require('../../StyleSheet/processColor'),
|
||||
},
|
||||
textDecorationLine: true,
|
||||
blurOnSubmit: true,
|
||||
textAlignVertical: true,
|
||||
fontStyle: true,
|
||||
textShadowOffset: true,
|
||||
selectionColor: {process: require('../../StyleSheet/processColor')},
|
||||
selection: true,
|
||||
placeholderTextColor: {process: require('../../StyleSheet/processColor')},
|
||||
importantForAutofill: true,
|
||||
lineHeight: true,
|
||||
textTransform: true,
|
||||
returnKeyType: true,
|
||||
keyboardType: true,
|
||||
multiline: true,
|
||||
color: {process: require('../../StyleSheet/processColor')},
|
||||
autoComplete: true,
|
||||
numberOfLines: true,
|
||||
letterSpacing: true,
|
||||
returnKeyLabel: true,
|
||||
fontSize: true,
|
||||
onKeyPress: true,
|
||||
cursorColor: {process: require('../../StyleSheet/processColor')},
|
||||
text: true,
|
||||
showSoftInputOnFocus: true,
|
||||
textAlign: true,
|
||||
autoCapitalize: true,
|
||||
autoCorrect: true,
|
||||
caretHidden: true,
|
||||
secureTextEntry: true,
|
||||
textBreakStrategy: true,
|
||||
onScroll: true,
|
||||
onContentSizeChange: true,
|
||||
disableFullscreenUI: true,
|
||||
includeFontPadding: true,
|
||||
fontWeight: true,
|
||||
fontFamily: true,
|
||||
allowFontScaling: true,
|
||||
onSelectionChange: true,
|
||||
mostRecentEventCount: true,
|
||||
inlineImageLeft: true,
|
||||
editable: true,
|
||||
fontVariant: true,
|
||||
borderBottomRightRadius: true,
|
||||
borderBottomColor: {process: require('../../StyleSheet/processColor')},
|
||||
borderRadius: true,
|
||||
borderRightColor: {process: require('../../StyleSheet/processColor')},
|
||||
borderColor: {process: require('../../StyleSheet/processColor')},
|
||||
borderTopRightRadius: true,
|
||||
borderStyle: true,
|
||||
borderBottomLeftRadius: true,
|
||||
borderLeftColor: {process: require('../../StyleSheet/processColor')},
|
||||
borderTopLeftRadius: true,
|
||||
borderTopColor: {process: require('../../StyleSheet/processColor')},
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
// flowlint-next-line unclear-type:off
|
||||
|
||||
@@ -88,23 +88,22 @@ type Props = $ReadOnly<{|
|
||||
|
||||
class InputAccessoryView extends React.Component<Props> {
|
||||
render(): React.Node {
|
||||
if (Platform.OS === 'ios') {
|
||||
if (React.Children.count(this.props.children) === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<RCTInputAccessoryViewNativeComponent
|
||||
style={[this.props.style, styles.container]}
|
||||
nativeID={this.props.nativeID}
|
||||
backgroundColor={this.props.backgroundColor}>
|
||||
{this.props.children}
|
||||
</RCTInputAccessoryViewNativeComponent>
|
||||
);
|
||||
} else {
|
||||
if (Platform.OS !== 'ios') {
|
||||
console.warn('<InputAccessoryView> is only supported on iOS.');
|
||||
}
|
||||
|
||||
if (React.Children.count(this.props.children) === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<RCTInputAccessoryViewNativeComponent
|
||||
style={[this.props.style, styles.container]}
|
||||
nativeID={this.props.nativeID}
|
||||
backgroundColor={this.props.backgroundColor}>
|
||||
{this.props.children}
|
||||
</RCTInputAccessoryViewNativeComponent>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -8,10 +8,7 @@
|
||||
* @format
|
||||
*/
|
||||
|
||||
import type {
|
||||
HostComponent,
|
||||
PartialViewConfig,
|
||||
} from '../../Renderer/shims/ReactNativeTypes';
|
||||
import type {HostComponent} from '../../Renderer/shims/ReactNativeTypes';
|
||||
import codegenNativeCommands from '../../Utilities/codegenNativeCommands';
|
||||
import type {TextInputNativeCommands} from './TextInputNativeCommands';
|
||||
import RCTTextInputViewConfig from './RCTTextInputViewConfig';
|
||||
@@ -25,20 +22,15 @@ export const Commands: NativeCommands = codegenNativeCommands<NativeCommands>({
|
||||
supportedCommands: ['focus', 'blur', 'setTextAndSelection'],
|
||||
});
|
||||
|
||||
export const __INTERNAL_VIEW_CONFIG: PartialViewConfig = {
|
||||
uiViewClassName: 'RCTMultilineTextInputView',
|
||||
...RCTTextInputViewConfig,
|
||||
validAttributes: {
|
||||
...RCTTextInputViewConfig.validAttributes,
|
||||
dataDetectorTypes: true,
|
||||
},
|
||||
};
|
||||
|
||||
const MultilineTextInputNativeComponent: HostComponent<mixed> =
|
||||
NativeComponentRegistry.get<mixed>(
|
||||
'RCTMultilineTextInputView',
|
||||
() => __INTERNAL_VIEW_CONFIG,
|
||||
);
|
||||
NativeComponentRegistry.get<mixed>('RCTMultilineTextInputView', () => ({
|
||||
uiViewClassName: 'RCTMultilineTextInputView',
|
||||
...RCTTextInputViewConfig,
|
||||
validAttributes: {
|
||||
...RCTTextInputViewConfig.validAttributes,
|
||||
dataDetectorTypes: true,
|
||||
},
|
||||
}));
|
||||
|
||||
// flowlint-next-line unclear-type:off
|
||||
export default ((MultilineTextInputNativeComponent: any): HostComponent<mixed>);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user