From b665e598fd47d69b4ebb5175790e787a28684225 Mon Sep 17 00:00:00 2001 From: Sunny Luo Date: Fri, 12 Jun 2020 16:30:36 +0800 Subject: [PATCH 01/30] Fix wrong endBlock in text.md (#1991) --- docs/text.md | 4 ++-- website/versioned_docs/version-0.62/text.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/text.md b/docs/text.md index a11a3034a69..132bcaed2bd 100644 --- a/docs/text.md +++ b/docs/text.md @@ -102,6 +102,8 @@ const styles = StyleSheet.create({ export default TextInANest; ``` + + ## Nested text Both Android and iOS allow you to display formatted text by annotating ranges of a string with specific formatting like bold or colored text (`NSAttributedString` on iOS, `SpannableString` on Android). In practice, this is very tedious. For React Native, we decided to use web paradigm for this where you can nest text to achieve the same effect. @@ -131,8 +133,6 @@ const styles = StyleSheet.create({ export default BoldAndBeautiful; ``` - - Behind the scenes, React Native converts this to a flat `NSAttributedString` or `SpannableString` that contains the following information: ```jsx diff --git a/website/versioned_docs/version-0.62/text.md b/website/versioned_docs/version-0.62/text.md index f4e5cfab873..fef72e93905 100644 --- a/website/versioned_docs/version-0.62/text.md +++ b/website/versioned_docs/version-0.62/text.md @@ -101,6 +101,8 @@ const styles = StyleSheet.create({ }); ``` + + ## Nested text Both Android and iOS allow you to display formatted text by annotating ranges of a string with specific formatting like bold or colored text (`NSAttributedString` on iOS, `SpannableString` on Android). In practice, this is very tedious. For React Native, we decided to use web paradigm for this where you can nest text to achieve the same effect. @@ -130,8 +132,6 @@ const styles = StyleSheet.create({ export default BoldAndBeautiful; ``` - - Behind the scenes, React Native converts this to a flat `NSAttributedString` or `SpannableString` that contains the following information: ```jsx From 1b146d75a3da9c16a96b1bed6aa5b20fc1d58875 Mon Sep 17 00:00:00 2001 From: Michal Date: Sat, 13 Jun 2020 11:26:18 +0200 Subject: [PATCH 02/30] fix: update installation instructions (#1989) --- docs/getting-started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting-started.md b/docs/getting-started.md index ec1b608f2fa..63e4cc678da 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -294,7 +294,7 @@ The React Native tools require some environment variables to be set up in order -Add the following lines to your `$HOME/.bash_profile` or `$HOME/.bashrc` config file: +Add the following lines to your `$HOME/.bash_profile` or `$HOME/.bashrc` (if you are using `zsh` then `~/.zprofile` or `~/.zshrc`) config file: From 38a22f472bf451b9f1ec2ed2af3d05d829dec2a0 Mon Sep 17 00:00:00 2001 From: Rogi Solorzano <36051536+rogisolorzano@users.noreply.github.com> Date: Sat, 13 Jun 2020 04:28:18 -0500 Subject: [PATCH 03/30] Fixed DrawerLayoutAndroid padding syntax which was causing the Expo Snack to crash (#1995) --- docs/drawerlayoutandroid.md | 4 ++-- website/versioned_docs/version-0.62/drawerlayoutandroid.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/drawerlayoutandroid.md b/docs/drawerlayoutandroid.md index 387f5e2c667..b3a1b3c7dbf 100644 --- a/docs/drawerlayoutandroid.md +++ b/docs/drawerlayoutandroid.md @@ -54,13 +54,13 @@ const styles = StyleSheet.create({ flex: 1, alignItems: "center", justifyContent: "center", - paddingTop: "50px", + paddingTop: 50, backgroundColor: "#ecf0f1", padding: 8 }, navigationContainer: { flex: 1, - paddingTop: "50px", + paddingTop: 50, backgroundColor: "#fff", padding: 8 } diff --git a/website/versioned_docs/version-0.62/drawerlayoutandroid.md b/website/versioned_docs/version-0.62/drawerlayoutandroid.md index 95dc94df7e7..e62a352cd3f 100644 --- a/website/versioned_docs/version-0.62/drawerlayoutandroid.md +++ b/website/versioned_docs/version-0.62/drawerlayoutandroid.md @@ -55,13 +55,13 @@ const styles = StyleSheet.create({ flex: 1, alignItems: "center", justifyContent: "center", - paddingTop: "50px", + paddingTop: 50, backgroundColor: "#ecf0f1", padding: 8 }, navigationContainer: { flex: 1, - paddingTop: "50px", + paddingTop: 50, backgroundColor: "#fff", padding: 8 } From f4d74cfb47463f081dda42745303199cfb9c3f9e Mon Sep 17 00:00:00 2001 From: Tim Pap Date: Tue, 16 Jun 2020 08:21:04 +0300 Subject: [PATCH 04/30] Docs: Update react-native-unimodules link (#1994) The react-native-unimodules link is updated. The current repo has been deprecated in favor of expo/expo monorepo --- docs/libraries.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/libraries.md b/docs/libraries.md index b58fd95b209..ed245ad2eb7 100644 --- a/docs/libraries.md +++ b/docs/libraries.md @@ -58,7 +58,7 @@ Many of the libraries you will find on the directory are from [React Native Comm Libraries built by the React Native Community are driven by volunteers and individuals at companies that depend on React Native. They often support iOS, tvOS, Android, Windows, but this varies across projects. Many of the libraries in this organization were once React Native Core Components and APIs. -Libraries built by Expo are all written in TypeScript and support iOS, Android, and react-native-web wherever possible. They usually require that you first install [react-native-unimodules](https://github.com/unimodules/react-native-unimodules) in order to use in your React Native app. +Libraries built by Expo are all written in TypeScript and support iOS, Android, and react-native-web wherever possible. They usually require that you first install [react-native-unimodules](https://github.com/expo/expo/tree/master/packages/react-native-unimodules) in order to use in your React Native app. After React Native Directory, the [npm registry](https://www.npmjs.com/) is the next best place if you can't find a library specifically for React Native on the directory. The npm registry is the definitive source for JavaScript libraries, but the libraries that it lists may not all be compatible with React Native. React Native is one of many JavaScript programming environments, including Node.js, web browsers, Electron, and more, and npm includes libraries that work for all of these environments. From 4aa9331412184abc1e75bfc2f2d02f3be0bc6afa Mon Sep 17 00:00:00 2001 From: Nayan Shinde Date: Tue, 16 Jun 2020 10:58:28 +0530 Subject: [PATCH 05/30] Bug Fix #1993 (#1996) --- docs/running-on-device.md | 3 ++- website/versioned_docs/version-0.5/running-on-device.md | 3 ++- website/versioned_docs/version-0.62/running-on-device.md | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/running-on-device.md b/docs/running-on-device.md index d59195f852b..d844415c9b6 100644 --- a/docs/running-on-device.md +++ b/docs/running-on-device.md @@ -248,11 +248,12 @@ Open a terminal and type `/sbin/ifconfig` to find your machine's IP address. + + 1. Make sure your laptop and your phone are on the **same** Wi-Fi network. 2. Open your React Native app on your device. 3. You'll see a [red screen with an error](debugging.md#in-app-errors-and-warnings). This is OK. The following steps will fix that. 4. Open the in-app [Developer menu](debugging.md#accessing-the-in-app-developer-menu). - 5. Go to **Dev Settings** → **Debug server host & port for device**. 6. Type in your machine's IP address and the port of the local dev server (e.g. 10.0.1.1:8081). 7. Go back to the **Developer menu** and select **Reload JS**. diff --git a/website/versioned_docs/version-0.5/running-on-device.md b/website/versioned_docs/version-0.5/running-on-device.md index 9747a5793f1..38d3f85ace2 100644 --- a/website/versioned_docs/version-0.5/running-on-device.md +++ b/website/versioned_docs/version-0.5/running-on-device.md @@ -249,11 +249,12 @@ Open a terminal and type `/sbin/ifconfig` to find your machine's IP address. + + 1. Make sure your laptop and your phone are on the **same** Wi-Fi network. 2. Open your React Native app on your device. 3. You'll see a [red screen with an error](debugging.md#in-app-errors-and-warnings). This is OK. The following steps will fix that. 4. Open the in-app [Developer menu](debugging.md#accessing-the-in-app-developer-menu). - 5. Go to **Dev Settings** → **Debug server host & port for device**. 6. Type in your machine's IP address and the port of the local dev server (e.g. 10.0.1.1:8081). 7. Go back to the **Developer menu** and select **Reload JS**. diff --git a/website/versioned_docs/version-0.62/running-on-device.md b/website/versioned_docs/version-0.62/running-on-device.md index 2f89138a706..979145f65a9 100644 --- a/website/versioned_docs/version-0.62/running-on-device.md +++ b/website/versioned_docs/version-0.62/running-on-device.md @@ -249,11 +249,12 @@ Open a terminal and type `/sbin/ifconfig` to find your machine's IP address. + + 1. Make sure your laptop and your phone are on the **same** Wi-Fi network. 2. Open your React Native app on your device. 3. You'll see a [red screen with an error](debugging.md#in-app-errors-and-warnings). This is OK. The following steps will fix that. 4. Open the in-app [Developer menu](debugging.md#accessing-the-in-app-developer-menu). - 5. Go to **Dev Settings** → **Debug server host & port for device**. 6. Type in your machine's IP address and the port of the local dev server (e.g. 10.0.1.1:8081). 7. Go back to the **Developer menu** and select **Reload JS**. From a52bb86dba4bdf23ccd8f20e21e14f1f9069d3b3 Mon Sep 17 00:00:00 2001 From: luism3861 <36824170+luism3861@users.noreply.github.com> Date: Tue, 16 Jun 2020 00:48:31 -0500 Subject: [PATCH 06/30] remove letter "s" inputaccesoryview.md (#1997) --- docs/inputaccessoryview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/inputaccessoryview.md b/docs/inputaccessoryview.md index ac340b2c702..daf56b22fe0 100644 --- a/docs/inputaccessoryview.md +++ b/docs/inputaccessoryview.md @@ -74,5 +74,5 @@ An ID which is used to associate this `InputAccessoryView` to specified TextInpu # Known issues -- [react-native#18997](https://github.com/facebook/react-native/issues/18997): Doesn't support multiline `TextInput`s +- [react-native#18997](https://github.com/facebook/react-native/issues/18997): Doesn't support multiline `TextInput` - [react-native#20157](https://github.com/facebook/react-native/issues/20157): Can't use with a bottom tab bar From 0a1637b70383375e0dd1d6e9aa92ba5bf6f38299 Mon Sep 17 00:00:00 2001 From: Bartosz Kaszubowski Date: Thu, 18 Jun 2020 09:45:55 +0200 Subject: [PATCH 07/30] use platform labels on the Accessibility page (#1948) * order accessibilityRoles alphabetically --- docs/accessibility.md | 134 +++++++++++++++++++----------------- website/static/css/docs.css | 6 ++ 2 files changed, 75 insertions(+), 65 deletions(-) diff --git a/docs/accessibility.md b/docs/accessibility.md index a8a4a3b747f..3d56c7e68e5 100644 --- a/docs/accessibility.md +++ b/docs/accessibility.md @@ -10,7 +10,7 @@ Both Android and iOS provide APIs for integrating apps with assistive technologi ## Accessibility properties -### `accessible` (Android, iOS) +### `accessible` When `true`, indicates that the view is an accessibility element. When a view is an accessibility element, it groups its children into a single selectable component. By default, all touchable elements are accessible. @@ -25,7 +25,7 @@ On Android, `accessible={true}` property for a react-native View will be transla In the above example, we can't get accessibility focus separately on 'text one' and 'text two'. Instead we get focus on a parent view with 'accessible' property. -### `accessibilityLabel` (Android, iOS) +### `accessibilityLabel` When a view is marked as accessible, it is a good practice to set an accessibilityLabel on the view, so that people who use VoiceOver know what element they have selected. VoiceOver will read this string when a user selects the associated element. @@ -44,7 +44,7 @@ To use, set the `accessibilityLabel` property to a custom string on your View, T In the above example, the `accessibilityLabel` on the TouchableOpacity element would default to "Press me!". The label is constructed by concatenating all Text node children separated by spaces. -### `accessibilityHint` (Android, iOS) +### `accessibilityHint` An accessibility hint helps users understand what will happen when they perform an action on the accessibility element when that result is not clear from the accessibility label. @@ -66,45 +66,66 @@ iOS In the above example, VoiceOver will read the hint after the label, if the u Android In the above example, Talkback will read the hint after the label. At this time, hints cannot be turned off on Android. -### `accessibilityIgnoresInvertColors` (iOS) +### `accessibilityIgnoresInvertColors`
iOS
Inverting screen colors is an Accessibility feature that makes the iPhone and iPad easier on the eyes for some people with a sensitivity to brightness, easier to distinguish for some people with color blindness, and easier to make out for some people with low vision. However, sometimes you have views such as photos that you don't want to be inverted. In this case, you can set this property to be false so that these specific views won't have their colors inverted. -### `accessibilityRole` (Android, iOS) +### `accessibilityLiveRegion`
Android
+ +When components dynamically change, we want TalkBack to alert the end user. This is made possible by the `accessibilityLiveRegion` property. It can be set to `none`, `polite` and `assertive`: + +- **none** Accessibility services should not announce changes to this view. +- **polite** Accessibility services should announce changes to this view. +- **assertive** Accessibility services should interrupt ongoing speech to immediately announce changes to this view. + +```jsx + + + Click me + + + + Clicked {count} times + +``` + +In the above example method `addOne` changes the state variable `count`. As soon as an end user clicks the TouchableWithoutFeedback, TalkBack reads text in the Text view because of its `accessibilityLiveRegion="polite"` property. + +### `accessibilityRole` `accessibilityRole` communicates the purpose of a component to the user of an assistive technology. `accessibilityRole` can be one of the following: -- **none** Used when the element has no role. -- **button** Used when the element should be treated as a button. -- **link** Used when the element should be treated as a link. -- **search** Used when the text field element should also be treated as a search field. -- **image** Used when the element should be treated as an image. Can be combined with button or link, for example. -- **keyboardkey** Used when the element acts as a keyboard key. -- **text** Used when the element should be treated as static text that cannot change. - **adjustable** Used when an element can be "adjusted" (e.g. a slider). -- **imagebutton** Used when the element should be treated as a button and is also an image. -- **header** Used when an element acts as a header for a content section (e.g. the title of a navigation bar). -- **summary** Used when an element can be used to provide a quick summary of current conditions in the app when the app first launches. - **alert** Used when an element contains important text to be presented to the user. +- **button** Used when the element should be treated as a button. - **checkbox** Used when an element represents a checkbox which can be checked, unchecked, or have mixed checked state. - **combobox** Used when an element represents a combo box, which allows the user to select among several choices. +- **header** Used when an element acts as a header for a content section (e.g. the title of a navigation bar). +- **image** Used when the element should be treated as an image. Can be combined with button or link, for example. +- **imagebutton** Used when the element should be treated as a button and is also an image. +- **keyboardkey** Used when the element acts as a keyboard key. +- **link** Used when the element should be treated as a link. - **menu** Used when the component is a menu of choices. - **menubar** Used when a component is a container of multiple menus. - **menuitem** Used to represent an item within a menu. +- **none** Used when the element has no role. - **progressbar** Used to represent a component which indicates progress of a task. - **radio** Used to represent a radio button. - **radiogroup** Used to represent a group of radio buttons. - **scrollbar** Used to represent a scroll bar. +- **search** Used when the text field element should also be treated as a search field. - **spinbutton** Used to represent a button which opens a list of choices. +- **summary** Used when an element can be used to provide a quick summary of current conditions in the app when the app first launches. - **switch** Used to represent a switch which can be turned on and off. - **tab** Used to represent a tab. - **tablist** Used to represent a list of tabs. +- **text** Used when the element should be treated as static text that cannot change. - **timer** Used to represent a timer. - **toolbar** Used to represent a tool bar (a container of action buttons or components). -### `accessibilityState` (Android, iOS) +### `accessibilityState` Describes the current state of a component to the user of an assistive technology. @@ -120,7 +141,7 @@ Describes the current state of a component to the user of an assistive technolog To use, set the `accessibilityState` to an object with a specific definition. -### `accessibilityValue` (Android, iOS) +### `accessibilityValue` Represents the current value of a component. It can be a textual description of a component's value, or for range-based components, such as sliders and progress bars, it contains range information (minimum, current, and maximum). @@ -133,52 +154,19 @@ Represents the current value of a component. It can be a textual description of | now | The current value of this component's range. | integer | No | | text | A textual description of this component's value. Will override `min`, `now`, and `max` if set. | string | No | -### `accessibilityViewIsModal` (iOS) +### `accessibilityViewIsModal`
iOS
A Boolean value indicating whether VoiceOver should ignore the elements within views that are siblings of the receiver. For example, in a window that contains sibling views `A` and `B`, setting `accessibilityViewIsModal` to `true` on view `B` causes VoiceOver to ignore the elements in the view `A`. On the other hand, if view `B` contains a child view `C` and you set `accessibilityViewIsModal` to `true` on view `C`, VoiceOver does not ignore the elements in view `A`. -### `accessibilityElementsHidden` (iOS) +### `accessibilityElementsHidden`
iOS
A Boolean value indicating whether the accessibility elements contained within this accessibility element are hidden. For example, in a window that contains sibling views `A` and `B`, setting `accessibilityElementsHidden` to `true` on view `B` causes VoiceOver to ignore the elements in the view `B`. This is similar to the Android property `importantForAccessibility="no-hide-descendants"`. -### `onAccessibilityTap` (Android, iOS) - -Use this property to assign a custom function to be called when someone activates an accessible element by double tapping on it while it's selected. - -### `onMagicTap` (iOS) - -Assign this property to a custom function which will be called when someone performs the "magic tap" gesture, which is a double-tap with two fingers. A magic tap function should perform the most relevant action a user could take on a component. In the Phone app on iPhone, a magic tap answers a phone call, or ends the current one. If the selected element does not have an `onMagicTap` function, the system will traverse up the view hierarchy until it finds a view that does. - -### `onAccessibilityEscape` (iOS) - -Assign this property to a custom function which will be called when someone performs the "escape" gesture, which is a two finger Z shaped gesture. An escape function should move back hierarchically in the user interface. This can mean moving up or back in a navigation hierarchy or dismissing a modal user interface. If the selected element does not have an `onAccessibilityEscape` function, the system will attempt to traverse up the view hierarchy until it finds a view that does or bonk to indicate it was unable to find one. - -### `accessibilityLiveRegion` (Android) - -When components dynamically change, we want TalkBack to alert the end user. This is made possible by the `accessibilityLiveRegion` property. It can be set to `none`, `polite` and `assertive`: - -- **none** Accessibility services should not announce changes to this view. -- **polite** Accessibility services should announce changes to this view. -- **assertive** Accessibility services should interrupt ongoing speech to immediately announce changes to this view. - -```jsx - - - Click me - - - - Clicked {count} times - -``` - -In the above example method `addOne` changes the state variable `count`. As soon as an end user clicks the TouchableWithoutFeedback, TalkBack reads text in the Text view because of its `accessibilityLiveRegion="polite"` property. - -### `importantForAccessibility` (Android) +### `importantForAccessibility`
Android
In the case of two overlapping UI components with the same parent, default accessibility focus can have unpredictable behavior. The `importantForAccessibility` property will resolve this by controlling if a view fires accessibility events and if it is reported to accessibility services. It can be set to `auto`, `yes`, `no` and `no-hide-descendants` (the last value will force accessibility services to ignore the component and all of its children). @@ -199,6 +187,18 @@ In the case of two overlapping UI components with the same parent, default acces In the above example, the `yellow` layout and its descendants are completely invisible to TalkBack and all other accessibility services. So we can use overlapping views with the same parent without confusing TalkBack. +### `onAccessibilityEscape`
iOS
+ +Assign this property to a custom function which will be called when someone performs the "escape" gesture, which is a two finger Z shaped gesture. An escape function should move back hierarchically in the user interface. This can mean moving up or back in a navigation hierarchy or dismissing a modal user interface. If the selected element does not have an `onAccessibilityEscape` function, the system will attempt to traverse up the view hierarchy until it finds a view that does or bonk to indicate it was unable to find one. + +### `onAccessibilityTap` + +Use this property to assign a custom function to be called when someone activates an accessible element by double tapping on it while it's selected. + +### `onMagicTap`
iOS
+ +Assign this property to a custom function which will be called when someone performs the "magic tap" gesture, which is a double-tap with two fingers. A magic tap function should perform the most relevant action a user could take on a component. In the Phone app on iPhone, a magic tap answers a phone call, or ends the current one. If the selected element does not have an `onMagicTap` function, the system will traverse up the view hierarchy until it finds a view that does. + ## Accessibility Actions Accessibility actions allow an assistive technology to programmatically invoke the actions of a component. In order to support accessibility actions, a component must do two things: @@ -256,30 +256,26 @@ To handle action requests, a component must implement an `onAccessibilityAction` The `AccessibilityInfo` API allows you to determine whether or not a screen reader is currently active. See the [AccessibilityInfo documentation](accessibilityinfo) for details. -## Sending Accessibility Events (Android) +## Sending Accessibility Events
Android
Sometimes it is useful to trigger an accessibility event on a UI component (i.e. when a custom view appears on a screen or set accessibility focus to a view). Native UIManager module exposes a method ‘sendAccessibilityEvent’ for this purpose. It takes two arguments: view tag and a type of an event. The supported event types are `typeWindowStateChanged`, `typeViewFocused` and `typeViewClicked`. ```jsx -import {Platform, UIManager, findNodeHandle} from 'react-native'; +import { + Platform, + UIManager, + findNodeHandle +} from 'react-native'; if (Platform.OS === 'android') { UIManager.sendAccessibilityEvent( findNodeHandle(this), - UIManager.AccessibilityEventTypes.typeViewFocused, + UIManager.AccessibilityEventTypes.typeViewFocused ); } ``` -## Testing VoiceOver Support (iOS) - -To enable VoiceOver, go to the Settings app on your iOS device (it's not available for simulator). Tap General, then Accessibility. There you will find many tools that people use to make their devices more usable, such as bolder text, increased contrast, and VoiceOver. - -To enable VoiceOver, tap on VoiceOver under "Vision" and toggle the switch that appears at the top. - -At the very bottom of the Accessibility settings, there is an "Accessibility Shortcut". You can use this to toggle VoiceOver by triple clicking the Home button. - -## Testing TalkBack Support (Android) +## Testing TalkBack Support
Android
To enable TalkBack, go to the Settings app on your Android device or emulator. Tap Accessibility, then TalkBack. Toggle the "Use service" switch to enable or disable it. @@ -302,6 +298,14 @@ adb shell settings put secure enabled_accessibility_services com.android.talkbac adb shell settings put secure enabled_accessibility_services com.google.android.marvin.talkback/com.google.android.marvin.talkback.TalkBackService ``` +## Testing VoiceOver Support
iOS
+ +To enable VoiceOver, go to the Settings app on your iOS device (it's not available for simulator). Tap General, then Accessibility. There you will find many tools that people use to make their devices more usable, such as bolder text, increased contrast, and VoiceOver. + +To enable VoiceOver, tap on VoiceOver under "Vision" and toggle the switch that appears at the top. + +At the very bottom of the Accessibility settings, there is an "Accessibility Shortcut". You can use this to toggle VoiceOver by triple clicking the Home button. + ## Additional Resources - [Making React Native Apps Accessible](https://engineering.fb.com/ios/making-react-native-apps-accessible/) diff --git a/website/static/css/docs.css b/website/static/css/docs.css index ac7a8eaadc7..2b17037cc00 100644 --- a/website/static/css/docs.css +++ b/website/static/css/docs.css @@ -263,6 +263,11 @@ figcaption { border-right-color: #6170af; } +h2 .label { + top: -6px; + margin-left: 12px; +} + h3 .label { top: -2px; margin-left: 22px; @@ -301,6 +306,7 @@ td .label.required { white-space: nowrap; overflow: hidden; color: transparent; + top: -1px; } /* Custom */ From 922d1b9e45e5a077ae6d1965651ee85d14dd672c Mon Sep 17 00:00:00 2001 From: JP Bulman Date: Thu, 18 Jun 2020 05:03:57 -0400 Subject: [PATCH 08/30] Getting Rid of In-Content Links (#1970) * Got rid of intext links and updated referenes to navigator * Removed package lock * add NavigationIOS removal notice, update links Co-authored-by: Bartosz Kaszubowski --- .../version-0.42/navigatorios.md | 29 +- .../versioned_docs/version-0.44/navigator.md | 4 +- .../versioned_docs/version-0.5/navigator.md | 34 +- .../version-0.5/navigatorios.md | 24 - .../version-0.58/navigatorios.md | 441 +----------------- 5 files changed, 7 insertions(+), 525 deletions(-) diff --git a/website/versioned_docs/version-0.42/navigatorios.md b/website/versioned_docs/version-0.42/navigatorios.md index a3f37a6a520..f14c788c6bd 100644 --- a/website/versioned_docs/version-0.42/navigatorios.md +++ b/website/versioned_docs/version-0.42/navigatorios.md @@ -6,7 +6,7 @@ original_id: navigatorios `NavigatorIOS` is a wrapper around [`UINavigationController`](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UINavigationController_Class/), enabling you to implement a navigation stack. It works exactly the same as it would on a native app using `UINavigationController`, providing the same animations and behavior from UIKIt. -As the name implies, it is only available on iOS. Take a look at [`Navigator`](navigator.md) for a similar solution for your cross-platform needs, or check out [react-native-navigation](https://github.com/wix/react-native-navigation), a component that aims to provide native navigation on both Android and iOS. +As the name implies, it is only available on iOS. Take a look at [`Navigator`](/docs/0.42/navigator) for a similar solution for your cross-platform needs, or check out [react-native-navigation](https://github.com/wix/react-native-navigation), a component that aims to provide native navigation on both Android and iOS. To set up the navigator, provide the `initialRoute` prop with a route object. A route object is used to describe each scene that your app navigates to. `initialRoute` represents the first route in your navigator. @@ -156,33 +156,6 @@ render() { In the example above the navigation bar color is changed when the new route is pushed. -### Props - -- [`initialRoute`](navigatorios.md#initialroute) -- [`barTintColor`](navigatorios.md#bartintcolor) -- [`interactivePopGestureEnabled`](navigatorios.md#interactivepopgestureenabled) -- [`itemWrapperStyle`](navigatorios.md#itemwrapperstyle) -- [`navigationBarHidden`](navigatorios.md#navigationbarhidden) -- [`shadowHidden`](navigatorios.md#shadowhidden) -- [`tintColor`](navigatorios.md#tintcolor) -- [`titleTextColor`](navigatorios.md#titletextcolor) -- [`translucent`](navigatorios.md#translucent) - -### Methods - -- [`push`](navigatorios.md#push) -- [`popN`](navigatorios.md#popn) -- [`pop`](navigatorios.md#pop) -- [`replaceAtIndex`](navigatorios.md#replaceatindex) -- [`replace`](navigatorios.md#replace) -- [`replacePrevious`](navigatorios.md#replaceprevious) -- [`popToTop`](navigatorios.md#poptotop) -- [`popToRoute`](navigatorios.md#poptoroute) -- [`replacePreviousAndPop`](navigatorios.md#replacepreviousandpop) -- [`resetTo`](navigatorios.md#resetto) - ---- - # Reference ## Props diff --git a/website/versioned_docs/version-0.44/navigator.md b/website/versioned_docs/version-0.44/navigator.md index 78972b5bc06..9234e3070bc 100644 --- a/website/versioned_docs/version-0.44/navigator.md +++ b/website/versioned_docs/version-0.44/navigator.md @@ -4,6 +4,6 @@ title: Navigator original_id: navigator --- -`Navigator` has been removed from the core React Native package in version 0.44. The module has been moved to a [`react-native-custom-components`](https://github.com/facebookarchive/react-native-custom-components) package that can be imported by your application in order to maintain backwards compatibility. +> `Navigator` has been removed from the core React Native package in version 0.44. The module has been moved to a [`react-native-custom-components`](https://github.com/facebookarchive/react-native-custom-components) package that can be imported by your application in order to maintain backwards compatibility. -To see the original docs for `Navigator`, please switch to an [older version of the docs](/docs/0.43/navigator.html). +To see the original docs for `Navigator`, please switch to an [older version of the docs](/docs/0.43/navigator). diff --git a/website/versioned_docs/version-0.5/navigator.md b/website/versioned_docs/version-0.5/navigator.md index de3dc53b277..cdcf4ddec7c 100644 --- a/website/versioned_docs/version-0.5/navigator.md +++ b/website/versioned_docs/version-0.5/navigator.md @@ -4,7 +4,7 @@ title: Navigator original_id: navigator --- -`Navigator` handles the transition between different scenes in your app. It is implemented in JavaScript and is available on both Android and iOS. If you are targeting iOS only, you may also want to consider using `NavigatorIOS` as it leverages native UIKit navigation. +`Navigator` handles the transition between different scenes in your app. It is implemented in JavaScript and is available on both Android and iOS. If you are targeting iOS only, you may also want to consider using [`NavigatorIOS`](/docs/0.5/navigatorios) as it leverages native UIKit navigation. To set up the `Navigator` you provide one or more objects called routes, to identify each scene. You also provide a `renderScene` function that renders the scene for each route object. @@ -128,37 +128,7 @@ To change the animation or gesture properties of the scene, provide a `configure /> ``` -In the above example, the newly pushed scene will float up from the bottom. See `Navigator.SceneConfigs` for default animations and more info on available [scene config options](navigator.md#configurescene). - -### Props - -- [`configureScene`](navigator.md#configurescene) -- [`initialRoute`](navigator.md#initialroute) -- [`initialRouteStack`](navigator.md#initialroutestack) -- [`navigationBar`](navigator.md#navigationbar) -- [`navigator`](navigator.md#navigator) -- [`onDidFocus`](navigator.md#ondidfocus) -- [`onWillFocus`](navigator.md#onwillfocus) -- [`renderScene`](navigator.md#renderscene) -- [`sceneStyle`](navigator.md#scenestyle) - -### Methods - -- [`immediatelyResetRouteStack`](navigator.md#immediatelyresetroutestack) -- [`jumpTo`](navigator.md#jumpto) -- [`jumpForward`](navigator.md#jumpforward) -- [`jumpBack`](navigator.md#jumpback) -- [`push`](navigator.md#push) -- [`popN`](navigator.md#popn) -- [`pop`](navigator.md#pop) -- [`replaceAtIndex`](navigator.md#replaceatindex) -- [`replace`](navigator.md#replace) -- [`replacePrevious`](navigator.md#replaceprevious) -- [`popToTop`](navigator.md#poptotop) -- [`popToRoute`](navigator.md#poptoroute) -- [`replacePreviousAndPop`](navigator.md#replacepreviousandpop) -- [`resetTo`](navigator.md#resetto) -- [`getCurrentRoutes`](navigator.md#getcurrentroutes) +In the above example, the newly pushed scene will float up from the bottom. See `Navigator.SceneConfigs` for default animations and more info on available [scene config options](navigator#configurescene). --- diff --git a/website/versioned_docs/version-0.5/navigatorios.md b/website/versioned_docs/version-0.5/navigatorios.md index 275d808cbbe..d96b8369dfe 100644 --- a/website/versioned_docs/version-0.5/navigatorios.md +++ b/website/versioned_docs/version-0.5/navigatorios.md @@ -72,30 +72,6 @@ var MyView = React.createClass({ }); ``` -### Props - -- [`initialRoute`](navigatorios.md#initialroute) -- [`barTintColor`](navigatorios.md#bartintcolor) -- [`itemWrapperStyle`](navigatorios.md#itemwrapperstyle) -- [`navigationBarHidden`](navigatorios.md#navigationbarhidden) -- [`tintColor`](navigatorios.md#tintcolor) -- [`titleTextColor`](navigatorios.md#titletextcolor) - -### Methods - -- [`push`](navigatorios.md#push) -- [`popN`](navigatorios.md#popn) -- [`pop`](navigatorios.md#pop) -- [`replaceAtIndex`](navigatorios.md#replaceatindex) -- [`replace`](navigatorios.md#replace) -- [`replacePrevious`](navigatorios.md#replaceprevious) -- [`popToTop`](navigatorios.md#poptotop) -- [`popToRoute`](navigatorios.md#poptoroute) -- [`replacePreviousAndPop`](navigatorios.md#replacepreviousandpop) -- [`resetTo`](navigatorios.md#resetto) -- [`handleNavigationComplete`](navigatorios.md#handlenavigationcomplete) -- [`renderNavigationStackItems`](navigatorios.md#rendernavigationstackitems) - --- # Reference diff --git a/website/versioned_docs/version-0.58/navigatorios.md b/website/versioned_docs/version-0.58/navigatorios.md index 078197dde8d..6d6176bfb01 100644 --- a/website/versioned_docs/version-0.58/navigatorios.md +++ b/website/versioned_docs/version-0.58/navigatorios.md @@ -4,443 +4,6 @@ title: NavigatorIOS original_id: navigatorios --- -`NavigatorIOS` is a wrapper around [`UINavigationController`](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UINavigationController_Class/), enabling you to implement a navigation stack. It works exactly the same as it would on a native app using `UINavigationController`, providing the same animations and behavior from UIKit. +> `NavigatorIOS` has been removed from the core React Native package in version 0.58. -As the name implies, it is only available on iOS. Take a look at [`React Navigation`](https://reactnavigation.org/) for a cross-platform solution in JavaScript, or check out either of these components for native solutions: [native-navigation](http://airbnb.io/native-navigation/), [react-native-navigation](https://github.com/wix/react-native-navigation). - -To set up the navigator, provide the `initialRoute` prop with a route object. A route object is used to describe each scene that your app navigates to. `initialRoute` represents the first route in your navigator. - -```jsx -import PropTypes from 'prop-types'; -import React, { Component } from 'react'; -import { - NavigatorIOS, - Text, - TouchableHighlight, - View -} from 'react-native'; - -export default class NavigatorIOSApp extends Component { - render() { - return ( - - ); - } -} - -class MyScene extends Component { - static propTypes = { - title: PropTypes.string.isRequired, - navigator: PropTypes.object.isRequired - }; - - _onForward = () => { - this.props.navigator.push({ - title: 'Scene' - }); - }; - - render() { - return ( - - Current Scene: {this.props.title} - - Tap me to load the next scene - - - ); - } -} -``` - -In this code, the navigator renders the component specified in initialRoute, which in this case is `MyScene`. This component will receive a `route` prop and a `navigator` prop representing the navigator. The navigator's navigation bar will render the title for the current scene, "My Initial Scene". - -You can optionally pass in a `passProps` property to your `initialRoute`. `NavigatorIOS` passes this in as props to the rendered component: - -```jsx -initialRoute={{ - component: MyScene, - title: 'My Initial Scene', - passProps: { myProp: 'foo' } -}} -``` - -You can then access the props passed in via `{this.props.myProp}`. - -#### Handling Navigation - -To trigger navigation functionality such as pushing or popping a view, you have access to a `navigator` object. The object is passed in as a prop to any component that is rendered by `NavigatorIOS`. You can then call the relevant methods to perform the navigation action you need: - -```jsx -class MyView extends Component { - _handleBackPress() { - this.props.navigator.pop(); - } - - _handleNextPress(nextRoute) { - this.props.navigator.push(nextRoute); - } - - render() { - const nextRoute = { - component: MyView, - title: 'Bar That', - passProps: { myProp: 'bar' } - }; - return ( - this._handleNextPress(nextRoute)}> - - See you on the other nav {this.props.myProp}! - - - ); - } -} -``` - -You can also trigger navigator functionality from the `NavigatorIOS` component: - -```jsx -class NavvyIOS extends Component { - _handleNavigationRequest() { - this.refs.nav.push({ - component: MyView, - title: 'Genius', - passProps: { myProp: 'genius' } - }); - } - - render() { - return ( - - this._handleNavigationRequest() - }} - style={{ flex: 1 }} - /> - ); - } -} -``` - -The code above adds a `_handleNavigationRequest` private method that is invoked from the `NavigatorIOS` component when the right navigation bar item is pressed. To get access to the navigator functionality, a reference to it is saved in the `ref` prop and later referenced to push a new scene into the navigation stack. - -#### Navigation Bar Configuration - -Props passed to `NavigatorIOS` will set the default configuration for the navigation bar. Props passed as properties to a route object will set the configuration for that route's navigation bar, overriding any props passed to the `NavigatorIOS` component. - -```jsx -_handleNavigationRequest() { - this.refs.nav.push({ - //... - passProps: { myProp: 'genius' }, - barTintColor: '#996699', - }); -} - -render() { - return ( - - ); -} -``` - -In the example above the navigation bar color is changed when the new route is pushed. - -### Props - -- [`initialRoute`](navigatorios.md#initialroute) -- [`barStyle`](navigatorios.md#barstyle) -- [`barTintColor`](navigatorios.md#bartintcolor) -- [`interactivePopGestureEnabled`](navigatorios.md#interactivepopgestureenabled) -- [`itemWrapperStyle`](navigatorios.md#itemwrapperstyle) -- [`navigationBarHidden`](navigatorios.md#navigationbarhidden) -- [`shadowHidden`](navigatorios.md#shadowhidden) -- [`tintColor`](navigatorios.md#tintcolor) -- [`titleTextColor`](navigatorios.md#titletextcolor) -- [`translucent`](navigatorios.md#translucent) - -### Methods - -- [`push`](navigatorios.md#push) -- [`popN`](navigatorios.md#popn) -- [`pop`](navigatorios.md#pop) -- [`replaceAtIndex`](navigatorios.md#replaceatindex) -- [`replace`](navigatorios.md#replace) -- [`replacePrevious`](navigatorios.md#replaceprevious) -- [`popToTop`](navigatorios.md#poptotop) -- [`popToRoute`](navigatorios.md#poptoroute) -- [`replacePreviousAndPop`](navigatorios.md#replacepreviousandpop) -- [`resetTo`](navigatorios.md#resetto) - ---- - -# Reference - -## Props - -### `initialRoute` - -NavigatorIOS uses `route` objects to identify child views, their props, and navigation bar configuration. Navigation operations such as push operations expect routes to look like this the `initialRoute`. - -| Type | Required | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- | -| object: {component: function,title: string,titleImage: Image.propTypes.source,passProps: object,backButtonIcon: Image.propTypes.source,backButtonTitle: string,leftButtonIcon: Image.propTypes.source,leftButtonTitle: string,leftButtonSystemIcon: Object.keys(SystemIcons),onLeftButtonPress: function,rightButtonIcon: Image.propTypes.source,rightButtonTitle: string,rightButtonSystemIcon: Object.keys(SystemIcons),onRightButtonPress: function,wrapperStyle: View.style,navigationBarHidden: bool,shadowHidden: bool,tintColor: string,barTintColor: string,barStyle: enum('default', 'black'),titleTextColor: string,translucent: bool} | Yes | - ---- - -### `barStyle` - -The style of the navigation bar. Supported values are `default`, `black`. Use `black` instead of setting `barTintColor` to `black`. This produces a navigation bar with the native iOS style with higher translucency. - -| Type | Required | -| ------------------------ | -------- | -| enum('default', 'black') | No | - ---- - -### `barTintColor` - -The default background color of the navigation bar. - -| Type | Required | -| ------ | -------- | -| string | No | - ---- - -### `interactivePopGestureEnabled` - -Boolean value that indicates whether the interactive `pop` gesture is enabled. This is useful for enabling/disabling the back swipe navigation gesture. - -If this prop is not provided, the default behavior is for the back swipe gesture to be enabled when the navigation bar is shown and disabled when the navigation bar is hidden. Once you've provided the `interactivePopGestureEnabled` prop, you can never restore the default behavior. - -| Type | Required | -| ---- | -------- | -| bool | No | - ---- - -### `itemWrapperStyle` - -The default wrapper style for components in the navigator. A common use case is to set the `backgroundColor` for every scene. - -| Type | Required | -| ---------- | -------- | -| View.style | No | - ---- - -### `navigationBarHidden` - -Boolean value that indicates whether the navigation bar is hidden by default. - -| Type | Required | -| ---- | -------- | -| bool | No | - ---- - -### `shadowHidden` - -Boolean value that indicates whether to hide the 1px hairline shadow by default. - -| Type | Required | -| ---- | -------- | -| bool | No | - ---- - -### `tintColor` - -The default color used for the buttons in the navigation bar. - -| Type | Required | -| ------ | -------- | -| string | No | - ---- - -### `titleTextColor` - -The default text color of the navigation bar title. - -| Type | Required | -| ------ | -------- | -| string | No | - ---- - -### `translucent` - -Boolean value that indicates whether the navigation bar is translucent by default. When true any screens loaded within the navigator will sit below the status bar and underneath the navigation bar. To have screens render below the navigation bar set to false. - -| Type | Required | -| ---- | -------- | -| bool | No | - -## Methods - -### `push()` - -```jsx -push((route: object)); -``` - -Navigate forward to a new route. - -**Parameters:** - -| Name | Type | Required | Description | -| ----- | ------ | -------- | ----------------------------- | -| route | object | Yes | The new route to navigate to. | - ---- - -### `popN()` - -```jsx -popN((n: number)); -``` - -Go back N scenes at once. When N=1, behavior matches `pop()`. - -**Parameters:** - -| Name | Type | Required | Description | -| ---- | ------ | -------- | ---------------------------- | -| n | number | Yes | The number of scenes to pop. | - ---- - -### `pop()` - -```jsx -pop(); -``` - -Get the previous scene by its route - ---- - -### `replaceAtIndex()` - -```jsx -replaceAtIndex((route: object), (index: number)); -``` - -Replace a route in the navigation stack. - -**Parameters:** - -| Name | Type | Required | Description | -| ----- | ------ | -------- | ---------------------------------------------------------------------------------------------------------- | -| route | object | Yes | The new route that will replace the specified one. | -| index | number | Yes | The route into the stack that should be replaced. If it is negative, it counts from the back of the stack. | - ---- - -### `replace()` - -```jsx -replace((route: object)); -``` - -Replace the route for the current scene and immediately load the view for the new route. - -**Parameters:** - -| Name | Type | Required | Description | -| ----- | ------ | -------- | ----------------------------- | -| route | object | Yes | The new route to navigate to. | - ---- - -### `replacePrevious()` - -```jsx -replacePrevious((route: object)); -``` - -Replace the route/view for the previous scene. - -**Parameters:** - -| Name | Type | Required | Description | -| ----- | ------ | -------- | ------------------------------------------------- | -| route | object | Yes | The new route to will replace the previous scene. | - ---- - -### `popToTop()` - -```jsx -popToTop(); -``` - -Go back to the topmost item in the navigation stack. - ---- - -### `popToRoute()` - -```jsx -popToRoute((route: object)); -``` - -Go back to the item for a particular route object. - -**Parameters:** - -| Name | Type | Required | Description | -| ----- | ------ | -------- | ----------------------------- | -| route | object | Yes | The new route to navigate to. | - ---- - -### `replacePreviousAndPop()` - -```jsx -replacePreviousAndPop((route: object)); -``` - -Replaces the previous route/view and transitions back to it. - -**Parameters:** - -| Name | Type | Required | Description | -| ----- | ------ | -------- | ----------------------------------------------- | -| route | object | Yes | The new route that replaces the previous scene. | - ---- - -### `resetTo()` - -```jsx -resetTo((route: object)); -``` - -Replaces the top item and `pop` to it. - -**Parameters:** - -| Name | Type | Required | Description | -| ----- | ------ | -------- | ------------------------------------------------- | -| route | object | Yes | The new route that will replace the topmost item. | +To see the original docs for `NavigatorIOS`, please switch to an [older version of the docs](/docs/0.57/navigatorios). From c22676711bacee2883fe17f033e11139936bd117 Mon Sep 17 00:00:00 2001 From: Doga Fincan Date: Thu, 18 Jun 2020 12:41:44 +0200 Subject: [PATCH 09/30] Add two words to platform-specific-code.md (#1999) --- docs/platform-specific-code.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/platform-specific-code.md b/docs/platform-specific-code.md index fa7d43aaca3..fe6be855be2 100644 --- a/docs/platform-specific-code.md +++ b/docs/platform-specific-code.md @@ -50,7 +50,7 @@ const styles = StyleSheet.create({ }); ``` -This will result in a container having `flex: 1` on both platforms, a red background color on iOS, a green background color on Android, and a blue background on other platforms. +This will result in a container having `flex: 1` on all platforms, a red background color on iOS, a green background color on Android, and a blue background color on other platforms. Since it accepts `any` value, you can also use it to return platform specific component, like below: From 556b92fc5bf88f23add5b805a8cb02ac42d14f98 Mon Sep 17 00:00:00 2001 From: luism3861 <36824170+luism3861@users.noreply.github.com> Date: Thu, 18 Jun 2020 06:49:45 -0500 Subject: [PATCH 10/30] update second example in Flatlist docs (#1998) * update flatlist example, select one button and change color * complete changes in examples * retain Item as separate component, use native StatusBar height, prettier run Co-authored-by: Bartosz Kaszubowski --- docs/flatlist.md | 96 ++++++++++++++++++------------------------------ 1 file changed, 35 insertions(+), 61 deletions(-) diff --git a/docs/flatlist.md b/docs/flatlist.md index 5e520414649..b34696d6d15 100644 --- a/docs/flatlist.md +++ b/docs/flatlist.md @@ -22,8 +22,7 @@ If you need section support, use [``](sectionlist.md). ```SnackPlayer name=flatlist-simple import React from 'react'; -import { SafeAreaView, View, FlatList, StyleSheet, Text } from 'react-native'; -import Constants from 'expo-constants'; +import { SafeAreaView, View, FlatList, StyleSheet, Text, StatusBar } from 'react-native'; const DATA = [ { @@ -40,13 +39,11 @@ const DATA = [ }, ]; -const Item = ({ title }) => { - return ( - - {title} - - ); -} +const Item = ({ title }) => ( + + {title} + +); const App = () => { const renderItem = ({ item }) => ( @@ -67,7 +64,7 @@ const App = () => { const styles = StyleSheet.create({ container: { flex: 1, - marginTop: Constants.statusBarHeight, + marginTop: StatusBar.currentHeight || 0, }, item: { backgroundColor: '#f9c2ff', @@ -91,86 +88,63 @@ More complex, multi-select example demonstrating `` usage for perf optimization - `keyExtractor` tells the list to use the `id`s for the react keys instead of the default `key` property. ```SnackPlayer name=flatlist-selectable -import React from 'react'; -import { - SafeAreaView, - TouchableOpacity, - FlatList, - StyleSheet, - Text, -} from 'react-native'; -import Constants from 'expo-constants'; +import React, { useState } from "react"; +import { FlatList, SafeAreaView, StatusBar, StyleSheet, Text, TouchableOpacity } from "react-native"; const DATA = [ { - id: 'bd7acbea-c1b1-46c2-aed5-3ad53abb28ba', - title: 'First Item', + id: "bd7acbea-c1b1-46c2-aed5-3ad53abb28ba", + title: "First Item", }, { - id: '3ac68afc-c605-48d3-a4f8-fbd91aa97f63', - title: 'Second Item', + id: "3ac68afc-c605-48d3-a4f8-fbd91aa97f63", + title: "Second Item", }, { - id: '58694a0f-3da1-471f-bd96-145571e29d72', - title: 'Third Item', + id: "58694a0f-3da1-471f-bd96-145571e29d72", + title: "Third Item", }, ]; -const Item = ({ id, title, selected, onSelect }) => { - return ( - onSelect(id)} - style={[ - styles.item, - { backgroundColor: selected ? '#6e3b6e' : '#f9c2ff' }, - ]} - > - {title} - - ); -} +const Item = ({ item, onPress, style }) => ( + + {item.title} + +); const App = () => { - const [selected, setSelected] = React.useState(new Map()); + const [selectedId, setSelectedId] = useState(null); - const onSelect = React.useCallback( - id => { - const newSelected = new Map(selected); - newSelected.set(id, !selected.get(id)); + const renderItem = ({ item }) => { + const backgroundColor = item.id === selectedId ? "#6e3b6e" : "#f9c2ff"; - setSelected(newSelected); - }, - [selected], - ); - - const renderItem = ({ item }) => ( - - ); + return ( + setSelectedId(item.id)} + style={{ backgroundColor }} + /> + ); + }; return ( item.id} - extraData={selected} + keyExtractor={(item) => item.id} + extraData={selectedId} /> ); -} +}; const styles = StyleSheet.create({ container: { flex: 1, - marginTop: Constants.statusBarHeight, + marginTop: StatusBar.currentHeight || 0, }, item: { - backgroundColor: '#f9c2ff', padding: 20, marginVertical: 8, marginHorizontal: 16, From 43f7fb474fb10f79d895da3b7ad9d4915d9e6b00 Mon Sep 17 00:00:00 2001 From: truecuozzo98 <52197438+truecuozzo98@users.noreply.github.com> Date: Thu, 18 Jun 2020 15:20:42 +0200 Subject: [PATCH 11/30] Update accessibilityinfo.md (#1977) * Update accessibilityinfo.md Since AccessibilityInfo.fetch is deprecated, I changed it with AccessibilityInfo.isReduceMotionEnabled and AccessibilityInfo.isScreenReaderEnabled * fix syntax error, remove web platform, tweak readability Co-authored-by: Bartosz Kaszubowski --- docs/accessibilityinfo.md | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/docs/accessibilityinfo.md b/docs/accessibilityinfo.md index 2226d71a175..d7af5228b20 100644 --- a/docs/accessibilityinfo.md +++ b/docs/accessibilityinfo.md @@ -20,8 +20,7 @@ Sometimes it's useful to know whether or not the device has a screen reader that -```SnackPlayer name=AccessibilityInfo%20Function%20Component%20Example - +```SnackPlayer name=AccessibilityInfo%20Function%20Component%20Example&supportedPlatforms=android,ios import React, { useState, useEffect } from "react"; import { AccessibilityInfo, View, Text, StyleSheet } from "react-native"; @@ -39,18 +38,22 @@ const App = () => { handleScreenReaderToggled ); - AccessibilityInfo.fetch().then(reduceMotionEnabled => { - setReduceMotionEnabled(reduceMotionEnabled); - }); - AccessibilityInfo.fetch().then(screenReaderEnabled => { - setScreenReaderEnabled(screenReaderEnabled); - }); + AccessibilityInfo.isReduceMotionEnabled().then( + reduceMotionEnabled => { + setReduceMotionEnabled(reduceMotionEnabled); + } + ); + AccessibilityInfo.isScreenReaderEnabled().then( + screenReaderEnabled => { + setScreenReaderEnabled(screenReaderEnabled); + } + ); + return () => { AccessibilityInfo.removeEventListener( "reduceMotionChanged", handleReduceMotionToggled ); - AccessibilityInfo.removeEventListener( "screenReaderChanged", handleScreenReaderToggled @@ -94,8 +97,7 @@ export default App; -```SnackPlayer name=AccessibilityInfo%20Class%20Component%20Example - +```SnackPlayer name=AccessibilityInfo%20Class%20Component%20Example&supportedPlatforms=android,ios import React, { Component } from 'react'; import { AccessibilityInfo, View, Text, StyleSheet } from 'react-native'; @@ -115,10 +117,10 @@ class AccessibilityStatusExample extends Component { this._handleScreenReaderToggled ); - AccessibilityInfo.fetch().then(reduceMotionEnabled => { + AccessibilityInfo.isReduceMotionEnabled().then(reduceMotionEnabled => { this.setState({ reduceMotionEnabled }); }); - AccessibilityInfo.fetch().then(screenReaderEnabled => { + AccessibilityInfo.isScreenReaderEnabled().then(screenReaderEnabled => { this.setState({ screenReaderEnabled }); }); } From 3b402c20a74aee15cb975af238acd96c578c570d Mon Sep 17 00:00:00 2001 From: Bartosz Kaszubowski Date: Thu, 18 Jun 2020 15:55:34 +0200 Subject: [PATCH 12/30] fix reported invalid links (#1981) --- docs/getting-started.md | 6 +++--- docs/intro-react-native-components.md | 2 +- docs/libraries.md | 2 +- docs/more-resources.md | 2 +- website/versioned_docs/version-0.62/getting-started.md | 6 +++--- .../version-0.62/intro-react-native-components.md | 2 +- website/versioned_docs/version-0.62/libraries.md | 2 +- website/versioned_docs/version-0.62/more-resources.md | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/getting-started.md b/docs/getting-started.md index 63e4cc678da..4149e556170 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -64,7 +64,7 @@ If you have a problem with Expo, before creating a new issue, please see if ther - in the [Expo CLI issues](https://github.com/expo/expo-cli/issues) (for issues related to Expo CLI), or - in the [Expo issues](https://github.com/expo/expo/issues) (for issues about the Expo client or SDK). -If you're curious to learn more about React Native, check out the [Introduction to React Native](getting-started.md). +If you're curious to learn more about React Native, check out the [Introduction to React Native](getting-started).

Running your app on a simulator or virtual device

@@ -617,7 +617,7 @@ Congratulations! You've successfully run and modified your first React Native ap - If you want to add this new React Native code to an existing application, check out the [Integration guide](integration-with-existing-apps.md). -If you're curious to learn more about React Native, check out the [Introduction to React Native](getting-started.md). +If you're curious to learn more about React Native, check out the [Introduction to React Native](getting-started). @@ -625,4 +625,4 @@ If you're curious to learn more about React Native, check out the [Introduction - If you want to add this new React Native code to an existing application, check out the [Integration guide](integration-with-existing-apps.md). -If you're curious to learn more about React Native, check out the [Introduction to React Native](getting-started.md). +If you're curious to learn more about React Native, check out the [Introduction to React Native](getting-started). diff --git a/docs/intro-react-native-components.md b/docs/intro-react-native-components.md index 64e7232ea85..5b633c58667 100644 --- a/docs/intro-react-native-components.md +++ b/docs/intro-react-native-components.md @@ -19,7 +19,7 @@ In Android and iOS development, a **view** is the basic building block of UI: a In Android development, you write views in Kotlin or Java; in iOS development, you use Swift or Objective-C. With React Native, you can invoke these views with JavaScript using React components. At runtime, React Native creates the corresponding Android and iOS views for those components. Because React Native components are backed by the same views as Android and iOS, React Native apps look, feel, and perform like any other apps. We call these platform-backed components **Native Components.** -React Native lets you to build your own Native Components for [Android](native-components-android.md) and [iOS](native-components-ios.md) to suit your app’s unique needs. We also have a thriving ecosystem of these **community-contributed components.** Check out [Native Directory](https://www.native.directory/) to find what the community has been creating. +React Native lets you to build your own Native Components for [Android](native-components-android.md) and [iOS](native-components-ios.md) to suit your app’s unique needs. We also have a thriving ecosystem of these **community-contributed components.** Check out [Native Directory](https://reactnative.directory) to find what the community has been creating. React Native also includes a set of essential, ready-to-use Native Components you can use to start building your app today. These are React Native's **Core Components**. diff --git a/docs/libraries.md b/docs/libraries.md index ed245ad2eb7..0c937046fae 100644 --- a/docs/libraries.md +++ b/docs/libraries.md @@ -70,7 +70,7 @@ Usually libraries built _specifically for other platforms_ will not work with Re ### Does it work for the platforms that my app supports? -[React Native Directory](https://reactnative.directory/) allows you to filter by platform compatibility, such as iOS, Android, Web, and Windows. If the library you would like to use is not currently listed there, refer to the README for the library to learn more. +[React Native Directory](https://reactnative.directory) allows you to filter by platform compatibility, such as iOS, Android, Web, and Windows. If the library you would like to use is not currently listed there, refer to the README for the library to learn more. ### Does it work with my app version of React Native? diff --git a/docs/more-resources.md b/docs/more-resources.md index 3dc62c10ece..19c52d43b41 100644 --- a/docs/more-resources.md +++ b/docs/more-resources.md @@ -38,6 +38,6 @@ Try out apps from the [Showcase](https://reactnative.dev/showcase) to see what R React Native has a community of thousands of developers like you making content, tools, tutorials—and Native Components! -Can’t find what you’re looking for in the Core Components? Visit [Native Directory](https://www.native.directory/) to find what the community has been creating. +Can’t find what you’re looking for in the Core Components? Visit [React Native Directory](https://reactnative.directory) to find what the community has been creating. Interested in making your own Native Component or Module? Making modules for your own use case and sharing them with others on NPM and GitHub helps grow the React Native ecosystem and community! Read the guides to making your own Native Modules ([Android](native-modules-android.md), [iOS](native-modules-ios.md)) and Native Components ([Android](native-components-android.md), [iOS](native-components-ios.md)). diff --git a/website/versioned_docs/version-0.62/getting-started.md b/website/versioned_docs/version-0.62/getting-started.md index 5531e95d801..febb724dc18 100644 --- a/website/versioned_docs/version-0.62/getting-started.md +++ b/website/versioned_docs/version-0.62/getting-started.md @@ -65,7 +65,7 @@ If you have a problem with Expo, before creating a new issue, please see if ther - in the [Expo CLI issues](https://github.com/expo/expo-cli/issues) (for issues related to Expo CLI), or - in the [Expo issues](https://github.com/expo/expo/issues) (for issues about the Expo client or SDK). -If you're curious to learn more about React Native, check out the [Introduction to React Native](getting-started.md). +If you're curious to learn more about React Native, check out the [Introduction to React Native](getting-started).

Running your app on a simulator or virtual device

@@ -576,7 +576,7 @@ Congratulations! You've successfully run and modified your first React Native ap - If you want to add this new React Native code to an existing application, check out the [Integration guide](integration-with-existing-apps.md). -If you're curious to learn more about React Native, check out the [Introduction to React Native](getting-started.md). +If you're curious to learn more about React Native, check out the [Introduction to React Native](getting-started). @@ -584,4 +584,4 @@ If you're curious to learn more about React Native, check out the [Introduction - If you want to add this new React Native code to an existing application, check out the [Integration guide](integration-with-existing-apps.md). -If you're curious to learn more about React Native, check out the [Introduction to React Native](getting-started.md). +If you're curious to learn more about React Native, check out the [Introduction to React Native](getting-started). diff --git a/website/versioned_docs/version-0.62/intro-react-native-components.md b/website/versioned_docs/version-0.62/intro-react-native-components.md index 6a054debb16..4e1fdad237c 100644 --- a/website/versioned_docs/version-0.62/intro-react-native-components.md +++ b/website/versioned_docs/version-0.62/intro-react-native-components.md @@ -20,7 +20,7 @@ In Android and iOS development, a **view** is the basic building block of UI: a In Android development, you write views in Kotlin or Java; in iOS development, you use Swift or Objective-C. With React Native, you can invoke these views with JavaScript using React components. At runtime, React Native creates the corresponding Android and iOS views for those components. Because React Native components are backed by the same views as Android and iOS, React Native apps look, feel, and perform like any other apps. We call these platform-backed components **Native Components.** -React Native lets you to build your own Native Components for [Android](native-components-android.md) and [iOS](native-components-ios.md) to suit your app’s unique needs. We also have a thriving ecosystem of these **community-contributed components.** Check out [Native Directory](https://www.native.directory/) to find what the community has been creating. +React Native lets you to build your own Native Components for [Android](native-components-android.md) and [iOS](native-components-ios.md) to suit your app’s unique needs. We also have a thriving ecosystem of these **community-contributed components.** Check out [React Native Directory](https://reactnative.directory) to find what the community has been creating. React Native also includes a set of essential, ready-to-use Native Components you can use to start building your app today. These are React Native's **Core Components**. diff --git a/website/versioned_docs/version-0.62/libraries.md b/website/versioned_docs/version-0.62/libraries.md index c967feec545..1947fbf01ea 100644 --- a/website/versioned_docs/version-0.62/libraries.md +++ b/website/versioned_docs/version-0.62/libraries.md @@ -71,7 +71,7 @@ Usually libraries built _specifically for other platforms_ will not work with Re ### Does it work for the platforms that my app supports? -[React Native Directory](https://reactnative.directory/) allows you to filter by platform compatibility, such as iOS, Android, Web, and Windows. If the library you would like to use is not currently listed there, refer to the README for the library to learn more. +[React Native Directory](https://reactnative.directory) allows you to filter by platform compatibility, such as iOS, Android, Web, and Windows. If the library you would like to use is not currently listed there, refer to the README for the library to learn more. ### Does it work with my app version of React Native? diff --git a/website/versioned_docs/version-0.62/more-resources.md b/website/versioned_docs/version-0.62/more-resources.md index 6d1c9208201..e8f57bfe898 100644 --- a/website/versioned_docs/version-0.62/more-resources.md +++ b/website/versioned_docs/version-0.62/more-resources.md @@ -39,6 +39,6 @@ Try out apps from the [Showcase](https://reactnative.dev/showcase) to see what R React Native has a community of thousands of developers like you making content, tools, tutorials—and Native Components! -Can’t find what you’re looking for in the Core Components? Visit [Native Directory](https://www.native.directory/) to find what the community has been creating. +Can’t find what you’re looking for in the Core Components? Visit [React Native Directory](https://reactnative.directory) to find what the community has been creating. Interested in making your own Native Component or Module? Making modules for your own use case and sharing them with others on NPM and GitHub helps grow the React Native ecosystem and community! Read the guides to making your own Native Modules ([Android](native-modules-android.md), [iOS](native-modules-ios.md)) and Native Components ([Android](native-components-android.md), [iOS](native-components-ios.md)). From b39cb06cacb42e03ad40a9f6d6dfff9dc9cdc75e Mon Sep 17 00:00:00 2001 From: Bartosz Kaszubowski Date: Thu, 18 Jun 2020 18:17:19 +0200 Subject: [PATCH 13/30] changes from the Prettier run (#2000) --- docs/native-modules-android.md | 2 +- docs/native-modules-ios.md | 2 +- docs/navigation.md | 8 ++++---- docs/network.md | 4 ++-- website/versioned_docs/version-0.5/accessibility.md | 12 ++++++++---- website/versioned_docs/version-0.62/accessibility.md | 12 ++++++++---- 6 files changed, 24 insertions(+), 16 deletions(-) diff --git a/docs/native-modules-android.md b/docs/native-modules-android.md index a00adcfa688..40edee2544d 100644 --- a/docs/native-modules-android.md +++ b/docs/native-modules-android.md @@ -293,7 +293,7 @@ const measureLayout = async () => { } catch (e) { console.error(e); } -} +}; measureLayout(); ``` diff --git a/docs/native-modules-ios.md b/docs/native-modules-ios.md index 7ba51816945..7214614f4d5 100644 --- a/docs/native-modules-ios.md +++ b/docs/native-modules-ios.md @@ -232,7 +232,7 @@ const updateEvents = async () => { } catch (e) { console.error(e); } -} +}; updateEvents(); ``` diff --git a/docs/navigation.md b/docs/navigation.md index 8c7d2d87891..8b3b2f9184c 100644 --- a/docs/navigation.md +++ b/docs/navigation.md @@ -64,7 +64,7 @@ const App = () => { {/* Rest of your app code */} ); -} +}; export default App; ``` @@ -95,7 +95,7 @@ const MyStack = () => { ); -} +}; ``` In this example, there are 2 screens (`Home` and `Profile`) defined using the `Stack.Screen` component. Similarly, you can define as many screens as you like. @@ -114,10 +114,10 @@ const HomeScreen = ({ navigation }) => { } /> ); -} +}; const ProfileScreen = () => { return This is Jane's profile; -} +}; ``` The views in the stack navigator use native components and the [`Animated`](animated.md) library to deliver 60fps animations that are run on the native thread. Plus, the animations and gestures can be customized. diff --git a/docs/network.md b/docs/network.md index 7b88e47dd49..8cb6485cf27 100644 --- a/docs/network.md +++ b/docs/network.md @@ -51,7 +51,7 @@ const getMoviesFromApi = () => { .catch((error) => { console.error(error); }); -} +}; ``` You can also use the `async` / `await` syntax in a React Native app: @@ -67,7 +67,7 @@ const getMoviesFromApiAsync = async () => { } catch (error) { console.error(error); } -} +}; ``` Don't forget to catch any errors that may be thrown by `fetch`, otherwise they will be dropped silently. diff --git a/website/versioned_docs/version-0.5/accessibility.md b/website/versioned_docs/version-0.5/accessibility.md index cc48dfc26ae..3d2601c49d1 100644 --- a/website/versioned_docs/version-0.5/accessibility.md +++ b/website/versioned_docs/version-0.5/accessibility.md @@ -172,12 +172,12 @@ In the case of two overlapping UI components with the same parent, default acces ```jsx First layout Second layout @@ -248,12 +248,16 @@ The `AccessibilityInfo` API allows you to determine whether or not a screen read Sometimes it is useful to trigger an accessibility event on a UI component (i.e. when a custom view appears on a screen or set accessibility focus to a view). Native UIManager module exposes a method ‘sendAccessibilityEvent’ for this purpose. It takes two arguments: view tag and a type of an event. The supported event types are `typeWindowStateChanged`, `typeViewFocused` and `typeViewClicked`. ```jsx -import {Platform, UIManager, findNodeHandle} from 'react-native'; +import { + Platform, + UIManager, + findNodeHandle +} from 'react-native'; if (Platform.OS === 'android') { UIManager.sendAccessibilityEvent( findNodeHandle(this), - UIManager.AccessibilityEventTypes.typeViewFocused, + UIManager.AccessibilityEventTypes.typeViewFocused ); } ``` diff --git a/website/versioned_docs/version-0.62/accessibility.md b/website/versioned_docs/version-0.62/accessibility.md index 8e760d93ccc..91f854f3552 100644 --- a/website/versioned_docs/version-0.62/accessibility.md +++ b/website/versioned_docs/version-0.62/accessibility.md @@ -185,12 +185,12 @@ In the case of two overlapping UI components with the same parent, default acces ```jsx First layout Second layout @@ -261,12 +261,16 @@ The `AccessibilityInfo` API allows you to determine whether or not a screen read Sometimes it is useful to trigger an accessibility event on a UI component (i.e. when a custom view appears on a screen or set accessibility focus to a view). Native UIManager module exposes a method ‘sendAccessibilityEvent’ for this purpose. It takes two arguments: view tag and a type of an event. The supported event types are `typeWindowStateChanged`, `typeViewFocused` and `typeViewClicked`. ```jsx -import {Platform, UIManager, findNodeHandle} from 'react-native'; +import { + Platform, + UIManager, + findNodeHandle +} from 'react-native'; if (Platform.OS === 'android') { UIManager.sendAccessibilityEvent( findNodeHandle(this), - UIManager.AccessibilityEventTypes.typeViewFocused, + UIManager.AccessibilityEventTypes.typeViewFocused ); } ``` From fb5e95373058c0daec2c4901caf110c5d8efb2ac Mon Sep 17 00:00:00 2001 From: luism3861 <36824170+luism3861@users.noreply.github.com> Date: Sat, 20 Jun 2020 02:29:49 -0500 Subject: [PATCH 14/30] fix links in images.md (#2002) --- website/versioned_docs/version-0.5/images.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/versioned_docs/version-0.5/images.md b/website/versioned_docs/version-0.5/images.md index 66555d0843b..73b1152a4a1 100644 --- a/website/versioned_docs/version-0.5/images.md +++ b/website/versioned_docs/version-0.5/images.md @@ -70,7 +70,7 @@ Note that image sources required this way include size (width, height) info for The `require` syntax described above can be used to statically include audio, video or document files in your project as well. Most common file types are supported including `.mp3`, `.wav`, `.mp4`, `.mov`, `.html` and `.pdf`. See [bundler defaults](https://github.com/facebook/metro/blob/master/packages/metro-config/src/defaults/defaults.js#L14-L44) for the full list. -You can add support for other types by adding an [`assetExts` resolver option](https://facebook.github.io/metro/docs/en/configuration#assetexts) in your [Metro configuration](https://facebook.github.io/metro/docs/en/configuration). +You can add support for other types by adding an [`assetExts` resolver option](https://facebook.github.io/metro/docs/configuration#assetexts) in your [Metro configuration](https://facebook.github.io/metro/docs/configuration). A caveat is that videos must use absolute positioning instead of `flexGrow`, since size info is not currently passed for non-image assets. This limitation doesn't occur for videos that are linked directly into Xcode or the Assets folder for Android. From 33d27d4459468f89eab3912a2e1188bc6428a980 Mon Sep 17 00:00:00 2001 From: Bartosz Kaszubowski Date: Thu, 25 Jun 2020 09:57:39 +0200 Subject: [PATCH 15/30] fix onPageNav height with announcement (#2006) --- website/static/css/header.css | 1 + 1 file changed, 1 insertion(+) diff --git a/website/static/css/header.css b/website/static/css/header.css index 53a37239051..d0caece6c4e 100644 --- a/website/static/css/header.css +++ b/website/static/css/header.css @@ -264,6 +264,7 @@ input#search_input_react:focus { } .onPageNav { top: 172px; + max-height: calc(100vh - 172px); } } From d293652acb2d928cd959d038b28e6c3fb36d9db5 Mon Sep 17 00:00:00 2001 From: ttlong3103 Date: Fri, 26 Jun 2020 20:00:48 +0700 Subject: [PATCH 16/30] Fix bug in example of functional component (#2004) --- docs/appstate.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/appstate.md b/docs/appstate.md index 740a7ba0a84..c22729798d8 100644 --- a/docs/appstate.md +++ b/docs/appstate.md @@ -48,7 +48,7 @@ const AppStateExample = () => { return () => { AppState.removeEventListener("change", _handleAppStateChange); }; - }, []); + }, [_handleAppStateChange]); const _handleAppStateChange = (nextAppState) => { if (appState.current.match(/inactive|background/) && nextAppState === "active") { From aea8f19dc557dea51c5f704668375b137ca428a3 Mon Sep 17 00:00:00 2001 From: Sunny Luo Date: Sun, 28 Jun 2020 15:02:21 +0800 Subject: [PATCH 17/30] Remove legacyImplementation (#2012) https://github.com/facebook/react-native/commit/636d01bbd0b9a2e9617f8063713183a0a3a4d5fe --- docs/optimizing-flatlist-configuration.md | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/docs/optimizing-flatlist-configuration.md b/docs/optimizing-flatlist-configuration.md index 907ff6d8797..d63f5397f17 100644 --- a/docs/optimizing-flatlist-configuration.md +++ b/docs/optimizing-flatlist-configuration.md @@ -81,18 +81,6 @@ The number passed here is a measurement unit where 1 is equivalent to your viewp **Cons:** For a bigger `windowSize`, you will have more memory consumption. For a lower `windowSize`, you will have a bigger chance of seeing blank areas. -### legacyImplementation - -| Type | Default | -| ------- | ------- | -| Boolean | False | - -Make `FlatList` rely on the older and deprecated `ListView` instead of `VirtualizedList`. - -**Pros:** No risk of seeing blank areas while scrolling. May avoid bugs in `VirtualizedList`. - -**Cons:** Extra memory consumption and more app crash risk in large lists (100+) with complex items. It also warns that the above tweaks will not work because now it is using `ListView`. Many other features are not supported. There may be other bugs since `ListView` is deprecated. - ## List items Below are some tips about list item components. They are the core of your list, so they need to be fast. From 6c874f6007a2ba55b87c7e0da2bc9429bc0dda69 Mon Sep 17 00:00:00 2001 From: Ricky Date: Fri, 3 Jul 2020 17:51:31 -0400 Subject: [PATCH 18/30] Replace YellowBox docs with LogBox docs. (#2020) * Replace YellowBox docs with LogBox docs. * Fix language lint errors * Update debugging.md Some typos and rewordings * Update debugging.md Co-authored-by: Eli White --- docs/debugging.md | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/docs/debugging.md b/docs/debugging.md index 269afb22e25..1729cd45846 100644 --- a/docs/debugging.md +++ b/docs/debugging.md @@ -19,30 +19,37 @@ Fast Refresh is a React Native feature that allows you to get near-instant feedb React Native supports a few keyboard shortcuts in the iOS Simulator. They are described below. To enable them, open the Hardware menu, select Keyboard, and make sure that "Connect Hardware Keyboard" is checked. -## In-app Errors and Warnings +## LogBox -Errors and warnings are displayed inside your app in development builds. +Errors and warnings in development builds are displayed in LogBox inside your app. -### Errors +> LogBox is automatically disabled in release (production) builds. -In-app errors are displayed in a full screen alert with a red background inside your app. This screen is known as a RedBox. You can use `console.error()` to manually trigger one. +### Console Errors and Warnings -### Warnings +Console errors and warnings are displayed as on-screen notifications with a red or yellow badge, and the number of errors or warning in the console respectively. To view a console error or warnings, tap the notification to view the full screen information about the log and to paginiate through all of the logs in the console. -Warnings will be displayed on screen with a yellow background. These alerts are known as YellowBoxes. Click on the alerts to show more information or to dismiss them. +These notifications can be hidden using `LogBox.ignoreAllLogs()`. This is useful when giving product demos, for example. Additionally, notifications can be hidden on a per-log basis via `LogBox.ignoreLogs()`. This is useful when there's a noisy warning that cannot be fixed, like those in a third-party dependency. -As with a RedBox, you can use `console.warn()` to trigger a YellowBox. - -YellowBoxes can be disabled during development by using `console.disableYellowBox = true;`. Specific warnings can be ignored programmatically by setting an array of prefixes that should be ignored: +> Ignore logs as a last resort and create a task to fix any logs that are ignored. ```jsx -import { YellowBox } from 'react-native'; -YellowBox.ignoreWarnings(['Warning: ...']); +import { LogBox } from 'react-native'; + +// Ignore log notification by message: +LogBox.ignoreLogs(['Warning: ...']); + +// Ignore all log notifications: +LogBox.ignoreAllLogs(); ``` -In CI/Xcode, YellowBoxes can also be disabled by setting the `IS_TESTING` environment variable. +### Unhandled Errors + +Unhanded JavaScript errors such as `undefined is not a function` will automatically open a full screen LogBox error with the source of the error. These errors are dismissable and minimizable so that you can see the state of your app when these errors occur, but should always be addressed. + +### Syntax Erorrs -> RedBoxes and YellowBoxes are automatically disabled in release (production) builds. +Syntax errors will automatically open a full screen LogBox error with the source of the syntax error. This error is not dismissable because it represents invalid JavaScript execution that must be fixed before continuing with your app. To dismiss these errors, fix the syntax error and either save to automatically dismiss (with Fast Refresh enabled) or cmd+r to reload (with Fast Refresh disabled). ## Chrome Developer Tools From c7ef38ad531fde362641a6a34e4e051cfa9ae0f3 Mon Sep 17 00:00:00 2001 From: SABRYX <32037441+SABRYX@users.noreply.github.com> Date: Mon, 6 Jul 2020 09:03:54 +0200 Subject: [PATCH 19/30] Update flatlist.md (#2022) Example in renderItem Have a syntax error in ItemSeparatorComponent --- docs/flatlist.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/flatlist.md b/docs/flatlist.md index b34696d6d15..96b566561f3 100644 --- a/docs/flatlist.md +++ b/docs/flatlist.md @@ -199,9 +199,9 @@ Example usage: ```jsx ( + ItemSeparatorComponent={Platform.OS !== 'android' && (({highlighted}) => ( - )} + ))} data={[{title: 'Title Text', key: 'item1'}]} renderItem={({item, index, separators}) => ( Date: Mon, 6 Jul 2020 12:40:34 +0530 Subject: [PATCH 20/30] Fixed code snippet. (#2015) new ReactImageManager(..here..), ReactImageManager 's constructer needs reactContext, we passed it. --- docs/native-components-android.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/native-components-android.md b/docs/native-components-android.md index 616927bf8f0..247efec57d6 100644 --- a/docs/native-components-android.md +++ b/docs/native-components-android.md @@ -96,7 +96,7 @@ The final Java step is to register the ViewManager to the application, this happ public List createViewManagers( ReactApplicationContext reactContext) { return Arrays.asList( - new ReactImageManager() + new ReactImageManager(reactContext) ); } ``` From 4d37e4939158683d1b98b1a9c8ba906a0dc67baf Mon Sep 17 00:00:00 2001 From: Levi Buzolic Date: Mon, 6 Jul 2020 18:06:50 +1000 Subject: [PATCH 21/30] Remove duplicate documentation property for statusBarTranslucent on Modal (#2023) * Remove duplicate documentation property for statusBarTranslucent on Modal * Sort properties alphabetically --- docs/modal.md | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/docs/modal.md b/docs/modal.md index 59cae0f21fa..f391926b995 100644 --- a/docs/modal.md +++ b/docs/modal.md @@ -258,16 +258,6 @@ The `hardwareAccelerated` prop controls whether to force hardware acceleration f --- -### `statusBarTranslucent` - -The `statusBarTranslucent` prop determines whether your modal should go under the system statusbar. - -| Type | Required | Platform | -| ---- | -------- | -------- | -| bool | No | Android | - ---- - ### `onDismiss` The `onDismiss` prop allows passing a function that will be called once the modal has been dismissed. @@ -330,9 +320,9 @@ Default is set to `overFullScreen` or `fullScreen` depending on `transparent` pr The `statusBarTranslucent` prop determines whether your modal should go under the system statusbar. -| Type | Required | -| ---- | -------- | -| bool | No | +| Type | Required | Platform | +| ---- | -------- | -------- | +| bool | No | Android | --- From c42f606b1aecd8fed559a83f80e30ae8908070e6 Mon Sep 17 00:00:00 2001 From: Bartosz Kaszubowski Date: Mon, 6 Jul 2020 18:59:51 +0200 Subject: [PATCH 22/30] Add an ability to slide up announcement bar on scroll (#2018) * slide up announcement banner on scroll * fix for desktop resizing on macOS * apply fix only on mobile --- website/static/css/header.css | 19 +++++++++++++++++++ website/static/js/announcement.js | 27 ++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/website/static/css/header.css b/website/static/css/header.css index d0caece6c4e..77a115dbf62 100644 --- a/website/static/css/header.css +++ b/website/static/css/header.css @@ -237,6 +237,25 @@ input#search_input_react:focus { color: #fff; } +.fixedHeaderContainer, +.onPageNav, +.docsNavContainer { + transition: top 0.35s; +} + +.navPusher { + transition: top 0.35s, margin 0.35s; +} + +/* +Fix small mobile device overflow with sliding up banner +(code is present on desktop and for larger devices) + */ +body { + display: flex; + flex-direction: column; +} + @media only screen and (max-width: 700px) { ul.nav-site.nav-site-internal { margin-top: 160px; diff --git a/website/static/js/announcement.js b/website/static/js/announcement.js index a24237ae711..00472b562f5 100644 --- a/website/static/js/announcement.js +++ b/website/static/js/announcement.js @@ -1,4 +1,4 @@ -document.addEventListener('DOMContentLoaded', function() { +document.addEventListener('DOMContentLoaded', () => { const container = document.querySelector('.fixedHeaderContainer'); if (container) { const announcement = document.createElement('div'); @@ -8,3 +8,28 @@ document.addEventListener('DOMContentLoaded', function() { container.insertBefore(announcement, container.firstChild); } }); + +const scrollStartBoundary = 160; + +window.onscroll = () => { + // Simple check for mobile devices + if (typeof window.orientation !== 'undefined') { + const fixedHeaderContainer = document.querySelector( + '.fixedHeaderContainer' + ); + const navPusher = document.querySelector('.navPusher'); + + if ( + document.body.scrollTop > scrollStartBoundary || + document.documentElement.scrollTop > scrollStartBoundary + ) { + fixedHeaderContainer.style.top = '-100px'; + navPusher.style.top = '-100px'; + navPusher.style.marginBottom = '-100px'; + } else { + fixedHeaderContainer.style.top = '0'; + navPusher.style.top = '0'; + navPusher.style.marginBottom = '0'; + } + } +}; From 8e4a0035becf50858e1cb6b943b467b12532faa0 Mon Sep 17 00:00:00 2001 From: luism3861 <36824170+luism3861@users.noreply.github.com> Date: Mon, 6 Jul 2020 11:37:59 -0700 Subject: [PATCH 23/30] remove unused variables declarations and parameters in different files. (#2010) * delete unused variables declarations and parameters * remove accent in parameters * add variable params --- website/core/RemarkablePlugins.js | 21 +++------------------ website/pages/en/help.js | 2 -- website/static/js/codeblocks.js | 4 ++-- 3 files changed, 5 insertions(+), 22 deletions(-) diff --git a/website/core/RemarkablePlugins.js b/website/core/RemarkablePlugins.js index 0e3c7118d45..ee73e59caa7 100644 --- a/website/core/RemarkablePlugins.js +++ b/website/core/RemarkablePlugins.js @@ -1,8 +1,6 @@ 'use strict'; const hljs = require('highlight.js'); -const {utils} = require('remarkable'); -const {escapeHtml} = utils; // Remove leading "SnackPlayer", "ReactNativeWebPlayer" function cleanParams(params) { @@ -58,13 +56,7 @@ function htmlForCodeBlock(code) { * ``` */ function SnackPlayer(md) { - md.renderer.rules.fence_custom.SnackPlayer = function( - tokens, - idx, - options, - env, - self - ) { + md.renderer.rules.fence_custom.SnackPlayer = function(tokens, idx) { let params = parseParams(cleanParams(tokens[idx].params)); const name = params.name ? decodeURIComponent(params.name) : 'Example'; @@ -77,7 +69,6 @@ function SnackPlayer(md) { const supportedPlatforms = params.supportedPlatforms ? params.supportedPlatforms : 'ios,android,web'; - const rnVersion = params.version ? params.version : 'next'; return ( '
' + @@ -126,13 +117,7 @@ function SnackPlayer(md) { * ``` */ function ReactNativeWebPlayer(md) { - md.renderer.rules.fence_custom.ReactNativeWebPlayer = function( - tokens, - idx, - options, - env, - self - ) { + md.renderer.rules.fence_custom.ReactNativeWebPlayer = function(tokens, idx) { const WEB_PLAYER_VERSION = '2.0.0-alpha.8'; let sampleCode = tokens[idx].content; @@ -148,7 +133,7 @@ function ReactNativeWebPlayer(md) { '
' + htmlForCodeBlock(sampleCode) + `` + `
` + '\n\n' diff --git a/website/pages/en/help.js b/website/pages/en/help.js index 0e600154cdc..fd155e28643 100755 --- a/website/pages/en/help.js +++ b/website/pages/en/help.js @@ -10,8 +10,6 @@ const React = require('react'); const CompLibrary = require('../../core/CompLibrary.js'); const Container = CompLibrary.Container; -const siteConfig = require(process.cwd() + '/siteConfig.js'); - class Help extends React.Component { render() { return ( diff --git a/website/static/js/codeblocks.js b/website/static/js/codeblocks.js index ef6a935f606..6face88eff0 100644 --- a/website/static/js/codeblocks.js +++ b/website/static/js/codeblocks.js @@ -77,7 +77,7 @@ } } - function showModal(e) { + function showModal() { var backdrop = document.querySelector('.modal-backdrop'); if (!backdrop) { return; @@ -89,7 +89,7 @@ modal.classList.add('modal-open'); } - function hideModal(e) { + function hideModal() { var backdrop = document.querySelector('.modal-backdrop'); if (!backdrop) { return; From d2e222e1270faf21f52e1ba80adb882fddda8db0 Mon Sep 17 00:00:00 2001 From: Chris Winter Date: Mon, 6 Jul 2020 21:42:39 +0200 Subject: [PATCH 24/30] Fixed the Function Component Example (#2019) * Fixed the Function Component Example We experienced that the documentation was faulty so after we at @enpit found a fix, we wanted to share it with you. The old trigger `appState.current.match(/inactive|background/) && nextAppState === "active"` would never work because the useState hook doesn't update the state fast enough for the function to work. The solution is to use useRef instead and optional (to display the inactive status under iOS) also use a `useState` for cosmetics. * removed block comment, removed spaces * rephrase and move new comment, add one more sentence, prettier run * language lint fix Co-authored-by: Bartosz Kaszubowski --- docs/appstate.md | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/docs/appstate.md b/docs/appstate.md index c22729798d8..7b1a81b5e23 100644 --- a/docs/appstate.md +++ b/docs/appstate.md @@ -36,11 +36,12 @@ To see the current state, you can check `AppState.currentState`, which will be k ```SnackPlayer name=AppState%20Function%20Component%20Example -import React, { useEffect, useRef } from "react"; +import React, { useRef, useState, useEffect } from "react"; import { AppState, StyleSheet, Text, View } from "react-native"; const AppStateExample = () => { const appState = useRef(AppState.currentState); + const [appStateVisible, setAppStateVisible] = useState(appState.current); useEffect(() => { AppState.addEventListener("change", _handleAppStateChange); @@ -48,18 +49,24 @@ const AppStateExample = () => { return () => { AppState.removeEventListener("change", _handleAppStateChange); }; - }, [_handleAppStateChange]); + }, []); const _handleAppStateChange = (nextAppState) => { - if (appState.current.match(/inactive|background/) && nextAppState === "active") { + if ( + appState.current.match(/inactive|background/) && + nextAppState === "active" + ) { console.log("App has come to the foreground!"); } + appState.current = nextAppState; + setAppStateVisible(appState.current); + console.log("AppState", appState.current); }; return ( - Current state is: {appState.current} + Current state is: {appStateVisible} ); }; @@ -68,13 +75,15 @@ const styles = StyleSheet.create({ container: { flex: 1, justifyContent: "center", - alignItems: "center" - } + alignItems: "center", + }, }); export default AppStateExample; ``` +If you don't want to see the AppState update from `active` to `inactive` on iOS you can remove the state variable and use the `appState.current` value. + ```SnackPlayer name=AppState%20Class%20Component%20Example @@ -126,7 +135,7 @@ export default AppStateExample; -This example will only ever appear to say "Current state is: active" because the app is only visible to the user when in the `active` state, and the null state will happen only momentarily. +This example will only ever appear to say "Current state is: active" because the app is only visible to the user when in the `active` state, and the null state will happen only momentarily. If you want to experiment with the code we recommend to use your own device instead of embedded preview. --- From ea60aebd70cb68aa8c6c2727477d26027398b760 Mon Sep 17 00:00:00 2001 From: Mike Grabowski Date: Wed, 8 Jul 2020 20:31:43 +0200 Subject: [PATCH 25/30] Blog post for the 0.63 release (#2024) * commit the article * Update 2020-07-06-version-0.63.md * Update 2020-07-06-version-0.63.md * Update website/blog/2020-07-06-version-0.63.md Co-authored-by: Ricky * Update website/blog/2020-07-06-version-0.63.md Co-authored-by: Ricky * Update website/blog/2020-07-06-version-0.63.md Co-authored-by: Ricky * Update 2020-07-06-version-0.63.md * chore: refactor to a css * Updating the Pressable introduction Co-authored-by: Ricky Co-authored-by: Eli White --- website/blog/2020-07-06-version-0.63.md | 153 ++++++++++++++++++++++++ website/blog/assets/0.63-logbox.png | Bin 0 -> 291234 bytes website/static/css/blog.css | 5 + 3 files changed, 158 insertions(+) create mode 100644 website/blog/2020-07-06-version-0.63.md create mode 100644 website/blog/assets/0.63-logbox.png diff --git a/website/blog/2020-07-06-version-0.63.md b/website/blog/2020-07-06-version-0.63.md new file mode 100644 index 00000000000..50eef3cf15c --- /dev/null +++ b/website/blog/2020-07-06-version-0.63.md @@ -0,0 +1,153 @@ +--- +title: Announcing React Native 0.63 with LogBox +author: Mike Grabowski +authorTitle: CTO and Co-Founder at Callstack +authorURL: https://twitter.com/grabbou +authorImageURL: https://avatars0.githubusercontent.com/u/2464966?s=460&v=4 +authorTwitter: grabbou +category: announcements +--- + +Today we’re releasing React Native 0.63 that ships with LogBox turned on by default. + +## LogBox + +We’ve heard frequent feedback from the community that errors and warnings are difficult to debug in React Native. To address these issues we took a look at the entire error, warning, and log system in React Native and redesigned it [from the ground up](https://www.youtube.com/watch?v=Y8brBH5O-bQ&feature=youtu.be). + +![Screenshot of LogBox](/blog/assets/0.63-logbox.png) + +LogBox is a completely redesigned redbox, yellowbox, and logging experience in React Native. In 0.62 we introduced LogBox as an opt-in. In this release, we’re launching LogBox as the default experience in all of React Native. + +LogBox addresses complaints that errors and warnings were too verbose, poorly formatted, or unactionable by focusing on three primary goals: + +- **Concise**: Logs should provide the minimum amount of information necessary to debug an issue. +- **Formatted**: Logs should be formatted so that you can quickly find the information you need. +- **Actionable**: Logs should be actionable, so you can fix the issue and move on. + +To achieve these goals, LogBox includes: + +- **Log notifications**: We’ve redesigned the warning notifications and added support for errors so that all console.warn and console.log messages show up as notifications instead of covering your app. +- **Code Frames**: Every error and warning now includes a code frame that shows the source code of the log right inside the app, allowing you to quickly identify the source of your issue. +- **Component Stacks**: All component stacks are now stripped from error messages and put into their own section with the top three frames visible. This gives you a single, consistent space to expect stack frame information that doesn’t clutter the log message. +- **Stack Frame Collapsing**: By default we now collapse call stack frames not related to your application’s code so you can quickly see the issue in your app and not sift through React Native internals. +- **Syntax Error Formatting**: We’ve improved the formatting for syntax errors and added codeframes with syntax highlighting so you can see the source of the error, fix it, and continue coding without React Native getting in your way. + +We’ve wrapped all of these features into an improved visual design that’s consistent between errors and warnings and allows paginating through all logs in one enjoyable UI. + +With this change we’re also deprecating YellowBox in favor of LogBox APIs: + +- `LogBox.ignoreLogs()`: This function replaces `YellowBox.ignoreLogs([])` as a way to silence any logs that match the given strings or regexes. +- `LogBox.ignoreAllLogs()`: This function replaces `console.disableYellowBox` as a way to turn off error or warning notifications. Note: this only disables notifications, uncaught errors will still open a full screen LogBox. + +In 0.63, we will warn when using these deprecated modules or methods. Please update your call sites off of these APIs before they are removed in 0.64. + +For more information on LogBox and debugging react native, see the docs [here](https://reactnative.dev/docs/debugging#in-app-errors-and-warnings). + +## Pressable + +React Native is built to enable applications to meet user’s expectations of the platform. This includes avoiding “tells”—little things that give away that the experience was built with React Native. One major source of these tells has been the Touchable components: `Button`, `TouchableWithoutFeedback`, `TouchableHighlight`, `TouchableOpacity`, `TouchableNativeFeedback`, and `TouchableBounce`. These components make your application interactive by allowing you to provide visual feedback to user interactions. However, because they include built-in styles and effects that don’t match the platform interaction, users can tell when experiences are written with React Native. + +Further, as React Native has grown and our bar for high-quality applications has gone up, these components haven't grown with it. React Native now supports platforms like Web, Desktop, and TV, but support for additional input modalities has been lacking. React Native needs to support high-quality interaction experiences on all platforms. + +To address these problems, we are shipping a new core component called `Pressable`. This component can be used to detect various types of interactions. The API was designed to provide direct access to the current state of interaction without having to maintain state manually in a parent component. It was also designed to enable platforms to extend it's capabilities to include hover, blur, focus, and more. We expect that most people will build and share components utilizing `Pressable` under the hood instead of relying on the default experience of something like `TouchableOpacity`. + +```jsx +import { Pressable, Text } from 'react-native'; + + { + console.log('pressed'); + }} + style={({ pressed }) => ({ + backgroundColor: pressed ? 'lightskyblue' : 'white' + })}> + Press Me! +; +``` + +

+A simple example of a Pressable component in action +

+ +You can learn more about it from [the documentation](https://reactnative.dev/docs/pressable). + +## Native Colors (PlatformColor, DynamicColorIOS) + +Every native platform has the concept of system-defined colors. Colors that automatically respond to system theme settings such as Light or Dark mode, accessibility settings such as a High Contrast mode, and even its context within the app such as the traits of a containing view or window. + +While it is possible to detect some of these settings via the [`Appearance`](https://reactnative.dev/docs/appearance#getcolorscheme) API and/or [`AccessibilityInfo`](https://reactnative.dev/docs/accessibilityinfo#isgrayscaleenabled) and set your styles accordingly, such abstractions are not only costly to develop but are just approximating the appearance of native colors. These inconsistencies are particularly noticeable when working on a hybrid application, where React Native elements co-exist next to the native ones. + +React Native now provides an out-of-the-box solution to use these system colors. `PlatformColor()` is a new API that can be used like any other color in React Native. + +For example, on iOS, the [system provides a color called `labelColor`](https://developer.apple.com/documentation/uikit/uicolor/ui_element_colors?language=objc). That can be used in React Native with `PlatformColor` like this: + +```jsx +import { Text, PlatformColor } from 'react-native'; + + + This is a label +; +``` + +

+Sets the color of the Text component to labelColor as defined by iOS. +

+ +Android, on the other hand, [provides colors like colorButtonNormal](https://developer.android.com/reference/android/R.attr#colorButtonNormal). You can use this color in React Native with: + +```jsx +import { View, Text, PlatformColor } from 'react-native'; + + + This is colored like a button! +; +``` + +

+Sets the background color of the View component to colorButtonNormal as defined by Android. +

+ +You can learn more about `PlatformColor` from [the documentation](https://reactnative.dev/docs/platformcolor). You can also check the actual [code examples present in the RNTester](https://github.com/facebook/react-native/blob/master/RNTester/js/examples/PlatformColor/PlatformColorExample.js). + +`DynamicColorIOS` is an iOS only API that lets you define which color to use in light and dark mode. Similar to `PlatformColor`, this can be used anywhere you can use colors. `DynamicColorIOS` uses iOS’s `colorWithDynamicProvider` under the hood. + +```jsx +import { Text, DynamicColorIOS } from 'react-native'; + +const customDynamicTextColor = DynamicColorIOS({ + dark: 'lightskyblue', + light: 'midnightblue' +}); + + + This color changes automatically based on the system theme! +; +``` + +

+Changes the text color based on the system theme +

+ +You can learn more about `DynamicColorIOS` from [the documentation](https://reactnative.dev/docs/dynamiccolorios). + +## Dropping iOS 9 and Node.js 8 support + +After over four years from its release, we are dropping support for iOS 9. This change will allow us to move faster by being able to reduce the number of compatibility checks that need to be placed in the native code to detect whether a given feature was supported on a certain iOS version. With its [market share of 1%](https://david-smith.org/iosversionstats/), it shouldn’t have much negative impact on your customers. + +At the same time, we are dropping support for Node 8. [Its LTS maintenance cycle expired in December 2019](https://nodejs.org/fr/blog/release/v8.9.0/). The current LTS is Node 10 and it is now the version that we are targeting. If you are still using Node 8 for the development of React Native applications, we encourage you to upgrade in order to receive all the latest security fixes and updates. + +## Other notable improvements + +- **Support rendering `` in `` without explicit size**: You can now render any `` inside any `` component without setting its width and height explicitly, which wasn’t always possible. On previous releases of React Native, this would result in a RedBox. +- **Changed iOS LaunchScreen from `xib` to `storyboard`**: Starting April 30, 2020, all apps submitted to the App Store must use an Xcode storyboard to provide the app’s launch screen and all iPhone apps must support all iPhone screens. This commit adjusts the default React Native template to be compatible with this requirement. + +## Thanks + +Thank you to the hundreds of contributors that helped make 0.63 possible! + +> Special thanks to [Rick Hanlon](https://twitter.com/rickhanlonii) for authoring the section on `LogBox` and [Eli White](https://twitter.com/Eli_White) for authoring the `Pressable` part of this article. + +To see all the updates, take a look at the [0.63 changelog](https://github.com/react-native-community/releases/blob/master/CHANGELOG.md#0630). diff --git a/website/blog/assets/0.63-logbox.png b/website/blog/assets/0.63-logbox.png new file mode 100644 index 0000000000000000000000000000000000000000..ef4acacc1a988e85123cf9370d7b2ca9edc7118c GIT binary patch literal 291234 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
4lc2V1^ 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 H{OIB-M`{Wg-bo{@{Un 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

@$o0U@=mc$K9z$ar$p%% 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 literal 0 HcmV?d00001 diff --git a/website/static/css/blog.css b/website/static/css/blog.css index 98ee914ddb6..b9f70a75735 100644 --- a/website/static/css/blog.css +++ b/website/static/css/blog.css @@ -11,6 +11,11 @@ transition: none; } +.blogContainer .snippet-caption { + text-align: center; + font-size: 12px; +} + /* Put the image on the left of the block */ .blogContainer .postHeader .authorBlock { flex-direction: row-reverse; From e33f7df6fada0eee093c38ef388c7cd4ef852b58 Mon Sep 17 00:00:00 2001 From: Mike Grabowski Date: Wed, 8 Jul 2020 22:12:35 +0200 Subject: [PATCH 26/30] feat: ship 0.63 docs (#2030) --- website/i18n/en.json | 294 ++++++ website/siteConfig.js | 2 +- .../version-0.63/accessibility.md | 312 +++++++ .../version-0.63/accessibilityinfo.md | 285 ++++++ .../version-0.63/actionsheetios.md | 119 +++ .../version-0.63/activityindicator.md | 132 +++ website/versioned_docs/version-0.63/alert.md | 204 +++++ .../versioned_docs/version-0.63/animated.md | 620 +++++++++++++ .../version-0.63/animatedvalue.md | 211 +++++ .../version-0.63/animatedvaluexy.md | 222 +++++ .../versioned_docs/version-0.63/animations.md | 838 +++++++++++++++++ .../versioned_docs/version-0.63/appstate.md | 191 ++++ .../version-0.63/backhandler.md | 314 +++++++ website/versioned_docs/version-0.63/button.md | 238 +++++ .../versioned_docs/version-0.63/checkbox.md | 114 +++ website/versioned_docs/version-0.63/colors.md | 207 +++++ .../version-0.63/components-and-apis.md | 209 +++++ .../version-0.63/datepickerios.md | 220 +++++ .../versioned_docs/version-0.63/debugging.md | 181 ++++ .../versioned_docs/version-0.63/dimensions.md | 193 ++++ .../version-0.63/dynamiccolorios.md | 46 + website/versioned_docs/version-0.63/easing.md | 390 ++++++++ .../versioned_docs/version-0.63/flatlist.md | 708 +++++++++++++++ .../versioned_docs/version-0.63/flexbox.md | 227 +++++ .../version-0.63/getting-started.md | 629 +++++++++++++ .../version-0.63/handling-text-input.md | 39 + .../version-0.63/height-and-width.md | 58 ++ website/versioned_docs/version-0.63/hermes.md | 92 ++ .../version-0.63/image-style-props.md | 648 +++++++++++++ website/versioned_docs/version-0.63/image.md | 582 ++++++++++++ .../version-0.63/imagebackground.md | 75 ++ website/versioned_docs/version-0.63/images.md | 231 +++++ .../version-0.63/inputaccessoryview.md | 79 ++ .../integration-with-existing-apps.md | 827 +++++++++++++++++ .../version-0.63/interactionmanager.md | 233 +++++ .../intro-react-native-components.md | 77 ++ .../version-0.63/intro-react.md | 559 ++++++++++++ .../version-0.63/introduction.md | 150 +++ .../versioned_docs/version-0.63/keyboard.md | 206 +++++ .../version-0.63/keyboardavoidingview.md | 108 +++ .../version-0.63/layout-props.md | 775 ++++++++++++++++ .../version-0.63/layoutanimation.md | 567 ++++++++++++ .../versioned_docs/version-0.63/libraries.md | 78 ++ .../versioned_docs/version-0.63/linking.md | 405 +++++++++ website/versioned_docs/version-0.63/modal.md | 356 ++++++++ .../version-0.63/native-components-android.md | 191 ++++ .../version-0.63/native-modules-android.md | 473 ++++++++++ .../version-0.63/native-modules-ios.md | 525 +++++++++++ .../version-0.63/native-modules-setup.md | 32 + .../versioned_docs/version-0.63/navigation.md | 128 +++ .../versioned_docs/version-0.63/network.md | 234 +++++ .../optimizing-flatlist-configuration.md | 140 +++ .../version-0.63/out-of-tree-platforms.md | 45 + .../version-0.63/panresponder.md | 264 ++++++ .../version-0.63/permissionsandroid.md | 261 ++++++ website/versioned_docs/version-0.63/picker.md | 132 +++ .../versioned_docs/version-0.63/pixelratio.md | 164 ++++ .../version-0.63/platform-specific-code.md | 137 +++ .../version-0.63/platformcolor.md | 70 ++ .../versioned_docs/version-0.63/pressable.md | 229 +++++ .../versioned_docs/version-0.63/pressevent.md | 119 +++ .../version-0.63/progressbarandroid.md | 130 +++ .../version-0.63/progressviewios.md | 125 +++ website/versioned_docs/version-0.63/props.md | 58 ++ .../versioned_docs/version-0.63/react-node.md | 14 + website/versioned_docs/version-0.63/rect.md | 51 ++ .../version-0.63/refreshcontrol.md | 173 ++++ .../version-0.63/running-on-simulator-ios.md | 15 + .../version-0.63/safeareaview.md | 50 + .../versioned_docs/version-0.63/scrollview.md | 757 ++++++++++++++++ .../version-0.63/sectionlist.md | 499 ++++++++++ .../versioned_docs/version-0.63/security.md | 128 +++ .../version-0.63/segmentedcontrolios.md | 127 +++ .../versioned_docs/version-0.63/settings.md | 96 ++ .../version-0.63/shadow-props.md | 143 +++ website/versioned_docs/version-0.63/share.md | 158 ++++ .../version-0.63/signed-apk-android.md | 145 +++ website/versioned_docs/version-0.63/state.md | 53 ++ .../versioned_docs/version-0.63/statusbar.md | 326 +++++++ website/versioned_docs/version-0.63/style.md | 49 + .../versioned_docs/version-0.63/stylesheet.md | 348 +++++++ website/versioned_docs/version-0.63/switch.md | 121 +++ .../versioned_docs/version-0.63/systrace.md | 200 ++++ .../version-0.63/testing-overview.md | 275 ++++++ .../version-0.63/text-style-props.md | 510 +++++++++++ website/versioned_docs/version-0.63/text.md | 701 +++++++++++++++ .../versioned_docs/version-0.63/textinput.md | 851 ++++++++++++++++++ .../version-0.63/toastandroid.md | 201 +++++ .../version-0.63/touchablehighlight.md | 277 ++++++ .../version-0.63/touchablenativefeedback.md | 194 ++++ .../version-0.63/touchableopacity.md | 240 +++++ .../version-0.63/touchablewithoutfeedback.md | 367 ++++++++ .../versioned_docs/version-0.63/transforms.md | 302 +++++++ .../versioned_docs/version-0.63/tutorial.md | 172 ++++ .../versioned_docs/version-0.63/typescript.md | 236 +++++ .../version-0.63/usewindowdimensions.md | 80 ++ .../version-0.63/using-a-listview.md | 102 +++ .../versioned_docs/version-0.63/vibration.md | 243 +++++ .../version-0.63/view-style-props.md | 267 ++++++ website/versioned_docs/version-0.63/view.md | 639 +++++++++++++ .../version-0.63-sidebars.json | 179 ++++ website/versions.json | 1 + 102 files changed, 25997 insertions(+), 1 deletion(-) create mode 100644 website/versioned_docs/version-0.63/accessibility.md create mode 100644 website/versioned_docs/version-0.63/accessibilityinfo.md create mode 100644 website/versioned_docs/version-0.63/actionsheetios.md create mode 100644 website/versioned_docs/version-0.63/activityindicator.md create mode 100644 website/versioned_docs/version-0.63/alert.md create mode 100644 website/versioned_docs/version-0.63/animated.md create mode 100644 website/versioned_docs/version-0.63/animatedvalue.md create mode 100644 website/versioned_docs/version-0.63/animatedvaluexy.md create mode 100644 website/versioned_docs/version-0.63/animations.md create mode 100644 website/versioned_docs/version-0.63/appstate.md create mode 100644 website/versioned_docs/version-0.63/backhandler.md create mode 100644 website/versioned_docs/version-0.63/button.md create mode 100644 website/versioned_docs/version-0.63/checkbox.md create mode 100644 website/versioned_docs/version-0.63/colors.md create mode 100644 website/versioned_docs/version-0.63/components-and-apis.md create mode 100644 website/versioned_docs/version-0.63/datepickerios.md create mode 100644 website/versioned_docs/version-0.63/debugging.md create mode 100644 website/versioned_docs/version-0.63/dimensions.md create mode 100644 website/versioned_docs/version-0.63/dynamiccolorios.md create mode 100644 website/versioned_docs/version-0.63/easing.md create mode 100644 website/versioned_docs/version-0.63/flatlist.md create mode 100644 website/versioned_docs/version-0.63/flexbox.md create mode 100644 website/versioned_docs/version-0.63/getting-started.md create mode 100644 website/versioned_docs/version-0.63/handling-text-input.md create mode 100644 website/versioned_docs/version-0.63/height-and-width.md create mode 100644 website/versioned_docs/version-0.63/hermes.md create mode 100644 website/versioned_docs/version-0.63/image-style-props.md create mode 100644 website/versioned_docs/version-0.63/image.md create mode 100644 website/versioned_docs/version-0.63/imagebackground.md create mode 100644 website/versioned_docs/version-0.63/images.md create mode 100644 website/versioned_docs/version-0.63/inputaccessoryview.md create mode 100644 website/versioned_docs/version-0.63/integration-with-existing-apps.md create mode 100644 website/versioned_docs/version-0.63/interactionmanager.md create mode 100644 website/versioned_docs/version-0.63/intro-react-native-components.md create mode 100644 website/versioned_docs/version-0.63/intro-react.md create mode 100644 website/versioned_docs/version-0.63/introduction.md create mode 100644 website/versioned_docs/version-0.63/keyboard.md create mode 100644 website/versioned_docs/version-0.63/keyboardavoidingview.md create mode 100644 website/versioned_docs/version-0.63/layout-props.md create mode 100644 website/versioned_docs/version-0.63/layoutanimation.md create mode 100644 website/versioned_docs/version-0.63/libraries.md create mode 100644 website/versioned_docs/version-0.63/linking.md create mode 100644 website/versioned_docs/version-0.63/modal.md create mode 100644 website/versioned_docs/version-0.63/native-components-android.md create mode 100644 website/versioned_docs/version-0.63/native-modules-android.md create mode 100644 website/versioned_docs/version-0.63/native-modules-ios.md create mode 100644 website/versioned_docs/version-0.63/native-modules-setup.md create mode 100644 website/versioned_docs/version-0.63/navigation.md create mode 100644 website/versioned_docs/version-0.63/network.md create mode 100644 website/versioned_docs/version-0.63/optimizing-flatlist-configuration.md create mode 100644 website/versioned_docs/version-0.63/out-of-tree-platforms.md create mode 100644 website/versioned_docs/version-0.63/panresponder.md create mode 100644 website/versioned_docs/version-0.63/permissionsandroid.md create mode 100644 website/versioned_docs/version-0.63/picker.md create mode 100644 website/versioned_docs/version-0.63/pixelratio.md create mode 100644 website/versioned_docs/version-0.63/platform-specific-code.md create mode 100644 website/versioned_docs/version-0.63/platformcolor.md create mode 100644 website/versioned_docs/version-0.63/pressable.md create mode 100644 website/versioned_docs/version-0.63/pressevent.md create mode 100644 website/versioned_docs/version-0.63/progressbarandroid.md create mode 100644 website/versioned_docs/version-0.63/progressviewios.md create mode 100644 website/versioned_docs/version-0.63/props.md create mode 100644 website/versioned_docs/version-0.63/react-node.md create mode 100644 website/versioned_docs/version-0.63/rect.md create mode 100644 website/versioned_docs/version-0.63/refreshcontrol.md create mode 100644 website/versioned_docs/version-0.63/running-on-simulator-ios.md create mode 100644 website/versioned_docs/version-0.63/safeareaview.md create mode 100644 website/versioned_docs/version-0.63/scrollview.md create mode 100644 website/versioned_docs/version-0.63/sectionlist.md create mode 100644 website/versioned_docs/version-0.63/security.md create mode 100644 website/versioned_docs/version-0.63/segmentedcontrolios.md create mode 100644 website/versioned_docs/version-0.63/settings.md create mode 100644 website/versioned_docs/version-0.63/shadow-props.md create mode 100644 website/versioned_docs/version-0.63/share.md create mode 100644 website/versioned_docs/version-0.63/signed-apk-android.md create mode 100644 website/versioned_docs/version-0.63/state.md create mode 100644 website/versioned_docs/version-0.63/statusbar.md create mode 100644 website/versioned_docs/version-0.63/style.md create mode 100644 website/versioned_docs/version-0.63/stylesheet.md create mode 100644 website/versioned_docs/version-0.63/switch.md create mode 100644 website/versioned_docs/version-0.63/systrace.md create mode 100644 website/versioned_docs/version-0.63/testing-overview.md create mode 100644 website/versioned_docs/version-0.63/text-style-props.md create mode 100644 website/versioned_docs/version-0.63/text.md create mode 100644 website/versioned_docs/version-0.63/textinput.md create mode 100644 website/versioned_docs/version-0.63/toastandroid.md create mode 100644 website/versioned_docs/version-0.63/touchablehighlight.md create mode 100644 website/versioned_docs/version-0.63/touchablenativefeedback.md create mode 100644 website/versioned_docs/version-0.63/touchableopacity.md create mode 100644 website/versioned_docs/version-0.63/touchablewithoutfeedback.md create mode 100644 website/versioned_docs/version-0.63/transforms.md create mode 100644 website/versioned_docs/version-0.63/tutorial.md create mode 100644 website/versioned_docs/version-0.63/typescript.md create mode 100644 website/versioned_docs/version-0.63/usewindowdimensions.md create mode 100644 website/versioned_docs/version-0.63/using-a-listview.md create mode 100644 website/versioned_docs/version-0.63/vibration.md create mode 100644 website/versioned_docs/version-0.63/view-style-props.md create mode 100644 website/versioned_docs/version-0.63/view.md create mode 100644 website/versioned_sidebars/version-0.63-sidebars.json diff --git a/website/i18n/en.json b/website/i18n/en.json index ea5665fc127..efff99c1df0 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -3881,6 +3881,300 @@ "version-0.62/version-0.62-virtualizedlist": { "title": "VirtualizedList" }, + "version-0.63/version-0.63-accessibility": { + "title": "Accessibility" + }, + "version-0.63/version-0.63-accessibilityinfo": { + "title": "AccessibilityInfo" + }, + "version-0.63/version-0.63-actionsheetios": { + "title": "ActionSheetIOS" + }, + "version-0.63/version-0.63-activityindicator": { + "title": "ActivityIndicator" + }, + "version-0.63/version-0.63-alert": { + "title": "Alert" + }, + "version-0.63/version-0.63-animated": { + "title": "Animated" + }, + "version-0.63/version-0.63-animatedvalue": { + "title": "Animated.Value" + }, + "version-0.63/version-0.63-animatedvaluexy": { + "title": "Animated.ValueXY" + }, + "version-0.63/version-0.63-animations": { + "title": "Animations" + }, + "version-0.63/version-0.63-appstate": { + "title": "AppState" + }, + "version-0.63/version-0.63-backhandler": { + "title": "BackHandler" + }, + "version-0.63/version-0.63-button": { + "title": "Button" + }, + "version-0.63/version-0.63-checkbox": { + "title": "🚧 CheckBox" + }, + "version-0.63/version-0.63-colors": { + "title": "Color Reference" + }, + "version-0.63/version-0.63-components-and-apis": { + "title": "Core Components and APIs" + }, + "version-0.63/version-0.63-datepickerios": { + "title": "🚧 DatePickerIOS" + }, + "version-0.63/version-0.63-debugging": { + "title": "Debugging" + }, + "version-0.63/version-0.63-dimensions": { + "title": "Dimensions" + }, + "version-0.63/version-0.63-dynamiccolorios": { + "title": "DynamicColorIOS" + }, + "version-0.63/version-0.63-easing": { + "title": "Easing" + }, + "version-0.63/version-0.63-flatlist": { + "title": "FlatList" + }, + "version-0.63/version-0.63-flexbox": { + "title": "Layout with Flexbox" + }, + "version-0.63/version-0.63-environment-setup": { + "title": "Setting up the development environment" + }, + "version-0.63/version-0.63-handling-text-input": { + "title": "Handling Text Input" + }, + "version-0.63/version-0.63-height-and-width": { + "title": "Height and Width" + }, + "version-0.63/version-0.63-hermes": { + "title": "Using Hermes" + }, + "version-0.63/version-0.63-image-style-props": { + "title": "Image Style Props" + }, + "version-0.63/version-0.63-image": { + "title": "Image" + }, + "version-0.63/version-0.63-imagebackground": { + "title": "ImageBackground" + }, + "version-0.63/version-0.63-images": { + "title": "Images" + }, + "version-0.63/version-0.63-inputaccessoryview": { + "title": "InputAccessoryView" + }, + "version-0.63/version-0.63-integration-with-existing-apps": { + "title": "Integration with Existing Apps" + }, + "version-0.63/version-0.63-interactionmanager": { + "title": "InteractionManager" + }, + "version-0.63/version-0.63-intro-react-native-components": { + "title": "Core Components and Native Components" + }, + "version-0.63/version-0.63-intro-react": { + "title": "React Fundamentals" + }, + "version-0.63/version-0.63-getting-started": { + "title": "Introduction" + }, + "version-0.63/version-0.63-keyboard": { + "title": "Keyboard" + }, + "version-0.63/version-0.63-keyboardavoidingview": { + "title": "KeyboardAvoidingView" + }, + "version-0.63/version-0.63-layout-props": { + "title": "Layout Props" + }, + "version-0.63/version-0.63-layoutanimation": { + "title": "LayoutAnimation" + }, + "version-0.63/version-0.63-libraries": { + "title": "Using Libraries" + }, + "version-0.63/version-0.63-linking": { + "title": "Linking" + }, + "version-0.63/version-0.63-modal": { + "title": "Modal" + }, + "version-0.63/version-0.63-native-components-android": { + "title": "Native UI Components" + }, + "version-0.63/version-0.63-native-modules-android": { + "title": "Native Modules" + }, + "version-0.63/version-0.63-native-modules-ios": { + "title": "Native Modules" + }, + "version-0.63/version-0.63-native-modules-setup": { + "title": "Native Modules Setup" + }, + "version-0.63/version-0.63-navigation": { + "title": "Navigating Between Screens" + }, + "version-0.63/version-0.63-network": { + "title": "Networking" + }, + "version-0.63/version-0.63-optimizing-flatlist-configuration": { + "title": "Optimizing Flatlist Configuration" + }, + "version-0.63/version-0.63-out-of-tree-platforms": { + "title": "Out-of-Tree Platforms" + }, + "version-0.63/version-0.63-panresponder": { + "title": "PanResponder" + }, + "version-0.63/version-0.63-permissionsandroid": { + "title": "PermissionsAndroid" + }, + "version-0.63/version-0.63-picker": { + "title": "🚧 Picker" + }, + "version-0.63/version-0.63-pixelratio": { + "title": "PixelRatio" + }, + "version-0.63/version-0.63-platform-specific-code": { + "title": "Platform Specific Code" + }, + "version-0.63/version-0.63-platformcolor": { + "title": "PlatformColor" + }, + "version-0.63/version-0.63-pressable": { + "title": "Pressable" + }, + "version-0.63/version-0.63-pressevent": { + "title": "PressEvent Object Type" + }, + "version-0.63/version-0.63-progressbarandroid": { + "title": "🚧 ProgressBarAndroid" + }, + "version-0.63/version-0.63-progressviewios": { + "title": "🚧 ProgressViewIOS" + }, + "version-0.63/version-0.63-props": { + "title": "Props" + }, + "version-0.63/version-0.63-react-node": { + "title": "React Node Object Type" + }, + "version-0.63/version-0.63-rect": { + "title": "Rect Object Type" + }, + "version-0.63/version-0.63-refreshcontrol": { + "title": "RefreshControl" + }, + "version-0.63/version-0.63-running-on-simulator-ios": { + "title": "Running On Simulator" + }, + "version-0.63/version-0.63-safeareaview": { + "title": "SafeAreaView" + }, + "version-0.63/version-0.63-scrollview": { + "title": "ScrollView" + }, + "version-0.63/version-0.63-sectionlist": { + "title": "SectionList" + }, + "version-0.63/version-0.63-security": { + "title": "Security" + }, + "version-0.63/version-0.63-segmentedcontrolios": { + "title": "🚧 SegmentedControlIOS" + }, + "version-0.63/version-0.63-settings": { + "title": "Settings" + }, + "version-0.63/version-0.63-shadow-props": { + "title": "Shadow Props" + }, + "version-0.63/version-0.63-share": { + "title": "Share" + }, + "version-0.63/version-0.63-signed-apk-android": { + "title": "Publishing to Google Play Store" + }, + "version-0.63/version-0.63-state": { + "title": "State" + }, + "version-0.63/version-0.63-statusbar": { + "title": "StatusBar" + }, + "version-0.63/version-0.63-style": { + "title": "Style" + }, + "version-0.63/version-0.63-stylesheet": { + "title": "StyleSheet" + }, + "version-0.63/version-0.63-switch": { + "title": "Switch" + }, + "version-0.63/version-0.63-systrace": { + "title": "Systrace" + }, + "version-0.63/version-0.63-testing-overview": { + "title": "Testing" + }, + "version-0.63/version-0.63-text-style-props": { + "title": "Text Style Props" + }, + "version-0.63/version-0.63-text": { + "title": "Text" + }, + "version-0.63/version-0.63-textinput": { + "title": "TextInput" + }, + "version-0.63/version-0.63-toastandroid": { + "title": "ToastAndroid" + }, + "version-0.63/version-0.63-touchablehighlight": { + "title": "TouchableHighlight" + }, + "version-0.63/version-0.63-touchablenativefeedback": { + "title": "TouchableNativeFeedback" + }, + "version-0.63/version-0.63-touchableopacity": { + "title": "TouchableOpacity" + }, + "version-0.63/version-0.63-touchablewithoutfeedback": { + "title": "TouchableWithoutFeedback" + }, + "version-0.63/version-0.63-transforms": { + "title": "Transforms" + }, + "version-0.63/version-0.63-tutorial": { + "title": "Learn the Basics" + }, + "version-0.63/version-0.63-typescript": { + "title": "Using TypeScript" + }, + "version-0.63/version-0.63-usewindowdimensions": { + "title": "useWindowDimensions" + }, + "version-0.63/version-0.63-using-a-listview": { + "title": "Using List Views" + }, + "version-0.63/version-0.63-vibration": { + "title": "Vibration" + }, + "version-0.63/version-0.63-view-style-props": { + "title": "View Style Props" + }, + "version-0.63/version-0.63-view": { + "title": "View" + }, "version-0.7/version-0.7-pushnotificationios": { "title": "PushNotificationIOS" }, diff --git a/website/siteConfig.js b/website/siteConfig.js index e72cbff4ad2..ad8a2d95210 100644 --- a/website/siteConfig.js +++ b/website/siteConfig.js @@ -15,7 +15,7 @@ try { // We don't care if there are no repos synced locally // We only care if we are on the CI server and about to deploy } -const defaultVersionShown = '0.62'; +const defaultVersionShown = '0.63'; const baseUrl = '/'; const repoUrl = 'https://github.com/facebook/react-native'; const siteConfig = { diff --git a/website/versioned_docs/version-0.63/accessibility.md b/website/versioned_docs/version-0.63/accessibility.md new file mode 100644 index 00000000000..0502544408f --- /dev/null +++ b/website/versioned_docs/version-0.63/accessibility.md @@ -0,0 +1,312 @@ +--- +id: version-0.63-accessibility +title: Accessibility +description: Create mobile apps accessible to assistive technology with React Native's suite of APIs designed to work with Android and iOS. +original_id: accessibility +--- + +Both Android and iOS provide APIs for integrating apps with assistive technologies like the bundled screen readers VoiceOver (iOS) and Talkback (Android). React Native has complementary APIs that let your app accommodate all users. + +> Android and iOS differ slightly in their approaches, and thus the React Native implementations may vary by platform. + +## Accessibility properties + +### `accessible` + +When `true`, indicates that the view is an accessibility element. When a view is an accessibility element, it groups its children into a single selectable component. By default, all touchable elements are accessible. + +On Android, `accessible={true}` property for a react-native View will be translated into native `focusable={true}`. + +```jsx + + text one + text two + +``` + +In the above example, we can't get accessibility focus separately on 'text one' and 'text two'. Instead we get focus on a parent view with 'accessible' property. + +### `accessibilityLabel` + +When a view is marked as accessible, it is a good practice to set an accessibilityLabel on the view, so that people who use VoiceOver know what element they have selected. VoiceOver will read this string when a user selects the associated element. + +To use, set the `accessibilityLabel` property to a custom string on your View, Text or Touchable: + +```jsx + + + Press me! + + +``` + +In the above example, the `accessibilityLabel` on the TouchableOpacity element would default to "Press me!". The label is constructed by concatenating all Text node children separated by spaces. + +### `accessibilityHint` + +An accessibility hint helps users understand what will happen when they perform an action on the accessibility element when that result is not clear from the accessibility label. + +To use, set the `accessibilityHint` property to a custom string on your View, Text or Touchable: + +```jsx + + + Back + + +``` + +iOS In the above example, VoiceOver will read the hint after the label, if the user has hints enabled in the device's VoiceOver settings. Read more about guidelines for accessibilityHint in the [iOS Developer Docs](https://developer.apple.com/documentation/objectivec/nsobject/1615093-accessibilityhint) + +Android In the above example, Talkback will read the hint after the label. At this time, hints cannot be turned off on Android. + +### `accessibilityIgnoresInvertColors`
iOS
+ +Inverting screen colors is an Accessibility feature that makes the iPhone and iPad easier on the eyes for some people with a sensitivity to brightness, easier to distinguish for some people with color blindness, and easier to make out for some people with low vision. However, sometimes you have views such as photos that you don't want to be inverted. In this case, you can set this property to be false so that these specific views won't have their colors inverted. + +### `accessibilityLiveRegion`
Android
+ +When components dynamically change, we want TalkBack to alert the end user. This is made possible by the `accessibilityLiveRegion` property. It can be set to `none`, `polite` and `assertive`: + +- **none** Accessibility services should not announce changes to this view. +- **polite** Accessibility services should announce changes to this view. +- **assertive** Accessibility services should interrupt ongoing speech to immediately announce changes to this view. + +```jsx + + + Click me + + + + Clicked {count} times + +``` + +In the above example method `addOne` changes the state variable `count`. As soon as an end user clicks the TouchableWithoutFeedback, TalkBack reads text in the Text view because of its `accessibilityLiveRegion="polite"` property. + +### `accessibilityRole` + +`accessibilityRole` communicates the purpose of a component to the user of an assistive technology. + +`accessibilityRole` can be one of the following: + +- **adjustable** Used when an element can be "adjusted" (e.g. a slider). +- **alert** Used when an element contains important text to be presented to the user. +- **button** Used when the element should be treated as a button. +- **checkbox** Used when an element represents a checkbox which can be checked, unchecked, or have mixed checked state. +- **combobox** Used when an element represents a combo box, which allows the user to select among several choices. +- **header** Used when an element acts as a header for a content section (e.g. the title of a navigation bar). +- **image** Used when the element should be treated as an image. Can be combined with button or link, for example. +- **imagebutton** Used when the element should be treated as a button and is also an image. +- **keyboardkey** Used when the element acts as a keyboard key. +- **link** Used when the element should be treated as a link. +- **menu** Used when the component is a menu of choices. +- **menubar** Used when a component is a container of multiple menus. +- **menuitem** Used to represent an item within a menu. +- **none** Used when the element has no role. +- **progressbar** Used to represent a component which indicates progress of a task. +- **radio** Used to represent a radio button. +- **radiogroup** Used to represent a group of radio buttons. +- **scrollbar** Used to represent a scroll bar. +- **search** Used when the text field element should also be treated as a search field. +- **spinbutton** Used to represent a button which opens a list of choices. +- **summary** Used when an element can be used to provide a quick summary of current conditions in the app when the app first launches. +- **switch** Used to represent a switch which can be turned on and off. +- **tab** Used to represent a tab. +- **tablist** Used to represent a list of tabs. +- **text** Used when the element should be treated as static text that cannot change. +- **timer** Used to represent a timer. +- **toolbar** Used to represent a tool bar (a container of action buttons or components). + +### `accessibilityState` + +Describes the current state of a component to the user of an assistive technology. + +`accessibilityState` is an object. It contains the following fields: + +| Name | Description | Type | Required | +| -------- | ------------------------------------------------------------------------------------------------------------------------------------- | ------------------ | -------- | +| disabled | Indicates whether the element is disabled or not. | boolean | No | +| selected | Indicates whether a selectable element is currently selected or not. | boolean | No | +| checked | Indicates the state of a checkable element. This field can either take a boolean or the "mixed" string to represent mixed checkboxes. | boolean or 'mixed' | No | +| busy | Indicates whether an element is currently busy or not. | boolean | No | +| expanded | Indicates whether an expandable element is currently expanded or collapsed. | boolean | No | + +To use, set the `accessibilityState` to an object with a specific definition. + +### `accessibilityValue` + +Represents the current value of a component. It can be a textual description of a component's value, or for range-based components, such as sliders and progress bars, it contains range information (minimum, current, and maximum). + +`accessibilityValue` is an object. It contains the following fields: + +| Name | Description | Type | Required | +| ---- | ---------------------------------------------------------------------------------------------- | ------- | ------------------------- | +| min | The minimum value of this component's range. | integer | Required if `now` is set. | +| max | The maximum value of this component's range. | integer | Required if `now` is set. | +| now | The current value of this component's range. | integer | No | +| text | A textual description of this component's value. Will override `min`, `now`, and `max` if set. | string | No | + +### `accessibilityViewIsModal`
iOS
+ +A Boolean value indicating whether VoiceOver should ignore the elements within views that are siblings of the receiver. + +For example, in a window that contains sibling views `A` and `B`, setting `accessibilityViewIsModal` to `true` on view `B` causes VoiceOver to ignore the elements in the view `A`. On the other hand, if view `B` contains a child view `C` and you set `accessibilityViewIsModal` to `true` on view `C`, VoiceOver does not ignore the elements in view `A`. + +### `accessibilityElementsHidden`
iOS
+ +A Boolean value indicating whether the accessibility elements contained within this accessibility element are hidden. + +For example, in a window that contains sibling views `A` and `B`, setting `accessibilityElementsHidden` to `true` on view `B` causes VoiceOver to ignore the elements in the view `B`. This is similar to the Android property `importantForAccessibility="no-hide-descendants"`. + +### `importantForAccessibility`
Android
+ +In the case of two overlapping UI components with the same parent, default accessibility focus can have unpredictable behavior. The `importantForAccessibility` property will resolve this by controlling if a view fires accessibility events and if it is reported to accessibility services. It can be set to `auto`, `yes`, `no` and `no-hide-descendants` (the last value will force accessibility services to ignore the component and all of its children). + +```jsx + + + First layout + + + Second layout + + +``` + +In the above example, the `yellow` layout and its descendants are completely invisible to TalkBack and all other accessibility services. So we can use overlapping views with the same parent without confusing TalkBack. + +### `onAccessibilityEscape`
iOS
+ +Assign this property to a custom function which will be called when someone performs the "escape" gesture, which is a two finger Z shaped gesture. An escape function should move back hierarchically in the user interface. This can mean moving up or back in a navigation hierarchy or dismissing a modal user interface. If the selected element does not have an `onAccessibilityEscape` function, the system will attempt to traverse up the view hierarchy until it finds a view that does or bonk to indicate it was unable to find one. + +### `onAccessibilityTap` + +Use this property to assign a custom function to be called when someone activates an accessible element by double tapping on it while it's selected. + +### `onMagicTap`
iOS
+ +Assign this property to a custom function which will be called when someone performs the "magic tap" gesture, which is a double-tap with two fingers. A magic tap function should perform the most relevant action a user could take on a component. In the Phone app on iPhone, a magic tap answers a phone call, or ends the current one. If the selected element does not have an `onMagicTap` function, the system will traverse up the view hierarchy until it finds a view that does. + +## Accessibility Actions + +Accessibility actions allow an assistive technology to programmatically invoke the actions of a component. In order to support accessibility actions, a component must do two things: + +- Define the list of actions it supports via the `accessibilityActions` property. +- Implement an `onAccessibilityAction` function to handle action requests. + +The `accessibilityActions` property should contain a list of action objects. Each action object should contain the following fields: + +| Name | Type | Required | +| ----- | ------ | -------- | +| name | string | Yes | +| label | string | No | + +Actions either represent standard actions, such as clicking a button or adjusting a slider, or custom actions specific to a given component such as deleting an email message. The `name` field is required for both standard and custom actions, but `label` is optional for standard actions. + +When adding support for standard actions, `name` must be one of the following: + +- `'magicTap'` - iOS only - While VoiceOver focus is on or inside the component, the user double tapped with two fingers. +- `'escape'` - iOS only - While VoiceOver focus is on or inside the component, the user performed a two finger scrub gesture (left, right, left). +- `'activate'` - Activate the component. Typically this should perform the same action as when the user touches or clicks the component when not using an assistive technology. This is generated when a screen reader user double taps the component. +- `'increment'` - Increment an adjustable component. On iOS, VoiceOver generates this action when the component has a role of `'adjustable'` and the user places focus on it and swipes upward. On Android, TalkBack generates this action when the user places accessibility focus on the component and presses the volume up button. +- `'decrement'` - Decrement an adjustable component. On iOS, VoiceOver generates this action when the component has a role of `'adjustable'` and the user places focus on it and swipes downward. On Android, TalkBack generates this action when the user places accessibility focus on the component and presses the volume down button. +- `'longpress'` - Android only - This action is generated when the user places accessibility focus on the component and double tap and holds one finger on the screen. Typically, this should perform the same action as when the user holds down one finger on the component while not using an assistive technology. + +The `label` field is optional for standard actions, and is often unused by assistive technologies. For custom actions, it is a localized string containing a description of the action to be presented to the user. + +To handle action requests, a component must implement an `onAccessibilityAction` function. The only argument to this function is an event containing the name of the action to perform. The below example from RNTester shows how to create a component which defines and handles several custom actions. + +```jsx + { + switch (event.nativeEvent.actionName) { + case 'cut': + Alert.alert('Alert', 'cut action success'); + break; + case 'copy': + Alert.alert('Alert', 'copy action success'); + break; + case 'paste': + Alert.alert('Alert', 'paste action success'); + break; + } + }} +/> +``` + +## Checking if a Screen Reader is Enabled + +The `AccessibilityInfo` API allows you to determine whether or not a screen reader is currently active. See the [AccessibilityInfo documentation](accessibilityinfo) for details. + +## Sending Accessibility Events
Android
+ +Sometimes it is useful to trigger an accessibility event on a UI component (i.e. when a custom view appears on a screen or set accessibility focus to a view). Native UIManager module exposes a method ‘sendAccessibilityEvent’ for this purpose. It takes two arguments: view tag and a type of an event. The supported event types are `typeWindowStateChanged`, `typeViewFocused` and `typeViewClicked`. + +```jsx +import { + Platform, + UIManager, + findNodeHandle +} from 'react-native'; + +if (Platform.OS === 'android') { + UIManager.sendAccessibilityEvent( + findNodeHandle(this), + UIManager.AccessibilityEventTypes.typeViewFocused + ); +} +``` + +## Testing TalkBack Support
Android
+ +To enable TalkBack, go to the Settings app on your Android device or emulator. Tap Accessibility, then TalkBack. Toggle the "Use service" switch to enable or disable it. + +P.S. Android emulator doesn’t have TalkBack by default. To install it: + +1. Download TalkBack file here: https://google-talkback.en.uptodown.com/android +2. Drag the downloaded `.apk` file into the emulator + +You can use the volume key shortcut to toggle TalkBack. To turn on the volume key shortcut, go to the Settings app, then Accessibility. At the top, turn on Volume key shortcut. + +To use the volume key shortcut, press both volume keys for 3 seconds to start an accessibility tool. + +Additionally, if you prefer, you can toggle TalkBack via command line with: + +```sh +# disable +adb shell settings put secure enabled_accessibility_services com.android.talkback/com.google.android.marvin.talkback.TalkBackService + +# enable +adb shell settings put secure enabled_accessibility_services com.google.android.marvin.talkback/com.google.android.marvin.talkback.TalkBackService +``` + +## Testing VoiceOver Support
iOS
+ +To enable VoiceOver, go to the Settings app on your iOS device (it's not available for simulator). Tap General, then Accessibility. There you will find many tools that people use to make their devices more usable, such as bolder text, increased contrast, and VoiceOver. + +To enable VoiceOver, tap on VoiceOver under "Vision" and toggle the switch that appears at the top. + +At the very bottom of the Accessibility settings, there is an "Accessibility Shortcut". You can use this to toggle VoiceOver by triple clicking the Home button. + +## Additional Resources + +- [Making React Native Apps Accessible](https://engineering.fb.com/ios/making-react-native-apps-accessible/) diff --git a/website/versioned_docs/version-0.63/accessibilityinfo.md b/website/versioned_docs/version-0.63/accessibilityinfo.md new file mode 100644 index 00000000000..9e1c99053de --- /dev/null +++ b/website/versioned_docs/version-0.63/accessibilityinfo.md @@ -0,0 +1,285 @@ +--- +id: version-0.63-accessibilityinfo +title: AccessibilityInfo +original_id: accessibilityinfo +--- + +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. + +## Example + +
+
    + + +
+
+ + + +```SnackPlayer name=AccessibilityInfo%20Function%20Component%20Example&supportedPlatforms=android,ios +import React, { useState, useEffect } from "react"; +import { AccessibilityInfo, View, Text, StyleSheet } from "react-native"; + +const App = () => { + const [reduceMotionEnabled, setReduceMotionEnabled] = useState(false); + const [screenReaderEnabled, setScreenReaderEnabled] = useState(false); + + useEffect(() => { + AccessibilityInfo.addEventListener( + "reduceMotionChanged", + handleReduceMotionToggled + ); + AccessibilityInfo.addEventListener( + "screenReaderChanged", + handleScreenReaderToggled + ); + + AccessibilityInfo.isReduceMotionEnabled().then( + reduceMotionEnabled => { + setReduceMotionEnabled(reduceMotionEnabled); + } + ); + AccessibilityInfo.isScreenReaderEnabled().then( + screenReaderEnabled => { + setScreenReaderEnabled(screenReaderEnabled); + } + ); + + return () => { + AccessibilityInfo.removeEventListener( + "reduceMotionChanged", + handleReduceMotionToggled + ); + AccessibilityInfo.removeEventListener( + "screenReaderChanged", + handleScreenReaderToggled + ); + }; + }, []); + + const handleReduceMotionToggled = reduceMotionEnabled => { + setReduceMotionEnabled(reduceMotionEnabled); + }; + + const handleScreenReaderToggled = screenReaderEnabled => { + setScreenReaderEnabled(screenReaderEnabled); + }; + + return ( + + + The reduce motion is {reduceMotionEnabled ? "enabled" : "disabled"}. + + + The screen reader is {screenReaderEnabled ? "enabled" : "disabled"}. + + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + alignItems: "center", + justifyContent: "center" + }, + status: { + margin: 30 + } +}); + +export default App; +``` + + + +```SnackPlayer name=AccessibilityInfo%20Class%20Component%20Example&supportedPlatforms=android,ios +import React, { Component } from 'react'; +import { AccessibilityInfo, View, Text, StyleSheet } from 'react-native'; + +class AccessibilityStatusExample extends Component { + state = { + reduceMotionEnabled: false, + screenReaderEnabled: false, + }; + + componentDidMount() { + AccessibilityInfo.addEventListener( + 'reduceMotionChanged', + this._handleReduceMotionToggled + ); + AccessibilityInfo.addEventListener( + 'screenReaderChanged', + this._handleScreenReaderToggled + ); + + AccessibilityInfo.isReduceMotionEnabled().then(reduceMotionEnabled => { + this.setState({ reduceMotionEnabled }); + }); + AccessibilityInfo.isScreenReaderEnabled().then(screenReaderEnabled => { + this.setState({ screenReaderEnabled }); + }); + } + + componentWillUnmount() { + AccessibilityInfo.removeEventListener( + 'reduceMotionChanged', + this._handleReduceMotionToggled + ); + + AccessibilityInfo.removeEventListener( + 'screenReaderChanged', + this._handleScreenReaderToggled + ); + } + + _handleReduceMotionToggled = reduceMotionEnabled => { + this.setState({ reduceMotionEnabled }); + }; + + _handleScreenReaderToggled = screenReaderEnabled => { + this.setState({ screenReaderEnabled }); + }; + + render() { + return ( + + + The reduce motion is{' '} + {this.state.reduceMotionEnabled ? 'enabled' : 'disabled'}. + + + The screen reader is{' '} + {this.state.screenReaderEnabled ? 'enabled' : 'disabled'}. + + + ); + } + + styles = StyleSheet.create({ + container: { + flex: 1, + alignItems: 'center', + justifyContent: 'center', + }, + status: { + margin: 30, + }, + }); +} + +export default AccessibilityStatusExample; +``` + + + +--- + +# Reference + +## Methods + +### `isBoldTextEnabled()` + +```jsx +static isBoldTextEnabled() +``` + +**iOS-Only.** Query whether a 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. + +### `isGrayscaleEnabled()` + +```jsx +static isGrayscaleEnabled() +``` + +**iOS-Only.** 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. + +### `isInvertColorsEnabled()` + +```jsx +static isInvertColorsEnabled() +``` + +**iOS-Only.** Query whether invert colors is currently enabled. Returns a promise which resolves to a boolean. The result is `true` when invert colors is enabled and `false` otherwise. + +### `isReduceMotionEnabled()` + +```jsx +static isReduceMotionEnabled() +``` + +Query whether reduce motion is currently enabled. Returns a promise which resolves to a boolean. The result is `true` when reduce motion is enabled and `false` otherwise. + +### `isReduceTransparencyEnabled()` + +```jsx +static isReduceTransparencyEnabled() +``` + +**iOS-Only.** Query whether reduce 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. + +### `isScreenReaderEnabled()` + +```jsx +static isScreenReaderEnabled() +``` + +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. + +--- + +### `addEventListener()` + +```jsx +static addEventListener(eventName, handler) +``` + +Add an event handler. Supported events: + +- `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 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 invert colors is enabled and `false` otherwise. +- `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. +- `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 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. + +--- + +### `setAccessibilityFocus()` + +```jsx +static setAccessibilityFocus(reactTag) +``` + +Set accessibility focus to a React component. On Android, this calls `UIManager.sendAccessibilityEvent(reactTag, UIManager.AccessibilityEventTypes.typeViewFocused);`. + +> **Note**: Make sure that any `View` you want to receive the accessibility focus has `accessible={true}`. + +--- + +### `announceForAccessibility()` + +```jsx +static announceForAccessibility(announcement) +``` + +Post a string to be announced by the screen reader. + +--- + +### `removeEventListener()` + +```jsx +static removeEventListener(eventName, handler) +``` + +Remove an event handler. diff --git a/website/versioned_docs/version-0.63/actionsheetios.md b/website/versioned_docs/version-0.63/actionsheetios.md new file mode 100644 index 00000000000..267358e239d --- /dev/null +++ b/website/versioned_docs/version-0.63/actionsheetios.md @@ -0,0 +1,119 @@ +--- +id: version-0.63-actionsheetios +title: ActionSheetIOS +original_id: actionsheetios +--- + +Displays native to iOS [Action Sheet](https://developer.apple.com/design/human-interface-guidelines/ios/views/action-sheets/) component. + +## Example + +```SnackPlayer name=ActionSheetIOS&supportedPlatforms=ios +import React, { useState } from "react"; +import { ActionSheetIOS, Button, StyleSheet, Text, View } from "react-native"; + +const App = () => { + const [result, setResult] = useState("🔮"); + + const onPress = () => + ActionSheetIOS.showActionSheetWithOptions( + { + options: ["Cancel", "Generate number", "Reset"], + destructiveButtonIndex: 2, + cancelButtonIndex: 0 + }, + buttonIndex => { + if (buttonIndex === 0) { + // cancel action + } else if (buttonIndex === 1) { + setResult(Math.floor(Math.random() * 100) + 1); + } else if (buttonIndex === 2) { + setResult("🔮"); + } + } + ); + + return ( + + {result} + + + +
+ + + +> If you’re familiar with `@media (prefers-color-scheme: dark)` in CSS, this is similar! Only instead of defining all the colors in a media query, you define which color to use under what circumstances right there where you're using it. Neat! + + + +> The `DynamicColorIOS` function is similar to the iOS native methods [`UIColor colorWithDynamicProvider:`](https://developer.apple.com/documentation/uikit/uicolor/3238040-colorwithdynamicprovider) + + + +## Example + +```jsx +import { DynamicColorIOS } from 'react-native'; + +const customDynamicTextColor = DynamicColorIOS({ + dark: 'lightskyblue', + light: 'midnightblue' +}); +``` diff --git a/website/versioned_docs/version-0.63/easing.md b/website/versioned_docs/version-0.63/easing.md new file mode 100644 index 00000000000..872af89d218 --- /dev/null +++ b/website/versioned_docs/version-0.63/easing.md @@ -0,0 +1,390 @@ +--- +id: version-0.63-easing +title: Easing +original_id: easing +--- + +The `Easing` module implements common easing functions. This module is used by [Animated.timing()](animated.md#timing) to convey physically believable motion in animations. + +You can find a visualization of some common easing functions at http://easings.net/ + +### Predefined animations + +The `Easing` module provides several predefined animations through the following methods: + +- [`back`](easing.md#back) provides a basic animation where the object goes slightly back before moving forward +- [`bounce`](easing.md#bounce) provides a bouncing animation +- [`ease`](easing.md#ease) provides a basic inertial animation +- [`elastic`](easing.md#elastic) provides a basic spring interaction + +### Standard functions + +Three standard easing functions are provided: + +- [`linear`](easing.md#linear) +- [`quad`](easing.md#quad) +- [`cubic`](easing.md#cubic) + +The [`poly`](easing.md#poly) function can be used to implement quartic, quintic, and other higher power functions. + +### Additional functions + +Additional mathematical functions are provided by the following methods: + +- [`bezier`](easing.md#bezier) provides a cubic bezier curve +- [`circle`](easing.md#circle) provides a circular function +- [`sin`](easing.md#sin) provides a sinusoidal function +- [`exp`](easing.md#exp) provides an exponential function + +The following helpers are used to modify other easing functions. + +- [`in`](easing.md#in) runs an easing function forwards +- [`inOut`](easing.md#inout) makes any easing function symmetrical +- [`out`](easing.md#out) runs an easing function backwards + +## Example + +```SnackPlayer name=Easing%20Demo +import React from "react"; +import { Animated, Easing, SectionList, StatusBar, StyleSheet, Text, TouchableOpacity, View } from "react-native"; + +const App = () => { + let opacity = new Animated.Value(0); + + const animate = easing => { + opacity.setValue(0); + Animated.timing(opacity, { + toValue: 1, + duration: 1200, + easing + }).start(); + }; + + const size = opacity.interpolate({ + inputRange: [0, 1], + outputRange: [0, 80] + }); + + const animatedStyles = [ + styles.box, + { + opacity, + width: size, + height: size + } + ]; + + return ( + + + ); +}; + +const SECTIONS = [ + { + title: "Predefined animations", + data: [ + { title: "Bounce", easing: Easing.bounce }, + { title: "Ease", easing: Easing.ease }, + { title: "Elastic", easing: Easing.elastic(4) } + ] + }, + { + title: "Standard functions", + data: [ + { title: "Linear", easing: Easing.linear }, + { title: "Quad", easing: Easing.quad }, + { title: "Cubic", easing: Easing.cubic } + ] + }, + { + title: "Additional functions", + data: [ + { + title: "Bezier", + easing: Easing.bezier(0, 2, 1, -1) + }, + { title: "Circle", easing: Easing.circle }, + { title: "Sin", easing: Easing.sin }, + { title: "Exp", easing: Easing.exp } + ] + }, + { + title: "Combinations", + data: [ + { + title: "In + Bounce", + easing: Easing.in(Easing.bounce) + }, + { + title: "Out + Exp", + easing: Easing.out(Easing.exp) + }, + { + title: "InOut + Elastic", + easing: Easing.inOut(Easing.elastic(1)) + } + ] + } +]; + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: "#20232a" + }, + title: { + marginTop: 10, + textAlign: "center", + color: "#61dafb" + }, + boxContainer: { + height: 160, + alignItems: "center" + }, + box: { + marginTop: 32, + borderRadius: 4, + backgroundColor: "#61dafb" + }, + list: { + backgroundColor: "#fff" + }, + listHeader: { + paddingHorizontal: 8, + paddingVertical: 4, + backgroundColor: "#f4f4f4", + color: "#999", + fontSize: 12, + textTransform: "uppercase" + }, + listRow: { + padding: 8 + } +}); + +export default App; +``` + +--- + +# Reference + +## Methods + +### `step0()` + +```jsx +static step0(n) +``` + +A stepping function, returns 1 for any positive value of `n`. + +--- + +### `step1()` + +```jsx +static step1(n) +``` + +A stepping function, returns 1 if `n` is greater than or equal to 1. + +--- + +### `linear()` + +```jsx +static linear(t) +``` + +A linear function, `f(t) = t`. Position correlates to elapsed time one to one. + +http://cubic-bezier.com/#0,0,1,1 + +--- + +### `ease()` + +```jsx +static ease(t) +``` + +A basic inertial interaction, similar to an object slowly accelerating to speed. + +http://cubic-bezier.com/#.42,0,1,1 + +--- + +### `quad()` + +```jsx +static quad(t) +``` + +A quadratic function, `f(t) = t * t`. Position equals the square of elapsed time. + +http://easings.net/#easeInQuad + +--- + +### `cubic()` + +```jsx +static cubic(t) +``` + +A cubic function, `f(t) = t * t * t`. Position equals the cube of elapsed time. + +http://easings.net/#easeInCubic + +--- + +### `poly()` + +```jsx +static poly(n) +``` + +A power function. Position is equal to the Nth power of elapsed time. + +n = 4: http://easings.net/#easeInQuart n = 5: http://easings.net/#easeInQuint + +--- + +### `sin()` + +```jsx +static sin(t) +``` + +A sinusoidal function. + +http://easings.net/#easeInSine + +--- + +### `circle()` + +```jsx +static circle(t) +``` + +A circular function. + +http://easings.net/#easeInCirc + +--- + +### `exp()` + +```jsx +static exp(t) +``` + +An exponential function. + +http://easings.net/#easeInExpo + +--- + +### `elastic()` + +```jsx +static elastic(bounciness) +``` + +A basic elastic interaction, similar to a spring oscillating back and forth. + +Default bounciness is 1, which overshoots a little bit once. 0 bounciness doesn't overshoot at all, and bounciness of N > 1 will overshoot about N times. + +http://easings.net/#easeInElastic + +--- + +### `back()` + +```jsx +static back(s) +``` + +Use with `Animated.parallel()` to create a basic effect where the object animates back slightly as the animation starts. + +--- + +### `bounce()` + +```jsx +static bounce(t) +``` + +Provides a basic bouncing effect. + +http://easings.net/#easeInBounce + +--- + +### `bezier()` + +```jsx +static bezier(x1, y1, x2, y2) +``` + +Provides a cubic bezier curve, equivalent to CSS Transitions' `transition-timing-function`. + +A useful tool to visualize cubic bezier curves can be found at http://cubic-bezier.com/ + +--- + +### `in()` + + +```jsx +static in(easing); +``` + + +Runs an easing function forwards. + +--- + +### `out()` + +```jsx +static out(easing) +``` + +Runs an easing function backwards. + +--- + +### `inOut()` + +```jsx +static inOut(easing) +``` + +Makes any easing function symmetrical. The easing function will run forwards for half of the duration, then backwards for the rest of the duration. diff --git a/website/versioned_docs/version-0.63/flatlist.md b/website/versioned_docs/version-0.63/flatlist.md new file mode 100644 index 00000000000..fd5b4bd8773 --- /dev/null +++ b/website/versioned_docs/version-0.63/flatlist.md @@ -0,0 +1,708 @@ +--- +id: version-0.63-flatlist +title: FlatList +original_id: flatlist +--- + +A performant interface for rendering basic, flat lists, supporting the most handy features: + +- Fully cross-platform. +- Optional horizontal mode. +- Configurable viewability callbacks. +- Header support. +- Footer support. +- Separator support. +- Pull to Refresh. +- Scroll loading. +- ScrollToIndex support. +- Multiple column support. + +If you need section support, use [``](sectionlist.md). + +## Example + +```SnackPlayer name=flatlist-simple +import React from 'react'; +import { SafeAreaView, View, FlatList, StyleSheet, Text, StatusBar } from 'react-native'; + +const DATA = [ + { + id: 'bd7acbea-c1b1-46c2-aed5-3ad53abb28ba', + title: 'First Item', + }, + { + id: '3ac68afc-c605-48d3-a4f8-fbd91aa97f63', + title: 'Second Item', + }, + { + id: '58694a0f-3da1-471f-bd96-145571e29d72', + title: 'Third Item', + }, +]; + +const Item = ({ title }) => ( + + {title} + +); + +const App = () => { + const renderItem = ({ item }) => ( + + ); + + return ( + + item.id} + /> + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + marginTop: StatusBar.currentHeight || 0, + }, + item: { + backgroundColor: '#f9c2ff', + padding: 20, + marginVertical: 8, + marginHorizontal: 16, + }, + title: { + fontSize: 32, + }, +}); + +export default App; +``` + +To render multiple columns, use the [`numColumns`](flatlist.md#numcolumns) prop. Using this approach instead of a `flexWrap` layout can prevent conflicts with the item height logic. + +More complex, multi-select example demonstrating `` usage for perf optimization and avoiding bugs. + +- By passing `extraData={selected}` to `FlatList` we make sure `FlatList` itself will re-render when the state changes. Without setting this prop, `FlatList` would not know it needs to re-render any items because it is a `PureComponent` and the prop comparison will not show any changes. +- `keyExtractor` tells the list to use the `id`s for the react keys instead of the default `key` property. + +```SnackPlayer name=flatlist-selectable +import React, { useState } from "react"; +import { FlatList, SafeAreaView, StatusBar, StyleSheet, Text, TouchableOpacity } from "react-native"; + +const DATA = [ + { + id: "bd7acbea-c1b1-46c2-aed5-3ad53abb28ba", + title: "First Item", + }, + { + id: "3ac68afc-c605-48d3-a4f8-fbd91aa97f63", + title: "Second Item", + }, + { + id: "58694a0f-3da1-471f-bd96-145571e29d72", + title: "Third Item", + }, +]; + +const Item = ({ item, onPress, style }) => ( + + {item.title} + +); + +const App = () => { + const [selectedId, setSelectedId] = useState(null); + + const renderItem = ({ item }) => { + const backgroundColor = item.id === selectedId ? "#6e3b6e" : "#f9c2ff"; + + return ( + setSelectedId(item.id)} + style={{ backgroundColor }} + /> + ); + }; + + return ( + + item.id} + extraData={selectedId} + /> + + ); +}; + +const styles = StyleSheet.create({ + container: { + flex: 1, + marginTop: StatusBar.currentHeight || 0, + }, + item: { + padding: 20, + marginVertical: 8, + marginHorizontal: 16, + }, + title: { + fontSize: 32, + }, +}); + +export default App; +``` + +This is a convenience wrapper around [``](virtualizedlist.md), and thus inherits its props (as well as those of [``](scrollview.md)) that aren't explicitly listed here, along with the following caveats: + +- Internal state is not preserved when content scrolls out of the render window. Make sure all your data is captured in the item data or external stores like Flux, Redux, or Relay. +- This is a `PureComponent` which means that it will not re-render if `props` remain shallow-equal. Make sure that everything your `renderItem` function depends on is passed as a prop (e.g. `extraData`) that is not `===` after updates, otherwise your UI may not update on changes. This includes the `data` prop and parent component state. +- In order to constrain memory and enable smooth scrolling, content is rendered asynchronously offscreen. This means it's possible to scroll faster than the fill rate and momentarily see blank content. This is a tradeoff that can be adjusted to suit the needs of each application, and we are working on improving it behind the scenes. +- By default, the list looks for a `key` prop on each item and uses that for the React key. Alternatively, you can provide a custom `keyExtractor` prop. + +--- + +# Reference + +## Props + +Inherits [ScrollView Props](scrollview.md#props), unless it is nested in another FlatList of same orientation. + +### `renderItem` + +```jsx +renderItem({ item, index, separators }); +``` + +Takes an item from `data` and renders it into the list. + +Provides additional metadata like `index` if you need it, as well as a more generic `separators.updateProps` function which let you set whatever props you want to change the rendering of either the leading separator or trailing separator in case the more common `highlight` and `unhighlight` (which set the `highlighted: boolean` prop) are insufficient for your use case. + +| Type | Required | +| -------- | -------- | +| function | Yes | + +- `item` (Object): The item from `data` being rendered. +- `index` (number): The index corresponding to this item in the `data` array. +- `separators` (Object) + - `highlight` (Function) + - `unhighlight` (Function) + - `updateProps` (Function) + - `select` (enum('leading', 'trailing')) + - `newProps` (Object) + +Example usage: + +```jsx + ( + + )) + } + data={[{ title: 'Title Text', key: 'item1' }]} + renderItem={({ item, index, separators }) => ( + this._onPress(item)} + onShowUnderlay={separators.highlight} + onHideUnderlay={separators.unhighlight}> + + {item.title} + + + )} +/> +``` + +--- + +### `data` + +For simplicity, data is a plain array. If you want to use something else, like an immutable list, use the underlying [`VirtualizedList`](virtualizedlist.md) directly. + +| Type | Required | +| ----- | -------- | +| array | Yes | + +--- + +### `ItemSeparatorComponent` + +Rendered in between each item, but not at the top or bottom. By default, `highlighted` and `leadingItem` props are provided. `renderItem` provides `separators.highlight`/`unhighlight` which will update the `highlighted` prop, but you can also add custom props with `separators.updateProps`. + +| Type | Required | +| --------- | -------- | +| component | No | + +--- + +### `ListEmptyComponent` + +Rendered when the list is empty. Can be a React Component Class, a render function, or a rendered element. + +| Type | Required | +| ---------------------------- | -------- | +| component, function, element | No | + +--- + +### `ListFooterComponent` + +Rendered at the bottom of all the items. Can be a React Component Class, a render function, or a rendered element. + +| Type | Required | +| ---------------------------- | -------- | +| component, function, element | No | + +--- + +### `ListFooterComponentStyle` + +Styling for internal View for ListFooterComponent + +| Type | Required | +| ------------ | -------- | +| style object | No | + +--- + +### `ListHeaderComponent` + +Rendered at the top of all the items. Can be a React Component Class, a render function, or a rendered element. + +| Type | Required | +| ---------------------------- | -------- | +| component, function, element | No | + +--- + +### `ListHeaderComponentStyle` + +Styling for internal View for ListHeaderComponent + +| Type | Required | +| ------------ | -------- | +| style object | No | + +--- + +### `columnWrapperStyle` + +Optional custom style for multi-item rows generated when `numColumns > 1`. + +| Type | Required | +| ------------ | -------- | +| style object | No | + +--- + +### `extraData` + +A marker property for telling the list to re-render (since it implements `PureComponent`). If any of your `renderItem`, Header, Footer, etc. functions depend on anything outside of the `data` prop, stick it here and treat it immutably. + +| Type | Required | +| ---- | -------- | +| any | No | + +--- + +### `getItemLayout` + +```jsx +(data, index) => {length: number, offset: number, index: number} +``` + +`getItemLayout` is an optional optimization that allows skipping the measurement of dynamic content if you know the size (height or width) of items ahead of time. `getItemLayout` is efficient if you have fixed size items, for example: + +```jsx + getItemLayout={(data, index) => ( + {length: ITEM_HEIGHT, offset: ITEM_HEIGHT * index, index} + )} +``` + +Adding `getItemLayout` can be a great performance boost for lists of several hundred items. Remember to include separator length (height or width) in your offset calculation if you specify `ItemSeparatorComponent`. + +| Type | Required | +| -------- | -------- | +| function | No | + +--- + +### `horizontal` + +If true, renders items next to each other horizontally instead of stacked vertically. + +| Type | Required | +| ------- | -------- | +| boolean | No | + +--- + +### `initialNumToRender` + +How many items to render in the initial batch. This should be enough to fill the screen but not much more. Note these items will never be unmounted as part of the windowed rendering in order to improve perceived performance of scroll-to-top actions. + +| Type | Required | +| ------ | -------- | +| number | No | + +--- + +### `initialScrollIndex` + +Instead of starting at the top with the first item, start at `initialScrollIndex`. This disables the "scroll to top" optimization that keeps the first `initialNumToRender` items always rendered and immediately renders the items starting at this initial index. Requires `getItemLayout` to be implemented. + +| Type | Required | +| ------ | -------- | +| number | No | + +--- + +### `inverted` + +Reverses the direction of scroll. Uses scale transforms of `-1`. + +| Type | Required | +| ------- | -------- | +| boolean | No | + +--- + +### `keyExtractor` + +```jsx +(item: object, index: number) => string; +``` + +Used to extract a unique key for a given item at the specified index. Key is used for caching and as the react key to track item re-ordering. The default extractor checks `item.key`, then falls back to using the index, like React does. + +| Type | Required | +| -------- | -------- | +| function | No | + +--- + +### `numColumns` + +Multiple columns can only be rendered with `horizontal={false}` and will zig-zag like a `flexWrap` layout. Items should all be the same height - masonry layouts are not supported. + +| Type | Required | +| ------ | -------- | +| number | No | + +--- + +### `onEndReached` + +```jsx +(info: {distanceFromEnd: number}) => void +``` + +Called once when the scroll position gets within `onEndReachedThreshold` of the rendered content. + +| Type | Required | +| -------- | -------- | +| function | No | + +--- + +### `onEndReachedThreshold` + +How far from the end (in units of visible length of the list) the bottom edge of the list must be from the end of the content to trigger the `onEndReached` callback. Thus a value of 0.5 will trigger `onEndReached` when the end of the content is within half the visible length of the list. + +| Type | Required | +| ------ | -------- | +| number | No | + +--- + +### `onRefresh` + +```jsx +() => void +``` + +If provided, a standard RefreshControl will be added for "Pull to Refresh" functionality. Make sure to also set the `refreshing` prop correctly. + +| Type | Required | +| -------- | -------- | +| function | No | + +--- + +### `onViewableItemsChanged` + +```jsx +(info: { + viewableItems: array, + changed: array, + }) => void +``` + +Called when the viewability of rows changes, as defined by the `viewabilityConfig` prop. + +| Type | Required | +| -------- | -------- | +| function | No | + +--- + +### `progressViewOffset` + +Set this when offset is needed for the loading indicator to show correctly. + +| Type | Required | Platform | +| ------ | -------- | -------- | +| number | No | Android | + +--- + +### `legacyImplementation` + +May not have full feature parity and is meant for debugging and performance comparison. + +| Type | Required | +| ------- | -------- | +| boolean | No | + +--- + +### `refreshing` + +Set this true while waiting for new data from a refresh. + +| Type | Required | +| ------- | -------- | +| boolean | No | + +--- + +### `removeClippedSubviews` + +This may improve scroll performance for large lists. On Android the default value is true + +> Note: May have bugs (missing content) in some circumstances - use at your own risk. + +| Type | Required | +| ------- | -------- | +| boolean | No | + +--- + +### `viewabilityConfig` + +See `ViewabilityHelper.js` for flow type and further documentation. + +| Type | Required | +| ----------------- | -------- | +| ViewabilityConfig | No | + +`viewabilityConfig` takes a type `ViewabilityConfig` an object with following properties + +| Property | Required | Type | +| -------------------------------- | -------- | ------- | +| minimumViewTime | No | number | +| viewAreaCoveragePercentThreshold | No | number | +| itemVisiblePercentThreshold | No | number | +| waitForInteraction | No | boolean | + +At least one of the `viewAreaCoveragePercentThreshold` or `itemVisiblePercentThreshold` is required. This needs to be done in the `constructor` to avoid following error ([ref](https://github.com/facebook/react-native/issues/17408)): + +``` + Error: Changing viewabilityConfig on the fly is not supported` +``` + +```jsx +constructor (props) { + super(props) + + this.viewabilityConfig = { + waitForInteraction: true, + viewAreaCoveragePercentThreshold: 95 + } +} +``` + +```jsx + Note: Cannot scroll to locations outside the render window without specifying the `getItemLayout` prop. + +**Parameters:** + +| Name | Type | Required | Description | +| ------ | ------ | -------- | ----------- | +| params | object | Yes | See below. | + +Valid `params` keys are: + +- 'animated' (boolean) - Whether the list should do an animation while scrolling. Defaults to `true`. +- 'index' (number) - The index to scroll to. Required. +- 'viewOffset' (number) - A fixed number of pixels to offset the final target position. +- 'viewPosition' (number) - A value of `0` places the item specified by index at the top, `1` at the bottom, and `0.5` centered in the middle. + +--- + +### `scrollToItem()` + +```jsx +scrollToItem(params); +``` + +Requires linear scan through data - use `scrollToIndex` instead if possible. + +> Note: Cannot scroll to locations outside the render window without specifying the `getItemLayout` prop. + +**Parameters:** + +| Name | Type | Required | Description | +| ------ | ------ | -------- | ----------- | +| params | object | Yes | See below. | + +Valid `params` keys are: + +- 'animated' (boolean) - Whether the list should do an animation while scrolling. Defaults to `true`. +- 'item' (object) - The item to scroll to. Required. +- 'viewPosition' (number) + +--- + +### `scrollToOffset()` + +```jsx +scrollToOffset(params); +``` + +Scroll to a specific content pixel offset in the list. + +**Parameters:** + +| Name | Type | Required | Description | +| ------ | ------ | -------- | ----------- | +| params | object | Yes | See below. | + +Valid `params` keys are: + +- 'offset' (number) - The offset to scroll to. In case of `horizontal` being true, the offset is the x-value, in any other case the offset is the y-value. Required. +- 'animated' (boolean) - Whether the list should do an animation while scrolling. Defaults to `true`. + +--- + +### `recordInteraction()` + +```jsx +recordInteraction(); +``` + +Tells the list an interaction has occurred, which should trigger viewability calculations, e.g. if `waitForInteractions` is true and the user has not scrolled. This is typically called by taps on items or by navigation actions. + +--- + +### `flashScrollIndicators()` + +```jsx +flashScrollIndicators(); +``` + +Displays the scroll indicators momentarily. + +--- + +### `getNativeScrollRef()` + +```jsx +getNativeScrollRef(); +``` + +Provides a reference to the underlying scroll component + +--- + +### `getScrollResponder()` + +```jsx +getScrollResponder(); +``` + +Provides a handle to the underlying scroll responder. + +--- + +### `getScrollableNode()` + +```jsx +getScrollableNode(); +``` + +Provides a handle to the underlying scroll node. diff --git a/website/versioned_docs/version-0.63/flexbox.md b/website/versioned_docs/version-0.63/flexbox.md new file mode 100644 index 00000000000..b1dac24120a --- /dev/null +++ b/website/versioned_docs/version-0.63/flexbox.md @@ -0,0 +1,227 @@ +--- +id: version-0.63-flexbox +title: Layout with Flexbox +original_id: flexbox +--- + +A component can specify the layout of its children using the Flexbox algorithm. Flexbox is designed to provide a consistent layout on different screen sizes. + +You will normally use a combination of `flexDirection`, `alignItems`, and `justifyContent` to achieve the right layout. + +> Flexbox works the same way in React Native as it does in CSS on the web, with a few exceptions. The defaults are different, with `flexDirection` defaulting to `column` instead of `row`, and the `flex` parameter only supporting a single number. + +## Flex + +[`flex`](layout-props#flex) will define how your items are going to **“fill”** over the available space along your main axis. Space will be divided according to each element's flex property. + +In the following example, the red, yellow, and green views are all children in the container view that has `flex: 1` set. The red view uses `flex: 1` , the yellow view uses `flex: 2`, and the green view uses `flex: 3` . **1+2+3 = 6**, which means that the red view will get `1/6` of the space, the yellow `2/6` of the space, and the green `3/6` of the space. + +![Flex](https://cdn-images-1.medium.com/max/800/1*PhCFmO5tYX_sZSyCd4vO3w.png) + +## Flex Direction + +[`flexDirection`](layout-props#flexdirection) controls the direction in which the children of a node are laid out. This is also referred to as the _main axis_. The cross axis is the axis perpendicular to the main axis, or the axis which the wrapping lines are laid out in. + +- `row` Align children from left to right. If wrapping is enabled, then the next line will start under the first item on the left of the container. + +- `column` (**default value**) Align children from top to bottom. If wrapping is enabled, then the next line will start to the right of the first item on the top of the container. + +- `row-reverse` Align children from right to left. If wrapping is enabled, then the next line will start under the first item on the right of the container. + +- `column-reverse` Align children from bottom to top. If wrapping is enabled, then the next line will start to the right of the first item on the bottom of the container. + +You can learn more [here](https://yogalayout.com/docs/flex-direction). + +```SnackPlayer name=Flex%20Direction +import React from 'react'; +import { View } from 'react-native'; + +const FlexDirectionBasics = () => { + return ( + // Try setting `flexDirection` to `column`. + + + + + + ); +}; + +export default FlexDirectionBasics; +``` + +![Flex Direction](https://cdn-images-1.medium.com/max/800/1*rA7IbuUsJWsx6evKAsabVw.png) + +## Layout Direction + +Layout direction specifies the direction in which children and text in a hierarchy should be laid out. Layout direction also affects what edge `start` and `end` refer to. By default, React Native lays out with LTR layout direction. In this mode `start` refers to left and `end` refers to right. + +- `LTR` (**default value**) Text and children are laid out from left to right. Margin and padding applied to the start of an element are applied on the left side. + +- `RTL` Text and children are laid out from right to left. Margin and padding applied to the start of an element are applied on the right side. + +## Justify Content + +[`justifyContent`](layout-props#justifycontent) describes how to align children within the main axis of their container. For example, you can use this property to center a child horizontally within a container with `flexDirection` set to `row` or vertically within a container with `flexDirection` set to `column`. + +- `flex-start`(**default value**) Align children of a container to the start of the container's main axis. + +- `flex-end` Align children of a container to the end of the container's main axis. + +- `center` Align children of a container in the center of the container's main axis. + +- `space-between` Evenly space off children across the container's main axis, distributing the remaining space between the children. + +- `space-around` Evenly space off children across the container's main axis, distributing the remaining space around the children. Compared to `space-between`, using `space-around` will result in space being distributed to the beginning of the first child and end of the last child. + +- `space-evenly` Evenly distribute children within the alignment container along the main axis. The spacing between each pair of adjacent items, the main-start edge and the first item, and the main-end edge and the last item, are all exactly the same. + +You can learn more [here](https://yogalayout.com/docs/justify-content). + +```SnackPlayer name=Justify%20Content +import React from 'react'; +import { View } from 'react-native'; + +const JustifyContentBasics = () => { + return ( + // Try setting `justifyContent` to `center`. + // Try setting `flexDirection` to `row`. + + + + + + ); +}; + +export default JustifyContentBasics; +``` + +![Justify Content](https://cdn-images-1.medium.com/max/800/1*i5TVlme-TisAVvD5ax2yPA.png) + +## Align Items + +[`alignItems`](layout-props#alignitems) describes how to align children along the cross axis of their container. Align items is very similar to `justifyContent` but instead of applying to the main axis, `alignItems` applies to the cross axis. + +- `stretch` (**default value**) Stretch children of a container to match the `height` of the container's cross axis. + +- `flex-start` Align children of a container to the start of the container's cross axis. + +- `flex-end` Align children of a container to the end of the container's cross axis. + +- `center` Align children of a container in the center of the container's cross axis. + +- `baseline` Align children of a container along a common baseline. Individual children can be set to be the reference baseline for their parents. + +> For `stretch` to have an effect, children must not have a fixed dimension along the secondary axis. In the following example, setting `alignItems: stretch` does nothing until the `width: 50` is removed from the children. + +You can learn more [here](https://yogalayout.com/docs/align-items). + +```SnackPlayer name=Align%20Items +import React from 'react'; +import { View } from 'react-native'; + +const AlignItemsBasics = () => { + return ( + // Try setting `alignItems` to 'flex-start' + // Try setting `justifyContent` to `flex-end`. + // Try setting `flexDirection` to `row`. + + + + + + ); +}; + +export default AlignitemsBasics; +``` + +![Align Items](https://cdn-images-1.medium.com/max/800/1*evkM7zfxt-9p-HJ1M0Bh2g.png) + +## Align Self + +[`alignSelf`](layout-props#alignself) has the same options and effect as `alignItems` but instead of affecting the children within a container, you can apply this property to a single child to change its alignment within its parent. `alignSelf` overrides any option set by the parent with `alignItems`. + +![Align Self](https://cdn-images-1.medium.com/max/800/1*J1JCoKwLCokX9JXVBvP71g.png) + +## Align Content + +[alignContent](layout-props#aligncontent) defines the distribution of lines along the cross-axis. This only has effect when items are wrapped to multiple lines using `flexWrap`. + +- `flex-start` (**default value**) Align wrapped lines to the start of the container's cross axis. + +- `flex-end` Align wrapped lines to the end of the container's cross axis. + +- `stretch` Stretch wrapped lines to match the height of the container's cross axis. + +- `center` Align wrapped lines in the center of the container's cross axis. + +- `space-between` Evenly space wrapped lines across the container's main axis, distributing the remaining space between the lines. + +- `space-around` Evenly space wrapped lines across the container's main axis, distributing the remaining space around the lines. Compared to `space-between`, using `space-around` will result in space being distributed to the beginning of the first line and the end of the last line. + +You can learn more [here](https://yogalayout.com/docs/align-content). + +![Align Content](https://cdn-images-1.medium.com/max/800/1*cC2XFyCF_igp20Ombt4wBw.png) + +## Flex Wrap + +The [`flexWrap`](layout-props#flexwrap) property is set on containers and it controls what happens when children overflow the size of the container along the main axis. By default, children are forced into a single line (which can shrink elements). If wrapping is allowed, items are wrapped into multiple lines along the main axis if needed. + +When wrapping lines, `alignContent` can be used to specify how the lines are placed in the container. Learn more [here](https://yogalayout.com/docs/flex-wrap). + +![Flex Wrap](https://cdn-images-1.medium.com/max/800/1*_7v4uQhSsuCn1cfeOMVfrA.png) + +## Flex Basis, Grow, and Shrink + +- [`flexGrow`](layout-props#flexgrow) describes how any space within a container should be distributed among its children along the main axis. After laying out its children, a container will distribute any remaining space according to the flex grow values specified by its children. + + `flexGrow` accepts any floating point value >= 0, with 0 being the default value. A container will distribute any remaining space among its children weighted by the children’s `flexGrow` values. + +- [`flexShrink`](layout-props#flexshrink) describes how to shrink children along the main axis in the case in which the total size of the children overflows the size of the container on the main axis. `flexShrink` is very similar to `flexGrow` and can be thought of in the same way if any overflowing size is considered to be negative remaining space. These two properties also work well together by allowing children to grow and shrink as needed. + + `flexShrink` accepts any floating point value >= 0, with 1 being the default value. A container will shrink its children weighted by the children’s `flexShrink` values. + +- [`flexBasis`](layout-props#flexbasis) is an axis-independent way of providing the default size of an item along the main axis. Setting the `flexBasis` of a child is similar to setting the `width` of that child if its parent is a container with `flexDirection: row` or setting the `height` of a child if its parent is a container with `flexDirection: column`. The `flexBasis` of an item is the default size of that item, the size of the item before any `flexGrow` and `flexShrink` calculations are performed. + +You can learn more [here](https://yogalayout.com/docs/flex). + +## Width and Height + +The `width` property specifies the width of an element's content area. Similarly, the `height` property specifies the height of an element's content area. + +Both `width` and `height` can take the following values: + +- `auto` (**default value**) React Native calculates the width/height for the element based on its content, whether that is other children, text, or an image. + +- `pixels` Defines the width/height in absolute pixels. Depending on other styles set on the component, this may or may not be the final dimension of the node. + +- `percentage` Defines the width or height in percentage of its parent's width or height, respectively. + +## Absolute & Relative Layout + +The `position` type of an element defines how it is positioned within its parent. + +- `relative` (**default value**) By default, an element is positioned relatively. This means an element is positioned according to the normal flow of the layout, and then offset relative to that position based on the values of `top`, `right`, `bottom`, and `left`. The offset does not affect the position of any sibling or parent elements. + +- `absolute` When positioned absolutely, an element doesn't take part in the normal layout flow. It is instead laid out independent of its siblings. The position is determined based on the `top`, `right`, `bottom`, and `left` values. + +![Absolute & Relative Layoutp](https://cdn-images-1.medium.com/max/800/1*NlPeRQCQK3Vb5nyjL0Mqxw.png) + +## Going Deeper + +Check out the interactive [yoga playground](https://yogalayout.com/playground) that you can use to get a better understanding of flexbox. + +We've covered the basics, but there are many other styles you may need for layouts. The full list of props that control layout is documented [here](./layout-props.md). + +Additionally, you can see some examples from [Wix Engineers](https://medium.com/wix-engineering/the-full-react-native-layout-cheat-sheet-a4147802405c). diff --git a/website/versioned_docs/version-0.63/getting-started.md b/website/versioned_docs/version-0.63/getting-started.md new file mode 100644 index 00000000000..40394305a6f --- /dev/null +++ b/website/versioned_docs/version-0.63/getting-started.md @@ -0,0 +1,629 @@ +--- +id: version-0.63-environment-setup +title: Setting up the development environment +original_id: environment-setup +--- + +This page will help you install and build your first React Native app. + +If you are new to mobile development, the easiest way to get started is with Expo CLI. Expo is a set of tools built around React Native and, while it has many [features](https://expo.io/features), the most relevant feature for us right now is that it can get you writing a React Native app within minutes. You will only need a recent version of Node.js and a phone or emulator. If you'd like to try out React Native directly in your web browser before installing any tools, you can try out [Snack](https://snack.expo.io/). + +If you are already familiar with mobile development, you may want to use React Native CLI. It requires Xcode or Android Studio to get started. If you already have one of these tools installed, you should be able to get up and running within a few minutes. If they are not installed, you should expect to spend about an hour installing and configuring them. + +
+
    + + +
+
+ + + +Assuming that you have [Node 12 LTS](https://nodejs.org/en/download/) or greater installed, you can use npm to install the Expo CLI command line utility: + +```sh +npm install -g expo-cli +``` + +Then run the following commands to create a new React Native project called "AwesomeProject": + +```sh +expo init AwesomeProject + +cd AwesomeProject +npm start # you can also use: expo start +``` + +This will start a development server for you. + +

Running your React Native application

+ +Install the [Expo](https://expo.io) client app on your iOS or Android phone and connect to the same wireless network as your computer. On Android, use the Expo app to scan the QR code from your terminal to open your project. On iOS, use the built-in QR code scanner of the Camera app. + +

Modifying your app

+ +Now that you have successfully run the app, let's modify it. Open `App.js` in your text editor of choice and edit some lines. The application should reload automatically once you save your changes. + +

That's it!

+ +Congratulations! You've successfully run and modified your first React Native app. + +
+ +

Now what?

+ +Expo also has [docs](https://docs.expo.io) you can reference if you have questions specific to the tool. You can also ask for help at [Expo forums](https://forums.expo.io). + +These tools help you get started quickly, but before committing to building your app with Expo CLI, [read about the limitations](https://docs.expo.io/versions/latest/introduction/why-not-expo/). + +If you have a problem with Expo, before creating a new issue, please see if there's an existing issue about it: + +- in the [Expo CLI issues](https://github.com/expo/expo-cli/issues) (for issues related to Expo CLI), or +- in the [Expo issues](https://github.com/expo/expo/issues) (for issues about the Expo client or SDK). + +If you're curious to learn more about React Native, check out the [Introduction to React Native](getting-started). + +

Running your app on a simulator or virtual device

+ +Expo CLI allows you to run your React Native app on a physical device without setting up a development environment. If you want to run your app on the iOS Simulator or an Android Virtual Device, please refer to the instructions for "React Native CLI Quickstart" to learn how to install Xcode or set up your Android development environment. + +Once you've set these up, you can launch your app on an Android Virtual Device by running `npm run android`, or on the iOS Simulator by running `npm run ios` (macOS only). + +

Caveats

+ +Because you don't build any native code when using Expo to create a project, it's not possible to include custom native modules beyond the React Native APIs and components that are available in the Expo client app. + +If you know that you'll eventually need to include your own native code, Expo is still a good way to get started. In that case you'll need to "[eject](https://docs.expo.io/versions/latest/workflow/customizing/)" eventually to create your own native builds. If you do eject, the "React Native CLI Quickstart" instructions will be required to continue working on your project. + +Expo CLI configures your project to use the most recent React Native version that is supported by the Expo client app. The Expo client app usually gains support for a given React Native version about a week after the React Native version is released as stable. You can check [this document](https://docs.expo.io/versions/latest/sdk/overview/#sdk-version) to find out what versions are supported. + +If you're integrating React Native into an existing project, you'll want to skip Expo CLI and go directly to setting up the native build environment. Select "React Native CLI Quickstart" above for instructions on configuring a native build environment for React Native. + + + +

Follow these instructions if you need to build native code in your project. For example, if you are integrating React Native into an existing application, or if you "ejected" from Expo, you'll need this section.

+ +The instructions are a bit different depending on your development operating system, and whether you want to start developing for iOS or Android. If you want to develop for both Android and iOS, that's fine - you can pick one to start with, since the setup is a bit different. + +
+ Development OS: + + + + + +
+ +
+ Target OS: + + + + +
+ + + +

Unsupported

+ +

A Mac is required to build projects with native code for iOS. You can follow the Quick Start to learn how to build your app using Expo instead.

+ + + +

Installing dependencies

+ +You will need Node, Watchman, the React Native command line interface, and Xcode. + +While you can use any editor of your choice to develop your app, you will need to install Xcode in order to set up the necessary tooling to build your React Native app for iOS. + + + +

Installing dependencies

+ +You will need Node, Watchman, the React Native command line interface, a JDK, and Android Studio. + + + +

Installing dependencies

+ +You will need Node, the React Native command line interface, a JDK, and Android Studio. + + + +

Installing dependencies

+ +You will need Node, the React Native command line interface, Python2, a JDK, and Android Studio. + + + +While you can use any editor of your choice to develop your app, you will need to install Android Studio in order to set up the necessary tooling to build your React Native app for Android. + + + +

Node & Watchman

+ +We recommend installing Node and Watchman using [Homebrew](http://brew.sh/). Run the following commands in a Terminal after installing Homebrew: + +```sh +brew install node +brew install watchman +``` + +If you have already installed Node on your system, make sure it is Node 8.3 or newer. + +[Watchman](https://facebook.github.io/watchman) is a tool by Facebook for watching changes in the filesystem. It is highly recommended you install it for better performance. + + + +

Java Development Kit

+ +We recommend installing JDK using [Homebrew](http://brew.sh/). Run the following commands in a Terminal after installing Homebrew: + +```sh +brew cask install adoptopenjdk/openjdk/adoptopenjdk8 +``` + +If you have already installed JDK on your system, make sure it is JDK 8 or newer. + + + +

Node

+ +Follow the [installation instructions for your Linux distribution](https://nodejs.org/en/download/package-manager/) to install Node 8.3 or newer. + + + +

Node, Python2, JDK

+ +We recommend installing Node and Python2 via [Chocolatey](https://chocolatey.org), a popular package manager for Windows. + +React Native also requires a recent version of the [Java SE Development Kit (JDK)](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html), as well as Python 2. Both can be installed using Chocolatey. + +Open an Administrator Command Prompt (right click Command Prompt and select "Run as Administrator"), then run the following command: + +```powershell +choco install -y nodejs.install python2 jdk8 +``` + +If you have already installed Node on your system, make sure it is Node 8.3 or newer. If you already have a JDK on your system, make sure it is version 8 or newer. + +> You can find additional installation options on [Node's Downloads page](https://nodejs.org/en/download/). + + + +

Xcode & CocoaPods

+ +The easiest way to install Xcode is via the [Mac App Store](https://itunes.apple.com/us/app/xcode/id497799835?mt=12). Installing Xcode will also install the iOS Simulator and all the necessary tools to build your iOS app. + +If you have already installed Xcode on your system, make sure it is version 9.4 or newer. + +

Command Line Tools

+ +You will also need to install the Xcode Command Line Tools. Open Xcode, then choose "Preferences..." from the Xcode menu. Go to the Locations panel and install the tools by selecting the most recent version in the Command Line Tools dropdown. + +![Xcode Command Line Tools](/docs/assets/GettingStartedXcodeCommandLineTools.png) + +

Installing an iOS Simulator in Xcode

+ +To install a simulator, open Xcode > Preferences... and select the Components tab. Select a simulator with the corresponding version of iOS you wish to use. + +

CocoaPods

+ +[CocoaPods](https://cocoapods.org/) is built with Ruby and it will be installable with the default Ruby available on macOS. You can use a Ruby Version manager, however we recommend that you use the standard Ruby available on macOS unless you know what you're doing. + +Using the default Ruby install will require you to use `sudo` when installing gems. (This is only an issue for the duration of the gem installation, though.) + +```sh +sudo gem install cocoapods +``` + +For more information, please visit [CocoaPods Getting Started guide](https://guides.cocoapods.org/using/getting-started.html). + + + +

Java Development Kit

+ +React Native requires version 8 of the Java SE Development Kit (JDK). You may download and install [OpenJDK](http://openjdk.java.net) from [AdoptOpenJDK](https://adoptopenjdk.net/) or your system packager. You may also [Download and install Oracle JDK 8](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html) if desired. + + + +

Android development environment

+ +Setting up your development environment can be somewhat tedious if you're new to Android development. If you're already familiar with Android development, there are a few things you may need to configure. In either case, please make sure to carefully follow the next few steps. + + + +

1. Install Android Studio

+ +[Download and install Android Studio](https://developer.android.com/studio/index.html). Choose a "Custom" setup when prompted to select an installation type. Make sure the boxes next to all of the following are checked: + + + +- `Android SDK` +- `Android SDK Platform` +- `Android Virtual Device` +- If you are not already using Hyper-V: `Performance (Intel ® HAXM)` ([See here for AMD or Hyper-V](https://android-developers.googleblog.com/2018/07/android-emulator-amd-processor-hyper-v.html)) + + + +- `Android SDK` +- `Android SDK Platform` +- `Android Virtual Device` + + + +Then, click "Next" to install all of these components. + +> If the checkboxes are grayed out, you will have a chance to install these components later on. + +Once setup has finalized and you're presented with the Welcome screen, proceed to the next step. + +

2. Install the Android SDK

+ +Android Studio installs the latest Android SDK by default. Building a React Native app with native code, however, requires the `Android 9 (Pie)` SDK in particular. Additional Android SDKs can be installed through the SDK Manager in Android Studio. + +The SDK Manager can be accessed from the "Welcome to Android Studio" screen. Click on "Configure", then select "SDK Manager". + + + +![Android Studio Welcome](/docs/assets/GettingStartedAndroidStudioWelcomeMacOS.png) + + + +![Android Studio Welcome](/docs/assets/GettingStartedAndroidStudioWelcomeWindows.png) + + + +> The SDK Manager can also be found within the Android Studio "Preferences" dialog, under **Appearance & Behavior** → **System Settings** → **Android SDK**. + +Select the "SDK Platforms" tab from within the SDK Manager, then check the box next to "Show Package Details" in the bottom right corner. Look for and expand the `Android 9 (Pie)` entry, then make sure the following items are checked: + +- `Android SDK Platform 28` +- `Intel x86 Atom_64 System Image` or `Google APIs Intel x86 Atom System Image` + +Next, select the "SDK Tools" tab and check the box next to "Show Package Details" here as well. Look for and expand the "Android SDK Build-Tools" entry, then make sure that `28.0.3` is selected. + +Finally, click "Apply" to download and install the Android SDK and related build tools. + +

3. Configure the ANDROID_HOME environment variable

+ +The React Native tools require some environment variables to be set up in order to build apps with native code. + + + +Add the following lines to your `$HOME/.bash_profile` or `$HOME/.bashrc` (if you are using `zsh` then `~/.zprofile` or `~/.zshrc`) config file: + + + +```sh +export ANDROID_HOME=$HOME/Library/Android/sdk +export PATH=$PATH:$ANDROID_HOME/emulator +export PATH=$PATH:$ANDROID_HOME/tools +export PATH=$PATH:$ANDROID_HOME/tools/bin +export PATH=$PATH:$ANDROID_HOME/platform-tools +``` + + + +```sh +export ANDROID_HOME=$HOME/Android/Sdk +export PATH=$PATH:$ANDROID_HOME/emulator +export PATH=$PATH:$ANDROID_HOME/tools +export PATH=$PATH:$ANDROID_HOME/tools/bin +export PATH=$PATH:$ANDROID_HOME/platform-tools +``` + + + +> `.bash_profile` is specific to `bash`. If you're using another shell, you will need to edit the appropriate shell-specific config file. + +Type `source $HOME/.bash_profile` to load the config into your current shell. Verify that ANDROID_HOME has been added to your path by running `echo $PATH`. + +> Please make sure you use the correct Android SDK path. You can find the actual location of the SDK in the Android Studio "Preferences" dialog, under **Appearance & Behavior** → **System Settings** → **Android SDK**. + + + +1. Open the **Windows Control Panel.** +2. Click on **User Accounts,** then click **User Accounts** again +3. Click on **Change my environment variables** +4. Click on **New...** to create a new `ANDROID_HOME` user variable that points to the path to your Android SDK: + +![ANDROID_HOME Environment Variable](/docs/assets/GettingStartedAndroidEnvironmentVariableANDROID_HOME.png) + +The SDK is installed, by default, at the following location: + +```powershell +c:\Android\tools\bin +``` + +You can find the actual location of the SDK in the Android Studio "Preferences" dialog, under **Appearance & Behavior** → **System Settings** → **Android SDK**. + +Open a new Command Prompt window to ensure the new environment variable is loaded before proceeding to the next step. + +1. Open powershell +2. Copy and paste **Get-ChildItem -Path Env:\\** into powershell +3. Verify `ANDROID_HOME` has been added + +

4. Add platform-tools to Path

+ +1. Open the **Windows Control Panel.** +2. Click on **User Accounts,** then click **User Accounts** again +3. Click on **Change my environment variables** +4. Select the **Path** variable. +5. Click **Edit.** +6. Click **New** and add the path to platform-tools to the list. + +The default location for this folder is: + +```powershell +C:\Android\tools\bin\platform-tools +``` + + + +

Watchman

+ +Follow the [Watchman installation guide](https://facebook.github.io/watchman/docs/install/#buildinstall) to compile and install Watchman from source. + +> [Watchman](https://facebook.github.io/watchman/docs/install/) is a tool by Facebook for watching changes in the filesystem. It is highly recommended you install it for better performance and increased compatibility in certain edge cases (translation: you may be able to get by without installing this, but your mileage may vary; installing this now may save you from a headache later). + + + +

React Native Command Line Interface

+ +React Native has a built-in command line interface. Rather than install and manage a specific version of the CLI globally, we recommend you access the current version at runtime using `npx`, which ships with Node.js. With `npx react-native `, the current stable version of the CLI will be downloaded and executed at the time the command is run. + + + +

Creating a new application

+ +> If you previously installed a global `react-native-cli` package, please remove it as it may cause unexpected issues. + +You can use React Native's built-in command line interface to generate a new project. Let's create a new React Native project called "AwesomeProject": + +```sh +npx react-native init AwesomeProject +``` + +This is not necessary if you are integrating React Native into an existing application, if you "ejected" from Expo, or if you're adding iOS support to an existing React Native project (see [Platform Specific Code](platform-specific-code.md)). You can also use a third-party CLI to init your React Native app, such as [Ignite CLI](https://github.com/infinitered/ignite). + +

[Optional] Using a specific version or template

+ +If you want to start a new project with a specific React Native version, you can use the `--version` argument: + +```sh +npx react-native init AwesomeProject --version X.XX.X +``` + +You can also start a project with a custom React Native template, like TypeScript, with `--template` argument: + +```sh +npx react-native init AwesomeTSProject --template react-native-template-typescript +``` + +> **Note** If the above command is failing, you may have old version of `react-native` or `react-native-cli` installed globally on your pc. Try uninstalling the cli and run the cli using `npx`. + + + +

Creating a new application

+ +> If you previously installed a global `react-native-cli` package, please remove it as it may cause unexpected issues. + +React Native has a built-in command line interface, which you can use to generate a new project. You can access it without installing anything globally using `npx`, which ships with Node.js. Let's create a new React Native project called "AwesomeProject": + +```sh +npx react-native init AwesomeProject +``` + +This is not necessary if you are integrating React Native into an existing application, if you "ejected" from Expo, or if you're adding Android support to an existing React Native project (see [Platform Specific Code](platform-specific-code.md)). You can also use a third-party CLI to init your React Native app, such as [Ignite CLI](https://github.com/infinitered/ignite). + +

[Optional] Using a specific version or template

+ +If you want to start a new project with a specific React Native version, you can use the `--version` argument: + +```sh +npx react-native init AwesomeProject --version X.XX.X +``` + +You can also start a project with a custom React Native template, like TypeScript, with `--template` argument: + +```sh +npx react-native init AwesomeTSProject --template react-native-template-typescript +``` + + + +

Preparing the Android device

+ +You will need an Android device to run your React Native Android app. This can be either a physical Android device, or more commonly, you can use an Android Virtual Device which allows you to emulate an Android device on your computer. + +Either way, you will need to prepare the device to run Android apps for development. + +

Using a physical device

+ +If you have a physical Android device, you can use it for development in place of an AVD by plugging it in to your computer using a USB cable and following the instructions [here](running-on-device.md). + +

Using a virtual device

+ +If you use Android Studio to open `./AwesomeProject/android`, you can see the list of available Android Virtual Devices (AVDs) by opening the "AVD Manager" from within Android Studio. Look for an icon that looks like this: + +![Android Studio AVD Manager](/docs/assets/GettingStartedAndroidStudioAVD.png) + +If you have recently installed Android Studio, you will likely need to [create a new AVD](https://developer.android.com/studio/run/managing-avds.html). Select "Create Virtual Device...", then pick any Phone from the list and click "Next", then select the **Pie** API Level 28 image. + + + +> We recommend configuring [VM acceleration](https://developer.android.com/studio/run/emulator-acceleration.html#vm-linux) on your system to improve performance. Once you've followed those instructions, go back to the AVD Manager. + + + +> If you don't have HAXM installed, click on "Install HAXM" or follow [these instructions](https://github.com/intel/haxm/wiki/Installation-Instructions-on-Windows) to set it up, then go back to the AVD Manager. + + + +> If you don't have HAXM installed, follow [these instructions](https://github.com/intel/haxm/wiki/Installation-Instructions-on-macOS) to set it up, then go back to the AVD Manager. + + + +Click "Next" then "Finish" to create your AVD. At this point you should be able to click on the green triangle button next to your AVD to launch it, then proceed to the next step. + + + +

Running your React Native application

+ +

Step 1: Start Metro

+ +First, you will need to start Metro, the JavaScript bundler that ships with React Native. Metro "takes in an entry file and various options, and returns a single JavaScript file that includes all your code and its dependencies."—[Metro Docs](https://facebook.github.io/metro/docs/concepts) + +To start Metro, run `npx react-native start` inside your React Native project folder: + +```sh +npx react-native start +``` + +`react-native start` starts Metro Bundler. + +> If you use the Yarn package manager, you can use `yarn` instead of `npx` when running React Native commands inside an existing project. + + + +> Metro is a lot like webpack—for React Native apps. + + + +> Unlike Kotlin or Java, JavaScript isn't compiled—and neither is React Native. Bundling isn't the same as compiling, but it can help improve startup performance and translate some platform-specific JavaScript into more JavaScript. + + + +

Step 2: Start your application

+ +Let Metro Bundler run in its own terminal. Open a new terminal inside your React Native project folder. Run the following: + +```sh +npx react-native run-ios +``` + +You should see your new app running in the iOS Simulator shortly. + +![AwesomeProject on iOS](/docs/assets/GettingStartediOSSuccess.png) + +`npx react-native run-ios` is one way to run your app. You can also run it directly from within Xcode. + +> If you can't get this to work, see the [Troubleshooting](troubleshooting.md#content) page. + +

Running on a device

+ +The above command will automatically run your app on the iOS Simulator by default. If you want to run the app on an actual physical iOS device, please follow the instructions [here](running-on-device.md). + + + +

Running your React Native application

+ +

Step 1: Start Metro

+ +First, you will need to start Metro, the JavaScript bundler that ships with React Native. Metro "takes in an entry file and various options, and returns a single JavaScript file that includes all your code and its dependencies."—[Metro Docs](https://facebook.github.io/metro/docs/concepts) + +To start Metro, run `npx react-native start` inside your React Native project folder: + +```sh +npx react-native start +``` + +`react-native start` starts Metro Bundler. + +> If you use the Yarn package manager, you can use `yarn` instead of `npx` when running React Native commands inside an existing project. + + + +> Metro is a lot like webpack—for React Native apps. + + + +> Unlike Kotlin or Java, JavaScript isn't compiled—and neither is React Native. Bundling isn't the same as compiling, but it can help improve startup performance and translate some platform-specific JavaScript into more JavaScript. + + + +

Step 2: Start your application

+ +Let Metro Bundler run in its own terminal. Open a new terminal inside your React Native project folder. Run the following: + +```sh +npx react-native run-android +``` + +If everything is set up correctly, you should see your new app running in your Android emulator shortly. + + + +![AwesomeProject on Android](/docs/assets/GettingStartedAndroidSuccessMacOS.png) + + + +![AwesomeProject on Android](/docs/assets/GettingStartedAndroidSuccessWindows.png) + + + +`npx react-native run-android` is one way to run your app - you can also run it directly from within Android Studio. + +> If you can't get this to work, see the [Troubleshooting](troubleshooting.md#content) page. + + + +

Modifying your app

+ +Now that you have successfully run the app, let's modify it. + + + +- Open `App.js` in your text editor of choice and edit some lines. +- Hit `⌘R` in your iOS Simulator to reload the app and see your changes! + + + +- Open `App.js` in your text editor of choice and edit some lines. +- Press the `R` key twice or select `Reload` from the Developer Menu (`⌘M`) to see your changes! + + + +

Modifying your app

+ +Now that you have successfully run the app, let's modify it. + +- Open `App.js` in your text editor of choice and edit some lines. +- Press the `R` key twice or select `Reload` from the Developer Menu (`Ctrl + M`) to see your changes! + + + +

That's it!

+ +Congratulations! You've successfully run and modified your first React Native app. + +
+ + + +

That's it!

+ +Congratulations! You've successfully run and modified your first React Native app. + +
+ + + +

Now what?

+ +- If you want to add this new React Native code to an existing application, check out the [Integration guide](integration-with-existing-apps.md). + +If you're curious to learn more about React Native, check out the [Introduction to React Native](getting-started). + + + +

Now what?

+ +- If you want to add this new React Native code to an existing application, check out the [Integration guide](integration-with-existing-apps.md). + +If you're curious to learn more about React Native, check out the [Introduction to React Native](getting-started). diff --git a/website/versioned_docs/version-0.63/handling-text-input.md b/website/versioned_docs/version-0.63/handling-text-input.md new file mode 100644 index 00000000000..972ffc50f8a --- /dev/null +++ b/website/versioned_docs/version-0.63/handling-text-input.md @@ -0,0 +1,39 @@ +--- +id: version-0.63-handling-text-input +title: Handling Text Input +original_id: handling-text-input +--- + +[`TextInput`](textinput#content) is a [Core Component](intro-react-native-components) that allows the user to enter text. It has an `onChangeText` prop that takes a function to be called every time the text changed, and an `onSubmitEditing` prop that takes a function to be called when the text is submitted. + +For example, let's say that as the user types, you're translating their words into a different language. In this new language, every single word is written the same way: 🍕. So the sentence "Hello there Bob" would be translated as "🍕🍕🍕". + +```SnackPlayer name=Handling%20Text%20Input +import React, { useState } from 'react'; +import { Text, TextInput, View } from 'react-native'; + +const PizzaTranslator = () => { + const [text, setText] = useState(''); + return ( + + setText(text)} + defaultValue={text} + /> + + {text.split(' ').map((word) => word && '🍕').join(' ')} + + + ); +} + +export default PizzaTranslator; +``` + +In this example, we store `text` in the state, because it changes over time. + +There are a lot more things you might want to do with a text input. For example, you could validate the text inside while the user types. For more detailed examples, see the [React docs on controlled components](https://reactjs.org/docs/forms.html#controlled-components), or the [reference docs for TextInput](textinput.md). + +Text input is one of the ways the user interacts with the app. Next, let's look at another type of input and [learn how to handle touches](handling-touches.md). diff --git a/website/versioned_docs/version-0.63/height-and-width.md b/website/versioned_docs/version-0.63/height-and-width.md new file mode 100644 index 00000000000..b70419c6ec8 --- /dev/null +++ b/website/versioned_docs/version-0.63/height-and-width.md @@ -0,0 +1,58 @@ +--- +id: version-0.63-height-and-width +title: Height and Width +original_id: height-and-width +--- + +A component's height and width determine its size on the screen. + +## Fixed Dimensions + +The general way to set the dimensions of a component is by adding a fixed `width` and `height` to style. All dimensions in React Native are unitless, and represent density-independent pixels. + +```SnackPlayer name=Height%20and%20Width +import React from 'react'; +import { View } from 'react-native'; + +const FixedDimensionsBasics = () => { + return ( + + + + + + ); +}; + +export default FixedDimensionsBasics; +``` + +Setting dimensions this way is common for components that should always render at exactly the same size, regardless of screen dimensions. + +## Flex Dimensions + +Use `flex` in a component's style to have the component expand and shrink dynamically based on available space. Normally you will use `flex: 1`, which tells a component to fill all available space, shared evenly amongst other components with the same parent. The larger the `flex` given, the higher the ratio of space a component will take compared to its siblings. + +> A component can only expand to fill available space if its parent has dimensions greater than 0. If a parent does not have either a fixed `width` and `height` or `flex`, the parent will have dimensions of 0 and the `flex` children will not be visible. + +```SnackPlayer name=Flex%20Dimensions +import React from 'react'; +import { View } from 'react-native'; + +const FlexDimensionsBasics = () => { + return ( + // Try removing the `flex: 1` on the parent View. + // The parent will not have dimensions, so the children can't expand. + // What if you add `height: 300` instead of `flex: 1`? + + + + + + ); +}; + +export default FlexDimensionsBasics; +``` + +After you can control a component's size, the next step is to [learn how to lay it out on the screen](flexbox.md). diff --git a/website/versioned_docs/version-0.63/hermes.md b/website/versioned_docs/version-0.63/hermes.md new file mode 100644 index 00000000000..349c6c0b593 --- /dev/null +++ b/website/versioned_docs/version-0.63/hermes.md @@ -0,0 +1,92 @@ +--- +id: version-0.63-hermes +title: Using Hermes +original_id: hermes +--- + + + + + +[Hermes](https://hermesengine.dev) is an open-source JavaScript engine optimized for running React Native apps on Android. For many apps, enabling Hermes will result in improved start-up time, decreased memory usage, and smaller app size. At this time Hermes is an **opt-in** React Native feature, and this guide explains how to enable it. + +First, ensure you're using at least version 0.60.4 of React Native. + +If you have an existing app based on an earlier version of React Native, you will have to upgrade it first. See [Upgrading to new React Native Versions](/docs/upgrading) for how to do this. Make especially sure that all changes to `android/app/build.gradle` have been applied, as detailed by the [React Native upgrade helper](https://react-native-community.github.io/upgrade-helper/?from=0.59.0). After upgrading the app, make sure everything works before trying to switch to Hermes. + +> ## Note for Windows users. +> +> Hermes requires [Microsoft Visual C++ 2015 Redistributable](https://www.microsoft.com/en-us/download/details.aspx?id=48145) + +Edit your `android/app/build.gradle` file and make the change illustrated below: + +```diff + project.ext.react = [ + entryFile: "index.js", +- enableHermes: false // clean and rebuild if changing ++ enableHermes: true // clean and rebuild if changing + ] +``` + +Also, if you're using ProGuard, you will need to add these rules in `proguard-rules.pro` : + +``` +-keep class com.facebook.hermes.unicode.** { *; } +-keep class com.facebook.jni.** { *; } +``` + +Next, if you've already built your app at least once, clean the build: + +```sh +$ cd android && ./gradlew clean +``` + +That's it! You should now be able to develop and deploy your app as normal: + +```sh +$ npx react-native run-android +``` + +> ## Note about Android App Bundles +> +> Android app bundles are supported from react-native 0.62.0 and up. + +## Confirming Hermes is in use + +If you've recently created a new app from scratch, you should see if Hermes is enabled in the welcome view: + +![Where to find JS engine status in AwesomeProject](/docs/assets/HermesApp.jpg) + +A `HermesInternal` global variable will be available in JavaScript that can be used to verify that Hermes is in use: + +```jsx +const isHermes = () => !!global.HermesInternal; +``` + +To see the benefits of Hermes, try making a release build/deployment of your app to compare. For example: + +```sh +$ npx react-native run-android --variant release +``` + +This will compile JavaScript to bytecode during build time which will improve your app's startup speed on device. + +## Debugging Hermes using Google Chrome's DevTools + +Hermes supports the Chrome debugger by implementing the Chrome inspector protocol. This means Chrome's tools can be used to directly debug JavaScript running on Hermes, on an emulator or device. + +Chrome connects to Hermes running on device via Metro, so you'll need to know where Metro is listening. Typically this will be on `localhost:8081`, but this is [configurable](https://facebook.github.io/metro/docs/configuration). When running `yarn start` the address is written to stdout on startup. + +Once you know where the Metro server is listening, you can connect with Chrome using the following steps: + +1. Navigate to `chrome://inspect` in a Chrome browser instance. + +2. Use the `Configure...` button to add the Metro server address (typically `localhost:8081` as described above). + +![Configure button in Chrome DevTools devices page](/docs/assets/HermesDebugChromeConfig.png) + +![Dialog for adding Chrome DevTools network targets](/docs/assets/HermesDebugChromeMetroAddress.png) + +3. You should now see a "Hermes React Native" target with an "inspect" link which can be used to bring up debugger. If you don't see the "inspect" link, make sure the Metro server is running. ![Target inspect link](/docs/assets/HermesDebugChromeInspect.png) + +4. You can now use the Chrome debug tools. For example, to breakpoint the next time some JavaScript is run, click on the pause button and trigger an action in your app which would cause JavaScript to execute. ![Pause button in debug tools](/docs/assets/HermesDebugChromePause.png) diff --git a/website/versioned_docs/version-0.63/image-style-props.md b/website/versioned_docs/version-0.63/image-style-props.md new file mode 100644 index 00000000000..bbf3eebac6e --- /dev/null +++ b/website/versioned_docs/version-0.63/image-style-props.md @@ -0,0 +1,648 @@ +--- +id: version-0.63-image-style-props +title: Image Style Props +original_id: image-style-props +--- + +### Examples + +
+
    + + +
+
+ + + +```SnackPlayer name=Image%20Style%20Props%20Function%20Component%20Example +import React from "react"; +import { View, Image, Text, StyleSheet } from "react-native"; + +const DisplayAnImageWithStyle = () => { + return ( + + + + resizeMode : cover + + + + resizeMode : contain + + + + resizeMode : stretch + + + + resizeMode : repeat + + + + resizeMode : center + + + ); +} + +const styles = StyleSheet.create({ + container: { + display: "flex", + flexDirection: "vertical", + justifyContent: "space-around", + alignItems: "center", + height: "100%", + textAlign: "center" + } +}); + +export default DisplayAnImageWithStyle; +``` + + + +```SnackPlayer name=Image%20Style%20Props%20Class%20Component%20Example +import React, { Component } from "react"; +import { View, Image, StyleSheet, Text } from "react-native"; + +class DisplayAnImageWithStyle extends Component { + render() { + return ( + + + + resizeMode : cover + + + + resizeMode : contain + + + + resizeMode : stretch + + + + resizeMode : repeat + + + + resizeMode : center + + + ); + } +} + +const styles = StyleSheet.create({ + container: { + display: "flex", + flexDirection: "vertical", + justifyContent: "space-around", + alignItems: "center", + height: "100%", + textAlign: "center" + } +}); + +export default DisplayAnImageWithStyle; +``` + + + +
+
    + + +
+
+ + + +```SnackPlayer name=Style%20Border%20Radius%20Function%20Component%20Example +import React from "react"; +import { View, Image, StyleSheet, Text } from "react-native"; + +const DisplayAnImageWithStyle = () => { + return ( + + + + borderTopRightRadius + + + + borderBottomRightRadius + + + + borderBottomLeftRadius + + + + borderTopLeftRadius + + + ); +} + +const styles = StyleSheet.create({ + container: { + display: "flex", + flexDirection: "vertical", + justifyContent: "space-around", + alignItems: "center", + height: "100%", + textAlign: "center" + } +}); + +export default DisplayAnImageWithStyle; +``` + + + +```SnackPlayer name=Style%20Border%20Radius%20Class%20Component%20Example +import React, { Component } from "react"; +import { View, Image, StyleSheet, Text } from "react-native"; + +class DisplayAnImageWithStyle extends Component { + render() { + return ( + + + + borderTopRightRadius + + + + borderBottomRightRadius + + + + borderBottomLeftRadius + + + + borderTopLeftRadius + + + ); + } +} + +const styles = StyleSheet.create({ + container: { + display: "flex", + flexDirection: "vertical", + justifyContent: "space-around", + alignItems: "center", + height: "100%", + textAlign: "center" + } +}); + +export default DisplayAnImageWithStyle; +``` + + + +
+
    + + +
+
+ + + +```SnackPlayer name=Style%20BorderWidth%20and%20BorderColor%20Function%20Component%20Example +import React from "react"; +import { View, Image, StyleSheet, Text } from "react-native"; + +const DisplayAnImageWithStyle = () => { + return ( + + + + borderColor & borderWidth + + + ); +} + +const styles = StyleSheet.create({ + container: { + display: "flex", + flexDirection: "vertical", + justifyContent: "center", + alignItems: "center", + height: "100%", + textAlign: "center" + } +}); + +export default DisplayAnImageWithStyle; +``` + + + +```SnackPlayer name=Style%20BorderWidth%20and%20BorderColor%20Class%20Component%20Example +import React, { Component } from "react"; +import { View, Image, StyleSheet, Text } from "react-native"; + +class DisplayAnImageWithStyle extends Component { + render() { + return ( + + + borderColor & borderWidth + + ); + } +} + +const styles = StyleSheet.create({ + container: { + display: "flex", + flexDirection: "vertical", + justifyContent: "center", + alignItems: "center", + height: "100%", + textAlign: "center" + } +}); + +export default DisplayAnImageWithStyle; +``` + + + +
+
    + + +
+
+ + + +```SnackPlayer name=Style%20tintColor%20Function%20Component +import React from "react"; +import { View, Image, StyleSheet, Text } from "react-native"; + +const DisplayAnImageWithStyle = () => { + return ( + + + tintColor + + ); +} + +const styles = StyleSheet.create({ + container: { + display: "flex", + flexDirection: "vertical", + justifyContent: "space-around", + alignItems: "center", + height: "100%", + textAlign: "center" + } +}); + +export default DisplayAnImageWithStyle; +``` + + + +```SnackPlayer name=Style%20tintColor%20Class%20Component +import React, { Component } from "react"; +import { View, Image, StyleSheet, Text } from "react-native"; + +class DisplayAnImageWithStyle extends Component { + render() { + return ( + + + tintColor + + ); + } +} + +const styles = StyleSheet.create({ + container: { + display: "flex", + flexDirection: "vertical", + justifyContent: "space-around", + alignItems: "center", + height: "100%", + textAlign: "center" + } +}); + +export default DisplayAnImageWithStyle; +``` + + + +# Reference + +## Props + +### `borderTopRightRadius` + +| Type | Required | +| ------ | -------- | +| number | No | + +--- + +### `backfaceVisibility` + +| Type | Required | +| ------------------------- | -------- | +| enum('visible', 'hidden') | No | + +--- + +### `borderBottomLeftRadius` + +| Type | Required | +| ------ | -------- | +| number | No | + +--- + +### `borderBottomRightRadius` + +| Type | Required | +| ------ | -------- | +| number | No | + +--- + +### `borderColor` + +| Type | Required | +| ------------------ | -------- | +| [color](colors.md) | No | + +--- + +### `borderRadius` + +| Type | Required | +| ------ | -------- | +| number | No | + +--- + +### `borderTopLeftRadius` + +| Type | Required | +| ------ | -------- | +| number | No | + +--- + +### `backgroundColor` + +| Type | Required | +| ------------------ | -------- | +| [color](colors.md) | No | + +--- + +### `borderWidth` + +| Type | Required | +| ------ | -------- | +| number | No | + +--- + +### `opacity` + +| Type | Required | +| ------ | -------- | +| number | No | + +--- + +### `overflow` + +| Type | Required | +| ------------------------- | -------- | +| enum('visible', 'hidden') | No | + +--- + +### `resizeMode` + +| Type | Required | +| ------------------------------------------------------- | -------- | +| enum('cover', 'contain', 'stretch', 'repeat', 'center') | No | + +--- + +### `tintColor` + +Changes the color of all the non-transparent pixels to the tintColor. + +| Type | Required | +| ------------------ | -------- | +| [color](colors.md) | No | + +--- + +### `overlayColor` + +When the image has rounded corners, specifying an overlayColor will cause the remaining space in the corners to be filled with a solid color. This is useful in cases which are not supported by the Android implementation of rounded corners: + +- Certain resize modes, such as 'contain' +- Animated GIFs + +A typical way to use this prop is with images displayed on a solid background and setting the `overlayColor` to the same color as the background. + +For details of how this works under the hood, see https://frescolib.org/docs/rounded-corners-and-circles.html + +| Type | Required | Platform | +| ------ | -------- | -------- | +| string | No | Android | diff --git a/website/versioned_docs/version-0.63/image.md b/website/versioned_docs/version-0.63/image.md new file mode 100644 index 00000000000..6cc01fb80eb --- /dev/null +++ b/website/versioned_docs/version-0.63/image.md @@ -0,0 +1,582 @@ +--- +id: version-0.63-image +title: Image +original_id: image +--- + +A React component for displaying different types of images, including network images, static resources, temporary local images, and images from local disk, such as the camera roll. + +This example shows fetching and displaying an image from local storage as well as one from network and even from data provided in the `'data:'` uri scheme. + +> Note that for network and data images, you will need to manually specify the dimensions of your image! + +## Examples + +
+
    + + +
+
+ + + +```SnackPlayer name=Function%20Component%20Example + +import React from 'react'; +import { View, Image, StyleSheet } from 'react-native'; + +const styles = StyleSheet.create({ + container: { + paddingTop: 50, + }, + tinyLogo: { + width: 50, + height: 50, + }, + logo: { + width: 66, + height: 58, + }, +}); + +const DisplayAnImage = () => { + return ( + + + + + + ); +} + +export default DisplayAnImage; +``` + + + +```SnackPlayer name=Class%20Component%20Example + +import React, { Component } from 'react'; +import { AppRegistry, View, Image, StyleSheet } from 'react-native'; + +const styles = StyleSheet.create({ + container: { + paddingTop: 50, + }, + tinyLogo: { + width: 50, + height: 50, + }, + logo: { + width: 66, + height: 58, + }, +}); + +class DisplayAnImage extends Component { + render() { + return ( + + + + + + ); + } +} + +export default DisplayAnImage; +``` + + + +You can also add `style` to an image: + +
+
    + + +
+
+ + + +```SnackPlayer name=Function%20Component%20Example + +import React from 'react'; +import { View, Image, StyleSheet } from 'react-native'; + +const styles = StyleSheet.create({ + container: { + paddingTop: 50, + }, + stretch: { + width: 50, + height: 200, + resizeMode: 'stretch', + }, +}); + +const DisplayAnImageWithStyle = () => { + return ( + + + + ); +} + +export default DisplayAnImageWithStyle; +``` + + + +```SnackPlayer name=Class%20Component%20Example + +import React, { Component } from 'react'; +import { View, Image, StyleSheet } from 'react-native'; + +const styles = StyleSheet.create({ + stretch: { + width: 50, + height: 200, + resizeMode: 'stretch' + } +}); + +class DisplayAnImageWithStyle extends Component { + render() { + return ( + + + + ); + } +} + +export default DisplayAnImageWithStyle; +``` + + + +## GIF and WebP support on Android + +When building your own native code, GIF and WebP are not supported by default on Android. + +You will need to add some optional modules in `android/app/build.gradle`, depending on the needs of your app. + +```gradle +dependencies { + // If your app supports Android versions before Ice Cream Sandwich (API level 14) + implementation 'com.facebook.fresco:animated-base-support:1.3.0' + + // For animated GIF support + implementation 'com.facebook.fresco:animated-gif:2.0.0' + + // For WebP support, including animated WebP + implementation 'com.facebook.fresco:animated-webp:2.1.0' + implementation 'com.facebook.fresco:webpsupport:2.0.0' + + // For WebP support, without animations + implementation 'com.facebook.fresco:webpsupport:2.0.0' +} +``` + +--- + +# Reference + +## Props + +### `style` + +`ImageResizeMode` is an `Enum` for different image resizing modes, set via the `resizeMode` style property on `Image` components. The values are `contain`, `cover`, `stretch`, `center`, `repeat`. + +| Type | Required | +| ----- | -------- | +| style | No | + +- [Image Style Props...](image-style-props#props) + +- [Layout Props...](layout-props#props) + +- [Shadow Props...](shadow-props#props) + +- [Transforms...](transforms#props) + +--- + +### `accessible` + +When true, indicates the image is an accessibility element. + +| Type | Required | Platform | +| ---- | -------- | -------- | +| bool | No | iOS | + +--- + +### `accessibilityLabel` + +The text that's read by the screen reader when the user interacts with the image. + +| Type | Required | Platform | +| ------ | -------- | -------- | +| string | No | iOS | + +--- + +### `blurRadius` + +blurRadius: the blur radius of the blur filter added to the image + +| Type | Required | +| ------ | -------- | +| number | No | + +> Tip : IOS you will need to increase `blurRadius` more than `5` + +--- + +### `capInsets` + +When the image is resized, the corners of the size specified by `capInsets` will stay a fixed size, but the center content and borders of the image will be stretched. This is useful for creating resizable rounded buttons, shadows, and other resizable assets. More info in the [official Apple documentation](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIImage_Class/index.html#//apple_ref/occ/instm/UIImage/resizableImageWithCapInsets). + +| Type | Required | Platform | +| ------------ | -------- | -------- | +| [Rect](rect) | No | iOS | + +--- + +### `defaultSource` + +A static image to display while loading the image source. + +| Type | Required | Platform | +| -------------- | -------- | -------- | +| object, number | No | iOS | +| number | No | Android | + +If passing an object, the general shape is `{uri: string, width: number, height: number, scale: number}`: + +- `uri` - a string representing the resource identifier for the image, which should be either a local file path or the name of a static image resource (which should be wrapped in the `require('./path/to/image.png')` function). +- `width`, `height` - can be specified if known at build time, in which case these will be used to set the default `` component dimensions. +- `scale` - used to indicate the scale factor of the image. Defaults to 1.0 if unspecified, meaning that one image pixel equates to one display point / DIP. + +If passing a number: + +- `number` - Opaque type returned by something like `require('./image.jpg')`. + +> **Note:** On Android, the default source prop is ignored on debug builds. + +--- + +### `fadeDuration` + +Android only. By default, it is 300ms. + +| Type | Required | Platform | +| ------ | -------- | -------- | +| number | No | Android | + +--- + +### `loadingIndicatorSource` + +Similarly to `source`, this property represents the resource used to render the loading indicator for the image, displayed until image is ready to be displayed, typically after when it got downloaded from network. + +| Type | Required | +| ------------------------------------- | -------- | +| array of ImageSourcePropTypes, number | No | + +> Can accept a number as returned by `require('./image.jpg')` + +--- + +### `onError` + +Invoked on load error with `{nativeEvent: {error}}`. + +| Type | Required | +| -------- | -------- | +| function | No | + +--- + +### `onLayout` + +Invoked on mount and layout changes with `{nativeEvent: {layout: {x, y, width, height}}}`. + +| Type | Required | +| -------- | -------- | +| function | No | + +--- + +### `onLoad` + +Invoked when load completes successfully. + +| Type | Required | +| -------- | -------- | +| function | No | + +--- + +### `onLoadEnd` + +Invoked when load either succeeds or fails. + +| Type | Required | +| -------- | -------- | +| function | No | + +--- + +### `onLoadStart` + +Invoked on load start. + +e.g., `onLoadStart={(e) => this.setState({loading: true})}` + +| Type | Required | +| -------- | -------- | +| function | No | + +--- + +### `onPartialLoad` + +Invoked when a partial load of the image is complete. The definition of what constitutes a "partial load" is loader specific though this is meant for progressive JPEG loads. + +| Type | Required | Platform | +| -------- | -------- | -------- | +| function | No | iOS | + +--- + +### `onProgress` + +Invoked on download progress with `{nativeEvent: {loaded, total}}`. + +| Type | Required | Platform | +| -------- | -------- | -------- | +| function | No | iOS | + +--- + +### `progressiveRenderingEnabled` + +Android only. When true, enables progressive jpeg streaming. https://frescolib.org/docs/progressive-jpegs.html + +| Type | Required | Platform | +| ---- | -------- | -------- | +| bool | No | Android | + +--- + +### `resizeMethod` + +The mechanism that should be used to resize the image when the image's dimensions differ from the image view's dimensions. Defaults to `auto`. + +- `auto`: Use heuristics to pick between `resize` and `scale`. + +- `resize`: A software operation which changes the encoded image in memory before it gets decoded. This should be used instead of `scale` when the image is much larger than the view. + +- `scale`: The image gets drawn downscaled or upscaled. Compared to `resize`, `scale` is faster (usually hardware accelerated) and produces higher quality images. This should be used if the image is smaller than the view. It should also be used if the image is slightly bigger than the view. + +More details about `resize` and `scale` can be found at http://frescolib.org/docs/resizing.html. + +| Type | Required | Platform | +| ------------------------------- | -------- | -------- | +| enum('auto', 'resize', 'scale') | No | Android | + +--- + +### `resizeMode` + +Determines how to resize the image when the frame doesn't match the raw image dimensions. Defaults to `cover`. + +- `cover`: Scale the image uniformly (maintain the image's aspect ratio) so that both dimensions (width and height) of the image will be equal to or larger than the corresponding dimension of the view (minus padding). + +- `contain`: Scale the image uniformly (maintain the image's aspect ratio) so that both dimensions (width and height) of the image will be equal to or less than the corresponding dimension of the view (minus padding). + +- `stretch`: Scale width and height independently, This may change the aspect ratio of the src. + +- `repeat`: Repeat the image to cover the frame of the view. The image will keep its size and aspect ratio, unless it is larger than the view, in which case it will be scaled down uniformly so that it is contained in the view. + +- `center`: Center the image in the view along both dimensions. If the image is larger than the view, scale it down uniformly so that it is contained in the view. + +| Type | Required | +| ------------------------------------------------------- | -------- | +| enum('cover', 'contain', 'stretch', 'repeat', 'center') | No | + +--- + +### `source` + +The image source (either a remote URL or a local file resource). + +This prop can also contain several remote URLs, specified together with their width and height and potentially with scale/other URI arguments. The native side will then choose the best `uri` to display based on the measured size of the image container. A `cache` property can be added to control how networked request interacts with the local cache. (For more information see [Cache Control for Images](images#cache-control-ios-only)). + +The currently supported formats are `png`, `jpg`, `jpeg`, `bmp`, `gif`, `webp` (Android only), `psd` (iOS only). In addition, iOS supports several RAW image formats. Refer to Apple's documentation for the current list of supported camera models (for iOS 12, see https://support.apple.com/en-ca/HT208967). + +| Type | Required | +| ------------------- | -------- | +| ImageSourcePropType | No | + +--- + +### `testID` + +A unique identifier for this element to be used in UI Automation testing scripts. + +| Type | Required | +| ------ | -------- | +| string | No | + +## Methods + +### `getSize()` + +```jsx +Image.getSize(uri, success, [failure]); +``` + +Retrieve the width and height (in pixels) of an image prior to displaying it. This method can fail if the image cannot be found, or fails to download. + +In order to retrieve the image dimensions, the image may first need to be loaded or downloaded, after which it will be cached. This means that in principle you could use this method to preload images, however it is not optimized for that purpose, and may in future be implemented in a way that does not fully load/download the image data. A proper, supported way to preload images will be provided as a separate API. + +**Parameters:** + +| Name | Type | Required | Description | +| ------- | -------- | -------- | ---------------------------------------------------------------------------------------------------- | +| uri | string | Yes | The location of the image. | +| success | function | Yes | The function that will be called if the image was successfully found and width and height retrieved. | +| failure | function | No | The function that will be called if there was an error, such as failing to retrieve the image. | + +--- + +### `getSizeWithHeaders()` + +```jsx +Image.getSizeWithHeaders(uri, headers, success, [failure]); +``` + +Retrieve the width and height (in pixels) of an image prior to displaying it with the ability to provide the headers for the request. This method can fail if the image cannot be found, or fails to download. + +In order to retrieve the image dimensions, the image may first need to be loaded or downloaded, after which it will be cached. This means that in principle you could use this method to preload images, however it is not optimized for that purpose, and may in future be implemented in a way that does not fully load/download the image data. A proper, supported way to preload images will be provided as a separate API. + +Does not work for static image resources. + +**Parameters:** + +| Name | Type | Required | Description | +| ------- | -------- | -------- | ---------------------------------------------------------------------------------------------------- | +| uri | string | Yes | The location of the image. | +| headers | object | Yes | The headers for the request. | +| success | function | Yes | The function that will be called if the image was successfully found and width and height retrieved. | +| failure | function | No | The function that will be called if there was an error, such as failing toto retrieve the image. | + +--- + +### `prefetch()` + +```jsx +Image.prefetch(url); +``` + +Prefetches a remote image for later use by downloading it to the disk cache + +**Parameters:** + +| Name | Type | Required | Description | +| ---- | ------ | -------- | --------------------------------- | +| url | string | Yes | The remote location of the image. | + +--- + +### `abortPrefetch()` + +```jsx +Image.abortPrefetch(requestId); +``` + +Abort prefetch request. Android-only. + +**Parameters:** + +| Name | Type | Required | Description | +| --------- | ------ | -------- | ---------------------------- | +| requestId | number | Yes | Id as returned by prefetch() | + +--- + +### `queryCache()` + +```jsx +Image.queryCache(urls); +``` + +Perform cache interrogation. Returns a mapping from URL to cache status, such as "disk" or "memory". If a requested URL is not in the mapping, it means it's not in the cache. + +**Parameters:** + +| Name | Type | Required | Description | +| ---- | ----- | -------- | ------------------------------------------ | +| urls | array | Yes | List of image URLs to check the cache for. | + +--- + +### `resolveAssetSource()` + +```jsx +Image.resolveAssetSource(source); +``` + +Resolves an asset reference into an object which has the properties `uri`, `width`, and `height`. + +**Parameters:** + +| Name | Type | Required | Description | +| ------ | -------------- | -------- | ---------------------------------------------------------------------------- | +| source | number, object | Yes | A number (opaque type returned by require('./foo.png')) or an `ImageSource`. | + +> `ImageSource` is an object like `{ uri: '' }` diff --git a/website/versioned_docs/version-0.63/imagebackground.md b/website/versioned_docs/version-0.63/imagebackground.md new file mode 100644 index 00000000000..1af4db51c7b --- /dev/null +++ b/website/versioned_docs/version-0.63/imagebackground.md @@ -0,0 +1,75 @@ +--- +id: version-0.63-imagebackground +title: ImageBackground +original_id: imagebackground +--- + +A common feature request from developers familiar with the web is `background-image`. To handle this use case, you can use the `` component, which has the same props as ``, and add whatever children to it you would like to layer on top of it. + +You might not want to use `` in some cases, since the implementation is basic. Refer to ``'s [source code](https://github.com/facebook/react-native/blob/master/Libraries/Image/ImageBackground.js) for more insight, and create your own custom component when needed. + +Note that you must specify some width and height style attributes. + +## Example + +```SnackPlayer name=ImageBackground +import React from "react"; +import { ImageBackground, StyleSheet, Text, View } from "react-native"; + +const image = { uri: "https://reactjs.org/logo-og.png" }; + +const App = () => ( + + + Inside + + +); + +const styles = StyleSheet.create({ + container: { + flex: 1, + flexDirection: "column" + }, + image: { + flex: 1, + resizeMode: "cover", + justifyContent: "center" + }, + text: { + color: "grey", + fontSize: 30, + fontWeight: "bold" + } +}); + +export default App; +``` + +--- + +# Reference + +## Props + +Inherits [Image Props](image.md#props). + +### `style` + +| Type | Required | +| ---------------------------------- | -------- | +| [view styles](view-style-props.md) | No | + +### `imageStyle` + +| Type | Required | +| ------------------------------------ | -------- | +| [image styles](image-style-props.md) | No | + +### `imageRef` + +Allows to set a reference to the inner `Image` component + +| Type | Required | +| ----------------------------------------------------- | -------- | +| [Ref](https://reactjs.org/docs/refs-and-the-dom.html) | No | diff --git a/website/versioned_docs/version-0.63/images.md b/website/versioned_docs/version-0.63/images.md new file mode 100644 index 00000000000..d4d8883889d --- /dev/null +++ b/website/versioned_docs/version-0.63/images.md @@ -0,0 +1,231 @@ +--- +id: version-0.63-images +title: Images +original_id: images +--- + +## Static Image Resources + +React Native provides a unified way of managing images and other media assets in your Android and iOS apps. To add a static image to your app, place it somewhere in your source code tree and reference it like this: + +```jsx + +``` + +The image name is resolved the same way JS modules are resolved. In the example above, the bundler will look for `my-icon.png` in the same folder as the component that requires it. Also, if you have `my-icon.ios.png` and `my-icon.android.png`, the bundler will pick the correct file for the platform. + +You can also use the `@2x` and `@3x` suffixes to provide images for different screen densities. If you have the following file structure: + +``` +. +├── button.js +└── img + ├── check.png + ├── check@2x.png + └── check@3x.png +``` + +...and `button.js` code contains: + +```jsx + +``` + +...the bundler will bundle and serve the image corresponding to device's screen density. For example, `check@2x.png`, will be used on an iPhone 7, while`check@3x.png` will be used on an iPhone 7 Plus or a Nexus 5. If there is no image matching the screen density, the closest best option will be selected. + +On Windows, you might need to restart the bundler if you add new images to your project. + +Here are some benefits that you get: + +1. Same system on Android and iOS. +2. Images live in the same folder as your JavaScript code. Components are self-contained. +3. No global namespace, i.e. you don't have to worry about name collisions. +4. Only the images that are actually used will be packaged into your app. +5. Adding and changing images doesn't require app recompilation, you can refresh the simulator as you normally do. +6. The bundler knows the image dimensions, no need to duplicate it in the code. +7. Images can be distributed via [npm](https://www.npmjs.com/) packages. + +In order for this to work, the image name in `require` has to be known statically. + +```jsx +// GOOD +; + +// BAD +var icon = this.props.active + ? 'my-icon-active' + : 'my-icon-inactive'; +; + +// GOOD +var icon = this.props.active + ? require('./my-icon-active.png') + : require('./my-icon-inactive.png'); +; +``` + +Note that image sources required this way include size (width, height) info for the Image. If you need to scale the image dynamically (i.e. via flex), you may need to manually set `{ width: undefined, height: undefined }` on the style attribute. + +## Static Non-Image Resources + +The `require` syntax described above can be used to statically include audio, video or document files in your project as well. Most common file types are supported including `.mp3`, `.wav`, `.mp4`, `.mov`, `.html` and `.pdf`. See [bundler defaults](https://github.com/facebook/metro/blob/master/packages/metro-config/src/defaults/defaults.js#L14-L44) for the full list. + +You can add support for other types by adding an [`assetExts` resolver option](https://facebook.github.io/metro/docs/configuration#resolver-options) in your [Metro configuration](https://facebook.github.io/metro/docs/configuration). + +A caveat is that videos must use absolute positioning instead of `flexGrow`, since size info is not currently passed for non-image assets. This limitation doesn't occur for videos that are linked directly into Xcode or the Assets folder for Android. + +## Images From Hybrid App's Resources + +If you are building a hybrid app (some UIs in React Native, some UIs in platform code) you can still use images that are already bundled into the app. + +For images included via Xcode asset catalogs or in the Android drawable folder, use the image name without the extension: + +```jsx + +``` + +For images in the Android assets folder, use the `asset:/` scheme: + +```jsx + +``` + +These approaches provide no safety checks. It's up to you to guarantee that those images are available in the application. Also you have to specify image dimensions manually. + +## Network Images + +Many of the images you will display in your app will not be available at compile time, or you will want to load some dynamically to keep the binary size down. Unlike with static resources, _you will need to manually specify the dimensions of your image_. It's highly recommended that you use https as well in order to satisfy [App Transport Security](running-on-device.md#app-transport-security) requirements on iOS. + +```jsx +// GOOD + + +// BAD + +``` + +### Network Requests for Images + +If you would like to set such things as the HTTP-Verb, Headers or a Body along with the image request, you may do this by defining these properties on the source object: + +```jsx + +``` + +## Uri Data Images + +Sometimes, you might be getting encoded image data from a REST API call. You can use the `'data:'` uri scheme to use these images. Same as for network resources, _you will need to manually specify the dimensions of your image_. + +> This is recommended for very small and dynamic images only, like icons in a list from a DB. + +```jsx +// include at least width and height! + +``` + +### Cache Control (iOS Only) + +In some cases you might only want to display an image if it is already in the local cache, i.e. a low resolution placeholder until a higher resolution is available. In other cases you do not care if the image is outdated and are willing to display an outdated image to save bandwidth. The `cache` source property gives you control over how the network layer interacts with the cache. + +- `default`: Use the native platforms default strategy. +- `reload`: The data for the URL will be loaded from the originating source. No existing cache data should be used to satisfy a URL load request. +- `force-cache`: The existing cached data will be used to satisfy the request, regardless of its age or expiration date. If there is no existing data in the cache corresponding the request, the data is loaded from the originating source. +- `only-if-cached`: The existing cache data will be used to satisfy a request, regardless of its age or expiration date. If there is no existing data in the cache corresponding to a URL load request, no attempt is made to load the data from the originating source, and the load is considered to have failed. + +```jsx + +``` + +## Local Filesystem Images + +See [CameraRoll](https://github.com/react-native-community/react-native-cameraroll) for an example of using local resources that are outside of `Images.xcassets`. + +### Best Camera Roll Image + +iOS saves multiple sizes for the same image in your Camera Roll, it is very important to pick the one that's as close as possible for performance reasons. You wouldn't want to use the full quality 3264x2448 image as source when displaying a 200x200 thumbnail. If there's an exact match, React Native will pick it, otherwise it's going to use the first one that's at least 50% bigger in order to avoid blur when resizing from a close size. All of this is done by default so you don't have to worry about writing the tedious (and error prone) code to do it yourself. + +## Why Not Automatically Size Everything? + +_In the browser_ if you don't give a size to an image, the browser is going to render a 0x0 element, download the image, and then render the image based with the correct size. The big issue with this behavior is that your UI is going to jump all around as images load, this makes for a very bad user experience. + +_In React Native_ this behavior is intentionally not implemented. It is more work for the developer to know the dimensions (or aspect ratio) of the remote image in advance, but we believe that it leads to a better user experience. Static images loaded from the app bundle via the `require('./my-icon.png')` syntax _can be automatically sized_ because their dimensions are available immediately at the time of mounting. + +For example, the result of `require('./my-icon.png')` might be: + +```jsx +{"__packager_asset":true,"uri":"my-icon.png","width":591,"height":573} +``` + +## Source as an object + +In React Native, one interesting decision is that the `src` attribute is named `source` and doesn't take a string but an object with a `uri` attribute. + +```jsx + +``` + +On the infrastructure side, the reason is that it allows us to attach metadata to this object. For example if you are using `require('./my-icon.png')`, then we add information about its actual location and size (don't rely on this fact, it might change in the future!). This is also future proofing, for example we may want to support sprites at some point, instead of outputting `{uri: ...}`, we can output `{uri: ..., crop: {left: 10, top: 50, width: 20, height: 40}}` and transparently support spriting on all the existing call sites. + +On the user side, this lets you annotate the object with useful attributes such as the dimension of the image in order to compute the size it's going to be displayed in. Feel free to use it as your data structure to store more information about your image. + +## Background Image via Nesting + +A common feature request from developers familiar with the web is `background-image`. To handle this use case, you can use the `` component, which has the same props as ``, and add whatever children to it you would like to layer on top of it. + +You might not want to use `` in some cases, since the implementation is basic. Refer to ``'s [documentation](imagebackground.md) for more insight, and create your own custom component when needed. + +```jsx +return ( + + Inside + +); +``` + +Note that you must specify some width and height style attributes. + +## iOS Border Radius Styles + +Please note that the following corner specific, border radius style properties are currently ignored by iOS's image component: + +- `borderTopLeftRadius` +- `borderTopRightRadius` +- `borderBottomLeftRadius` +- `borderBottomRightRadius` + +## Off-thread Decoding + +Image decoding can take more than a frame-worth of time. This is one of the major sources of frame drops on the web because decoding is done in the main thread. In React Native, image decoding is done in a different thread. In practice, you already need to handle the case when the image is not downloaded yet, so displaying the placeholder for a few more frames while it is decoding does not require any code change. diff --git a/website/versioned_docs/version-0.63/inputaccessoryview.md b/website/versioned_docs/version-0.63/inputaccessoryview.md new file mode 100644 index 00000000000..e66d3e86c74 --- /dev/null +++ b/website/versioned_docs/version-0.63/inputaccessoryview.md @@ -0,0 +1,79 @@ +--- +id: version-0.63-inputaccessoryview +title: InputAccessoryView +original_id: inputaccessoryview +--- + +A component which enables customization of the keyboard input accessory view on iOS. The input accessory view is displayed above the keyboard whenever a `TextInput` has focus. This component can be used to create custom toolbars. + +To use this component wrap your custom toolbar with the InputAccessoryView component, and set a `nativeID`. Then, pass that `nativeID` as the `inputAccessoryViewID` of whatever `TextInput` you desire. A basic example: + +```SnackPlayer name=InputAccessoryView&supportedPlatforms=ios +import React, { useState } from 'react'; +import { Button, InputAccessoryView, ScrollView, TextInput } from 'react-native'; + +export default App = () => { + const inputAccessoryViewID = 'uniqueID'; + const initialText = 'Placeholder Text'; + const [text, setText] = useState(initialText); + + return ( + <> + + setText(text)} + value={text} + /> + + + + + + + + + +> If you’re familiar with web development, `` and `` might remind you of HTML! You can think of them as the `
` and `

` tags of application development. + + + +> On Android, you usually put your views inside `LinearLayout`, `FrameLayout`, `RelativeLayout`, etc. to define how the view’s children will be arranged on the screen. In React Native, `View` uses Flexbox for its children’s layout. You can learn more in [our guide to layout with Flexbox](flexbox). + + + +You can render this component multiple times and multiple places without repeating your code by using ``: + +```SnackPlayer name=Multiple%20Components +import React from 'react'; +import { Text, TextInput, View } from 'react-native'; + +const Cat = () => { + return ( + + I am also a cat! + + ); +} + +const Cafe = () => { + return ( + + Welcome! + + + + + ); +} + +export default Cafe; +``` + +Any component that renders other components is a **parent component.** Here, `Cafe` is the parent component and each `Cat` is a **child component.** + +You can put as many cats in your cafe as you like. Each `` renders a unique element—which you can customize with props. + +## Props + +**Props** is short for “properties.” Props let you customize React components. For example, here you pass each `` a different `name` for `Cat` to render: + +```SnackPlayer name=Multiple%20Props +import React from 'react'; +import { Text, View } from 'react-native'; + +const Cat = (props) => { + return ( + + Hello, I am {props.name}! + + ); +} + +const Cafe = () => { + return ( + + + + + + ); +} + +export default Cafe; +``` + +Most of React Native’s Core Components can be customized with props, too. For example, when using [`Image`](image), you pass it a prop named [`source`](image#source) to define what image it shows: + +```SnackPlayer name=Props +import React from 'react'; +import { Text, View, Image } from 'react-native'; + +const CatApp = () => { + return ( + + + Hello, I am your cat! + + ); +} + +export default CatApp; +``` + +`Image` has [many different props](image#props), including [`style`](image#style), which accepts a JS object of design and layout related property-value pairs. + +> Notice the double curly braces `{{ }}` surrounding `style`‘s width and height. In JSX, JavaScript values are referenced with `{}`. This is handy if you are passing something other than a string as props, like an array or number: ``. However, JS objects are **_also_** denoted with curly braces: `{width: 200, height: 200}`. Therefore, to pass a JS object in JSX, you must wrap the object in **another pair** of curly braces: `{{width: 200, height: 200}}` + +You can build many things with props and the Core Components [`Text`](text), [`Image`](image), and [`View`](view)! But to build something interactive, you’ll need state. + +## State + +While you can think of props as arguments you use to configure how components render, **state** is like a component’s personal data storage. State is useful for handling data that changes over time or that comes from user interaction. State gives your components memory! + +> As a general rule, use props to configure a component when it renders. Use state to keep track of any component data that you expect to change over time. + +The following example takes place in a cat cafe where two hungry cats are waiting to be fed. Their hunger, which we expect to change over time (unlike their names), is stored as state. To feed the cats, press their buttons—which will update their state. + +

+
    + + +
+
+ + + +You can add state to a component by calling [React’s `useState` Hook](https://reactjs.org/docs/hooks-state.html). A Hook is a kind of function that lets you “hook into” React features. For example, `useState` is a Hook that lets you add state to function components. You can learn more about [other kinds of Hooks in the React documentation.](https://reactjs.org/docs/hooks-intro.html) + +```SnackPlayer name=State +import React, { useState } from "react"; +import { Button, Text, View } from "react-native"; + +const Cat = (props) => { + const [isHungry, setIsHungry] = useState(true); + + return ( + + + I am {props.name}, and I am {isHungry ? "hungry" : "full"}! + + +``` + +> Do not change your component's state directly by assigning it a new value with `this.state.hunger = false`. Calling `this.setState()` allows React to track changes made to state that trigger rerendering. Setting state directly can break your app's reactivity! + +When `this.state.isHungry` is false, the `Button`’s `disabled` prop is set to `false` and its `title` also changes: + +```jsx + + + + +
+ + + +> Web developers may be familiar with this concept. + + + +> Android developers may be familiar with this concept. + + + +> iOS developers may be familiar with this concept. + + + +## Formatting + +Menu paths are written in bold and use carets to navigate submenus. Example: **Android Studio > Preferences** + +--- + +Now that you know how this guide works, it's time to get to know the foundation of React Native: [Native Components](intro-react-native-components.md). diff --git a/website/versioned_docs/version-0.63/keyboard.md b/website/versioned_docs/version-0.63/keyboard.md new file mode 100644 index 00000000000..3e2d2e597bd --- /dev/null +++ b/website/versioned_docs/version-0.63/keyboard.md @@ -0,0 +1,206 @@ +--- +id: version-0.63-keyboard +title: Keyboard +original_id: keyboard +--- + +`Keyboard` module to control keyboard events. + +### Usage + +The Keyboard module allows you to listen for native events and react to them, as well as make changes to the keyboard, like dismissing it. + +
+
    + + +
+
+ + + +```SnackPlayer name=Keyboard%20Function%20Component%20Example + +import React, { useEffect } from "react"; +import { Keyboard, TextInput, StyleSheet } from "react-native"; + +const Example = () => { + + useEffect(() => { + Keyboard.addListener("keyboardDidShow", _keyboardDidShow); + Keyboard.addListener("keyboardDidHide", _keyboardDidHide); + + // cleanup function + return () => { + Keyboard.removeListener("keyboardDidShow", _keyboardDidShow); + Keyboard.removeListener("keyboardDidHide", _keyboardDidHide); + }; + }, []); + + const _keyboardDidShow = () => { + alert("Keyboard Shown"); + }; + + const _keyboardDidHide = () => { + alert("Keyboard Hidden"); + }; + + return ; +} + +const s = StyleSheet.create({ + input:{ + margin:60, + padding: 10, + borderWidth: 0.5, + borderRadius: 4, + backgroundColor: "#fff" + } +}) + +export default Example; +``` + + + +```SnackPlayer name=Keyboard%20Class%20Component%20Example +import React, {Component} from 'react'; +import {Keyboard, TextInput , StyleSheet} from 'react-native'; + +class Example extends Component { + componentDidMount() { + this.keyboardDidShowListener = Keyboard.addListener( + 'keyboardDidShow', + this._keyboardDidShow, + ); + this.keyboardDidHideListener = Keyboard.addListener( + 'keyboardDidHide', + this._keyboardDidHide, + ); + } + + componentWillUnmount() { + this.keyboardDidShowListener.remove(); + this.keyboardDidHideListener.remove(); + } + + _keyboardDidShow() { + alert('Keyboard Shown'); + } + + _keyboardDidHide() { + alert('Keyboard Hidden'); + } + + render() { + return ; + } +} + +const s = StyleSheet.create({ + input:{ + margin:60, + padding: 10, + borderWidth: 0.5, + borderRadius: 4, + backgroundColor: "#fff" + } +}) + +export default Example; +``` + + + +--- + +# Reference + +## Methods + +### `addListener()` + +```jsx +static addListener(eventName, callback) +``` + +The `addListener` function connects a JavaScript function to an identified native keyboard notification event. + +This function then returns the reference to the listener. + +**Parameters:** + +| Name | Type | Required | Description | +| --------- | -------- | -------- | ----------------------------------------------------------------------------------------- | +| eventName | string | Yes | The `nativeEvent` is the string that identifies the event you're listening for. See below | +| callback | function | Yes | The function to be called when the event fires | + +**nativeEvent** + +This can be any of the following + +- `keyboardWillShow` +- `keyboardDidShow` +- `keyboardWillHide` +- `keyboardDidHide` +- `keyboardWillChangeFrame` +- `keyboardDidChangeFrame` + +Note that if you set `android:windowSoftInputMode` to `adjustResize` or `adjustPan`, only `keyboardDidShow` and `keyboardDidHide` events will be available on Android. If you set `android:windowSoftInputMode` to `adjustNothing`, no events will be available on Android. `keyboardWillShow` as well as `keyboardWillHide` are generally not available on Android since there is no native corresponding event. + +--- + +### `removeListener()` + +```jsx +static removeListener(eventName, callback) +``` + +Removes a specific listener. + +**Parameters:** + +| Name | Type | Required | Description | +| --------- | -------- | -------- | ------------------------------------------------------------------------------ | +| eventName | string | Yes | The `nativeEvent` is the string that identifies the event you're listening for | +| callback | function | Yes | The function to be called when the event fires | + +--- + +### `removeAllListeners()` + +```jsx +static removeAllListeners(eventName) +``` + +Removes all listeners for a specific event type. + +**Parameters:** + +| Name | Type | Required | Description | +| --------- | ------ | -------- | -------------------------------------------------------------------- | +| eventType | string | Yes | The native event string listeners are watching which will be removed | + +--- + +### `dismiss()` + +```jsx +static dismiss() +``` + +Dismisses the active keyboard and removes focus. + +--- + +### `scheduleLayoutAnimation` + +```jsx +static scheduleLayoutAnimation(event) +``` + +Useful for syncing TextInput (or other keyboard accessory view) size of position changes with keyboard movements. diff --git a/website/versioned_docs/version-0.63/keyboardavoidingview.md b/website/versioned_docs/version-0.63/keyboardavoidingview.md new file mode 100644 index 00000000000..f316702f82b --- /dev/null +++ b/website/versioned_docs/version-0.63/keyboardavoidingview.md @@ -0,0 +1,108 @@ +--- +id: version-0.63-keyboardavoidingview +title: KeyboardAvoidingView +original_id: keyboardavoidingview +--- + +It is a component to solve the common problem of views that need to move out of the way of the virtual keyboard. It can automatically adjust either its height, position, or bottom padding based on the keyboard height. + +## Example + +```SnackPlayer name=KeyboardAvoidingView&supportedPlatforms=android,ios +import React from 'react'; +import { View, KeyboardAvoidingView, TextInput, StyleSheet, Text, Platform, TouchableWithoutFeedback, Button, Keyboard } from 'react-native'; + +const KeyboardAvoidingComponent = () => { + return ( + + + + Header + + + + + + + + +> If you’re familiar with design systems, another way of thinking about this is that `PlatformColor` lets you tap into the local design system's color tokens so your app can blend right in! + + + +For a full list of the types of system colors supported, see: + +- Android: + - [R.attr](https://developer.android.com/reference/android/R.attr) - `?attr` prefix + - [R.color](https://developer.android.com/reference/android/R.color) - `@android:color` prefix +- [iOS UIColor](https://developer.apple.com/documentation/uikit/uicolor/ui_element_colors) + +## Example + +```jsx +import React from 'react'; +import { + Platform, + PlatformColor, + StyleSheet, + Text, + View +} from 'react-native'; + +export default (App = () => ( + + + I am a special label color! + + +)); + +const styles = StyleSheet.create({ + labelCell: { + flex: 1, + alignItems: 'stretch', + ...Platform.select({ + ios: { color: PlatformColor('label') }, + android: { + color: PlatformColor('?attr/colorControlNormal') + }, + default: { color: 'black' } + }) + } +}); +``` + +The string value provided to the `PlatformColor` function must match and agree with the same string as it exists on the native platform the app is being run on. This means to avoid runtime errors the function should be wrapped in a platform check, either through a `Platform.OS === 'platform'` or a `Platform.Select()`. + +> **Note:** You can find a complete example that demonstrates proper, intended use of `PlatformColor` in [PlatformColorExample.js](https://github.com/facebook/react-native/blob/master/RNTester/js/examples/PlatformColor/PlatformColorExample.js). diff --git a/website/versioned_docs/version-0.63/pressable.md b/website/versioned_docs/version-0.63/pressable.md new file mode 100644 index 00000000000..6d27b55473c --- /dev/null +++ b/website/versioned_docs/version-0.63/pressable.md @@ -0,0 +1,229 @@ +--- +id: version-0.63-pressable +title: Pressable +original_id: pressable +--- + +Pressable is a Core Component wrapper that can detect various stages of press interactions on any of it's defined children. + +```jsx + + I'm pressable! + +``` + +## How it works + +On an element wrapped by `Pressable`: + +- [`onPressIn`](#onpressin) is called when a press is activated. +- [`onPressOut`](#onpressout) is called when the press gesture is deactivated. + +After pressing [`onPressIn`](#onpressin), one of two things will happen: + +1. The person will remove their finger, triggering [`onPressOut`](#onpressout) followed by [`onPress`](#onpress). +2. If the person leaves their finger longer than 370 milliseconds before removing it, [`onLongPress`](#onlongpress) is triggered. ([`onPressOut`](#onpressout) will still fire when they remove their finger.) + +Diagram of the onPress events in sequence. + +Fingers are not the most precise instruments, and it is common for users to accidentally activate the wrong element or miss the activation area. To help, `Pressable` has an optional `HitRect` you can use to define how far a touch can register away from the the wrapped element. Presses can start anywhere within a `HitRect`. + +`PressRect` allows presses to move beyond the element and its `HitRect` while maintaining activation and being eligible for a "press"—think of sliding your finger slowly away from a button you're pressing down on. + +> The touch area never extends past the parent view bounds and the Z-index of sibling views always takes precedence if a touch hits two overlapping views. + +
+ Diagram of HitRect and PressRect and how they work. +
+ You can set HitRect with hitSlop and set PressRect with pressRetentionOffset. +
+
+ +> `Pressable` uses React Native's `Pressability` API. For more information around the state machine flow of Pressability and how it works, check out the implementation for [Pressability](https://github.com/facebook/react-native/blob/16ea9ba8133a5340ed6751ec7d49bf03a0d4c5ea/Libraries/Pressability/Pressability.js#L347). + +## Example + +```js +import React, { useState } from 'react'; +import { Pressable, StyleSheet, Text, View } from 'react-native'; + +const App = () => { + const [timesPressed, setTimesPressed] = useState(0); + + let textLog = ''; + if (timesPressed > 1) { + textLog = timesPressed + 'x onPress'; + } else if (timesPressed > 0) { + textLog = 'onPress'; + } + + return ( + + { + setTimesPressed((current) => current + 1); + }} + style={({ pressed }) => [ + { + backgroundColor: pressed + ? 'rgb(210, 230, 255)' + : 'white' + }, + styles.wrapperCustom + ]}> + {({ pressed }) => ( + + {pressed ? 'Pressed!' : 'Press Me'} + + )} + + + {textLog} + + + ); +}; + +const styles = StyleSheet.create({ + text: { + fontSize: 16 + }, + wrapperCustom: { + borderRadius: 8, + padding: 6 + }, + logBox: { + padding: 20, + margin: 10, + borderWidth: StyleSheet.hairlineWidth, + borderColor: '#f0f0f0', + backgroundColor: '#f9f9f9' + } +}); + +export default App; +``` + +## Props + +### `android_disableSound`
Android
+ +If true, doesn't play Android system sound on press. + +| Type | Required | Default | +| ------- | -------- | ------- | +| boolean | No | `false` | + +### `android_ripple`
Android
+ +Enables the Android ripple effect and configures its properties. + +| Type | Required | +| -------------------------------------- | -------- | +| [RippleConfig](pressable#rippleconfig) | No | + +### `children` + +Either children or a function that receives a boolean reflecting whether the component is currently pressed. + +| Type | Required | +| ------------------------ | -------- | +| [React Node](react-node) | No | + +### `delayLongPress` + +Duration (in milliseconds) from `onPressIn` before `onLongPress` is called. + +| Type | Required | Default | +| ------ | -------- | ------- | +| number | No | 370 | + +### `disabled` + +Whether the press behavior is disabled. + +| Type | Required | Default | +| ------- | -------- | ------- | +| boolean | No | `false` | + +### `hitSlop` + +Sets additional distance outside of element in which a press can be detected. + +| Type | Required | +| ---------------------- | -------- | +| [Rect](rect) or number | No | + +### `onLongPress` + +Called if the time after `onPressIn` lasts longer than 370 milliseconds. This time period can be customized with [`delayLongPress`](#delaylongpress). + +| Type | Required | +| ------------------------ | -------- | +| [PressEvent](pressevent) | No | + +### `onPress` + +Called after `onPressOut`. + +| Type | Required | +| ------------------------ | -------- | +| [PressEvent](pressevent) | No | + +### `onPressIn` + +Called immediately when a touch is engaged, before `onPressOut` and `onPress`. + +| Type | Required | +| ------------------------ | -------- | +| [PressEvent](pressevent) | No | + +### `onPressOut` + +Called when a touch is released. + +| Type | Required | +| ------------------------ | -------- | +| [PressEvent](pressevent) | No | + +### `pressRetentionOffset` + +Additional distance outside of this view in which a touch is considered a press before `onPressOut` is triggered. + +| Type | Required | Default | +| ---------------------- | -------- | ---------------------------------------------- | +| [Rect](rect) or number | No | `{ bottom: 30, left: 20, right: 20, top: 20 }` | + +### `style` + +Either view styles or a function that receives a boolean reflecting whether the component is currently pressed and returns view styles. + +| Type | Required | +| --------------------------------- | -------- | +| [ViewStyleProp](view-style-props) | No | + +### `testOnly_pressed` + +Used only for documentation or testing (e.g. snapshot testing). + +| Type | Required | Default | +| ------- | -------- | ------- | +| boolean | No | `false` | + +## Type Definitions + +### RippleConfig + +Ripple effect configuration for the `android_ripple` property. + +| Type | +| ------ | +| object | + +**Properties:** + +| Name | Type | Required | Description | +| ---------- | --------------- | -------- | --------------------------------------------------- | +| color | [color](colors) | No | Defines the color of the ripple effect. | +| borderless | boolean | No | Defines if ripple effect should not include border. | +| radius | number | No | Defines the radius of the ripple effect. | diff --git a/website/versioned_docs/version-0.63/pressevent.md b/website/versioned_docs/version-0.63/pressevent.md new file mode 100644 index 00000000000..140d6c2e09b --- /dev/null +++ b/website/versioned_docs/version-0.63/pressevent.md @@ -0,0 +1,119 @@ +--- +id: version-0.63-pressevent +title: PressEvent Object Type +original_id: pressevent +--- + +`PressEvent` object is returned in the callback as a result of user press interaction, for example `onPress` in [Button](button) component. + +## Example + +```js +{ + changedTouches: [PressEvent], + identifier: 1, + locationX: 8, + locationY: 4.5, + pageX: 24, + pageY: 49.5, + target: 1127, + timestamp: 85131876.58868201, + touches: [] +} +``` + +## Keys and values + +### `changedTouches` + +Array of all PressEvents that have changed since the last event. + +| Type | Optional | +| -------------------- | -------- | +| array of PressEvents | No | + +### `force`
iOS
+ +Amount of force used during the 3D Touch press. Returns the float value in range from `0.0` to `1.0`. + +| Type | Optional | +| ------ | -------- | +| number | Yes | + +### `identifier` + +Unique numeric identifier assigned to the event. + +| Type | Optional | +| ------ | -------- | +| number | No | + +### `locationX` + +Touch origin X coordinate inside touchable area (relative to the element). + +| Type | Optional | +| ------ | -------- | +| number | No | + +### `locationY` + +Touch origin Y coordinate inside touchable area (relative to the element). + +| Type | Optional | +| ------ | -------- | +| number | No | + +### `pageX` + +Touch origin X coordinate on the screen (relative to the root view). + +| Type | Optional | +| ------ | -------- | +| number | No | + +### `pageY` + +Touch origin Y coordinate on the screen (relative to the root view). + +| Type | Optional | +| ------ | -------- | +| number | No | + +### `target` + +The node id of the element receiving the PressEvent. + +| Type | Optional | +| --------------------------- | -------- | +| number, `null`, `undefined` | No | + +### `timestamp` + +Timestamp value when a PressEvent occured. Value is represented in miliseconds. + +| Type | Optional | +| ------ | -------- | +| number | No | + +### `touches` + +Array of all current PressEvents on the screen. + +| Type | Optional | +| -------------------- | -------- | +| array of PressEvents | No | + +## Used by + +- [`Button`](button) +- [`PanResponder`](panresponder) +- [`Pressable`](pressable) +- [`ScrollView`](scrollview) +- [`Text`](text) +- [`TextInput`](textinput) +- [`TouchableHighlight`](touchablenativefeedback) +- [`TouchableOpacity`](touchablewithoutfeedback) +- [`TouchableNativeFeedback`](touchablenativefeedback) +- [`TouchableWithoutFeedback`](touchablewithoutfeedback) +- [`View`](view) diff --git a/website/versioned_docs/version-0.63/progressbarandroid.md b/website/versioned_docs/version-0.63/progressbarandroid.md new file mode 100644 index 00000000000..334e5edff5e --- /dev/null +++ b/website/versioned_docs/version-0.63/progressbarandroid.md @@ -0,0 +1,130 @@ +--- +id: version-0.63-progressbarandroid +title: 🚧 ProgressBarAndroid +original_id: progressbarandroid +--- + +> **Deprecated.** Use [@react-native-community/progress-bar-android](https://github.com/react-native-community/progress-bar-android) instead. + +Android-only React component used to indicate that the app is loading or there is some activity in the app. + +### Example + +```SnackPlayer name=ProgressBarAndroid&supportedPlatforms=android +import React from 'react'; +import {View, StyleSheet, ProgressBarAndroid, Text} from 'react-native'; + +const App = () => { + return ( + + + Circle Progress Indicator + + + + Horizontal Progress Indicator + + + + Colored Progress Indicator + + + + Fixed Progress Value + + + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + }, + example: { + marginVertical: 24, + }, +}); + +export default App; +``` + +--- + +# Reference + +## Props + +Inherits [View Props](view.md#props). + +### `animating` + +Whether to show the ProgressBar (true, the default) or hide it (false). + +| Type | Required | +| ---- | -------- | +| bool | No | + +--- + +### `color` + +Color of the progress bar. + +| Type | Required | +| ------------------ | -------- | +| [color](colors.md) | No | + +--- + +### `indeterminate` + +If the progress bar will show indeterminate progress. Note that this can only be false if styleAttr is Horizontal, and requires a `progress` value. + +| Type | Required | +| ----------------- | -------- | +| indeterminateType | No | + +--- + +### `progress` + +The progress value (between 0 and 1). + +| Type | Required | +| ------ | -------- | +| number | No | + +--- + +### `styleAttr` + +Style of the ProgressBar. One of: + +- Horizontal +- Normal (default) +- Small +- Large +- Inverse +- SmallInverse +- LargeInverse + +| Type | Required | +| ----------------------------------------------------------------------------------------- | -------- | +| enum('Horizontal', 'Normal', 'Small', 'Large', 'Inverse', 'SmallInverse', 'LargeInverse') | No | + +--- + +### `testID` + +Used to locate this view in end-to-end tests. + +| Type | Required | +| ------ | -------- | +| string | No | diff --git a/website/versioned_docs/version-0.63/progressviewios.md b/website/versioned_docs/version-0.63/progressviewios.md new file mode 100644 index 00000000000..23766e050b5 --- /dev/null +++ b/website/versioned_docs/version-0.63/progressviewios.md @@ -0,0 +1,125 @@ +--- +id: version-0.63-progressviewios +title: 🚧 ProgressViewIOS +original_id: progressviewios +--- + +> **Deprecated.** Use [@react-native-community/progress-view](https://github.com/react-native-community/progress-view) instead. + +Uses `ProgressViewIOS` to render a UIProgressView on iOS. + +### Example + +```SnackPlayer name=ProgressViewIOS&supportedPlatforms=ios +import React from 'react'; +import {View, StyleSheet, ProgressViewIOS, Text} from 'react-native'; + +const App = () => { + return ( + + + Progress Bar - 0% + + + + Colored Progress Bar - 50% + + + + Progress Bar - 100% + + + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + }, + example: { + marginVertical: 20, + }, + progress: { + width: 200, + }, +}); + +export default App; +``` + +--- + +# Reference + +## Props + +Inherits [View Props](view.md#props). + +### `progress` + +The progress value (between 0 and 1). + +| Type | Required | +| ------ | -------- | +| number | No | + +--- + +### `progressImage` + +A stretchable image to display as the progress bar. + +| Type | Required | +| ---------------------- | -------- | +| Image.propTypes.source | No | + +--- + +### `progressTintColor` + +The tint color of the progress bar itself. + +| Type | Required | +| ------ | -------- | +| string | No | + +--- + +### `progressViewStyle` + +The progress bar style. + +| Type | Required | +| ---------------------- | -------- | +| enum('default', 'bar') | No | + +--- + +### `trackImage` + +A stretchable image to display behind the progress bar. + +| Type | Required | +| ---------------------- | -------- | +| Image.propTypes.source | No | + +--- + +### `trackTintColor` + +The tint color of the progress bar track. + +| Type | Required | +| ------ | -------- | +| string | No | diff --git a/website/versioned_docs/version-0.63/props.md b/website/versioned_docs/version-0.63/props.md new file mode 100644 index 00000000000..85b2f068bd5 --- /dev/null +++ b/website/versioned_docs/version-0.63/props.md @@ -0,0 +1,58 @@ +--- +id: version-0.63-props +title: Props +original_id: props +--- + +Most components can be customized when they are created, with different parameters. These created parameters are called `props`, short for properties. + +For example, one basic React Native component is the `Image`. When you create an image, you can use a prop named `source` to control what image it shows. + +```SnackPlayer name=Props +import React from 'react'; +import { Image } from 'react-native'; + +const Bananas = () => { + let pic = { + uri: 'https://upload.wikimedia.org/wikipedia/commons/d/de/Bananavarieties.jpg' + }; + return ( + + ); +} + +export default Bananas; +``` + +Notice the braces surrounding `{pic}` - these embed the variable `pic` into JSX. You can put any JavaScript expression inside braces in JSX. + +Your own components can also use `props`. This lets you make a single component that is used in many different places in your app, with slightly different properties in each place by referring to `props` in your `render` function. Here's an example: + +```SnackPlayer name=Props +import React from 'react'; +import { Text, View } from 'react-native'; + +const Greeting = (props) => { + return ( + + Hello {props.name}! + + ); +} + +export default LotsOfGreetings = () => { + return ( + + + + + + ); +} +``` + +Using `name` as a prop lets us customize the `Greeting` component, so we can reuse that component for each of our greetings. This example also uses the `Greeting` component in JSX, similar to the [Core Components](intro-react-native-components). The power to do this is what makes React so cool - if you find yourself wishing that you had a different set of UI primitives to work with, you can invent new ones. + +The other new thing going on here is the [`View`](view.md) component. A [`View`](view.md) is useful as a container for other components, to help control style and layout. + +With `props` and the basic [`Text`](text.md), [`Image`](image.md), and [`View`](view.md) components, you can build a wide variety of static screens. To learn how to make your app change over time, you need to [learn about State](state.md). diff --git a/website/versioned_docs/version-0.63/react-node.md b/website/versioned_docs/version-0.63/react-node.md new file mode 100644 index 00000000000..b3a58c88a7b --- /dev/null +++ b/website/versioned_docs/version-0.63/react-node.md @@ -0,0 +1,14 @@ +--- +id: version-0.63-react-node +title: React Node Object Type +original_id: react-node +--- + +A React Node is one of the following types: + +- Boolean (which is ignored) +- `null` or `undefined` (which is ignored) +- Number +- String +- A React element (result of JSX) +- An array of any of the above, possibly a nested one diff --git a/website/versioned_docs/version-0.63/rect.md b/website/versioned_docs/version-0.63/rect.md new file mode 100644 index 00000000000..89e8e467770 --- /dev/null +++ b/website/versioned_docs/version-0.63/rect.md @@ -0,0 +1,51 @@ +--- +id: version-0.63-rect +title: Rect Object Type +original_id: rect +--- + +`Rect` accepts numeric pixel values to describe how far to extend a rectangular area. These values are added to the original area's size to expand it. + +## Example + +```js +{ + bottom: 20, + left: null, + right: undefined, + top: 50 +} +``` + +## Keys and values + +### `bottom` + +| Type | Required | +| --------------------------- | -------- | +| number, `null`, `undefined` | No | + +### `left` + +| Type | Required | +| --------------------------- | -------- | +| number, `null`, `undefined` | No | + +### `right` + +| Type | Required | +| --------------------------- | -------- | +| number, `null`, `undefined` | No | + +### `top` + +| Type | Required | +| --------------------------- | -------- | +| number, `null`, `undefined` | No | + +## Used by + +- [`Image`](image) +- [`Presssable`](pressable) +- [`Text`](text) +- [`TouchableWithoutFeedback`](touchablewithoutfeedback) diff --git a/website/versioned_docs/version-0.63/refreshcontrol.md b/website/versioned_docs/version-0.63/refreshcontrol.md new file mode 100644 index 00000000000..4ea7ce10dda --- /dev/null +++ b/website/versioned_docs/version-0.63/refreshcontrol.md @@ -0,0 +1,173 @@ +--- +id: version-0.63-refreshcontrol +title: RefreshControl +original_id: refreshcontrol +--- + +This component is used inside a ScrollView or ListView to add pull to refresh functionality. When the ScrollView is at `scrollY: 0`, swiping down triggers an `onRefresh` event. + +## Example + +```SnackPlayer name=RefreshControl&supportedPlatforms=ios,android +import React from 'react'; +import { + ScrollView, + RefreshControl, + StyleSheet, + Text, + SafeAreaView, +} from 'react-native'; +import Constants from 'expo-constants'; + +const wait = (timeout) => { + return new Promise(resolve => { + setTimeout(resolve, timeout); + }); +} + +const App = () => { + const [refreshing, setRefreshing] = React.useState(false); + + const onRefresh = React.useCallback(() => { + setRefreshing(true); + + wait(2000).then(() => setRefreshing(false)); + }, []); + + return ( + + + } + > + Pull down to see RefreshControl indicator + + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + marginTop: Constants.statusBarHeight, + }, + scrollView: { + flex: 1, + backgroundColor: 'pink', + alignItems: 'center', + justifyContent: 'center', + }, +}); + +export default App; +``` + +**Note:** `refreshing` is a controlled prop, this is why it needs to be set to true in the `onRefresh` function otherwise the refresh indicator will stop immediately. + +--- + +# Reference + +## Props + +Inherits [View Props](view.md#props). + +### `refreshing` + +Whether the view should be indicating an active refresh. + +| Type | Required | +| ---- | -------- | +| bool | Yes | + +--- + +### `onRefresh` + +Called when the view starts refreshing. + +| Type | Required | +| -------- | -------- | +| function | No | + +--- + +### `colors` + +The colors (at least one) that will be used to draw the refresh indicator. + +| Type | Required | Platform | +| --------------------------- | -------- | -------- | +| array of [color](colors.md) | No | Android | + +--- + +### `enabled` + +Whether the pull to refresh functionality is enabled. + +| Type | Required | Platform | +| ---- | -------- | -------- | +| bool | No | Android | + +--- + +### `progressBackgroundColor` + +The background color of the refresh indicator. + +| Type | Required | Platform | +| ------------------ | -------- | -------- | +| [color](colors.md) | No | Android | + +--- + +### `progressViewOffset` + +Progress view top offset + +| Type | Required | Platform | +| ------ | -------- | -------- | +| number | No | Android | + +--- + +### `size` + +Size of the refresh indicator, see RefreshControl.SIZE. + +| Type | Required | Platform | +| ---------------------------------------------------------------------- | -------- | -------- | +| enum(RefreshLayoutConsts.SIZE.DEFAULT, RefreshLayoutConsts.SIZE.LARGE) | No | Android | + +--- + +### `tintColor` + +The color of the refresh indicator. + +| Type | Required | Platform | +| ------------------ | -------- | -------- | +| [color](colors.md) | No | iOS | + +--- + +### `title` + +The title displayed under the refresh indicator. + +| Type | Required | Platform | +| ------ | -------- | -------- | +| string | No | iOS | + +--- + +### `titleColor` + +Title color. + +| Type | Required | Platform | +| ------------------ | -------- | -------- | +| [color](colors.md) | No | iOS | diff --git a/website/versioned_docs/version-0.63/running-on-simulator-ios.md b/website/versioned_docs/version-0.63/running-on-simulator-ios.md new file mode 100644 index 00000000000..63d71892e2c --- /dev/null +++ b/website/versioned_docs/version-0.63/running-on-simulator-ios.md @@ -0,0 +1,15 @@ +--- +id: version-0.63-running-on-simulator-ios +title: Running On Simulator +original_id: running-on-simulator-ios +--- + +## Starting the simulator + +Once you have your React Native project initialized, you can run `npx react-native run-ios` inside the newly created project directory. If everything is set up correctly, you should see your new app running in the iOS Simulator shortly. + +## Specifying a device + +You can specify the device the simulator should run with the `--simulator` flag, followed by the device name as a string. The default is `"iPhone 11"`. If you wish to run your app on an iPhone SE, run `npx react-native run-ios --simulator="iPhone SE"`. + +The device names correspond to the list of devices available in Xcode. You can check your available devices by running `xcrun simctl list devices` from the console. diff --git a/website/versioned_docs/version-0.63/safeareaview.md b/website/versioned_docs/version-0.63/safeareaview.md new file mode 100644 index 00000000000..122e1d8f254 --- /dev/null +++ b/website/versioned_docs/version-0.63/safeareaview.md @@ -0,0 +1,50 @@ +--- +id: version-0.63-safeareaview +title: SafeAreaView +original_id: safeareaview +--- + +The purpose of `SafeAreaView` is to render content within the safe area boundaries of a device. It is currently only applicable to iOS devices with iOS version 11 or later. + +`SafeAreaView` renders nested content and automatically applies padding to reflect the portion of the view that is not covered by navigation bars, tab bars, toolbars, and other ancestor views. Moreover, and most importantly, Safe Area's paddings reflect the physical limitation of the screen, such as rounded corners or camera notches (i.e. the sensor housing area on iPhone X). + +## Example + +To use, wrap your top level view with a `SafeAreaView` with a `flex: 1` style applied to it. You may also want to use a background color that matches your application's design. + +```SnackPlayer name=SafeAreaView +import React from 'react'; +import { StyleSheet, Text, SafeAreaView } from 'react-native'; + +const App = () => { + return ( + + Page content + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + }, +}); + +export default App; +``` + +--- + +# Reference + +## Props + +Inherits [View Props](view.md#props). + +As padding is used to implement the behavior of the component, padding rules in styles applied to a `SafeAreaView` will be ignored and can cause different results depending on the platform. See [#22211](https://github.com/facebook/react-native/issues/22211) for details. + +### `emulateUnlessSupported` + +| Type | Required | Default | +| ---- | -------- | ------- | +| bool | No | true | diff --git a/website/versioned_docs/version-0.63/scrollview.md b/website/versioned_docs/version-0.63/scrollview.md new file mode 100644 index 00000000000..1aba9b5aae9 --- /dev/null +++ b/website/versioned_docs/version-0.63/scrollview.md @@ -0,0 +1,757 @@ +--- +id: version-0.63-scrollview +title: ScrollView +original_id: scrollview +--- + +Component that wraps platform ScrollView while providing integration with touch locking "responder" system. + +Keep in mind that ScrollViews must have a bounded height in order to work, since they contain unbounded-height children into a bounded container (via a scroll interaction). In order to bound the height of a ScrollView, either set the height of the view directly (discouraged) or make sure all parent views have bounded height. Forgetting to transfer `{flex: 1}` down the view stack can lead to errors here, which the element inspector makes quick to debug. + +Doesn't yet support other contained responders from blocking this scroll view from becoming the responder. + +`` vs [``](flatlist.md) - which one to use? + +`ScrollView` renders all its react child components at once, but this has a performance downside. + +Imagine you have a very long list of items you want to display, maybe several screens worth of content. Creating JS components and native views for everything all at once, much of which may not even be shown, will contribute to slow rendering and increased memory usage. + +This is where `FlatList` comes into play. `FlatList` renders items lazily, when they are about to appear, and removes items that scroll way off screen to save memory and processing time. + +`FlatList` is also handy if you want to render separators between your items, multiple columns, infinite scroll loading, or any number of other features it supports out of the box. + +## Example + +```SnackPlayer name=ScrollView +import React from 'react'; +import { StyleSheet, Text, SafeAreaView, ScrollView } from 'react-native'; +import Constants from 'expo-constants'; + +const App = () => { + return ( + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do + eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad + minim veniam, quis nostrud exercitation ullamco laboris nisi ut + aliquip ex ea commodo consequat. Duis aute irure dolor in + reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla + pariatur. Excepteur sint occaecat cupidatat non proident, sunt in + culpa qui officia deserunt mollit anim id est laborum. + + + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + marginTop: Constants.statusBarHeight, + }, + scrollView: { + backgroundColor: 'pink', + marginHorizontal: 20, + }, + text: { + fontSize: 42, + }, +}); + +export default App; +``` + +--- + +# Reference + +## Props + +Inherits [View Props](view.md#props). + +### `alwaysBounceHorizontal` + +When true, the scroll view bounces horizontally when it reaches the end even if the content is smaller than the scroll view itself. The default value is true when `horizontal={true}` and false otherwise. + +| Type | Required | Platform | +| ---- | -------- | -------- | +| bool | No | iOS | + +--- + +### `alwaysBounceVertical` + +When true, the scroll view bounces vertically when it reaches the end even if the content is smaller than the scroll view itself. The default value is false when `horizontal={true}` and true otherwise. + +| Type | Required | Platform | +| ---- | -------- | -------- | +| bool | No | iOS | + +--- + +### `automaticallyAdjustContentInsets` + +Controls whether iOS should automatically adjust the content inset for scroll views that are placed behind a navigation bar or tab bar/ toolbar. The default value is true. + +| Type | Required | Platform | +| ---- | -------- | -------- | +| bool | No | iOS | + +--- + +### `bounces` + +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 the scroll direction. When false, it disables all bouncing even if the `alwaysBounce*` props are true. The default value is true. + +| Type | Required | Platform | +| ---- | -------- | -------- | +| bool | No | iOS | + +--- + +### `bouncesZoom` + +When true, gestures can drive zoom past min/max and the zoom will animate to the min/max value at gesture end, otherwise the zoom will not exceed the limits. + +| Type | Required | Platform | +| ---- | -------- | -------- | +| bool | No | iOS | + +--- + +### `canCancelContentTouches` + +When false, once tracking starts, won't try to drag if the touch moves. The default value is true. + +| Type | Required | Platform | +| ---- | -------- | -------- | +| bool | No | iOS | + +--- + +### `centerContent` + +When true, the scroll view automatically centers the content when the content is smaller than the scroll view bounds; when the content is larger than the scroll view, this property has no effect. The default value is false. + +| Type | Required | Platform | +| ---- | -------- | -------- | +| bool | No | iOS | + +--- + +### `contentContainerStyle` + +These styles will be applied to the scroll view content container which wraps all of the child views. Example: + +``` +return ( + + +); +... +const styles = StyleSheet.create({ + contentContainer: { + paddingVertical: 20 + } +}); +``` + +| Type | Required | +| ------------------------------------ | -------- | +| StyleSheetPropType(View Style props) | No | + +--- + +### `contentInset` + +The amount by which the scroll view content is inset from the edges of the scroll view. Defaults to `{top: 0, left: 0, bottom: 0, right: 0}`. + +| Type | Required | Platform | +| ------------------------------------------------------------------ | -------- | -------- | +| object: {top: number, left: number, bottom: number, right: number} | No | iOS | + +--- + +### `contentInsetAdjustmentBehavior` + +This property specifies how the safe area insets are used to modify the content area of the scroll view. The default value of this property is "never". Available on iOS 11 and later. + +| Type | Required | Platform | +| ------------------------------------------------------ | -------- | -------- | +| enum('automatic', 'scrollableAxes', 'never', 'always') | No | iOS | + +--- + +### `contentOffset` + +Used to manually set the starting scroll offset. The default value is `{x: 0, y: 0}`. + +| Type | Required | Platform | +| ------------- | -------- | -------- | +| PointPropType | No | iOS | + +--- + +### `decelerationRate` + +A floating-point number that determines how quickly the scroll view decelerates after the user lifts their finger. You may also use string shortcuts `"normal"` and `"fast"` which match the underlying iOS settings for `UIScrollViewDecelerationRateNormal` and `UIScrollViewDecelerationRateFast` respectively. + +- `'normal'` (the default), 0.998 on iOS, 0.985 on Android. +- `'fast'`, 0.99 on iOS, 0.9 on Android. + +| Type | Required | +| ------------------------------- | -------- | +| enum('fast', 'normal'), ,number | No | + +--- + +### `directionalLockEnabled` + +When true, the ScrollView will try to lock to only vertical or horizontal scrolling while dragging. The default value is false. + +| Type | Required | Platform | +| ---- | -------- | -------- | +| bool | No | iOS | + +--- + +### `disableIntervalMomentum` + +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 used for horizontal pagination when the page is less than the width of the ScrollView. The default value is false. + +| Type | Required | +| ---- | -------- | +| bool | No | + +--- + +### `disableScrollViewPanResponder` + +When true, the default JS pan responder on the ScrollView is disabled, and full control over touches inside the ScrollView is left to its child components. This is particularly useful if `snapToInterval` is enabled, since it does not follow typical touch patterns. Do not use this on regular ScrollView use cases without `snapToInterval` as it may cause unexpected touches to occur while scrolling. The default value is false. + +| Type | Required | +| ---- | -------- | +| bool | No | + +--- + +### `endFillColor` + +Sometimes a scrollview takes up more space than its content fills. When this is the case, this prop will fill the rest of the scrollview with a color to avoid setting a background and creating unnecessary overdraw. This is an advanced optimization that is not needed in the general case. + +| Type | Required | Platform | +| ------------------ | -------- | -------- | +| [color](colors.md) | No | Android | + +--- + +### `fadingEdgeLength` + +Fades out the edges of the the scroll content. + +If the value is greater than 0, the fading edges will be set accordingly to the current scroll direction and position, indicating if there is more content to show. + +| Type | Required | Default | Platform | +| ------ | -------- | ------- | -------- | +| number | No | 0 | Android | + +--- + +### `horizontal` + +When true, the scroll view's children are arranged horizontally in a row instead of vertically in a column. The default value is false. + +| Type | Required | +| ---- | -------- | +| bool | No | + +--- + +### `indicatorStyle` + +The style of the scroll indicators. + +- `'default'` (the default), same as `black`. +- `'black'`, scroll indicator is `black`. This style is good against a light background. +- `'white'`, scroll indicator is `white`. This style is good against a dark background. + +| Type | Required | Platform | +| --------------------------------- | -------- | -------- | +| enum('default', 'black', 'white') | No | iOS | + +--- + +### `invertStickyHeaders` + +If sticky headers should stick at the bottom instead of the top of the ScrollView. This is usually used with inverted ScrollViews. + +| Type | Required | +| ---- | -------- | +| bool | No | + +--- + +### `keyboardDismissMode` + +Determines whether the keyboard gets dismissed in response to a drag. + +_Cross platform_ + +- `'none'` (the default), drags do not dismiss the keyboard. +- `'on-drag'`, the keyboard is dismissed when a drag begins. + +_iOS Only_ + +- `'interactive'`, the keyboard is dismissed interactively with the drag and moves in synchrony with the touch; dragging upwards cancels the dismissal. On android this is not supported and it will have the same behavior as 'none'. + +| Type | Required | +| -------------------------------------- | -------- | +| enum('none', 'on-drag', 'interactive') | No | + +--- + +### `keyboardShouldPersistTaps` + +Determines when the keyboard should stay visible after a tap. + +- `'never'` (the default), tapping outside of the focused text input when the keyboard is up dismisses the keyboard. When this happens, children won't receive the tap. +- `'always'`, the keyboard will not dismiss automatically, and the scroll view will not catch taps, but children of the scroll view can catch taps. +- `'handled'`, the keyboard will not dismiss automatically when the tap was handled by children of the scroll view (or captured by an ancestor). +- `false`, **_deprecated_**, use 'never' instead +- `true`, **_deprecated_**, use 'always' instead + +| Type | Required | +| ----------------------------------------------- | -------- | +| enum('always', 'never', 'handled', false, true) | No | + +--- + +### `maintainVisibleContentPosition` + +When set, the scroll view will adjust the scroll position so that the first child that is currently visible and at or beyond `minIndexForVisible` will not change position. This is useful for lists that are loading content in both directions, e.g. a chat thread, where new messages coming in might otherwise cause the scroll position to jump. A value of 0 is common, but other values such as 1 can be used to skip loading spinners or other content that should not maintain position. + +The optional `autoscrollToTopThreshold` can be used to make the content automatically scroll to the top after making the adjustment if the user was within the threshold of the top before the adjustment was made. This is also useful for chat-like applications where you want to see new messages scroll into place, but not if the user has scrolled up a ways and it would be disruptive to scroll a bunch. + +Caveat 1: Reordering elements in the scrollview with this enabled will probably cause jumpiness and jank. It can be fixed, but there are currently no plans to do so. For now, don't re-order the content of any ScrollViews or Lists that use this feature. + +Caveat 2: This uses `contentOffset` and `frame.origin` in native code to compute visibility. Occlusion, transforms, and other complexity won't be taken into account as to whether content is "visible" or not. + +| Type | Required | Platform | +| ------------------------------------------------------------------------ | -------- | -------- | +| object: { minIndexForVisible: number, autoscrollToTopThreshold: number } | No | iOS | + +--- + +### `maximumZoomScale` + +The maximum allowed zoom scale. The default value is 1.0. + +| Type | Required | Platform | +| ------ | -------- | -------- | +| number | No | iOS | + +--- + +### `minimumZoomScale` + +The minimum allowed zoom scale. The default value is 1.0. + +| Type | Required | Platform | +| ------ | -------- | -------- | +| number | No | iOS | + +--- + +### `nestedScrollEnabled` + +Enables nested scrolling for Android API level 21+. Nested scrolling is supported by default on iOS. + +| Type | Required | Platform | +| ---- | -------- | -------- | +| bool | No | Android | + +### `onContentSizeChange` + +Called when scrollable content view of the ScrollView changes. + +Handler function is passed the content width and content height as parameters: `(contentWidth, contentHeight)` + +It's implemented using onLayout handler attached to the content container which this ScrollView renders. + +| Type | Required | +| -------- | -------- | +| function | No | + +--- + +### `onMomentumScrollBegin` + +Called when the momentum scroll starts (scroll which occurs as the ScrollView starts gliding). + +| Type | Required | +| -------- | -------- | +| function | No | + +--- + +### `onMomentumScrollEnd` + +Called when the momentum scroll ends (scroll which occurs as the ScrollView glides to a stop). + +| Type | Required | +| -------- | -------- | +| function | No | + +--- + +### `onScroll` + +Fires at most once per frame during scrolling. The frequency of the events can be controlled using the `scrollEventThrottle` prop. The event has the following shape (all values are numbers): + +```js +{ + nativeEvent: { + contentInset: {bottom, left, right, top}, + contentOffset: {x, y}, + contentSize: {height, width}, + layoutMeasurement: {height, width}, + zoomScale + } +} +``` + +| Type | Required | +| -------- | -------- | +| function | No | + +--- + +### `onScrollBeginDrag` + +Called when the user begins to drag the scroll view. + +| Type | Required | +| -------- | -------- | +| function | No | + +--- + +### `onScrollEndDrag` + +Called when the user stops dragging the scroll view and it either stops or begins to glide. + +| Type | Required | +| -------- | -------- | +| function | No | + +--- + +### `onScrollToTop` + +Fires when the scroll view scrolls to top after the status bar has been tapped. + +| Type | Required | Platform | +| -------- | -------- | -------- | +| function | No | iOS | + +--- + +### `overScrollMode` + +Used to override default value of overScroll mode. + +Possible values: + +- `'auto'` - Default value, allow a user to over-scroll this view only if the content is large enough to meaningfully scroll. +- `'always'` - Always allow a user to over-scroll this view. +- `'never'` - Never allow a user to over-scroll this view. + +| Type | Required | Platform | +| ------------------------------- | -------- | -------- | +| enum('auto', 'always', 'never') | No | Android | + +--- + +### `pagingEnabled` + +When true, the scroll view stops on multiples of the scroll view's size when scrolling. This can be used for horizontal pagination. The default value is false. + +Note: Vertical pagination is not supported on Android. + +| Type | Required | +| ---- | -------- | +| bool | No | + +--- + +### `persistentScrollbar` + +Causes the scrollbars not to turn transparent when they are not in use. The default value is false. + +| Type | Required | Platform | +| ---- | -------- | -------- | +| bool | No | Android | + +--- + +### `pinchGestureEnabled` + +When true, ScrollView allows use of pinch gestures to zoom in and out. The default value is true. + +| Type | Required | Platform | +| ---- | -------- | -------- | +| bool | No | iOS | + +--- + +### `refreshControl` + +A RefreshControl component, used to provide pull-to-refresh functionality for the ScrollView. Only works for vertical ScrollViews (`horizontal` prop must be `false`). + +See [RefreshControl](refreshcontrol.md). + +| Type | Required | +| ------- | -------- | +| element | No | + +--- + +### `removeClippedSubviews` + +Experimental: When true, offscreen child views (whose `overflow` value is `hidden`) are removed from their native backing superview when offscreen. This can improve scrolling performance on long lists. + +| Type | Required | +| ---- | -------- | +| bool | No | + +--- + +### `scrollBarThumbImage` + +Optionally an image can be used for the scroll bar thumb. This will override the color. While the image is loading or the image fails to load the color will be used instead. Use an alpha of 0 in the color to avoid seeing it while the image is loading. + +- `uri`, a string representing the resource identifier for the image, which should be either a local file path or the name of a static image resource. +- `number`, opaque type returned by something like `import IMAGE from './image.jpg'`. + +| Type | Required | Platform | +| ------ | -------- | -------- | +| number | No | VR | + +--- + +### `scrollEnabled` + +When false, the view cannot be scrolled via touch interaction. The default value is true. + +Note that the view can always be scrolled by calling `scrollTo`. + +| Type | Required | +| ---- | -------- | +| bool | No | + +--- + +### `scrollEventThrottle` + +This controls how often the scroll event will be fired while scrolling (as a time interval in ms). A lower number yields better accuracy for code that is tracking the scroll position, but can lead to scroll performance problems due to the volume of information being sent over the bridge. You will not notice a difference between values set between 1-16 as the JS run loop is synced to the screen refresh rate. If you do not need precise scroll position tracking, set this value higher to limit the information being sent across the bridge. The default value is zero, which results in the scroll event being sent only once each time the view is scrolled. + +| Type | Required | Platform | +| ------ | -------- | -------- | +| number | No | iOS | + +--- + +### `scrollIndicatorInsets` + +The amount by which the scroll view indicators are inset from the edges of the scroll view. This should normally be set to the same value as the `contentInset`. Defaults to `{0, 0, 0, 0}`. + +| Type | Required | Platform | +| ------------------------------------------------------------------ | -------- | -------- | +| object: {top: number, left: number, bottom: number, right: number} | No | iOS | + +--- + +### `scrollPerfTag` + +Tag used to log scroll performance on this scroll view. Will force momentum events to be turned on (see sendMomentumEvents). This doesn't do anything out of the box and you need to implement a custom native FpsListener for it to be useful. + +| Type | Required | Platform | +| ------ | -------- | -------- | +| string | No | Android | + +--- + +### `scrollToOverflowEnabled` + +When true, the scroll view can be programmatically scrolled beyond its content size. The default value is false. + +| Type | Required | Platform | +| ---- | -------- | -------- | +| bool | No | iOS | + +--- + +### `scrollsToTop` + +When true, the scroll view scrolls to top when the status bar is tapped. The default value is true. + +| Type | Required | Platform | +| ---- | -------- | -------- | +| bool | No | iOS | + +--- + +### `DEPRECATED_sendUpdatedChildFrames` + +When true, ScrollView will emit updateChildFrames data in scroll events, otherwise will not compute or emit child frame data. This only exists to support legacy issues, `onLayout` should be used instead to retrieve frame data. The default value is false. + +| Type | Required | Platform | +| ---- | -------- | -------- | +| bool | No | iOS | + +--- + +### `showsHorizontalScrollIndicator` + +When true, shows a horizontal scroll indicator. The default value is true. + +| Type | Required | +| ---- | -------- | +| bool | No | + +--- + +### `showsVerticalScrollIndicator` + +When true, shows a vertical scroll indicator. The default value is true. + +| Type | Required | +| ---- | -------- | +| bool | No | + +--- + +### `snapToAlignment` + +When `snapToInterval` is set, `snapToAlignment` will define the relationship of the snapping to the scroll view. + +- `'start'` (the default) will align the snap at the left (horizontal) or top (vertical). +- `'center'` will align the snap in the center. +- `'end'` will align the snap at the right (horizontal) or bottom (vertical). + +| Type | Required | Platform | +| ------------------------------ | -------- | -------- | +| enum('start', 'center', 'end') | No | iOS | + +--- + +### `snapToEnd` + +Use in conjunction with `snapToOffsets`. By default, the end of the list counts as a snap offset. Set `snapToEnd` to false to disable this behavior and allow the list to scroll freely between its end and the last `snapToOffsets` offset. The default value is true. + +| Type | Required | +| ------- | -------- | +| boolean | No | + +--- + +### `snapToInterval` + +When set, causes the scroll view to stop at multiples of the value of `snapToInterval`. This can be used for paginating through children that have lengths smaller than the scroll view. Typically used in combination with `snapToAlignment` and `decelerationRate="fast"`. Overrides less configurable `pagingEnabled` prop. + +| Type | Required | +| ------ | -------- | +| number | No | + +--- + +### `snapToOffsets` + +When set, causes the scroll view to stop at the defined offsets. This can be used for paginating through variously sized children that have lengths smaller than the scroll view. Typically used in combination with `decelerationRate="fast"`. Overrides less configurable `pagingEnabled` and `snapToInterval` props. + +| Type | Required | +| --------------- | -------- | +| array of number | No | + +--- + +### `snapToStart` + +Use in conjunction with `snapToOffsets`. By default, the beginning of the list counts as a snap offset. Set `snapToStart` to false to disable this behavior and allow the list to scroll freely between its start and the first `snapToOffsets` offset. The default value is true. + +| Type | Required | +| ------- | -------- | +| boolean | No | + +--- + +### `stickyHeaderIndices` + +An array of child indices determining which children get docked to the top of the screen when scrolling. For example, passing `stickyHeaderIndices={[0]}` will cause the first child to be fixed to the top of the scroll view. This property is not supported in conjunction with `horizontal={true}`. + +| Type | Required | +| --------------- | -------- | +| array of number | No | + +--- + +### `zoomScale` + +The current scale of the scroll view content. The default value is 1.0. + +| Type | Required | Platform | +| ------ | -------- | -------- | +| number | No | iOS | + +## Methods + +### `flashScrollIndicators()` + +```jsx +flashScrollIndicators(); +``` + +Displays the scroll indicators momentarily. + +--- + +### `scrollTo()` + +```jsx +scrollTo( + options?: {x?: number, y?: number, animated?: boolean} | number, + deprecatedX?: number, + deprecatedAnimated?: boolean, +); +``` + +Scrolls to a given x, y offset, either immediately, with a smooth animation. + +Example: + +`scrollTo({x: 0, y: 0, animated: true})` + +Note: The weird function signature is due to the fact that, for historical reasons, the function also accepts separate arguments as an alternative to the options object. This is deprecated due to ambiguity (y before x), and SHOULD NOT BE USED. + +--- + +### `scrollToEnd()` + +```jsx +scrollToEnd(([options]: { animated: boolean, duration: number })); +``` + +If this is a vertical ScrollView scrolls to the bottom. If this is a horizontal ScrollView scrolls to the right. + +Use `scrollToEnd({animated: true})` for smooth animated scrolling, `scrollToEnd({animated: false})` for immediate scrolling. For Android, you may specify a duration, e.g. `scrollToEnd({duration: 500})` for a controlled duration scroll. If no options are passed, `animated` defaults to true. + +--- + +### `scrollWithoutAnimationTo()` + +```jsx +scrollWithoutAnimationTo(y, x); +``` + +Deprecated, use `scrollTo` instead. diff --git a/website/versioned_docs/version-0.63/sectionlist.md b/website/versioned_docs/version-0.63/sectionlist.md new file mode 100644 index 00000000000..2789774118b --- /dev/null +++ b/website/versioned_docs/version-0.63/sectionlist.md @@ -0,0 +1,499 @@ +--- +id: version-0.63-sectionlist +title: SectionList +original_id: sectionlist +--- + +A performant interface for rendering sectioned lists, supporting the most handy features: + +- Fully cross-platform. +- Configurable viewability callbacks. +- List header support. +- List footer support. +- Item separator support. +- Section header support. +- Section separator support. +- Heterogeneous data and item rendering support. +- Pull to Refresh. +- Scroll loading. + +If you don't need section support and want a simpler interface, use [``](flatlist.md). + +## Example + +
+
    + + +
+
+ + + +```SnackPlayer name=SectionList%20Example +import React from "react"; +import { + StyleSheet, + Text, + View, + SafeAreaView, + SectionList +} from "react-native"; +import Constants from "expo-constants"; + +const DATA = [ + { + title: "Main dishes", + data: ["Pizza", "Burger", "Risotto"] + }, + { + title: "Sides", + data: ["French Fries", "Onion Rings", "Fried Shrimps"] + }, + { + title: "Drinks", + data: ["Water", "Coke", "Beer"] + }, + { + title: "Desserts", + data: ["Cheese Cake", "Ice Cream"] + } +]; + +const Item = ({ title }) => ( + + {title} + +); + +const App = () => ( + + item + index} + renderItem={({ item }) => } + renderSectionHeader={({ section: { title } }) => ( + {title} + )} + /> + +); + +const styles = StyleSheet.create({ + container: { + flex: 1, + marginTop: Constants.statusBarHeight, + marginHorizontal: 16 + }, + item: { + backgroundColor: "#f9c2ff", + padding: 20, + marginVertical: 8 + }, + header: { + fontSize: 32, + backgroundColor: "#fff" + }, + title: { + fontSize: 24 + } +}); + +export default App; +``` + + + +```SnackPlayer name=SectionList%20Example +import React, { Component } from "react"; +import { + StyleSheet, + Text, + View, + SafeAreaView, + SectionList +} from "react-native"; +import Constants from "expo-constants"; + +const DATA = [ + { + title: "Main dishes", + data: ["Pizza", "Burger", "Risotto"] + }, + { + title: "Sides", + data: ["French Fries", "Onion Rings", "Fried Shrimps"] + }, + { + title: "Drinks", + data: ["Water", "Coke", "Beer"] + }, + { + title: "Desserts", + data: ["Cheese Cake", "Ice Cream"] + } +]; + +Item = ({ title }) => ( + + {title} + +); + +class App extends Component { + render() { + return ( + + item + index} + renderItem={({ item }) => } + renderSectionHeader={({ section: { title } }) => ( + {title} + )} + /> + + ); + } +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + marginTop: Constants.statusBarHeight, + marginHorizontal: 16 + }, + item: { + backgroundColor: "#f9c2ff", + padding: 20, + marginVertical: 8 + }, + header: { + fontSize: 32, + backgroundColor: "#fff" + }, + title: { + fontSize: 24 + } +}); + +export default App; +``` + + + +This is a convenience wrapper around [``](virtualizedlist.md), and thus inherits its props (as well as those of [``](scrollview.md) that aren't explicitly listed here, along with the following caveats: + +- Internal state is not preserved when content scrolls out of the render window. Make sure all your data is captured in the item data or external stores like Flux, Redux, or Relay. +- This is a `PureComponent` which means that it will not re-render if `props` remain shallow-equal. Make sure that everything your `renderItem` function depends on is passed as a prop (e.g. `extraData`) that is not `===` after updates, otherwise your UI may not update on changes. This includes the `data` prop and parent component state. +- In order to constrain memory and enable smooth scrolling, content is rendered asynchronously offscreen. This means it's possible to scroll faster than the fill rate and momentarily see blank content. This is a tradeoff that can be adjusted to suit the needs of each application, and we are working on improving it behind the scenes. +- By default, the list looks for a `key` prop on each item and uses that for the React key. Alternatively, you can provide a custom `keyExtractor` prop. + +--- + +# Reference + +## Props + +Inherits [ScrollView Props](scrollview.md#props). + +### `renderItem` + +Default renderer for every item in every section. Can be over-ridden on a per-section basis. Should return a React element. + +| Type | Required | +| -------- | -------- | +| function | Yes | + +The render function will be passed an object with the following keys: + +- 'item' (object) - the item object as specified in this section's `data` key +- 'index' (number) - Item's index within the section. +- 'section' (object) - The full section object as specified in `sections`. +- 'separators' (object) - An object with the following keys: + - 'highlight' (function) - `() => void` + - 'unhighlight' (function) - `() => void` + - 'updateProps' (function) - `(select, newProps) => void` + - 'select' (enum) - possible values are 'leading', 'trailing' + - 'newProps' (object) + +--- + +### `sections` + +The actual data to render, akin to the `data` prop in [`FlatList`](flatlist.md). + +| Type | Required | +| ------------------------------------------- | -------- | +| array of [Section](sectionlist.md#section)s | Yes | + +--- + +### `extraData` + +A marker property for telling the list to re-render (since it implements `PureComponent`). If any of your `renderItem`, Header, Footer, etc. functions depend on anything outside of the `data` prop, stick it here and treat it immutably. + +| Type | Required | +| ---- | -------- | +| any | No | + +--- + +### `initialNumToRender` + +How many items to render in the initial batch. This should be enough to fill the screen but not much more. Note these items will never be unmounted as part of the windowed rendering in order to improve perceived performance of scroll-to-top actions. + +| Type | Required | +| ------ | -------- | +| number | No | + +--- + +### `inverted` + +Reverses the direction of scroll. Uses scale transforms of -1. + +| Type | Required | +| --------- | -------- | +| [boolean] | No | + +--- + +### `ItemSeparatorComponent` + +Rendered in between each item, but not at the top or bottom. By default, `highlighted`, `section`, and `[leading/trailing][Item/Section]` props are provided. `renderItem` provides `separators.highlight`/`unhighlight` which will update the `highlighted` prop, but you can also add custom props with `separators.updateProps`. + +| Type | Required | +| ------------------------------ | -------- | +| [component, function, element] | No | + +--- + +### `keyExtractor` + +Used to extract a unique key for a given item at the specified index. Key is used for caching and as the React key to track item re-ordering. The default extractor checks `item.key`, then falls back to using the index, like React does. Note that this sets keys for each item, but each overall section still needs its own key. + +| Type | Required | +| ------------------------------------- | -------- | +| (item: Item, index: number) => string | Yes | + +--- + +### `ListEmptyComponent` + +Rendered when the list is empty. Can be a React Component Class, a render function, or a rendered element. + +| Type | Required | +| ------------------------------ | -------- | +| [component, function, element] | No | + +--- + +### `ListFooterComponent` + +Rendered at the very end of the list. Can be a React Component Class, a render function, or a rendered element. + +| Type | Required | +| ------------------------------ | -------- | +| [component, function, element] | No | + +--- + +### `ListHeaderComponent` + +Rendered at the very beginning of the list. Can be a React Component Class, a render function, or a rendered element. + +| Type | Required | +| ---------------------------- | -------- | +| component, function, element | No | + +--- + +### `onEndReached` + +Called once when the scroll position gets within `onEndReachedThreshold` of the rendered content. + +| Type | Required | +| ------------------------------------------- | -------- | +| [(info: {distanceFromEnd: number}) => void] | No | + +--- + +### `onEndReachedThreshold` + +How far from the end (in units of visible length of the list) the bottom edge of the list must be from the end of the content to trigger the `onEndReached` callback. Thus a value of 0.5 will trigger `onEndReached` when the end of the content is within half the visible length of the list. + +| Type | Required | +| -------- | -------- | +| [number] | No | + +--- + +### `onRefresh` + +If provided, a standard RefreshControl will be added for "Pull to Refresh" functionality. Make sure to also set the `refreshing` prop correctly. To offset the RefreshControl from the top (e.g. by 100 pts), use `progressViewOffset={100}`. + +| Type | Required | +| ------------ | -------- | +| [() => void] | No | + +--- + +### `onViewableItemsChanged` + +Called when the viewability of rows changes, as defined by the `viewabilityConfig` prop. + +| Type | Required | +| -------- | -------- | +| function | No | + +The function will be passed an object with the following keys: + +- 'viewableItems' (array of `ViewToken`s) +- 'changed' (array of `ViewToken`s) + +The `ViewToken` type is exported by `ViewabilityHelper.js`: + +| Name | Type | Required | +| ---------- | ------- | -------- | +| item | any | Yes | +| key | string | Yes | +| index | number | No | +| isViewable | boolean | Yes | +| section | any | No | + +--- + +### `refreshing` + +Set this true while waiting for new data from a refresh. + +| Type | Required | +| --------- | -------- | +| [boolean] | No | + +--- + +### `removeClippedSubviews` + +Note: may have bugs (missing content) in some circumstances - use at your own risk. + +This may improve scroll performance for large lists. + +| Type | Required | +| ------- | -------- | +| boolean | No | + +--- + +### `renderSectionFooter` + +Rendered at the bottom of each section. + +| Type | Required | +| ---------------------------------------------------- | -------- | +| [(info: {section: SectionT}) => ?React.Element] | No | + +--- + +### `renderSectionHeader` + +Rendered at the top of each section. These stick to the top of the `ScrollView` by default on iOS. See `stickySectionHeadersEnabled`. + +| Type | Required | +| ---------------------------------------------------- | -------- | +| [(info: {section: SectionT}) => ?React.Element] | No | + +--- + +### `SectionSeparatorComponent` + +Rendered at the top and bottom of each section (note this is different from `ItemSeparatorComponent` which is only rendered between items). These are intended to separate sections from the headers above and below and typically have the same highlight response as `ItemSeparatorComponent`. Also receives `highlighted`, `[leading/trailing][Item/Section]`, and any custom props from `separators.updateProps`. + +| Type | Required | +| ----------------- | -------- | +| [ReactClass] | No | + +--- + +### `stickySectionHeadersEnabled` + +Makes section headers stick to the top of the screen until the next one pushes it off. Only enabled by default on iOS because that is the platform standard there. + +| Type | Required | +| ------- | -------- | +| boolean | No | + +## Methods + +### `scrollToLocation()` + +```jsx +scrollToLocation(params); +``` + +Scrolls to the item at the specified `sectionIndex` and `itemIndex` (within the section) positioned in the viewable area such that `viewPosition` 0 places it at the top (and may be covered by a sticky header), 1 at the bottom, and 0.5 centered in the middle. + +> Note: Cannot scroll to locations outside the render window without specifying the `getItemLayout` or `onScrollToIndexFailed` prop. + +**Parameters:** + +| Name | Type | Required | Description | +| ------ | ------ | -------- | ----------- | +| params | object | Yes | See below. | + +Valid `params` keys are: + +- 'animated' (boolean) - Whether the list should do an animation while scrolling. Defaults to `true`. +- 'itemIndex' (number) - Index within section for the item to scroll to. Required. +- 'sectionIndex' (number) - Index for section that contains the item to scroll to. Required. +- 'viewOffset' (number) - A fixed number of pixels to offset the final target position, e.g. to compensate for sticky headers. +- 'viewPosition' (number) - A value of `0` places the item specified by index at the top, `1` at the bottom, and `0.5` centered in the middle. + +--- + +### `recordInteraction()` + +```jsx +recordInteraction(); +``` + +Tells the list an interaction has occurred, which should trigger viewability calculations, e.g. if `waitForInteractions` is true and the user has not scrolled. This is typically called by taps on items or by navigation actions. + +--- + +### `flashScrollIndicators()` + +```jsx +flashScrollIndicators(); +``` + +Displays the scroll indicators momentarily. + +| Platform | +| -------- | +| iOS | + +## Type Definitions + +### Section + +An object that identifies the data to be rendered for a given section. + +| Type | +| ---- | +| any | + +**Properties:** + +| Name | Type | Description | +| ------------------------ | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| data | array | The data for rendering items in this section. Array of objects, much like [`FlatList`'s data prop](flatlist.md#data). | +| [key] | string | Optional key to keep track of section re-ordering. If you don't plan on re-ordering sections, the array index will be used by default. | +| [renderItem] | function | Optionally define an arbitrary item renderer for this section, overriding the default [`renderItem`](sectionlist.md#renderitem) for the list. | +| [ItemSeparatorComponent] | component, function, element | Optionally define an arbitrary item separator for this section, overriding the default [`ItemSeparatorComponent`](sectionlist.md#itemseparatorcomponent) for the list. | +| [keyExtractor] | function | Optionally define an arbitrary key extractor for this section, overriding the default [`keyExtractor`](sectionlist.md#keyextractor). | diff --git a/website/versioned_docs/version-0.63/security.md b/website/versioned_docs/version-0.63/security.md new file mode 100644 index 00000000000..2b1167f2bbe --- /dev/null +++ b/website/versioned_docs/version-0.63/security.md @@ -0,0 +1,128 @@ +--- +id: version-0.63-security +title: Security +original_id: security +--- + +Security is often overlooked when building apps. It is true that it is impossible to build software that is completely impenetrable—we’ve yet to invent a completely impenetrable lock (bank vaults do, after all, still get broken into). However, the probability of falling victim to a malicious attack or being exposed for a security vulnerability is inversely proportional to the effort you’re willing to put in to protecting your application against any such eventuality. Although an ordinary padlock is pickable, it is still much harder to get past than a cabinet hook! + + + +In this guide, you will learn about best practices for storing sensitive information, authentication, network security, and tools that will help you secure your app. This is not a preflight checklist—it is a catalogue of options, each of which will help further protect your app and users. + +## Storing Sensitive Info + +Never store sensitive API keys in your app code. Anything included in your code could be accessed in plain text by anyone inspecting the app bundle. Tools like [react-native-dotenv](https://github.com/zetachang/react-native-dotenv) and [react-native-config](https://github.com/luggit/react-native-config/) are great for adding environment-specific variables like API endpoints, but they should not be confused with server-side environment variables, which can often contain secrets and api keys. + +If you must have an API key or a secret to access some resource from your app, the most secure way to handle this would be to build an orchestration layer between your app and the resource. This could be a serverless function (e.g. using AWS Lambda or Google Cloud Functions) which can forward the request with the required API key or secret. Secrets in server side code cannot be accessed by the API consumers the same way secrets in your app code can. + +**For persisted user data, choose the right type of storage based on its sensitivity.** As your app is used, you’ll often find the need to save data on the device, whether to support your app being used offline, cut down on network requests or save your user’s access token between sessions so they wouldn’t have to re-authenticate each time they use the app. + +> **Persisted vs unpersisted** — persisted data is written to the device’s memory, which lets the data be read by your app across application launches without having to do another network request to fetch it or asking the user to re-enter it. But this also can make that data more vulnerable to being accessed by attackers. Unpersisted data is never written to memory—so there's no data to access! + +### Async Storage + +[Async Storage](https://github.com/react-native-community/async-storage) is a community-maintained module for React Native that provides an asynchronous, unencrypted, key-value store. Async Storage is not shared between apps: every app has its own sandbox environment and has no access to data from other apps. + +| **Do** use async storage when... | **Don't** use async storage for... | +| --------------------------------------------- | ---------------------------------- | +| Persisting non-sensitive data across app runs | Token storage | +| Persisting Redux state | Secrets | +| Persisting GraphQL state | | +| Storing global app-wide variables | | + +
+ Developer Notes + + + +
+ + + +> Async Storage is the React Native equivalent of Local Storage from the web + + + +### Secure Storage + +React Native does not come bundled with any way of storing sensitive data. However, there are pre-existing solutions for Android and iOS platforms. + +#### iOS - Keychain Services + +[Keychain Services](https://developer.apple.com/documentation/security/keychain_services) allows you to securely store small chunks of sensitive info for the user. This is an ideal place to store certificates, tokens, passwords, and any other sensitive information that doesn’t belong in Async Storage. + +#### Android - Secure Shared Preferences + +[Shared Preferences](https://developer.android.com/reference/android/content/SharedPreferences) is the Android equivalent for a persistent key-value data store. **Data in Shared Preferences is not encrypted by default**, but [Encrypted Shared Preferences](https://developer.android.com/topic/security/data) wraps the Shared Preferences class for Android, and automatically encrypts keys and values. + +#### Android - Keystore + +The [Android Keystore](https://developer.android.com/training/articles/keystore) system lets you store cryptographic keys in a container to make it more difficult to extract from the device. + +In order to use iOS Keychain services or Android Secure Shared Preferences, you can either write a bridge yourself or use a library which wraps them for you and provides a unified API at your own risk. Some libraries to consider: + +- [react-native-keychain](https://github.com/oblador/react-native-keychain) +- [react-native-sensitive-info](https://github.com/mCodex/react-native-sensitive-info) - secure for iOS, but uses Android Shared Preferences for Android (which is not secure by default). There is however a [fork](https://github.com/mCodex/react-native-sensitive-info/tree/keystore)) that uses Android Keystore +- [redux-persist-sensitive-storage](https://github.com/CodingZeal/redux-persist-sensitive-storage) - wraps react-native-sensitive-info + +> **Be mindful of unintentionally storing or exposing sensitive info.** This could happen accidentally, for example saving sensitive form data in redux state and persisting the whole state tree in Async Storage. Or sending user tokens and personal info to an application monitoring service such as Sentry or Crashlytics. + +## Authentication and Deep Linking + + + +Mobile apps have a unique vulnerability that is non-existent in the web: **deep linking**. Deep linking is a way of sending data directly to a native application from an outside source. A deep link looks like `app://` where `app` is your app scheme and anything following the // could be used internally to handle the request. + +For example, if you were building an ecommerce app, you could use `app://products/1` to deep link to your app and open the product detail page for a product with id 1. You can think of these kind of like URLs on the web, but with one crucial distinction: + +Deep links are not secure and you should never send any sensitive information in them. + +The reason deep links are not secure is because there is no centralized method of registering URL schemes. As an application developer, you can use almost any url scheme you choose by [configuring it in Xcode](https://developer.apple.com/documentation/uikit/inter-process_communication/allowing_apps_and_websites_to_link_to_your_content/defining_a_custom_url_scheme_for_your_app) for iOS or [adding an intent on Android](https://developer.android.com/training/app-links/deep-linking). + +There is nothing stopping a malicious application from hijacking your deep link by also registering to the same scheme and then obtaining access to the data your link contains. Sending something like `app://products/1` is not harmful, but sending tokens is a security concern. + +When the operating system has two or more applications to choose from when opening a link, Android will show the user a modal and ask them to choose which application to use to open the link. On iOS however, the operating system will make the choice for you, so the user will be blissfully unaware. Apple has made steps to address this issue in later iOS versions (iOS 11) where they instituted a first-come-first-served principle, although this vulnerability could still be exploited in different ways which you can read more about [here](https://blog.trendmicro.com/trendlabs-security-intelligence/ios-url-scheme-susceptible-to-hijacking/). Using [universal links](https://developer.apple.com/ios/universal-links/) will allow linking to content within your app securely in iOS. + +### OAuth2 and Redirects + +The OAuth2 authentication protocol is incredibly popular nowadays, prided as the most complete and secure protocol around. The OpenID Connect protocol is also based on this. In OAuth2, the user is asked to authenticate via a third party. On successful completion, this third party redirects back to the requesting application with a verification code which can be exchanged for a JWT — a [JSON Web Token](https://jwt.io/introduction/). JWT is an open standard for securely transmitting information between parties on the web. + +On the web, this redirect step is secure, because URLs on the web are guaranteed to be unique. This is not true for apps because, as mentioned earlier, there is no centralized method of registering URL schemes! In order to address this security concern, an additional check must be added in the form of PKCE. + +[PKCE](https://oauth.net/2/pkce/), pronounced “Pixy” stands for Proof of Key Code Exchange, and is an extension to the OAuth 2 spec. This involves adding an additional layer of security which verifies that the authentication and token exchange requests come from the same client. PKCE uses the [SHA 256](https://www.movable-type.co.uk/scripts/sha256.html) Cryptographic Hash Algorithm. SHA 256 creates a unique “signature” for a text or file of any size, but it is: + +- Always the same length regardless of the input file +- Guaranteed to be always produce the same result for the same input +- One way (that is, you can’t reverse engineer it to reveal the original input) + +Now you have two values: + +- **code_verifier** - a large random string generated by the client +- **code_challenge** - the SHA 256 of the code_verifier + +During the initial `/authorize` request, the client also sends the `code_challenge` for the `code_verifier` it keeps in memory. After the authorize request has returned correctly, the client also sends the `code_verifier` that was used to generate the `code_challenge`. The IDP will then calculate the `code_challenge`, see if it matches what was set on the very first `/authorize` request, and only send the access token if the values match. + +This guarantees that only the application that triggered the initial authorization flow would be able to successfully exchange the verification code for a JWT. So even if a malicious application gets access to the verification code, it will be useless on its own. To see this in action, check out [this example](https://aaronparecki.com/oauth-2-simplified/#mobile-apps). + +A library to consider for native OAuth is [react-native-app-auth](https://github.com/FormidableLabs/react-native-app-auth). React-native-app-auth is an SDK for communicating with OAuth2 providers. It wraps the native [AppAuth-iOS](https://github.com/openid/AppAuth-iOS) and [AppAuth-Android](https://github.com/openid/AppAuth-Android) libraries and can support PKCE. + +> React-native-app-auth can support PKCE only if your Identity Provider supports it. + +![OAuth2 with PKCE](/docs/assets/diagram_pkce.svg) + +## Network Security + +Your APIs should always use [SSL encryption](https://www.ssl.com/faqs/faq-what-is-ssl/). SSL encryption protects against the requested data being read in plain text between when it leaves the server and before it reaches the client. You’ll know the endpoint is secure, because it starts with `https://` instead of `http://`. + +### SSL Pinning + +Using https endpoints could still leave your data vulnerable to interception. With https, the client will only trust the server if it can provide a valid certificate that is signed by a trusted Certificate Authority that is pre-installed on the client. An attacker could take advantage of this by installing a malicious root CA certificate to the user’s device, so the client would trust all certificates that are signed by the attacker. Thus, relying on certificates alone could still leave you vulnerable to a [man-in-the-middle attack](https://en.wikipedia.org/wiki/Man-in-the-middle_attack). + +**SSL pinning** is a technique that can be used on the client side to avoid this attack. It works by embedding (or pinning) a list of trusted certificates to the client during development, so that only the requests signed with one of the trusted certificates will be accepted, and any self-signed certificates will not be. + +> When using SSL pinning, you should be mindful of certificate expiry. Certificates expire every 1-2 years and when one does, it’ll need to be updated in the app as well as on the server. As soon as the certificate on the server has been updated, any apps with the old certificate embedded in them will cease to work. + +## Summary + +There is no bulletproof way to handle security, but with conscious effort and diligence, it is possible to significantly reduce the likelihood of a security breach in your application. Invest in security proportional to the sensitivity of the data stored in your application, the number of users, and the damage a hacker could do when gaining access to their account. And remember: it’s significantly harder to access information that was never requested in the first place. diff --git a/website/versioned_docs/version-0.63/segmentedcontrolios.md b/website/versioned_docs/version-0.63/segmentedcontrolios.md new file mode 100644 index 00000000000..bd24d3e5384 --- /dev/null +++ b/website/versioned_docs/version-0.63/segmentedcontrolios.md @@ -0,0 +1,127 @@ +--- +id: version-0.63-segmentedcontrolios +title: 🚧 SegmentedControlIOS +original_id: segmentedcontrolios +--- + +> **Deprecated.** Use [@react-native-community/segmented-control](https://github.com/react-native-community/segmented-control) instead. + +Uses `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. + +## Example + +```SnackPlayer name=SegmentedControlIOS%20Example&supportedPlatforms=ios +import React, { useState } from "react"; +import { SegmentedControlIOS, StyleSheet, Text, View } from "react-native"; + +export default App = () => { + const [index, setIndex] = useState(0); + return ( + + { + setIndex(event.nativeEvent.selectedSegmentIndex); + }} + /> + + Selected index: {index} + + + ); +}; + +const styles = StyleSheet.create({ + container: { + flex: 1, + padding: 24, + justifyContent: "center" + }, + text: { + marginTop: 24 + } +}); +``` + +--- + +# Reference + +## Props + +Inherits [View Props](view.md#props). + +### `enabled` + +If false the user won't be able to interact with the control. Default value is true. + +| Type | Required | +| ---- | -------- | +| bool | No | + +--- + +### `momentary` + +If true, then selecting a segment won't persist visually. The `onValueChange` callback will still work as expected. + +| Type | Required | +| ---- | -------- | +| bool | No | + +--- + +### `onChange` + +Callback that is called when the user taps a segment; passes the event as an argument + +| Type | Required | +| -------- | -------- | +| function | No | + +--- + +### `onValueChange` + +Callback that is called when the user taps a segment; passes the segment's value as an argument + +| Type | Required | +| -------- | -------- | +| function | No | + +--- + +### `selectedIndex` + +The index in `props.values` of the segment to be (pre)selected. + +| Type | Required | +| ------ | -------- | +| number | No | + +--- + +### `tintColor` + +> **Note:** `tintColor` is not supported on the iOS 13+. + +Accent color of the control. + +| Type | Required | +| ------ | -------- | +| string | No | + +--- + +### `values` + +The labels for the control's segment buttons, in order. + +| Type | Required | +| --------------- | -------- | +| array of string | No | diff --git a/website/versioned_docs/version-0.63/settings.md b/website/versioned_docs/version-0.63/settings.md new file mode 100644 index 00000000000..ab819963878 --- /dev/null +++ b/website/versioned_docs/version-0.63/settings.md @@ -0,0 +1,96 @@ +--- +id: version-0.63-settings +title: Settings +original_id: settings +--- + +`Settings` serves as a wrapper for [`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults), a persistent key-value store available only on iOS. + +## Example + +```SnackPlayer name=Settings%20Example&supportedPlatforms=ios +import React, { useState } from "react"; +import { Button, Settings, StyleSheet, Text, View } from "react-native"; + +const App = () => { + const [data, setData] = useState(Settings.get("data")); + + const storeData = data => { + Settings.set(data); + setData(Settings.get("data")); + }; + + return ( + + Stored value: + {data} +